public class SurfaceRectangleAvecStructure {

////////////////////////////////////////////////////

/* Type agrege de stockage d'une position du plan */

  static class Position2D {
    double x = 0.0;
    double y = 0.0; };

/* Type agrege de stockage d'un rectangle du plan */

  static class Rectangle2D {
    Position2D p1 = new Position2D(); 
    Position2D p2 = new Position2D(); };

/* Calcul de la surface d'un rectangle            */

  static double surfaceRectangle(Rectangle2D r) {
    double surface;
    surface = Math.abs(r.p2.x-r.p1.x)*
              Math.abs(r.p2.y-r.p1.y);
    return surface;
  }

////////////////////////////////////////////////////

/* Saisie au clavier de deux coins opposes        */
/* d'un rectangle 2D                              */

  static Rectangle2D saisirRectangle2D() {
    Rectangle2D r = new Rectangle2D();
    Ecran.afficher("SVP, x1? ");
    r.p1.x = Clavier.saisirDouble();
    Ecran.afficher("SVP, y1? ");
    r.p1.y = Clavier.saisirDouble();
    Ecran.afficher("SVP, x2? ");
    r.p2.x = Clavier.saisirDouble();
    Ecran.afficher("SVP, y2? ");
    r.p2.y = Clavier.saisirDouble();
    return r ;
  }

/* Programme principal                            */

  public static void main(String [] args) {
    Rectangle2D r;
    double srf;
    Ecran.afficherln("SVP, positions de 2 coins opposes: ");
    r = saisirRectangle2D();
    srf = surfaceRectangle(r);
    Ecran.afficherln("La surface est ",srf);
  }
}