Prova di Laboratorio di Programmazione
29 gennaio 2015
ATTENZIONE: Non è possibile usare le classi del package prog.io del libro di testo
Lo scopo è realizzare un programma che permetta di svolgere alcune semplici operazioni relative ai prestiti in una
biblioteca.
Oltre ai metodi richiesti in ciascuna classe, è opportuno implementare altri metodi che si ritengono utili per svolgere
l’esercizio nel modo più corretto ed elegante, per esempio il metodo toString() e i metodi di accesso ai campi,
che sono necessari anche perché il codice esterno ad una classe non deve mai accedere direttamente ai campi della
classe per ottenerne o modificarne il valore.
Le operazioni di stampa vanno effettuate esclusivamente nella classe che definisce il metodo main().
Esercizio 1
Si implementino le seguenti classi.
Classe Utente
Un oggetto della classe Utente rappresenta un utente della biblioteca, ed è caratterizzato da:
• codice (intero);
• nome (stringa);
• cognome (stringa).
Ogni utente è univocamente identificato dal suo codice, che è 0 per il primo utente inserito, 1 per il secondo e cosı̀ via.
Classe Libro
Un oggetto della classe Libro rappresenta un libro, ed è caratterizzato da:
• codice (intero);
• autore (stringa);
• titolo (stringa).
Ogni libro è univocamente identificato dal suo codice di inventario. La classe Libro implementa Comparable<Libro>,
e il confronto avviene per ordine alfabetico di titolo.
Nota: ci possono essere diverse copie dello stesso libro con codice d’inventario diverso. In tal caso le diverse copie
sono confrontate rispetto al numero di codice.
Classe Prestito.
Un oggetto della classe Prestito rappresenta il prestito di un libro. È basato sulla classe Date, che memorizza una
data: per utilizzarla, dovete importare java.util.*. Un prestito è caratterizzato da:
• libro (un attributo di tipo Libro);
• giorno di inizio prestito (un’istanza di Date);
• giorno fine prestito (un’istanza di Date);
• utente (un attributo di tipo utente).
1
Per creare istanze di Date dovete utilizzare il costruttore Date(int,int,int) che prende tre interi: l’anno a
partire dal 1900, il numero del mese e il giorno del mese. Per esempio,
Date d = new Date(115,1,1);
crea un’istanza di LocalDate che rappresenta il capodanno del 2015. Per utilizzare Date si deve importare java.util.*
all’inizio del programma.
La classe Prestito implementa il metodo public boolean inPrestito(Date giorno), che restituisce
vero se nel giorno specificato il libro era in prestito. Dal momento che Date implementa Comparable, per capire
se nel giorno il libro era in prestito si possono fare confronti tra istanze di tale classe.
2
Scrivere un programma Prog1 che legge da standard input una sequenza di righe con i seguenti formati:
U,nome,cognome
L,autore,titolo,codice
P,codice libro,codice utente,data inizio,data fine
D,data
Le righe U,nome,cognome richiedono la creazione di un utente con i dati indicati. Il codice utente deve essere
assegnato progressivamente a partire da zero.
Le righe L,autore,titolo,codice libro richiedono la creazione di un libro di cui vengono specificati titolo,
autore e codice.
Le righe P,codice libro,codice utente,data inizio,data fine richiedono la creazione di un prestito con i dati indicati.
Le righe D,data richiedono di stampare la lista ordinata dei libri in prestito nella data fornita. I libri vanno stampati
secondo l’ordinamento definito per la classe Libro.
Le date sono inserite nel formato giorno, mese, anno separati da una barra. Per stampare una data nello stesso formato,
avete bisogno di un’istanza di DateFormat. Assumendo che abbiate aggiunto import java.text.* all’inizio
del programma, potete usare
DateFormat f = DateFormat.getDateInstance(DateFormat.SHORT);
String dataFormattata = f.format(d);
dove d è un’istanza di Date.
Non è necessario fare controlli sulla correttezza dell’input. Non vanno fatte assunzioni sul numero di linee in input.
L’input va letto da standard input. Per testare il programma, consigliamo di utilizzare la redirezione fornita dalla
shell (si veda l’esempio sotto).
Esempio
Il file in1.txt contiene le linee seguenti
U,Sebastiano,Vigna
U,Elena,Casiraghi
U,Corrado,Monti
L,Robert Heinlein,Stranger in a strange land,1234
L,George Perec,La vita: istruzioni per l’uso,1111
L,Italo Calvino,Se una notte d’inverno un viaggiatore,4242
P,4242,2,3/1/2015,17/1/25
P,1111,1,13/1/2015,20/2/2015
P,1234,0,1/1/2015,14/2/2015
P,1111,2,21/2/2015,27/2/2015
D,10/1/2015
D,22/2/2015
java Esercizio1 < in1.txt
In data 10/1/15 i libri in prestito sono:
George Perec, "La vita: istruzioni per l’uso" (1111)
Italo Calvino, "Se una notte d’inverno un viaggiatore" (4242)
Robert Heinlein, "Stranger in a strange land" (1234)
In data 22/2/15 i libri in prestito sono:
George Perec, "La vita: istruzioni per l’uso" (1111)
3
Esercizio 2
Si aggiunga al programma la classe seguente.
Classe Biblioteca.
Un oggetto della classe Biblioteca rappresenta una biblioteca contenente utenti, libri e prestiti.
La classe Biblioteca definisce il metodo public ArrayList<Libro> inventario(Date data), che
restituisce l’inventario del libri presenti alla data specificata secondo l’ordine alfabetico rispetto al titolo.
Inoltre, definisce il metodo public ArrayList<Libro> inPrestito(Date data, Utente utente),
che restituisce la lista degli libri in prestito all’utente specificato alla data specificata.
Scrivere un programma Prog2 che crea un’istanza della classe Biblioteca e quindi legge da standard input una
sequenza di linee con il formato dell’esercizio precedente, più una nuova possibile riga
I,data
L,codice utente,data
Le righe I,data richiedono di richiamare il metodo di inventario() sulla data specificata, stampando quindi i
libri presenti in biblioteca in tal data, uno per riga.
Le righe L,codice utente,data richiedono di richiamare il metodo inPrestito() per l’utente e la data
specificati, stampando quindi i libri che l’utente ha in prestito in tal data, uno per riga.
Non è necessario fare controlli sulla correttezza dell’input. Non vanno fatte assunzioni sul numero di linee in input.
L’input va letto da standard input. Per testare il programma, consigliamo di utilizzare la redirezione fornita da shell
(si veda l’esempio sotto).
Esempio
Il file in2.txt contiene le linee seguenti
U,Sebastiano,Vigna
U,Elena,Casiraghi
U,Corrado,Monti
L,Robert Heinlein,Stranger in a strange land,1234
L,George Perec,La vita: istruzioni per l’uso,1111
L,Italo Calvino,Se una notte d’inverno un viaggiatore,4242
P,4242,2,3/1/2015,17/1/25
P,1111,1,13/1/2015,14/2/2015
P,1234,0,1/1/2015,14/2/2015
P,1111,2,15/1/2015,27/2/2015
I,22/2/2015
L,2,16/1/2015
In data 22/2/15 l’inventario è costituito da:
Italo Calvino, "Se una notte d’inverno un viaggiatore" (4242)
Robert Heinlein, "Stranger in a strange land" (1234)
In data 16/1/15 l’utente Corrado Monti ha in prestito i seguenti libri:
George Perec, "La vita: istruzioni per l’uso" (1111)
Italo Calvino, "Se una notte d’inverno un viaggiatore" (4242)
4
Istruzioni per la consegna
Consegnare soltanto i file seguenti (non i file .class):
Utente.java
Libro.java
Prestito.java
Biblioteca.java
Prog1.java
Prog2.java
come un unico file compresso creato col comando
> zip provalab Utente.java Libro.java Prestito.java Biblioteca.java Prog1.java Prog2.jav
Eseguire l’upload del file all’indirizzo upload.di.unimi.it.
Non consegnate file che non compilano.
5