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.