Exercício 4.36 Deitel 6ª

Srs, relutei mas não consegui detectar o erro, por fvr me ajudem. Estou fazendo o exercício do Deitel de forma alterada para depois ir no X da questão mas não estou conseguindo somar 7 a cada um dos dígitos da senha. Por exemplo, se digitar 1234 a senha criptografada deveria ser 891011 e só aparece 7777. Alguem pode me ajudar ? Segue abaixo o código:

/* 4.36 - Uma empresa quer transmitir dados por telefone, mas está preocupada com a possibilidade de seus
 * telefones estarem grampeados. Ela pediu para você escrever um programa que criptografe dados de modo que
 * estes possam ser transmitidos mais seguramente. Todos os dados são transmitidos como inteiros de quatro
 * dígitos. Seu aplicativo deve ler um inteiro de quatro dígitos inserido pelo usuário e criptografá-lo desta
 * maneira: Substitua cada dígito pelo resultado da adição de 7 ao dígito e obtendo o resto depois da divisão
 * do novo valor por 10. Troque então o primeiro dígito pelo terceiro e o segundo pelo quarto. Então imprima o
 * inteiro criptografado. Escreva um aplicativo separado que receba entrada de um inteiro de quatro dígitos
 * criptografado e o descriptografe para formar o número original.
 */

import java.util.Scanner;

/**
 *
 * @author paulo
 */
public class Criptografar
{

    Scanner entrada = new Scanner(System.in);
    Scanner entrada1 = new Scanner(System.in);

    private int numero1;
    private int numero2;
    private int numero3;
    private int numero4;
    private int senha;
    private int criptografia;
   
public Criptografar(int n1,int n2,int n3,int n4, int sen, int cripto)
{
    numero1 = n1;
    numero2 = n2;
    numero3 = n3;
    numero4 = n4;
    senha = sen;
    criptografia = cripto;
        
}



public void setNumero1(int n1)
{
    numero1 = n1;
}
public int getNumero1()
{
    return numero1;
}

public void setNumero2(int n2)
{
    numero2 = n2;
}
public int getNumero2()
{
    return numero2;
}

public void setNumero3(int n3)
{
    numero3 = n3;
}
public int getNumero3()
{
    return numero3;
}

public void setNumero4(int n4)
{
    numero4 = n4;
}
public int getNumero4()
{
    return numero4;
}

public void setSenha(int sen)
{

    senha = sen;
}
public int getSenha()
{
     return senha;
}

public void setCriptografia(int cripto)
{
    criptografia = cripto;
}
public int getCriptografia()
{
    return criptografia;
}


public void senha()
{
    System.out.printf("Digite sua senha de 4 dígitos: ",numero1,numero2,numero3,numero4);
    senha = entrada.nextInt();

    if(numero1>=0 && numero2 >=0 && numero3 >=0 && numero4>=0)
    {
    numero1 += 7;
    numero2 += 7;
    numero3 += 7;
    numero4 += 7;
    }
    
}

public void senhaCriptografada()
{
     System.out.printf("Senha Criptografada: %d%d%d%d\n",numero1,numero2,numero3,numero4);

}


}
/**
 *
 * @author paulo
 */
public class CriptoTest
{

    public static void main(String[] args)
    {
        Criptografar teste = new Criptografar(0,0,0,0,0,0);

        teste.senha();
        teste.senhaCriptografada();
    }

}

Paulo,

O sistema não está usando as informações que você digita e sim as passadas no construtor.

tente alterar o código :

Criptografar teste = new Criptografar(0,0,0,0,0,0);  

para :

Criptografar teste = new Criptografar(1,2,3,4,0,0); 

e verifique o resultado.

Olá, pelo que eu vi você não está lendo os números da criptografia e sim passando todos eles por parâmetro no seu método main com valor igual a 0 (0+7 = 7) (Não entendi sua variável senha) e também não entendi seus getters e setters que não estão sendo usados (você poderá usá-los para receber o valor dos números a serem criptografados, já que eles são private, através de um Scanner no main - uma opção/idéia). Vlw.

Na verdade eu quero que o usuário digite a senha e o aplicativo o converta. Não gostaria de passá-los por parâmetros. Quantos aos get /set terei de revê-los.

Penso que minha solução não é a mais viável, mas você pode receber essa senha na forma de String(Ela que será criptografada?), usar o charAt() para separar cada número, depois usar o Integer.parseInt() e finalizar somando o 7.

Obs.: Não sei se funcionará Integer.parseInt(charAt(0~3)) pois o Integer.parseInt() pega uma String como parâmetro e o charAt() retorna um char e não sei se esse cast funciona Integer.parseInt((String)charAt(0~3)). Se alguém souber… aproveito e deixo essa dúvida aqui também. :smiley:

seu problema é no metodo senha()
altere a senha para o tipo string;
Mude para

System.out.printf("Digite sua senha de 4 dígitos: ");

senha = entrada.next(); //isso faz com que a senha de 4 digitos seja armazenada na variavel senha

   numero1=Integer.parseInt(senha.substring(0,1));
   numero2=Integer.parseInt(senha.substring(1,2));
   numero3=Integer.parseInt(senha.substring(2,3));
   numero4=Integer.parseInt(senha.substring(3,4));

if(numero1>=0 && numero2 >=0 && numero3 >=0 && numero4>=0)

{

numero1 += 7;

numero2 += 7;

numero3 += 7;

numero4 += 7;

Visando ajudar a galera que procura este exercício, segue aí de uma forma até porque o tópico e muito antigo e já foi resolvido!

import java.util.Scanner;
public class Criptografia {
	public static void main(String[] args) {
		int num, qua, ter, seg, pri, aux, aux2;
		Scanner input = new Scanner(System.in);
		System.out.println("Informe um número inteiro (4 Dígitos): ");
		num = input.nextInt();
		// leitura de 4 dígitos
		while ( num < 1000 || num > 10000) {
			System.out.println("Entrada Inválida! Informe um número inteiro (4 Dígitos): ");
			num = input.nextInt();
		}
		// separação dos dígitos do inteiro
		qua = num % 10;
		num = num / 10;
		ter = num % 10;
		num = num / 10;
		seg = num % 10;
		num = num / 10;
		pri = num % 10;
		// cálculos para a criptografia
		// adição de 7
		qua = qua + 7;
		ter = ter + 7;
		seg = seg + 7;
		pri = pri + 7;
		// resto da divisão por 10
		qua = qua % 10;
		ter = ter % 10;
		seg = seg % 10;
		pri = pri % 10;
		// inversões dos números
		aux = 0;
		aux2 = 0;
		aux = qua;
		qua = seg;
		seg = aux;
		aux2 = ter;
		ter = pri;
		pri = aux2;
		// Impressão do dígito Criptografado
		System.out.printf("A criptografia do número informado é: %d%d%d%d", pri, seg, ter, qua);
	}
}

Agora a descriptografia,

import java.util.Scanner;
public class Descriptografia {
	public static void main(String[] args) {
		int num, pri, seg, ter, qua, aux, aux2;
		Scanner input = new Scanner(System.in);
		System.out.println("Informe o número criptografado (4 Dígitos):");
		num = input.nextInt();
		// leitura do número criptografado
		while ( num < 1000 || num > 10000 ) {	
			System.out.println("Entrada Inválida! Informe o número criptografado (4 Dígitos):");
			num = input.nextInt();			
		}
		// separação dos dígitos do inteiro
		qua = num % 10;
		num = num / 10;
		ter = num % 10;
		num = num / 10;
		seg = num % 10;
		num = num / 10;
		pri = num % 10;
		// inversões dos números
		aux = 0;
		aux2 = 0;
		aux = qua;
		qua = seg;
		seg = aux;
		aux2 = ter;
		ter = pri;
		pri = aux2;
		// cálculos para a descriptografia
		pri = (pri + 10) - 7;
		seg = (seg + 10) - 7;
		ter = (ter + 10) - 7;
		qua = (qua + 10) - 7;	
		// Impressão do dígito Descriptografado
		System.out.printf("A descriptografia do número informado é: %d%d%d%d", pri, seg, ter, qua);		
	}
}

Olá galera, esse tópico me ajudou resolver o exercício. Então resolvi colocar aqui meu código, os que pesquisei dá problema quando a senha é 3541 por exemplo.
Criptografar

[code]package defaultpackage;
import java.util.Scanner;
public class Exercicio438 {

public static void main(String[] args) {

	Scanner entrada = new Scanner(System.in);

	int senha = 0;

	while (senha < 1000 || senha > 10000) {
		System.out.print("Digite uma senha de 4 dígitos: ");
		senha = entrada.nextInt();
	}

	// define o número do dígito, soma com mais 7 e calcula o número pelo mod de 10
	int num1, num2, num3, num4;

	num4 = senha % 10;
	num4 += 7;
	num4 %= 10;
	senha /= 10;

	num3 = senha % 10;
	num3 += 7;
	num3 %= 10;
	senha /= 10;

	num2 = senha % 10;
	num2 += 7;
	num2 %= 10;
	senha /= 10;

	num1 = senha % 10;
	num1 += 7;
	num1 %= 10;

	// troca 1 pelo 3 && troca 2 pelo 4
	int novo1, novo2;

	novo1 = num3;
	num3 = num1;

	novo2 = num4;
	num4 = num2;

	System.out.printf("A senha criptografada é: %s%s%s%s", novo1, novo2, num3, num4);
}

}[/code]

Descriptografar

[code]package defaultpackage;
import java.util.Scanner;
public class Exercicio438Descriptografar {

public static void main(String[] args) {

	Scanner entrada = new Scanner(System.in);

	int senha = 0;

	while (senha < 1000 || senha > 10000) {
		System.out
				.print("Digite uma senha de 4 dígitos para descriptografar: ");
		senha = entrada.nextInt();
	}

	int num4 = senha % 10;
	num4 = (num4 + 10) - 7;
	num4 %= 10;
	senha /= 10;

	int num3 = senha % 10;
	num3 = (num3 + 10) - 7;
	num3 %= 10;
	senha /= 10;

	int num2 = senha % 10;
	num2 = (num2 + 10) - 7;
	num2 %= 10;
	senha /= 10;

	int num1 = senha % 10;
	num1 = (num1 + 10) - 7;
	num1 %= 10;

	// troca 1 pelo 3 && troca 2 pelo 4
	int novo3, novo4;

	novo3 = num1;
	num1 = num3;
	num3 = novo3;

	novo4 = num2;
	num2 = num4;
	num4 = novo4;

	// imprimi resultado da senha descriptografada
	System.out.printf("A senha descriptografada é: %d %d %d %d \n", num1,
			num2, num3, num4);
}

}
[/code]

Espero ter ajudado!