distributore carburante
Transcript
distributore carburante
Si vuole simulare il funzionamento di un distributore di carburante per automobili che
prevede di rifornire sia benzina che gasolio.
Il distributore ha due depositi della capacità massima di 10000 litri nei quali conserva la
benzina ed il gasolio da vendere; il prezzo dei due carburanti è diverso e può cambiare nel
tempo, quindi deve essere modificabile.
Il distributore deve poter vendere carburante (sia una certa quantità in euro o in litri che
fare il pieno al serbatoio di un’automobile), rifornire i suoi contenitori e modificare il prezzo
di vendita.
A tale scopo bisogna progettare una classe Distributore, che visto che sappiamo che esiste
una classe Automobile, prevediamo la utilizzerà per le sue funzioni.
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
1
Classe Distributore:
Prevede i seguenti attributi:
depositoB e depositoG, di tipo double, che rappresentano il quantitativo di benzina
disponibile al distributore per i due carburanti.
euroPerLitroB ed euroPerLitroG, di tipo double, che rappresentano il prezzo della
benzina e del gasolio, espressi in euro per litro.
e i seguenti metodi
Distributore(): costruttore senza parametri che crea un distributore vuoto con il prezzo
di entrambi i carburanti nullo.
Distributore(prezzoB, prezzoG): costruttore con i prezzi del carburante - La quantita'
iniziale di carburante disponibile e' zero.
rifornisci(double unaQuantita, String tipo) - che rifornisce il distributore di una
quantità del carburante del tipo specificato. Se il contenitore ha spazio per il nuovo
quantitativo aggiorna il livello del carburante altrimenti segnala quanti litri al massimo di
può aggiungere
vendi(double litri, Automobile au) - si aspetta i litri da mettere nell’automobile che gli
viene passata: deve verificare di avere sufficiente carburante del tipo usato dalla macchina
da
erogare,
utilizza
il
metodo
dell’automobile
per
il
rifornimento
(automobile.addCarb(litri) ) se tutto ok sottrae i litri dal contenitore.
vendi(Automobile au) – deve fare il pieno di carburante del tipo utilizzato dalla
macchina, e restituisce i litri erogati : usando i metodi di automobile ricava il tipo
carburante e quanti litri servono per il pieno, verifica la disponibilità nel suo contenitore,
utilizza il metodo della classe automobile faiPieno() e se tutto è ok aggiorna
aggiornaPr(unPrezzoPerLitro, tipo) - che aggiorna il prezzo del carburante.
Classe TestaDistributore:
main() = deve chiedere i dati all’esecutore dei test (quale tipo di distributore vuole
utilizzare:
qualunque
→ usa il primo costruttore
scegliendo il prezzo del carburante
→ usa il secondo costruttore
Deve inoltre gestire in un ciclo che termina a richiesta dell’utentele funzionalità richieste e
precisamente:
• rifornire il distributore – chiede tipo di carburante e litri da versare.
• mettere carburante ad un’automobile – si deve prima di tutto simulare l’arrivo
casuale di una macchina al distributore creando un oggetto di tipo automobile con i
valori dei suoi attributi generati in modo casuale : la capacità è un numero casuale
tra 20 e 50, il suo consumo un numero casuale tra 20 e 26, il tipo di carburante
gasolio se la variabile booleana casuale creata è true, benzina in caso contrario.
L’automobilista può decidere di acquistare un certo numero di litri o di euro di
carburante, o di fare il pieno. In base al prezzo del carburante trova a quanti litri
corrisponde l’importo richiesto, e poi sfrutta il metodo vendi(litri, automobile) del
distributore o vendi(automobile) se la richiesta è il pieno: se il riempimento va a
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
2
•
buon fine , si dà il messaggio di rifornimento eseguito con il numero di litri inseriti o
il costo.
Aggiornare i prezzi del distributore – si chiede tipo carburante e nuovo prezzo, e si
chiama il metodo del distributore
Classe Automobile:
Automobile(): costruttore senza parametri che crea un’automobile a benzina con un
serbatoio di 43 litri e un consumo di 23 km con un litro.
Automobile (carburante) : costruttore con il tipo di carburante come parametro e che
imposta un serbatoio di 45 litri ed un consumo di 24 km con un litro
Automobile(carburante, serb, cons): costruttore che ha come parametri tutti tre gli
attributi della classe
guida(nKm) : il metodo riceve in input il numero di km da percorrere, calcola quanto
carburante è necessario:
se c’è abbastanza carburante toglie i litri consumati dal serbatoio
se non c’è abbastanza carburante restituisce una stringa che informa che non c’è
abbastanza carburante e quanto ne manca per poter percorrere il tragitto richiesto
getLivello() = restituisce la quantità di carburante contenuta nel serbatoio
addCarb(litri) = il metodo riceve in input il numero di litri di carburante da aggiungere:
se ci stanno li aggiunge al livello del serbatoio
se non ci stanno restituisce una stringa con la segnalazione di quanti litri si oossono
inserire
faiPieno() = il metodo calcola quanti litri si possono inserire nel serbatoio, li aggiunge al
livello e li restituisce in output
daiPieno() = restituisce quanti litri si possono aggiungere al serbatoio
isDiesel() = il metodo restituisce true se la macchina va a gasolio, false se va a benzina
Dopo aver scritto il codice, pevedere un elenco di test da eseguire per verificare la
funzionalità del programma
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
3
package automobile;
public class Automobile {
int consumo;
String tipoCarb;
double quSerb, capacita;
public Automobile(){
consumo=23;
tipoCarb="benzina";
capacita=43;
quSerb=0;
}
public Automobile(String tc){
consumo=24;
tipoCarb=tc;
capacita=45;
quSerb=0;
}
public Automobile(String tc, double serb, int con){
consumo=con;
tipoCarb=tc;
capacita=serb;
quSerb=0;
}
public String guida(double km){
String ret="";
double litri=0;
litri=km / consumo;
if (litri<quSerb)
{
quSerb=quSerb - litri;
} else
{
ret="non c'è abbastanza carburante per il percorso richiesto, mancano " +
(litri - quSerb) + " litri";
}
return ret;
}
public double getLivello(){
return quSerb;
}
public double getCapacita(){
return capacita;
}
public String getTipoCarb(){
return tipoCarb;
}
public String addCarb(double lit){
String ret="";
if (lit <= (capacita - quSerb))
{
quSerb = quSerb + lit;
} else
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
4
{
ret = "ci stanno solo " + (capacita - quSerb) + " litri";
}
return ret;
}
public double daiPieno() {
double qua= capacita - quSerb;
return qua;
}
public double
double
quSerb
return
faiPieno() {
qua= capacita - quSerb;
= quSerb + qua;
qua;
}
public boolean isDiesel(){
boolean ret = false;
if (tipoCarb.equals("gasolio"))
{
ret = true;
}
return ret;
}
}
package automobile;
public class Distributore {
double depositoB, depositoG, euroPerLitroB, euroPerLitroG;
public Distributore(){
depositoB=0;
depositoG=0;
euroPerLitroB=0;
euroPerLitroG=0;
}
public Distributore(double be, double ga){
depositoB=0;
depositoG=0;
euroPerLitroB=be;
euroPerLitroG=ga;
}
public String rifornisci(double qu, String tipo){
String ret="";
if (tipo.equalsIgnoreCase("benzina"))
{
if (qu < (10000 - depositoB))
{
depositoB = depositoB + qu;
ret=" livello " + tipo + " = " + depositoB + " litri";
} else
{
ret=" ci stanno solo " +(10000 - depositoB) + " litri";
}
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
5
}
if (tipo.equalsIgnoreCase("gasolio"))
{
if (qu < (10000 - depositoG))
{
depositoG = depositoG + qu;
ret=" livello " + tipo + " = " + depositoG + " litri";
} else
{
ret=" ci stanno solo " +(10000 - depositoG) + " litri";
}
}
return ret;
}
public String vendi(double lit, Automobile au ){
System.out.println(au.getTipoCarb());
String ret="";
if (au.isDiesel() )
{
if (depositoG < lit)
{
ret="il serbatoio del distributore non ha abbastanza
carburante";
}
} else
{
if (depositoB < lit)
{
ret="il serbatoio del distributore non ha abbastanza
carburante";
}
}
if (ret.equals(""))
{
ret = au.addCarb(lit);
if (ret.equals(""))
//* ret contiene eventuali messaggi di errore, quindi ha fatto carburante solo se
ret=""
{
if (au.isDiesel())
{
depositoG = depositoG - lit;
} else
{
depositoB = depositoB - lit;
}
System.out.println("ho aggiunto " + lit + " " +
au.getTipoCarb());
}
}
return ret;
}
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
6
public String vendi( Automobile au ){
String ret="";
double ql = au.daiPieno();
if (au.isDiesel() )
{
if (depositoG < ql)
{
ret="il serbatoio del distributore non ha abbastanza
carburante";
}
} else
{
if (depositoB < ql)
{
ret="il serbatoio del distributore non ha abbastanza
carburante";
}
}
if (ret.equals(""))
{
ql = au.faiPieno();
if (au.isDiesel())
{
depositoG = depositoG - ql;
} else
{
depositoB = depositoB - ql;
}
}
return ret;
}
public void aggiornaPr( double imp, String tipo ){
if (tipo.equalsIgnoreCase("benzina"))
{
euroPerLitroB = imp;
} else
{
euroPerLitroG = imp;
}
}
}
package distributore;
import java.util.*;
import automobile.Automobile;
public class TestaDistributore {
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
7
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner leggi = new Scanner(System.in);
Automobile auto = null;
Distributore distr = null;
int scelta=0, cons;
double capa;
String lett;
do
{
System.out.println("scegli il tipo di distributore che vuoi
testare");
System.out.println("1 qualunque");
System.out.println("2 scegliendo il prezzo dei carburanti");
scelta = Integer.parseInt(leggi.nextLine());
if ((scelta > 2 ) && (scelta < 1))
{
System.out.println("scelta non prevista");
}
} while ((scelta > 2 ) && (scelta < 1));
switch (scelta)
{
case 1:
distr = new Distributore();
break;
case 2:
System.out.println("digita
il
prezzo della benzina:");
double
impB
=
Double.parseDouble(leggi.nextLine());
System.out.println("digita
il
prezzo del gasolio:");
double
impG
=
Double.parseDouble(leggi.nextLine());
distr
=
new
Distributore(impB,
impG);
break;
}
String cosa="", ret;
do
{
System.out.println("scegli cosa far fare al distributore");
System.out.println("
r
riempire un
contenitore del
distributore");
System.out.println(" c
mettere un po' di carburante ad
un'automobile");
System.out.println(" p
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
fare il pieno ad un cliente");
8
System.out.println("
a
aggiornare
il
prezzo
del
carburante");
System.out.println(" u uscita programma");
cosa = leggi.nextLine();
if
(!cosa.equalsIgnoreCase("r")
&&
cosa.equalsIgnoreCase("c") &&
!cosa.equalsIgnoreCase("p")
&&
cosa.equalsIgnoreCase("a") && !cosa.equalsIgnoreCase("u") )
{
System.out.println("scelta non prevista");
}
if (cosa.equalsIgnoreCase("r")){
System.out.println("digita tipo carburante");
String car = leggi.nextLine();
System.out.println("digita
litri
carburante
aggiungere ");
double ql = Double.parseDouble(leggi.nextLine());
ret = distr.rifornisci(ql, car);
!
!
da
System.out.println("fatto rifornimento" + ret);
}
if (cosa.equalsIgnoreCase("a")){
System.out.println("digita tipo carburante");
String car = leggi.nextLine();
System.out.println("digita prezzo carburante ");
double ql = Double.parseDouble(leggi.nextLine());
distr.aggiornaPr(ql, car);
}
if (cosa.equalsIgnoreCase("c")){
String sc="";
Automobile au = creaAuto();
do
{
System.out.println("vuoi
far
rifornimento
scegliendo litri o importo?");
System.out.println("l per litri");
System.out.println("e per euro");
sc = leggi.nextLine();
if
(!sc.equalsIgnoreCase("l")
&&
!
sc.equalsIgnoreCase("e"))
{
System.out.println("scelta
non
consentita");
}
}
while
(!sc.equalsIgnoreCase("l")
&&
!
sc.equalsIgnoreCase("e"));
double ql;
if (sc.equalsIgnoreCase("l"))
{
System.out.println("digita i litri
che si vuole acquistare");
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
9
ql
=
Double.parseDouble(leggi.nextLine());
} else
{
System.out.println("digita gli euro
di carburante che si vuole acquistare");
double
qe
=
Double.parseDouble(leggi.nextLine());
if (au.isDiesel())
{
ql
=
qe
/
qe
/
distr.euroPerLitroG;
} else
{
ql
=
distr.euroPerLitroB;
}
System.out.println("si tratta di "
+ ql + "litri di carburante");
}
System.out.println(distr.vendi(ql,
au));
System.out.println("auto dopo " +
au.getTipoCarb() + " livello " + au.getLivello() + " capacita " + au.getCapacita());
}
if (cosa.equalsIgnoreCase("p")){
//* fare il pieno a un cliente: generare una automoble casuale e procedere
Automobile au = creaAuto();
System.out.println(distr.vendi( au));
System.out.println("auto dopo " + au.getTipoCarb() + "
livello " + au.getLivello() + " capacita " + au.getCapacita());
}
System.out.println("distributore ha " + distr.depositoB +" litri
di benzina e " + distr.depositoG + " litri di gasolio");
} while (!cosa.equalsIgnoreCase("u"));
}
public static Automobile creaAuto(){
//* il metodo crea in modo casuale un'automobile con 5 litri di carburante nel
serbatoio la cui capacità è
//* creata in modo casuale cin la classe Random tra 20 e 50, ed il suo consumo tra 20 e
26 km con un litro.
//* la generazione casuale di una variabile booleana decide se gasolio (true) o benzina
(false)
Random rand = new Random();
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
10
//* crea un intero casuale tra 20 e 50: la classe lo crea tra 0 30, quindi
aggiungendovi 20 ottengo il risultato
int capa = rand.nextInt(30) + 20;
int qu = rand.nextInt(6) + 20;
String tp;
boolean bo = rand.nextBoolean();
if (bo)
{tp="gasolio"; }
else
{ tp = "benzina";}
Automobile auu = new Automobile(tp, capa, qu);
auu.addCarb(5);
System.out.println("auto " + auu.getTipoCarb() + " livello " +
auu.getLivello() + " capacita " + auu.getCapacita());
return auu;
}
}
Fondazione ITS A. Volta – linguaggi – Flavia Lollis
11