Exam on Object-Oriented Programming (Java)

Programming · exam

Browse all programmation documents

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