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

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

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

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

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


    class TestGForme {
      static GForme readForme() {
	char type = Keyboard.readChar();
	if (type == 'q') return null;
	double largeur = Keyboard.readInt();
	double hauteur = Keyboard.readInt();
	switch (type) {
	case 'r': return new Rectangle(largeur, hauteur);
	case 'e': return new Ellipse(largeur, hauteur);
	case 't': return new Triangle(largeur, hauteur);
	case 'm': 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(;;) {
	  GForme f = readForme();
	  if (f == null) 
	    break;
	  System.out.println(f.toStringAire());
	}
	System.out.println("Bye");
      }
    }
