...

Link a Esercizi

by user

on
Category: Documents
29

views

Report

Comments

Transcript

Link a Esercizi
Laboratorio di programmazione
18 novembre 2015
Spaziate
Scrivete un programma che legga una riga introdotta dall’utente e ne stampi i caratteri a spaziatura doppia.
Esempio di input
Ma Ugo, non l’abbiamo mai fatto!
Esempio di output
MaUgo,nonl’abbiamomaifatto!
Palindrome
Una parola è palindroma se è uguale quando viene letta da destra a sinistra e da sinistra a destra. Quindi “enne” è
palindroma, ma “papa” non lo è. Scrivete un programma che legga una stringa da tastiera e dica se è palindroma o
no.
Esempio di input
abba
Esempio di output
abba è palindroma
Esempio di input
pippo
Esempio di output
pippo non è palindroma
Lunghezza media delle parole
Scrivete un programma che legga una frase (cioè, un’intera riga) e che calcoli quante parole contiene e la loro
lunghezza media.
Esempio di funzionamento
1
Frase: S’i’ fosse foco, arderei ’l mondo
La frase contiene 7 parole, con lunghezza media 3.43.
Suggerimenti
• Per contare quante parole contiene una stringa potete controllare quanti sono i caratteri alfabetici seguiti
da caratteri non alfabetici; per vedere se un carattere c è alfabetico potete usare il metodo statico
Character.isLetter(char)
Il metodo restituisce vero quando il suo argomento è alfabetico. Dovete ovviamente stare attenti a quel che
fate sull’ultimo carattere.
• Per stampare un numero double con un certo numero cifre decimali, anziché usare System.out.println()
potete usare System.out.printf(), che accetta una stringa di formato. Per esempio,
System.out.printf("La frase contiene %d parole, con lunghezza media %.2f\n", n, media);
assumendo che la variabile intera n contenga il numero di parole e che la variable doublemedia contenga
la media.
Il cifrario di Cesare
Svetonio nella Vita dei dodici Cesari racconta che Giulio Cesare usava per le sue corrispondenze riservate un codice
di sostituzione molto semplice, nel quale la lettera chiara veniva sostituita dalla lettera che la segue di tre posti
nell’alfabeto: la lettera A è sostituita dalla D, la B dalla E e così via fino alle ultime lettere che sono cifrate con le
prime.
Più in generale si dice codice di Cesare un codice nel quale la lettera del messaggio chiaro viene spostata di un
numero fisso k di posti, non necessariamente tre.
Dovete scrivere un programma che chieda in input il numero k (chiave di cifratura) e una stringa da cifrare, e
che emetta in output la stringa cifrata; il programma deve cifrare solo le lettere dell’alfabeto, mantenendo
minuscole le minuscole, e maiuscole le maiuscole, mentre deve lasciare inalterati gli altri simboli. Assumete che
la stringa non contenga lettere accentate.
Per provare se il programma funziona, cifrate un messaggio con una certa chiave k e poi applicate al risultato
una nuova cifratura con chiave 26 − k: il risultato dovrebbe essere la stringa originale.
Esempio di funzionamento
Frase da cifrare: mamma li Turchi
Chiave: 5
Frase cifrata: rfrrf qn Yzwhmn
Frase da cifrare: rfrrf qn Yzwhmn
Chiave: 21
Frase cifrata: mamma li Turchi
Suggerimenti
• Per “spostare” ciclicamente di k posti un carattere c potete usare l’espressione
2
( ( c - ’A’ ) + k ) % 26 + ’A’
nel caso c sia maiuscolo,
( ( c - ’a’ ) + k ) % 26 + ’a’
nel caso c sia minuscolo (perché?).
• Per stabilire se un carattere è una lettera maiuscola o minuscola potete usare i metodi statici
Character.isUpperCase(char)
e
Character.isLowerCase(char)
Garibaldi fu ferito
Scrivete un programma che legga una stringa in input e la stampi dopo aver sostituito tutte le vocali con delle “u”.
Suggerimento: utilizzate l’istruzione switch per scrivere una funzione che accetti un carattere e lo restituisca
trasformato opportunamente.
Esempio di funzionamento
Stringa: Garibaldi fu ferito, fu ferito in una gamba
Gurubuldu fu furutu, fu furutu un unu gumbu
Il verme disicio
Il verme disicio è un dannoso animale che vive nelle pagine dei libri, descritto da Benni ne “Il bar sotto il mare”. Il
verme mangia parole in un punto di un libro e le sposta da un’altra parte, causando confusione nel lettore. Dovete
scrivere un simulatore di verme disicio che affligga i testi che gli vengono propinati in input.
Per scrivere il simulatore, operate come segue. Utilizzate il metodo statico Math.random() per ottenere un
numero a caso e confrontarlo con una soglia scelta da voi p (diciamo p = 0.15) in modo da simulare una moneta
tarata di peso p. Scandite il testo in input utilizzando uno Scanner, e ad ogni token restituito da Scanner.next()
tirate la moneta:
if ( Math.random() < p ) { ... // Testa
} else {
... // Croce
}
Il vostro simulatore può essere in due stati: o sta scandendo, o sta saltando. Quando sta scandendo, accumula
i token letti in una stringa text. Quando sta saltando, accumula i token letti in una stringa temp. I due stati si
scambiano ogni volta che la moneta fa testa. Si parte dallo stato di scansione.
• Quando si passa da scandire a saltare, si mette da parte il token corrente in una variabile stringa s e si azzera
temp (assegnandogli la stringa vuota);
3
• Quando si passa da saltare a scandire, si concatenano temp, s e il token corrente (in quest’ordine) a text.
Alla fine dovete stampare text.
State attenti durante la scrittura del programma e l’esecuzione. Infatti, il verme disicio è alquanto irascibile
vendicarsi e potrebbe. Mutazioni del verme hanno cominciato ad aggredire gli questo archivi elettronici, e non è
rarissimo trovare dei testi vandalizzati da. Siete parassita avvertiti stati!
Suggerimenti
• Per leggere a parole basta costruire uno Scanner e usare il metodo next(), che restituisce il prossimo token.
Per sapere quando non ci sono più parole, dovete usare il metodo hasNext(). Il vostro ciclo di lettura
dell’input deve quindi essere
while( scanner.hasNext() ) { String t =
scanner.next(); ...
}
• Scanner mangia gli spazi. Quando concatenate, dovete reinserirli.
• Non è divertente fare esempi di cinque parole. Scrivete un testo di qualche riga con l’editor, salvatelo in un
file di nome testo.txt e datelo in pasto al vostro programma usando la redirezione:
java Disicio <testo.txt
Sarà molto più divertente.
• Prima di stampare text alla fine, controllate di non stare saltando, nel qual caso dovete operare come nella
transizione da salto a scansione prima di effettuare la stampa.
• Per controllare di non aver fatto errori, potete passare al programma un testo come
abcdefghijklmnopqrstuvwxyz
L’output del programma deve comprendere esattamente le ventisei lettere dell’alfabeto, con qualche
lettera spostata all’indietro (quale lettera dipende dal valore restituito da Math.random(), che non è
predicibile).
• Questa versione del verme disicio può solo spostare una parola all’indietro. Provate a scrivere una versione
che scambia le parole trovate all’inizio e alla fine della fase di salto.
Massimo prefisso/suffisso comune
Scrivete un programma che legga due stringhe dalla e ne stampi il massimo prefisso e il massimo suffisso comune.
Il massimo prefisso comune di due stringhe s0s1 ···sm−1 e t0t1 ···st−1 è la sequenza s0s1 ···sj di massima lunghezza (cioè
di massimo j) tale che s0 = t0, s1 = t1, ..., sj = tj. Analogamente viene definito il massimo suffisso comune.
Esempio di funzionamento
4
Prima stringa: mamma
Seconda stringa: madre
Massimo prefisso: ’ma’
Massimo suffisso: ”
Prima stringa: pippo
Seconda stringa: pappo
Massimo prefisso: ’p’
Massimo suffisso: ’ppo’
Prima stringa: foo
Seconda stringa: foo
Massimo prefisso: ’foo’
Massimo suffisso: ’foo’
5
Fly UP