:: Enseignements :: ESIPE :: E3INFO :: 2010-2011 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
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...
-
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]
-
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]
-
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.
-
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]
-
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]
-
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).
-
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.
-
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
© Université de Marne-la-Vallée