Paolo Boldi
Problemi per la lezione del 30/10
- [Finestre mutanti] Molte delle API standard di Java consentono di realizzare con facilità
delle interfacce grafiche (le cosiddette GUI, Graphical User Interface) basate su menù a tendine, finestre ecc.
In questo esercizio, vi proponiamo di sperimentare una di queste classi.
Le istanze della classe
JFrame
(nel pacchetto javax.swing
)
rappresentano delle finestre grafiche: l'uso tipico prevede che
un'istanza venga creata, popolata (cioè, riempita di oggetti grafici che costituiscono l'interfaccia per
l'utente) e resa visibile. Quando la JFrame
non serve più, la si può distruggere.
Aiutandovi con la documentazione delle API, scrivete un programma che:
- crea una
JFrame
usando il costruttore che vuole come argomento una stringa (il titolo
della finestra);
- la dimensiona: per farlo, dovete usare il metodo
setSize(d)
[noterete che questo metodo non
compare apparentemente nella documentazione della classe JFrame
, ma è uno dei metodi elencati
in fondo come "metodi ereditati" (spiegheremo il significato di questa espressione più avanti)]; il metodo
setSize(d)
vuole come argomento un oggetto d
di tipo Dimension
(classe contenuta nel pacchetto java.awt
): una Dimension
rappresenta una coppia
di interi, che corrispondono alla larghezza e all'altezza della finestra, misurate in pixel (punti grafici);
- la rende visibile: per farlo, invocate il metodo
setVisible(true)
(l'argomento può essere true
o false, a seconda che vogliate rendere la finestra visibile o invisibile);
- la distrugge, invocando il metodo
dispose()
.
Se eseguite il codice, vedrete che la finestra apparirà e scomparirà istantaneamente. Inserite, prima di far scomparire la
finestra, un ciclo for a vuoto con almeno 1000000000 (un miliardo) di cicli che provochi un ritardo.
A questo punto, alterate il codice dopo il ciclo di ritardo, in modo che:
- la finestra venga ridimensionata (chiamando di nuovo il metodo
setSize(d)
, con una dimensione diversa);
- ne venga cambiato il titolo, invocando il metodo
setTitle(s)
che vuole come argomento una stringa (il nuovo
titolo).
Aggiungete un nuovo ciclo di ritardo prima di distruggere la finestra.
- [Finestre erranti] Il metodo
setLocation(x,y)
serve per posizionare una JFrame
:
più precisamente, il metodo indica la posizione sullo schermo dell'angolo in alto a sinistra della finestra; il punto (0,0) è
inteso essere il punto in alto a sinistra dello schermo. Scrivete un programma che visualizzi una JFrame
in posizione
(100,100) e poi, per 1000 volte, ne sposti la locazione in modo casuale, incrementando o decrementando ogni volta le coordinate
x e y di un valore compreso fra -10 e 10; per ottenere un valore pseudo-casuale, invocate Math.random()
(che
restituisce un valore pseudo-casuale nell'intervallo [0,1)). Dopo ogni spostamento, fate un ciclo di ritardo di almeno 1000 passi.
- Uso della classe String
- [StringaPiuLunga.java] Uno dei metodi forniti dalla classe
String
restituisce
il numero di caratteri di cui la stringa è costituita:
quanti argomenti avrà secondo voi questo metodo? Cercate il metodo consultando la documentazione della classe,
e scrivete un programma che legga due stringhe e stampi la più lunga.
- [Prefisso.java] Assumete che i numeri di telefoni fissi inizino con 0, i numeri dei telefoni
Vodafone inizino con 34 e i numeri di telefoni TIM con 33 (e supponete, senza perdita di generalità, che Wind e 3
non esistano e che la number portability non sia mai stata inventata). Scrivete un programma che legga un numero
di telefono (come stringa) e che stampi se si tratta di un numero fisso, Vodafone o TIM. Per farlo avrete bisogno
di un metodo (della classe
String
) che determini se una stringa inizia con un certo prefisso:
cercatelo consultando la documentazione.
- [Rimpiazzare] La classe String contiene un metodo che consente di rimpiazzare tutte le occorrenze di un certo
carattere, o di una certa stringa, con un altro carattere, o stringa. Trovate questo metodo consultando la documentazione delle API, e poi scrivete un
programma che operi come segue:
- legge due stringhe, diciamo x e y
- inizia quindi un ciclo di lettura di stringhe: ogni volta che legge una stringa, la
stampa dopo aver sostituito tutte le occorrenze di x con y
- quando l'utente inserisce la stringa vuota, il programma termina.
- [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.
- [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).
Suggerimento 3: per convertire un numero in lettere suggeriamo
di usare degli switch (uno per le centinaia, uno per le decine e uno per
le unità).