Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 4

Année universitaire 2018/2019

Site :  Luminy  St-Charles  St-Jérôme  Cht-Gombert  Aix-Montperrin  Aubagne-SATIS


Sujet de :  1er semestre  2 ème semestre  Session 2 Durée de l’épreuve : 2h
Examen de : L1 Nom du diplôme : Portail Descartes
Code du module : S14IN2I1 Libellé du module : Programmation 1
Calculatrices autorisées : NON Documents autorisés : OUI, notes de Cours/TD/TP

Examen sur 12 points, TP sur 8 points. Les questions sont pour l’essentiel indépendantes et peuvent être traitées
dans n’importe quelle ordre. La première feuille du sujet doit être complétée et rendue, sans indication de votre nom, et
compte pour une intercalaire. Le reste du sujet doit être répondu sur des copies d’examen standards. Vous devez rendre
au moins une copie standard anonymisée. En fin de sujet, un appendice rappelle les noms des principales méthodes des
collections usuelles.

1 Questions de cours

Citer trois types primitifs de Java :

Cocher les affirmations correctes :


 "Alice".compareTo("Bob") vaut true.
 Pour tester que deux références d’objet sont identiques, on utilise la méthode equals.
 Une interface contient un nombre arbitrairement grand de méthodes.
 Une classe peut implémenter un nombre arbitrairement grand d’interfaces.
 Une interface possède un seul constructeur.

Pour chaque tâche, indiquer la structure de données adaptée parmi List, Set, Map et Deque (chacune apparaît une et
une seule fois).
Tester si une valeur est présente :

Traiter des valeurs par ordre d’arrivée :

Associer une valeur à chaque clé :

Trier des valeurs :

On souhaite trouver le premier entier pair d’une liste (ou 0 si tous les entiers sont impairs). Compléter la méthode
suivante (les cases peuvent être laissées vides) :

public int firstEvenInteger(List<Integer> ints) {

for ( ) {

if ( ) {

}
}

}
2 Gestion d’un restaurant (questions en page 3)
// Client.java
public class Client {
private final String name;

public Client(String name) {


this.name = name;
}
}

// Dish.java
public class Dish {
private final String name;
private final double price;

public Dish( ) {

@Override
public String toString() {
return name + " " + price;
}
}

// Table.java
public class Table {
private final int id;
private final int capacity;

public Table(int id, int capacity) {


this.id = id;
this.capacity = capacity;
}
}

// Room.java
public class Room {
private int nbTables = 0;
availableTables = new ArrayList<>();

menu = new TreeSet<>();

public void add(Dish dish) {


menu.add(dish);
}

public void addTable(int capacity) {


availableTables.add(new Table(nbTables,capacity));
nbTables++;
}
}
On se propose d’écrire une application pour gérer les réservations et les commandes d’un restaurant. Notre appli-
cation est composée de plusieurs classes (certaines sont déjà partiellement écrites) :
— Client représente les clients réservant des tables,
— Table représente une table avec un nombre fixe de places,
— Dish représente les plats ou boisson au menu,
— Booking représente une réservation d’un client affectée à une table,
— Room représente la salle, les tables, les réservations et le menu.
On considère les instructions suivantes dans la classe exécutable Main :

public static void main(String[] args) {


Room room = new Room();
Dish piedsPaquets = new Dish("pieds paquets", 18.50);
Dish bouillabaisse = new Dish("bouillabaisse", 35.00);
room.add(piedsEtPaquets);
room.add(bouillabaisse);
room.addTable(4);
room.addTable(2);
room.addTable(2);
Client marius = new Client("Marius");
Client fanny = new Client("Fanny");
// établir le diagramme d'objets à cette ligne
Table fannyTable = room.book(fanny, 2, LocalTime.of(20,0));
Table mariusTable = room.book(marius, 3, LocalTime.of(19,30));
room.addOrder(bouillabaisse, 3, mariusTable);
room.addOrder(piedsPaquets, fannyTable);
room.addOrder(bouillabaisse, fannyTable);
System.out.println(room);
}

2.1 Classes Dish et Room


Compléter les classes Dish et Room dans les scripts fournis (répondre sur la première feuille du sujet).

2.2 Accesseurs
Ajouter des accesseurs pour les propriétés name, price (classe Dish) et capacity (classe Table).

2.3 Diagramme d’objets


Représenter le diagramme des objets au niveau de la ligne commentée de la méthode main. Vous pouvez représenter
les propriétés collections en mettant la liste des références des objets contenus dans la collection entre crochets.

2.4 Méthode toString


Ajouter une méthode toString aux classes Table et Client. Voici des exemples de chaînes obtenus :
Table 3 (4 places)
César

2.5 Diagramme de classe


Nous souhaitons ajouter une classe pour les réservations (bookings). Une réservation est déterminée par : quel client
réserve, à quelle heure le client arrive, combien de places réserver. Une fois le client arrivé, on souhaitera associer à sa
réservation les plats commandés pour pouvoir émettre sa note. Nous voulons donc pouvoir :
— Créer une réservation,
— Ajouter un plat à la commande,
— Obtenir le prix total des plats commandés,
— Émettre l’addition (une chaîne de caractère).
Écrire le diagramme de classe pour la classe Booking, en indiquant bien pour chaque propriété et chaque méthode
les types associés. On représentera l’horaire de réservation avec la classe LocalTime du package java.time.

2.6 Méthode du calcul du prix


Écrire la méthode de la classe Booking calculant la somme due par les clients.

2.7 Gestion des tables


On ajoute à la classe Room la propriété suivante :

private final Map<Table, Booking> bookedTables = new HashMap<>();

2.7.1 Méthode findAppropriateTable


Ajouter une méthode privée à la classe Room, qui étant donné un nombre de personnes, retourne une table disponible
pouvant accueillir ces personnes. Parmi toutes les tables qui conviennent, on en retourne une de capacité minimale. Si
aucun table n’est suffisamment grande, on retourne null.

2.7.2 Méthode book


Écrire dans la classe Room une méthode de signature :

public Table book(Client client, int nbPeople, LocalTime arrivalTime)

qui crée une réservation pour un client, en trouvant une table disponible et la retournant. La table doit être retirée de
la liste des tables disponibles, et être enregistrée dans bookedTables. S’il n’y a pas de tables disponibles, la méthode
retourne null.

2.7.3 Prendre une commande


Ajouter dans la classe Room une méthode addOrder(Dish dish, Table table), permettant d’ajouter un plat à
la liste des commandes d’une table.

2.7.4 Prendre une commande multiple


Il est courant que plusieurs personnes d’une table commandent le même plat. Nous pourrions écrire une autre
méthode de décalaration
public void addOrder(Dish dish, int quantity, Table table)

permettant d’ajouter aux commandes le même plat en plusieurs exemplaires. Quel terme donne-t-on au mécanisme
permettant d’avoir plusieurs méthodes du même nom ?

2.8 Tri des commandes


Lors de l’affichage des commandes d’une table, on souhaite produire la liste des plats triée alphabétiquement.
Décrire précisément les modifications à effectuer pour écrire une méthode dans la classe Bookings permettant de trier
les commandes d’une table.

3 Appendice
Méthodes utiles de
— List : add, remove, size,
— Set : add, remove, contains,
— Map : put, containsKey, get, remove.

Vous aimerez peut-être aussi