LABORATORIO DI PROGRAMMAZIONE EDIZIONE DIURNA TURNI A–B–C APPELLO DEL 25 FEBBRAIO 2013 Avvertenza. Nello svolgimento dell’elaborato è possibile usare qualunque classe delle librerie standard di Java. Non è invece ammesso l’uso delle classi del package prog impiegato a lezione. 1. Classe Evento. Scrivete una classe di nome Evento. Ciascuna istanza della classe rappresenta un evento che potrà accadere o non accadere, e sul quale è possibile scommettere. Gli eventi sono descritti da proposizioni come, per esempio, “L’Italia segna nella partita contro la Francia”, “Nel lancio della moneta esce testa”, o “La prossima carta estratta è la regina di cuori”. La classe ha un attributo privato descrizione il cui valore è impostato dal costruttore. La classe ridefinisce inoltre il metodo toString ereditato da Object in modo da restituire il valore di descrizione. La classe ha un secondo attributo privato stato, e un metodo boolean verifica, che servono a implementare quanto segue. • La prima invocazione di verifica restituisce true o false casualmente, generando il valore booleano tramite il metodo nextBoolean() della classe java.util.Random. Si intende che l’evento è accaduto se il valore restituito è true, e non è accaduto altrimenti. • Le successive invocazioni del metodo sollevano un’eccezione controllata di nome EventoException, che dovrete implementare, che ha come messaggio: “L’evento: [descrizione dell’evento] e’ gia’ avvenuto. Non si puo’ piu’ scommettere su questo evento.”. 2. Classe EventoQuotato. Una quota per un evento è un numero compreso fra 0 e 1, estremi inclusi. La classe EventoQuotato estende la classe Evento aggiungendole un attributo privato quota e il relativo metodo getQuota. La classe inoltre ha un unico costruttore di segnatura EventoQuotato(Evento) che assegna a quota un valore casuale compreso fra 0 e 1. Usate il metodo nextDouble() della classe java.util.Random. Infine, la classe ridefinisce il metodo toString ereditato da Evento in modo da restituire una stringa che descriva sia l’evento che la sua quota. 3. Classe Allibratore. Gli allibratori 1 sono le persone autorizzate alla riscossione di scommesse su eventi sportivi o di altra natura. Un allibratore stabilisce quote per ciascun evento per il quale accetta scommesse. Le quote hanno valori compresi fra 0 e 1 (estremi inclusi). Per semplicità assumeremo che l’allibratore accetti una sola scommessa per ogni dato evento, e che verifichi se un dato evento è accaduto o meno non appena accetta la scommessa su quell’evento. Lo scommettitore stabilisce la posta della scommessa, cioè quanto vuole scommettere sull’evento. La posta avrà un valore non negativo. L’interazione fra allibratore e scommettitore in questo esercizio avviene come segue. • L’allibratore fissa la quota q per l’evento. Per esempio q = 0.25 per l’evento “L’Italia segna nella partita contro la Francia”. • Lo scommettitore fissa la posta p per l’evento; per esempio p = 100.00 euro. • L’allibratore rifiuta di accettare scommesse con posta troppo alta. • Se l’allibratore accetta la scommessa, l’allibratore paga allo scommettitore p − p · q, se l’evento si è verificato; mentre riceve p · q dallo scommettitore, se l’evento non si è verificato. La classe deve soddisfare le specifiche seguenti. – Attributi, tutti privati: • MAXPOSTA : un valore costante per tutte le istanze che rappresenta la massima posta accettata dallo scommettitore. Definitelo pari a 1000. • String nome : il nome dell’allibratore. Date: 24 febbraio 2013. 1Il termine anglosassone bookmaker, usato anche in italiano, è la traduzione di allibratore. 1 2 LAB. PROG. 25.II.2013 • eventiquot : rappresenta l’elenco di eventi quotati sui quali l’allibratore accetta scommesse. Usate java.util.ArrayList. • saldo : rappresenta il saldo corrente dell’allibratore. Inizialmente è zero. – Metodi: • Costruttore : accetta in ingresso solo il nome dell’allibratore. • I metodi di accesso (get) opportuni. • boolean addEvento(Evento e) : aggiunge un evento quotato all’elenco degli eventi quotati. Il metodo genera l’istanza di evento quotato da aggiungere all’elenco usando l’evento e ricevuto dal chiamante. Il metodo restituisce true se l’aggiunta è andata a buon fine, e false altrimenti. (Suggerimento. Il valore booleano restituito dal metodo è lo stesso restituito dal metodo di ArrayList usato per aggiungere l’oggetto all’elenco.) • getEvento(int i): Restituisce l’i-esimo evento quotato nell’elenco eventiquot. • boolean accettaScommessa(int indice, double posta) : accetta una scommessa con posta posta sull’evento di indice i, e aggiorna il saldo dell’allibratore. Il metodo restituisce true se l’evento si è verificato, e quindi lo scommettitore ha vinto; restituisce false se l’evento non si è verificato, e quindi lo scommettitore ha perso. Il metodo solleva un’eccezione non controllata di tipo PostaNonAmmessaException (che dovrete definire) se la posta è negativa, o se la posta supera la massima posta accettata dall’allibratore. Passate all’eccezione messaggi appropriati nei due casi. (Suggerimento. Notate che il metodo addEvento può anche sollevare altre eccezioni; in particolare, può succedere che sollevi un’eccezione controllata durante la verifica dell’evento—cioè, quando appura se l’evento si è verificato o no—nel caso in cui l’evento si sia già verificato. Delegate questa eccezione.) • quotaMedia() : restituisce la media aritmetica delle quote degli eventi quotati in eventiquot. Se non vi sono eventi presenti, restituisce 0. • toString() : ridefinisce il metodo omonimo ereditato da Object. Restituisce una stringa con il nome dell’allibratore, l’elenco degli eventi e delle quote corrispondenti. 4. Classe Programma Scrivete una classe contenente il solo metodo main. All’avvio, il programma istanzia un oggetto di classe Allibratore, il cui nome è, per esempio, “Ada”. Poi il programma presenta all’utente un menu con 6 voci: 1. 2. 3. 4. 5. 6. Inserisci nuovo evento. Scommetti. Vedi il saldo dell’allibratore. Vedi eventi e quote. Visualizza quota media. Esci. L’opzione 6 termina il programma. L’opzione 1 permette all’utente di inserire un nuovo evento sul quale l’allibratore accetterà una scommessa. Il programma chiede all’utente di inserire una descrizione dell’evento (per esempio, “L’Italia segna contro la Francia”), e poi aggiunge l’evento all’elenco degli eventi di Ada.2 L’opzione 2 permette all’utente di scommettere su un evento. A tal fine, il programma chiede all’utente il numero dell’evento su cui l’utente intende scommettere; gli eventi inseriti tramite la voce 1 sono numerati a partire da 1. Il programma chiede poi la posta che l’utente intende scommettere sull’evento. A questo punto chiede ad Ada di accettare la scommessa, e informa l’utente del risultato (vincita o perdita).3 L’opzione 3 visualizza il saldo corrente di Ada. L’opzione 4 visualizza l’elenco degli eventi e delle quote di Ada. L’opzione 5 visualizza la media aritmetica delle quote degli eventi di Ada. Durante l’esecuzione del programma possono verificarsi numerosi errori. È parte integrante del tema d’esame la corretta gestione degli errori tramite le eccezioni definite nei due esercizi preedenti, e tramite altre eccezioni standard di Java. Si veda un esempio di esecuzione nelle Figg. 1 e 2. 2Non preoccupatevi di rilevare doppioni ecc. 3Non si richiede che il programma tenga traccia del saldo dell’utente. Il programma deve però visualizzare correttamente il saldo corrente di Ada al punto 3. LAB. PROG. 25.II.2013 3 5. Istruzioni per la consegna. File da • • • • • • consegnare (solo il codice sorgente): Evento.java EventoQuotato.java EventoException.java Allibratore.java PostaNonAmmessaException.java Programma.java Importante. Eseguire l’upload dei file all’indirizzo http://upload.di.unimi.it, autenticandosi per la sessione relativa al proprio turno: A (da A ad CA, A. Morpurgo), B (da FL a MA, V. Marra) o C (da CE a FI, A. Trentini). Per ritirarsi è necessario eseguire l’upload di un file di testo vuoto denominato ritirato. Figura 1. Esempio di esecuzione del main. 4 LAB. PROG. 25.II.2013 Figura 2. Esempio di esecuzione del main (seconda parte).