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