Soluzione 7.5


La classe Triangolo. (torna su)
public class Triangolo implements Poligono
{
    public Triangolo(int a, int b, int c)
    {
        // Ordinamento dei lati c >= b >= a
        // Facciamo un ordinamento per inserimento sull'array [a b c]
        if (b < a)       //se b < a scambio a con b
        {   int tmp = b;
            b = a;
            a = tmp;
        }
        if (c < b)          // se c < b (ora b potrebbe avere il precedente 
        {   int tmp = c; // valore di a) scambio b con c
            c = b;
            b = tmp;
        }
        if (b < a)          // se a < b (ora sia a che b potrebbero avere nuovi
        {   int tmp = b; // valori) scambio a con b
            b = a;
            a = tmp;
        }

        if (c > a + b)// in questo caso i tre lati NON definiscono un triangolo
            throw new IllegalArgumentException();
        this.a = a;
        this.b = b;
        this.c = c;
    }
   
    public int perimetro()
    {   return a + b + c; }
   
    public double area()
    {   double p = 0.5 * perimetro();
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }
   
    public int compareTo(Object obj)
    {   Poligono p = (Poligono) obj;
        if  ( area() > p.area() ) return 1;
        if  ( area() < p.area() ) return -1;
        return 0;
        }
   
    public String toString()
    {   return "[T] " + a + " " + b + " " + c; }

    private int a;
    private int b;
    private int c;
}


La classe Rettangolo.
Osservazione (solo per i piu` interessati): (torna su)
public class Rettangolo implements Poligono
{
    public Rettangolo(int a, int b)
    {   this.a = a;
        this.b = b;
    }
   
    public int perimetro()
    {   return 2 * (a + b); }
   
    public double area()
    {   return a * b; }

    public int compareTo(Object obj)
    {   Poligono p = (Poligono) obj;
        if  ( area() > p.area() ) return 1;
        if  ( area() < p.area() ) return -1;
        return 0;
    }
   
    public String toString()
    {   return "[R] " + a + " " + b; }

    private int a;
    private int b;
}


La classe Quadrato. E` quasi vuota, perche` eredita quasi tutto da Rettangolo!
(torna su)
public class Quadrato extends Rettangolo
{
   public Quadrato(int l)
   {  super(l, l); }

   public String toString()
   {  return "[Q] " + perimetro() / 4; }
}


La classe PoligoniTester. (torna su)
import java.io.FileReader;
import java.io.IOException;

import java.util.Scanner;
import java.util.NoSuchElementException;

public class PoligoniTester
{
    public static void main(String[] args) throws IOException
    {
        //gestione argomento da riga di comando
        if (args.length < 1)
        {   System.err.println("uso: $java PoligoniTester nomeFile");
            return;
        }

        // apertura in lettura del file
        Scanner in = new Scanner(new FileReader(args[0]));

        // lettura file e memorizzazione ordinata dei poligoni
        System.out.println("Lettura dati:");
        SortedContainer poly = new SortedContainer();

        int lcount = 0;
        while (in.hasNextLine())
        {   lcount++;
            Scanner linescan = new Scanner(in.nextLine());
            try
            {   String ptype = linescan.next();
                if (ptype.equals("[T]"))
                    poly.add(new Triangolo(Integer.parseInt(linescan.next()), 
                                          Integer.parseInt(linescan.next()),
                                          Integer.parseInt(linescan.next())));
                else if (ptype.equals("[R]"))
                     poly.add(new Rettangolo(Integer.parseInt(linescan.next()),
                                           Integer.parseInt(linescan.next())));
                else if (ptype.equals("[Q]"))
                     poly.add(new Quadrato(Integer.parseInt(linescan.next())));
                else
                {   System.err.println("riga: " +lcount+ ": errore formato");
                }
            }
            catch (NoSuchElementException e)
            {   System.err.println("riga: " +lcount+ ": errore formato"); }
            catch (NumberFormatException e)
            {   System.err.println("riga: " +lcount+ ": errore formato"); }
        }

        // stampa poligoni
        System.out.println();
        System.out.println("******* Archivio ordinato di poligoni *******");
        while (!poly.isEmpty())
        {   Poligono p = (Poligono)poly.removeMax();
            System.out.println("Area = " + p.area() + "\t" + p);
        }
    }
}