Indice 1 Calcolo dei numeri primi

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