edutecnica

Esercizio 4        

Scrivi un programma che sia in grado di istanziare degli oggetti 'distributori di benzina' di cui sia nota la città, il proprietario, la capacità e la benzina attualmente contenuta nel distributore. Dell'oggetto Distributore, deve essere possibile simulare le operazioni di erogazione del carburante e dei corrispondenti incassi. Implementa una interfaccia Comparable, in modo da consentire il confronto tra 2 distributori in base alla capacità del serbatoio di carburante.


In questo caso si può scegliere di istanziare gli oggetti tramite un ArrayList T. Questo ci permette di gestire quanti oggetti di tipo Distributore vogliamo.

Nel momento in cui viene istanziato un oggetto di tipo Distributore, viene automaticamente istanziato un altro oggetto di p tipo Pompa; in questo sotto-oggetto verranno gestite le operazioni di carico e scarico del carburante.

Gli attributi dell'oggetto p della classe Pompa saranno accessibili all'oggetto distributore tramite la chiamata:

this.p.attributoClassePompa

Inizialmente nell'ArrayList vengono collocati tre oggetti di tipo Distributore: pa(perino),pi(ppo) e to(polino) . L’unica complicazione è che quando chiamo i metodi della classe distributore tramite l’ArrayList devo usare una notazione del tipo:

(Distributore)T.get(i)).getProprietario()

Cioè, praticamente devo fare una conversione di cast fra un oggetto ArrayList e un oggetto Distributore. Il vantaggio è (appunto) che posso istanziare quanti distributori voglio.

import java.util.Scanner;
import java.util.ArrayList;
public class benzine {
public static void main(String[] args) {
Scanner tastiera=new Scanner(System.in);
ArrayList T=new ArrayList(3);
T.add(new Distributore("Paperopoli","Paperino",200));
T.add(new Distributore("Paperopoli","Pippo",300));
T.add(new Distributore("Topolinea","Topolino",100));

int i,ch=0,scelta,var,scelta2=0;

System.out.println("Seleziona il distributore");
for(i=0;i < T.size();i++)
   System.out.println(i+"]"+((Distributore)T.get(i)).getProprietario());
ch=tastiera.nextInt();
if(ch < 0 || ch>=T.size())ch=0;
//paperino è distributore di default

System.out.println();
while(scelta2!=1){
System.out.printf("1)Rifornimento
\n2)Rifornimento Pompa
\n3)Calcolo incasso giornaliero
\n4)Comparazione");

System.out.printf("\n\nInserisci la tua scelta: ");
scelta=tastiera.nextInt();
switch(scelta){
case 1:
System.out.printf("Ins.num.litri da prelevare ,capacita: "+
((Distributore)T.get(ch)).litri()+" litri: ");
var=((Distributore)T.get(ch)).rifornisci(tastiera.nextInt());
System.out.printf("Sono stati spesi: "+var+"\n");
((Distributore)T.get(ch)).setIncasso(var);
System.out.printf("Vuoi continuare?
\nDigita 0 per confermare oppure 1 per negare: ");
scelta2=tastiera.nextInt();
break;
case 2:
System.out.printf("La pompa contiene "+((Distributore)T.get(ch)).litri()+
"\nInserisci la quantita di litri da inserire: ");
((Distributore)T.get(ch)).aggiungi(tastiera.nextInt());
System.out.printf(
"Vuoi continuare?\nDigita 0 per confermare oppure 1 per negare: ");
scelta2=tastiera.nextInt();
break;
case 3: System.out.printf("L'incasso totale di oggi:"+((Distributore)T.get(ch)).Incassog());
System.out.printf("Vuoi continuare?\nDigita 0 per confermare oppure 1 per negare: ");
scelta2=tastiera.nextInt();
break;
case 4:
Distributore Dch=(Distributore)T.get(ch);
for(i=0;i < T.size();i++){
if(i!=ch){
   Distributore Di=(Distributore)T.get(i);
   if(Dch.compareTo(Di)>0)System.out.println(Dch.getProprietario()+ " ha più benzina di "+Di.getProprietario());
   else System.out.println(Dch.getProprietario()+ " ha meno benzina di "+Di.getProprietario());
}// fine if
} //fine for
break;
} //fine switch
}//fine while
} //fine main
}//fine classe benzine

interface Comparable{
   int compareTo(Distributore h);
}//fine interfaccia

class Distributore implements Comparable{
   private String citta,proprietario;
   private Pompa p;
   private int costo_litro=1,costo_vendita=2,incasso=0,spesa,ricavo;
   public Distributore(String c,String m,int num){
   citta=c;
   proprietario=m;
   p=new Pompa(num);
}
public int compareTo(Distributore h){
   return (this.p.capacita_serb - h.p.capacita_serb);
}
public String getCitta() { return citta; }
public void setCitta(String citta) { this.citta = citta; }
public String getProprietario(){return proprietario;}
public void setproprietario(String proprietario){
   this.proprietario = proprietario;
}
public int getIncasso() { return incasso; }
public void setIncasso(int incasso) { this.incasso = incasso; }
public int rifornisci(int num){
int tmp;
if(num < p.getcapacita_serb()){
   tmp=p.getcapacita_serb(); tmp=tmp-num; p.setcapacita_serb(tmp); return costo_vendita*num; }
   else{ int var=costo_vendita*p.getCarb_cont();
   System.out.printf("richiesta non disponibile,verranno erogati "+p.getCarb_cont()+" litri");
   p.setcapacita_serb(0);
return var;
}
}

public int litri(){ // Litri rimasti nella pompa
   return p.getcapacita_serb();
}

public void aggiungi(int num){
   spesa=num*costo_litro; p.aggiungic(num);
}
public int Incassog(){// Incasso giornaliero
   ricavo=incasso-spesa;
   return ricavo;
}
}//fine classe Distributore

class Pompa {
private int tipop,carb_cont;
protected int capacita_serb;

public Pompa(int num){
this.capacita_serb=num;
}
public int gettipop() { return tipop; }
public void settipop(int tipop) {
this.tipop = tipop;
}
public int getCarb_cont() {
return carb_cont;
}
public void setCarb_cont(int carb_cont) {
this.carb_cont = carb_cont;
}
public int getcapacita_serb(){
return capacita_serb;
}
public void setcapacita_serb(int capacita_serb){
this.capacita_serb = capacita_serb;
}
public void aggiungic(int c){// aggiunge il carburante carb_cont=carb_cont+c;
}
} //fine classe Pompa

Come si nota, è stato aggiunto il metodo compareTo riferibile alla interfaccia Comparable che compara la capacità complessiva del serbatoio di stoccaggio del distributore selezionato con quella degli altri. Attenzione! Il confronto avviene sul volume complessivo del serbatoio non sul volume della benzina che è contenuta in esso, Se si volesse eseguire la comparazione basandosi sul volume del carburante contenuto attualmente nel serbatoio bisognerebbe far riferimento all’attributo carb_cont e non a capacita_serb.
In ogni caso tale attributo dovrà avere modificatore protected per essere accessibile dalla classe Distributore. Per definizione, la chiamata:
int compareTo(Distributore h)
può funzionare solamente fra due due oggetti della stessa classe Distributore.