Esercizio 5
Si realizzi una applicazione java per la gestione di un garage secondo le specifiche:
il garage ha al max 15 posti ognuno dei quali è identificato da un num a partire da 0
e per motivi di capienza può ospitare solo auto moto e furgoni partendo dalla classe base veicolo a motore V; la si estenda, realizzando anche le classi che modellano le entità furgone (F) auto (A) e moto (M).
Ridefinire il metodo toString in modo che ogni entità possa esternalizzare in forma di stringa tutte le informazioni che la riguardano.
Si implementi una classe che modelli il garage sopradescritto offrendo le seguenti operazioni di gestione
1] immissione di un nuovo veicolo
2] estrazione dal garage del veicolo che occupa un determinato posto (ritornare l'istanza del veicolo stesso)
3] stampa della situazione corrente dei posti nel garage veicolo:
marca,anno,cilindrata;
auto:porte, alimentazione (diesel/benzina)
moto:tempi
furgone:capacità
Secondo le specifiche indicate, deve
essere gestito un garage che ha al massimo 15 posti, ciascuno dotato di
un identificatore numerico id, della marca del veicolo, dell'anno di fabbricazione
e della cilindrata.
Questi, però, sono soltanto gli attributi comuni a i veicoli che possono
essere ospitati.
I veicoli possono essere di tre tipi:auto [A] furgone
[F] e moto [M].
Per le auto devono essere qualificati oltre agli attributi suddetti, il
numero di porte(3/5) e l'alimentazione (diesel/benzina). Per le moto i tempi
(2/4) e per i furgoni il carico.
Le entità presenti:furgone [F] auto [A]
e moto ([M] vengono derivate da una unica superclasse
veicolo [V] che raccoglie gli attributi comuni cioè:
int id (identificatore del numero di posto)
String marca (azienda produttrice)
int anno (anno di fabbricazione)
int cyl (cilindrata)
Nel main() viene realizzato un vettore T[]
di oggetti di classe veicolo V.
V T[ ] = new V[max];
la dimensione massima del vettore viene preventivamente memorizzata come
costante:
final static int max=15;
Per l'inserimento dei veicoli nella struttura, viene
usato un ciclo do-while indicizzato sulla variabile intera j
che oltre a memorizzare l'indice massimo raggiunto nel vettore, va a costiture
anche l'dentificatore id di ciascun veicolo.
Il ciclo è dotato di un costrutto switch per distinguere se l'elemento inserito
è una moto, un auto o un furgone, questo perché se i primi 4 attributi (id,marca,anno
e cyl) sono comuni quelli rimanenti si diversificano a secondo della categoria.
Nel main() vengono create delle variabili di appoggio che sono in corrispondenza
con gli attributi privati di ciascun oggetto .
int j->id
String mar->marca
int year->anno
int cil->cyl
int par4->(porte/tempi/capacita)
char db->alimentazione
La tecnica per caricare un elemento nel vettore è la
stessa in tutti e tre i casi, ad esempio nel caso dell'auto, tramite il
costruttore, istanzio un oggetto a di classe auto [A]
.
A a = new A(j,mar,year, cil, par4,db);//istanziazione
T[j]=a;//caricamento dell'oggetto nel vettore
Per ragioni di brevità in questo esempio non si è fatto uso di metodi set
per l'inserimento o l'eventuale modifica successiva, dei dati inseriti.
Ad ogni ciclo eseguito, viene stampato l'elenco dei mezzi inseriti tramite
la:
for(int i=0;i < j ;i++)System.out.println(T[i]);
che invoca il metodo toString() per la stampa degli
attribute di ciascun elemento (punto 3). All'uscita del ciclo do-while viene
implementato il punto 2 che permette di stampare le caratteristiche di un
mezzo noto il suo identificatore id.
Nella classe madre [V] Si nota l'uso del modificatore
protected applicato alle variabili di istanza comuni
a tutti gli oggetti figli. Si ricorda che questo identificatore è come private,
con la differenza che se dichiari l'attributo marca
protected nella classe [V]
esso sarà visibile anche nelle classi che estendono [V]
(extends V). Cioè nelle classi [A],
[M] e [F] (classi derivate). Esso non sarà
visibile ad altre classi.
Si tratta dunque di un classico esempio di applicazione del principio di
ereditarietà fra gli oggetti, dove le classi auto [A] ,furgone [F] e moto
[M] , costituiscono una specializzazione della classe madre veicolo [V].
import java.util.Scanner;
class garage {
final static int max=15;
public static void main (String args []) {
Scanner in=new Scanner(System.in);
String mar;//marca
char db;//diesel o benzina
int cil,year,par4;
char ch,scelta;
int i,j=0;
V T[] = new V[max]; //istanziazione del vettore
do{
System.out.print("m,a,f?:");ch=in.next().charAt(0);
System.out.print("marca:");mar=in.next();
System.out.print("anno:");year=in.nextInt();
System.out.print("cilindrata:");cil=in.nextInt();
switch(ch){
case 'a':{
System.out.print("porte:");
par4=in.nextInt();
System.out.print("diesel o benzina?(d/b):");
db=in.next().charAt(0);
A a = new A(j,mar,year, cil, par4,db);
T[j]=a;}break;
case 'f':{
System.out.print("carico:"); par4=in.nextInt();
F f = new F(j,mar,year, cil, par4);
T[j]=f;}break;
case 'm':{
System.out.print("tempi:"); par4=in.nextInt();
F f = new F(j,mar,year, cil, par4);
T[j]=f;}break;
default:System.out.println("scelta non valida");
}//fine switch
j++;
for(i=0;i < j;i++)System.out.println(T[i]);
System.out.print("continui?(s/n):");
scelta=in.next().charAt(0);
}while(scelta!='n' && j < max);//fine do-while
System.out.print("indice mezzo da cercare:"); i=in.nextInt();
if(i < j && i>=0)System.out.println(T[i]);
else System.out.println("elemento non presente");
}//fine main
}// fine classe garage
class V {
protected int id;
protected String marca;
protected int anno,cyl;
V(int j,String s, int a, int c){
id=j;
marca=s;
anno=a;
cyl=c;
}
}//fine classe V
class A extends V {
private int porte;
private char alimentazione;
A(int j,String s, int a, int c,int p, char d) {
super(j,s,a,c); porte=p; alimentazione=d;
}
public int getid() {return id;}
public String getm() {return marca;}
public int geta() {return anno;}
public int getc() {return cyl;}
public int getp() {return porte;}
public char getd() {return alimentazione;}
public String toString() {
String st=getid()+"] "+getm()+" "+geta()+" "+getc()+" "+getp()+" "+getd();
return st;
}
}//fine classe A
class F extends V {
private int carico;
F(int j,String s, int a, int c,int ca) {super(j,s,a,c);carico=ca;}
public int getid() {return id;}
public String getm() {return marca;}
public int geta() {return anno;}
public int getc() {return cyl;}
public int getca() {return carico;}
public String toString() {
String st=getid()+"] "+getm()+" "+geta()+" "+getc()+" "+getca();
return st; }
}//fine classe F
class M extends V {
private int tempi;
M(int j,String s, int a, int c,int t) {super(j,s,a,c);tempi=t;}
public int getid() {return id;}
public String getm() {return marca;}
public int geta() {return anno;}
public int getc() {return cyl;}
public int gett() {return tempi;}
public String toString() {
String st=getid()+"] "+getm()+" "+geta()+" "+getc()+" "+gett();
return st;
}
}//fine classe M