Vous êtes sur la page 1sur 6

L2 A : Année universitaire 2014/2015-(Semestre 2) Mai 2015

Examen POO (1h30 mn)

Exercice N°1 :( 7,5 pts) En considérant le graphe de classes suivant, correspondant à une hiérarchie
d’héritage, répondre aux questions suivantes :

B C

D E

Les questions sont indépendantes :


a. Dans quelles classes aurait-il plus de sens d’avoir des membres (attributs ou méthodes) avec le
modificateur protected ? Quelles sont les classes qui peuvent accéder directement aux membres
protected ?

Classe Peut-on avoir des membres avec le Quelles sont les classes qui peuvent accéder
modificateur protected ? (Oui/Non) directement aux membres protected ?
(0,5 pt) (1 pt)
A oui A,B, C, D, E
B non /
C oui C,D , E
D non /
E non /

b. Quelles sont les classes qui peuvent accéder directement aux membres privés de la classe C?

Aucune classe ne peut accéder aux membres private de C. Les membres private de C sont

accessibles directement uniquement dans la classe C. (0,5 pt)

c. Supposons que la classe C contient une méthode abstraite et que nous souhaitons instancier des
objets de cette hiérarchie. Quels sont les classes qui peuvent être abstraites et celles qui peuvent être
concrètes?

Classes Abstraites A, C (0,75 pt)


Classes Concrètes B, D, E (0,75 pt)

1
d. Supposons que la classe A est la seule classe abstraite dans l’hiérarchie. Dire si ce code
fonctionnera ou pas ? (justifier votre réponse)
Code Fonctionne (Oui/Non) Justification
A[] TabA = new A[20]; oui (0,25 pt) - Déclaration et création d’un tableau
d’objet de type A. ce qui est possible
même si A est abstraite. Mais ce n’est
pas possible d’affecter des objets de type
A dans le tableau TabA car A est
abstraite se qui implique non
instanciable. (0,75 pt)
TabA[3] = new D();
- car D n’est pas abstraite et on peut
oui (0,25 pt)
affecter un référent d’objet de type A un
objet de n’importe quelle sous classe
concrète comme D. (0,75 pt)
C[] TabC = new C[20]; oui (0,25 pt) - déclaration et création d’un tableau
d’objet de type C, ce qui est possible.
(0,75 pt)
non(0,25 pt)
TabC [7] = new B();
- c’est une affectation d’un objet de type B
a la septième case du tableau TabC de
type C ce qui va causer une erreur à la
compilation car B n’est pas une sous
classe de C. (0,75 pt)

Exercice N°2 : (2,5 points) Etant donné le programme Java suivant:


public class A {
private int a=0;
public A(int x){
a = x;
}
}
public class B extends A { public class C extends B {
public B(int x){ super(x);} public C(int x){ super(x);}
} }

a. Indiquez ce que signifient les deux instructions suivantes (en d'autres termes, quel est le résultat
de ces instructions)?

2
Instructionj Signification
Déclaration et création d’un objet de type A avec 5 comme valeur du champs a. ( 0,75 pt)
A ob=new A(5)

A[] ob=new A[5] Déclaration et création d’un tableau d’objet de types A de 5 cases. ( 0,75 pt)

b. Indiquer pour chacune des instructions suivantes si elles sont correctes ou non. Dans le cas où
elles produisent des erreurs, précisez le type d’erreur (erreur de compilation ou d'exécution) puis
donnez une solution pour qu'elles ne produisent plus d'erreur (les instructions sont exécutées en
séquence).

Instruction fonctionnement
OK ( 0,25 pt)
B c1 = new C(10);

OK ( 0,25 pt)
A c2 = c1;

Erreur à la compilation on ne peut pas convertir un objet B vers un objet C. ( 0,25 pt)
C c3 = (C)c1; ( 0,25pt)
C c3 = c1;

Exercice N°3 : (11 points)


On désire réaliser un programme permettant de gérer une petite bibliothèque communale. Pour cela
on a analysé qu'on avait besoin d'une classe Bibliotheque, d'une classe Adherent et d'un ensemble
de classes d’Ouvrage permettant de répondre aux critères suivants:
- Les adhérents ont un prénom, un nom (chaîne de caractère les deux) et un matricule unique (nom
concaténer avec un numéro séquentiel).
- La bibliothèque comprend un ensemble d’ouvrages et une liste d’adhérents.
- Les ouvrages sont soit des Revues, soit des Volumes. Les volumes sont soit des Dictionnaires
soit des Livres, soit des BD (Bandes Dessiner).
- Les ouvrages sont caractérisés par un titre (chaîne de caractères) et un code (un entier) qui
l’identifie de façon unique. Les volumes ont en plus un auteur (chaîne). Les BD ont en plus un nom
de dessinateur (chaîne de caractères), les revues ont en plus une périodicité (chaîne de caractères).
- Seuls les livres sont empruntables.
- Les adhérents peuvent emprunter des livres (et uniquement des livres) et on doit pouvoir savoir à
tout moment quels sont les livres empruntés par quels adhérents et quels sont les livres qu'un
adhérent a emprunté.
Question 1: Faire le diagramme de classe (sans spécifier les champs et les méthodes) permettant de
modéliser cette bibliothèque en précisant les types de relation (héritage ou composition). (0,5 pt)

3
C Ouvrage
Bibliotheque
H H
C
Volume Revue

Adherent H
H
C H

Livre BD Dictionnaire

Question 2: Ecrire, en respectant le principe d'encapsulation, le code java des différentes classes.
(Total de la question 2= 6 pts)
public class Bibliotheque { (0,5 pt)
private Ouvrage[] tab_ouvrage=new Ouvrage[100];
private int nb_ouvrage=0;
private Adherent[] tab_Adherent=new Adherent[500];
private int nb_Adherent=0;
}
public class Adherent { (1,5 pt)
private final String prenom;
private final String nom;
private final String matricule;
private Livre[] livre_emprt=new Livre[5];
private int nb_livre=0;
public static int n=0;
public Adherent(String prenom,String nom){
this.nom=nom;
this.prenom=prenom;
n++;
matricule=nom+n;
}
}
public abstract class Ouvrage {(1 pt)
private final String titre;
private final int code;
private static int n=0;
public Ouvrage (String titre){
this.titre=titre;
code=++n;
}
}
public class Revue extends Ouvrage{(0,75 pt)
private final String periode;
public Revue (String titre,String periode){
super(titre);
this.periode=periode;
}
}
public abstract class Volume extends Ouvrage{(0,75 pt)
private final String auteur;
public Volume(String titre,String auteur){
super(titre);

4
this.auteur=auteur;
}
}
public class Dictionnaires extends Volume{ (0,5 pt)
public Dictionnaires(String titre,String auteur){
super(titre,auteur);
}
}
public class BD extends Volume{(0,5 pt)
private final String nom_dessinateur;
public BD(String titre, String auteur,String nom_dessinateur){
super(titre,auteur);
this.nom_dessinateur=nom_dessinateur;
}
}
public class Livre extends Volume{(0,5 pt)
public Livre(String titre,String auteur){
super(titre,auteur);
}
}
Question 3:On veut ajouter un ensemble de méthodes permettant de gérer cette bibliothèque.
a. Donnez le code des méthodes permettant de gérer l'emprunt et le rendu d'un livre. Dans la classe
Adherent, ces méthodes sont définies ainsi:
void emprunter(Livre l)
void rendre(Livre l)
public void emprunter(Livre l){ (0,5 pt)
if (nb_livre<livre_emprt.length){
livre_emprt[nb_livre++]=l;
}
else System.out.println("Dépacement ");

}
public void rendre(Livre l){ (1 pt)
if (nb_livre>=1){
int i=0;
while ((i<nb_livre)&&(!(livre_emprt[i].equals(l))))i++;
if(livre_emprt[i].equals(l)){
for(int j=i;j<nb_livre;j++){
livre_emprt[i]=livre_emprt[j];
i++;
}
nb_livre--;

}
}
}
Note: vous pouvez être amené à ajouter d'autres méthodes (dans Adherent ou dans d'autres classes)
pour pouvoir décrire ces méthodes. Donnez alors le code de ces méthodes.
les autres méthodes nécessaires :
Dans la classe Ouvrage (0,25 * par getteur =0,5 pt)
public String gettitre(){
return titre;
}
public int getcode(){
return code;
}

Dans la classe Volume (0,25 pt)


public String getauteur(){

5
return auteur;
}

Dans la classe livre (0,5 pt)


public boolean equals(Livre l){
return
((this.gettitre()==l.gettitre())&&(this.getauteur()==l.getauteur())&&(this.getcode()==l
.getcode()));
}

b. Dans la classe Bibliotheque, donnez le code de la méthode Ouvrage[] chercherOuvrage(String


str) qui retourne, sous la forme d'un tableau d’ouvrage, tous les ouvrages dont le titre contient la
chaîne str. La taille du tableau d’ouvrage correspond au nombre d’ouvrages trouvés.
Note: La méthode indexOf(String str) de la classe String retourne l'indice de la première
occurrence de la sous-chaîne str dans la chaîne courante, et –1 si str n'est pas une sous-chaîne de la
chaîne courante.
String str = "ceci est un string";
int indice = str.indexOf(“ci”); // indice = 2.
indice = str.indexOf(“bb”); //la sous chaine “bb” n’existe pas dans la chaine str donc indice = -1.
public Ouvrage[] chercherOuvrage(String str){ (2 pt)
int j=0;
for(int i=0;i<nb_ouvrage;i++){
if (tab_ouvrage[i].gettitre().indexOf(str)!=-1){
//tab[j]=tab_ouvrage[i];
j++;
}
}
Ouvrage[] tab=new Ouvrage[j];
j=0;
for(int i=0;i<nb_ouvrage;i++){
if (tab_ouvrage[i].gettitre().indexOf(str)!=-1){
tab[j]=tab_ouvrage[i];
j++;
}
}
return tab;
}