Classi

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.

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.

Parte 1: 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:

  • tipo di carrozzeria: può essere una decappottabile o un pick-up
  • dimensione delle ruote: può avere ruote piccole o grandi
  • gancio di traino: può avere un gancio di traino opzionale

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 personalizzata

Inoltre 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-

Parte 2: CarConfigurator

Ora scrivi il programma interattivo CarConfigurator che permette all’utente di configurare un autoveicolo da acquistare.

Il programma funziona nel modo seguente:

  1. Chiede di scegliere il tipo di carrozzeria (1: Pickup, 2: Cabriolet). Se l’utente introduce un valore non appropriato, stampa il messaggio "Scelta non valida <valore>" e ricomincia dal punto 1.
  2. Chiede di scegliere il tipo di ruote (1: piccole, 2: grandi). Se l’utente introduce un valore non appropriato, stampa il messaggio "Scelta non valida <valore>" e ricomincia dal punto 2.
  3. Chiede se si desidera il gancio di traino opzionale (1: si, 2: no). Se l’utente introduce un valore non appropriato, stampa il messaggio "Scelta non valida <valore>" e ricomincia dal punto 3.
  4. Stampa il disegno del veicolo configurato e termina.

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-
$

Rettangolo class Livello 13

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:

  • il costruttore vuoto che istanzia un Rettangolo con le dimensioni di default (10 x 5)
  • un costruttore personalizzato 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 rettangolo
  • public int getPerimetro(): ritorna il perimetro del rettangolo
  • public 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.

Robot class Livello 14

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:

Costruttore

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.

Formato del file CSV

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 intero

Tutte 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:

Costruttore

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.

Formato del file CSV

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

Wallet class array Livello 15

Per un app di gestione dei prestiti personali devi implementare le classi seguenti:

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

Classe 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"`.
    

Classe 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:

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

Classe 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)"`.
    

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