Vous êtes sur la page 1sur 67

Devoir Surveillé

Programmation Orientée Objet


Novembre 2017
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI, Durée: 1h
Barème: 6+14 Nb. Pages: 2
NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.
Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte un problème détaillé et .. questions QCM.

Questions (6pts)
Expliquer brièvement et si nécessaire avec un exemple les 4 termes suivants:
(1) final (attribut), (2) final (class), (3) static (attribut), (4) static (méthode).

public class Somme{ public class Test{ Les questions:


public static int add(int i, int j){ public static void main (String [] args){ a) Quelles sont les valeurs
i= i*i; int a=4, b=4; affichées de a et s.
return i+j ; } } int s= Somme.add(a, b); b) le passage de paramètre dans
System.out.println(a); la méthode add(int i, int j) est dit
System.out.println(s); } } par valeur ou par référence?
Pourquoi?

Problème: (14 points)


Pour bien gérer ses ressources humaines et leur paiement mensuel, le directeur d'une
clinique décide mettre un programme écrit à l'aide du langage Java.
Les personnels initialement sont des infirmiers et des médecins.
Soit le diagramme de classe suivant:
Salaire
Operation Vector vect
int codeOperation ajouterMed( Medecin med)
float prime ajouterInf(Infirmier inf)
Operation(int codeOperation calculTotSalaire()
,float prime)

Medecin Infirmier
int numMed int numInf
String nom String nom
static int nbMed float salaireBaseInf
float salaireBaseMed int nbHeureSup
Operation[] tabOperations float primeHeureSup
Medecin(…) Infirmier(…)
ajouterOperation(Operation op) calculSalaire()
calculSalaire()

 Toutes les classes et les méthodes sont publiques et tous les attributs sont privés.
 L'attribut tabOperations de la classe Medecin est un tableau d'opération pour stocker
les opérations effectuées par un médecin.
 L'attribut vect de la classe Salaire est un vecteur pour stocker des objets de type
Medecin ou Infirmier.

1/2
Partie1: ..pts=(….)

1. Donner la structure de la classe : public class Operation { …}


- L'attribut "prime", c'est la prime que doit etrepayée au médecin qui réalise cette
opération chirurgienne.
2. Donner la structure de la classe : public class Infirmier { …}:
- Pour calculer le salaire d'un Infirmier, juste on retourne (le salaire de base +
(nbHeureSup* primeHeureSup)).
3. Donner la structure de la classe : public class Medecin { …}
- Donner un constructeur qui prend parmi les paramètres un tableau d'opérations.
- La méthode "ajouterOperation(Operation op)" permet d'ajouter une opération
passée en paramètre à la table d'opération "tabOperations"
- La méthode " calculSalaire()" permet de calculer le salaire d'un Médecin où on retourne
(le salaire de base + la somme des primes de toutes ses opérations réalisées).
4. Donner la structure de la classe : public class Salaire { …}
- Les méthodes ajouterMed( Medecin med) et ajouterInf(Infirmier inf) permettent
respectivement d'ajouter un médecin et un infirmier au vecteur vect.
- La méthode calculTotSalaire() permet de retourner le total à payer des objets
contenant dans le vecteur.

Partie2: ..pts = …

Dans le programme principal:


puclic class TestPrincipale{
public static void main( String [] args){
Operation[] tabOp = new Operation[10];

// à compléter
}
}
5. Créer les objets suivants:

Matricule Nom Salaire de nbHeureSup primeHeureSup


Infirmier Base
20 Stéphanie 600 10 4

Nb: Pour le médecin suivant, on passe un tableau d'opérations en paramètres.


Matricule Nom Salaire Opérations
de Base réalisées
Medecin 30 Mounir 1200 Op1(1, 500)
Op2(2, 1300)

6. Créer un objet sal de type Salaire et y ajouter l'infirmier et le médecin.


7. Afficher le total à payer aux personnels concernés.

2/2
Corrigé par Mounir RIAHI; ISET'COM

Devoir Surveillé
Programmation Orientée Objet
Novembre 2017
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI, Ridha SALHI Durée: 1h
Barème: 6+14 Nb. Pages: 2
NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.
Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte des questions et un problème détaillé.

Questions (6pts)
Expliquer brièvement et si nécessaire avec un exemple les 4 termes suivants:
(1) final (attribut), (2) final (class), (3) static (attribut), (4) static (méthode).

public class Somme{ public class Test{ Les questions:


public static int add(int i, int j){ public static void main (String [] args){ a) Quelles sont les valeurs
i= i*i; int a=4, b=4; affichées de a et s.
return i+j ; } } int s= Somme.add(a, b); b) le passage de paramètre dans
System.out.println(a); la méthode add(int i, int j) est dit
System.out.println(s); } } par valeur ou par référence?
Pourquoi?

Problème: (14 points)


Pour bien gérer ses ressources humaines et leur paiement mensuel, le directeur d'une
clinique décide mettre un programme écrit à l'aide du langage Java.
Les personnels initialement sont des infirmiers et des médecins.
Soit le diagramme de classe suivant:
Salaire
Operation Vector vect
int codeOperation ajouterMed( Medecin med)
float prime ajouterInf(Infirmier inf)
Operation(int codeOperation calculTotSalaire()
,float prime)

Medecin Infirmier
int numMed int numInf
String nom String nom
static int nbMed float salaireBaseInf
float salaireBaseMed int nbHeureSup
Operation[] tabOperations float primeHeureSup
Medecin(…) Infirmier(…)
ajouterOperation(Operation op) calculSalaire()
calculSalaire()

 Toutes les classes et les méthodes sont publiques et tous les attributs sont privés.
 L'attribut tabOperations de la classe Medecin est un tableau d'opération pour stocker
les opérations effectuées par un médecin.
 L'attribut vect de la classe Salaire est un vecteur pour stocker des objets de type
Medecin ou Infirmier.

1/4
Corrigé par Mounir RIAHI; ISET'COM
Partie1:

1. Donner la structure de la classe : public class Operation { …}


- L'attribut "prime", c'est la prime que doit etrepayée au médecin qui réalise cette
opération chirurgienne.
2. Donner la structure de la classe : public class Infirmier { …}:
- Pour calculer le salaire d'un Infirmier, juste on retourne (le salaire de base +
(nbHeureSup* primeHeureSup)).
3. Donner la structure de la classe : public class Medecin { …}
- Donner un constructeur qui prend parmi les paramètres un tableau d'opérations.
- La méthode "ajouterOperation(Operation op)" permet d'ajouter une opération
passée en paramètre à la table d'opération "tabOperations"
- La méthode " calculSalaire()" permet de calculer le salaire d'un Médecin où on retourne
(le salaire de base + la somme des primes de toutes ses opérations réalisées).
4. Donner la structure de la classe : public class Salaire { …}
- Les méthodes ajouterMed( Medecin med) et ajouterInf(Infirmier inf) permettent
respectivement d'ajouter un médecin et un infirmier au vecteur vect.
- La méthode calculTotSalaire() permet de retourner le total à payer des objets
contenant dans le vecteur.

Partie2:

Dans le programme principal:


puclic class TestPrincipale{
public static void main( String [] args){
Operation[] tabOp = new Operation[10];

// à compléter
}
}
5. Créer les objets suivants:

Matricule Nom Salaire de nbHeureSup primeHeureSup


Infirmier Base
20 Stéphanie 600 10 4

Nb: Pour le médecin suivant, on passe un tableau d'opérations en paramètres.


Matricule Nom Salaire Opérations
de Base réalisées
Medecin 30 Stéphane 1200 Op1(1, 500)
Op2(2, 1300)

6. Ajouter une nouvelle opération (num=3, prime=700) au médecin.


7. Créer un objet sal de type Salaire et y ajouter l'infirmier et le médecin.
8. Afficher le total à payer aux personnels concernés.

2/4
Corrigé par Mounir RIAHI; ISET'COM
Expliquer brièvement et si nécessaire avec un exemple les 4 termes suivants:
(1) final (attribut) : pour désigner une constante. Ex: final int MAX=100;
(2) final (class): pour interdire l'héritage de cette classe.
(3) static (attribut): un attribut partagé entre les objets de la même classe.
(4) static (méthode): on peut l'appeler sans instancier la classe; NomClasse.methode().

public class Somme{ public class Test{ Les questions:


public static int add(int i, int j){ public static void main (String [] args){ a) les valeurs affichées: a=4 et
i= i*i; int a=4, b=4;
return i+j ; } } int s= Somme.add(a, b);
s=20.
System.out.println(a); b) le passage de paramètre dans
System.out.println(s); } } la méthode add(int i, int j) est dit
par valeur car les paramètre
sont de type primitif.

public class Operation { public class Infirmier {

private int codeOperation; private int numInf;


private float prime; private String nom;
private Operation(int codeOperation, float private float salaireBaseInf;
prime) { private int nbHeureSup;
super(); private float primeHeureSup;
this.codeOperation = codeOperation;
this.prime = prime; public Infirmier(int numInf, String nom,
} float salaireBaseInf, int nbHeureSup, float
public int getCodeOperation() { primeHeureSup) {
return codeOperation; super();
} this.numInf = numInf;
public void setCodeOperation(int this.nom = nom;
codeOperation) { this.salaireBaseInf = salaireBaseInf;
this.codeOperation = codeOperation; this.nbHeureSup = nbHeureSup;
} this.primeHeureSup = primeHeureSup;
public float getPrime() { }
return prime; public int getNumInf() {
} return numInf;
public void setPrime(float prime) { }
this.prime = prime; public void setNumInf(int numInf) {
} } this.numInf = numInf;}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public float getSalaireBaseInf() {
return salaireBaseInf;
}
public void setSalaireBaseInf(float
salaireBaseInf) {
this.salaireBaseInf = salaireBaseInf;
}
public int getNbHeureSup() {
return nbHeureSup;
}
public void setNbHeureSup(int nbHeureSup) {
this.nbHeureSup = nbHeureSup;
}
public float getPrimeHeureSup() {
return primeHeureSup;
}
public void setPrimeHeureSup(float
primeHeureSup) {
this.primeHeureSup = primeHeureSup;
}
////////////
public float calculSalaireInf() {
return (salaireBaseInf + (nbHeureSup*
primeHeureSup));
}
}

3/4
Corrigé par Mounir RIAHI; ISET'COM
public class Medecin {
private int numMed; import java.util.*;
private String nom; public class Salaire {
private static int nbMed; private Vector vect = new Vector();
private float salaireBaseMed;
private Operation[] tabOperations = new public Salaire() {
Operation[10]; }
public Salaire(Vector vect) {
public Medecin(int numMed, String nom, float this.vect = vect;
salaireBaseMed, Operation[] tabOperations) { }
this.numMed = numMed; public Vector getVect() {
this.nom = nom; return vect;
this.salaireBaseMed = salaireBaseMed; }
this.tabOperations = tabOperations; public void setVect(Vector vect) {
this.numMed++ ; this.vect = vect;
} }
public int getNumMed() { public void ajouterMed( Medecin med) {
return numMed; vect.addElement(med);
} }
public String getNom() { public void ajouterInf(Infirmier inf) {
return nom; vect.addElement(inf);
} }
public void setNom(String nom) { public float calculTotSalaire() {
this.nom = nom; float tot=0; int i;
} for( i=0; i< vect.size(); i++) {
public static int getNbMed() { if
return nbMed; (vect.elementAt(i).getClass().getName().equals("Medecin"))
} {
public static void setNbMed(int nbMed) { tot+= ((Medecin) vect.elementAt(i)).calculSalaireMed();
Medecin.nbMed = nbMed; }
} else
public float getSalaireBaseMed() { tot+= ((Infirmier) vect.elementAt(i)).calculSalaireInf();
return salaireBaseMed; }
} return tot;
public void setSalaireBaseMed(float } }
salaireBaseMed) { public class TestPrincipale {
this.salaireBaseMed = salaireBaseMed; public static void main(String[] args) {
} Operation[] tabOp = new Operation[10];
public Operation[] getTabOperations() {
return tabOperations; Infirmier inf1 =new Infirmier(20,"Stéphanie1",600,10,4);
} //Infirmier inf2 =new Infirmier(40,"Stéphanie2",10,1,4);
public void setTabOperations(Operation[] tabOp[0]= new Operation(1, 500);
tabOperations) { tabOp[0]= new Operation(2, 1300);
this.tabOperations = tabOperations; Medecin med =new Medecin(30,"Stéphane",1200,tabOp);
}
med.ajouterOperation(new Operation(3, 700));
////////// ////////
public void ajouterOperation(Operation op) { Salaire sal =new Salaire();
int i; sal.ajouterInf(inf1);
for( i =0; i< tabOperations.length; i++) { sal.ajouterMed(med);
if (tabOperations[i] == null) //sal.ajouterInf(inf2);
break ;
} System.out.println(sal.calculTotSalaire());
if (i< tabOperations.length) } }
tabOperations[i] = op;
}
////////// ////////
public float calculSalaireMed() {
float tot=0;
for(int i=0; i< tabOperations.length ; i++) {
// System.out.println("i"+i);
if ( tabOperations[i] != null)
tot += tabOperations[i].getPrime();
}
return tot+ salaireBaseMed;
} }

4/4
Programmation Orientée Objet
Devoir Surveillé

Filière: STIC-L2 Documents: non autorises


Enseignants: Mounir RIAHI, Imen ABIDI , Laila MELKI Durée: 1h
Barème: 6-14 Nb. Pages:2

NB: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traites dans n’importe quel ordre.

Questions de cours:
Expliquer brièvement par une définition et un exemple les mots clés suivants:

Sucharge public Abstract (classe)


void private Protected (attribute)

Problème:

Une entreprise veut mettre un programme pour gérer ses voitures et ses clients.
Un client peut avoir plusieurs voitures. En effet, elle a disposé une classe Voiture et une
classe Client.

Partie1:
public class Voiture{

private String marque;


private String modele;
private String couleur;
private float prix;
private boolean flagVendu; // false pour indiquer que la voiture n’est pas encore vendue et
true sinon.
public voiture(// à compléter){ // à compléter}
public void voitureVendue(){// à compléter };

1. Compléter un constructeur Voiture qui remplit tous les paramétres


2. Développer la méthode public void voitureVendue pour indiquer que la voiture est vendue

Partie2:
public class Client{
private int numClient;
private String nomClient;
private Voiture[] tabVoitures // Il contient l’ensemle des voitures achetés par un client donné
static int nbClients=0;

1
1. Expliquer le rôle de l’instruction “static int nbClients;”.
2. a/ Développer une méthode statique qui affiche le nombre de clients.
b/ ce quoi le rôle dune méthode statique.

3. Donner un premier constructeur Client qui prend en paramètres numClient et nomClient.


4. Donner un deuxième constructeur Client qui prend en paramètres numClient, nomClient
et un objet de type Voiture.
5. Ecrire la méthode ajoutVoiture qui permet d’ajouter une voiture donnée à un client.
public void ajoutVoiture ( Voiture v){ // à compléter }
6. Donner la méthode qui permet d’afficher la liste des voitures d’un client donné.
public void afficheListeVoitures(){// à compléter }

Partie3:
Dans le programme principal

puclic class Test{


public static void main( String [] args){
// à compléter
}
}

1. Créer les voitures suivantes par le constructeur défini dans la partie 1 question 1:

Voiture Marque Modèle Couleur Prix flagVendu


1 Peugeot 308 noire 35.000 false
2 Renault classique blanche 25.000 false
3 Kia x grise 30.000 false
4 Citroen C5 beige 35.000 false

2. Créer les clients suivants par les constructeurs définis dans les questions 3 et 4 de la
partie 2 :

NumClient NomClient tabVoitures


1 Mohamed -
2 Samia -
3 Ali V3
4 Raja V4

3. Donner les voitures v1 et v2 au client 1 en utilisant la méthode définie dans la


question 5 de la partie 2.
4. Afficher la liste des voitures du client 1 en utilisant la méthode définie dans la
question 6 de la partie 2.

2
Correction: Mounir RIAHI

Programmation Orientée Objet


Devoir Surveillé

Filière: STIC-L2 Documents: non autorises


Enseignants: Mounir RIAHI, Imen ABIDI , Laila MELKI Durée: 1h
Barème: 6-14 Nb. Pages:2

NB: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traites dans n’importe quel ordre.

Questions de cours:
Expliquer brièvement par une définition et un exemple les mots clés suivants:

Sucharge public Abstract (classe)


void private Protected (attribute)

Problème:

Une entreprise veut mettre un programme pour gérer ses voitures et ses clients.
Un client peut avoir plusieurs voitures. En effet, elle a disposé une classe Voiture et une
classe Client.

Partie1:
public class Voiture{

private String marque;


private String modele;
private String couleur;
private float prix;
private boolean flagVendu; // false pour indiquer que la voiture n’est pas encore vendue et
true sinon.
public voiture(// à compléter){ // à compléter}
public void voitureVendue(){// à compléter };

1. Compléter un constructeur Voiture qui remplit tous les paramétres


2. Développer la méthode public void voitureVendue pour indiquer que la voiture est vendue

Partie2:
public class Client{
private int numClient;
private String nomClient;
private Voiture[] tabVoitures // Il contient l’ensemle des voitures achetés par un client donné
static int nbClients=0;

1
Correction: Mounir RIAHI
}

1. Expliquer le rôle de l’instruction “static int nbClients;”.


2. a/ Développer une méthode statique qui affiche le nombre de clients.
b/ ce quoi le rôle dune méthode statique.

3. Donner un premier constructeur Client qui prend en paramètres numClient et nomClient.


4. Donner un deuxième constructeur Client qui prend en paramètres numClient, nomClient
et un objet de type Voiture.
5. Ecrire la méthode ajoutVoiture qui permet d’ajouter une voiture donnée à un client.
public void ajoutVoiture ( Voiture v){ // à compléter }
6. Donner la méthode qui permet d’afficher la liste des voitures d’un client donné.
public void afficheListeVoitures(){// à compléter }

Partie3:
Dans le programme principal

puclic class Test{


public static void main( String [] args){
// à compléter
}
}

1. Créer les voitures suivantes par le constructeur défini dans la partie 1 question 1:

Voiture Marque Modèle Couleur Prix flagVendu


1 Peugeot 308 noire 35.000 false
2 Renault classique blanche 25.000 false
3 Kia x grise 30.000 false
4 Citroen C5 beige 35.000 false

2. Créer les clients suivants par les constructeurs définis dans les questions 3 et 4 de la
partie 2 :

NumClient NomClient tabVoitures


1 Mohamed -
2 Samia -
3 Ali V3
4 Raja V4

3. Donner les voitures v1 et v2 au client 1 en utilisant la méthode définie dans la


question 5 de la partie 2.
4. Afficher la liste des voitures du client 1 en utilisant la méthode définie dans la
question 6 de la partie 2.

2
Correction: Mounir RIAHI

Public: La classe est accessible partout


Abstract (classe) : la classe contient une ou des méthodes abstraites, qui n'ont pas de
définition explicite. Une classe déclarée abstract ne peut pas être instanciée : il faut définir
une classe qui hérite de cette classe et qui implémente les méthodes nécessaires pour ne
plus être abstraite.
Protected (attribute) :
private: L’accès à un membre privé est limité à la classe de ce membre
void: lorsque une méthode ne retourne rien.
Surcharge: Plusieurs méthodes peuvent porter le même nom dans une même classe mais doivent
différer par le nombre des arguments, ou par le type des arguments.
Problème:
Partie1:
public class Voiture{
private String marque;
private String modele;
private String couleur;
private float prix;
private boolean flagVendu;
public Voiture(String marque,String modele,String couleur,float prix,boolean flagVendu ){
this. marque= marque;
this. modele= modele;
this. couleur= couleur;
this. prix= prix;
this. flagVendu= flagVendu; }
public void voitureVendue(){
flagVendu = true; } }
Partie2:
public class Client{
private int numClient;
private String nomClient;
private Voiture[] tabVoitures // Il contient l’ensemle des voitures achetés par un client donné
static int nbClients=0;
}
1. “static int nbClients;” est attribut partager par tous les instances de la classe.
2. a/ static void afficheNombreClient(){
System.out.println("nbClients "); }
b/ on peut appeler une méthode statique sans instancier une classe "NomClasse.membre".
3. Donner un premier constructeur Client qui prend en paramètres numClient et nomClient.
public Client(int numClient, String nomClient){
this. numClient= numClient;
this. nomClient= nomClient; }
4. Donner un deuxième constructeur Client qui prend en paramètres numClient, nomClient et
un objet de type Voiture.
public Client(int numClient, String nomClient, Voiture v// Voiture[] tabVoitures){
this. numClient= numClient;
this. nomClient= nomClient;
tabVoitures[0]=v; // this. tabVoitures= tabVoitures;
}
5. Ecrire la méthode ajoutVoiture qui permet d’ajouter une voiture donnée à un client.
public void ajoutVoiture ( Voiture v){
for(int i =0; i< tabVoitures.legth, i++) {

3
Correction: Mounir RIAHI
if (tabVoitures [i] = = null)
break ;
}
if (i< tabVoitures.legth)
tabVoitures [i] = v;
}
6. Donner la méthode qui permet d’afficher la liste des voitures d’un client donné.
public void afficheListeVoitures(){
for (int i=0; i< this. tabVoitures .length;i++)
System.out.println(this. tabVoitures[i].getMarque() +“ “+this.tabVoitures[i]. getmodele());
}
Partie3:
1. Créer les voitures suivantes par le constructeur défini dans la partie 1 question 1:
Voiture v1 = new Voiture("Peugeot ","308"," noire ",35.000f , false);
Voiture v2 = new Voiture("Renault "," classique "," blanche",25.000f , false);
Voiture v3 = new Voiture("Kia "," x "," grise",30.000f , false);
Voiture v4 = new Voiture("Citroen "," beige"," noire ",35.000f , false);
2. c

NumClient NomClient tabVoitures


1 Mohamed -
2 Samia -
3 Ali V3
4 Raja V4
Client Client1=new Client (1, " Mohamed");
Client Client2=new Client (2, " Samia");
Client Client3=new Client (3, " Ali", V3);
Client Client4=new Client (4, " Raja", V4);
3. Client1.ajoutVoiture (v1);
Client1.ajoutVoiture (v2);
4. Client1.afficheListeVoitures();

4
Examen: Programmation Orientée Objet
Janvier 2018
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI, Ridha SALHI Durée: 1h30
Barème: Nb. Pages: 3

NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte des questions de réflexe et un problème détaillé.

Questions de reflexe :
public class Test { 1. Expliquez le rôle du bloc "finally".
public static void main(String[] args) { 2. Le programme affiche:
o ACDE
try { o ACD
System.out.print ("A"); o A0CDE
int value = Integer.parseInt ("8A"); o A0BCD
System.out.print ("B"); o ACE
} 3. Si le block "catch" devient:
catch (NumberFormatException e){
catch (NumberFormatException e){ System.out.print ("C");
System.out.print ("C"); return ; }
}
3.1. Ce quoi le rôle du terme
finally{ "return".
System.out.print ("D"); 3.2. Dans ce cas, le programme
} affiche:
o ACDE
System.out.print ("E"); o ACD
} o A0CDE
} o A0BCD
o ACE

4. Soit le code suivant:


public class ClassB extends ClassA{ public class ClassA implements I{ public static void main(String[]args){
} } I i1 = new ClassB( );
I i2 = new I( ); }
Expliquer chacune des deux instructions dans la méthode main():
I i1 = new ClassB( );
I i2 = new I( );

1/3
Problème: (15 points)
Soit le diagramme de classe suivant pour la gestion et la validation des inscriptions des étudiants dans
un centre de formation des langues et de TIC (la technologie de l'information et de la communication).
La gestion et la validation des inscriptions sont développées à l'aide d'un programme orienté objets.
Le centre possède une capacité maximale de 100 étudiants, chaque étudiant peut s'inscrire au
maximum dans 10 modules différents et au minimum doit s'inscrire dans deux modules linguistiques et
3 modules de TIC, dans ce cas, on dit que l'inscription de l'étudiant est valide.
Les attributs de la classe "Module" sont protégés. Cette classe possède deux méthodes abstraites "
getType()" et "calculCoutModule()"qui seront implémentées dans les sous classes concernées.
Leurs rôles sont de retourner le type et le coût de chaque module. Le coût d'un module TIC
(coutHeure * nbHeure).
L'interface " INbModule " possède deux constantes pour déterminer le nombre minimum des modules
linguistique et TIC d'une inscription valide.

Tous les attributs sont privés sauf ceux de la classe "Module" qui sont protégés.
ValideException Rq: La flèche est une
Module relation d'héritage
String getMsgValide() int numMod
String label
ListeEtudiant int getType()
Etudiant [] tabEtudiant float calculCoutModule()
ajouterEtudiant(Etudiant
e) ModuleTic
final int type=2;
float coutHeure;
Interface Etudiant int nbHeure;
INbModule int num; ….
String nom;
final int MinNbModLangue=2
Module[] tabModule ModuleLangue
final int MinNbModTic=4
Etudiant(…) final int type=1
void ajouterModule(Module float cout
m) …

La classe "ListeEtudiant" implémente l'interface et à l'aide de la méthode


ajouterEtudiant(Etudiant e) on ajoute un étudiant "e" d'une inscription valide dans l'attribut
"tabEtudiant" sinon une exception " ValideException " sera levée et un message "l'étudiant
doit avoir au minimum 2 modules linguistique et 3 modules Tic" sera affiché à
l'aide de la méthode "getMsgValide()" de la classe d'exception " ValideException".
Il s'agit donc de donner:
1. L'interface "INbModule".
2. La classe d'exception "ValideException".
3. Le modificateur adéquat de la classe "Module" avec explication en se basant sur les natures de
ses méthodes, voir annexe.
4. La classe "Etudiant" où le constructeur prend un tableau de modules parmi les paramètres.
5. La classe "ListeEtudiant"
6. Une classe "TestMain" contenant le programme principal (voir le bas de l'annexe). En utilisant le
polymorphisme et bien gérer l'exception (try, catche):
a) Insérer un module linguistique et un autre TIC dans le tableau tabMod.
b) Créer un étudiant "e1" avec le constructeur de la question 4.
*Créer "lEtud" un objet de type "ListeEtudiant", l'affecter l'étudiant "e1". Que ce passe-il au
moment de l'exécution et y-a-il un message qui s'affiche? Lequel?

2/3
Annexe
/*à compléter */ class Module {
protected int numMod ;
protected String label ;
abstract int getType();
abstract float calculCoutModule();

public Module(int numMod, String label) {


this.numMod = numMod;
this.label = label;
}
public int getNumMod() {
return numMod;
}
public void setNumMod(int numMod) {
this.numMod = numMod;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}

public class ModuleLangue extends Module public class ModuleTic extends Module {
{ private final int type=2;
private float coutHeure;
private final int type=1; private int nbHeure;
private float cout; public ModuleTic(int numMod, String
label, float coutHeure, int nbHeure) {
public ModuleLangue(int numMod, String /***** à compléter ******/
label, float cout) { }
public float getCoutHeure() {
/*** supposé fait****/ return coutHeure;
}
} public void setCoutHeure(float
public float getCout() { coutHeure) {
return cout; this.coutHeure = coutHeure;
} }
public void setCout(float cout) { public int getNbHeure() {
this.cout = cout; return nbHeure;
} }
public int getType() { public void setNbHeure(int nbHeure) {
return type; this.nbHeure = nbHeure;
} }
public int getType() {
public float calculCoutModule() { return type;
return cout; }
} } public float calculCoutModule() {
return coutHeure*nbHeure;
} }
public class TestMain {
public static void main(String[] args) {
Module[] tabMod =new Module[10];
/***** à compléter ******/
}

Bon Travail

3/3
Corrigé par Mounir RIAHI, Iset'Com

Examen: Programmation Orientée Objet


Janvier 2018
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI, Ridha SALHI Durée: 1h30
Barème: Nb. Pages: 3

NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte des questions de réflexe et un problème détaillé.

Questions de reflexe :
public class Test { 1. Le bloc finally contient du code qui sera exécuté
public static void main(String[] args) { quelle que soit la manière dont le bloc try a été
quitté.
try { 2. Le programme affiche:
System.out.print ("A"); o ACDE
int value = Integer.parseInt ("8A"); o ACD
System.out.print ("B"); o A0CDE
} o A0BCD
o ACE
catch (NumberFormatException e){ 3. Si le block "catch" devient:
System.out.print ("C"); catch (NumberFormatException e){
} System.out.print ("C");
return ; }
finally{
System.out.print ("D"); 3.1. Ce quoi le rôle du terme
} "return". pour quitter
immédiatement la méthode.
System.out.print ("E"); 3.2. Dans ce cas, le programme
} affiche:
} o ACDE
o ACD
o A0CDE
o A0BCD
o ACE

4. Soit le code suivant:


public class ClassB extends ClassA{ public class ClassA implements I{ public static void main(String[]args){
} } I i1 = new ClassB( );
I i2 = new I( ); }
Expliquer chacune des deux instructions dans la méthode main():
I i1 = new ClassB( ); Correcte, Si une classe A implémente une interface I, une sous-classe B de A implémente
aussi automatiquement I ; une instance B pourra être référencée par une variable de type I
I i2 = new I( ); c'est faux, on ne peut pas instancier une interface.

1/5
Corrigé par Mounir RIAHI, Iset'Com

Problème: (15 points)


Soit le diagramme de classe suivant pour la gestion et la validation des inscriptions des étudiants dans
un centre de formation des langues et de TIC (la technologie de l'information et de la communication).
La gestion et la validation des inscriptions sont développées à l'aide d'un programme orienté objets.
Le centre possède une capacité maximale de 100 étudiants, chaque étudiant peut s'inscrire au
maximum dans 10 modules différents et au minimum doit s'inscrire dans deux modules linguistiques et
3 modules de TIC, dans ce cas, on dit que l'inscription de l'étudiant est valide.
Les attributs de la classe "Module" sont protégés. Cette classe possède deux méthodes abstraites "
getType()" et "calculCoutModule()"qui seront implémentées dans les sous classes concernées.
Leurs rôles sont de retourner le type et le coût de chaque module. Le coût d'un module TIC
(coutHeure * nbHeure).
L'interface " INbModule " possède deux constantes pour déterminer le nombre minimum des modules
linguistique et TIC d'une inscription valide.

Tous les attributs sont privés sauf ceux de la classe "Module" qui sont protégés.
ValideException Rq: La flèche est une
Module relation d'héritage
String getMsgValide() int numMod
String label
ListeEtudiant int getType()
Etudiant [] tabEtudiant float calculCoutModule()
ajouterEtudiant(Etudiant
e) ModuleTic
final int type=2;
float coutHeure;
Interface Etudiant int nbHeure;
INbModule int num; ….
String nom;
final int MinNbModLangue=2
Module[] tabModule ModuleLangue
final int MinNbModTic=4
Etudiant(…) final int type=1
void ajouterModule(Module float cout
m) …

La classe "ListeEtudiant" implémente l'interface et à l'aide de la méthode


ajouterEtudiant(Etudiant e) on ajoute un étudiant "e" d'une inscription valide dans l'attribut
"tabEtudiant" sinon une exception " ValideException " sera levée et un message "l'étudiant
doit avoir au minimum 2 modules linguistique et 3 modules Tic" sera affiché à
l'aide de la méthode "getMsgValide()" de la classe d'exception " ValideException".
Il s'agit donc de donner:
1. L'interface "INbModule".
2. La classe d'exception "ValideException".
3. Le modificateur adéquat de la classe "Module" avec explication en se basant sur les natures de
ses méthodes, voir annexe.
4. La classe "Etudiant" où le constructeur prend un tableau de modules parmi les paramètres.
5. La classe "ListeEtudiant"
6. Une classe "TestMain" contenant le programme principal (voir le bas de l'annexe). En utilisant le
polymorphisme et bien gérer l'exception (try, catche):
a) Insérer un module linguistique et un autre TIC dans le tableau tabMod.
b) Créer un étudiant "e1" avec le constructeur de la question 4.
*Créer "lEtud" un objet de type "ListeEtudiant", l'affecter l'étudiant "e1". Que ce passe-il au
moment de l'exécution et y-a-il un message qui s'affiche? Lequel?

2/5
Corrigé par Mounir RIAHI, Iset'Com

Annexe
abstract class Module {
protected int numMod ;
protected String label ;
abstract int getType();
abstract float calculCoutModule();

public Module(int numMod, String label) {


this.numMod = numMod;
this.label = label;
}
public int getNumMod() {
return numMod;
}
public void setNumMod(int numMod) {
this.numMod = numMod;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
} }

public class ModuleLangue extends Module public class ModuleTic extends Module {
{ private final int type=2;
private float coutHeure;
private final int type=1; private int nbHeure;
private float cout; public ModuleTic(int numMod,
String label, float coutHeure, int
public ModuleLangue(int numMod, String nbHeure) {
label, float cout) { super(numMod, label);
super(numMod, label); this.coutHeure = coutHeure;
this.cout = cout; this.nbHeure = nbHeure;
} }
public float getCoutHeure() {
public float getCout() { return coutHeure;
return cout; }
} public void setCoutHeure(float
coutHeure) {
public void setCout(float cout) { this.coutHeure = coutHeure;
this.cout = cout; }
} public int getNbHeure() {
return nbHeure;
}
public int getType() { public void setNbHeure(int
return type; nbHeure) {
} this.nbHeure = nbHeure;
public float calculCoutModule() { }
return cout; public int getType() {
} } return type;
}
public float calculCoutModule() {
return coutHeure*nbHeure;
} }
public interface INbModule { public class ValideException extends
Exception {
final int MinNbModLangue=2; public String getMsgValide() {
final int MinNbModTic=3; return "l'étudiant doit avoir au
// void ajouterModule(Module m); minimum 2 modules linguistique et 3
} modules Tic ";
} }
3/5
Corrigé par Mounir RIAHI, Iset'Com

public class ListeEtudiant implements INbModule{

Etudiant[] tabEtudiant=new Etudiant[100];

public void ajouterEtudiant(Etudiant e) throws ValideException {


int nbLang=0, nbTic=0;
Module [] tabMod= e.getTabModule();

for (int i=0; i < tabMod.length ;i++) {


if ( (tabMod[i] != null ) &&( tabMod[i].getType()==1 ) )
nbLang++;
if ( (tabMod[i] != null ) &&( tabMod[i].getType()==2 ) )
nbTic++;
}

if ( (nbLang<MinNbModLangue) || (nbTic< MinNbModTic )) throw(new


ValideException());
else { // on ajoute l'etudiant: inscription valide;
int i;
for ( i=0; i < tabEtudiant.length ;i++)
if (tabEtudiant[i]==null) break;
if (i < tabEtudiant.length) {
tabEtudiant[i]=e;
System.out.println("Inscription Valide");
}
}
}
/* ***public void ajouterModule(Module m) {
return;
} ******/
class Etudiant {
private int num;
private String nom;
private Module[] tabModule=new Module[10] ;
public Etudiant(int num, String nom, Module[] tabModule) {
this.num = num;
this.nom = nom;
this.tabModule = tabModule;
}
public void ajouterModule(Module m) {
int i;
for( i=0; i < tabModule.length ;i++)
if (tabModule[i] == null) break;
if ( i < tabModule.length) tabModule[i]= m ;
}

public float calculCoutEtudiant(){


/*à ne pas prendre compte dans le barème*/
float tot=0;
for (int i=0;i<tabModule.length;i++) {
if (tabModule[i]!= null) tot+=tabModule[i].calculCoutModule();
}
return tot;
}

public int getNum() {


return num;
}

public void setNum(int num) {


this.num = num;
}

public String getNom() {

4/5
Corrigé par Mounir RIAHI, Iset'Com

return nom;
}

public void setNom(String nom) {


this.nom = nom;
}

public Module[] getTabModule() {


return tabModule;
}

public void setTabModule(Module[] tabModule) {


this.tabModule = tabModule;
} }
public class TestMain {
public static void main(String[] args) {
Module[] tabMod =new Module[10];

ModuleLangue ml1= new ModuleLangue(1,"fr", 50f);


//ModuleLangue ml2= new ModuleLangue(2,"ang", 70f);
ModuleTic mTic1= new ModuleTic(3,"Java", 10f, 10);
//ModuleTic mTic2= new ModuleTic(4,"BD", 20f, 10);
//ModuleTic mTic3= new ModuleTic(5,"html", 10f, 10);
tabMod[0]= ml1;tabMod[1]= mTic1;
Etudiant e1=new Etudiant(1,"Mounir",tabMod) ;
//e1.ajouterModule(ml2);
//e1.ajouterModule(mTic2);
//e1.ajouterModule(mTic3);
ListeEtudiant le= new ListeEtudiant();
try {
le.ajouterEtudiant(e1);
}
catch(ValideException e) {
System.out.println(e.getMsgValide());
} } }

Bon Travail

5/5
Examen
Programmation Orientée Objet
Janvier 2016

Filière: STIC-L2 Documents: non autorisés


Enseignants: Mounir RIAHI, Imen ABIDI, Marwen BOUBAKRI Durée: 1h30
Barème: Nb. Pages: 5

NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte un problème détaillé et 7 questions QCM.

Problème: (13 points)

Pour bien gérer ses ressources humaines, le directeur d'une clinique décide mettre un
programme écrit à l'aide du langage Java.
Les personnels initialement sont des infirmiers, des techniciens de santé et des médecins. Un
médecin peut être permanant (qui fait parti de la clinique) ou non permanant(ne fait pas
partie de la clinique, mais il est payé par chaque opération réalisée).
Le programme dispose d'une classe abstraite "Personnel",

Operation Personnel
int codeO peration int matricule
float prime String nom
String tel Rq: La flèche est une
Static int nbPersonnel relation d'héritage
public affiche()
Abstract calculSalai re()
Static int nbPersonnel()

Technicien
Infirmier float salBaseT
Medecin
float salaireBas eI static int nbTechnicien
Operation[] tabOperations
int nbHeureSup affiche()
float primeHeureSup calculSalaire()
static int nbInfirmier Static int nbTechnicien()
affiche()
calculSalaire()
Static int nbInfirmier()

MedecinPermanant MedecinNonPermanant
float salaireBas eMP static int nbM edNonP
static int nbM edP affiche()
affiche() calculSalaire()
calculSalaire() Static int nbMedNonPerm()
Static int nbMedPerm()

1/3
Partie1: 2. 5pts=(0.5+1+1)
1. Donner la structure de la classe : public class Operation { …}
- Tous les attributs sont privés
- Donner un constructeur qui permet de remplir tous les attributs.
NB: l'attribut "prime", c'est la prime qu'on doit la payer au médecin qui réalise cette
opération chirurgienne.
2. Donner la structure de la classe : abstract class Personnel { …}
- Tous les attributs sont protégés.
- Donner un constructeur qui permet de remplir tous les attributs.
- Développer la méthode affiche() qui affiche les détails d'un personnel.
- Cette classe contient une méthode abstraite et une méthode statique qui retourne le
nombre des personnels comme il est bien montré dans le schéma.
3. Donner la structure de la classe : abstract class Medecin … … { …}
- Pour faciliter, on considère la méthode Abstract calculSalaire() est déclarée
implicitement, ne prenez pas le souci de la remettre dans cette classe
- Cette classe contient un seul attribut protected "tabOperations" qui est un tableau
contenant des objets de type "operation".
- Donner un constructeur qui prend en paramètre un tableau d'opérations.

Partie2: 5.5pts =(1.25+1.25+1.5+1.5)


- On s'intéresse maintenant à la création des différentes sous classe (Technicien,
Infirmier, MedecinPermanant et MedecinNonPermanant).
- Dans chaque sous classe on doit redéfinir la méthode public affiche() qui fait appel a
la methode affiche() de la classe mère.
- Le calcul des salaires se fait grâce à la méthode float calculSalaire() de la manière
suivante:
 Pour un technicien: juste on retourne (le salaire de base)
 Pour un Infirmier: juste on retourne (le salaire de base + (nbHeureSup*
primeHeureSup)).
 Pour un Médecin Permanent, on retourne (le salaire de base + la somme des
primes de toutes les opérations qui a réalisées.
 Pour un Médecins Non Permanent, on retourne (la somme des primes de toutes
les opérations qui a réalisé.)
- Dans chaque classe on doit créer un constructeur qui remplit tous les attributs, on
peut appeler le constructeur de la classe mère.
4. Donner la structure de la classe : public class Technicien { …}
5. Donner la structure de la classe : public class Infirmier { …}
6. Donner la structure de la classe : public class MedecinPermanant { …}
7. Donner la structure de la classe : public class MedecinNonPermanant { …}

Partie3: 5pts = 1+0.5+0.5+1+1+1


On s'intéresse maintenant à la création d'une classe:
public class ListePersonnel{
Personnel[] pers;
public void ajouterPers(Personnel pers) {
pers .addElement(pers); }
Public float totalSalaire(){
float totSal;
2/3
….. } }
8. compléter la méthode totalSalaire() .

Dans le programme principal

puclic class TestPrincipale{


public static void main( String [] args){
// à compléter
}
}

9. Créer 4 objets de type personnel, en utilisant le polymorphisme, qui prend les détails
suivants:

Matricule Nom Tel Salaire de


Technicien Base
10 Rymane 11110000 700

Matricule Nom Tel Salaire de nbHeureSup primeHeureSup


Infirmier Base
20 Juliette 22220000 600 10 4

Nb: Pour les deux médecins suivant, on passe un tableau d'opérations en


paramètres.
Matricule Nom Tel Salaire Opérations
de Base réalisées
MedecinPermanant 30 Albert 33330000 1200 Op1(1, 500)
Op2(2, 1300)

Matricule Nom Tel Salaire de Base


MedecinNonPermanant 31 Matilda 44440000 Op3(3, 300)
Op4(4, 1500)

10. Créer un objet "lp" de type ListePersonnel , lui affecter ces 4 personnels créés ci-
dessus et afficher le montant total des salaires.

3/3
Correction: Mounir RIAHI

Examen
Programmation Orientée Objet
Janvier 2016

Filière: STIC-L2 Documents: non autorisés


Enseignants: Mounir RIAHI, Imen ABIDI, Marwen BOUBAKRI Durée: 1h30
Barème: Nb. Pages: 5

NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte un problème détaillé et 7 questions QCM.

Problème: (13 points)

Pour bien gérer ses ressources humaines, le directeur d'une clinique décide mettre un
programme écrit à l'aide du langage Java.
Les personnels initialement sont des infirmiers, des techniciens de santé et des médecins. Un
médecin peut être permanant (qui fait parti de la clinique) ou non permanant(ne fait pas
partie de la clinique, mais il est payé par chaque opération réalisée).
Le programme dispose d'une classe abstraite "Personnel",

Operation Personnel
int codeOperation int matricule
float prime String nom
String tel Rq: La flèche est une
Static int nbPersonnel relation d'héritage
public affiche()
Abstract calculSalaire()
Static int nbPersonnel()

Technicien
Infirmier float salBaseT
Medecin
float salaireBaseI static int nbTechnicien
Operation[] tabOperations
int nbHeureSup affiche()
float primeHeureSup calculSalaire()
static int nbInfirmier Static int nbTechnicien()
affiche()
calculSalaire()
Static int nbInfirmier()

MedecinPermanant MedecinNonPermanant
float salaireBaseMP static int nbMedNonP
static int nbMedP affiche()
affiche() calculSalaire()
calculSalaire() Static int nbMedNonPerm()
Static int nbMedPerm()

1/7
Correction: Mounir RIAHI

Partie1: 2. 5pts=(0.5+1+1)
1. Donner la structure de la classe : public class Operation { …}
- Tous les attributs sont privés
- Donner un constructeur qui permet de remplir tous les attributs.
NB: l'attribut "prime", c'est la prime qu'on doit la payer au médecin qui réalise cette
opération chirurgienne.
2. Donner la structure de la classe : abstract class Personnel { …}
- Tous les attributs sont protégés.
- Donner un constructeur qui permet de remplir tous les attributs.
- Développer la méthode affiche() qui affiche les détails d'un personnel.
- Cette classe contient une méthode abstraite et une méthode statique qui retourne le
nombre des personnels comme il est bien montré dans le schéma.
3. Donner la structure de la classe : abstract class Medecin … … { …}
- Pour faciliter, on considère la méthode Abstract calculSalaire() est déclarée
implicitement, ne prenez pas le souci de la remettre dans cette classe
- Cette classe contient un seul attribut protected "tabOperations" qui est un tableau
contenant des objets de type "operation".
- Donner un constructeur qui prend en paramètre un tableau d'opérations.

Partie2: 5.5pts =(1.25+1.25+1.5+1.5)


- On s'intéresse maintenant à la création des différentes sous classe (Technicien,
Infirmier, MedecinPermanant et MedecinNonPermanant).
- Dans chaque sous classe on doit redéfinir la méthode public affiche() qui fait appel a
la methode affiche() de la classe mère.
- Le calcul des salaires se fait grâce à la méthode float calculSalaire() de la manière
suivante:
• Pour un technicien: juste on retourne (le salaire de base)
• Pour un Infirmier: juste on retourne (le salaire de base + (nbHeureSup*
primeHeureSup)).
• Pour un Médecin Permanent, on retourne (le salaire de base + la somme des
primes de toutes les opérations qui a réalisées.
• Pour un Médecins Non Permanent, on retourne (la somme des primes de toutes
les opérations qui a réalisé.)
- Dans chaque classe on doit créer un constructeur qui remplit tous les attributs, on
peut appeler le constructeur de la classe mère.
4. Donner la structure de la classe : public class Technicien { …}
5. Donner la structure de la classe : public class Infirmier { …}
6. Donner la structure de la classe : public class MedecinPermanant { …}
7. Donner la structure de la classe : public class MedecinNonPermanant { …}

Partie3: 5pts = 1+0.5+0.5+1+1+1


On s'intéresse maintenant à la création d'une classe:
public class ListePersonnel{
Personnel[] pers;
public void ajouterPers(Personnel pers) {
// boucle for pour ajouter }
Public float totalSalaire(){
float totSal;
2/7
Correction: Mounir RIAHI
….. } }
8. compléter la méthode totalSalaire() .

Dans le programme principal

puclic class TestPrincipale{


public static void main( String [] args){
// à compléter
}
}

9. Créer 4 objets de type personnel, en utilisant le polymorphisme, qui prend les détails
suivants:

Matricule Nom Tel Salaire de


Technicien Base
10 Rymane 11110000 700

Matricule Nom Tel Salaire de nbHeureSup primeHeureSup


Infirmier Base
20 Juliette 22220000 600 10 4

Nb: Pour les deux médecins suivant, on passe un tableau d'opérations en


paramètres.
Matricule Nom Tel Salaire Opérations
de Base réalisées
MedecinPermanant 30 Albert 33330000 1200 Op1(1, 500)
Op2(2, 1300)

Matricule Nom Tel Salaire de Base


MedecinNonPermanant 31 Matilda 44440000 Op3(3, 300)
Op4(4, 1500)

10. Créer un objet "lp" de type ListePersonnel , lui affecter ces 4 personnels créés ci-
dessus et afficher le montant total des salaires.

3/7
Correction: Mounir RIAHI
QCM (7 points): Cochez la ou les bonne
(s) réponse (s) . Argumentez vos choix. public class F {
static int x = 1;
public static void
N.B: Toute réponse non accompagnée par main(String args[]) {
une explication correcte ne sera pas prise F f = new F();
en considération. f.x++;
System.out.println(x +
",");
1. Etant donnée les classes définies f(x);
comme suit: System.out.println(x);
public class A { }
int f(A a) { public static void f(int x)
return 1; {
} x += 2;
} }
public class B extends A { }
int f(A a) {
return 2;
A. 1,2
} B. 2,1
int f(B b) { C. 1,1
return 3; D. 1,0
} E. 2, 2
}
F. 1, 3
Qu'affiche le main ci-dessous ?
A a = new A(); G. 2, 3
A ab = new B(); H. Erreur de compilation
B b = new B();
System.out.println( a.f(a) ); 4. Etant la définition de la classe suivante
System.out.println( a.f(ab) );
System.out.println( a.f(b) );
public class R {
A. 123 public int n;
B. 111 private String d;
private String f;
C. 222
D. 333 public void f(int n, String
d, String f) {
2. Que retourne le code suivant: this.n = n;
this.d = d;
public class A { this.f = f;
int i; }
public A(int j) }.
{
i = j; A. Le code démontre un
} polymorphisme
}
A x = new A(5); B. La class est totalement encapuslé.
A y = new A(5); C. La variable n brise
if (x == y) l'encapsulation.
return true;
else return false; D. Les variables d et f brisent le
polymorphisme.
A. true E. La méthode f brise
B. false l'encapsulation.

3. Quelle est la sortie du programme


suivant:

4/7
Correction: Mounir RIAHI
}
}
class Test {
public static void main(String[]
5. Étant donné le code ci-dessous: args) {
class F { B f = new A();
public int x = 2; System.out.print(f.getX());
public void f() { System.out.print(((A) f).getX());
x++; System.out.println(((B)f).getX())
} ;
} }
public class FF extends F { }
public void f() { A. La classe Test ne compile pas.
x--;
} A. La classe Test compile mais
public void f(int y) { provoque une erreur à l'exécution
f(); B. La classe Test compile et affiche
super.f(); ____ (indiquez la valeur affichée)
x += y;
}
public static void main(String
args[]) { 7. Pour la classe F définie comme suit :
FF f = new F(); class F {
f.f(2); public int x;
public F() {
System.out.print(f.x); x = 3;
} };
} public F(int a) {
C'est quoi la sortie du code ? this();
x = x + a;
A. Erreur de compilation };
B. 2 public F(int a, int b) {
C. 4 this(b);
D. Pas de sortie x = x - a;
}
}
qu’affichera le code suivant ?
6. Etant donnée le code suivant: F f=new F(5,6) ;
public class A { System.out.println(f.x) ;
private int x;
public int getX() { B. 1
return x; C. 2
} D. 3
} E. 4
public class B extends A {
public int getX() {
return super.getX() + 2;

5/7
Correction: Mounir RIAHI
Partie1: 2. 5pts=(0.5+1+1)
1. public class Operation {
private int codeOperation;
private float prime;
public class Operation(int codeOperation, float prime){
this.codeOperation= codeOperation;
this.prime= prime;
}}
2. abstract class Personnel {
Static int nbPersonnel;
Protected int matricule;
Protected String nom;
Protected String tel;
public Personnel(int matricule, String nom, String tel) {
this.nbPersonnel++;
this.matricule= matricule;
this.nom= nom;
this.tel= tel; }
Static int nbPersonnel(){
return this.nbPersonnel; }
Abstract float calculSalaire();
public affiche(){
System.out.println(this.matricule + “ “ + this.nom + “ “ + this.tel);
}
}
3. abstract class Medecin extends Personnel {
protected Operation[] tabOperations ;
public Medecin(int matricule, String nom, String tel, tabOperations){
super(matricule, nom, tel);
this. tabOperations= tabOperations; }
public void affiche(){
super.affiche(); } }
Partie2: 5.5pts =(1.25+1.25+1.5+1.5)
4. public class Technicien extends Personnel {
public float salBaseT;
static int nbTechnicien;
public Technicien(int matricule, String nom, String tel, float salBaseT){
super(int matricule, String nom, String tel);
nbTechnicien++;
}
public void affiche(){
super.affiche();
System.out.println(this.salBaseT);
}
public float calculSalaire(){
return salBaseT;
}
Static int nbTechnicien(){ return nbTechnicien; } }
5. public class Infirmier extends Personnel {
public float salBaseI;
public int nbHeureSup;
public float primeHeureSup;
static int nbInfirmier ;
public Infirmier (int matricule, String nom, String tel, float salBaseI, int nbHeureSup, float
primeHeureSup){
super(int matricule, String nom, String tel);
this.nbHeureSup= nbHeureSup;

6/7
Correction: Mounir RIAHI
this.primeHeureSup= primeHeureSup;
nbInfirmier ++;
}
public void affiche(){
super.affiche();
System.out.println(this.salBaseI+" "+ this. nbHeureSup +" "+ this. primeHeureSup );
}
public float calculSalaire(){
return salBaseT+ nbHeureSup * this. primeHeureSup;
}
Static int nbInfirmier (){ return nbInfirmier; } }
6. public class MedecinPermanant extends Medecin {
public float salaireBaseMP,
static int nbMedP ;
public MedecinPermanant (int matricule, String nom, String tel, float salaireBaseMP, Operation[]
tabOperations){
super(int matricule, String nom, String tel, tabOperations);
this. salaireBaseMP = salaireBaseMP;
nbMedP ++;
}
public void affiche(){
super.affiche();
System.out.println(this. salaireBaseMP);
}
public float calculSalaire(){
float somOp=0;
for (int i=0; i< super.tabOperations.length;i++)
somOp+= super.tabOperations[i].prime;
return salBaseT+somOp;
}
Static int nbMedPerm (){ return nbMedPerm; } }
7. public class MedecinNonPermanant extends Medecin{ …}
Partie3: 5pts = 1+0.5+0.5+1+1+1
On s'intéresse maintenant à la création d'une classe:
public class ListePersonnel{
Personnel[] pers;
public void ajouterPers(Personnel p) {
// boucle for
for (int i=0; i< pers.length;i++){
if( pers[i] == null){
pers[i]=p ; break ; }
}
}
Public float totalSalaire(){ //compléter la méthode totalSalaire() .
float totSal;
for (int i=0; i< pers.length;i++)
totSal += pers[i].calculSalaire();
} }
Dans le programme principal
puclic class TestPrincipale{
public static void main( String [] args){ // à compléter
Personnel t1=new Technicien(10," Rymane","11110000",700f);
Personnel i1=new Infirmier (20," Juliette","22220000",600f, 10, 4f);
Operation[] tOp1; Operation[] tOp2;
tOp1[0]= new Operation(1, 500); tOp1[1]= new Operation(2, 1300);
tOp2[0]= new Operation(3, 300); tOp2[1]= new Operation(4, 1500);
Personnel m1=new MedecinPermanant (30," Albert","33330000",1200f, tOp1);
Personnel m2=new MedecinNonPermanant (40," Matilda","44440000", tOp2);
} }
8. ListePersonnel lp=new ListePersonnel();

7/7
Correction: Mounir RIAHI
lp .ajouterPers(t1);
lp .ajouterPers(i1);
lp .ajouterPers(m1);
lp .ajouterPers(m2); System.out.println(lp. totalSalaire ());

8/7
Corrigé par Mounir RIAHI, iset’com

Devoir Surveillé
Programmation Orientée Objet
Novembre 2018
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI et Ridha SALHI Durée: 1h
Barème: ….+…. Nb. Pages: 2
NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.
Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte des questions et un problème détaillé.

Questions ( …pts)
Soit les deux classes suivantes dans deux paquets différents écrites en langage Java :

package p1 ; package p2 ;
import java.io.*; import java.io.*;

public class Classe1 { public class Test {


private int n=1 ;
private String s1 ; public static void main (String [] args){
Vector vect = new Vector();
Classe1 c1 = new Classe1();
public int getN() { return n; } Classe1 c2 = new Classe1();
public void setN(int i) { n=i; }
System.out.println(c2.getN());
public int methode1(Classe1 c){ int j= c1.methode1(c2);
c.setN(n + c.getN()); System.out.println(c2.getN());
Return n + c.getN() ;
} } }
public static String methode1(String s2){
return s1+s2 ; } }

Les questions:
a) La classe Classe1 ne possède pas un constructeur, mais elle possède un constructeur par
défaut. Expliquer ce constructeur et donner sa structure.
b) Dans la classe Classe1, est-ce possible de donner deux méthodes de même nom ?
c) Les deux classes dans deux paquets différents mais on peut exécuter l’instruction :
Classe1 c1 = new Classe1(); pourquoi ?
d) Qu’elle est la bibliothèque à utiliser pour que l’instruction : Vector vect = new Vector();
ne possède pas une erreur de compilation.
e) Dans la classe Test, Comment appeler la méthode statique de la classe Classe1. Cette
méthode comporte-elle une erreur ?
f) Dans L’instruction de la classe Test: int j= c1.methode1(c2);
f.1) Expliquer le passage de paramètre s’il est par valeur ou par référence?
f.2) Donner ce qu’il affiche le programme avant et après cette instruction :
A. 0 puis 0
B. 1 puis 1
C. 1 puis 2
1/5
Corrigé par Mounir RIAHI, iset’com
Problème: (… points)
Une compagnie aérienne veut gérer ses employés en utilisant un programme orienté objet
écrit à l'aide du langage Java.
Les personnels sont initialement des pilotes et des hôtesses de l’air.
Soit le diagramme de classe suivant:
Employe
Avion Vector vect
int matricule ajouterPilote(Pilote plt)
String marque ajouterHotesse(Hotesse hts)
Avion(int n, String s) nbPiloteBoeing()

Pilote Hotesse
int numPilote int numHotesse
String nom String nom
static int nbPilote static int nbHotesse
Avion [] tabAvions Hotesse (…)
Pilote(int numPilote, String nom)
ajouterAvion( Avion av)
testBoeing()

 Toutes les classes et les méthodes sont publiques et tous les attributs sont privés.
 L'attribut tabAvions de la classe Pilote est un tableau de taille 10 pour stocker les
avions qui peuvent être conduits par un pilote.
 L'attribut vect de la classe Employe est un vecteur pour stocker des objets de type
Pilote ou Hotesse.
 Les deux attributs statiques sont définis pour compter le nombre des objets créés.
 NB : pour comparer deux chaines on utilise : if (s1.equals(s2)) { … }.

1. Donner la classe Avion.


2. Donner la classe Pilote où :
 la méthode ajouterAvion(Avion av) permet d’insérer l’objet « av » en paramètre
dans le tableau tabAvions qui peut stocker 10 d’avions.
 la méthode testBoeing() retourne vrai si le pilote peut conduire au moins un
avion de la marque « boeing » et false sinon.
3. Donner la classe Employe où :
 Les deux méthodes ajouterHotesse(Hotesse hts) et ajouterPilote(Pilote plt)
permettent d’insérer dans le vecteur des objets de type Hotesse et Pilote.
 La méthode nbPiloteBoeing() permet de retourner le nombre de pilotes qui
peuvent conduire un avion de type Boeing.

4. Dans le programme principal:


public class TestPrincipale{
public static void main( String [] args){
// à compléter
} }
 Créer deux avions : ( 1, « Boeing ») et (2, « AirBus).
 Créer un pilote puis lui affecter ces deux avions.
 Créer une Hôtesse.
 Créer un objet de type Employe et lui affecté le pilote et l’hôtesse.
 Afficher le nombre de pilotes permettent de conduire des avions de type Boeing.
Bon travail.

2/5
Corrigé par Mounir RIAHI, iset’com
Les questions:
a) La classe Classe1 ne possède pas un constructeur, mais elle possède un constructeur par
défaut. Expliquer ce constructeur et donner sa structure.
Rep : c’est le constructeur implicite du corps vide : public Classe1 ( ) { } .
Et il sera invisible si on crée un autre constructeur explicite.

b) Dans la classe Classe1, est-ce possible de donner deux méthodes de même nom ?
Rep : oui, c’est le principe de surcharge des méthodes, où dans la même classe on peut
avoir plusieurs méthodes qui portent le même nom mais le nombre ou le type de
paramètre est différent.

c) Les deux classes dans deux paquets différents mais on peut exécuter l’instruction :
Classe1 c1 = new Classe1(); pourquoi ?
Rep : parce que la classe Classe1 est publique.

d) Qu’elle est la bibliothèque à utiliser pour que l’instruction : Vector vect = new Vector();
ne possède pas une erreur de compilation.
Rep : java.util.* ;

e) Dans la classe Test, Comment appeler la méthode statique de la classe Classe1. Cette
méthode comporte-elle une erreur ?
Rep : NomClasse.methodeStatique(..) ; soit Classe1.methode1(« ab ») ;
- une méthode statique ne doit pas invoquer ni un attribut d’instance ni une
méthode d’instance
- Par contre elle peut invoquer des attributs et des méthodes statiques.
Donc l’instruction (return s1+s2 ; ) comporte une erreur parce qu’elle a utilisé un
attribut d’instance qui est s1.

f) Dans L’instruction de la classe Test: int j= c1.methode1(c2);


f.1) Expliquer le passage de paramètre s’il est par valeur ou par référence?
Rep : le paramètre (c2) est un objet donc il s’agit d’un passage de paramètre par
référence. Et une modification de cette variable dans une méthode est répercutée sur le
programme appelant.

f.2) Donner ce qu’il affiche le programme avant et après cette instruction :


A. 0 puis 0
B. 1 puis 1
C. 1 puis 2

3/5
Corrigé par Mounir RIAHI, iset’com
Problème :
package p1; package p1;
public class Avion {
private int matricule; public class Hotesse {
private String marque; private int numHotesse;
private String nomHotesse;
public Avion(int matricule, String marque) { private static int nbHotesse;
super(); public Hotesse(int numHotesse, String nomHotesse)
this.matricule = matricule; {
this.marque = marque; this.numHotesse = numHotesse;
} this.nomHotesse = nomHotesse;
public int getMatricule() { }
return matricule; public int getNumHotesse() {
} return numHotesse;
public void setMatricule(int matricule) { }
this.matricule = matricule; public void setNumHotesse(int numHotesse) {
} this.numHotesse = numHotesse;
public String getMarque() { }
return marque; public String getnomHotesse() {
} return nomHotesse;
public void setMarque(String marque) { }
this.marque = marque; public void setnomHotesse(String nomHotesse) {
} this.nomHotesse = nomHotesse;
} }
public int getNbHotesse() {
return nbHotesse;
} }

package p1;

public class Pilote {


private int numPilote;
private String nomPilote;
private static int nbPilote;
private Avion[] tabAvions =new Avion[10];
public Pilote(int numPilote, String nomPilote) {
super();
this.numPilote = numPilote;
this.nomPilote = nomPilote;
}

public Pilote(int numPilote, String nomPilote, Avion[] tabAvions) {


super();
this.numPilote = numPilote;
this.nomPilote = nomPilote;
this.tabAvions = tabAvions;
}

public int getNumPilote() {


return numPilote;
}
public void setNumPilote(int numPilote) {
this.numPilote = numPilote;
}
public String getNomPilote() {
return nomPilote;
}
public void setNomPilote(String nomPilote) {
this.nomPilote = nomPilote;
}
public static int getNbPilote() {
return nbPilote;
}
public boolean testBoeing(){
for (int i =0; i<tabAvions.length; i++)
if (tabAvions[i]!=null && tabAvions[i].getMarque().equals("Boeing"))
return true;
return false;
}
public void ajouterAvion(Avion av){
int i, nb=0;
for ( i =0; i<tabAvions.length; i++)
if (tabAvions[i]==null) break;
if (i<tabAvions.length)
tabAvions[i]=av;
} }

4/5
Corrigé par Mounir RIAHI, iset’com
package p1;
import java.util.*;
public class Employe {
private Vector vect = new Vector();

public Vector getVact() {


return vect;
}
public void setVact(Vector vact) {
this.vect = vact;
}
public void ajouter(Pilote plt){
vect.addElement(plt);
}
public void ajouter(Hotesse hts){
vect.addElement(hts);
}
public int nbPiloteBoeing(){
int nb=0;
for (int i =0; i<vect.size(); i++)
if( vect.elementAt(i).getClass().equals("Pilote"))
if ( ((Pilote)vect.elementAt(i)).testBoeing())
nb++ ;
return nb;
} }

package p1;
public class Test {
public static void main(String[] args) {
Avion v1= new Avion(1,"Boeig");
Avion v2= new Avion(1,"AirBus");
Pilote p1=new Pilote(1,"");
p1.ajouterAvion(v1);
p1.ajouterAvion(v2);
Hotesse h1=new Hotesse(1,"");
Employe e =new Employe();
e.ajouter(p1);
e.ajouter(h1);
System.out.println(e.nbPiloteBoeing());
} }

5/5
Corrigé par Mounir RIAHI, Iset’Com

Examen: Programmation Orientée Objet


Janvier 2019
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI, Ridha SALHI Durée: 1h30
Barème: 20 Nb. Pages: 2

NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.
NB2: L'examen comporte un problème détaillé.

Soit le diagramme de classe suivant pour la gestion d’un nouveau café qui commence initialement par
fournir deux types d’articles qui sont les cafés et les jus.
Les prix des différent cafés et jus sont fixés à 1500 et à 2000, l’interface « IPrix » répond à ce besoin.
La classe Article est une superclasse pour généraliser les articles. Cette classe contient une méthode
abstraite « getCoutArticle()» pour calculer le coût d’un article et ses attributs sont protégés.

Au début de la journée, on commence par des quantités disponibles des articles qui sont enregistrés
dans des attributs statiques « QteDipoJus » et « QteDipoCafe ». À chaque livraison, on décrémente
les quantités disponibles et on incrémente les attributs statiques pour compter les articles vendus.

Au début de la journée on commence à titre d’exemple par QteDipoJus =1 et QteDipoCafe =100.


Tous les attributs sont privés sauf ceux de la classe "Article " qui sont protégés.
QteException Rq: La flèche est une
Article relation d'héritage
String getQteMessage() String label
static int nbArticle
Client float getCoutArticle()
int numClient
String nom
static int nbClient Jus
Article [] tabArticle Cafe static int QteDipoJus
ajouterArticle(Article a) static int QteDipoCafe static int nbJus
static int nbCafe Jus( )
Cafe(…)
Interface
Journee IPrix
Client [] tabClient Interface final int PrixJus=2000
ICout float int PrixCafe=1500
ajouterClient( Client c)
viderTab()
getCout( )

1/5
Corrigé par Mounir RIAHI, Iset’Com

* L’objectif de la classe d’exception « QteException » est de contrôler la disponibilité d’un


article à livrer, sinon un message d’erreur « Article non disponible » qui sera affiché à l’aide de la
méthode « getQteMessage ».
* L’interface « ICout » contient une méthode « getCout() » qui sera implémenté dans la classe
« Client » pour calculer le coût de ses articles commandés et qui sera implémenté dans la classe
« Journée » pour calculer la recette de la journée( le total des commandes de tous les clients).
* Un client est caractérisé par un numéro, un nom, un attribut statique pour calculer le nombre total des
clients et un tableau des articles commandés de taille 10. La méthode « ajouterArticle » permet
d’ajouter un article commandé dans le tableau « tabArticle ». On veut donner un premier constructeur
où on ne passe pas un tableau d’article parmi ses paramètres, alors qu’un deuxième constructeur prend
tous paramètres et il fait appelle au premier constructeur.
* La classe « Journee» contient tous les clients d’une journée qui sont stockés dans l’attribut
« tabClient » et une méthode « ajouterClient() » permet d’ajouter un nouveau client à ce tableau.
Avant de commencer une nouvelle journée on doit vider le tableau de clients de la journée précédente :
c’est le rôle de la méthode « viderTab()».
Le travail demandé est de répondre aux questions suivantes:
1. Qu’est-ce qu’une interface. (1pt)
2. Comment afficher la constante d’une interface. (1pt)
3. Donner Les interfaces "ICout" et "IPrix". (1pt)
4. Donner La classe d'exception "QteException". (1pt)
5. Bien expliquer le modificateur à utilise au niveau de la classe « Article ». (1pt)
6. Donner Les classes " Article"," Cafe"," Jus"," Client" et " Journee". (11pt)
7. Une classe "TestMain" contenant le programme principal. En utilisant le polymorphisme et en
bien gérant l'exception (try, catche):(5pt)
a. Créer un client cl1.
b. Créer les articles demandés par ce client cl1 : un café et deux types de Jus.
c. Livrer ces articles au client cl1.
d. Créer un objet de type « Journee » et y ajouter le client cl1.
e. Afficher le cout total de la journée.
f. Que ce passe-il au moment de l'exécution et y-a-il un message qui s'affiche? Si
oui, Lequel?
Bon Travail

2/5
Corrigé par Mounir RIAHI, Iset’Com

1) Une interface est une structure qui contient des constantes et des méthodes qui sont
implicitement publiques et abstraites.
2) System.out.println(NomInterface.LaConstante);
5) la classe « Article » contient une méthode abstraite don cette classe doit être déclarée abstract
où elle ne peut pas être instanciée mais elle sert à être héritée.
f) une exception de type QteException est levée au niveau de la création du deuxième objet
de type Jus car QteDipoJus est égale à 0.

public class QteException public interface IPrix { public interface ICout {


extends Exception { final int float getCout( );
String getQteMessage(){ PrixJus=2000; }
return "Stock fini "; final int
} } PrixCafe=1500; }

public abstract class Article {


String label;
static int nbArticle;
abstract float getCoutArticle();
public Article(String label) {
nbArticle++;
this.label = label;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public static int getNbArticle() {
return nbArticle;
}
public static void setNbArticle(int nbArticle) {
Article.nbArticle = nbArticle;
} }

public class Cafe extends Article public class Jus extends Article
implements IPrix{ implements IPrix {
private static int QteDipoCafe=100; private static int QteDipoJus=1;
private static int nbCafe; private static int nbJus;

public Cafe(String label) throws public Jus(String label) throws


QteException { QteException {
super(label); super(label);
if(QteDipoCafe ==0) throw new if (QteDipoJus ==0) throw new
QteException(); QteException();
QteDipoCafe-- ; QteDipoJus-- ;
nbCafe++ ; nbJus++ ;
} }
public float getCoutArticle(){ @Override
float getCoutArticle() {
return nbCafe*IPrix.PrixCafe; // TODO Auto-generated method stub
} return nbJus*IPrix.PrixJus;
public static int getQteDipoCafe() { }
return QteDipoCafe; public static int getQteDipoJus() {
} return QteDipoJus;
public static void setQteDipoCafe(int }
qteDipoCafe) { public static void setQteDipoJus(int
QteDipoCafe = qteDipoCafe; qteDipoJus) {
} QteDipoJus = qteDipoJus;
public static int getNbCafe() { }
return nbCafe; public static int getNbJus() {
} } return nbJus;} }

3/5
Corrigé par Mounir RIAHI, Iset’Com

public class Client implements ICout {


private int numClient;
private String nom;
private static int nbClient;
private Article [] tabArticle = new Article [10];

public Client(int numClient, String nom, Article[] tabArticle) {


this( numClient, nom);
this.tabArticle = tabArticle;
nbClient++;
}
public Client(int numClient, String nom) {
this.numClient = numClient;
this.nom = nom;
}
public int getNumClient() {
return numClient;
}
public void setNumClient(int numClient) {
this.numClient = numClient;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public static int getNbClient() {
return nbClient;
}
public Article[] getTabArticle() {
return tabArticle;
}
public void setTabArticle(Article[] tabArticle) {
this.tabArticle = tabArticle;
}

public void ajouterArticle(Article a){


int i;
for ( i=0; i < tabArticle.length ;i++)
if (tabArticle[i]==null) break;
if (i < tabArticle.length) {
tabArticle[i]=a;
System.out.println("article ajouté");
} }
@Override
public float getCout() {
float tot =0;
for ( int i=0; i < tabArticle.length ;i++)
if (tabArticle[i]!=null)
tot+= tabArticle[i].getCoutArticle();
return tot;
} }

public class Journee implements ICout {


private Client [] tabClient = new Client [1000];

public Journee(Client[] tabClient) {

this.tabClient = tabClient;
}
public Journee( ) { }

4/5
Corrigé par Mounir RIAHI, Iset’Com

public Client[] getTabClient() {


return tabClient;
}
public void setTabClient(Client[] tabClient) {
this.tabClient = tabClient;
}
public void viderTab(){
for (int i=0; i < tabClient.length ;i++)
tabClient[i] =null ;
}
public void ajouterClient(Client c){
int i;
for ( i=0; i < tabClient.length ;i++)
if (tabClient[i]==null) break;
if (i < tabClient.length) {
tabClient[i]=c;
System.out.println("Client ajouté");
} }
@Override
public float getCout() {
// TODO Auto-generated method stub
float tot =0;
for ( int i=0; i < tabClient.length ;i++)
if (tabClient[i]!=null)
tot+= tabClient[i].getCout();
return tot;
} }

public class Main {


public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Article c1=new Cafe("express");
System.out.println(c1.getCoutArticle());
Article j1=new Jus("citronade");
System.out.println(j1.getCoutArticle());
Article c2=new Jus("fraise");
System.out.println(c2.getCoutArticle());
Client cl1=new Client(1, "mm");
cl1.ajouterArticle(c1);
cl1.ajouterArticle(c2);
cl1.ajouterArticle(j1);
Journee jr = new Journee();
jr.ajouterClient(cl1);
//System.out.println(cl1.getCout());
System.out.println(jr.getCout() );

}
catch(QteException e){
System.out.println(e.getQteMessage());
}
} }

5/5
Programmation Orientée Objet
Devoir Surveillé

Filière: STIC-L2 Documents: non autorises


Enseignants: Mounir RIAHI, Imen ABIDI Durée: 1h
Barème: 5-15 Nb. Pages:2

NB: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.


Les exercices sont indépendants et peuvent être traites dans n’importe quel ordre.

Questions de reflexe:
1. Soient les deux lignes de code suivantes :
public static void main (String []args)
public static void main (String args[])
Existe-t-il une différence entre les 2 lignes ? Expliquer.

2. A quoi sert le mot clef return dans l'instruction: return a ;


(plusieurs réponses sont possibles)
a. Il arrête l'exécution de la méthode en cours
b. Il renvoie le nom actuel de la variable a
c. Il renvoie la valeur actuelle de la variable a
d. Il appelle la méthode a()
3. Déterminer (la/les) erreur(s) et donner une correction:
Double methode1(float f){
Vector v;
int i=2;
v.addElement(i);
}
4. Déterminer l'erreur, donner une correction et donner l'affichage du programme suivant:
public class Test {
public static void main(String[] args) {
int[] tab={3,7,8,4,2,1};
System.out.println(tab.length() );
String s="Bonjour";
System.out.println(s.length() );
System.out.println(s.equals("Hello") );
}
5. Déterminer l'erreur:
public int methode1(int i){
int j;
System.out.println( j+5 );
If (i=5) {
int j=i--;
System.out.println( j );
}
}

1
Problème:

Une entreprise vend à ses clients des produits médicaux (comme les médicaments, pommade…) et des
services (comme consultation, conseils…).
Un client peut avoir plusieurs commandes qui peuvent contenir plusieurs produits et services comme il
est expliqué dans le schéma suivant.

Commande Produit
Client
int numCmd int numProd
int numCl
Vector vectProdServ String designation
String nom
Commande(int numCmd) float prix
static int nbCl
Commande[] tabCmd ajouterServ (Service serv) Produit (…)
Client(…) ajouterProd (Produit prod)
ajoutCommande(…) Static float calculTotComm()
Service
static float calculTotClient()
int numServ
String designation
float prix
Service(…)

Le responsable du système d'information de l'entreprise pense à gérer les clients et ses commandes à
l'aide d'un programme écrit avec un langage de programmation orientée objets Java.
On donne les classes Produit et Service.
public class Service { public class Produit {
private int numServ ; private int numProd ;
private String designation; private String designation;
private float prix; private float prix;
public Service (int numServ, float prix, String public Produit(int numProd, float prix, String
designation) { designation) {
this.numServ = numServ; this.numProd = numProd;
this.designation = designation; this.prix = prix;
this.prix = prix; this.designation = designation;
} }
public void setPrix (float prix){ public void setPrix (float prix) {
this.prix = prix; this.prix = prix;
} } } }

1. Dans une classe on peut avoir plusieurs constructeurs. Qu’est-ce qu’un constructeur et à quoi il
sert ? (1pt)
2. On remarque d'après le schéma que la classe Commande contient un attribut de type Vector et
que la classe Client contient un attribut de type tableau. Qu'elle est la différence entre un
tableau et un vecteur. (1pt)
3. a. Donner la classe Commande et développer les méthodes mentionnées dans le schéma.
NB1: les méthodes ajouterServ(Service serv) et ajouterProd(Produit prod) permettent d'ajouter
un objet de type Service un objet de type Produit dans l'attribut vectProdServ de type Vector.
NB2: La méthode statique calculTotComm() permet de retourner le coût total d'une commande
en parcourant le vecteur et additionner les prix des produits et des services. (4.75pts)
b. Qu’est-ce qu’une méthode statique. Donner la syntaxe avec laquelle on peut l'appeler. (1pt)
4. a. D'après le schéma, dans la classe Client, il y a un attribut statique "static int nbCl". Ce quoi
un attribut statique et quel est le rôle de l'attribut " nbCl".(1pt)
b. Donner la classe Client et développer les méthodes mentionnées dans le schéma. (4pts)

NB3: la méthode ajoutCommande(…) prend en paramètres un objet de type Commande et


l'insère dans l'attribut "tabCmd" de type tableau des Commande.
NB4: la méthode calculTotClient() retourne le coût total des commandes d'un client. En effet on
peut parcourir le tableau des Commandes et additionner les coût de ses commande en appelant la
méthode calculTotComm().

2
5. Soit la classe suivante: (2.25pt)
puclic class Test{

public static void main( String [] args){


Produit prod1= new …// à compléter
… // à compléter

} }

a. Créer un objet prod1 de type Produit dont le numéro est égal à la valeur 1, possède la
désignation "Produit1" et son prix est 1500.
b. Créer un objet serv1 de type Service dont le numéro est égal à la valeur 1, possède la
désignation " Consultation" et son prix est 1200.
c. Créer une commande com1 avec un numéro égal à la valeur 1et possède la désignation "
cmd1".
d. Ajouter les objets prod1 et serv1 à la commande com1.
e. Créer un client client1 avec un numéro égal à la valeur 1 et possède comme nom " Med".
f. Afficher le totale de la commande com1
g. Afficher le totale des commandes du client client1.

Bon travail

3
Correction Enseignant: Mounir RIAHI

Examen:Programmation Orientée Objet


Janvier 2017
Filière: STIC-L2 Documents: non autorisés
Enseignants: Mounir RIAHI, Imen ABIDI Durée: 1h30
Barème: Nb. Pages: 2

NB1: Il sera tenu compte de la lisibilité, de la présentation et de la clarté des réponses.

Les exercices sont indépendants et peuvent être traités dans n’importe quel ordre.

NB2: L'examen comporte des questions de réflexe et un problème détaillé.

Question de reflexe (5 points):


1. Expliquer la différence entre la notion de surcharge et redéfinition de méthodes. Donner un
exemple illustratif.
Rep: la surcharge lorsque, dans une classe, plusieurs méthodes possèdent le même nom et se
diffèrent par le nombre ou par le type des arguments.
2. Dans le code suivant, corriger l'erreur si elle existe.
Public class ClassB extends ClassA{ Public class ClassC impliments I{ Public static void main(St ring[]argv){
} } }
Rep: En utilisant le polymorphisme, "ClassA a= new ClassC( );" n'a pas de sens puisque ClassC
n'est une sous classe de "ClassA. ClassA a= new ClassB( );" est correcte.
3. Si une exception de type Exception1 est levée dans le block Try, quel block Catch sera exécuté.
1. try{ … }
catch( Exception1 e1){ …}
catch( Exception2 e2){ …}
catch( Exception1 e3){ …}

Rep: Quand une exception est levée dans le bloc try, la première clause catch dont le type de
l’argument correspond à celui de l’exception levée est invoquée. " catch( Exception1 e1){ …}" sera
exécuté.
4. Le code suivant est il correct? Expliquer:
class ClassA impliments I{…}

I i= new ClassA();
Rep: Correct ,on pourra affecter à "i" n'importe quelle référence à un objet d'une classe implémentant
l'interface I :
5. Si "C" est une sous classe de "B" et "B" est une sous classe de "A". Compléter par
surclassement ou Substitution.
A a; C c;
a= c; // …… Surclassement
c= (C) a ; // …… Substitution

1/5
Correction Enseignant: Mounir RIAHI

Problè me: (15 points)

Soit le diagramme de classe suivant pour la gestion de location des véhicules. Un véhicule peut
être une voiture ou un camion.

L'agence de location offre ses services de location uniquement pour les entreprises. Une
entreprise peut louer au moins deux véhicules et au maximum quatre véhicules.
La durée de location d'un véhicule se compte en jour et les camions en semaine.
La gestion de locations des véhicules est développée à l'aide d'un programme orienté objets.
Les attributs de la classe abstraite "Vehicule" sont protégés. Cette classe possède une méthode
abstraite " revenueVehicule()" qui sera implémentée dans les sous classes concernée s. Son rôle
est de retourner le montant d'une location d'un véhicule (prixLocJ*nb de jours de location).
La méthode "setPeriodLoc(int i)" de l'interface "IVehicule" permet de remplir l'attribut
"nbJourLoc" d'une voiture ou l'attribut "nbSemaineLoc" d'un camion.
L'interface " ILoc" possède deux constantes pour déterminer le nombre maximal et minimal de
véhicules à louer. Cette interface possède la méthode "louerVehicu le(Veh icule v)" permet d'insérer
un véhicule dans l'attribut "tabVehicule" de la classe "Entreprise" après avoir appelé la méthode
"setPeriodLoc" pour déterminer la période de location d'un véhicule.
Vehicule
Entreprise Peut Louer String matricule Rq: La flèche est une
String nomEntrep String marque
Vehicule [] tabVehicule static int nbVeh relation d'héritage
float revenueEntreprise() float prixLocJ
abstract float revenueVehicule()

ExceptionLocation Camion
Vo iture
static int nbVoiture static int nbCamion
String msgValidLocation() int nbJourLoc int nbSemaineLoc

Interface
ILoc
final int M IN=2
final int M AX=4 Interface
void louerVehicule (Vehicule v) IVehicule
int validerLocation()
void setPeriod Loc (int i)

L'interface " ILoc" possède aussi la méthode "validerLocation()" qui permet de déterminer si
après l'affectation des différents véhicules à une entreprise, le nombre total des véhicules à louer
est compris entre MIN et MAX, sinon une exception " ExceptionLocation" sera levée et un
message " le nombre de véhicule à louer doit être entre 2 et 4" sera afficher à l'aide de la
méthode "msgValidLocation()" de la classe d'exception " ExceptionLocation".
Dans chaque classe on doit avoir un constructeur qui prend tous les paramètres.
Il s'agit donc de donner:
1. Les interfaces IVehicule et ILoc.
package Interfaces; package Interfaces;
import Classes.Vehicule;
import Exception.ExceptionLocation; public interface IVehicule {
public interface ILoc { void setPeriodLoc (int
final int MIN=2; i);
final int MAX=4; }
void louerVehicule (Vehicule v);
int validerLocation() throws
ExceptionLocation;
}

2/5
Correction Enseignant: Mounir RIAHI

2. La classe d'exception ExcetionLocation.


package Exception;
public class ExceptionLocation extends Exception{
public String msgValidLocation(){
return " le nombre de véhicule à louer doit être entre 2 et 4 ";
} }
3. La classe abstraite Vehicule.
package Classes; public void setMatricule(String
public abstract class Vehicule { matricule) {
private String matricule; this.matricule =
private String marque; matricule;
private static int nbVeh; }
private float prixLocJ; public String getMarque() {
return marque;
abstract float revenueVehicule(); }
abstract void setPeriodLoc (int i); public void setMarque(String marque) {
this.marque = marque;
public Vehicule(String matricule, }
String marque, float prixLocJ) { public static int getNbVeh() {
super(); return nbVeh;
this.matricule = }
matricule; public float getPrixLocJ() {
this.marque = marque; return prixLocJ;
this.prixLocJ = prixLocJ; }
nbVeh++; public void setPrixLocJ(float
} prixLocJ) {
public String getMatricule() { this.prixLocJ = prixLocJ;
return matricule; } }
}

4. La sous classe Camion et ne donner pas la sous classe Voiture (supposée faite).
package Classes; package Classes;
import Interfaces.IVehicule; import Interfaces.IVehicule;

public class Voiture extends Vehicule public class Camion extends Vehicule
implements IVehicule { implements IVehicule {
private static int nbVoiture; private static int nbCamion;
private int nbJourLoc; private int nbSemaineLoc;
public Voiture(String matricule, public Camion(String matricule, String
String marque, float prixLocJ) { marque, float prixLocJ) {
super(matricule, marque, super(matricule, marque,
prixLocJ); prixLocJ);
nbVoiture++; nbCamion++;
} }
public void setPeriodLoc(int i) public void setPeriodLoc(int i)
{ {
nbJourLoc=i; nbSemaineLoc=i;
} }
float revenueVehicule() { float revenueVehicule() {
return return
getPrixLocJ()*nbJourLoc; getPrixLocJ()*nbSemaineLoc*7;
} } } }

3/5
Correction Enseignant: Mounir RIAHI

5. La classe Entreprise.
package Classes;
import Exception.ExceptionLocation;
import Interfaces.ILoc;

public class Entreprise implements ILoc {


private String nomEntrep;
private Vehicule [] tabVehicule=new Vehicule[10];

public Entreprise(String nomEntrep, Vehicule[] tabVehicule) {


super();
this.nomEntrep = nomEntrep;
this.tabVehicule = tabVehicule;
}
public Entreprise() {
super();
}
public String getNomEntrep() {
return nomEntrep;
}
public void setNomEntrep(String nomEntrep) {
this.nomEntrep = nomEntrep;
}
public Vehicule[] getTabVehicule() {
return tabVehicule;
}
public void setTabVehicule(Vehicule[] tabVehicule) {
this.tabVehicule = tabVehicule;
}
public float revenueEntreprise(){
int i ; float totRevenue=0;
for ( i=0; i<tabVehicule.length;i++) {
if(tabVehicule[i] != null)
totRevenue+=tabVehicule[i].revenueVehicule();
else break;
}
return totRevenue;
}
public void louerVehicule(Vehicule v) {
int i ;
v.setPeriodLoc(3);
for ( i=0; i<tabVehicule.length;i++) {
//// System.out.println(i );
if(tabVehicule[i] == null)
break;
}
tabVehicule[i]=v;
}

public int validerLocation() throws ExceptionLocation{


int i, res=0, nbVeh=0 ;
for ( i=0; i<tabVehicule.length;i++) {
if(tabVehicule[i] != null)
nbVeh++;
}
System.out.println(" nbVeh "+nbVeh );
if ( nbVeh<2 ||nbVeh>4 ) throw new ExceptionLocation();
else
res =1;
return res;
} }

4/5
Correction Enseignant: Mounir RIAHI

6. Une classe TestPrincipale contenant le programme principale. En utilisant le


polymorphisme, créer cinq divers véhicules selon vos choix. Créer une entreprise "e1",
l'affecter les différents véhicules créés et valider la location. Bien gérer l'exception.
package test;
import Classes.Camion;
import Classes.Entreprise;
import Classes.Vehicule;
import Classes.Voiture;
import Exception.ExceptionLocation;
public class Test {
public static void main(String[] args) {
try {
Entreprise e1 = new Entreprise();
Vehicule v1= new Voiture("v1","mv1", 5 );
Vehicule v2= new Voiture("v2","mv2",10);
Vehicule c1= new Camion ("c1","mc1",4);
Vehicule c2= new Camion ("c2","mc2",4);
Vehicule c3= new Camion ("c3","mc3",4);
e1.louerVehicule(v1);
e1.louerVehicule(v2);
e1.louerVehicule(c1);
e1.louerVehicule(c2);
e1.louerVehicule(c3);
System.out.println( e1.revenueEntreprise()) ;
e1.validerLocation();
} catch (ExceptionLocation e) {
System.out.println( e.msgValidLocation()) ;
System.out.println( e.toString()) ;
} }}

Bon Travail

5/5
Nom & prénom :.............................................CIN :....................Salle :............N° Place : ......

Code Signature des


surveillants

NE RIEN ECRIRE ICI

---------------------------------------------------------------------------------------------
Institut Supérieur Année universitaire
d’Informatique et de 2015-2016
Mathématique de ***
Monastir
***
Code Note sur 20
Examen
Session contrôle

Module : Programmation orientée objet Date: Juin 2016


Section : LF2 & LA2 INFO Durée: 1h30
Enseignant : S. BHIRI Documents: non autorisés
Nombre de pages: 10

Attention :
- Lisez attentivement la totalité de l’énoncé avant d’entamer les réponses.
- les documents ne sont pas autorisés.
- Le barème est donné à titre indicatif.
- Cet énoncé est sur 9 pages.

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 1
NE RIEN ECRIRE ICI

---------------------------------------------------------------------------------------------
Exercice 1 (9 pts)
Une entreprise veut calculer la charge sociale globale annuelle, à payer pour couvrir ses employés,
qui n'est que la somme des charges sociales annuelles des employés. La charge sociale pour un
employé dépend de son grade et de son salaire. Ainsi, on distingue entre deux types d'employés :
les employés qualifiés et les employés non qualifiés. Chaque employé possède un salaire mensuel
de base.
Pour un employé qualifié :
 son revenu annuel est calculé en multipliant son salaire mensuel de base par 13,
 sa charge sociale à payer par l'entreprise est calculée en multipliant son revenu annuel par
un pourcentage, p, auquel on ajoute une somme fixe, sf. Le pourcentage, p, dépend lui
même du revenu annuel. La classe Commun donnée ci-dessous définit la valeur de cette
somme fixe et offre une méthode pour calculer le pourcentage pour un revenu annuel
donné.
Pour un employé non-qualifié :
 son revenu annuel est calculé en multipliant son salaire mensuel de base par 12,
 sa charge sociale à payer par l'entreprise est calculée en multipliant son revenu annuel par
un pourcentage p. Pareil que pour un employé non-qualifié ce pourcentage est à calculer
en fonction du revenu annuel et c'est la classe Commun qui offre la méthode appropriée
pour le faire.

Pour pouvoir réaliser l'application demandée, nous définissons les classes suivantes :
 EmployeQualifie : elle représente la classe des employés qualifiés.
 EmployeNonQualifie : elle représente la classe des employés non-qualifiés.
 Employe : c'est la classe mère de laquelle héritent les des deux classes EmployeQualifie et
EmployeNonQualifie.
 Entreprise : c'est la classe façade qui contient la méthode main, le point d'entrée de
l'application.
 Commun : c'est une classe où on définit certains paramètres de calcul comme détaillé ci-
dessous.

Chaque employé possède un salaire mensuel de base, possède une méthode pour
calculer son revenu annuel, et offre une méthode publique pour calculer et
retourner sa charge social à payer par l'entreprise.

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 2
1) Donner le code de la classe Employe (3 pts).

------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

La classe Commun est définie comme suit.


public class Commun{
public static sommeFixeChSocialEmployQualif; // la somme fixe
//à rajouter pour calculer la charge social d'un employé qualifié
// comme indiqué ci-dessus

public static float getPourcentage(float revenuAnnuelle){...}

....
}

L'attribut sommeFixeChSocialEmployeQualif est la somme fixe à rajouter au pourcentage


du revenu annuel d'un employé qualifié pour calculer sa charge sociale.
La méthode getPourcentage permet de calculer et retourner le pourcentage à multiplier
au revenu annuel pour calculer la charge sociale d'un employé comme détaillé ci-dessus.

2) Donner le code de la classe EmployeQualifie (3 pts).

------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 3
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

3) Compléter le code de la classe Entreprise ci-dessus. La méthode


calculerChargeSocialeGlobale permet de calculer et retourner la charge sociale globale pour
tous les employés de l'entreprise (3 pts).

public class Entreprise {

ArrayList<-----------------> mesEmployes;

float calculerChargeSocialGlobale(){

float total = 0 ;

for (Employ e : mesEmployes){ // pour chaque Employe e de


// mesEmployes

---------------------------------------------------

return total;
}

public static void main(String[] args){


// création, initialisation et déroulement de l'application
}
}

Exercice 2 (6,75 pts)

Soit la classe FicheEmprunte suivante. Cette classe représente une fiche d'emprunte d'articles
d'un abonné donné. Lisez le code de la classe ainsi que les commentaires.

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 4
public class FicheEmpunte {
private int IdAbonne; // identifiant de l'abonne
private int nbrArticles; //le nombre d'articles que l'abonné
// emprunte actuellement
private ArrayList<codeArticles> articleEmpruntes; // un tableau
//contenant les codes des articles empruntés

private int nbrArticlesMax; // le nombre maximal d'articles que


// l'abonne peut emprunter

... // autre attributs et méthodes accesseurs à certains attributs

public boolean emprunterArticle(int codeArticles) {


// .... traitement approprié
}

pubic boolean restituerArticle(int codeArticle){

// traitement de restitution

}
}

La méthode restituerArticle permet de restituer un article emprunté par l'abonné. On ne


détaillera pas le code de cette méthode. Vous le reprenez sous forme de commentaire comme il
est donné.
Soit la classe Mediatheque suivante qui représente le système contenant les articles à emprunter
et mettant en œuvre les mécanismes d'emprunt et de restitution d'articles aux abonnés.
public class Mediatheque {
public static void main(String[] args){

......

FicheEmprunte fe;
boolean res;
int codeArtice

.......

... // initialisation et opérations sur la fiche fe


... // initialisation du code de l'article

.......

res = fe.restituerArticle(codeArticle);

}}

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 5
Ces deux classes compilent et s'exécutent avec succès.
Cependant, certains abonnés ont empruntés des articles avant que le système informatisé soit
mise en place et leurs emprunts précédents ne sont pas prises en compte par le système. Ceci
implique que certains abonnés peuvent emprunter plus que ce qui est permis (ceux déjà
empruntés avant la mise en place du système informatisé plus ceux permis par le système).
Pour remédier à cette anomalie, les responsables veulent signaler de telles situations et ceci lors
de la restitution d'un article.
Quand un abonné veut restituer un article, le système vérifie si cet emprunt d'article est enregistré
par le système ou pas (autrement dit, l'emprunt est fait avant l'informatisation du système ou pas).
Pour ce faire, nous définissions la méthode suivante dans la classe FicheEmprunte.

private boolean estCeQueArticleEmprunte(int codeArticle){....}

Cette méthode retourne vraie si l'article dont le code est passé en paramètre figure dans la liste
des articles empruntés de l'abonné en question. Elle retourne faux sinon. Autrement dit quand un
abonné veut restituer un article et que cette méthode retourne faux, ceci correspond à l'anomalie
cherchée et à lancer qui est l'emprunt d'un article avant l'informatisation du système.

1) Définissez l'exception EmpruntAvantInformatisation qui correspond à l'occurrence du


problème de restitution d'un article avant l'informatisation du système. Cette classe doit contenir
un champ pour l'identifiant de l'abonné et un autre champ pour le code de l'article à restituer.

public class EmpruntAvantInformatisation ------------------------------------------------------------------------


------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------

2) Modifier le code de la méthode restituer afin de détecter et lancer une exception de type
EmpruntAvantInformatisation quand elle se produit.

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 6
------------------------------------------------------------------------------------------------------------------- -------
- pubic boolean restituerArticle ---------------------------------------------------------------------
------------------------------ --------------------------------------------------------------------------------------
----------------------------- ------------------------------------------------------------------------------------------------
------------------- ----------------------------------------------------------------------------------------------------------
--------- --------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
----------------- ----------------------------------------------------------------------------------------------------------
--------- --------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
----------------- ----------------------------------------------------------------------------------------------------------
--------- --------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------

3) Redéfinir le code de la classe Mediatheque pour pouvoir capturer et traiter une éventuelle
exception de type EmpruntAvantInformatisation comme indiquez ci-dessus. La gestion de
l'exception affichera le message suivant : "article numéro codeArticle est emprunté par abonné
idAbonne avant informatisation du système" où codeArtilce désigne le code de l'article à restituer et
idAbonne désigne l'identifiant de l'abonné.

public class Mediatheque {


public static void main(String[] args){

......

FicheEmprunte fe;
boolean res;
int codeArtice

.......

... // initialisation et opérations sur la fiche fe


... // initialisation du code de l'article

--------------------------------------- --------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------- ----------------------------------------------------------------------------
--------------------------------------- --------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------- ----------------------------------------------------------------------------
--------------------------------------- --------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 7
----------------------------------------------- ----------------------------------------------------------------------------
--------------------------------------- --------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------
}}

Exercice 3 (2 pts)
Dans cet exercice, on manipule des comptes bancaires. Un compte bancaire, normal, est caractérisé
par un identifiant IBAN, un solde et le nom du propriétaire. Le solde d'un compte bancaire normal
ne peut pas être négatif.

public class CompteBancaire {


String codeIBAN;
String proprietaire;
float solde;
CompteBancaire(String code, String prop){
this.codeIBAN = code;
this.proprietaire = prop;
this.solde = 0;
}
}

Nous voulons définir la classe CompteBancaireDebiteur qui hérite de la classe CompteBancaire. Le


solde d'un compte bancaire débiteur peut être négatif. C'est pourquoi un compte bancaire débiteur
possède de plus, par rapport à un compte normal, le montant débiteur permis. Définir la classe
CompteBancaireDebiteur. Vous définissez un constructeur avec trois paramètres : le code IBAN, le
nom du propriétaire et le montant débiteur permis.

-----------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 8
Exercice 4 (2,25 pts)
Pour chacune des affirmations suivantes dites que c'est vrai ou faux. Toute réponse
incorrecte sera pénalisée par une note négative alors qu'une réponse vide ne le sera pas. Par
exemple le total d'une réponse correcte et d'une réponse incorrecte sera 0, le total d'une
réponse correcte et de deux réponses incorrecte sera 0, le total d'une réponse correcte et
d'une réponse vide sera la note d'une réponse correcte.

Affirmations Vrai Faux


Le polymorphisme permet de définir une collection d'objets de même
type mais de comportements différents.
La commande java Employe.class permet d'exécuter la classe
Employe.java
En Java, une interface peut étendre une classe abstraite
En Java, une classe abstraite peut implémenter une interface.
L'héritage permet la mise en œuvre du polymorphisme dynamique
La méthode compareTo de l'interface Comparable permet de définir
une relation d'ordre entre deux objets
En java une classe ne peut pas implémenter plusieurs interfaces.
L'héritage permet de factoriser le code et par la suite le réduire
En java une classe peut étendre plusieurs classes.
Il faut veiller à ce que Deux objets qui sont égaux via la méthode
equals() doivent avoir le même code de hachage retourné par
méthode hashCode().
Une collection d'objets Java de type Set permet la duplication d'objets

Bon Travail

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 9
Nom & prénom :.............................................CIN :....................Salle :............N° Place : ......

Code Signature des


surveillants

NE RIEN ECRIRE ICI

---------------------------------------------------------------------------------------------
Institut Supérieur Année universitaire
d’Informatique et de 2015-2016
Mathématique de ***
Monastir
***
Code Note sur 20
Examen
Session principale

Module : Programmation orientée objet Date: Janvier 2016


Section : LF2 & LA2 INFO Durée: 1h30
Enseignant : S. BHIRI Documents: non autorisés
Nombre de pages: 10

Attention :
- Lisez attentivement la totalité de l’énoncé avant d’entamer les réponses.
- les documents ne sont pas autorisés.
- Le barème est donné à titre indicatif.
- Cet énoncé est sur 10 pages.

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 1
NE RIEN ECRIRE ICI

---------------------------------------------------------------------------------------------
Exercice 1 (8 pts)
Dans cet exercice on va implémenter un jeu inspiré du jeu "Water Pipes". Ce jeu dispose d'une
grille rectangulaire (supposons de 5 lignes et 6 colonnes) où on place des tubes de différents types
pour faire couler l'eau d'un point source (la case du coin haut gauche - ligne 0, colonne 0) vers un
point destination (la case du coin bas droite - ligne 4, colonne 5).
La figure suivante illustre une grille (5x6) où on a placé un ensemble de tubes formant un chemin
de tubes de la case de coordonnées 0x0 à la case de coordonnées 4x5.
C0 C1 C2 C3 C4 C5

L0

L1

L2

L3

L4

Il y a 12 types de tubes qu'on peu utiliser et qui définissent l'écoulement de l'eau.


HautBas GaucheDroite GaucheBas HautGauche DroiteBas HautDroite

L'eau coule du L'eau coule de L'eau coule de L'eau coule du L'eau coule de L'eau coule du
haut vers le la gauche vers la gauche vers haut vers la la droite vers haut vers la
bas la droite le bas gauche le bas droite

BasHaut DroiteGauche BasGauche GaucheHaut BasDroite DroiteHaut

L'eau coule du L'eau coule de L'eau coule du L'eau coule de L'eau coule du L'eau coule de
bas vers le la droite vers bas vers la la gauche vers bas vers la la droite vers
haut la gauche gauche le haut droite le haut

Dans cet exercice, le jeu consiste à vérifier si un chemin de tubes comme celui de la Figure ci
dessus achemine avec succès l'eau de la première case (de coordonnées 0x0) vers la dernière case
(de coordonnées 4x5).

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 2
Pour implémenter ce jeu, on définit les classes suivantes :
 Une classe pour chacun des 12 types de Tube. Par exemple pour le type de tube
GaucheDroite, on définit la classe TubeGaucheDroite; pour le type de tube
GaucheHaut, on définit la classe TubeGaucheHaut et ainsi de suite pour le reste des
types de tube.
 La classe Tube : c'est la classe mère des 12 classes types des tubes.
 La classe Commun : cette classe définit des attributs et méthodes de classes (statiques)
utilitaires qui seront utilisés par d'autres classes comme indiqués ci-dessous.
 La classe Coordonnees : cette classe représente les coordonnées d'une case sur la grille de
jeu.
 La classe Jeu : cette classe correspond au jeu lui même.

La classe Coordonnees est définie comme suit :


public class Coordonnees{
private int l, c; //l pour ligne et c pour colonne
public getLigne(){return l;}
public getColonne(){return c;}
public setLigne(int ligne){l=ligne;}
public setColonne(int colonne){c=colonne;}
}

La classe Commun est définie comme suit :


public class Commun{
public static final int NBLIGNES = 5;
public static final int NBCOLONNES = 6;

public static boolean caseADroite (Coordonnees cp, Coordonnees cc){}


// indique si la case courante de coordonnées cc
// est à droite ou pas de la case précédente de coordonnées cp

... // définitions de méthodes similaires à la méthode caseADroite


}

La classe Jeu est définie comme suit. Des explications de cette classe sont données ci-dessous.
public class Jeux {

Tube[ ][ ] plateau = new Tube[Commun.NBLIGNES][Commun.NBCOLONNES];

ArrayList<Coordonnees> chemin = new ArrayList<Coordonnees>();


// un chemin est défini comme un tableau dynamique de coordonnées

Coordonnees coordP;
Coordonnees coordC = null;
/*coordP (P pour précédent) et coordC (C pour courant) détiennent
les coordonnées des deux cases successives comme expliqué ci-
dessous. La méthode getTubeSuivant met à jour ces attributs.
*/

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 3
... // définition d'autres attributs et méthodes d'initialisation
// du plateau et du chemin

private Coordonnees getCoordonneesSuivantes(){};


/*cette méthode retourne les coordonnées de la case suivante du
chemin. Vous utilisez cette méthode sans se soucier de son
implémentation
*/

private Tube getTubeSuivant(){


coordP = coordC;
coordC = getCoordonneesSuivantes();
if (coordC != null) return
plateau[coordC.getLigne()][coordC.getColonne];
else return null;
}
// retourne le tube, suivant dans le chemin, de coordonnées coordC
// et met à jour les attributs coordP et coordC.

public void jouer(){


Tube tubeCourant, tubeSuivant;
tubeCourant = getTubeSuivant();
boolean bloquage = false;
while (( ! bloquage) && (tubeCourant != null)){
tubeCourant.couler();
tubeSuivant = getTubeSuivant();
/* cet appel retourne le tube suivant au tube courant dans
le chemin. Cet appel met à jour aussi les attributs coordP
et coordC. coordP détientra alors les coordonnées du
tubeCourant qu'on vient de faire couler. coordC détientra
les coordonnées du tubeSuivant (s'il y'en a)
*/
if (!(tubeCourant.compatible(tubeSuivant, coordP, coordC))){
bloquage = true;
// problème de compatibilité des tubes
} else {
tubeCourant = tubeSuivant;
}
} // fin du while

if (((! bloquage) && (coordP.getLigne() == Commun.NBLIGNES)


&& (coordP.getColonne() == Commun.NBCOLONNES)))
System.out.println("Gagné! Le chemin proposé est
valide");
else

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 4
System.out.println("Perdu! Le chemin proposé n'est pas
valide");
}

public static void main(String[] args){


// création, initialisation et déroulement d'une partie du jeu
}
}

Comme indiqué dans la classe Jeu, une disposition d'une partie de jeu est définie par deux
attributs:
 attribut plateau : qui est un tableau à deux dimensions sur lequel on placera les tubes.
 attribut chemin : un tableau à taille variable qui correspond aux coordonnées des cases
constituant le chemin à vérifier. Par exemple le chemin correspondant à notre exemple
illustré par la figure ci-dessus sera représenté par le tableau suivant où chaque case
représente une instance de la classe Coordonnees.

l=0 l=0 l=1 l=1 l=1 l=1 l=2 l=2 l=3 l= 4 l=4 l=4
c=0 c=1 c=1 c=2 c=3 c=4 c=4 c=3 c=3 c=3 c=4 c=5

La méthode getCoordonneesSuivantes retourne les coordonnées de la case suivante (tube


suivant) dans le chemin. Le premier appel de cette méthode retourne les coordonnées de la
première case (premier tube) qui sera toujours la case de coordonnées (l=0, c=0).
La méthode getTubeSuivant renvoie le tube de la case suivante du chemin - case du plateau
ayant comme coordonnées coordC. Elle met à jour aussi les variables coordP et coordC de telle
façon que coordC détiendra les coordonnées du tube à renvoyer et coordP pointera sur la case
devenue précédente (par rapport au tube renvoyé).
1) Donner le code de la classe Tube. (3 pts)

------------------------------------------------------------------------------------------------------------------------------
-------------public abstract class Tube {
-----------------------public void couler();------------------------------------------------------------------------------
-----------------------public boolean compatible(Tube ts, Coordonne cp, Coordonne cc);-------------------
--------------}--------------------------------------------------------------------------------------------------------------

2) Donnez le code de la classe TubeGaucheDroite. La méthode couler de cette classe affichera


le message suivant : "L'eau coule de gauche à droite". Vous pouvez utiliser l'opérateur
instanceOf qui permet de vérifier si un objet est une instance d'une classe donnée. Par
exemple la condition (o instanceOf TubeGaucheHaut) avec o un objet retourne vraie si o est
une instance de (de type) TubeGaucheHaut; retourne faux sinon. La méthode statique
caseADroite de la classe Commun permet de vérifier si une case est à droite d'une autre. (5
pts)

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 5
------------------------------------------------------------------------------------------------------------------------------
public class TubeGaucheDroite extends Tube{

public void couler(){


System.out.println("L'eau coule de gauche à droite");
}

public boolean compatible(Tube ts, Coordonnee cp, Coordonnee cc){


return (Commun.caseADroite(cp,cc) &&
((ts instanceOf TubeGaucheDroite) || (ts instanceOf
TubeGaucheBas) || (ts instanceOf TubeGaucheHaut))
);
}
}

Exercice 2 (6 pts)

Soit la classe CompteBancaire suivante.

public class CompteBancaire {


private int compteId;
private float indiceSolvabilite = 0.025;
// l'indice de solvabilité est > 0.025 et < 0.35

private float salaire = 1;


CompteBancaire(int id){this.compteId = id;}

... // autre attributs et méthodes accesseurs à certains attributs

public float calculerDureeRemboursement (float montantDemande) {


return (montantDemande / (salaire*indiceSolvabilite));
}
}

La méthode calculerDureeRemboursement calcule la durée de remboursement, en nombre de


mois, d'une demande de prêt bancaire d'un montant passé en paramètre (montantDemande).
Soit la classe AgenceBancaire suivante.
public class AgenceBancaire {
public static void main(String[] args){
int id;
float montantDemande;
int duree;

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 6
.... // initialisation de id
... // initialisation du montant demandé avec une valeur positif

CompteBancaire cp = new CompteBancaire(id);


duree = cp.calculerDureeRemboursement(montantDemande);
System.out.println("La duree de remboursement du montant
demande " + montantDemande + " est de " + dureeRemboursement
+ "mois".);

}}

Ces deux classes compilent et s'exécutent avec succès. Cependant, elles présentent le problème
suivant : la logique applicative exige en fait que le montant du prêt demandé ne doit pas dépasser
un montant maximum. Le montant maximum d'un prêt qu'on peut accorder à un compte est
calculé selon la formule suivante : montant maximum = 240 * salaire * indiceSolvabilite. Ainsi
pour un compte bancaire avec un salaire de 1000 TND et indice de solvabilité 0.3, le montant
maximum qu'on peut lui accorder est 72000 TND.
Un montant d'une demande de prêt supérieur au montant maximum correspond à une
anomalie/problème/exception qu'il faut détecter dans la classe CompteBancaire et qui doit être
traité par l'agence bancaire. Le traitement sera simplement l'affichage du message suivant à
l'écran:
"Désolé! Le montant que vous pouvez emprunter doit être inférieur à <<MONTANT
MAXIMUM>>."
Avec MONTANT MAXIMUM la somme d'argent maximum que ce compte peut prêter est qui
est calculé selon la formule donnée ci-dessus.
Dans cet exercice, on veut implémenter cette logique métier en utilisant les exceptions JAVA.

1) Définissez l'exception MontantNonConforme qui correspond à l'occurrence du problème de


demande de prêt avec un montant supérieur au montant maximum. Cette classe doit contenir un
champ qui contient le montant maximum du prêt.

public class MontantNonConforme -----------extends Exception {


float montatMaximum,

public getMontantmax(){return montantMaxumium;}


MontantNonCoinforme(montamax){
this.montantMaximum = montantMax;
//super(montantMaximum)}
}

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 7
2) Modifier le code de la méthode calculerDureeRemboursement afin de détecter et lancer une
exception de type MontantNonConforme quand elle se produit.
------------------------------------------------------------------------------------------------------------------- -------
public float calculerDureeRemboursement(float montantDemande) throws
MontantNonConforme {
if (montantDemande > 240*salaire*indicesolvabilite){
throw new MontantNonConforme (240*salaire*indice)
} else
return (montantDemande / (salaire*indiceSolvabilite));
}

3) Redéfinir le code de la classe AgenceBancaire pour pouvoir capturer et traiter une éventuelle
exception de type MontantNonConforme comme indiquez ci-dessus.
public class AgenceBancaire {
public static void main(String[] args){
int id;
float montantDemande;
int duree;
.... // initialisation de id
... // initialisation du montant demandé avec une valeur positif

CompteBancaire cp = new CompteBancaire(id);

------------------try{
duree =
cp.calculerDureeRemboursement(montantDemande);
} catch (MontantNonConforme m)
{ System.out.println ("le montant maximum que tu peux emprunter est "+
m.getMontantMax())
}
}}

Exercice 3 (2 pts)
Dans cet exercice, on manipule des formes. Un cercle est caractérisé par son centre et la longueur de
son rayon.
Soient les deux classes suivantes Point et Forme.
public class Point {
private int x, y;
Point(int abs, int ord){this.x = abs; this.y = ord}
}

public class Forme {

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 8
Point centre;
Forme (int abs, int ord){this.centre = new Point(abs, ord);}
}

Définir la classe Cercle. Vous définissez un constructeur avec trois paramètres. Les deux premiers
correspondent aux coordonnées du centre du cercle et le troisième la longueur de son rayon.

-----------------------------------------------------------------------------------------------------------------------------
public class Cercle extends Forme{
float rayon;
public Cercle(int x, int y, float r){
super(x,y);
this.rayon = r;
}
}

Exercice 4 (4 pts)
1) Quelle est la différence entre la redéfinition et la surcharge de méthodes. (1,5 pts)
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
2) Donner la définition du polymorphisme. Quel mécanisme permet l'implémentation du
polymorphisme (dynamique) en programmation orientée objet. (1,5 pts)

------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
3) Pour pouvoir créer une collection triée d'objets instances d'une classe nommée Composant,
quelle contrainte doit respecter cette classe Composant? Pourquoi? (1 pt)

Bon Travail

_________________________________________________________________________________________
Programmation Orientée Objet – LF2 & LA2 INFO - ISIMM 9

Vous aimerez peut-être aussi