Esercizi sul tipaggio di espressioni che coinvolgono gli array
Laboratorio 11 (17 dicembre 2008, 14:30 - 16:30)
Simulazione di compitino
- Si scriva un programma MaxCarattere.java che chiede all'utente
una frase fatta di sole lettere minuscole. Se così
non è, la richiede finché non è fatta di sole lettere
minuscole. Quindi crea un'altra frase della stessa lunghezza il cui
i-esimo carattere è uguale al carattere che viene dopo in ordine
alfabetico fra quello che segue e quello che precede immediatamente
l'i-esimo carattere della frase originaria. Se uno di tali caratteri
non esiste, si considera solo l'altro. Se la frase ha lunghezza 0 o 1,
l'altra frase è uguale alla frase stessa immessa dall'utente.
Infine stampa l'altra frase costruita dal programma. Per esempio, se
l'utente immette: carissimo, il programma dovrà stampare
arissssom
- Si indichino quali sono i tre errori che impediscono la
compilazione di questo programma, spiegando perché
- Si dica qual è il tipo delle seguenti espressioni,
o se esse contengono un errore e quindi non hanno un tipo:
3 + 3.14
s + 3.14 dove s è una stringa
'a' - 'b'
'd' - 3.14f
'a' * 11
s * 3.14 dove s è una stringa
'a' * 11
(int)3.14 / 5.2
Laboratorio 12 (18 dicembre 2008, 14:30 - 16:30)
Simulazione di compitino
- Si scriva un programma EstraiNumeri.java che
chiede all'utente una frase e stampa tutti i numeri naturali
contenuti in tale frase. Per esempio, per
la frase ciao 12come125 va 0 amico 6 dovrà
stampare
12
125
0
6
- Si indichino quali sono i tre errori che impediscono la
compilazione di questo programma, spiegando perché
- Si dica qual è il tipo delle seguenti espressioni,
o se esse contengono un errore e quindi non hanno un tipo:
s = s + 1 dove s è un int
s = s + 1 dove s è un char
s = (char)s + 1 dove s è un char
s = s + 1 dove s è una stringa
s = s + 1 dove s è una Frazione
a = b = 3 dove b è un int e
a è un float
a = b = 3 dove b è un float e
a è un int
Primo compitino: 22 gennaio 2009 alle 10:30 (senza iscrizione)
Fine del periodo uno
Lezione 16 (26 gennaio 2009, 8:30 - 10:30)
Visione dei compitini
Implementazione delle classi
Campi, costruttori e metodi
Esempio della classe Frazione del libro
Accesso ai campi, notazione punto
Riferimento this all'oggetto che esegue il metodo
Lezione 17 (27 gennaio 2009, 8:30 - 10:30)
Concatenazione dei costruttori con la notazione this()
Esempio di classe: Led.java
Miglioramento della classe Frazione del libro
Esempio di classe: Safe.java
Laboratorio 13 (28 gennaio 2009, 14:30 - 16:30)
- Si scriva una classe Data che rappresenta una data del calendario. Tale classe
deve avere i costruttori (non ci si preoccupi di date inesistenti):
- Data(int g, int m, int a) che costruisce una data che rappresenta il giorno
g del mese m (tra 1 e 12) dell'anno a
- Data(int g, int m) che costruisce una data che rappresenta il giorno
g del mese m (tra 1 e 12) dell'anno 2008
- Data(int g) che costruisce una data che rappresenta il giorno
g del mese di gennaio dell'anno 2008
- Data() che costruisce una data che rappresenta il 13 gennaio 1973
Inoltre deve avere dei metodi
- String toString() che restituisce una stringa del tipo 12 marzo 2007
- boolean precede(Data altra) che restituisce true se e solo se la data
viene strettamente prima dell'altra
- int passatiDallInizio() che restituisce il numero di giorni passati dall'inizio
dell'anno per la data (incluso il giorno rappresentato dalla data). Si tenga conto
degli anni bisestili
- Quindi si aggiunga a tale classe un metodo main che crea l'11 agosto 2008 e il 13
gennaio 1973, li stampa a video, stampa il risultato di precede dell'uno rispetto
all'altro e quindi stampa quanti giorni sono passati dall'inizio dell'anno per l'uno e per
l'altro
Il risultato dovrebbe essere:
11 agosto 2008
13 gennaio 1973
false
true
224
13
Laboratorio 14 (29 gennaio 2009, 9:30 - 11:30)
- Si scriva una classe StringaCrittata.java che fornisce:
- Un costruttore StringaCrittata(String s, char chiave) che crea un oggetto stringa
crittata che rappresenta il messaggio s crittato rispetto alla chiave.
Crittazione significa che i caratteri hanno come codice unicode quello dei caratteri di
s or-esclusivo con il carattere chiave. In Java l'or-esclusivo si indica
con ^ ed è un operatore binario infisso
- Un costruttore StringaCrittata(String s) che crea un oggetto stringa
crittata che rappresenta il messaggio s crittato usando come chiave il primo carattere di s (quello più a sinistra). Si assuma che s abbia almeno un carattere
- Un metodo String decritta(char chiave) che decritta la stringa crittata usando
la chiave. Decrittazione significa che i caratteri della stringa risultato
hanno come codice unicode quello dei caratteri della stringa crittata
or-esclusivo con il carattere chiave
- Si aggiunga a tale classe un metodo main che legge una frase dalla tastiera, la
critta col carattere f ottenendo una StringaCrittata che quindi
decritta, in ordine, con i caratteri e, 3 ed f, stampando ogni
volta il risultato
Il programma dovrebbe comportarsi alla fine come segue:
Immetti la frase da crittare: ciao
`jbl
6<4:
ciao
Lezione 18 (29 gennaio 2009, 11:30 - 13:30)
Campi e metodi statici
Costanti final static
Esempi di classe:
Salvadanaio.java e
Semaforo.java
I funghi che sanno contarsi: Fungo.java
Lezione 19 (2 febbraio 2009, 8:30 - 10:30)
La classe Orario del libro
Package e modificatori di visibilità
Il package universita: Studente.java e Universita.java da inserire nella directory universita
La classe Incrementa.java
che utilizza le classi Led.java e
Cifra.java
da inserire all'interno della directory display
Lezione 20 (3 febbraio 2009, 8:30 - 10:30)
Il concetto di sottoclasse
Ereditarietà e ridefinizione di metodi
Chiamata polimorfa di metodo
Esempio di definizione di sottoclassi: il caso di Quadrato
Laboratorio 15 (4 febbraio 2009, 14:30 - 16:30)
- Si scriva una classe Nota.java che implementa una nota musicale.
Essa deve fornire
- sette costanti intere DO...SI
- un costruttore Nota(int altezza) dove altezza puo' essere una delle sette costanti
- un metodo piuAltaDi(Nota altra) che determina se la nota è piú alta di altra
- un metodo toString() che restituisce una descrizione della nota come stringa, del tipo "DO", "RE", ecc.
- un metodo inglese() che passa alla convenzione inglese per la stampa delle note in toString() (deve avere effetto su tutte le note). In tale convenzione, A è il LA, B il SI, C il DO, D il RE, E il MI, F il FA e G il SOL
- un metodo italiano() che passa alla convenzione italiana per la stampa delle note in toString() (deve avere effetto su tutte le note)
- Si scriva quindi una classe Musica.java che è un
contenitore di al piú venti note. Essa deve fornire
- un costruttore Musica()
- un metodo aggiungi(Nota n) che aggiunge al contenitore la nota indicata come argomento
- un metodo piuAlta() che restituisce la nota più alta fra quelle contenute
- un metodo toString() che restituisce una descrizione delle note contenute, separate da uno spazio
- un metodo main che crea un oggetto Musica, gli aggiunge un re, un sol, un re e un fa e quindi lo stampa e stampa la sua nota piú alta. Quindi cambia la modalità di stampa delle note in inglese e ristampa l'oggetto Musica e la sua nota piú alta
Il programma dovrebbe stampare:
RE SOL RE FA
La nota piu' alta e' SOL
D G D F
La nota piu' alta e' G
Laboratorio 16 (5 febbraio 2009, 9:30 - 11:30)
- Si scriva una classe Insieme dentro al package insiemi che rappresenta un multi-insieme di double di dimensione arbitraria e non specificata, cioè un insieme in cui sono ammesse ripetizioni (un elemento può essere presente più volte). Tale classe deve fornire:
- Un costruttore Insieme() che crea un insieme vuoto
- Un metodo aggiungi(double num) che aggiunge num all'insieme
- Un metodo vuoto() che determina se l'insieme è vuoto
- Un metodo media() che restituisce la media dei numeri contenuti nell'insieme (lo assume non vuoto)
- Un metodo max() che restituisce il massimo dei numeri contenuti nell'insieme (lo assume non vuoto)
- Un metodo min() che restituisce il minimo dei numero contenuti nell'insieme (lo assume non vuoto)
- Un metodo unisci(Insieme altro) che aggiunge all'insieme gli elementi di altro, il quale non viene modificato
- Si scriva quindi, fuori dal package insiemi, una classe MainInsieme.java il cui metodo main crea due insiemi, inserisce in uno i numeri da 0 a 999 e nell'altro i numeri da 0 a -999; quindi stampa media, massimo e minimo di ciascuno dei due insiemi; infine aggiunge al primo insieme gli elementi del secondo insieme e stampa media, massimo e minimo degli elementi del primo insieme cosí modificato
Il programma dovrebbe stampare:
499.5
999.0
0.0
-499.5
0.0
-999.0
0.0
999.0
-999.0
Lezione 21 (5 febbraio 2009, 11:30 - 13:30)
L'operatore instanceof
Cast fra tipi riferimento: controllo a tempo di esecuzione
Esercizi sulla gerarchia delle classi
La classe Geometra.java
Lezione 22 (10 febbraio 2009, 8:30 - 10:30)
Definizione di una sottoclasse per estensione della superclasse
Legame fra costruttori: la notazione super()
Richiamo di metodi della superclasse: la notazione super.m()
Costruttore di default e super()
Adombramento di variabili. Disambiguazione tramite this.v
e super.v
Esempio di costruzione di una gerarchia di classi:
felini/Felino.java,
felini/Tigre.java,
felini/Gatto.java,
felini/Siamese.java,
felini/Scozzese.java,
MainFelini.java.
Classi astratte
Esempio di costruzione di una gerarchia di classi con una classe astratta:
monete/Moneta.java,
monete/Euro.java,
monete/Dollaro.java.
Laboratorio 17 (11 febbraio 2009, 14:30 - 16:30)
Si scriva una classe GeneratoreFigureCasuali che fornisca:
- un costruttore GeneratoreFigureCasuali()
- un metodo genera() che restituisce una figura geometrica
(cerchio, quadrato o rettangolo) generata casualmente, con raggio,
lato, base o altezza intere comprese fra 0 e 5 inclusi. Si ricordi che
per generare interi casuali si può usare un oggetto della classe
java.util.Random che fornisce il metodo int nextInt()
- un metodo getMax() che restituisce la figura di area massima
fra tutte quelle generate con questo generatore
- un metodo contenuta(x,y) che determina se la figura geometrica
x è inclusa dentro la figura geometrica
y, cioè può essere spostata al suo interno
- un metodo main che crea un generatore di figure casuali,
lo usa per generare 100 figure geometriche a caso, stampando ogni
volta se una figura è inclusa nella precedente oppure no, e infine
stampa la figura di area massima fra tutte le 100 generate.
Il risultato dell'esecuzione di main dovrebbe essere qualcosa del
tipo:
base = 0.0, altezza = 4.0
raggio = 1.0: non inclusa nella precedente
base = 2.0, altezza = 2.0: non inclusa nella precedente
base = 4.0, altezza = 4.0: non inclusa nella precedente
raggio = 1.0: inclusa nella precedente
....
....
raggio = 4.0: non inclusa nella precedente
raggio = 0.0: inclusa nella precedente
lato = 1.0: non inclusa nella precedente
base = 4.0, altezza = 0.0: non inclusa nella precedente
base = 4.0, altezza = 3.0: non inclusa nella precedente
base = 3.0, altezza = 5.0: non inclusa nella precedente
Figura di area massima: raggio = 5.0
Laboratorio 18 (12 febbraio 2009, 9:30 - 11:30)
Si scriva un package numeri al cui interno devono essere
scritte:
- la classe NumeroInBase.java, che rappresenta un numero naturale
in base arbitraria. Gli oggetti di tale classe devono avere:
- un costruttore NumeroInBase(numero,base) che costruisce
il numero indicato nella base indicata. Si dia per scontato che
numero sia non negativo e che base sia fra 2 e 36
- un metodo toString() che restituisce una stringa che
descrive il numero nella sua base di numerazione
- un metodo piu(altro) che restituisce il
NumeroInBase che rappresenta la somma del
NumeroInBase che esegue il metodo e del NumeroInBase
altro. Nessuno dei due oggetti deve venire modificato. Il
risultato deve essere nella stessa base di numerazione del numero
che esegue il metodo
- la classe Binario.java, sottoclasse di NumeroInBase.java,
i cui oggetti devono avere:
- un costruttore Binario(numero) che costruisce
il numero indicato in base 2. Si dia per scontato che
numero sia non negativo
- un metodo toString() che restituisce una stringa che
descrive il numero in base 2
- un metodo piu(altro) che restituisce il
NumeroInBase che rappresenta la somma del
Binario che esegue il metodo e del NumeroInBase
altro. Nessuno dei due oggetti deve venire modificato. Il
risultato deve essere in base 2
- la classe Esadecimale.java,
sottoclasse di NumeroInBase.java,
i cui oggetti devono avere:
- un costruttore Esadecimale(numero) che costruisce
il numero indicato in base 16. Si dia per scontato che
numero sia non negativo
- un metodo toString() che restituisce una stringa che
descrive il numero in base 16
- un metodo piu(altro) che restituisce il
NumeroInBase che rappresenta la somma
dell'Esadecimale
che esegue il metodo e del NumeroInBase
altro. Nessuno dei due oggetti deve venire modificato. Il
risultato deve essere in base 16
Infine si scriva una classe MainNumeri.java, esterna al package
numeri, il cui metodo main
crea 19 in base 4, poi in esadecimale, poi in binario
e poi in base 22; quindi li stampa tutti e quattro; quindi stampa
19 in base 22 piú 19 in esadecimale e stampa
19 in binario piú 19 in base 22.
Se tutto è corretto, l'esecuzione del main dovrebbe
stampare:
19 in base 4: 103
19 in base 16: 13
19 in base 2: 10011
19 in base 22: j
19 in base 22 piu' 19 in base 16: 1g
19 in base 2 piu' 19 in base 22: 100110
Lezione 23 (12 febbraio 2009, 11:30 - 13:30)
Esempio di costruzione di una gerarchia di classi con una classe astratta:
nazioni/Nazione.java,
nazioni/USA.java,
nazioni/EuroZona.java,
nazioni/Italia.java,
nazioni/Francia.java,
nazioni/Germania.java,
MainNazioni.java.
Esempio di costruzione di una gerarchia di classi e di ridefinizione di
metodi:
ticker/Ticker.java,
ticker/MyTicker.java,
ticker/AlarmedMyTicker.java,
MainTicker.java.
Lezione 24 (16 febbraio 2009, 8:30 - 10:30)
Documentazione JavaDoc
Overloading e scelta della segnatura a tempo di compilazione
Overriding e scelta dell'implementazione a tempo di esecuzione
Lezione 25 (17 febbraio 2009, 8:30 - 10:30)
Il metodo equals() di Object e sue ridefinizioni
Modificatori di visibilità
Modificatore final
Passaggio dei parametri per valore: il caso dei tipi primitivi e quello
dei tipi riferimento
Stack di attivazione e heap
Ricorsione: il caso del fattoriale
Laboratorio 19 (18 febbraio 2009, 14:30 - 16:30)
Si crei il package istogrammi all'interno del quale inserire:
Laboratorio 20 (19 febbraio 2009, 9:30 - 11:30)
(questo esercizio non prevede l'uso della ricorsione!)
Si crei un package stream dentro il quale inserire:
- una classe astratta Stream.java
che rappresenta una sequenza arbitraria infinita
di numeri interi n1,n2,n3,n4,n5,n6.... Gli oggetti di tale
sequenza devono fornire i metodi:
- primo() che restituisce n1
- resto() che restituisce un nuovo stream ottenuto eliminando
dallo stream il primo elemento: n2,n3,n4,n5,n6,...
- toString() che restituisce una stringa che contiene i
primi 100 elementi dello stream, separati da virgola
Lasciate astratti i metodi che non sapete implementare
- una sua sottoclasse concreta MaggioriOUgualiA che rappresenta lo
stream infinito dei numeri maggiori o uguali a una data costante.
Gli oggetti di tale classe devono avere un costruttore
MaggioriOUgualiA(costante) in cui si specifica la costante
da cui deve cominciare lo stream
- una classe concreta Positivi che rappresenta lo stream infinito
dei numeri positivi: 1,2,3,4,5,6.... Di quale altra classe conviene
farla sottoclasse?
Si scriva quindi, fuori dal package, una classe MainStream.java
che crea e stampa lo stream dei numeri maggiori o uguali a 100 e quello
dei numeri positivi.
Lezione 26 (19 febbraio 2009, 11:30 - 13:30)
Ricorsione su interi: il caso della successione di Fibonacci
Ricorsione su stringhe
Ricorsione su stringhe: la fusione di due stringhe
Lezione 27 (23 febbraio 2009, 8:30 - 10:30)
Ricorsione sugli array
Ricorsione: il caso della torre di Hanoi:
Hanoi.java
Lezione 28 (24 febbraio 2009, 8:30 - 10:30)
Strutture dati ricorsive: le liste
Ricorsione sulle liste: List.java
Laboratorio 21 (25 febbraio 2009, 14:30 - 16:30)
Si scriva una classe Ricorsione.java con i seguenti metodi:
- subset(s1,s2) (statico e ricorsivo):
restituisce una stringa che contiene i caratteri della stringa
s1 che sono anche nella stringa s2. Entrambe le
stringhe sono fornite già ordinate non decrescenti
e il risultato dovrà essere ordinato non decrescente;
- reverse(s) (statico e ricorsivo):
restituisce l'inversione della stringa s
- main(): chiede all'utente due stringhe ordinate, stampa
i caratteri della prima che sono anche nella seconda e poi stampa
l'inversione dei caratteri della prima che sono anche nella seconda.
Per esempio, una possibile esecuzione del metodo main()
dovrà essere:
Immetti la prima stringa ordinata: abbdtuuw
Immetti la seconda stringa ordinata: bdewz
I caratteri della prima stringa che sono anche nella seconda sono: bbdw
la cui inversione e': wdbb
Lezione 29 (26 febbraio 2009, 11:30 - 13:30)
Esempio di utilizzo delle liste
Esempi di ricorsione sulle liste: clonaggio, clonaggio alternato,
fusione, concatenazione, inversione
Laboratorio 22 (4 marzo 2009, 14:30 - 16:30)
Si consideri la seguente classe per le liste:
public class List {
private int head;
private List tail;
public List(int head, List tail) {
this.head = head;
this.tail = tail;
}
}
Si aggiunga a tale classe:
- un metodo ricorsivo toString() (o che chiama un metodo ausiliario
ricorsivo) che restituisce una stringa che descrive
la lista, formata dalla successione dei suoi elementi separati da
virgole, racchiusa fra parentesi quadre;
- un metodo localMaxs() ricorsivo
che restituisce la lista dei massimi
locali contenuti nella lista, nell'ordine in cui vi compaiono.
Un massimo locale di una lista è un elemento
strettamente maggiore di quello che lo precede e di quello che lo segue.
Il primo e l'ultimo elemento di una lista non sono mai massimi locali
perché non hanno un elemento che precede o segue, rispettivamente;
- un metodo main() che crea
la lista contenente gli elementi
3,-5,5,4,7,7,8,2,5, chiama su di essa il metodo
localMaxs() e stampa a video il risultato.
Se tutto è corretto, l'esecuzione di main() dovrà
stampare [5,8].
Soluzione: List.java
Laboratorio 23 (5 marzo 2009, 9:30 - 11:30)
Si consideri la classe Main.java,
da inserire
in un package t9, che crea un dizionario di parole italiane a partire
dal libro (file testo) promessi.txt (scaricatelo
sul vostro computer). Quindi usa questo dizionario per decodificare le parole
dalla sequenza di tasti del telefonino che le codificano. Tale classe usa
una classe Dizionario.java
che contiene una lista di parole e una classe
List.java
che implementa tale lista, entrambe da inserire nel package t9.
Alcuni metodi di tali classi devono ancora essere completati. Procedete
a completarli secondo la specifica. In particolare:
- il metodo String cerca(String tasti) va completato dentro
List.java. Esso deve restituire la prima parola della lista che
si scriverebbe con la sequenza indicata di tasti, o null
se tale parola non esiste;
- il metodo String leggi(FileReader file) va completato dentro
Dizionario.java, in modo da leggere una parola alla volta dal
file indicato (si legga la sua specifica!);
- il metodo String cerca(String tasti) va completato dentro
Dizionario.java. Esso deve restituire la prima parola, della
lista contenuta nel dizionario, che
si scriverebbe con la sequenza indicata di tasti, o null
se tale parola non esiste.
Se avete implementato tutto correttamente,
l'esecuzione di Main.java dovrebbe comportarsi come segue:
1 = ' 2 = abcàABC 3 = deféèDEF
4 = ghiìGHI 5 = jklJKL 6 = mnoòMNO
7 = pqrsPQRS 8 = tuvùTUV 9 = wxyzWXYZ
Immetti la sequenza di tasti premuti sul telefonino: 5146
codifica: l'ho
Soluzione: List.java e Dizionario.java.
Lezione 30 (5 marzo 2009, 11:30 - 13:30)
Eccezioni
Costrutto try/catch
Propagazione delle eccezioni lungo la catena di chiamata dei metodi
Comando throw
Eccezioni controllate e non controllate
Dichiarazione throws
Lezione 31 (9 marzo 2009, 8:30 - 10:30)
Eccezioni controllate per metodi che chiamano altri metodi
Eccezioni controllate e ridefinizione dei metodi
Esempio di uso delle eccezioni:
Pedina.java,
Pedone.java,
Alfiere.java,
Cavallo.java,
PosizioneIllegaleException.java,
MossaIllegaleException.java,
MainScacchi.java
Lezione 32 (10 marzo 2009, 8:30 - 10:30)
Risoluzione di compiti passati.
Laboratorio 24 (11 marzo 2009, 14:30 - 16:30)
Si parta dalla soluzione del Laboratorio 22 e si modifichi tale classe
List.java come segue:
- aggiungendo un costruttore List(int[] elements) che
costruisce una lista di interi i cui elementi sono forniti nell'array
passato come parametro. L'implementazione di tale costruttore deve
chiamare un altro costruttore ausiliario
che applica la ricorsione sull'array.
Se l'array è vuoto, tale costruttore deve lanciare una
NoElementsException con messaggio construction of list
(anche tale eccezione va scritta);
- modificando il metodo localMaxs() in modo da fargli
lanciare una NoLocalMaxsException (con messaggio vuoto)
quando non ci sono massimi
locali nella lista (anche tale eccezione va scritta);
- modificando il metodo main() in modo da fargli crare la lista
tramite il nuovo costruttore che avete aggiunto (quello con l'array
come parametro). Il metodo main() non deve lanciare alcuna
eccezione: se non ci sono massimi locali nella lista, dovrà
stampare il messaggio Non ci sono massimi locali.
Soluzione: List.java
Fine del corso
Secondo compitino e compito completo: 2 aprile 2009 alle 10:00 (con iscrizione)