On cherche à modéliser les bonbons récoltés par les enfants pour Halloween.
Chaque enfant ramasse ses bonbons dans un panier, et il existe différents types de bonbons avec des caractéristiques différentes.
Le but du TP est de mettre en commun tous les bonbons collectés par les enfants et de les re-répartir entre eux "équitablement".
Toutes les classes à écrire devront être déclarées dans le
package fr.umlv.tpnote et le code des différents tests
pour chaque question devra être regroupé (à la suite les uns des autres)
dans une classe Main déclarée dans le package fr.umlv.tpnote.main.
-
On souhaite écrire une classe Candy qui modélise un bonbon.
Chaque bonbon a un goût (flavor) et peut-être allégé en sucre (light) ou non.
Écrire la classe Candy, ainsi que son constructeur qui prend en paramètre le goût du bonbon (une chaîne de caractères) et un booléen indiquant s'il est allégé ou non.
Faîtes en sorte que l'on puisse afficher les bonbons avec le code suivant:
Candy ourson = new Candy("pomme", true);
Candy pimousse = new Candy("fraise", false);
System.out.println(ourson); // Bonbon (sans sucre) au parfum pomme
System.out.println(pimousse); // Bonbon au parfum fraise
L'affichage doit indiquer le parfum du bonbon et s'il est allégé ou non, en respectant le format de l'exemple ci-dessus.
-
Écrire la classe CandyBasket qui modélise un panier de bonbons récoltés par un enfant le soir d'Halloween. La classe doit posséder une méthode add qui permet d'ajouter des bonbons au panier et une méthode averageSugarLevel qui calcule le taux de sucre moyen du panier sachant qu'un bonbon allégé a un taux de sucre de 0.1 alors qu'un bonbon "normal" a un taux de sucre de 0.6.
Le code suivant devra donc fonctionner:
Candy ourson = new Candy("pomme", true);
Candy pimousse = new Candy("fraise", false);
CandyBasket candies = new CandyBasket();
candies.add(ourson);
candies.add(ourson);
candies.add(pimousse);
candies.add(ourson);
System.out.println("Taux de sucre moyen: " + candies.averageSugarLevel()); // Taux de sucre moyen: 0.225
-
Modifier la classe CandyBasket de sorte que le code suivant
affiche tous les bonbons d'un panier en respectant le formatage:
System.out.println(candies);
// ******
// Bonbon (sans sucre) au parfum pomme
// Bonbon (sans sucre) au parfum pomme
// Bonbon au parfum fraise
// Bonbon (sans sucre) au parfum pomme
// ******
Attention à ce que votre code n'alloue pas trop d'objets !
-
On souhaite pouvoir ajouter des sucres d'orge (CandyCane) ayant eux aussi un goût ainsi qu'une couleur.
Le taux de sucre d'un sucre d'orge est de 0.8 sauf pour ceux qui sont orange ou noirs qui ont un taux de sucre de 0.4.
Écrire la classe CandyCane de telle sorte que le code suivant fonctionne:
CandyCane orge1 = new CandyCane("cerise", "rouge");
CandyCane orge2 = new CandyCane("réglisse", "noir");
System.out.println(orge1 + ", taux de sucre: " + orge1.sugarLevel());
// Sucre d'orge rouge au parfum cerise, taux de sucre: 0.8
System.out.println(orge2 + ", taux de sucre: " + orge2.sugarLevel());
// Sucre d'orge noir au parfum réglisse, taux de sucre: 0.4
- On souhaite pouvoir ajouter aussi bien des CandyCane que des Candy à un panier de bonbons, mais en n'utilisant qu'un seule méthode add dans la classe CandyBasket...
De plus, l'association des parents a fourni une liste des sucreries interdites que l'on ne peut pas ajouter au panier:
- les sucres d'orges orange,
- toutes les sucreries au goût "citrouille".
Écrire l'interface Treat (sucrerie) de telle sorte que le code suivant fonctionne et que l'on ne puisse pas ajouter les sucreries interdites au panier.
Candy ourson = new Candy("pomme", true);
Candy pimousse = new Candy("fraise", false);
CandyCane orge1 = new CandyCane("cerise", "rouge");
CandyCane orge2 = new CandyCane("réglisse", "noir");
CandyBasket candies = new CandyBasket();
candies.add(ourson);
candies.add(pimousse);
candies.add(orge1);
candies.add(orge2);
System.out.println("Taux de sucre moyen : " + candies.averageSugarLevel()); // Taux de sucre moyen: 0.47
-
Si vous ne l'avez pas déjà fait, faîtes en sorte que le code affichant le parfum d'une sucrerie et celui détectant les bonbons interdits ne soient pas dupliqués.
En particulier, le code suivant devra afficher:
System.out.println(candies);
// ******
// Bonbon (sans sucre) au parfum pomme
// Bonbon au parfum fraise
// Sucre d'orge rouge au parfum cerise
// Sucre d'orge noir au parfum réglisse
// ******
-
Enfin, on souhaite pouvoir ajouter des bonbons enveloppés (WrappedCandy) qui sont donc enveloppés, ont un goût et peuvent être allégés ou non. Les bonbons enveloppés sont plus hygiéniques mais moins bons pour les dents: ils ont un taux de sucre de 0.1 plus élevé que les bonbons non enveloppés.
Écrire la classe WrappedCandy de telle sorte que le code suivant fonctionne:
Candy pimousse = new Candy("fraise", false);
CandyCane orge1 = new CandyCane("cerise", "rouge");
WrappedCandy pierrot = new WrappedCandy("cola", false);
WrappedCandy michoco = new WrappedCandy("caramel", true);
CandyBasket candies = new CandyBasket();
candies.add(pimousse);
candies.add(orge1);
candies.add(pierrot);
candies.add(michoco);
System.out.println("Taux de sucre moyen: " + candies.averageSugarLevel()); // Taux de sucre moyen: 0.57
System.out.println(candies);
// ******
// Bonbon au parfum fraise
// Sucre d'orge rouge au parfum cerise
// Bonbon enveloppé au parfum cola
// Bonbon enveloppé (sans sucre) au parfum caramel
// ******
Vous devrez prendre soin de ne pas dupliquer de code.
- Une fois que tous les enfants ont récolté leurs sucreries, pour qu'il n'y ait pas de jaloux, on souhaite pouvoir répartir équitablement les bonbons entre les enfants. Comme il y a peu de sortes de bonbons différentes, on choisit de regrouper ensemble les bonbons identiques et d'en donner autant de chaque sorte à chaque enfant. Les sucreries restantes seront distribuées pour Halloween l'an prochain.
Commencer par écrire une méthode countSameCandies qui compte le nombre d'occurrences identiques d'une sucrerie (passée en paramètre) dans un panier.
-
Écrire enfin la méthode fairCandyBasket(CandyBasket ... candies) qui prend en paramètre les paniers de tous les enfants et renvoie le panier (obtenu comme indiqué ci-dessus) qui sera redonné à chaque enfant.
Indice: commencez par mettre tous les bonbons dans un énorme panier et comptez-les...
La méthode employée n'est pas très efficace en termes de complexité, mais pour faire mieux, il faut utiliser des tables de hachage que nous n'avons pas encore vues.
Par exemple, pour 2 enfants avec les paniers candies et candies2:
Candy pimousse = new Candy("fraise", false);
Candy pimousse2 = new Candy("fraise", false);
CandyCane orge1 = new CandyCane("cerise", "rouge");
WrappedCandy michoco = new WrappedCandy("caramel", true);
CandyBasket candies = new CandyBasket();
CandyBasket candies2 = new CandyBasket();
candies.add(pimousse);
candies.add(pimousse);
candies.add(pimousse);
candies.add(orge1);
candies.add(michoco);
candies2.add(pimousse2); // ça fait au total 4 bonbons à la fraise...
candies2.add(orge1);
candies2.add(orge1); // ... 3 sucres d'orges rouges à la cerise...
candies2.add(michoco); // ... et 2 bonbons enveloppés (sans sucre) au caramel.
on obtient la redistribution suivante:
// ******
// Bonbon au parfum fraise
// Bonbon au parfum fraise
// Sucre d'orge rouge au parfum cerise
// Bonbon enveloppé (sans sucre) au parfum caramel
// ******