    abstract class AForme {
      double largeur, hauteur;
      AForme(double l, double h) {
	largeur = l;
	hauteur = h;
      }
      String toStringAire() {
	return getNom() + " aire = " + getAire();
      }
      abstract double getAire();
      abstract String getNom();
    }

    class Rectangle extends AForme {
      Rectangle(double l, double h) {
	super(l,h);
      }
      double getAire() {
	return largeur*hauteur;
      }
      String getNom() {
	return "Rectangle";
      }
    }

    class Ellipse extends AForme {
      Ellipse(double l, double h) {
	super(l,h);
      }
      double getAire() {
	return largeur*hauteur*Math.PI/4;
      }
      String getNom() {
	return "Ellipse";
      }
    }

    class Triangle extends AForme {
      Triangle(double l, double h) {
	super(l,h);
      }
      double getAire() {
	return largeur*hauteur/2;
      }
      String getNom() {
	return "Triangle";
      }
    }

    class Maison extends AForme {
      Maison(double l, double h) {
	super(l,h);
      }
      double getAire() {
	return 3*largeur*hauteur/4;
      }
      String getNom() {
	return "Maison";
      }
    }


    class TestAForme {
      static AForme readForme() {
	int type = Keyboard.readInt();
	if (type < 0 || type > 3) return null;
	double largeur = Keyboard.readInt();
	double hauteur = Keyboard.readInt();
	switch (type) {
	case 0: return new Rectangle(largeur, hauteur);
	case 1: return new Ellipse(largeur, hauteur);
	case 2: return new Triangle(largeur, hauteur);
	case 3: return new Maison(largeur, hauteur);
	default: return null;
	}
      }
      public static void main(String[] args) {
	System.out.println("Donnez le type, la largeur puis la hauteur");
	for(;;) {
	  AForme f = readForme();
	  if (f == null) 
	    break;
	  System.out.println(f.toStringAire());
	}
	System.out.println("Bye");
      }
    }
