edutecnica

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