Prova d`Esame — Compito A

Transcript

Prova d`Esame — Compito A
Prova d’Esame — Compito A
Si richiede di realizzare un sistema software che consenta la gestione del prestito di film da parte di
distributori automatici per videoteche. Ogni videoteca è caratterizzata dal nome, dal nome del
proprietario, dalla lista degli utenti registrati al prestito, dalla lista dei film disponibili. Ogni film è
caratterizzato dal titolo, dal genere, da un codice che lo identifica univocamente e dal numero di
videocassette disponibili per il prestito.
Esistono due tipologie di utenti della videoteca: gli utenti normali e gli utenti tematici. Sia gli utenti
normali che gli utenti tematici sono caratterizzati da un nome, da un codice numerico che li identifica
univocamente, dalla lista dei codici di film che hanno attualmente in prestito, e dal credito residuo.
Inoltre, gli utenti tematici sono caratterizzati anche dal genere di film a cui sono interessati.
Per prendere in prestito un film ogni utente deve essere registrato. Il prestito di un film può essere
effettuato solo qualora esistano videocassette ancora disponibili del film richiesto. Inoltre, il prestito di
un film ha un costo pari ad 1€ ed è subordinato alla disponibilità di credito dell’utente. Gli utenti normali
possono prendere in prestito qualunque film e possono avere al massimo 3 videocassette in prestito
mentre gli utenti tematici possono prendere in prestito solo film del genere a cui sono interessati e
possono avere al massimo 5 videocassette in prestito.
Il sistema di gestione del prestito di film deve consentire: di inserire e cancellare utenti, di caricare
da un file di testo la lista dei film disponibili per il prestito, di consentire ad un utente di aumentare il
suo credito e di prendere film in prestito.
Domanda 1
Il candidato modelli il sistema software specificato individuando i diversi componenti che lo
costituiscono e le relazioni fra di essi (ereditarietà/uso).
Domanda 2
Date
le
classi
nel
file
Noleggio.zip
reperibile
tramite
web
http://lia.deis.unibo.it/Courses/FondB0304-INF-LZ/noleggio/Noleggio.zip,
il
implementi i seguenti metodi di DistributoreVideocassette:
all’indirizzo
candidato
public int addUtenteNormale(String nome, int credito) throws VideotecaException
Il metodo addUtenteNormale consente di registrare un nuovo utente della videoteca e richiede di
specificare il suo nome ed il suo credito. Anzitutto si controlla se c’è spazio nell’array vetUtenti
per la registrazione e in caso non sia disponibile viene generata una eccezione di tipo
VideotecaException. Viceversa, viene creata una nuova istanza della classe Utenti avente il
nome specificato da nome e credito specificato da credito che viene inserita nell’array
vetUtenti. Infine viene restituito il codice che identifica l’istanza della classe utente creata.
public int addUtenteTematico(String nome, int credito, String genere) throws
VideotecaException
Il metodo addUtenteTematico consente di registrare un nuovo utente di tipo tematico e richiede
di specificare il suo nome, il suo credito ed il genere a cui è interessato. Anzitutto si controlla se
c’è spazio nell’array vetUtenti per la registrazione e in caso non sia disponibile viene generata
una eccezione di tipo VideotecaException. Viceversa, viene creata una nuova istanza della
classe UtentiTematici avente nome specificato da nome, credito specificato da credito e
genere specificato da genere che viene inserita nell’array vetUtenti. Infine viene restituito il
codice che identifica l’istanza della classe utente creata.
public void deleteUtente(int codiceUtente)throws VideotecaException
Il metodo deleteUtente consente di eliminare la registrazione di un utente identificato dal codice
codiceUtente specificato. Anzitutto viene verificato se l’utente è stato precedentemente
registrato. Se l’utente non viene trovato viene generata una eccezione di tipo
VideotecaException, viceversa si controlla che l’utente non abbia alcuna videocassetta in
prestito e, in questo caso, viene eliminato dall’array vetUtenti.
public void noleggiaVideocassetta (int codiceUtente, int codiceFilm)throws
VideotecaException
Il metodo noleggiaVideocassetta consente all’utente identificato dal codice codiceUtente di
prendere in prestito il film identificato dal codice codiceFilm. Anzitutto viene verificato se l’utente
ed il film sono stati precedentemente registrati. Se l’utente o il film non sono stati registrati viene
generata una eccezione di tipo VideotecaException. Viene poi controllato che l’utente non abbia
attualmente in prestito il film identificato da codiceFilm. In questo caso viene generata una eccezione di
tipo VideotecaException. Nel caso in cui l’utente identificato da codiceUtente sia un utente tematico,
viene controllato che il genere a cui l’utente è interessato sia il medesimo del film identificato da
codiceFilm, viceversa viene generata una VideotecaException. Viene decrementato il credito
dell’utente, viene inserito il codice del film nella lista dei film attualmente in prestito dell’utente, viene
decrementato il numero di cassette disponibili del film. Eventuali eccezioni che possono essere generate
devono essere rilanciate al contesto chiamante.
public void restituisciVideocassetta (int codiceUtente, int codiceFilm)throws
VideotecaException
Il metodo restituisciVideocassetta consente all’utente identificato dal codice codiceUtente
di restituire il film identificato dal codice codiceFilm che aveva preso in prestito precedentemente.
Anzitutto viene verificato se l’utente ed il film sono registrati. Se l’utente o il film non sono stati
registrati viene generata una eccezione di tipo VideotecaException. Viene poi controllato che
l’utente abbia attualmente in prestito il film identificato da codiceFilm. Se l’utente non ha in
prestito il film specificato viene generata una VideotecaException. Viene eliminato il codice del
film dalla lista dei film attualmente in prestito dell’utente, viene incrementato il numero di cassette
del film disponibili. Eventuali eccezioni che possono essere generate devono essere rilanciate al
contesto chiamante.
public void caricaListaFilm (String nomeFile)
Il metodo caricaListaFilm consente di caricare da file la lista dei film e di registrarli nell’array
vetFilm. Si apre in lettura il file di testo specificato da nomeFile. Si suppone che il file sia
organizzato in righe secondo il formato
<titolo>,<genere>,<numero videocassette>,
<titolo>,<genere>,<numero videocassette>,
<titolo>,<genere>,<numero videocassette>,
dove <titolo> è una stringa che rappresenta il titolo del film, <genere> è una stringa che
rappresenta il genere del film, e <numero videocassette> è un intero che rappresenta il numero
di videocassette disponibili per il film (vedi file film.txt). Ogni riga del file di testo rappresenta i
dati relativi ad un singolo film e si suppone che non esistano due righe che si riferiscono allo
stesso film.
Anzitutto si apre in lettura il file di testo nomeFile e si legge riga per riga fino a fine file. Per ogni
riga letta si crea una istanza di Film con i parametri (titolo, genere e numero videocassette) letti
da file. La nuova istanza deve essere registrata nell’array vetFilm. A questo fine si controlla che
ci sia spazio nell’array ed in caso contrario viene generata una eccezione di tipo
VideotecaException. Viceversa, se c’è spazio nell’array vetFilm, la nuova istanza di film viene
inserita. Tutte le eccezioni che possono eventualmente essere lanciate devono causare la stampa
della stack trace all’interno del metodo caricaListaFilm.
Domanda 3
Si crei un componente software Main che implementa il main della applicazione. Il componente
deve 1) creare una istanza di DistributoreVideocassette per la gestione della videoteca
“Crusty Video” di proprietà di “Crusty il Clown”, 2) caricare I film contenuti nel file film.txt, 3)
registrare un utente tematico “Bart”, avente un credito di 1€ interessato al genere “horror” 4) fare
prendere in prestito all’utente “Bart” il film avente codice “1”.
Domanda 4
Si progetti un pannello java (Jpanel ) personalizzato di nome PannelloFilm che contenga:
• testo: un campo di testo (JTextField) che deve consentire di immettere il codice relativo ad un
utente della palestra
• gestoreVideonoleggio: riferimento al componente che realizza il sistema per la gestione del
prestito delle videocassette della videoteca. Il campo di testo deve avere dimensione 25 ed
essere inizializzato con la stringa “ID Utente”.
Il pannello deve inoltre essere realizzato in modo da fungere da ascoltatore di eventi. In
particolare, ad ogni inserimento di una stringa nel campo testo, la reazione a tale evento consiste
nel convertire il valore della stringa in intero e nell’incrementare di 15€ il credito dell’utente della
videoteca identificato dal codice inserito. Nel caso in cui venga sollevata una eccezione deve
essere stampato a video la stack trace della eccezione (vedi API). Estendere il componente
software di nome Main in modo tale da creare un frame di larghezza 300 pixel ed altezza 100
pixel e aggiungere alla finestra un’istanza di PannelloFilm.
Domanda 5
Si progetti ed implementi un componente software FiltroEsame che implementa un filtro. Il
componente software prende due argomenti da linea di comando. Il primo argomento è il nome
del file di testo di ingresso, il secondo argomento è il nome del file di testo in uscita.
Il file di testo di ingresso si suppone organizzato per righe e composto da numeri interi separati
da spazi secondo il formato.
<num>
<num>
<num>
<num>
<num>
<num>
Il componente deve leggere tutte le righe del file di testo di ingresso e per ogni riga deve
effettuare la media aritmetica dei valori interi letti. Il valore della media aritmetica deve essere
salvato nel file di uscita. In particolare, il file di uscita deve essere organizzato per righe ed ogni
riga deve mantenere la media aritmetica dei valori nella riga corrispondente del file di ingresso. Si
noti che il valore della media aritmetica è generalmente un valore reale.
Domanda 6 (facoltativo)
Si progetti ed implementi una lista di interi in java tramite un array. La lista è caratterizzato da tre
operazioni:
• void inserisci (int num): inserisce un intero in testa alla lista.
• int rimuovi (): elimina l’elemento inserito in coda alla lista e lo restituisce come
argomento di ritorno. Genera una eccezione nel caso in cui la lista sia vuota.
• boolean esiste (int num): restituisce true se l’elemento specificato è presente nella lista,
false viceversa. Genera una eccezione nel caso in cui la lista sia vuota.