CSC4002 : Contrôle Final Session 1. Date : vendredi 31 janvier 2014 Durée : 1H30. Coordonnateurs : Christian Bac et Denis Conan

Documents pareils
Programmation Par Objets

Programmer en JAVA. par Tama

Corrigé des exercices sur les références

Chapitre 10. Les interfaces Comparable et Comparator 1

Environnements de développement (intégrés)

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Corrigés des premiers exercices sur les classes

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Auto-évaluation Programmation en Java

Introduction au langage de programmation Java

Développement Logiciel

RMI le langage Java XII-1 JMF

Package Java.util Classe générique

Premiers Pas en Programmation Objet : les Classes et les Objets

Remote Method Invocation (RMI)

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Objets et Programmation. origine des langages orientés-objet

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Remote Method Invocation en Java (RMI)

Projet de programmation (IK3) : TP n 1 Correction

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Un ordonnanceur stupide

Design patterns. Design patterns - définition. Design patterns - avantages

Programmation Objet Java Correction

Langage Java. Classe de première SI

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

TD/TP PAC - Programmation n 3

LOG4430 : Architecture logicielle et conception avancée

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

TP1 : Initiation à Java et Eclipse

Java 1.5 : principales nouveautés

Une introduction à la technologie EJB (2/3)

Synchro et Threads Java TM

Héritage presque multiple en Java (1/2)

TD/TP PAC - Programmation n 3

Gestion distribuée (par sockets) de banque en Java

Calcul Parallèle. Cours 5 - JAVA RMI

Dis papa, c est quoi un bus logiciel réparti?

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

PROGRAMMATION PAR OBJETS

Programmation par les Objets en Java

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

ACTIVITÉ DE PROGRAMMATION

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

OpenPaaS Le réseau social d'entreprise

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Architecture Orientée Service, JSON et API REST

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Une introduction à Java

Java Licence Professionnelle CISII,

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Programmation avec des objets : Cours 7. Menu du jour

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Remote Method Invocation Les classes implémentant Serializable

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Edition Limitée CLASSIC 2. Spécial NOUVEL AN CHINOIS. recettes

Programmation Objet I

Chapitre VI- La validation de la composition.

Derrière toi Une machine virtuelle!

F. Barthélemy. 17 mai 2005

Tp 1 correction. Structures de données (IF2)

Utiliser Java sans BlueJ

Threads. Threads. USTL routier 1

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Arbres binaires de recherche

Desktop Intégration. Rémi Forax

Classe Interne, Anonyme & Enumération

Création d objet imbriqué sous PowerShell.

1 Définition d une classe en Java

Langage à objets : JAVA (1)

Support de cours et TD Programmation Orientée Objet

Introduction au langage Java

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Applet pour visualiser les variables «automate» notifiées

INF 321 : mémento de la syntaxe de Java

Utilisation d objets : String et ArrayList

as Architecture des Systèmes d Information

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Web Tier : déploiement de servlets

BEP RESTAURATION EPREUVE EP1 Technologie professionnelle, sciences appliquées, gestion appliquée coef 6

INITIATION AU LANGAGE JAVA

Livraison gratuite

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Cours 1: Java et les objets

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Programme Compte bancaire (code)

La carte à puce. Jean-Philippe Babau

Transcription:

Corrigé et Barème Contrôle de connaissances 2013/2014 des étudiants de 2 è année (EI2) CSC4002 : Contrôle Final Session 1 Date : vendredi 31 janvier 2014 Durée : 1H30 Coordonnateurs : Christian Bac et Denis Conan Les seuls documents autorisés sont ceux distribués en cours / BE / TP et mis à disposition sur le site Web du module, ainsi que vos notes personnelles. Notes en préambule : le travail doit se faire individuellement ; n oubliez pas d indiquer votre nom sur chaque feuille rendue ; soyez concis et précis, et justifiez vos réponses par des commentaires appropriés ; soyez rigoureux dans la syntaxe Java ; veillez à rendre une copie propre et lisible.

1 Étude de cas «recettes de cuisine» Étude de cas. Le système dont le diagramme de classes est présenté dans la figure 1 consiste en l organisation de recettes de cuisine. Le système gère un référentiel de produits alimentaires utilisées dans des recettes, c est-à-dire comme ingrédients de recettes. À titre d exemple, nous présentons deux recettes de cuisine : le bœuf bourguignon et le bœuf Strogonoff. Les classes RBBoeufBourguignon et RBBoeufStrogonoff construisent ces deux recettes. La solution utilise deux patrons de conception. Le premier patron de conception est le patron de conception «Singleton». Il est représenté par la classe ReferentielProduits et les classes enfants de la classe RecetteBuilder. Ce patron de conception permet de faire en sorte qu une classe ne possède qu une seule instance. Ainsi, dans notre système, il n existe qu un référentiel de produits, qu une recette de bœuf bourguignon, et qu une recette de bœuf Strogonoff. Ce patron de conception est mis en œuvre avec un attribut de classe instance et une méthode de classe getinstance comme montré dans le diagramme de communication de la figure 2. Le second patron de conception est le patron de conception «Constructeur» (en anglais, builder). Il permet de construire des objets complexes, ici une recette, étape par étape. Par exemple, les ingrédients du bœuf bourguignon sont : 800g de paleron de bœuf, 150g de lardons fumés, 3 oignons, 1 carotte (soit environ 125g), 40cl de vin de Bourgogne, 2 cuillères à soupe de farine (soit environ 30g), 2 cuillères à soupe d huile d olive pour la marinade (soit environ 3cl). Le diagramme de communication de la figure 3 montre l algorithme du constructeur de la classe RBBoeufBourguignon. Pour des raisons de clarté du diagramme, seule la création du premier des sept ingrédients est montrée dans le diagramme. Explications sur la conception Voici des éléments de description supplémentaires pour la réalisation : le coût d un ingrédient est le prix unitaire du produit multiplié par la quantité de l ingrédient ; la méthode afficheringredients de la classe Recette affiche la liste des ingrédients telle que montrée dans l exemple de la figure 5 ; les méthodes getinstance des classes ReferentielProduits, RBBoeufBourguignon et RB- BoeufStrogonoff retournent l unique instance de la classe ; l algorithme du constructeur de la classe RBBoeufBourguignon est décrit dans le diagramme de communications de la figure 3. La remarque qui suit a été oubliée dans le sujet initial. Dans tout le sujet, nous ignorons les méthodes equals et hashcode. Les questions suivantes permettent d implanter le système. Comme montré dans le code de la méthode main de la classe Main, toutes les classes font partie du paquetage singletonandbuilder. Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 2

Questions Question 1 [2,5 pts] : écrivez tout le code de la classe Produit. Réponse: public class Produit { private String nom ; private String unite ; private double prixunitaire ; public Produit ( final String nom, final String unite, final double prixunitaire ) { this. nom = nom ; this. unite = unite ; this. prixunitaire = prixunitaire ; public String getnom () { return nom ; public String getunite () { return unite ; public double getprixunitaire () { return prixunitaire ; @Override public int hashcode () { final int prime = 31; int result = 1; result = prime * result + (( nom == null )? 0 : nom. hashcode ()); return result ; @Override public boolean equals ( Object obj ) { if ( this == obj ) { return true ; if ( obj == null ) { if (!( obj instanceof Produit )) { Produit other = ( Produit ) obj ; if ( nom == null ) { if ( other. nom!= null ) { else if (! nom. equals ( other. nom )) { return true ; Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 3

Erreurs fréquemment observées : Barème de correction sur 2,5 point(s) : Répartition : 0,5 paquetage singletonandbuilder 0,5 déclaration de la classe 0,5 attributs privés 0,5 constructeur 0,5 getters Question 2 [2 pts] : écrivez tout le code de la classe Ingredient. Réponse: import java. text. DecimalFormat ; public class Ingredient { private Produit produit ; private double quantite ; public Ingredient ( final Produit produit, final double quantite ) { this. produit = produit ; this. quantite = quantite ; public Produit getproduit () { return produit ; public double getquantite () { return quantite ; public double calculercout () { if ( produit == null ) return 0; return produit. getprixunitaire () * quantite ; public String getstringcout () { // formatage optionnel return new DecimalFormat (". 00"). format ( produit. getprixunitaire () * quantite ); @Override public int hashcode () { Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 4

final int prime = 31; int result = 1; result = prime * result + (( produit == null )? 0 : produit. hashcode ()); return result ; @Override public boolean equals ( Object obj ) { if ( this == obj ) { return true ; if ( obj == null ) { if (!( obj instanceof Ingredient )) { Ingredient other = ( Ingredient ) obj ; if ( produit == null ) { if ( other. produit!= null ) { else if (! produit. equals ( other. produit )) { return true ; Erreurs fréquemment observées : Barème de correction sur 2 point(s) : Répartition : 0,5 attribut référence sur un Produit 0,5 constructeur 0,5 calculercout (sans le test de nullité sur l attribut produit) 0,5 getstringcout (sans la mise en forme) Question 3 [3 pts] : écrivez tout le code de la classe Recette. Pensez à vous référer à la figure 5 pour la forme de l affichage des ingrédients dans la méthode afficheringredients. En guise de simplification, dans la méthode ajouteringredient, nous supposons que l ingrédient n existe pas déjà dans les ingrédients de la recette. Réponse: import java. text. DecimalFormat ; import java. util. List ; import java. util. Vector ; public class Recette { Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 5

private String nom ; private List < Ingredient > ingredients ; public Recette ( final String nom ) { this. nom = nom ; ingredients = new Vector < Ingredient >(); public void ajouteringredient ( final Ingredient ingredient ) { if (( ingredient!= null ) &&! ingredients. contains ( ingredient )) { ingredients. add ( ingredient ); public void afficheringredients () { System. out. println (" Ingredients de la recette \" " + nom + " \" :"); for ( Ingredient ingredient : ingredients ) { System. out. println (" - " + ingredient. getproduit (). getnom () + " : " + ingredient. getquantite () + " " + ingredient. getproduit (). getunite () + " (" + new DecimalFormat ("0.00"). format ( ingredient. calculercout ()) + " euros )"); public double getcout () { double cout = 0; for ( Ingredient ingredient : ingredients ) { cout += ingredient. calculercout (); return cout ; Erreurs fréquemment observées : Barème de correction sur 3 point(s) : Répartition : 0,5 attribut collection ingredients avec initialisation de la collection 0,5 ajouteringredient (sans test nullité et déjà dans la collection) 1 afficheringredients (bien évidemment sans utilisation de DecimalFormat) 1 getcout Question 4 [6,5 pts] : écrivez tout le code des classes RecetteBuilder et RBBoeufBourguignon. Comme dans le diagramme de communications de la figure 3, vous pouvez vous limiter à l insertion du premier des sept ingrédients : le bœuf à braiser ou paleron de bœuf. Dans cette question, en guise de simplification, les cas d erreur ne sont pas traités. Ils le seront dans une prochaine question. Réponse: Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 6

public abstract class RecetteBuilder { protected Recette recette ; public Recette getrecette () { return recette ; public class RBBoeufBourguignon extends RecetteBuilder { private static RBBoeufBourguignon instance ; private RBBoeufBourguignon () { ReferentielProduits rp = ReferentielProduits. getinstance (); recette = new Recette (" Boeuf bourguignon pour 4 personnes "); // les instructions qui suivent condensent le diagramme de communications // et ne traitent pas les cas errones // Ingredients Boeuf bourguignon // 800 g de boeuf a braiser recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" paleron de boeuf "), 0.8)); // 150 gr de lardons fumes recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" lardons fumes "), 0.15)); // 3 beaux oignons recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" oignon "), 3)); // 1 belle carotte recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" carotte "), 0. 125)); // 40 cl bouteille de vin de Bourgogne recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" vin de Bourgogne "), 0.4)); // 2 cuilleres a soupe de farine recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" farine "), 0.03)); // 2 cuilleres a soupe d huile d olive pour la marinade recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" huile d olive "), 0.03)); public static RecetteBuilder getinstance () { if ( instance == null ) { instance = new RBBoeufBourguignon (); return instance ; Erreurs fréquemment observées : Barème de correction sur 6,5 point(s) : Répartition : 1,5 classe RecetteBuilder 0,5 classe abstraite 0,5 attribut protégé 0,5 getrecette 4 classe RBBoeufBourguignon Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 7

0,5 extends 0,5 attribut privé et statique instance 0,5 constructeur privé 2,5 définition du constructeur (idem diag. comm. = un ingredient suffit) 0,5 rp = ReferentielProduits.getInstance() 0,5 r = new Recette("Boeuf...") 0,5 chercherproduit 0,5 i1 = new Ingredient(p1,...) 0,5 r.ajouteringredient(i1) 1 définition de la méthode getinstance 0,5 méthode getinstance statique 0,5 définition de la méthode getinstance Question 5 [2,5 pts] : écrivez le code de toute la classe ReferentielProduits. En guise de simplification, dans la méthode ajouterproduit, nous supposons que le produit n existe pas déjà dans le référentiel des produits. Réponse: import java. util. Hashtable ; import java. util. Map ; public class ReferentielProduits { private static ReferentielProduits instance ; private Map < String, Produit > listeproduits ; private ReferentielProduits () { listeproduits = new Hashtable < String, Produit >(); public static ReferentielProduits getinstance () { if ( instance == null ) { instance = new ReferentielProduits (); return instance ; public void ajouterproduit ( final String nom, final String unite, final double prixunitaire if (( nom!= null ) && ( listeproduits. get ( nom )!= null )) { listeproduits. put ( nom, new Produit ( nom, unite, prixunitaire )); public Produit chercherproduit ( final String nom ) { return listeproduits. get ( nom ); Barème de correction sur 2,5 point(s) : Répartition : Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 8

0,5 attribut privé et statique instance 0,5 attribut privé collection et son initialisation (selon le type de la collection) 0,5 méthode statique getinstance 0,5 ajout d un produit (selon le type de la collection) 0,5 recherche d un produit (selon le type de la collection) Question 6 [2,5 pts] : nous ajoutons maintenant la levée d une exception de type ProduitNonReference lorsque le produit utilisé dans la construction de l ingrédient n existe pas dans le référentiel des produits. Écrivez le code de la classe d exception Produit- NonReference, et modifiez la méthode chercherproduit de la classe ReferentielProduits et le constructeur de la classe RBBoeufBourguignon. Réponse: package singletonandbuilder. exception ; public class ProduitNonReference extends Exception { private static final long serialversionuid = 1L; public ProduitNonReference ( final String message ) { super ( message ); package singletonandbuilder. exception ; import java. util. Hashtable ; import java. util. Map ; import singletonandbuilder. Produit ; public class ReferentielProduits { private static ReferentielProduits instance ; private Map < String, Produit > listeproduits ; private ReferentielProduits () { listeproduits = new Hashtable < String, Produit >(); public static ReferentielProduits getinstance () { if ( instance == null ) { instance = new ReferentielProduits (); return instance ; public void ajouterproduit ( final String nom, final String unite, final double prixunitaire listeproduits. put ( nom, new Produit ( nom, unite, prixunitaire )); public Produit chercherproduit ( String nom ) throws ProduitNonReference { Produit produit = listeproduits. get ( nom ); if ( produit == null ) { throw new ProduitNonReference (" produit non trouve = " + nom ); Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 9

return produit ; package singletonandbuilder. exception ; import singletonandbuilder. Ingredient ; import singletonandbuilder. Recette ; import singletonandbuilder. RecetteBuilder ; import singletonandbuilder. exception. ReferentielProduits ; public class RBBoeufBourguignon extends RecetteBuilder { private static RecetteBuilder instance ; private RBBoeufBourguignon () { ReferentielProduits rp = ReferentielProduits. getinstance (); try { recette = new Recette (" Boeuf bourguignon pour 4 personnes "); // Ingredients Boeuf bourguignon // 800 g de boeuf a braiser recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" paleron de boeuf "), 0.8)) // 150 gr de lardons fumes recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" lardons fumes "), 0.15)); // 3 beaux oignons recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" oignon "), 3)); // 1 belle carotte recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" carotte "), 0. 125)); // 40 cl bouteille de vin de Bourgogne recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" vin de Bourgogne "), 0.4)) // 2 cuilleres a soupe de farine recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" farine "), 0.03)); // 2 cuilleres a soupe d huile d olive pour la marinade recette. ajouteringredient ( new Ingredient ( rp. chercherproduit (" huile d olive "), 0.3)); catch ( ProduitNonReference ex) { System. out. println (ex. getmessage ()); public static RecetteBuilder getinstance () { if ( instance == null ) { instance = new RBBoeufBourguignon (); return instance ; public Recette getrecette () { return recette ; Erreurs fréquemment observées : Barème de correction sur 2,5 point(s) : Répartition : 1 classe de l exception 0,5 throws dans chercherproduit Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 10

0,5 throw new dans chercherproduit 0,5 try catch dans RBBoeufBourguignon Question 7 [1,5 pts] : écrivez, en utilisant JUnit, un test unitaire démontrant le fonctionnement correct du patron de conception «Singleton» pour la classe ReferentielProduits. Réponse: import static org. junit. Assert. fail ; import org. junit. Test ; public class ReferentielProduitsTest { @Test public void testsingleton () { if ( ReferentielProduits. getinstance ()!= ReferentielProduits. getinstance ()) { fail (" patron de conception Singleton mal implante "); Erreurs fréquemment observées : Barème de correction sur 1,5 point(s) : Répartition : 0,5 annotation @Test 0,5 scénario correct (égalité de référence) 0,5 utilisation de == fail ou de AssertEquals Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 11

Main +main(string[] args) * <<abstract>> RecetteBuilder #recette: Recette +getrecette(): Recette RBBoeufBourguignon instance: RBBoeufBourguignon RBBoeufBourguignon() +getinstance: RBBoeufBourguignon ReferentielProduits Recette RBBoeufStrogonoff instance: ReferentielProduits nom: String instance: RBBoeufStrogonoff ReferentielProduits() +getinstance():referentielproduits +ajouterproduit(string nom, String unite, double prixunitaire) +chercherproduit(string nom): Produit +Recette(String nom) +ajouteringredient(ingredient) +afficheringredients() +getcout(): double RBBoeufStrogonoff() +getinstance(): RBBoeufStrogonoff * * Produit Ingredient nom: String unite: String prixunitaire: double +Produit(String nom, String unite, double prixunitaire) +getnom(): String +getunite(): String +getprixunitaire(): double quantite: double +Ingredient(Produit produit, double quantite) +getproduit(): Produit +getquantite(): double +calculercout(): double +getstringcout(): String Figure 1 Diagramme de classes. La remarque qui suit a été oubliée dans le sujet initial. Dans tout le sujet, nous ignorons les méthodes equals et hashcode. 1. getinstance(): ReferentielProduits Main ReferentielProduits 1.1. constructeurrp() [instance == null] <<new>> :ReferentielProduits Figure 2 Diagramme de communications du patron de conception «Singleton». Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 12

Main 1. getinstance(): RBBoeufBourguignon 1.1 constructeurrbb() [instance == null] <<new>> RBBoeufBourguignon :RBBoeufBourguignon 1.1.1. rp=getinstance(): ReferentielProduits ReferentielProduits 1.1.2. constructeurr("boeuf......bourguignon pour 4 personnes") 1.1.5. ajouteringredient(i1) [p1!=null] <<new>> r:recette 1.1.4. constructeuri(p1,0.8) [p1!=null] <<new>> i1:ingredient 1.1.1.1. constructeurrp() [instance == null] 1.1.3. p1=chercherproduit("paleron de boeuf"): Ingredient <<new>> rp:referentielproduits Figure 3 Diagramme de communications du patron de conception «Constructeur» : pour des raisons de clarté du diagramme, uniquement la création du premier des sept ingrédients est montrée sur le diagramme. Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 13

import java. text. DecimalFormat ; public class Main { public static void main ( final String [] args ) { ReferentielProduits rp = ReferentielProduits. getinstance (); rp. ajouterproduit (" beurre ", "Kg", 11); rp. ajouterproduit (" carotte ", "Kg", 2); rp. ajouterproduit (" champignon de Paris ", " Kg", 11); rp. ajouterproduit (" concentre de tomate ", " Kg", 10); rp. ajouterproduit (" creme fraiche ", "Kg", 9); rp. ajouterproduit (" farine ", "Kg", 1.5); rp. ajouterproduit (" huile d olive ", "l", 13); rp. ajouterproduit (" lardons fumes ", "Kg", 15); rp. ajouterproduit (" oignon ", "", 0.15); rp. ajouterproduit (" paleron de boeuf ", "Kg", 25); rp. ajouterproduit (" vin de Bourgogne ", " l", 7); rp. ajouterproduit (" vodka ", "l", 15); Recette boeufbourguignon = RBBoeufBourguignon. getinstance (). getrecette (); boeufbourguignon. afficheringredients (); System. out. println (" pour un cout total d environ " + new DecimalFormat (".00"). format ( boeufbourguignon. getcout ()) + " euros "); Recette boeufstrogonoff = RBBoeufStrogonoff. getinstance (). getrecette (); boeufstrogonoff. afficheringredients (); System. out. println (" pour un cout total d environ " + new DecimalFormat (".00"). format ( boeufstrogonoff. getcout ()) + " euros "); Figure 4 Code Java de la classe Main Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 14

Ingredients de la recette " Boeuf bourguignon pour 4 personnes " : - paleron de boeuf : 0.8 Kg (20,00 euros) - lardons fumes : 0.15 Kg (2,25 euros) - oignon : 3.0 (0,45 euros) - carotte : 0.125 Kg (0,25 euros) - vin de Bourgogne : 0.4 l (2,80 euros) - farine : 0.03 Kg (0,04 euros) - huile d olive : 0.03 l (0,39 euros) pour un cout total d environ 26,19 euros Ingredients de la recette " Boeuf Strogonoff pour 4 personnes " : - paleron de boeuf : 0.8 Kg (20,00 euros) - farine : 0.03 Kg (0,04 euros) - beurre : 0.05 Kg (0,55 euros) - oignon : 4.0 (0,60 euros) - champignon de Paris : 0.25 Kg (2,75 euros) - concentre de tomate : 0.015 Kg (0,15 euros) - creme fraiche : 0.015 Kg (0,14 euros) - vodka : 0.015 l (0,22 euros) pour un cout total d environ 24,46 euros Figure 5 Exemple d exécution de la classe Main Télécom SudParis Denis Conan et Christian Bac Vendredi 31 janvier 2014 CSC4002 15