Esercizi - Dipartimento di Informatica e Sistemistica

Fondamenti di Informatica I (12 cfu) - A.A. 2010-2011
Corsi di Laurea in Ingegneria Informatica e Automatica e Ingegneria dei Sistemi Informatici
Sapienza Università di Roma
Prova al calcolatore
Compito A - 6 settembre 2011 - Durata 3h
Esercizio 1 (vettori, ricorsione, eccezioni)
Dimostrare la conoscenza dei concetti di manipolazione di vettori, ricorsione ed eccezioni risolvendo
il seguente esercizio.
Scrivere una classe pubblica Eserc1 contenente un metodo statico int[] somma(int[] v1, int[]
v2) che, dati due vettori di int v1 e v2 delle stesse dimensioni, restituisce il vettore somma. In
particolare il vettore somma ris è un vettore che ha la stessa dimensione di v1 e v2 ed il cui generico
elemento ris[i] contiene il valore v1 [i] + v2 [i].
Se uno dei vettori passati come parametro è nullo rilanciare l’eccezione non verificata
VettoreException opportunamente definita, con il messaggio "Vettore nullo". Se i due vettori hanno invece dimensioni differenti rilanciare l’eccezione VettoreException con il messaggio
"Dimensioni differenti".
Esempio.
Considerando v1 = 1 6 5 e v2 = 2 5
9 il metodo dovrà ritornare 3 11 14 .
Scrivere la soluzione in modo da poter compilare ed eseguire il programma di prova, contenuto in
ProvaEserc1.java, senza doverlo modificare. Per effettuare il test viene utilizzato il dizionario
memorizzato nel file dizionario.txt fornito.
Tutti i metodi implementati devono essere ricorsivi. Non è consentito l’uso di istruzioni
di ciclo.
Esercizio 2 (File, Eccezioni, Java Collections Framework ed Iteratori)
Dimostrare la conoscenza dei file, delle eccezioni e del Java Collections Framework risolvendo il
seguente esercizio.
Scrivere una classe pubblica Dizionario che rappresenta un dizionario linguistico. Il dizionario
utilizza un file di testo contenente le parole valide: il file è costituito da una sequenza di righe in cui
ogni riga non vuota contiene una parola.
La classe deve avere i seguenti metodi d’istanza pubblici:
• un costruttore pubblico ad un argomento contenente il parametro filename (di tipo String)
che contiene il nome del file dizionario (se non viene specificato un percorso assoluto si assuma
che il file si trova nella cartella di lavoro del programma.).
• List<String> iniziaPer(String prefisso), che, dato un prefisso, restituisce tutte le parole
del dizionario che iniziano per prefisso (distinguendo tra maiuscole e minuscole), nell’ordine
in cui compaiono nel file. Se nessuna delle parole del dizionario soddisfa la condizione, restituire
una lista vuota.
Suggerimento: per controllare se una stringa inizia per un certo prefisso utilizzare il metodo
della classe String startWith(...) disponibile nelle API.
• int riconosciFrase(Iterator<String> frase), che prende un iteratore di parole che rappresenta una frase e restituisce il numero di parole della frase che appartengono al dizionario
(distinguendo tra maiuscole e minuscole).
Tutti i metodi devono propagare l’eccezione IOException in caso di errore di accesso al file.
Scrivere la soluzione in modo da poter compilare ed eseguire con successo il programma di prova
contenuto in ProvaEserc2.java, senza doverlo modificare.
Esercizio 3 (Strutture collegate lineari)
Dimostrare la conoscenza dei concetti di strutture collegate lineari (SCL) risolvendo il seguente
esercizio.
Si vuole realizzare una classe java che utilizzi le SCL per realizzare una matrice sparsa, cioè una
matrice in cui molti degli elementi sono nulli. Per realizzare tale struttura si utilizza una lista
collegata in cui si memorizzano solamente i valori diversi da 0.
Scrivere una classe pubblica NodoMatrice che rappresenta un nodo di una struttura collegata lineare
usata per memorizzare un elemento di una matrice di stringhe. Ogni nodo rappresenta una cella della
matrice e contiene i campi protetti row e col (di tipo int) che rappresentano la riga e la colonna
in cui si trova l’elemento, elem (di tipo int) che ne memorizza il valore e next che rappresenta il
riferimento al nodo successivo.
Scrivere una classe pubblica MatriceSparsa per memorizzare, mediante la classe NodoMatrice, i
valori non nulli della matrice.
1 0
Esempio: Data la matrice 8 12
0 0
LISTA −→
row
0
col
0
5 0
0 0 una sua possibile rappresentazione sottoforma di lista è
0 0
elem
row
−→
1
0
col
2
elem
row
−→
5
1
col
1
elem
row
−→
12
1
col
0
elem
8
Nota: l’ordine con cui si memorizzano le celle nella lista non segue necessariamente l’ordine in cui
esse compaiono nella matrice.
La classe deve contenere una variabile di istanza protetta di nome init con il riferimento al primo
nodo della SCL e i seguenti metodi pubblici:
• Costruttore a due argomenti che prende i parametri interi righe e colonne che rappresentano
le dimensioni della matrice e costruisce una matrice le cui celle sono tutte uguali a 0 (zero).
2
• public int getRows() e public int getCols(), che restituiscono rispettivamente il numero
di righe e di colonne della matrice.
• public int get(int row, int col), che restituisce il valore della matrice memorizzato nella
cella in posizione [row][col]. Se [row] o [col] non corrispondono ad una riga o colonna valida
rilanciare l’eccezione IllegalArgumentException (disponibile nelle API Java).
Suggerimento: scorrere la lista alla ricerca di un nodo corrispondente alla cella [row][col].
• public void set(int row, int col, int val), che assegna alla cella della matrice [row][col]
il valore del parametro val. Se [row] o [col] non corrispondono ad una riga o colonna valida
rilanciare l’eccezione IllegalArgumentException (disponibile nelle API Java).
In particolare la lista va modificata nel seguente modo: se il nodo corrispondente alla cella
[row][col] esiste occorre modificarne il valore, altrimenti è necessario aggiungere un nuovo nodo
alla lista contenente il valore val.
Scrivere la soluzione in modo da poter compilare ed eseguire con successo il programma di prova,
contenuto in ProvaEserc3.java, senza doverlo modificare.
Esercizio 4 (ereditarietà, late binding, Package, JFC)
Dimostrare la conoscenza dei concetti di ereditarietà, late binding, JFC e package risolvendo il
seguente esercizio.
Definire una opportuna gerarchia di classi per rappresentare messaggi. Tutte le classi devono estendere la classe astratta Messaggio contenuta nel package msg.
L’interfaccia ha i seguenti metodi:
• abstract public String getMittente(), abstract public String getDestinatario(): restituiscono il nome del mittente e del destinatario
• abstract public String getTesto(), abstract public void setTesto(String txt): rispettivamente restituisce e imposta il testo del messaggio da inviare
• abstract public boolean flagInviato(): indica se il messaggio è stato inviato attraverso
uno dei metodi invia(...) definiti nelle sottoclassi.
• final public String toString(): deve ritornare una stringa nella forma
"[nome-classe]:[mittente],[destinatario],[testo]" 1
Implementare poi le seguenti classi concrete, contenute nel package msg.impl.
• InstantMessage che estende Messaggio e rappresenta un messaggio istantaneo (come quelli
scambiati ad es. mediante MSN o GTalk). Contiene i seguenti elementi:
– un costruttore con i seguenti parametri: mittente, destinatario, nicknameMittente,
nicknameDestinatario.
3
– il metodo String invia() che imposta lo stato del messaggio su inviato e restituisce la
stringa di risposta del server cosı̀ costruita:
"IM-From:[nickname-mitt.]-To:[nickname-dest.]-Txt:[testo]" 1
• Email che estende Messaggio e rappresenta un messaggio email. Contiene i seguenti elementi:
– un costruttore con i seguenti parametri: emailMittente, emailDestinatario che memorizza i valori specificati in altrettante variabili d’istanza private. Inoltre estrae il nome dei
mittente e del destinatario dai corrispondenti indirizzi email secondo la seguente regola:
Il nome si ottiene a partire dall’email eliminando tutti i caratteri successivi alla prima
occorrenza di ’@’.
Esempio: se l’indirizzo email è [email protected] il nome estratto sarà mario-rossi.
– il metodo String invia(String indirizzoServer) che imposta lo stato del messaggio
su inviato e restituisce la stringa di risposta del server cosı̀ costruita:
"EMAIL@[indir-server]-From:[email-mitt.]-To:[email-dest.]-Txt:[testo]" 1
• Utilita (contenuta nel package msg.util) che contiene i seguenti metodi statici pubblici:
– String[] invia(Messaggio[] messaggi, String indirizzoServer) che invia tutti i
messaggi specificati (utilizzando se necessario l’indirizzo del server passato come parametro)
e restituisce un array di stringhe contenente le stringhe di risposta del server restituite dai
vari metodi invia(...) nello stesso ordine dell’array messaggi.
– List<Messaggio> inviatiDa(Messaggio[] messaggi, String mittente) che restituisce i messaggi che sono stati inviati (flag di invio a true) da mittente, nello stesso
ordine in cui compaiono nel parametro messaggi.
Scrivere la soluzione in modo da poter compilare ed eseguire con successo il programma di prova,
contenuto in ProvaEserc4.java, senza doverlo modificare.
1
dove i segnaposti tra parentesi quadre [...] (comprese le stesse) vanno sostituiti con i corrispondenti campi dell’oggetto.
4