TD Examen POO [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

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 static int add(int i, int j){ i= i*i; return i+j ; } }

public class Test{ public static void main (String [] args){ int a=4, b=4; int s= Somme.add(a, b); System.out.println(a); System.out.println(s); } }

Les questions: a) Quelles sont les valeurs affichées de a et s. b) le passage de paramètre dans la méthode add(int i, int j) est dit 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 int codeOperation float prime

Operation(int codeOperation ,float prime)

Medecin int numMed String nom static int nbMed float salaireBaseMed Operation[] tabOperations Medecin(…) ajouterOperation(Operation op) calculSalaire()

  

Vector vect ajouterMed( Medecin med) ajouterInf(Infirmier inf) calculTotSalaire()

Infirmier int numInf String nom float salaireBaseInf int nbHeureSup float primeHeureSup Infirmier(…) 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

20

Stéphanie

Infirmier

Salaire de Base 600

nbHeureSup

primeHeureSup

10

4

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

Matricule

Nom

30

Mounir

Salaire de Base 1200

Opérations réalisées 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 static int add(int i, int j){ i= i*i; return i+j ; } }

public class Test{ public static void main (String [] args){ int a=4, b=4; int s= Somme.add(a, b); System.out.println(a); System.out.println(s); } }

Les questions:

a) Quelles sont les valeurs affichées de a et s. b) le passage de paramètre dans la méthode add(int i, int j) est dit 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 int codeOperation float prime

Operation(int codeOperation ,float prime)

Medecin int numMed String nom static int nbMed float salaireBaseMed Operation[] tabOperations Medecin(…) ajouterOperation(Operation op) calculSalaire()

  

Vector vect ajouterMed( Medecin med) ajouterInf(Infirmier inf) calculTotSalaire()

Infirmier int numInf String nom float salaireBaseInf int nbHeureSup float primeHeureSup Infirmier(…) 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

20

Stéphanie

Infirmier

Salaire de Base 600

nbHeureSup

primeHeureSup

10

4

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

Matricule

Nom

30

Stéphane

Salaire de Base 1200

Opérations réalisées 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 static int add(int i, int j){ i= i*i; return i+j ; } }

public class Test{ public static void main (String [] args){ int a=4, b=4; int s= Somme.add(a, b); System.out.println(a); System.out.println(s); } }

Les questions:

a) les valeurs affichées: a=4 et

s=20.

b) le passage de paramètre dans 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 float prime; private Operation(int codeOperation, float prime) { super(); this.codeOperation = codeOperation; this.prime = prime; } public int getCodeOperation() { return codeOperation; } public void setCodeOperation(int codeOperation) { this.codeOperation = codeOperation; } public float getPrime() { return prime; } public void setPrime(float prime) { this.prime = prime; } }

private private private private private

int numInf; String nom; float salaireBaseInf; int nbHeureSup; float primeHeureSup;

public Infirmier(int numInf, String nom, float salaireBaseInf, int nbHeureSup, float primeHeureSup) { super(); this.numInf = numInf; this.nom = nom; this.salaireBaseInf = salaireBaseInf; this.nbHeureSup = nbHeureSup; this.primeHeureSup = primeHeureSup; } public int getNumInf() { return numInf; } 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; private String nom; private static int nbMed; private float salaireBaseMed; private Operation[] tabOperations = new Operation[10]; public Medecin(int numMed, String nom, float salaireBaseMed, Operation[] tabOperations) { this.numMed = numMed; this.nom = nom; this.salaireBaseMed = salaireBaseMed; this.tabOperations = tabOperations; this.numMed++ ; } public int getNumMed() { return numMed; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public static int getNbMed() { return nbMed; } public static void setNbMed(int nbMed) { Medecin.nbMed = nbMed; } public float getSalaireBaseMed() { return salaireBaseMed; } public void setSalaireBaseMed(float salaireBaseMed) { this.salaireBaseMed = salaireBaseMed; } public Operation[] getTabOperations() { return tabOperations; } public void setTabOperations(Operation[] tabOperations) { this.tabOperations = tabOperations; }

//////////

////////

public void ajouterOperation(Operation op) { int i; for( i =0; i< tabOperations.length; i++) { if (tabOperations[i] == null) break ; } if (i< tabOperations.length) tabOperations[i] = op; }

//////////

import java.util.*;

public class Salaire { private Vector vect = new Vector(); public Salaire() { } public Salaire(Vector vect) { this.vect = vect; } public Vector getVect() { return vect; } public void setVect(Vector vect) { this.vect = vect; } public void ajouterMed( Medecin med) { vect.addElement(med); } public void ajouterInf(Infirmier inf) { vect.addElement(inf); } public float calculTotSalaire() { float tot=0; int i; for( i=0; i< vect.size(); i++) { if (vect.elementAt(i).getClass().getName().equals("Medecin")) { tot+= ((Medecin) vect.elementAt(i)).calculSalaireMed(); } else tot+= ((Infirmier) vect.elementAt(i)).calculSalaireInf(); } return tot; } }

public class TestPrincipale { public static void main(String[] args) { Operation[] tabOp = new Operation[10]; Infirmier inf1 =new Infirmier(20,"Stéphanie1",600,10,4); //Infirmier inf2 =new Infirmier(40,"Stéphanie2",10,1,4); tabOp[0]= new Operation(1, 500); tabOp[0]= new Operation(2, 1300); Medecin med =new Medecin(30,"Stéphane",1200,tabOp); med.ajouterOperation(new Operation(3, 700)); Salaire sal =new Salaire(); sal.ajouterInf(inf1); sal.ajouterMed(med); //sal.ajouterInf(inf2); System.out.println(sal.calculTotSalaire()); } }

////////

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 Enseignants: Mounir RIAHI, Imen ABIDI , Laila MELKI Barème: 6-14

Documents: non autorises Durée: 1h 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 void

public private

Abstract (classe) 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 1 2 3 4

Marque Peugeot Renault Kia Citroen

Modèle 308 classique x C5

Couleur noire blanche grise beige

Prix 35.000 25.000 30.000 35.000

flagVendu false false false false

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

NomClient Mohamed Samia Ali Raja

tabVoitures V3 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 Enseignants: Mounir RIAHI, Imen ABIDI , Laila MELKI Barème: 6-14

Documents: non autorises Durée: 1h 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 void

public private

Abstract (classe) 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 1 2 3 4

Marque Peugeot Renault Kia Citroen

Modèle 308 classique x C5

Couleur noire blanche grise beige

Prix 35.000 25.000 30.000 35.000

flagVendu false false false false

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

NomClient Mohamed Samia Ali Raja

tabVoitures V3 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 1 Mohamed 2 Samia 3 Ali 4 Raja 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

tabVoitures V3 V4

Examen: Programmation Orientée Objet Janvier 2018 Filière: STIC-L2 Enseignants: Mounir RIAHI, Ridha SALHI Barème:

Documents: non autorisés Durée: 1h30 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 { public static void main(String[] args) { try { System.out.print ("A"); int value = Integer.parseInt ("8A"); System.out.print ("B"); } catch (NumberFormatException e){ System.out.print ("C"); } finally{ System.out.print ("D"); } System.out.print ("E"); } }

1. 2.

Expliquez le rôle du bloc "finally". Le programme affiche: o ACDE o ACD o A0CDE o A0BCD o ACE 3. Si le block "catch" devient: catch (NumberFormatException e){ System.out.print ("C"); return ; } 3.1. Ce quoi le rôle du terme "return". 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( ); 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 Module String getMsgValide()

int numMod String label

ListeEtudiant Etudiant [] tabEtudiant ajouterEtudiant(Etudiant e)

int getType() float calculCoutModule()

Interface

INbModule final int MinNbModLangue=2 final int MinNbModTic=4

Rq: La flèche est une relation d'héritage

ModuleTic Etudiant int num; String nom; Module[] tabModule Etudiant(…) void ajouterModule(Module m)

final int type=2; float coutHeure; int nbHeure; ….

ModuleLangue final int type=1 float cout …

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". La

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 { private final int type=1; private float cout; public ModuleLangue(int numMod, String label, float cout) {

/*** supposé fait****/ } public float getCout() { return cout; } public void setCout(float cout) { this.cout = cout; } public int getType() { return type; } public float calculCoutModule() { return cout; } }

public class ModuleTic extends Module { private final int type=2; private float coutHeure; private int nbHeure; public ModuleTic(int numMod, String label, float coutHeure, int nbHeure) {

/***** à compléter ******/ } public float getCoutHeure() { return coutHeure; } public void setCoutHeure(float coutHeure) { this.coutHeure = coutHeure; } public int getNbHeure() { return nbHeure; } public void setNbHeure(int nbHeure) { this.nbHeure = nbHeure; } public int getType() { return type; } 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 Enseignants: Mounir RIAHI, Ridha SALHI Barème:

Documents: non autorisés Durée: 1h30 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 { public static void main(String[] args) { try { System.out.print ("A"); int value = Integer.parseInt ("8A"); System.out.print ("B"); } catch (NumberFormatException e){ System.out.print ("C"); } finally{ System.out.print ("D"); } System.out.print ("E"); } }

1.

Le bloc finally contient du code qui sera exécuté quelle que soit la manière dont le bloc try a été quitté. 2. Le programme affiche: o ACDE o ACD o A0CDE o A0BCD o ACE 3. Si le block "catch" devient: catch (NumberFormatException e){ System.out.print ("C"); return ; } 3.1. Ce quoi le rôle du terme "return". pour quitter immédiatement la méthode. 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 Module String getMsgValide()

int numMod String label

ListeEtudiant Etudiant [] tabEtudiant ajouterEtudiant(Etudiant e)

int getType() float calculCoutModule()

Interface

INbModule final int MinNbModLangue=2 final int MinNbModTic=4

Rq: La flèche est une relation d'héritage

ModuleTic Etudiant int num; String nom; Module[] tabModule Etudiant(…) void ajouterModule(Module m)

final int type=2; float coutHeure; int nbHeure; ….

ModuleLangue final int type=1 float cout …

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". La

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 { private private

final int type=1; float cout;

public ModuleLangue(int numMod, String label, float cout) { super(numMod, label); this.cout = cout; } public float getCout() { return cout; } public void setCout(float cout) { this.cout = cout; } public int getType() { return type; } public float calculCoutModule() { return cout; } }

public interface INbModule { final int MinNbModLangue=2; final int MinNbModTic=3; // void ajouterModule(Module m); }

public class ModuleTic extends Module { private final int type=2; private float coutHeure; private int nbHeure; public ModuleTic(int numMod, String label, float coutHeure, int nbHeure) { super(numMod, label); this.coutHeure = coutHeure; this.nbHeure = nbHeure; } public float getCoutHeure() { return coutHeure; } public void setCoutHeure(float coutHeure) { this.coutHeure = coutHeure; } public int getNbHeure() { return nbHeure; } public void setNbHeure(int nbHeure) { this.nbHeure = nbHeure; } public int getType() { return type; } public float calculCoutModule() { return coutHeure*nbHeure; } } public class ValideException extends Exception { public String getMsgValide() { return "l'étudiant doit avoir au 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