Université Moulay Ismaïl 2021-2022
Durée : 2h
ENSAM – Meknès S2 / 3 ième Année / TC
Examen Programmation Orienté Objet
Java
Instructions :
• Aucun document n’est autorisé.
• Il est strictement interdit d’échanger du matériels (blanco, stylo…) entre étudiants lors de l’examen.
• Aucune question n’est autorisée.
• Vous devez répondre aux exercices de cet énoncé dans la feuille A3.
• Une note de zéro sera attribuée à la feuille qui ne contient pas : nom ou prénom ou code ENSAM.
• Un point est réservé à la clarté et l’indentation du code source.
Note : [Link]() peut être replacée par sysout() dans vos réponses.
Exercice 1 :
La classe Car modélise l’état et le comportement de voitures autonomes virtuelles. Chaque voiture correspond
à un objet qui est une instance à cette classe.
Chaque Car :
• a un designation (chaîne de caractères).
• a une position : donnée par les attributs entiers x et y, sachant que x augmente en allant vers l’Est et y
augmente en allant vers le Nord.
• a une destination : donnée par l’attribut direction qui prend une des valeurs "Nord", "Est", "Sud" ou
"Ouest".
• Peut parcourue une distance d’un pas : avec la méthode sans paramètres mobile().
• Peut tourner à droite de 90° pour changer de direction (si sa direction était "Nord" elle devient "Est", si
c’était "Est" elle devient "Sud", etc.) : avec la méthode sans paramètres right(). Les voitures ne
peuvent pas tourner à gauche.
• Peut afficher son état en détails (avec de simple [Link]()).
La désignation, la position et la destination d’une voiture lui sont donnés au moment de sa création. La
désignation est obligatoire mais on peut ne pas spécifier la position et la destination, qui sont définis par défaut
(0,0) et "Est".
1. Écrire les instructions qui permettent de définir la classe Car avec tous les constructeurs possibles, en
respectant les principes de l’encapsulation.
2. On veut améliorer ces voitures en créant une Nouvelle Génération, les CarNG qui ne remplacent pas
les anciennes voitures mais peuvent cohabiter avec eux.
Les CarNG savent faire la même chose, mais aussi :
• Avancer d’une distance en une seule fois (i.e. plusieurs pas) grâce à la méthode mobile()
qui prend en paramètre la distance parcourue.
• Tourner à gauche de 90° grâce à la méthode left().
• Faire un demi-tour grâce à la méthode halfturn().
Ecrire cette nouvelle classe en spécialisant celle de la première question, sans modifier celle-ci :
a- Les nouvelles méthodes appellent les anciennes méthodes pour implémenter le nouveau
comportement : avancer d’une distance se fait en avançant de 1 pas n fois, "tourner à gauche"
se fait en tournant 3 fois à droite, faire demi-tour se fait en tournant 2 fois.
POO Java 1 /4 ENSAM-Meknès
b- Solution plus efficace qui change directement l’état de l’objet sans faire appel aux anciennes
méthodes.
3. On veut mettre ensemble dans un tableau des objets de type Car et de type CarNG.
1- Comment déclarer un tableau de type Car et CarNG?
2- Comment afficher l’état de tous les voitures contenues dans le tableau?
4. Modifier la classe CarNG pour activer un mode "Turbo" et le désactiver. Dans ce mode chaque pas
est multiplié par 3. L’appel à la méthode afficher() devra indiquer à la fin si la voiture est en
mode Turbo ou pas.
5. Pour des besoins de reporting, on crée un fichier "car_all.txt", stocké dans l’arborescence de la
machine (partition C) rempli avec le contenu suivant (les noms des voitures) :
Travail à faire :
Écrire un programme java qui lit le fichier "car_all.txt" et écrit les noms contenant "NG" dans un
fichier séparé nommé "car_NG.txt" et les autres dans un autre fichier séparé nommé "[Link]".
POO Java 2 /4 ENSAM-Meknès
Exercice 1 :
Solution de l’exercice 1
Nord
y+1
Ouest x Est
x-1 y x+1
Sud
y-1
Question 1 :
public class Car {
public String designation;
public int x;
public int y;
public String direction;
// Constructeur avec désignation obligatoire
public Car(String designation) {
[Link] = designation;
this.x = 0;
this.y = 0;
[Link] = "Est";
}
// Méthode mobile pour déplacer la voiture d'un pas (avec 1)
public void mobile() {
if ([Link]("Nord")) {
y++;
} else if ([Link]("Est")) {
x++;
} else if ([Link]("Sud")) {
y--;
} else if ([Link]("Ouest")) {
x--;
}
}
// Méthode pour tourner à droite de 90°
public void right() {
if ([Link]("Nord")) {
direction = "Est";
} else if ([Link]("Est")) {
direction = "Sud";
} else if ([Link]("Sud")) {
direction = "Ouest";
} else if ([Link]("Ouest")) {
direction = "Nord";
}
}
// Méthode pour afficher l'état de la voiture
public void afficHeEtat() {
[Link]("Voiture : " + designation);
[Link]("Position : (" + x + ", " + y + ")");
[Link]("Direction : " + direction);
}
}
POO Java 3 /4 ENSAM-Meknès
Question 2.a :
public class CarNG extends Car {
// Constructeur avec désignation obligatoire
public CarNG(String designation) {
super(designation);
}
// Méthode pour avancer d'une distance donnée
public void mobile(int distance) {
for (int i = 0; i < distance; i++) {
[Link]();
}
}
// Méthode pour tourner à gauche en tournant trois fois à droite
public void left() {
[Link]();
[Link]();
[Link]();
}
// Méthode pour faire un demi-tour en tournant deux fois à droite
public void halfturn() {
[Link]();
[Link]();
}
// Méthode pour avancer d'une distance donnée
public void mobile(int distance) {
if ([Link]("Nord")) {
x += distance;
} else if ([Link]("Est")) {
y += distance;
} else if ([Link]("Sud")) {
y -= distance;
} else if ([Link]("Ouest")) {
x -= distance;
}
}
// Méthode main pour tester la classe CarNG
public static void main(String[] args) {
CarNG carNG1 = new CarNG("VoitureNG1");
[Link]();
[Link](3);
[Link]();
[Link](2);
[Link]();
[Link]();
}
}
POO Java 4 /4 ENSAM-Meknès
Question 2.b :
// Méthode pour tourner à gauche en changeant directement la direction
public void left() {
if ([Link]("Nord")) {
direction = "Ouest";
} else if ([Link]("Est")) {
direction = "Nord";
} else if ([Link]("Sud")) {
direction = "Est";
} else if ([Link]("Ouest")) {
direction = "Sud";
}
}
// Méthode pour faire un demi-tour en changeant directement la direction
public void halfturn() {
if ([Link]("Nord")) {
direction = "Sud";
} else if ([Link]("Est")) {
direction = "Ouest";
} else if ([Link]("Sud")) {
direction = "Nord";
} else if ([Link]("Ouest")) {
direction = "Est";
}
}
Question 3.1:
//par exemple déclarer un tableau T de 5 éléments
Car TabVoiture[] =new Car[5];
TabVoiture[0]=new Car("voiture 1");
TabVoiture[1]=new Car("voiture 2");
TabVoiture[2]=new CarNG("voiture ng1");
TabVoiture[3]=new CarNG("voiture ng2");
TabVoiture[4]=new Car("voiture 2");
Question 3.2 :
// pour afficher l’état des voitures de son contenu
for (Car voiture :T)
[Link]();
POO Java 5 /4 ENSAM-Meknès
Question 4 :
public class CarNG extends Car {
private boolean turboMode;
// Constructeur avec désignation obligatoire
public CarNG(String designation) {
super(designation);
turboMode = false;
}
// Méthode pour activer le mode Turbo
public void enableTurboMode() {
turboMode = true;
}
// Méthode pour désactiver le mode Turbo
public void disableTurboMode() {
turboMode = false;
}
// Méthode pour avancer d'une distance donnée, en prenant en mode Turbo
public void mobile(int distance) {
int step = turboMode ? 3 : 1; // si trubo alors step=3 sinon 1
for (int i = 0; i < distance; i++) {
[Link]();
for (int j = 0; j < step - 1; j++) {
[Link]();
}
}
}
// Méthode pour tourner à gauche en changeant directement la direction
public void left() {
// pas de changement
}
// Méthode pour faire un demi-tour en changeant directement la direction
public void halfturn() {
// pas de changement
}
// Méthode pour afficher l'état de la voiture avec l'indication du mode Turbo
public void afficHeEtat() {
[Link]();
if (turboMode) {
[Link]("Mode Turbo activé");
} else {
[Link]("Mode Turbo désactivé");
}
}
POO Java 6 /4 ENSAM-Meknès
Examen Programmation Oriente Object JAVA
Duré de Réalisation 30 min
Exercice 1 : (7 points)
1. Donner le code de la classe Etudiant défini par les champs nom, prénom, code et note. Il faut indiquer
correctement les types des champs, les niveaux de visibilités, les constructeurs et les autres éléments
indispensables. (2 points)
public class Etudiant {
private String nom;
private String prénom;
private int code;
private double note;
// Constructeur par défaut
public Etudiant() {
}
// Constructeur avec tous les champs
public Etudiant(String nom, String prénom, int code, double note) {
[Link] = nom;
[Link]énom = prénom;
[Link] = code;
[Link] = note;
}
// Accesseurs (getters) pour chaque champ
public String getNom() {
return nom;
}
public String getPrénom() {
return prénom;
}
public int getCode() {
return code;
}
public double getNote() {
return note;
}
// Mutateurs (setters) pour chaque champ
public void setNom(String nom) {
[Link] = nom;
}
public void setPrénom(String prénom) {
[Link]énom = prénom;
}
public void setCode(int code) {
[Link] = code;
}
public void setNote(double note) {
[Link] = note;
}
POO Java 7 /4 ENSAM-Meknès
2. Donner le code java qui permet de créer un tableau nommé « tab » contenant 4 objets de types
étudiants qu’il faut instancier de votre choix. (2 points)
// Création du tableau "tab" pouvant contenir 4 objets de type "Etudiant"
Etudiant[] tab = new Etudiant[4];
// Instanciation des objets Etudiant et assignation au tableau
tab[0] = new Etudiant("Nom1", "Prenom1", 1, 10);
tab[1] = new Etudiant("Nom2", "Prenom2", 2, 19);
tab[2] = new Etudiant("Nom3", "Prenom3", 3, 8.5);
tab[3] = new Etudiant("Nom4", "Prenom4", 4, 13.75);
3. Donner le code source de la fonction rechercher qui permet de chercher un étudiant dans un tableau
via son code et de retourner null s’il est introuvable. (2 points)
public Etudiant rechercher(Etudiant[] tab, int code) {
for (Etudiant etudiant : tab) {
if ([Link]() == code) {
return etudiant;
}
}
return null; // Retourne null si l'étudiant n'est pas trouvé
}
4. Donner le code source de la fonction tri qui permet de trie un tableau d’étudiant en fonction de la
note, cette fonction retourne le tableau trié. (3 points)
//fonction de tri d'un tableau ( tri par sélection)
public static Etudiant[] tri(Etudiant[] tab) {
int n = [Link];
for (int i = 0; i < n - 1; i++) {
int indiceMin = i;
for (int j = i + 1; j < n; j++) {
if (tab[j].getNote() < tab[indiceMin].getNote()) {
indiceMin = j;
}
}
// Échange des positions de l'étudiant à l'indice i avec l'étudiant
ayant la note minimale
Etudiant temp = tab[i];
tab[i] = tab[indiceMin];
tab[indiceMin] = temp;
}
return tab; // Retourne le tableau trié
}
POO Java 8 /4 ENSAM-Meknès