Comments
Description
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