edutecnica

Esercizio 4        

Definisci una classe Parallelogramma (P) con i seguenti attributi: diagonale maggiore (D) diagonale minore (d) e angolo (p) che la diagonale maggiore forma rispetto l'orizzontale.
Deve essere possibile calcolare, i lati, l'area e perimetro del parallelogramma. Costruisci, quindi la classe Rombo [R] estendendo la precedente e Quadrato (Q) estendendo Rombo .


Bisogna ricordarsi che un parallelogramma è un rettangolo quando base e altezza sono diverse mentre le diagonali sono uguali.
Nello schema seguente si vede come vogliamo qualificare il parallelogramma.




Sapendo che le due diagonali si intersecano in un punto che sta a metà di ciascuna diagonale e che l'altezza di tale punto è la metà dell'altezza del parallelogramma:

      poi      

d'altra parte:


    ottenendo     


dopo aver eseguito      applichiamo il teorema di Carnot al triangolo di destra:

        

Nel caso della classe rombo sono sufficienti solo le due diagonali, dato che si sa che queste ultime devono essere fra loro perpendicolari. I 4 lati sono uguali:





L'area del rombo è 4 volte l'area di ciascun triangolo.
    

Ovviamente per calcolare area e perimetro potremmo usare il metodo calc() della classe P ma questo sarebbe troppo oneroso per il processore, per cui, dato che dobbiamo solo effettuare due operazioni, sovrascriviamo il metodo calc() (ovverride).

R(double diagM,double diagm){
      super(diagM,diagm,0);
      calc(D,d);
}//fine costruttore


Si noterà come il costruttore di R esegua la chiamata al costruttore della superclasse P, passandogli la diagonale maggiore e quella minore . Il programma viene testato, in ordine, su un parallelogramma, su un rombo e su un quadrato.

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

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

double dmax,dmin,angolo; //-------parallelogramma
System.out.print("diagonale maggiore:");
dmax=Integer.parseInt(h.readLine().trim());
System.out.print("diagonale minore:");
dmin=Integer.parseInt(h.readLine().trim());
System.out.print("angolo:");
angolo=Integer.parseInt(h.readLine().trim());
P p=new P(dmax,dmin,angolo);
System.out.println("a:"+p.geta());
System.out.println("b:"+p.getb());
System.out.println("h:"+p.geth());
System.out.println("perimetro:"+p.getperi());
System.out.println("area:"+p.getarea()); //-------rombo
System.out.print("diagonale maggiore:");
dmax=Integer.parseInt(h.readLine().trim());
System.out.print("diagonale minore:");
dmin=Integer.parseInt(h.readLine().trim());
R r=new R(dmax,dmin);
System.out.println("lato rombo:"+r.geta());
System.out.println("perimetro rombo:"+r.getperi());
System.out.println("area rombo:"+r.getarea()); //-------quadrato
System.out.print("diagonale del quadrato:");
dmin=Integer.parseInt(h.readLine().trim());
Q q=new Q(dmin);
System.out.println("lato quadrato:"+q.geta());
System.out.println("perimetro:"+q.getperi());
System.out.println("area:"+q.getarea());
}//fine main _____________________
}// fine classe

class P{
protected double D,d,g;
protected double h,area,peri,a,b,t,v,e;
P(double dmax,double dmin,double ang){
    D=dmax;d=dmin;g=ang;
    calc(D,d,g);
}//fine costruttore
protected void calc(double D,double d,double g){      
     h=D*Math.sin(g*Math.PI/180);
     t=Math.sqrt(Math.pow(D/2,2)-Math.pow(h/2,2));
     e=Math.asin(h/d); v=(d/2)*Math.cos(e);
     b=v+t;
     a=Math.sqrt(Math.pow(b,2)+Math.pow(d,2)-2*b*d*Math.cos(e));
     peri=2*a+2*b; area=b*h;
}//fine metodo calc
public double geth(){return h;}
public double geta(){return a;}
public double getb(){return b;}
public double getperi(){return peri;}
public double getarea(){return area;}
}//fine classe P

class R extends P{ R(double diagM,double diagm){     
    super(diagM,diagm,0);
    calc(D,d);
}//fine costruttore
public void calc(double D,double d){ a=b=Math.sqrt(Math.pow(D/2,2)+Math.pow(d/2,2));
peri=4*a;
area=D*d/2;
}// fine calc
}//fine classe R

class Q extends R{
Q(double diag){
    super(diag,diag);
    calc(d);
}//fine costruttore
public void calc(double d){
     a=b=d*Math.sqrt(2)/2;
     peri=4*d;
     area=D*d/2;
}// fine calc
}//fine classe R