edutecnica

Esercizio 7                     

Scrivi un programma in grado di gestire le ordinazioni ai tavoli di un ristorante. Nel ristorante possono essere disposti dei tavoli, ciascuno qualificato da un id numerico e da un numero di coperti.
Per ciascun tavolo devono essere memorizzate le bevande ed i piatti consumati, in automatico deve poter essere calcolato il conto da pagare.
I piatti e le bevande disponibili, sono invece memorizzati in una classe 'Menu' che li suddivide in due categorie (piatti e bevande, appunto).
Ogni piatto o bevanda deve essere qualificato da un identificatore univoco alfanumerico (nome) e dal suo prezzo.


Ogni piatto o bevanda è dunque qualificato da un nome e da un costo; viene dunque predisposta la classe E (elemento generico) negli oggetti istanziati della quale possono essere memorizzate indifferentemente dei piatti o delle bibite.

class E {
private String nome; private int prezzo;
E(String id,int prz){nome=id;prezzo=prz;}//costruttore
public String getNom() {return nome;}
public int getPrz() {return prezzo;}
}

La classe è dotata dei metodi 'get' per la restituzione dei valori mentre l'ingresso dei valori viene fatto al momento dell'istanziazione, tramite il costruttore.
Un'operazione più impegnativa è la costruzione di un menu consultabile. La classe Menu è dotata di due attributi.


private E Piatti[];
private E Bevande[];

Si tratta di due vettori di oggetti della classe E, uno che contiene i piatti a l'altro le bevande disponibili del menu. I due metodi pubblici

void mostraP()
void mostraB()

non fanno altro che stampare a video i due vettori. Ulteriori due metodi pubblici:

E getP(int j) {return Piatti[j];}
E getB(int j) {return Bevande[j];

restituiscono l'elemento j-esimo di ciascun vettore.
Si noterà come sia il costruttore stesso a inserire i dati nel menu al momento della istanziazione di un oggetto della classe Menu .


La classe Tavolo deve memorizzare l'identificativo numerico dello stesso, il numero dei coperti, la lista delle vivande consumata e il saldo totale, attraverso gli attributi.

private int id,nCoperti,saldo;
private ArrayList lista;


il costruttore.

Tavolo(int i,int nCop)

si occupa solo di dare un id e un numero di coperti al tavolo stesso appena creato; la lista dei piatti ordinata è vuota. Per essa è previsto l'uso di un ArrayList, perché a priori non sono note quante portate si mangeranno i clienti. Il metodo

void ins(E e)

inserisce un elemento della lista indipendentemente dal fatto che si tratti di un piatto o di una bibita. Ovviamente è presente un metodo

private int calcolaSaldo()

per calcolare il tempo reale il conto.
Un metodo String toString() si occuperà di stampare tutti i dati pertinenti ad un tavolo.
Per ridurre il numero complessivo di righe noi eseguiamo il programma considerando un solo tavolo istanziato dall'istruzione:

Tavolo t1 = new Tavolo(1,3);

un ciclo do-while si occupa poi di aggiungere alla lista delle vivande ordinate al tavolo i vali piatti o bevande selezionate dal menu. .



import java.util.Scanner;
import java.util.ArrayList;
class Ristorante{ public static void main (String args []) {
int j,pre=0;
char ch;
String nome="";
Tavolo t1 = new Tavolo(1,3);
Menu menu=new Menu();
//-------------------------------------
do{
   System.out.print("Bevanda, Piatto o eXit (p/b/x)?:");
   Scanner q=new Scanner(System.in);
   ch=q.nextLine().charAt(0);
   if(ch=='p')menu.mostraP();
   else if(ch=='b')menu.mostraB();
   else break;
   System.out.print("ins.index:");
   j=q.nextInt();
   if(ch=='p'||ch=='b'){
   if(ch=='p'){
      nome=menu.getP(j).getNom();
      pre=menu.getP(j).getPrz();
   } else {
      nome=menu.getB(j).getNom();pre=menu.getB(j).getPrz();}
   E e=new E(nome,pre);
   t1.ins(e);
}
}while(ch!='x');
//-------------------------------------
System.out.println(t1);
}//fine main
}// fine classe Ristorante

class Tavolo {
private int id,nCoperti,saldo;
private ArrayList lista;
Tavolo(int i,int nCop){//costruttore
id=i;nCoperti=nCop; saldo=0;
ArrayList l=new ArrayList(0); lista=l; }//fine costruttore
public void ins(E e){
if (e.getPrz()!=0)lista.add(e);
}//fine ins
private int calcolaSaldo(){
int tot=0;
for(int i=0;i < lista.size();i++)tot+=((E)lista.get(i)).getPrz();
return tot;
}
public int getId() {return id;}
public int getNcop() {return nCoperti;}
public int getSaldo() {
saldo=calcolaSaldo();
return saldo;
}
public String getLista() {
String s="\n";
for(int i=0;i < lista.size();i++){
   s+=((E)lista.get(i)).getNom();
   s+="-"+((E)lista.get(i)).getPrz()+"\n";
} return s;
}
public String toString(){
return getId() + ":"+getNcop() + ":"+ getLista()+"\nsaldo:"+getSaldo();
}
}//fine classe Tavolo
//----------------------------------------------
class E {
private String nome;
private int prezzo;
E(String id,int prz){ //costruttore
nome=id; prezzo=prz;
}//fine costruttore
public String getNom() {return nome;}
public int getPrz() {return prezzo;}
}//fine classe E (elemento generico)
//-------------------------------------------------
class Menu {
private E Piatti[];
private E Bevande[];
Menu(){//costruttore
E p1=new E("spaghetti",4);
E p2=new E("pizza",3);
E p3=new E("verdura",2);
E p4=new E("pesce",5);
E p5=new E("carne",2);
E p[]={p1,p2,p3,p4,p5};
Piatti=p;
E b1=new E("acqua",1);
E b2=new E("vino",3);
E b3=new E("birra",2);
E b[]={b1,b2,b3};
Bevande=b;
}//fine costruttore
public E getP(int j) {return Piatti[j];}
public E getB(int j) {return Bevande[j];}
public void mostraP() {
for(int i=0;i < Piatti.length;i++)
   System.out.println(i+"."+Piatti[i].getNom());
}
public void mostraB(){
for(int i=0;i < Bevande.length;i++)
    System.out.println(i+"."+Bevande[i].getNom());
}
}//fine menu