Exercice POO de base calcul de la surface

But:

Modifier un petit programme calculant des surfaces

Thème:

POO de base

Fichiers:

Le fichier Surfaces.java contient les déclarations de trois classes: Surfaces, Terrain et Rectangle.

  • La classe Rectangle définit des objets de type rectangle, la classe Terrain définit des objets constitués de deux rectangles et permet de calculer leur surface totale.
  • Etudiez le code contenu dans le fichier Surfaces.java pour en comprendre les structures et fonctionnalités.
  • Incorporez le fichier dans Eclipse. Vérifiez qu'il y a vraiment un fichier .class correspondant à chaque classe déclarée dans le fichier compilé.
  • Essayez de démarrer la classe Rectangle. Vous aurez un message d'erreur (lequel ?) car cette classe n'a pas de méthode main et n'est donc pas démarrable. Démarrez le programme à l'aide de la classe qui a une méthode main.
  • Modifiez le code comme suit:
    • Calculez la surface d'un terrain composé de 3 rectangles et de 2 cercles. Vous pouvez soit entrer les données directement dans le code, soit demander à l'utilisateur de les entrer au clavier. Par exemple, vous aurez une surface totale de 398.9999698556466 si vos 3 rectangles sont de largeur/hauteur 1.0/2.0, 3.0/4.0 et 5.0/6.0 et si vos 2 cercles sont de rayon 7.0 et 8.0
    • Dans ce but, il faut ajouter une classe Cercle au programme. Cette classe peut, par exemple, avoir une variable d'instance rayon et une méthode d'instance calculerSurface. La surface d'un cercle est calculée par la formule ? · r2. Vous pouvez utiliser la constante prédéfinie Math.PI.
    • Rappelez-vous que plusieurs classes peuvent utiliser le même nom pour leurs méthodes d'instance. Il n'y a aucun conflit car une méthode d'instance est toujours appelée à travers un objet d'une classe précise, ce qui permet de choisir la bonne méthode à exécuter. Vous pouvez donc, par exemple, avoir une méthode calculerSurface dans la classe Rectangle ainsi que dans la classe Cercle. Choisissez toujours l'identificateur le plus parlant possible pour vos variables, méthodes et classes.

Code donné:
 

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667/* Dans ce programme, les 2 rectangles sont encapsulés dans un objet  de type Terrain qui s'occupe de calculer et d'afficher la surface  totale. Le mot-clé private a été utilisé le plus possible dans  toutes les classes. La classe Rectangle met aussi à disposition des  méthodes get et set pour ses variables (il s'agit d'un service que  le programmeur de la classe peut offrir à ses utilisateurs s'il le  juge utile). */class Surfaces { public static void main(String[] args) { // Construction d'un terrain: Terrain t = new Terrain(1.0, 2.0, 3.0, 4.0); t.afficherSurfaceTotale(); }}class Terrain { private Rectangle r1; private Rectangle r2; public Terrain(double l1, double h1, double l2, double h2) { // Construction des 2 rectangles définissant le terrain: r1 = new Rectangle(l1, h1); r2 = new Rectangle(l2, h2); } private double calculerSurfaceTotale() { return r1.calculerSurface() + r2.calculerSurface(); } public void afficherSurfaceTotale() { double surfaceTotale = calculerSurfaceTotale(); System.out.println("La surface totale est " + surfaceTotale); }}class Rectangle { private double largeur; private double hauteur; public Rectangle(double largeur, double hauteur) { this.largeur = largeur; this.hauteur = hauteur; } public void setLargeur(double largeur) { this.largeur = largeur; } public double getLargeur() { return largeur; } public void setHauteur(double hauteur) { this.hauteur = hauteur; } public double getHauteur() { return hauteur; } public double calculerSurface() { return (largeur * hauteur); }}
Fichiers:

Il s'agit ici de modifier le codage de la classe Terrain de sorte à décrire un terrain non plus comme étant constitué de 2 rectangles mais de 3 rectangles et 2 cercles. Commençons par décrire la nouvelle classe, Cercle qui nous est nécessaire :

123456789101112131415161718192021class Cercle { private double rayon; public Cercle (double rayon) { this.rayon = rayon; } public void setRayon (double rayon) { this.rayon = rayon; } public double getRayon () { return rayon; } public double calculerSurface () { return (Math.PI * rayon * rayon); }}

Il faut ensuite mettre à jour la classe Terrain en lui ajoutant les 3 attributs supplémentaires, en modifiant son constructeur et en modifier sa méthode de calcul de surface. On voit que cette dernière modification est complètement transparente pour l'utilisateur externe de la classe Terrain. Les méthodes par lesquelles il interagit avec cette classe (interface d'utilisation ou API) restent inchangées (à part le constructeur). La méthode calculerSurfaceTotale qui a été modifiée est en effet privée et la méthode d'affichage, publique parce qu'utile à l'utilisateur externe, n'a pas été modifiée.

12345678910111213141516171819202122232425262728class Terrain { private Rectangle r1; private Rectangle r2; private Rectangle r3; private Cercle c1; private Cercle c2; public Terrain (double l1, double h1, double l2, double h2, double l3, double h3, double rayon1, double rayon2) { // Construction des 3 rectangles definissant le terrain: r1 = new Rectangle(l1, h1); r2 = new Rectangle(l2, h2); r3 = new Rectangle(l3, h3); c1 = new Cercle(rayon1); c2 = new Cercle(rayon2); } private double calculerSurfaceTotale () { return r1.calculerSurface() + r2.calculerSurface() + r3.calculerSurface() + c1.calculerSurface() + c2.calculerSurface(); } public void afficherSurfaceTotale () { double surfaceTotale = calculerSurfaceTotale(); System.out.println("La surface totale est " + surfaceTotale); }}

  Voici le code complet du programme modifié:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990/* Ce programme calcule la surface d'un terrain composé de 3  rectangles et de 2 cercles. */class Surfaces { public static void main (String[] args) { // Construction d'un terrain: Terrain t = new Terrain(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); t.afficherSurfaceTotale(); }}class Terrain { private Rectangle r1; private Rectangle r2; private Rectangle r3; private Cercle c1; private Cercle c2; public Terrain (double l1, double h1, double l2, double h2, double l3, double h3, double rayon1, double rayon2) { // Construction des 3 rectangles définissant le terrain: r1 = new Rectangle(l1, h1); r2 = new Rectangle(l2, h2); r3 = new Rectangle(l3, h3); c1 = new Cercle(rayon1); c2 = new Cercle(rayon2); } private double calculerSurfaceTotale () { return r1.calculerSurface() + r2.calculerSurface() + r3.calculerSurface() + c1.calculerSurface() + c2.calculerSurface(); } public void afficherSurfaceTotale () { double surfaceTotale = calculerSurfaceTotale(); System.out.println("La surface totale est " + surfaceTotale); }}class Rectangle { private double largeur; private double hauteur; public Rectangle (double largeur, double hauteur) { this.largeur = largeur; this.hauteur = hauteur; } public void setLargeur (double largeur) { this.largeur = largeur; } public double getLargeur () { return largeur; } public void setHauteur (double hauteur) { this.hauteur = hauteur; } public double getHauteur () { return hauteur; } public double calculerSurface () { return (largeur * hauteur); }}class Cercle { private double rayon; public Cercle (double rayon) { this.rayon = rayon; } public void setRayon (double rayon) { this.rayon = rayon; } public double getRayon () { return rayon; } public double calculerSurface () { return (Math.PI * rayon * rayon); }}
Article publié le 17 Août 2010 Mise à jour le Lundi, 31 Août 2020 00:26 par Salim KHALIL