Boa Noite
Estou fazendo um exercício do livro “Java Como Programar 8” e é pedido para criptografar um número inteiro de 4 dígitos. Para isso usei uma classe que fiz para separar os dígitos, fiz o esquema da criptografia e uni os dígitos novamente só que já criptografados.
O problema é que o resultado da criptografia só da 7777, porque a classe que separa os dígitos não está recebendo o valor que eu digito no programa de teste(main).
É esse o código que fiz:
// Programa que criptografa um inteiro de 4 dígitos
public class Criptografar
{
private int valor; // armazena o valor inicial
public Criptografar( int valorInicial )
{
valor = valorInicial;
}// Fim do construtor
int n1, n2, n3, n4; // armazenam os dígitos criptografados
Separa sepCripto = new Separa( valor ); // separa os dígitos
public void setValor( int valorSet)
{
valor = valorSet;
}// Fim do método serValor
public int getValor()
{
return valor;
}// Fim do método getValor
//QUANDO ACESSO O MÉTODO ABAIXO ELE SÓ RETORNA ZERO
public int getNumSepara()
{
return sepCripto.getNumero();
} // Fim do método getNumSepara
public int getCripFull() // criptografa e une os dígitos em um único inteiro
{
//Critografia
n1 = (sepCripto.getNum1() + 7) % 10;
n2 = (sepCripto.getNum2() + 7) % 10;
n3 = (sepCripto.getNum3() + 7) % 10;
n4 = (sepCripto.getNum4() + 7) % 10;
// união dos dígitos
return n1 * 1000 +
n2 * 100 +
n3 * 10 +
n4 * 1;
}// Fim do método getCripFull
}// Fim da classe Criptografar
Por favor alguém pode me ajudar?
Olá.
Por favor, não banalize tags informativas como [Resolvido] usando-as para postar o óbvio, como [Ajuda] ou [Dúvida].
Você não postou sua classe Separa. Sem ela, fica bem difícil te ajudar.
Aqui está a classe Separa:
//Programa que separa um número de 4 dígitos
public class Separa
{
private int number;
private int num1, num2, num3, num4;
public Separa(int valor4)// construtor da classe Separa
{
number = valor4;
num1 = 0;
num2 = 0;
num3 = 0;
num4 = 0;
}// Fim do construtor
public void setNumero( int numS ) // configura o valor para ser separado
{
number = numS;
}// Fim do método setNumero
public int getNumero() // retorna o valor do qual foi solicitada a separação de dígitos
{
return number;
}// Fim do método getNumero
public int getNum1() // obtém o primeiro dígito
{
num1 = number / 1000;
return num1;
}// Fim do método getNum1
public int getNum2() // obtém o segundo dígito
{
num2 = (number % 1000) / 100;
return num2;
}//Fim do método getNum2
public int getNum3() // obtém o terceiro dígito
{
num3 = ((number % 1000) % 100) / 10;
return num3;
}//Fim do método getNum3
public int getNum4() // obtém o quarto dígito
{
num4 = (((number % 1000) % 100)% 10)/1;
return num4;
}//Fim do método getNum4
}//Fim da classe Separa
Desculpe pelo erro
A lógica está quase certa. Mas veja bem o que você está fazendo:
num3 = ((number % 1000) % 100) / 10;
Número (exemplo):
1234
(number % 1000) = 234
(number % 1000) % 100) = 4 % 100 = 34
((number % 1000) % 100) / 10 = 34 / 10 = 3
Creio que não fosse isso que você queria, certo?
Antes de eu te passar a solução, procure pensar um pouco sobre como seria o código correto.
Eu não entendi
Porque assim, vou copiar só a lógica que usei para separar os dígitos:
num1 = number / 1000;
num2 = (number % 1000) / 100;
num3 = ((number % 1000) % 100) / 10;
num4 = (((number % 1000) % 100)% 10)/1;
Eu testei essa classe várias vezes e funcionou certinho.
Não entendi o código que você postou, você poderia me explicar um pouco mais detalhadamente?
Ops. Acho que me confundi nas contas. Vou revisar aqui.
Achei seu erro.
Na linha 15 da classe Criptografar você fez:
Separa sepCripto = new Separa( valor ); // separa os dígitos
Ocorre que esse código roda antes do construtor e, ali, o valor do atributo valor é o padrão, 0.
A posição que ele é declarado na classe não importa, pois toda inicialização de atributos, quando feita diretamente com igual dessa forma, roda quando o atributo é criado, ou seja, no momento em que a classe é criada, antes do construtor rodar.
Você deve inicializa-lo no construtor:
// Programa que criptografa um inteiro de 4 dígitos
public class Criptografar
{
//Para não dar confusão, vamos deixar os atributos juntos.
private int valor; // armazena o valor inicial
private int n1, n2, n3, n4; // armazenam os dígitos criptografados
private Separa sepCripto = null;
public Criptografar( int valorInicial )
{
valor = valorInicial;
sepCripto = new Separa( valor ); // Inicialização no local correto
}// Fim do construtor
public void setValor( int valorSet)
{
valor = valorSet;
}// Fim do método serValor
public int getValor()
{
return valor;
}// Fim do método getValor
public int getNumSepara()
{
return sepCripto.getNumero();
} // Fim do método getNumSepara
public int getCripFull() // criptografa e une os dígitos em um único inteiro
{
//Critografia
n1 = (sepCripto.getNum1() + 7) % 10;
n2 = (sepCripto.getNum2() + 7) % 10;
n3 = (sepCripto.getNum3() + 7) % 10;
n4 = (sepCripto.getNum4() + 7) % 10;
// união dos dígitos
return n1 * 1000 +
n2 * 100 +
n3 * 10 +
n4 * 1;
}// Fim do método getCripFull
}// Fim da classe Criptografar
Nossa, muito obrigado mesmo pela ajuda. Era isso mesmo o que estava acontecendo, eu não ia conseguir resolver isso sozinho. Obrigado pela força. 