
Originariamente inviata da
Scara95
Il primo charAt ha come parametro messaggio.length(), ma gli indici vanno da 0 <= pos <= messaggio.length()-1
ora il problema è se devo decifrare un messaggio con lunghezza != dal numero di elementi della matrice...
ho creato questo codice
codice:
public String decifra(int key, String messaggio) { messaggio = messaggio.replaceAll("\\s", "");
boolean f = false;
int c = key, j, i;
String output = "";
char[][] M;
int pos = messaggio.length()-1;
int r = messaggio.length()/c;
int lastr = messaggio.length()%c;
if (lastr != 0){
r++;
f = true;
}
M = new char [r][c];
if (f) {
for (i = r-1; i >= 0; i--) {
for (j = c-1; j >= 0; j--) {
if (i < r-1 && j < lastr) {
System.out.println("POS: "+pos);
M[i][j] = messaggio.charAt(pos);
pos--;
} else {
M[i][j] = ' ';
}
}
}
}
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
output += M[i][j];
System.out.print(M[i][j]+" ");
}
System.out.println();
}
System.out.println(output);
return output;
}
se messaggio.length()%c = x dà resto, significa che non è un multiplo e ci saranno x+1 righe con l'ultima riga non completamente piena... il resto coincide con il numero di elementi "pieni" su quella riga..
Ad esempio: il messaggio INVIORINFORZI con una chiave pari a 3, viene cifrato come IIIOINONRVRFZ. I caratteri sono 13 quindi 13/3 = 4 con resto 1. Infatti in una matrice con 3 colonne serviranno 4+1 righe per memorizzare i caratteri. Esattamente:
I N V
I O R
I N F
O R Z
I - -
eseguendo il codice, però, è tutto vuoto