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ígitospublicclassCriptografar{privateintvalor;// armazena o valor inicialpublicCriptografar(intvalorInicial){valor=valorInicial;}// Fim do construtor intn1,n2,n3,n4;// armazenam os dígitos criptografadosSeparasepCripto=newSepara(valor);// separa os dígitos publicvoidsetValor(intvalorSet){valor=valorSet;}// Fim do método serValorpublicintgetValor(){returnvalor;}// Fim do método getValor//QUANDO ACESSO O MÉTODO ABAIXO ELE SÓ RETORNA ZEROpublicintgetNumSepara(){returnsepCripto.getNumero();}// Fim do método getNumSepara publicintgetCripFull()// criptografa e une os dígitos em um único inteiro{//Critografian1=(sepCripto.getNum1()+7)%10;n2=(sepCripto.getNum2()+7)%10;n3=(sepCripto.getNum3()+7)%10;n4=(sepCripto.getNum4()+7)%10;// união dos dígitosreturnn1*1000+n2*100+n3*10+n4*1;}// Fim do método getCripFull }// Fim da classe Criptografar
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.
Mendigo_do_Futuro
Aqui está a classe Separa:
//Programa que separa um número de 4 dígitos publicclassSepara{privateintnumber;privateintnum1,num2,num3,num4;publicSepara(intvalor4)// construtor da classe Separa{number=valor4;num1=0;num2=0;num3=0;num4=0;}// Fim do construtor publicvoidsetNumero(intnumS)// configura o valor para ser separado{number=numS;}// Fim do método setNumero publicintgetNumero()// retorna o valor do qual foi solicitada a separação de dígitos{returnnumber;}// Fim do método getNumeropublicintgetNum1()// obtém o primeiro dígito{num1=number/1000;returnnum1;}// Fim do método getNum1 publicintgetNum2()// obtém o segundo dígito{num2=(number%1000)/100;returnnum2;}//Fim do método getNum2publicintgetNum3()// obtém o terceiro dígito{num3=((number%1000)%100)/10;returnnum3;}//Fim do método getNum3publicintgetNum4()// obtém o quarto dígito{num4=(((number%1000)%100)%10)/1;returnnum4;}//Fim do método getNum4 }//Fim da classe Separa
Desculpe pelo erro
ViniGodoy
A lógica está quase certa. Mas veja bem o que você está fazendo:
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?
ViniGodoy
Ops. Acho que me confundi nas contas. Vou revisar aqui.
ViniGodoy
Achei seu erro.
Na linha 15 da classe Criptografar você fez:
SeparasepCripto=newSepara(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ígitospublicclassCriptografar{//Para não dar confusão, vamos deixar os atributos juntos.privateintvalor;// armazena o valor inicialprivateintn1,n2,n3,n4;// armazenam os dígitos criptografados privateSeparasepCripto=null;publicCriptografar(intvalorInicial){valor=valorInicial;sepCripto=newSepara(valor);// Inicialização no local correto }// Fim do construtor publicvoidsetValor(intvalorSet){valor=valorSet;}// Fim do método serValorpublicintgetValor(){returnvalor;}// Fim do método getValorpublicintgetNumSepara(){returnsepCripto.getNumero();}// Fim do método getNumSepara publicintgetCripFull()// criptografa e une os dígitos em um único inteiro{//Critografian1=(sepCripto.getNum1()+7)%10;n2=(sepCripto.getNum2()+7)%10;n3=(sepCripto.getNum3()+7)%10;n4=(sepCripto.getNum4()+7)%10;// união dos dígitosreturnn1*1000+n2*100+n3*10+n4*1;}// Fim do método getCripFull }// Fim da classe Criptografar
Mendigo_do_Futuro
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.