:: Enseignements :: ESIPE :: E3INFO :: 2010-2011 :: Programmation Objet avec Java ::
[LOGO]

Soupe soupe


Le but de cet TP noté est d'écrire quelques classes simples permettant de représenter des légumes, avec lesquels on peut faire de la soupe.
Ce TP noté doit se faire sous eclipse, dans un projet Java de nom TPNOTE que vous créerez dans le workspace de votre compte ($HOME) (qui est vierge dans l'environnement de TP noté), ou à défaut dans un répertoire de nom TPNOTE que vous pourrez créer à la racine de votre compte.
Tout document électronique autre que le sujet est proscrit. Vous pouvez consulter la javadoc à travers eclipse.

Exercice 1 - Patates, carottes...

  1. Dans un paquetage de nom fr.umlv.cuisine.exo1, écrire une classe Carrot représentant une carotte avec son poids en kilogrammes et sa longueur en centimètres de sorte que les lignes de code ci-dessous:
      Carrot c = new Carrot(0.25, 30);
      System.out.println(c);
    
    produisent l'affichage suivant:
      Carotte: [0.25 kg - 30 cm]
    
  2. Dans le même paquetage, écrire une classe Potatoe représentant une pomme de terre avec son poids en kilogrammes et un nombre de germes (les fameux "yeux") de sorte que les lignes de code ci-dessous:
      Potatoe pdt = new Potatoe(0.3,10);
      System.out.println(pdt);
    
    produisent l'affichage suivant:
      Patate: [0.3 kg - 10 yeux]
    
  3. La pomme de terre ci-dessus a beaucoup de germes (10 pour un poids de 300 grammes). En règle générale, les pommes de terre ont un germe par tranche de 100 grammes. Ajoutez à la classe Potatoe ce qu'il faut pour créer des pommes de terre qui respectent cette règle générale sans avoir à spécifier explicitement le nombre de germes. Par exemple, les lignes de code ci-dessous:
      Potatoe pdt1 = new Potatoe(0.3,10);
      Potatoe pdt2 = new Potatoe(0.3);
      Potatoe pdt3 = new Potatoe(0.75);
      System.out.println(pdt1);
      System.out.println(pdt2);
      System.out.println(pdt3);
    
    doivent produire l'affichage suivant:
      Patate: [0.3 kg - 10 yeux]
      Patate: [0.3 kg - 3 yeux]
      Patate: [0.75 kg - 7 yeux]
    

Exercice 2 - Soupe de légumes

Pour les questions de cet exercice, vous créerez un nouveau paquetage fr.umlv.cuisine.exo2 dans lequel vous recopierez toutes les classes de fr.umlv.cuisine.exo1, qu'elles aient changé ou non, de sorte à garder intactes l'ensemble de vos réponses à l'exercice 1.

  1. Comme on risque d'avoir plein de légumes (carottes, pommes de terre, poireaux...) mais que tous auront un poids, on souhaite créer un type Vegetable pour "factoriser" ce champs, de sorte que le code suivant puisse compiler:
      Vegetable pdt = new Potatoe(0.3,10);
      Vegetable c = new Carrot(0.25,30);
      System.out.println(pdt);
      System.out.println(c);
    
    et produire l'affichage suivant:
      Patate: [0.3 kg - 10 yeux]
      Carotte: [0.25 kg - 30 cm]
    
  2. On veut maintenant définir une classe Soup représentant une soupe de légumes par la liste de ses ingrédients (légumes de type Vegetable). Vous pouvez utiliser les types de java.util. Une fois qu'une soupe est créée, on lui ajoute chaque légume un par un, grâce à la méthode add() comme illustré ci dessous. À tout moment, on peut demander l'affichage de la soupe.
    Écrire dans le paquetage fr.umlv.cuisine.exo2 la classe Soup de sorte que le code ci-dessous:
      Soup s = new Soup();
      s.add(new Potatoe(0.3,10));
      s.add(new Carrot(0.25,30));
      System.out.println(s);
      s.add(new Potatoe(0.500));
      s.add(new Potatoe(0.150));
      s.add(new Carrot(0.20,25));
      s.add(new Potatoe(0.450,2));
      System.out.println(s);
    
    produise l'affichage suivant:
    Soupe:
    ------
    Patate: [0.3 kg - 10 yeux]
    Carotte: [0.25 kg - 30 cm]
    Soupe:
    ------
    Patate: [0.3 kg - 10 yeux]
    Carotte: [0.25 kg - 30 cm]
    Patate: [0.5 kg - 5 yeux]
    Patate: [0.15 kg - 1 yeux]
    Carotte: [0.2 kg - 25 cm]
    Patate: [0.45 kg - 2 yeux]
    
  3. Toujours dans la classe Soup, on souhaite avoir une méthode getPeelingWeight() qui donne le poids des épluchures générées lors de la préparation de cette soupe. Par défaut, le poids d'épluchure des légumes est de 10% de leur poids. Néanmoins, dans le cas particulier des pommes de terre, le poids d'épluchure est ce pourcentage (10%) auquel il faut ajouter 10 grammes par germe (oeil).
    Modifiez les classes nécessaires pour réaliser ces fonctionnalités pour obtenir à l'éxécution du code suivant:
      Soup s = new Soup();
      s.add(new Potatoe(0.3,10));
      s.add(new Carrot(0.25,30));
      System.out.println(s.getPeelingWeight());  // affiche: 0.155
    
    qui correspond à 25g pour la carotte (10% de 0,250kg) et à 130g pour la pomme de terre (30g = 10% de 0,300kg + 100 g pour 10g fois 10 germes).
  4. On souhaite maintenant que le pourcentage du poids du légume perdu en épluchure (10% par défaut) puisse être paramétré globalement, pour tous les légumes. Ainsi, par exemple, sur la base du code précédent, on souhaite voir la différence de poids d'épluchure d'une soupe entre le paramétrage par défaut (10%) et un paramétrage à 5%...
      Soup s = new Soup();
      s.add(new Potatoe(0.3,10));
      s.add(new Carrot(0.25,30));
    
      System.out.println(s.getPeelingWeight());  // affiche: 0.155
    
      Vegetable.setPeelingWeight(0.05);
      System.out.println(s.getPeelingWeight());  // affiche: 0.1275
    
    Modifiez les classes nécessaires pour réaliser ces fonctionnalités.

Exercice 3 - On surveille ses calories

Pour les questions de cet exercice, vous créerez un nouveau paquetage fr.umlv.cuisine.exo3 dans lequel vous recopierez toutes les classes de fr.umlv.cuisine.exo2, qu'elles aient changé ou non, de sorte à garder intactes l'ensemble de vos réponses à l'exercice 2.

  1. La plupart des aliments, qu'ils soient crus, cuits, nature ou transformés, contiennent des calories. On souhaite maintenant disposer d'un type Quantifiable qui permette d'accéder au nombre de calories d'un aliment donné.
    On suppose que:
    • les carottes contiennent 40 calories pour 100 grammes;
    • les pommes de terre contiennent 80 calories pour 100, moins 5 calories par germe sur la patate;
    • le calcul du nombre de calories se fait sur chaque légume sans tenir compte du poids des épluchures, et produit un nombre entier (pas un nombre flottant);
    • on ne peut pas définir le nombre de calories d'un légume sans savoir précisément de quel légume il s'agit;
    • une soupe contient autant de calories que les légumes qui entrent dans sa composition.
    Écrire ce qu'il faut pour que le code suivant compile (attention: toutes les fonctionnalités décrites dans les deux exercices précédents doivent être maintenues):
      Potatoe p1 = new Potatoe(0.3,10);
      System.out.println(p1.getCalories());   // affiche: 190
      Carrot c1 = new Carrot(0.25,30);
      System.out.println(c1.getCalories());   // affiche: 100
      Soup soup = new Soup();
      soup.add(p1);
      soup.add(c1);
      System.out.println(soup.getCalories()); // affiche: 290
      Carrot c2 = new Carrot(0.20,20);
      System.out.println(c2.getCalories());   // affiche: 80
    
      Quantifiable[] meal = {c2, soup};
      int total = 0; 
      for(Quantifiable item : meal)
        total = total + item.getCalories();
      System.out.println(total);              // affiche: 370