Ministère de l’Enseignement Supérieur Direction Générale des Etudes Technologiques Institut Supérieur des Etudes Technologiques de Djerba
Problème : « PIZZA Sharp » opère un comptoir et un service de livraison de pizzas. Selon les connaisseurs, surtout des étudiants et des sportifs regardant le football à la télé, « PIZZA Sharp » fait les meilleures pizzas en ville. Monsieur Salami, le propriétaire, désire améliorer son système de prise de commande et de c uisine. Il vous demande de l'aider à implémenter en c# son système d’information. 1- La cuisine : a- Les ingrédients Les pizzas son composés d’ingrédients (pate, sauce, mozzarella, câpre …). Ces ingrédients sont modélisés par deux classes qui sont : Ingrédient et supplément selon le diagramme suivant :
« qte » est la quantité nécessaire d’un ingrédient ou d’un supplément pour cuisiner une pizza. « prix » est le prix a ajouter quant un client demande un supplément. Q1.Implémentez Q1.Implémentez en C# les classes « Ingredient » et « Supplement » Correction: public class Ingredient { protected string nom; protected int qte; public Ingredient(string Ingredient(string n, int q) { 1
this .nom = n; this.nom this.qte this .qte = q; } public override string ToString() { return ("Ingredient de base " +this this.nom+ .nom+", ", Qte: "+ " +this this.qte); .qte); } } public class Supplement : Ingredient { private new int qte; private decimal prix; public decimal PRIX { get { return prix; } set { prix = value value; ; } } public Supplement(string Supplement(string n,int n,int q, decimal p): base base(n,q) (n,q) { this.prix this .prix = p; this.qte this .qte = q; } public override string ToString() { return ("Supplement " +base base.nom+ .nom+" " ,Qte: "+qte+ " +qte+" " Prix: "+prix); "+prix); } }
b- Les Pizzas : Les Pizzas de Monsieur Salami sont modélisés par la classe « Pizza ». La classe pizza possède les attributs attr ibuts suivants :
nom : Nom de la pizza (4 saisons, Royale, Neptune ….) (de type string)
prixBase : Le prix de base de la pizza sans compter les suppléments. (de type double)
Ingrédients : ArrayList ArrayList de type type « Ingredient »
Forme : la forme de la pizza qui est de type Forme donné par le diagramme de classe suivant :
2
Nb : N’implémentez pas ce diagramme. Les méthodes de la classe Pizza Sont :
Nb : Le premier constructeur permet d’initialiser une Pizza avec une liste d’ingrédients vide. Le deuxième constructeur permet d’initialiser une pizza avec une ArrayList d’ingrédients (I) La classe Pizza possède possède une seule propriété « INGREDIENTS » qui permet d’accéder à l’attribut privé ingrédients. Enfin, la classe pizza implémente im plémente l’interface IPizza suivante :
GetPrix() permet de calculer le prix Total d’une pizza (prix de base + le le prix des suppléménts) GetSurface() permet de calculer la surface de la pizza (suivant qu’elle soit rectangulaire ou ronde) Q2. Implémentez en C# la classe Pizza et l’interface IPizza. IPizza .
3
Corrcetion : public interface IPizza { decimal GetPrix(); void AfficherDetail(); double GetSurface(); } public class Pizza : IPizza { private string Nom; private Forme Forme; private decimal PrixBase; private ArrayList Ingredients; public ArrayList INGREDIENTS { get { return Ingredients; } set { Ingredients = value value; ; } } public Pizza(string Pizza( string n, Forme f, decimal Pb) { this.Nom this .Nom = n; this.Forme this .Forme = f; this.PrixBase this .PrixBase = Pb; this.Ingredients this .Ingredients = new ArrayList ArrayList(); (); } public Pizza(string Pizza( string n, Forme f, decimal Pb, ArrayList I) { this.Nom this .Nom = n; this.Forme this .Forme = f; this.PrixBase this .PrixBase = Pb; this.Ingredients this .Ingredients = I; }
public void AddIngredient( Ingredient i) { this.Ingredients.Add(i); this .Ingredients.Add(i); }
#region IPizza Members public decimal GetPrix() { decimal r = PrixBase; foreach (Ingredient i in Ingredients) { if (i is Supplement ) { Supplement s = (Supplement (Supplement )i; r += s.PRIX; } }
4
return r; } public void AfficherDetail() { this.Afficher(); this .Afficher(); foreach (Ingredient i in Ingredients) Console.WriteLine(i); Console .WriteLine(i); } public double GetSurface() { double surface=0; if (this this.Forme .Forme is Rectangle Rectangle) ) { Rectangle r = (Rectangle (Rectangle)Forme; )Forme; surface=r.LARGEUR * r.HAUTEUR; } else if (this this.Forme .Forme is Cercle Cercle) ) { Cercle c = (Cercle (Cercle)Forme; )Forme; surface=Math surface= Math.PI .PI * (c.DIAMETRE/2)* (c.DIAMETRE/2); } return (surface); } #endregion public void Afficher() { Console.WriteLine( Console .WriteLine(this this.Nom .Nom + "," + this this.Forme .Forme +" + " Prix: "+ " + this this.PrixBase); .PrixBase); } }
Q3. Ecrire une fonction main () dans laquelle vous créer une pizza « Royale » de forme circulaire (« Maxi », diamètre 30) avec comme ingrédient de base {pate, sauce mozzarella}. Ajoutez les suppléments {Champignon, Thon} (Fixez le prix de base et le prix des suppléments selon votre choix) static void Main() { Rectangle r = new Rectangle( Rectangle ("rectangle" "rectangle", , 10, 10); Cercle c = new Cercle Cercle( ("Maxi" "Maxi", , 30); Pizza P = new Pizza Pizza( ("Marguerita" ,c, (decimal (decimal)3.5); )3.5); Ingredient i1 = new Ingredient ("Pate" "Pate", , 150); Ingredient i2 = new Ingredient ("Sauce" "Sauce", , 100); Ingredient i3 = new Ingredient ("Mozzarella" , 70); Ingredient i4 = new Ingredient ("Capre" "Capre", , 20); Supplement s1 = new Supplement ("Fromage" "Fromage", , 100, (decimal ( decimal)0.5F); )0.5F); Supplement s2 = new Supplement ("Thon" "Thon", , 140, (decimal ( decimal)0.7F); )0.7F); P.AddIngredient(i1); P.AddIngredient(i2); P.AddIngredient(i3); P.AddIngredient(i4); P.AddIngredient(s1); P.AddIngredient(s2); Pizza z = new Pizza Pizza( ("4 Saisons", Saisons" , r, (decimal ( decimal)0.8, )0.8, P.INGREDIENTS); }
2. Les commandes:
5
Les commandes arriveraient de deux façons : par téléphone et par des clients venant directement au comptoir. Pour les commandes téléphoniques, on enregistre le numéro du téléphone du client qui a appelé et la distance de livraison en km (qui sera ajouté au prix de la commande) (0,5 x distance) Pour les commandes en comptoir on enregistre seulement le numéro de table du client. (Pas de frais supplémentaires de livraison). Le système de commande est modélisé par le diagramme de classe suivant :
NbrCmd est un attribut de classe c lasse qui représente le nombre de commandes crées. numero : est le numéro de la commande. (Le nombre de commandes crées +1) Pizzas : La liste des pizzas commandées par le client. Q4.Donnez Q4.Donnez l’implémentation de l’interface ICommande. ICommande. public interface ICommande { double TotalCommnde(); void AfficherDetail(); }
Q5. Q5. Donnez l’implémentation des Classes Commande, Commande, CommandeComptoir et CommandeTelephone CommandeTelephone.. public abstract class Commande : ICommande { protected static int NbrCmd; protected int numero; protected ArrayList Pizzas;
6
public Commande() { this.numero this .numero = NbrCmd + 1; Pizzas = new ArrayList ArrayList(); (); } public void AjouterPizza(Pizza AjouterPizza(Pizza p) { this.Pizzas.Add(p); this .Pizzas.Add(p); } #region ICommande Members public virtual double TotalCommnde() { double T=0; foreach (Pizza p in Pizzas) { T += (double (double)p.GetPrix(); )p.GetPrix(); } return (T); } public abstract void AfficherDetail();
#endregion } public class CommandeComptoir : Commande { private int NumTable; public CommandeComptoir( int n) { this.NumTable this .NumTable = n; } public override double TotalCommnde() { return base base.TotalCommnde(); .TotalCommnde(); } public override void AfficherDetail() { Console.WriteLine( Console .WriteLine("Numéro "Numéro "+ " + this this.numero .numero + " Table " + this this.NumTable); .NumTable); } } public class CommandeTelephone : Commande { private string Telephone; private int distance; public CommandeTelephone( string Tel, int d): base base() () { this.Telephone this .Telephone = Tel; this.distance this .distance = d; } public override double TotalCommnde() { return (base base.TotalCommnde()+(0.1*distance)); .TotalCommnde()+(0.1*distance)); } public override void AfficherDetail() {
7
Console.WriteLine("Numero Console.WriteLine( "Numero " + this this.numero .numero + " Telephone " + this this.Telephone .Telephone + " Distance " + this this.distance); .distance); foreach (Pizza p in Pizzas) p.AfficherDetail(); } }
Q6. Q6. Monsieur Salami gère un tableau de commandes (de taille 100) chaque jour. Ecrire une fonction main qui permet d’initialiser le tableau et d’y ajouter deux commandes : Une par téléphone (deux pizzas {Margherita et Spéciale} d’un client qui habite a 10 km, l’autre directement au comptoir (Une pizza 4 saisons). Pizza z = new Pizza Pizza( ("4 Saisons", Saisons" , r, (decimal (decimal)0.8, )0.8, P.INGREDIENTS); Commande[] Commande [] C = new Commande Commande[4]; [4]; C[0] = new CommandeTelephone ("21 689 300", 300" , 12); C[0].AjouterPizza(P); C[0].AjouterPizza(z); C[0].AfficherDetail(); Console.WriteLine( Console .WriteLine("total "total commande "+C[0].TotalCommnde().ToString()); " +C[0].TotalCommnde().ToString());
8