IL TIPO CHAR ============= In Java il tipo char e' un intero, pertanto e' possibile usare per i char tutte le operazioni disponibili per gli interi. Ad esempio, e' possibile effettuare l'istruzione char c = 'a' + 3; // 'a' e' una costante di tipo char che denota la lettera a che assegna a c il carattere 'd'. Il valore numerico di una costante di tipo char e' il suo codice nella tabella Unicode. Ad esempio, il valore 'a' e' 97, il valore di 'b' e' 98, il valore di '0' e' 48, il valore di 'A' e' 65. Esempi di espressioni booleane vere in cui compaiono costanti di tipo char: 'b' == 'a' + 1 'D' - 'B' == 2 'B' - 'D' == -2 'b' < 'd' 'E' > 'B' 'a' + 3 > 'b' Per verificare che le espressioni precedenti sono vere non e' necessario conoscere i codici dei caratteri. OSSERVAZIONI ============ 1) Per risolvere gli esercizi seguenti e' sufficiente usare le classi Java viste finora (classi per input e output, classe String). Occorre usare espressioni aritmetiche in cui possono comparire costanti char. Per gli esercizi 2,3 e 4 non servono piu' di 30 linee di codice. 2) Date le variabili int n; char c; l'assegnamento c = n; da' in compilazione l'errore possible loss of precision found : int required: char Infatti, il tipo char ha dimensione 16 bit mentre int ha dimensione 32, quindi l'assegnamento potrebbe causare perdita di precisione. Per poter compilare, occorre forzare un cast esplicito di n al tipo char c = (char) n; // prima dell'assegnamento, il valore di n e' convertito a char Se il valore di n e' rappresentabile in 16 bit il programma funziona correttamente, altrimenti si ha perdita di precisione. -------------------------------------------------------------------------------------- ESERCIZIO 1: ALFABETO ===================== Scrivere un programma Alfabeto che stampa l'alfabeto nel formato sotto riportato, dove per ogni lettera e' mostrata la sua posizione. Il calcolo del numero delle lettere dell'alfabeto va fatto utilizzando una opportuna espressione aritmetica in cui compaiono costanti char (non usando cicli o scrivendo direttamente il risultato). Numero lettere dell'alfabeto: 26 a: 0 b: 1 c: 2 d: 3 e: 4 f: 5 g: 6 h: 7 i: 8 j: 9 k: 10 l: 11 m: 12 n: 13 o: 14 p: 15 q: 16 r: 17 s: 18 t: 19 u: 20 v: 21 w: 22 x: 23 y: 24 z: 25 A: 0 B: 1 C: 2 D: 3 E: 4 F: 5 G: 6 H: 7 I: 8 J: 9 K: 10 L: 11 M: 12 N: 13 O: 14 P: 15 Q: 16 R: 17 S: 18 T: 19 U: 20 V: 21 W: 22 X: 23 Y: 24 Z: 25 -------------------------------------------------------------------------------------- ESERCIZIO 2: ROTAZIONE ====================== Alcuni metodi di cifratura di parole sono basati sull'operazione di rotazione di una lettera. Ruotare una lettera c minuscola di un valore rot significa traslare c di rot posti, quando si arriva alla 'z' si riparte da 'a'. Indicando con c + rot = cRot il fatto che ruotando la lettera c di rot posti si ottiene la lettera cRot, si ha: a + 1 = b a + 2 = c d + 2 = f y + 1 = z // y e' la penultima lettera dell'alfabeto y + 2 = a y + 3 = b a + 100 = w Scrivere un programma Rotazione che legge un carattere c corrispondente a una lettera dell'alfabeto; se c e' maiuscola, va trasformata nella corrispondente minuscola. Dopo aver letto c, viene letta una sequenza di interi. Se l'intero rot inserito e' maggiore di zero, stampa un messaggio della forma c + rot = cRot come nell'esempio sotto; altrimenti, il programma termina. - Per leggere un carattere da standard input usare l'istruzione char c = in.readChar("Carattere: "); // in si riferisce a un oggetto ConsoleInputManager - Per estrarre i caratteri di una stringa usare il metodo charAt della classe String. - Il calcolo di c + rot va fatto usando una opportuna espressione aritmetica. - In questo e nei prossimi esercizi occorre conoscere il numero N delle lettere dell'alfabeto. Conviene porre all'inizio del programma un'istruzione del tipo final int N = ; // numero lettere dell'alfabeto Il modificatore final significa che il valore di N non puo' essere modificato (N e' una costante). ESEMPIO ------- Inserire un carattere: X Rotazione: 1 x + 1 = y Rotazione: 2 x + 2 = z Rotazione: 4 x + 4 = b Rotazione: 37 x + 37 = i Rotazione: 26543 x + 26543 = u -------------------------------------------------------------------------------------- ESERCIZIO 3: UN ESEMPIO DI CIFRATURA (CIFRARIO DI VIGENERE) ========================================================== Un noto metodo di cifratura consiste nel ruotare le lettere di una parola in base a una parola chiave, nota a mittente e destinatario, detta verme. Per semplicita' consideriamo solamente parole contenenti solo lettere maiuscole. Date due lettere maiuscole L1 e L2, scriviamo L1 + L2 = LROT per indicare che la lettera LROT e' ottenuta ruotando L1 del numero di posti corrispondenti alla posizione di L2 nell'alfabeto (vedi Esercizio 1). Ad esempio C + B = D in quanto B ha posizione 1 e ruotando C di 1 si ottiene D. Analogamente: X + A = X // A ha posizione 0 X + B = Y X + C = Z X + D = A X + E = B La cifratura avviene come segue. Supponiamo che la parola in chiaro da cifrare sia ACCALAPPIAFANTASMI Scriviamo sotto la parola il verme tante volte quanto basta per coprirne la lunghezza (eventualmente l'ultimo verme e' troncato) ACCALAPPIAFANTASMI VERMEVERMEVERMEVER La parola cifrata si ottiene "sommando" le lettere sulla stessa colonna. Poiche' A + V = V C + E = G C + R = T A + M = M L + E = P A + V = V P + E = T P + R = G I + M = U A + E = E F + V = A A + E = E N + R = E T + M = F A + E = E S + V = N M + E = Q I + R = Z la parola cifrata e' VGTMPVTGUEAEEFENQZ Scrivere un programma Verme che legge la parola da cifrare e il verme, trasformando tutte le lettere in maiuscole. Il programma deve stampare le somme eseguite per cifrare la parola e la parola cifrata. Si noti non e' necessario costruire la stringa contenente le ripetizoni del verme. ESEMPI ----- Parola? fenicottero Verme? ape F + A = F E + P = T N + E = R I + A = I C + P = R O + E = S T + A = T T + P = I E + E = I R + A = R O + P = D FTRIRSTIIRD ---------- Parola? accalappiafantasmi Verme? verme A + V = V C + E = G C + R = T A + M = M L + E = P A + V = V P + E = T P + R = G I + M = U A + E = E F + V = A A + E = E N + R = E T + M = F A + E = E S + V = N M + E = Q I + R = Z VGTMPVTGUEAEEFENQZ -------------------------------------------------------------------------------------- ESERCIZIO 4: DECIFRAZIONE ========================= Supponiamo ora di voler decifrare una parola cifrata come nell'Esercizio 3 conoscendo il verme. Una possibilita' e' quella di modificare il programma Verme eseguendo le rotazioni in senso opposto (attenzione ai valori negativi). Oppure, si puo' usare il programma Verme usando come chiave un "antiverme" ottenuto applicando le seguenti sostituzioni al verme: A ---> A B ---> Z C ---> Y D ---> X E ---> W F ---> V G ---> U H ---> T I ---> S J ---> R K ---> Q L ---> P M ---> O N ---> N O ---> M P ---> L Q ---> K R ---> J S ---> I T ---> H U ---> G V ---> F W ---> E X ---> D Y ---> C Z ---> B Si noti che la seconda colonna dal basso verso l'alto contiene le lettere dell'alfabeto ruotate di uno. Ad esempio, l'antiverme di APE e' ALW Codificando FTRIRSTIIRD con verme ALW si ottiene FENICOTTERO. L'antiverme di VERME e' FWJOW Codificando VGTMPVTGUEAEEFENQZ con verme FWJOW si ottiene ACCALAPPIAFANTASMI Scrivere un programma AntiVerme che, inserito un verme, stampa l'antiverme. Per determinare come va trasformata una lettere e' sufficiente scrivere una opportune espressione aritmetica. Cosa succede codificando un verme usando come verme il suo antiverme (ad esempio, codificando VERME usando come verme FWJOW, oppure APE con ALW)?