FMIN110 - GMIN327 - 16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
Dans ce sujet, nous ´etudions diverses op´erations li´ees `a la gestion d’un restaurant administratif
(restaurant destin´e aux membres du personnel d’une administration et `a leurs invit´es). Le sch´ema
de la figure 1 pr´esente les diff´erentes classes auxquelles nous allons nous int´eresser de mani`ere
progressive et partielle dans ce sujet. Le restaurant administratif (RestaurantAdministratif)
sert des repas (RepasServi), qui peuvent ˆetre soit des repas pris par des invit´es (RepasInvite),
soit des repas pris par des membres du personnel (RepasPersonnel). Un repas pris par un
membre du personnel est associ´e `a ce membre du personnel (MembrePersonnel).
Dans toutes les questions, les accesseurs qui ne sont pas sp´ecifiquement demand´es sont suppos´es
exister, n’´ecrivez pas leur code. N’´ecrivez pas non plus les constructeurs sans param`etres, qui
seront suppos´es exister ´egalement.
Figure 1 – Restaurant administratif
Question 1 Prenez connaissance de l’´enum´eration et de la classe pr´esent´ees `a la figure 2 et qui
repr´esentent respectivement les cat´egories d’items que l’on peut choisir dans un menu (comme
une entr´ee ou un dessert) et un item de menu. Pour chacune des 4 instructions du programme
de la figure 3, indiquez si elle compile ou non (une simple r´eponse par oui ou non qui ne serait
pas justifi´ee n’apporte pas de point).
R´eponse 1
(0,25pt) ItemRepas i1 = new ItemRepas(); // I1
Cette instruction cr´ee un ItemRepas avec le constructeur sans param`etre (qui existe bien).
Elle compile et s’ex´ecute sans erreur.
(0,25pt) ItemRepas i2 = new ItemRepas("crumble",Categorie.dessert,0.77); // I2
Cette instruction cr´ee un ItemRepas avec le constructeur de signature (String, Categorie,
double) qui existe bien). Elle compile et s’ex´ecute sans erreur.
(0,25pt) ItemRepas i3 = new ItemRepas(0.74); // I3
Il n’existe aucun constructeur de signature (double). L’analyse de cette instruction pro-
voque une erreur de compilation.
Examen FMIN110 - GMIN327
16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
(0,25pt) ItemRepas i4 = new ItemRepas(Categorie.dessert); // I4
Cette instruction cr´ee un ItemRepas avec le constructeur de signature (Categorie) qui
existe bien). Elle compile et s’ex´ecute sans erreur.
public enum Categorie {entree, plat, accompagnement, dessert;}
public class ItemRepas {
private String nom = "inconnu";
private Categorie categorie = Categorie.accompagnement;
private double prix; // en euros
public ItemRepas() {}
public ItemRepas(Categorie categorie) {
this.categorie = categorie;
}
public ItemRepas(String nom, Categorie categorie, double prix) {
this.nom = nom;
this.categorie = categorie;
this.prix = prix;
}
public String getNom() {return nom;}
public void setNom(String nom) {this.nom = nom;}
public Categorie getCategorie() {return categorie;}
public void setCategorie(Categorie categorie) {this.categorie = categorie;}
public double getPrix() {return prix;}
public void setPrix(double prix) {this.prix = prix;}
public String toString(){return this.nom+" "+this.categorie+" "+this.prix;}
Advertisement
}
Figure 2 – Classe ItemRepas
public class ProgrammeRestaurant {
public static void main(String[] argv)
{
ItemRepas i1 = new ItemRepas(); // I1
ItemRepas i2 = new ItemRepas("crumble",Categorie.dessert,0.77); // I2
ItemRepas i3 = new ItemRepas(0.74); // I3
ItemRepas i4 = new ItemRepas(Categorie.dessert); // I4
}
}
Figure 3 – Classe Programme
Question 2 Ecrivez une classe RepasServi contenant les attributs et le constructeur avec pa-
ram`etre(s) d´eduits des informations suivantes :
— la classe est sans instance propre,
— un repas servi se compose d’items de repas. La liste d’items de repas est toujours vide
`a la cr´eation du repas,
Examen FMIN110 - GMIN327
2
16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
— on m´emorise la date a laquelle le repas est servi. Cette date est une chaˆıne de caracteres
sous le format AAAAMMJJ.
R´eponse 2
(0,5pt) pour abstract
(0,5pt) pour d´eclaration de l’attribut listeItem
(0,5pt) pour l’initialisation de l’attribut
(0,25pt) pour d´eclaration de l’attribut date
(0,5pt) pour le constructeur
public abstract class RepasServi {
private ArrayList<ItemRepas> listeItem = new ArrayList<ItemRepas>();
private String date; // AAAAMMJJ
public RepasServi(String date){this.date = date;}
.........
}
Question 3 Ecrivez une classe RepasInvite contenant les attributs et le constructeur avec
param`etre(s) d´eduits des informations suivantes :
— l’invit´e est un adulte ou un enfant (mais on ne m´emorise que cette information et pas
l’identit´e de l’invit´e).
R´eponse 3
(1pt) pour extends ...
(0.25pt) pour l’attribut
On peut coder le fait que l’invit´e est un adulte ou un enfant par un bool´een, une chaˆıne de ca-
ract`eres, une ´enum´eration ... Ici on a choisi un bool´een.
(1pt) pour constructeur incluant 0,5 pt pour signature, affectation et 0,5pt pour appel `a super ...
public class RepasInvite extends RepasServi {
private boolean adulte = true; // versus enfant
public RepasInvite(String date, boolean adulte) {
super(date);
this.adulte = adulte;
}
.........
}
Question 4 Etudiez la classe MembrePersonnel partielle pr´esent´ee `a la figure 4. Ecrivez une
classe RepasPersonnel contenant les attributs d´eduits des informations suivantes (on ne de-
mande pas de constructeur ici) :
Advertisement
— le repas est associ´e `a un membre du personnel,
— `a chaque repas est associ´e un droit d’admission, le mˆeme pour tous les membres du
personnel, fix´e `a 2,59 euros (mais qui peut changer).
R´eponse 4
(1pt) pour extends ...
Examen FMIN110 - GMIN327
3
16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
(0.5pt) pour l’attribut membre
(0.5pt) pour l’attribut droitAdmission
public class RepasPersonnel extends RepasServi {
private MembrePersonnel membre;
private static double droitAdmission = 2.59;
Question 5 Ecrivez pour la classe RepasPersonnel une m´ethode subvention qui retourne :
— 2,49 € pour les personnels dont l’indice INM est <= `a 320,
— 2.24 € pour les personnels dont l’indice INM est compris entre 321 et 400,
— 1.84 € pour les personnels dont l’indice INM est compris entre 401 et 465,
— 0.45 € pour les personnels dont l’indice INM est compris entre 466 et 550,
— 0 dans les autres cas.
R´eponse 5
(2pt) incluant 0,5 pour liste des param`etres et type de retour, 0,5 pour r´ecup´erer l’INM, et 1
pour les tests et les return.
public double subvention()
{
}
// on peut introduire des variables statiques pour les tranches
// mais l’enonce ne le specifie pas
int inmMembre = this.getMembre().getINM();
if (inmMembre <= 320) return 2.49;
else if (inmMembre <= 400) return 2.24;
else if (inmMembre <= 465) return 1.84;
else if (inmMembre <= 550) return 0.45;
else return 0;
Question 6
(a) Compl´etez la classe MembrePersonnel par un attribut repr´esentant la liste des repas pris par
ce membre du personnel.
(b) Ajoutez a cette mˆeme classe une m´ethode permettant d’ajouter un repas a un membre du
personnel. Pensez a mettre a jour les attributs correspondant des deux classes. Si le repas a ´et´e
pr´ealablement associ´e `a une autre personne, un message d’information est affich´e, le repas est
retir´e `a cette autre personne et affect´e au membre du personnel courant.
R´eponse 6
(1pt) pour (a)
(2pt) pour (b) `a r´epartir sur les diff´erentes op´erations
public class MembrePersonnel {
.....
private ArrayList<RepasPersonnel> listeRepas = new ArrayList<RepasPersonnel>();
......
public void ajouteRepas(RepasPersonnel repas)
{
Examen FMIN110 - GMIN327
4
16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
if (! this.listeRepas.contains(repas))
Advertisement
{
}
if (repas.getMembre()!=null)
if (repas.getMembre()!=this)
{System.out.println("repas deja servi a "
+repas.getMembre().getNom());
repas.getMembre().listeRepas.remove(repas);}
else
System.out.println("repas deja associe a ce membre");
this.listeRepas.add(repas);
repas.setMembre(this);
}
............
}
public class MembrePersonnel {
private String nom;
private int INM; // indice de remuneration
private String numCarte;
public MembrePersonnel() {}
public MembrePersonnel(String nom, int iNM, String numCarte) {
this.nom = nom;
INM = iNM;
this.numCarte = numCarte;
}
public String getNom() {return nom;}
public void setNom(String nom) {this.nom = nom;}
public int getINM() {return INM;}
public void setINM(int iNM) {INM = iNM;}
public String getNumCarte() {return numCarte;}
public void setNumCarte(String numCarte) {this.numCarte = numCarte;}
}
Figure 4 – Classe MembrePersonnel
Examen FMIN110 - GMIN327
5
16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
Question 7 Ecrivez les m´ethodes de calcul du prix des repas (pour les trois classes repr´esentant
les repas). Si vous pensez que des attributs suppl´ementaires seraient utiles, ajoutez-les.
— Pour les invit´es, le prix est 8,5 euros si la personne est adulte et 6 euros s’il s’agit d’un
enfant.
— Pour les membres du personnel, le prix retourn´e se calcule par la somme des prix
des items le composant, `a laquelle on ajoute le prix de l’admission et on retranche la
subvention.
R´eponse 7
(1pt) pour RepasServi
(1,5pt) pour RepasInvite
(2pt) pour RepasPersonnel
On pr´esente ci-dessous les ajouts r´ealis´es dans chacune des trois classes.
public abstract class RepasServi {
public abstract double prix();
}
public class RepasInvite extends RepasServi {
private static double prixAdulte = 8.5;
private static double prixEnfant = 6;
public double prix() {
if (adulte) return RepasInvite.prixAdulte;
Advertisement
return RepasInvite.prixEnfant;
}
}
public class RepasPersonnel extends RepasServi {
public double prix() {
double sommeItem = 0;
for (ItemRepas it : this.getListeItem())
sommeItem += it.getPrix();
return sommeItem+RepasPersonnel.getDroitAdmission()-this.subvention();
}
}
Question 8 Ecrivez la (les) m´ethode(s) permettant d’ajouter un item `a un repas. Un repas
invit´e peut contenir au plus une entr´ee, au plus un plat, au plus un accompagnement et au plus
un dessert (donc au plus un item de chaque cat´egorie). Il n’y a pas de restriction pour les repas
des membres du personnel.
R´eponse 8
(0,5pt) pour RepasServi
(0,5pt) pour ne rien mettre dans RepasPersonnel
(2pt) pour RepasInvite
On pr´esente ci-dessous les ajouts r´ealis´es dans les classes.
On ne met rien dans la classe RepasPersonnel car l’ajout est r´ealis´e comme dans la super-
classe.
Examen FMIN110 - GMIN327
6
16/01/2014 - 13h-15h
Examen ´ecrit - Programmation par objets (Java)
Tous documents autoris´es
public abstract class RepasServi {
public void ajoute(ItemRepas item)
{
if (! this.listeItem.contains(item))
this.listeItem.add(item);
}
}
public class RepasInvite extends RepasServi {
public boolean contientCategorie(Categorie cat)
{
for (ItemRepas it : this.getListeItem())
if (it.getCategorie().equals(cat))
return true;
return false;
}
public void ajoute(ItemRepas item)
{
if (!this.contientCategorie(item.getCategorie()))
super.ajoute(item);
else System.out.println("Probleme d’ajout");
}
}
Examen FMIN110 - GMIN327
7
16/01/2014 - 13h-15h