codice:class Main{ public static void main (String[] args) throws java.lang.Exception { String s = cifra(3, "Ciao come va?"); System.out.println(s); System.out.println(decifra(3, s)); } public static String cifra(int key, String messaggio) { int c = key; String output = ""; messaggio = messaggio.replaceAll("\\s", ""); int r = messaggio.length()/c; if (messaggio.length()%c != 0){ r++; } int pos = 0; char[][] M = new char [r][c]; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (pos == messaggio.length()) break; M[i][j] = messaggio.charAt(pos); pos++; } } for (int i = 0; i < c; i++) { for (int j = 0; j < r; j++) { output += M[j][i]; } } return output; } public static String decifra(int key, String messaggio) { int c = key; String output = ""; messaggio = messaggio.replaceAll("\\s", ""); int r = messaggio.length()/c; if (messaggio.length()%c != 0){ r++; } int pos = 0; char[][] M = new char [r][c]; for (int j = 0; j < c; j++) { for (int i = 0; i < r; i++) { if (pos == messaggio.length()) break; M[i][j] = messaggio.charAt(pos); pos++; } } for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { output += M[i][j]; } } return output; } }
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
ok perfetto funzionati ringrazio infinitamente...
però vorrei capire dove sbagliavo.. e come funzionano i cicli for in cui riempi la matrice...
io all'inizio del metodo rimuovo tutti gli spazi!
e infatti se il testo cifrato lo inserisci manualmente e clicco decifra, non funziona più il tuo codice
Ultima modifica di LuLyLuNa; 10-07-2015 a 23:51
Ho copiato e incollato il tuo codice, ho cambiato solo gli indici in modo da fare esattamente il contrario nella decifratura.
E a dire il vero non mi sono neanche posto il problema di capire la trasformazione, ho solo fatto le operazioni inverse: riempito nell'ordine in cui estrai nella cifratura e estratto nell'ordine in cui riempi.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
se come messaggio cifrato passi il risultato del metodo cifra, tutto funziona.. perché il realtà il risultato è IIIOINONR[]VRFZ[] e ciò significa che in realtà non vengono eliminati gli spazi.
ma se il messaggio da decifrare viene scritto manualmente quindi IIIOINONRVRFZ, non funziona più nemmeno il tuo codice![]()
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
la matrice che crei per la decifratura nel codice è errata..
non so come funziona XD
Ultima modifica di LuLyLuNa; 11-07-2015 a 12:45
ho usato il tuo codice modificando le stringhe di input dei due metodi nel main..
e ho aggiunto i system out per vedere come stampa la matrice..
ed è sbagliata, ecco perché cambiando esempio non funziona, verifica tu e dimmi
non so che fare
http://ideone.com/e.js/Jq4kUa
Ok, non avevo considerato alcuni 0, per correggere basta considerare lunghezza%key
Ho modificato in-place http://ideone.com/HwbAjl
In sostanza se lunghezza%key != 0, nell'ultima riga ci saranno, partendo da sinistra, esattamente lunghezza%key caratteri, perciò basta non inserire nelle posizioni
[r-1][j] per ogni lunghezza%key <= j < c
Ultima modifica di Scara95; 11-07-2015 a 13:47
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares