Soluzione 3.8


Ecco una possibile soluzione per la classe Triangolo. Abbiamo realizzato l'interfaccia pubblica senza aggiungere metodi ausiliari, ed abbiamo seguito alla lettera i consigli.
public class Triangolo //ATTENZIONE: se la classe TriangoloTester e la classe
{                      //Triangolosono nello stesso file lo specificatore
                       //di accesso public va rimosso dalla prima riga.
    
    public Triangolo (double la, double lb, double lc)
    {
	// inizializzazione delle variabili di esemplare
	a = la;
	b = lb;
	c = lc;
	
	// Ordinamento dei lati c >= b >= a
	if (a > b)       //se a > b scambio a con b
	    {
		double tmp = b;
		b = a;
		a = tmp;
	    }
	if (a > c)       //se a > c scambio a con c
	    {
		double tmp = c;
		c = a;
		a = tmp;
	    }
	if (b > c)       //se b > c scambio b con c
	    {
         double tmp = c;
         c = b;
         b = tmp;
	    }
    }
    
    public String info()
    {
	/* Precondizioni: in un triangolo la somma di
	   due lati deve essere superiore al terzo lato */
	if (a + b <= c)
	    return "non e' un triangolo!";
	
	if (a == b && b == c)     // Equilatero: tre lati di pari lunghezza
	    return "equilatero";  // non verifico gli angoli perche' un
	                          // triangolo equilatero e' sempre acutangolo!
	String infoStr = "";
	if ( a == b || b == c)     // Isoscele: due lati di pari lunghezza
	    infoStr = "isoscele";
	else
	    infoStr = "scaleno";    // Scaleno: lati di diversa lunghezza
        
	// Classificazione secondo gli angoli
	if (c * c - a * a - b * b == 0)  // Rettangolo: un angolo di 90 gradi
	    infoStr += " rettangolo";
	else if ( c * c - a * a - b * b < 0) //Acutangolo: tutti gli angoli 
	    infoStr += " acutangolo";        //inferiori a 90 gradi
	else  // Ottusangolo: un angolo superiore a 90 gradi
	    infoStr +=  " ottusangolo";
	
	return infoStr;
    }
    
    public String toString ()
    {
	return "T(" + a + ", " + b + ", " + c +")";
    }
    
    public double area()
    {
    	double p = (a + b + c) / 2;
    	return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }
    
    public double h()
    {
	return 2 * area() / c;
    }
    
    
    
   //*********************campi di esemplare privati ***********************
   private double a;
   private double b;
   private double c;
   
}