Paolo Boldi
Problemi per la lezione del 26/11
- [Frazioni con lo stesso denominatore] Il pacchetto prog.utili contiene una classe di nome Frazione le cui
istanze rappresentano delle frazioni. Dopo averne letto la documentazione, scrivere un programma che operi come segue:
- legge un numero intero n (al massimo 100);
- legge n frazioni;
- stampa una riga per ogni intero che compare come denominatore di una qualche frazione; la riga
stampata per il denominatore xxx ha la seguente forma: "denominatore xxx: somma yyy" dove yyy è la somma
delle frazioni con denominatore xxx.
Ad esempio, se le frazioni introdotte fossero 3/2, 6/8, 13/7, 3/2, 7/2, 1/7 dovrebbe stampare:
denominatore 2: somma 13/2
denominatore 4: somma 3/4
deniminatore 7: somma 2
Nota: si noti che la classe Frazione riduce automaticamente le frazioni ai minimi termini, quindi, ad esempio, una
frazione introdotta come 6/8 viene in realtà rappresentata come 3/4, e quindi risulterà avere denominatore 4.
- [A ritroso] Scrivete un programma che legga un testo terminato da una riga vuota,
e che ristampi il testo al contrario (dall'ultima riga alla prima e, per ciascuna riga, dall'ultimo carattere al primo).
Per risparmiare tempo… Per provare questo programma (ed eventualmente anche per i successivi) conviene che predisponiate, mediante un editor di
testo, un file di esempio (cioè, un testo concluso con una riga vuota), e che usiate il meccanismo di redirezione dello
standard input che avete imparato nella prima lezione su Linux.
- [Media armonica di frazioni] Scrivere un programma che usi la classe
Frazione
(nel pacchetto prog.utili
) e operi come segue:
- legge una sequenza di frazioni (numeratore e denominatore), terminata quando il numeratore inserito è 0;
- stampa la loro media armonica; la media armonica è il reciproco della media aritmetica dei reciproci.
- [La parola più lunga] Scrivete un'applicazione che legga una stringa e determini, al suo interno, la parola più lunga (o
meglio, una qualunque parola di lunghezza massima) e la stampi.
Una parola è una sequenza massimale di caratteri alfabetici: per determinare se un carattere è alfabetico, usate l'opportuno metodo statico
della classe
Character
.
- [Conversione numeri] Scrivete un'applicazione che, presa in ingresso una
stringa contente numeri di tre cifre al massimo, stampi in uscita la
stringa ottenuta sostituendo ai numeri la loro rappresentazione in parole (senza tener conto delle eccezioni).
Per es. data la stringa: "oggi ho comprato 16 mele per 382 soldi"
l'applicazione deve produrre la stringa "oggi ho comprato diecisei mele per trecentoottantadue soldi".
Suggerimento 1: potete utilizzare il metodo static isDigit della classe
involucro Character per identificare le cifre presenti tra i caratteri
della stringa.
Suggerimento 2: nel caso vi dovesse servire (ma ne potete fare a meno), nella classe Integer
c'è un metodo statico che converte una stringa (costituita solo da cifre) in un int: corrisponde
alla funzione C atoi(int).
- [Rettangoli, quadrati e aree] Scrivete un programma che chieda all'utente di inserire una sequenza di aree di figure geometriche
(le aree sono al massimo 100, tutte costituite da numeri interi, e terminate da 0). Dopo aver chiesto ciascuna area, il programma
chiede all'utente di inserire la misura del lato (che deve essere un divisore dell'area). A seconda dei casi, il programma creerà
un rettangolo o un quadrato.
Alla fine, verranno stampate le misure dei rettangoli e quadrati inseriti, nell'ordine in cui sono stati inseriti.
Ad esempio (le parti in grassetto sono inserite dall'utente):
Area: 15
Lato: 3
Area: 16
Lato: 4
Area: 17
Lato: 1
Area: 0
base = 3.0; altezza = 5.0
lato = 4.0
base = 1.0; altezza = 17.0
Suggerimento: per questo esercizio dovete sfruttare un array polimorfo (cioè un array il cui tipo di base sia tale da poter
ospitare sia rettangoli che quadrati).
- [Rettangoli, quadrati e aree / II parte] Modificate il programma che avete appena
scritto in modo che l'output prodotto sia questo:
Rettangolo -- base = 3.0; altezza = 5.0
Quadrato -- lato = 4.0
Rettangolo -- base = 1.0; altezza = 17.0
Suggerimento: per questo esercizio dovete sfruttare il polimorfismo e il predicato instanceof.
- [Identità ciclica] Due stringhe v e w sullo stesso alfabeto sono dette ciclicamente equivalenti sse
esistono due stringhe x,y tali che v=xy e w=yx. È facile vedere che questo definisce una relazione di equivalenza
sul monoide libero, le cui classi si chiamano collane.
Scrivete un programma che, lette due stringhe, determini se sono ciclicamente equivalenti oppure no.
- [Media, varianza e scarto quadratico medio] Scrivete un programma che, dopo aver letto una sequenza di numeri interi (al massimo 100,
terminata dalla lettura di -1), ne determini e stampi la media, la varianza e lo scarto quadratico medio. La varianza è, per definizione, la media dei quadrati
delle differenze fra i valori della sequenza e la media. Lo scarto quadratico medio è la radice quadrata della varianza (calcolabile
mediante il metodo statico sqrt di Math).
- [Minimo, massimo, moda] Scrivete un programma che, dopo aver letto una sequenza di numeri interi (al massimo 100,
terminata dalla lettura di -1), determini e stampi il valore massimo, il valore minimo e la moda. La moda è il numero che compare
più frequentemente (in caso di parità, uno qualunque dei numeri che compaiono più frequentemente). Ad esempio, se la sequenza introdotta
fosse 3, 12, 7, 12, 7, 5, 2, 7, -1 il programma dovrebbe stampare 12 (massimo), 2 (minimo) e 7 (moda).
Suggerimento: per calcolare la moda conviene, per ciascun elemento del vettore dei numeri letti, determinare quante volte quell'elemento
compaia nell'array, tenendo traccia della candidata moda e della sua frequenza.