Indice Indice 1 Numeri primi 1.1 Analisi del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Soluzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 Manipolazione di stringhe 2.1 Il cifrario di Cesare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Il gioco dell’enigmistica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 1 1.1 Calcolo dei numeri primi Analisi del problema Fasi di sviluppo di un programma In generale, l’analisi di un problema computazionale può essere affrontato secondo il seguente schema: • Specifica dei requisiti (specifiche) • Progetto o disegno logico (progetto) • Implementazione del codice (codifica) • Test dell’implementazione e raffinamenti (correttezza e ottimizzazione) Discutere le specifiche Problema Scrivere un programma Java che stampi tutti i numeri primi compresi tra 2 e n (intero) • Che cosa si intende per numero primo? Un intero N > 1 è primo se e solo se i soli interi positivi che dividono N sono 1 e N stesso • 2 è un numero primo? • Le specifiche sono chiare o ambigue? Se si chiedesse “... qualche numero primo!” • Il problema è risolvibile? Se si chiedesse “... il più grande numero primo!” Metodologia di progettazione Con quale metodo posso calcolare l’area della seg. figura? r r h a b h b B Progettazione: metodo top-down Sviluppo del progetto secondo il metodo top down • Individuazione dei sottoproblemi: – – – – acquisire il valore di M effettuare un loop con i da 2 a n determinare se i è primo (test di primalità) stampare il numero quando il test è positivo • Dare una descrizione ad alto livello dei sottoproblemi e quindi una soluzione (in lingua o pseudo codice) • Raffinare la descrizione passo dopo passo fino a che non si ottiene il codice finale Test di primalità Determinare (in modo naı̈f) se il numero i è primo: metodo delle divisioni successive testNumero = true LOOP (con divisore = 2,3,...,i-1) SE (i % divisore == 0) testNumero = false ... SE (testNumero) stampa i 1.2 Soluzione Codifica “E’ noto che i migliori scrittori a volte infrangono le regole della retorica. Quando lo fanno, tuttavia, il lettore coglie nella frase qualcosa che compensa la violazione della regola. Se non si è certi di riuscire a fare altrattanto, è probabilmente meglio seguire le regole.” The elements of style Vedi il programma NumeriPrimi.java ... Migliorare la soluzione Possiamo raffinare (ottimizzare) la soluzione per renderlo più efficiente, preservando la correttezza del programma, in base alle seguenti osservazioni: • interrompere il loop (ciclo for) non appena si scopre che il numero è fattorizzabile √ • non è necessario provare tutti i fattori da 2 a i − 1, è sufficiente l’insieme {2, 3, . . . , i} • Vedi il programma NumeriPrimi1.java ... 2 2 2.1 Manipolazione di stringhe Il cifrario di Cesare Codice di sostituzione • Si narra che Giulio Cesare usasse per le sue corrispondenze riservate un codice di sostituzione molto semplice, nel quale la lettera in chiaro veniva sostituita dalla lettera che la segue di tre posti nell’alfabeto: la lettera A è sostituita dalla D, la B dalla E ecc... • Chiaro → abcdefghijklmnopqrstuvwxyz Cifrato → DEFGHIJKLMNOPQRSTUVWXYZABC • Prendendo come esempio la frase “servono rinforzi” si ottiene il seguente messaggio cifrato: Chiaro → servono rinforzi Cifrato → VHUYRQR ULQIRUCL Problema più generale Codice di sostituzione con chiave Scrivere un programma che realizzi un codice di sostituzione in cui si possa sostituire ogni lettera con quella che la segue di n posizioni (1 ≤ n ≤ 26), dove n è la chiave di cifratura Specifiche del problema: • dato un testo (solo lettere minuscole) in chiaro e una chiave, cifrare il testo con il codice di sostituzione • dato un testo cifrato (solo lettere maiuscole) ottenere il testo in chiaro a patto di fornire la chiave corretta • preservare l’inviolabilità del codice: il testo originale può essere ottenuto solamente conoscendo la chiave Progettazione Sottoproblemi • menu a due scelte: codifica e decodifica • acquisizione di testo e chiave • costruire il testo (cifrato o in chiaro) mediante la sostituzione di un carattere alla volta ... w . . . x y z a b c 23 24 25 0 1 2 Codifica finale Vedi il programma CodiceDiSostituzione.java ... 3 d . . . ... Sequenze di escape Alcuni caratteri non vengono stampati e sono chiamati sequenze di escape: Seq. \b \t \n \f \r \" \\ Unicode \u0008 \u0009 \u000a \u000c \u000d \u0022 \u005c Significato backspace BS horizontal tab HT linefeed LF form feed FF carriage return CR double quote backslash Esempio println("\tE poi disse: \"Giu’ la testa c.!\"\n"); > E poi disse: "Giu’ la testa c.!" 2.2 Il gioco dell’enigmistica Testo palindromo Esempi di testi palindromi O citta’ nuova, ti balen’Amore, l’arte t’annoda. Ci nuota, la sera, Morte ideale. Vidi matto, ratto, serrarti, Diva, i nitidi livelli ma i lati d’Eva, no ! Nave d’Italia mille vili ditini avidi trarre sott’a’rottami di vela, e dietro mare salato, unica donna: te ! Tra le romane l’abitavo, un attico.... IN GITUM IMUS NOCTE ET CONSUMIMUR IGNI Anagrammi Gli anagrammi sono parole ottenute permutando tra loro gruppi di lettere di una parola data • Alcuni anagrammi (di senso compiuto sono) del nome MARIANO sono: ARMONIA ROMANIA MONARIA MORIANA (Regione alpina francese) • Tutti i possibili anagrammi sono: MARIANO AMRIANO RAMIANO IARMANO AARIMNO ... MRAIANO MIRAANO MNRIAAO ... MONARIA ... 4 Acronimi ricorsivi Frasi in cui la prima parola è l’acronimo e le inizilali delle parole successive coincidono con le lettere dell’acronimo stesso a partire dalla seconda lettera Esempi • URSUS Rappresenta Solo Una Sigla • PENSACI Evidentemente Non Sono Altro Che Iniziali • GNU’s Not Unix • PINE Is Not Editor • PIRLA: Inconcludente Raziocinio Largamente Abusato Problemi enigmistici Anagramma Sviluppare un programma (il metodo main della classe Anagramma) che date due parole in input, verifichi se l’una è l’anagramma dell’altra Progettazione Sottoproblemi • acquisizione delle due parole • verifica lunghezza coincidente • verifica anagramma delle parole • stampa dei risultati m a r i a n o a r m o n i a a r o n i a r o n i a Codifica Vedi il programma Anagramma.java ... 5 Problemi enigmistici Acronimo ricorsivo Sviluppare un programma (il metodo main della classe AcronimoRicorsivo) che, dato un testo arbitrario: • legga un testo • verifichi se è un acronimo ricorsivo • lo restituisca in forma normale, cioè quella che preserva le maiuscole delle iniziali (come negli esempi) Progettazione Sottoproblemi • acquisizione di testo • estrazione acronimo (prima parola) • verifica delle iniziali ricorsivamente • verifica se maiuscole (occorre conoscere gli operatori di confronto!) u r s u s r a p p s o l o u n a s i g l r e . a Codifica Vedi il programma AcronimoRicorsivo.java ... Problemi enigmistici Testo palindromo Sviluppare un programma (il metodo main della classe TestoPalindromo) che preso un testo arbitrario ne elimini tutti i caratteri diversi dalle lettere dell’alfabeto e verifichi se è palindromo Da fare come esercizio ... 6