MenuCreator
Devi realizzare un’applicazione utile per redigere il menu di un ristorante. Un menu è costituito dall’elenco delle pietanze servite. Per ogni pietanza viene indicato il nome e il prezzo.
Per realizzare l’applicazione devi procedere in 2 fasi.
Food
Creare la classe Food
, che rappresenta il modello di pietanza. La classe Food
deve possedere due attributi privati utili per la memorizzazione del nome e del prezzo della pietanza (e i relativi metodi getter e setter). Il nome è costituito da una stringa (valore di default "NO NAME"
), mentre il prezzo è un numero reale a precisione doppia (valore di default 5.0
). Inoltre la classe deve esportare il costruttore vuoto e un costruttore personalizzato che permetta di inizializzare entrambi gli attributi della pietanza.
MenuCreator
Realizzare l’applicazione MenuCreator
. È una semplice applicazione che serve a generare il menu (la carta delle pietanze) di un ristorante. Quando viene eseguita, propone all’utente 2 possibilità: Aggiungi pietanza
e Esci
.
Scegliendo Aggiungi pietanza
, l’utente può aggiungere una pietanza fornendone il nome ed il prezzo. Il nome della pietanza non può essere vuoto o nullo e deve avere una lunghezza massima di 50 caratteri. Il prezzo fornito deve essere un numero positivo.
[1 Aggiungi pietanza | 2 Esci] Scelta: 1
Aggiungi pietanza
-----------------
Nome pietanza: Insalata verde
Prezzo pietanza: 6.50
Aggiunto Insalata verde, CHF 6.50
---------------------------~~ MENU ~~---------------------------
| Insalata verde CHF 6.50 |
----------------------------------------------------------------
[1 Aggiungi pietanza | 2 Esci] Scelta:
Se un valore fornito dall’utente non è accettabile, il programma stampa un messaggio e ripropone la richiesta come mostrato nell’esempio seguente:
[1 Aggiungi pietanza | 2 Esci] Scelta: 1
Aggiungi pietanza
-----------------
Nome pietanza: Specialità della casa con il nome trooooppo lunghissimo
Nome non valido Specialità della casa con il nome trooooppo lunghissimo
Nome pietanza: Sorbetto
Prezzo pietanza: -12
Prezzo non valido -12.0
Prezzo pietanza: 6
Aggiunto Sorbetto, CHF 6.00
---------------------------~~ MENU ~~---------------------------
| Insalata verde CHF 5.50 |
| Insalata mista CHF 6.50 |
| Spaghetti aglio olio e peperoncino CHF 9.00 |
| Spaghetti alla carbonara CHF 12.50 |
| Lasagne fatte in casa CHF 14.00 |
| Bistecca di manzo con contorno CHF 23.25 |
| Polenta e brasato CHF 22.00 |
| Torta della nonna CHF 6.40 |
| Gelato CHF 2.40 |
| Sorbetto CHF 6.00 |
----------------------------------------------------------------
[1 Aggiungi pietanza | 2 Esci] Scelta:
Dopo aver aggiunto una pietanza all’elenco il programma stampa un messaggio di conferma (es. Aggiunto Sorbetto, CHF 9.00
) e il menu formattato correttamente. Poi propone nuovamente la possibilità di aggiungere una pietanza o di terminare il programma.
Un costruttore di automobili desidera un applicativo utile per gestire la configurazione dei veicoli che produce.
Car
Devi innanzitutto creare una classe rappresenti un modello astratto di un automobile e tutti i suoi optional.
Le caratteristiche di un’auto sono le seguenti:
Devi quindi creare la classe Car
con gli attributi privati descritti in seguito e i relativi metodi getter e setter:
type
: intero che definisce il tipo di carrozzeria (1: CABRIO
, 2: PICKUP
)wheelsSize
: intero che definisce la dimensione delle ruote (1: SMALL_WHEELS
, 2: BIG_WHEELS
)hook
: booleano che definisce la presenza del gancio opzionale (true
: con gancio, false
: senza gancio)La classe deve esportare due costruttori:
public Car()
: instanzia una macchina con i valori di default (decappottabile, ruote piccole e senza gancio)public Car(int type, int wheelsSize, boolean hook)
: istanzia una macchina personalizzataInoltre deve esportare il metodo public void draw()
che stampa la rappresentazione grafica della macchina nei modo seguenti:
ruote ruote ruote ruote
piccole grandi piccole grandi
+ traino + traino
__ __ __ __
___|_\__ ___|_\__ ___|_\__ ___|_\__
Pickup -o----o- -O----O- J-o----o- J-O----O-
____\___ ____\___ ____\___ ____\___
Cabrio -o----o- -O----O- J-o----o- J-O----O-
CarConfigurator
Ora scrivi il programma interattivo CarConfigurator
che permette all’utente di configurare un autoveicolo da acquistare.
Il programma funziona nel modo seguente:
1
: Pickup, 2
: Cabriolet). Se l’utente introduce un valore non appropriato, stampa il messaggio "Scelta non valida <valore>"
e ricomincia dal punto 1.1
: piccole, 2
: grandi). Se l’utente introduce un valore non appropriato, stampa il messaggio "Scelta non valida <valore>"
e ricomincia dal punto 2.1
: si, 2
: no). Se l’utente introduce un valore non appropriato, stampa il messaggio "Scelta non valida <valore>"
e ricomincia dal punto 3.Esempio:
$ java CarConfigurator
Car configurator
Carrozzeria (1.Pickup, 2.Cabrio): moto
Scelta non valida moto
Carrozzeria (1.Pickup, 2.Cabrio): 2
Ruote (1.Piccole, 2.Grandi): rotonde
Scelta non valida rotonde
Ruote (1.Piccole, 2.Grandi): 3
Scelta non valida 3
Ruote (1.Piccole, 2.Grandi): 2
Gancio di traino (1.Si, 2.No): 1
____\___
J-O----O-
$
Scrivi la classe Rettangolo
che rappresenta il modello astratto di rettangolo. La classe deve possedere due attributi interi privati latoA
e latoB
utili per descrivere rispettivamente la dimensione orizzontale e verticale del rettangolo.
Dovrai implementare pure i metodi getter e setter per entrambi gli attributi latoA
e latoB
applicando la regola seguente:
latoA
e latoB
non possono mai essere pari a 0 o negativi.La classe deve esportare due metodi costruttori e i metodi di istanza:
Rettangolo
con le dimensioni di default (10 x 5)public Rettangolo(int latoA, int latoB)
che istanzia un rettangolo con le dimensioni fornite (se valide, altrimenti applica le dimensioni di default).public int getArea()
: ritorna l’area del rettangolopublic int getPerimetro()
: ritorna il perimetro del rettangolopublic void draw()
: disegna a terminale un rettangolo composto di asterischi, ad esempio per un rettangolo di 10 x 5 stampa:
**********
* *
* *
* *
**********
public String toString()
: ritorna una descrizione testuale del rettangolo, ad esempio per un rettangolo di 10 x 5 ritorna: "Rettangolo 10 x 5"
Quando hai terminato scrivi il metodo main
in cui dovrai istanziare 3 rettangoli di dimensioni differenti e verificare su ognuno il buon funzionamento dei metodi.
Scrivi il codice sorgente delle classi contenute nel diagramma seguente cercando di implemementare nel modo più fedele tutti i dettagli:
Record
e RankingManager
Record
La classe Record
è utilizzata per rappresentare i dati di un record nella classifica di un videogioco. La classe è molto semplice; possiede solo i due attributi privati name
(il nome del giocatore che ha fatto il record) e points
(i punti totalizzati). Entrambi gli attributi sono accessibili in sola lettura.
La classe Record
esporta pure il costruttore personalizzato che permette di inizializzare name
e points
(in questo ordine).
Inoltre Record
esporta e il metodo String toString()
che ne ritorna la rappresentazione testuale nel formato:
<name>: <points>
Esempio:
Luigi: 10000
RankingManager
Serve per caricare i record salvati in un file CSV e per trovare il giocatore con il punteggio più alto.
I record sono memorizzati nella lista di Record records
(attributo privato List<Record>
).
La classe RankingManager
esporta i seguenti metodi:
public RankingManager(Path csvPath)
Il costruttore personalizzato permette di definire il percorso del file CSV.
loadRanking
public void loadRanking()
Carica i dati dal file CSV. Se non è possibile accedere o leggere il file, solleva una IOException
. Le righe del file CSV che contengono dati non validi non vengono importate.
getRecords
public List<Record> getRecords
Ritorna la lista (records
) dei record caricati dal file CSV.
getWinner
public Record getWinner()
Ritorna il Record
con il punteggio più alto in records
. Se la lista è vuota ritorna null
.
Su ogni riga del file CSV deve essere registrato un record nel formato:
<name>,<points>
Dove:
<name>
: stringa non vuota, deve contenere almeno un carattere diverso da ‘ ‘ (blank)<points>
: numero interoTutte le righe che non rispettano questo formato sono considerate non valide e vengono ignorate dal metodo loadRanking
.
Ad esempio un file CSV valido potrebbe contenere i dati seguenti:
Mario,50
Alb,-200
Luigi,10000
Zorro,0
Pippo,400
Employee
e EmployeeManager
Employee
La classe Employee
è utilizzata per rappresentare i dati di un impiegato aziendale e il suo stipendio. La classe è molto semplice; possiede solo i due attributi privati name
(il nome dell’impiegato) e salary
(lo stipendio dell’impiegato [double
]). Entrambi gli attributi sono accessibili in sola lettura.
La classe Employee
esporta pure il costruttore personalizzato che permette di inizializzare name
e salary
(in questo ordine).
Inoltre Employee
esporta e il metodo boolean equals(Employee e)
che ritorna true
se i due impiegati confrontati posseggono lo stesso nome (ignora maiuscole e minuscole) e lo stesso stipendio.
EmployeeManager
Serve per caricare i dati riguardanti gli impiegati da un file CSV e per trovare la media degli stipendi.
I dati sono memorizzati nella lista di Employee employees
(attributo privato List<Employee>
).
La classe EmployeeManager
esporta i seguenti metodi:
public EmployeeManager(String csvPath)
Il costruttore personalizzato permette di definire il percorso del file CSV.
loadEmployees
public void loadEmployees()
Carica i dati dal file CSV. Se non è possibile accedere o leggere il file, solleva una IOException
. Le righe del file CSV che contengono dati non validi non vengono importate.
getEmployees
public List<Employee> getEmployees()
Ritorna la lista (employees
) degli impiegati.
getAverageSalary
public double getAverageSalary()
Ritorna lo stipendio medio (tra tutti quelli contenuti in employees
). Se la lista è vuota ritorna -1.0
.
Su ogni riga del file CSV deve essere registrato un impiegato nel formato:
<salary>;<name>
Dove:
<salary>
: numero double
<name>
: stringa non vuota, deve contenere almeno un carattere diverso da ' '
(blank)Tutte le righe che non rispettano questo formato sono considerate come non valide e vengono ignorate dal metodo loadEmployees
.
Ad esempio un file CSV valido potrebbe contenere i dati seguenti:
1250.5;Mario
200;Alb
1000.5;Luigi
8230.25;Zorro
400;Pippo
Per un app di gestione dei prestiti personali devi implementare le classi seguenti:
Person
Rappresenta una persona (creditore o debitore). Un oggetto Person
è caratterizzato da un nome costituito da una stringa contenente una lettera maiuscola seguita almeno 2 lettere minuscole (ad esempio "Alb"
) e memorizzato nell’attributo name
(read only). La classe Person
deve esportare:
Person(String name)
: è il costruttore, se il nome name
non è valido solleva una IllegalArgumentException
con il messaggio:
"Invalid name <name>"
String toString()
: ritorna la rappresentazione testuale contenente il nome della persona.
boolean equals(Person p)
: ritorna true
se la persona corrente possiede lo stesso nome della persona p
, false
altrimenti.
Inoltre deve contenere il metodo package private:
boolean isNameValid(String name)
: ritorna true
se name
è un nome di persona valido, false
altrimenti.Loan
Rappresenta una voce dell’elenco di prestiti contenuto in un Wallet
. Lo stato di un Loan
è caratterizzato da una persona (Person
, read only) e dal relativo bilancio (double amount
, read-write, default 10
). Un bilancio positivo rappresenta un credito, uno negativo un debito. Inoltre Loan
deve esportare i metodi seguenti:
Loan(Person person, double amount)
: costruttore, istanzia un Loan
associato alla persona person
con una somma definita da amount
. La somma deve essere diversa da 0
, in caso contrario viene applicato il valore di default.
Loan(Person person)
: costruttore, istanzia un Loan
associato alla persona person
con la somma di default.
String toString()
: ritorna la rappresentazione testuale del Loan
nel formato:
"<segno><amount> <name>" ad esempio `"+3.0 Alb"`.
Wallet
Rappresenta un portafoglio dei prestiti e deve esportare i metodi seguenti:
Wallet()
: costruttore, istanzia un portafoglio vuoto.
int indexOf(Person person)
: ritorna l’indice del Loan
associato alla persona person
nell’elenco loans
. Se non ne trova nessuno ritorna -1
.
void addLoan(Person person, double amount)
: se nel portafoglio non è già presente un Loan
associato a person
, aggiunge al portafoglio un nuovo Loan
. In caso contrario ne aggiorna il bilancio. Se il bilancio aggiornato è pari a 0
, il Loan
viene rimosso dal portafogli.
String toString()
: ritorna una stringa contenente l’elenco di Loan
presenti nel portafoglio secondo il formato illustrato nell’esempio seguente:
+2.0 Alb
-1.0 Mike
Inoltre deve contenere il metodo package private:
void removeLoan(int index)
: rimuove dal portafoglio il Loan
all’indice index
.Per un sistema di acquisti online devi implementare le classi seguenti:
Article
Rappresenta un articolo in vendita nel negozio. Un Article
è caratterizzato da un codice di prodotto costituito da una stringa contenente una lettera maiuscola seguita da 4 cifre (ad esempio "A1234"
) e memorizzato nell’attributo code
(read only). La classe Article
deve esportare:
Article(String code)
: è il costruttore, se il codice code
non è valido solleva una IllegalArgumentException
con il messaggio:
"Invalid article code <code>"
String toString()
: ritorna la rappresentazione testuale dell’articolo nel formato:
"Article code <code>"
boolean equals(Article a)
: ritorna true
se l’articolo corrente possiede lo stesso codice dell’articolo a
, false
altrimenti.
Inoltre deve contenere il metodo package private:
boolean isCodeValid(String code)
: ritorna true
se code
è un codice di articolo valido, false
altrimenti.Item
Rappresenta una voce dell’elenco contenuto in un ShoppingCart
. Lo stato di un Item
è caratterizzato da un articolo (Article
, read only) e dalla relativa quantità (int quantity
, read-write, valore minimo 1
, default 1
). Inoltre deve esportare i metodi seguenti:
Item(int quantity, Article article)
: costruttore, istanzia un Item
associato all’articolo article
nella quantità definita da quantity
. La quantità deve essere superiore a 0
, in caso contrario viene applicato il valore di default.
Item(Article article)
: costruttore, istanzia un Item
associato all’articolo article
nella quantità di default.
String toString()
: ritorna la rappresentazione testuale del Item
nel formato:
"Article code <code> (<quantity>)" ad esempio `"Article code A1234 (2)"`.
ShoppingCart
Rappresenta un carrello degli acquisti e deve esportare i metodi seguenti:
ShoppingCart()
: costruttore, istanzia un carrello vuoto.
int indexOf(Article article)
: ritorna l’indice del Item
associato all’articolo article
nell’elenco items
. Se non ne trova nessuno ritorna -1
.
void addArticle(Article article)
: se nel carrello è già presente un Item
associato all’articolo article
, ne incrementa la quantità. In caso contrario aggiunge al carrello un nuovo Item
associato all’articolo article
.
void removeArticle(Article article)
: se nel carrello è presente un Item
associato all’articolo article
, ne decrementa la quantità. Se la quantità decrementata è pari a 0
, l’Item
viene rimosso dal carrello.
String toString()
: ritorna una stringa contenente l’elenco di Item
presenti nel carrello secondo il formato illustrato nell’esempio seguente:
- Article code A1234 (2)
- Article code B7254 (1)