Cifra de Cesar

Pessoal , através da Cifra de Cesar tenho que decodificar o código contido no vetor A utilizando o alfabeto do vetor B, deslocando 9 casas no vetor B.

public static void main(String[] args) {

    char[] a = { 'U', 'N', '%', 'J', 'W', '#', 'N', 'I', '%','Ô','X','I','M','N','I','J','L','X','!','M','X','I','L','X','V','I','X',
                 '@','I','Y','U','J','W','X','@','I','À','@','I','E','Q','D','.','I','W','N','V','I','$','V','J','I','@','Ó','I','K',
                 'X','V','K','J','I','M','N','%','N','I','@','N','!','I','U','J','W','Ç','J','M','J','I','M','N','@','L','$','R','M',
                 'J','M','J','V','N','W','#','N','.' }; 

    

    char[] b = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
                  'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','!','@','#','$','%',
                  '&','*','+','='}; 
   
    int k = 9;
        for(int i=0; i < a.length; i++){
            for(int j=0; j < b.length; j++){
            if ( a[i] == b[j]) {
                if (j < 9){                        
                    j = 25; /* 25 é o total de letras do alfabeto -1 (por começar do 0 */
                    k = 9 - j;                        
                }
               System.out.print(b[j -k]);
            }                
        }
    }
}

A mensagem decifrada fica correta, porém os caracteres que tem acento não estão imprimindo, tal como na palavra VOÔ e nos demais caracteres que tem acento e Ç.

run:
LEVANTE VO DE ACORDO COM OS PLANOS S 6H5 NEM UMA S BOMBA DEVE SER LANADA DESCUIDADAMENTE BUILD SUCCESSFUL (total time: 0 seconds)

O correto seria:

LEVANTE VOÔ DE ACORDO COM OS PLANOS ÀS 6H5 NEM UMA SÓ BOMBA DEVE SER LANÇADA DESCUIDADAMENTE.

Poderiam auxiliar?

Na tua mensagem encriptada não têns esses caracteres encriptados mas sim os originais: Ô À Ç … E no teu alfabeto não tens esses caracteres. A mensagem não está a encriptar esses caracteres, logo também não os deve desencriptar. Ou então acrescentas os mesmos ao teu alfabeto e voltas a encriptar.

1 curtida

Se eu acrescentar esses Caracteres no vetor B , ele vai seguir a regra dos demais caracteres, o que estaria errado, pois eles nao seguem a mesma regra. O correto seria quando o usuário digitasse por exemplo ‘Ô’ ele se manteria ‘Ô’ para mostrar na saida para o usuário e não andar 9 elementos para trás no vetor como os demais.

Bom entao que tal implementar essa condição?

como vc faria isso?

Tentei criar outro if caso (a[i] != a[b]). Fiz teste com Switch case , e tbm testei com outro vetor. Sem sucesso.

Antes do loop interno, crie uma variabel booleana achei = false;

Achou a letra? achei vira true

Acabou o loop interno: acho é false? Então vc caiu nesse caso particular meu caro :slight_smile:

2 curtidas

tenta isso man.

if ( a[i] == b[j]) {
	if (j < 9){                        
		j = 25; /* 25 é o total de letras do alfabeto -1 (por começar do 0 */
		k = 9 - j;                        
	}
	System.out.print(b[j -k]);
}
else {
	System.out.print(a[i]);
}