edutecnica

Esercizio 3        

Un trapano verticale si può muovere lungo le direzioni x,y di un piano per poi fermarsi ed eseguire un foro.
L'operazione di foratura e di traslazione lungo gli assi xy è subordinata al fatto che il motore del trapano sia acceso o spento.
Realizza una classe 'Motore' che gestisca lo spegnimento e l'accensione del motore.
Estendi la classe precedente con la classe 'Punta' che invece si occupa di muovere il trapano sui tre assi.



import java.io.*;
class provaTrapano {
public static void main (String args []) throws IOException{

InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);

String s;
char ch;
int dx,dy;
Punta p=new Punta();

do{
     System.out.print("a)ccendi s)pegni m)muovi f)ora e)esci:");
     s=(h.readLine()).toLowerCase();
     ch = s.charAt(0);
     switch (ch) {
           case 'a':
                System.out.println("motore acceso.");p.on();break;
           case 's':
                System.out.println("motore spento.");p.off();break;
           case 'e':System.out.println("Exit");break;
           case 'f':p.fora();break;
           case 'm':
               if(!p.status())
                  System.out.println("mot.spento 'a' per accendere");
               else{ System.out.print("Delta-x:");            
           dx=Integer.parseInt(h.readLine().trim());
           System.out.print("Delta-y:");
           dy=Integer.parseInt(h.readLine().trim());
           p.muovi(dx,dy); }
           break;
           default: System.out.println("selezione non valida");
     }//fine switch
     if(ch=='e' && p.status()==true)
           System.out.println("spegnere il motore.");
}while(!(p.status()==false && ch=='e'));
}//fine main
}// fine classe provaTrapano

class Motore{
private boolean x;//attributo
Motore(){ x=false;}//costruttore
public void on(){ x=true;}//metodo
public void off(){ x=false;}//metodo
public boolean status(){return x;}//metodo
}//fine classe Motore

class Punta extends Motore{
private int x,y;
Punta(){x=y=0;}
public void muovi(int dx,int dy){
      System.out.print("muove:");       
      azione(Math.max(Math.abs(dx),Math.abs(dy)));
      x=x+dx;y=y+dy;
      System.out.println("\nfermo a x="+x+" y="+y);
}//fine metodo muovi
public void fora(){
    if(!status())
        System.out.println("motore spento premi 'a' per accendere");
    else { System.out.print("fora:");
    azione(5);
    System.out.println("\nfermo a x="+x+" y="+y);
    }//fine else
}//fine metodo fora
private void azione(int delay){
for(int i=0;i < delay;i++){
    try {
         Thread.sleep(500);
    } catch(InterruptedException ex) {
         Thread.currentThread().interrupt();
    }//fine try-catch
System.out.print("*");
}//fine for
}//fine metodo azione
}//fine classe Punta


Come si vede anche in questo esempio di ereditarietà, il programma principale, dopo aver istanziato un oggetto p di classe Punta, può usare indifferentemente i metodi della classe Punta e della classe Motore che sono stati ereditati. Si nota, inoltre, la routine:

try {
     Thread.sleep(500);
} catch(InterruptedException ex) {
     Thread.currentThread().interrupt();
}//fine try-catch

che serve esclusivamente per introdurre nell'esecuzione un ritardo di 500ms è contenuto nel metodo azione(int delay) che serve solo per rappresentare l'intervallo di tempo durante il quale avvengono le operazioni di traslazione e foratura della punta.