LABORATORIO DI PROGRAMMAZIONE EDIZIONE - SL-Lab

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).