Quote Originariamente inviata da Scara95 Visualizza il messaggio
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