Université Mohammed Premier Année universitaire 2011-2012. Correction de l examen écrit de la session ordinaire 18 Février 2012



Documents pareils
Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation par les Objets en Java

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Gestion distribuée (par sockets) de banque en Java

Programmer en JAVA. par Tama

Programmation Par Objets

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Flux de données Lecture/Ecriture Fichiers

TD/TP PAC - Programmation n 3

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Tp 1 correction. Structures de données (IF2)

Chapitre 10. Les interfaces Comparable et Comparator 1

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Projet de programmation (IK3) : TP n 1 Correction

Premiers Pas en Programmation Objet : les Classes et les Objets

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Java Licence Professionnelle CISII,

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Corrigé des exercices sur les références

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Programmation avec des objets : Cours 7. Menu du jour

TD/TP PAC - Programmation n 3

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TD3: tableaux avancées, première classe et chaînes

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Cours Programmation Système

Package Java.util Classe générique

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Auto-évaluation Programmation en Java

Solutions du chapitre 4

Un ordonnanceur stupide

TP1 : Initiation à Java et Eclipse

Objets et Programmation. origine des langages orientés-objet

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

TP, première séquence d exercices.

Programmation Objet Java Correction

Développement Logiciel

Java Licence Professionnelle CISII,

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INITIATION AU LANGAGE JAVA

Cours de Systèmes d Exploitation

as Architecture des Systèmes d Information

Plan du cours. Historique du langage Nouveautés de Java 7

TP3 : Manipulation et implantation de systèmes de fichiers 1

Dis papa, c est quoi un bus logiciel réparti?

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Bases Java - Eclipse / Netbeans

Cahier des Charges du Projet Domotique. Choquet Mathieu Masson Jérôme Groupe 6. Domotique. p.1

Cours d initiation à la programmation en C++ Johann Cuenin

Synchro et Threads Java TM

Applet pour visualiser les variables «automate» notifiées

INF 321 : mémento de la syntaxe de Java

STAGE IREM 0- Premiers pas en Python

Langage Java. Classe de première SI

Java DataBaseConnectivity

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Utilisation d objets : String et ArrayList

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

2. Comprendre les définitions de classes

Langage à objets : JAVA (1)

Héritage presque multiple en Java (1/2)

Threads. Threads. USTL routier 1

Une introduction à Java

Corrigés des premiers exercices sur les classes

Chapitre VI- La validation de la composition.

Introduction à JDBC. Accès aux bases de données en Java

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Cours 1: Java et les objets

Exercices sur les interfaces

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

PROGRAMMATION PAR OBJETS

Remote Method Invocation en Java (RMI)

Cours 14 Les fichiers

Le langage C. Séance n 4

Remote Method Invocation (RMI)

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

ACTIVITÉ DE PROGRAMMATION

Traduction des Langages : Le Compilateur Micro Java

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Programme Compte bancaire (code)

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Programmation Orientée Objet application au langage Java Version Novembre 2007

La gestion des exceptions

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Génie Logiciel avec Ada. 4 février 2013

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

Android UIThread, Thread, Handler et AsyncTask

Plateforme PAYZEN. Définition de Web-services

Transcription:

Université Mohammed Premier Année universitaire 2011-2012 Faculté des Sciences Filière SMI Département de Mathématiques Module : POO Java et d Informatique Semestre : S5 Correction de l examen écrit de la session ordinaire 18 Février 2012 Responsable du cours: El Mostafa DAOUDI Exercice 1 : Expliquez pourquoi l'exécution du programme java ci-dessous lance l exception «NullPointerException» class ClasseA { public int a; public class TestExamen { ClasseA [] obja=new ClasseA[10]; obja[0].a=2; Solution Cette exception est lancée car l objet obja[0] n est pas instancié (n est pas créé) Exercice 2: 1. Considérons la classe «CalcFactorielle» définie ci-dessous. Ecrire la méthode main() qui doit récupérer un entier n sur la ligne de commande, appelle la méthode «fact(n)» et ensuite affiche n!. Programme Java Exemples d exécutions: public class CalcFactorielle { public static int fact(int k) { // calcule k! int f=1; // f=k! for (int i=1; i<=k; i++) f=f*i; return f; // > java CalcFactorielle 6 6! = 720 > java CalcFactorielle -2-2! = 1 > java CalcFactorielle 5.8 Exception in thread "main" java.lang.numberformatexception: 5.8 > java CalcFactorielle Exception in thread "main" java.lang.arrayindexoutofboundsexception Solution int n=integer.parseint(args[0]); int f=fact(n); System.out.println(n+"! = "+f); Remarque : - Il n est pas nécessaire de créer un objet de type CalcFactorielle et ensuite appeler la méthode fact() pour cette objet. Par exemple CalcFactorielle obja=new CalcFactorielle(); int f= ObjA.fact(n); car la méthode fact() est static donc indépendante de l objet. - La méthode fact() retourne un entier de type int, donc le résultat de l appel doit être affecté à une variable de type int. Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 1/12

2. Dans cette question on s intéresse à la gestion des différentes erreurs qui peuvent se produire. - Modifiez la méthode «fact()» pour qu elle puisse générer une exception de type «ExceptionNegatif» (classe à définir) si on veut calculer la factorielle d'un entier négatif. - Réécrire la méthode main() afin de traiter toutes les exceptions mentionnées sur les exemples d exécutions ci-dessus. class ExceptionNegatif extends Exception { public ExceptionNegatif(String msg){ super(msg); public class CalcFactorielle { public static int fact(int k) throws ExceptionNegatif { int f=1; if (k<0) throw new ExceptionNegatif(k+": calcul de la factorielle d'un entier négatif "); for (int i=1; i<=k; i++) f=f*i; return f; try { int n=integer.parseint(args[0]); int f=fact(n); System.out.println(n+"! = "+f); catch (ExceptionNegatif e){ System.out.println(e.getMessage()); catch (java.lang.numberformatexception e){ System.out.println("Il faut saisir un entier "); catch (java.lang.arrayindexoutofboundsexception e){ System.out.println("Manque d'arguments sur la ligne de commande "); Remarque : - Le tableau args[] contient les arguments passés sur la ligne de commandes. Attention : les arguments sont des chaines de caractères de type String, il faut ensuite les convertir suivant les besoins. Par exemple Integer.parseInt(args[0]); convertit le premier argument en un entier de type int. - Ne pas rajouter else après l instruction if. if (k<0) throw new ExceptionNegatif(k+": calcul de la factorielle d'un entier négatif "); else // n est pas nécessaire. for (int i=1; i<=k; i++) f=f*i; - L instruction : int n=integer.parseint(args[0]); doit être mis dans le bloc try afin de pouvoir traiter les exceptions générées par la lecture sur la ligne de commande. 3. Lorsque la valeur de n est «très grande» (dépasse une limite à calculer), l exécution du programme retourne un résultat erroné (voir l exemple d exécution ci-dessous). Exemple d exécution : > java CalcFactorielle 20 20! = -2102132736 Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 2/12

- Ecrire une classe nommée «ExceptionGrand» qui définit une exception qui sera levée si on calcule la factorielle d'un entier «très grand». - Mettre à jour la méthode «fact()» pour qu elle puissent lancer les deux exceptions de types «ExceptionNegatif» et «ExceptionGrand», définies précédemment. Indication : La valeur limite de n peut être déterminée pendant les étapes de calcul de la factorielle. - Mettre à jour la méthode main() afin de traiter toutes les exceptions envisagées. - De la relation i!=i*(i-1)! on déduit que s il n y a pas d erreur de calcul, alors on a : i!/(i-1)!=i. - Dans une variable, par exemple f2, on sauvegarde la valeur de i! et dans une autre variable, par exemple f1, on sauvegarde (i-1)!. - On teste : si (f2/f1)!= i alors on s arrête car il y a erreur : la valeur maximale est atteinte, donc on doit traiter l exception. Sinon on continue class ExceptionNegatif extends Exception { public ExceptionNegatif(String msg){ super(msg); class ExceptionGrand extends Exception { public ExceptionGrand(String msg){ super(msg); public class CalcFactorielle { public static int fact(int k) throws ExceptionNegatif, ExceptionGrand { int f1=1,f2=1; if (k<0) throw new ExceptionNegatif (k+": calcul de la factorielle d'un entier négatif "); for (int i=1; i<=k; i++) { f2=f1*i; // f2 = i! et f1=(i-1)! if ((f2/f1)!=i) throw new ExceptionGrand(k+": est grand. Entrer un entier <= "+(i-1)); f1=f2; return f2; try { int n=integer.parseint(args[0]); int f=fact(n); System.out.println(n+"! = "+f); catch (ExceptionNegatif e){ System.out.println(e.getMessage()); catch (ExceptionGrand e){ System.out.println(e.getMessage()); catch (java.lang.numberformatexception e){ System.out.println("Il faut saisir un entier "); catch (java.lang.arrayindexoutofboundsexception e){ System.out.println("Manque d'arguments sur la ligne de commande "); Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 3/12

Problème: Gestion du prêt dans une bibliothèque On suppose que le fond documentaire d une bibliothèque est composé d ouvrages qui sont des livres ou des disques (livres enregistrés sur des CD ou des DVD). Le but de ce problème est de modéliser la gestion de cette bibliothèque pour l emprunt des ouvrages. Partie I Dans cette partie on ne fait pas de différence entre un livre et un disque. 1. Définir une classe nommée «Ouvrage» pour modéliser les ouvrages. Elle possède : - Au moins trois attributs privés de type String à savoir : titre : pour mémoriser le litre de l ouvrage auteur : pour mémoriser le nom du premier auteur code : pour identifier de manière unique chaque ouvrage. Le code est composé d un numéro qui correspond à l ordre de création de l ouvrage suivi des trois premières lettres du nom de l auteur; ou de toutes les lettres du nom de l auteur (si son nom a moins de trois lettres); ou de la chaine "?" si le nom de l auteur est la chaîne vide. - Un constructeur pour créer et initialiser tous les attributs d un objet de type «Ouvrage». - Au moins les méthodes suivantes (en cas de besoin, vous rajoutez d autres méthodes) : public String getcode() ; // Retourne le code de l ouvrage public String tostring() ; // Retourne la chaine : titre+"-- "+code class Ouvrage { private String auteur; private String titre; private String code; private static int cptouvrages; //compteur qui désigne l ordre de création d un ouvrage. public Ouvrage(String titre, String auteur){ this.titre = titre; this.auteur = auteur; cptouvrages++; // à chaque creation d un objet, on incrémente le compteur */ /* Dans la suite, on détermine la valeur de l attribut code et on l initialise */ if (auteur.length()==0) code = "?"; else if (auteur.length() < 3) code =auteur; else code = auteur.substring(0,3); code= cptouvrages+code; public String getcode(){ return code; public String tostring(){ return titre+"-- "+code; Remarque : - La méthode tostring() retourne une chaine de type String. Elle ne fait l affichage d une chaine de caractères. 2. Définir une classe nommée «Bibliotheque» pour modéliser la bibliothèque. Elle possède : - Au moins deux attributs privés de type tableau de Ouvrage à savoir : lesouvrages : pour mémoriser tous ouvrages de la biblothèque. ouvragesempruntes : pour mémoriser les ouvrages empruntés. Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 4/12

- un constructeur pour créer et initialiser tous les attributs d un objet de type «Bibliotheque». On suppose que la taille initiale des tableaux est saisie au clavier. Pour simplifier, on suppose que les deux tableaux ont la même taille et que la taille initialement saisie est suffisante pour enregistrer tous les ouvrages. - Au moins les méthodes suivantes (en cas de besoin, vous rajoutez d autres méthodes) : public void ajouteouvrage(string titre, String auteur) ; // Ajoute un ouvrage à la bibliothèque. public void affichetous() ; // Affiche tous les ouvrage de la bibliothèque. public void afficheempruntes() ; // Affiche tous les ouvrages empruntés. public Ouvrage get(string code) ; // Retourne l ouvrage dont le code est passé en paramètre. public boolean estemprunte(ouvrage o) ; // Retourne «true» si l ouvrage o est emprunté // sinon elle retourne «false». public void emprunte(string code) ; // Ajoute à la fin de liste des ouvrages empruntés, // l ouvrage dont le code est passé en paramètre. class Bibliotheque { private Ouvrage [] lesouvrags; private Ouvrage [] OuvragesEmpruntes; private int nbouvrages; // Désigne le nombre d ouvrages. Par défaut, il est initialisé à 0 private int nbouvragesemp; // Désigne le nombre d ouvrages empruntés. public Bibliotheque(int n) { lesouvrages=new Ouvrage[n]; OuvragesEmpruntes = new Ouvrage[n]; /* Le constructeur permet de créer les deux tableaux dans lesquels on va ajouter les ouvrages. n désigne le nombre d ouvrages prévus. Si le nombre d ouvrages dépasse la taille initialement prévue, on peut adapter la taille des tableaux au nombre d ouvrages (voir Exercice3 : Gérer une pile d'entiers dans la série complément d exercices.). Cette situation n est pas prévue dans ce problème. On suppose que la taille n est suffisamment grande. */ public void ajouteouvrag(string titre, String auteur){ Ouvrage unouvrage = new Ouvrage(titre,auteur); // on crée un nouveau ouvrage lesouvrages[nbouvrages]=unouvrage; // on l insère à la fin de la liste. // Attention : on ne l insère pas à la fin du tableau. nbouvrages ++; // on incrémente le nombre d ouvrages public void affichetous(){ for(int i=0; i< nbouvrages; i++) // on parcours la liste des ouvrages System.out.println(lesOuvrages[i]); // appel de tostring (voir le cours). public void afficheempruntes(){ for(int i=0; i< nbouvragesemp; i++) // on parcourt la liste des ouvrages empruntés. System.out.println(OuvragesEmpruntes[i]); // appel de tostring (voir le cours). public Ouvrag get(string code){ // retourne une valeur de type Ouvrage for(int i=0; i< nbouvrages; i++) // on parcourt la liste des ouvrages if (lesouvrages[i].getcode().equals(code)) // comparaison des codes return lesouvrages[i]; return null; Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 5/12

/* Attention : - On compare le code de l ouvrage courant ( lesouvrages[i] ) avec le code donné en paramètre. - On ne peut pas accéder directement au code de l ouvrage courant car l attribut code et private. Donc on ne pas écrire «les Ouvrages[i].code» - Puisque l attribut code est private, pour y accéder on utilize la method getcode() - Pour la comparaison, on ne peut utiliser le symbole «==». En effet «==» compare les références et non les contenus (voir cours). */ public boolean estemprunte(ouvrage o){ for(int i=0; i< nbouvragesemp; i++) if (OuvragesEmpruntes[i].getCode().equals(o.getCode())) return true; return false; public void emprunte(string code){ // On détermine l ouvrage dont le code est égale au code donné en paramètre Ouvrag unouvrage=this.get(code); // On teste si l ouvrage est pas déjà emprunté if(!estemprunte(unouvrage)) { /* si l ouvrage n est pas emprunté, on le rajoute dans la liste des ouvrages empruntes */ OuvragesEmpruntes[nbOuvragesEmp]=unOuvrage; nbouvragesemp ++; // On incrémente le nombre d ouvrages empruntés // On a besoin des deux méthodes suivantes : voir la classe «TestBibliotheque» public Ouvrage [] gettouslesouvrages(){ // Retourne tous les ouvrages return lesouvrages; public Ouvrage [] gettouslesemprunts(){ // Retourne tous les ouvrages empruntés. return OuvragesEmpruntes; 3. Définir une classe nommée «TestBibliotheque» qui contient la méthode main(). Pour les tests : - On crée une bibliothèque (un objet de type Bibliothèque) composée de 4 ouvrages. - On emprunte le deuxième et le troisième ouvrage. - On affiche tous les ouvrages. - On affiche tous les ouvrages empruntés. Solution 1 : lecture en utilisant la classe clavier public class TestBibliotheque { int n= Clavier.lireInt() ; String titre, auteur; Bibliotheque m = new Bibliotheque(n); // ajout de 4 ouvrages for (int i=1 ; i<=4 ;i++) { System.out.print("Entrez un Titre : "); titre = Clavier.lireString(); System.out.print("Entrez l'auteur : "); auteur = Clavier.lireString(); m.ajouteouvrage(titre,auteur); //ajoute un ouvrage dans la bibliothèque Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 6/12

System.out.println(); System.out.print("Liste des ouvrages : "); m.affichetous(); // affiche tous les ouvrages /* Pour l emprunt, on a besoin d accéder au deuxième et troisième ouvrage de la bibliothèque. Les ouvrages de la bibliothèque sont mémorisés dans le tableau «lesouvrages» qui est privé, donc on ne peut pas y accéder directement. Pour cela, on définie la méthode «gettouslesouvrages();» qui retourne tous les ouvrages de la bibliothèque dans un tableau. */ Ouvrage [] ouvr; ouvr = m.gettouslesouvrages(); // On récupère tous les ouvrages m.emprunte(ouvr[1].getcode()); // empruntés le deuxième ouvrage m.emprunte(ouvr[2].getcode()); // empruntés le troisième ouvrage System.out.println(); System.out.print("Liste des ouvrages empruntes : "); m.afficheempruntes();// affiche tous les ouvrages empruntés Solution 2 : lecture en utilisant les flux public class TestBibliotheque { InputStreamReader in = null; BufferedReader tampon = null; try { int n String titre, auteur; in = new InputStreamReader(System.in); tampon = new BufferedReader(in); n=integer.parseint(tampon.readline()); Bibliotheque m = new Bibliotheque(n); for(int i=1 ;i<=4 ; i++) { System.out.print("Entrez un Titre : "); titre = tampon.readline(); System.out.print("Entrez l'auteur : "); auteur = tampon.readline(); m.ajouteouvrage(titre,auteur); // le reste ne change pas catch (IOException ioe) { System.out.println("Erreur d'entér sortie "); Partie II Dans cette partie, on distingue entre les livres et les disques. 1. Définir une classe nommée «Livre» pour modéliser les livres. Elle hérite de la classe «Ouvrage» Elle est caractérisée par : - isbn : un attribut de type long, propre à la classe «Livre». Il désigne le code ISBN. - Un constructeur pour créer et initialiser tous les attributs d un objet de type «Livre». - La redéfinition de la méthode tostring() ; pour retourner la chaine : titre+"-- "+code +"--"+isbn N.B. dans cette méthode, on doit appeler la méthode tostring() déjà définie dans la classe Ouvrage. class Livre extends Ouvrage{ private long isbn; public Livre (String titre, String auteur, long isbn){ super(titre,auteur); this.isbn = isbn; Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 7/12

public String tostring(){ return super.tostring()+"--"+isbn; // appel de super.tostring() pour avoir titre+"-- "+code // Pour l affichage d un livre public void affichelivre() { System.out.println(this); 2. Définir une classe nommée «Disque» pour modéliser les disques. Elle hérite de la classe «Ouvrage» Elle est caractérisée par - type : un attribut de type String, propre à la classe «Disque». Il désigne de type de disque : CD ou DVD. - Un constructeur pour créer et initialiser tous les attributs d un objet de type «Disque». - La redéfinition de la méthode tostring() ; pour retourner la chaine : titre+"-- "+code +"--"+type N.B. dans cette méthode, doit appeler la méthode tostring() déjà définie dans la classe Ouvrage. class Disque extends Ouvrage{ private String type; // CD ou DVD public Disque (String titre, String auteur, String type){ super(titre,auteur); this.type = type; public String tostring(){ return super.tostring()+"--"+type; // Pour l affichage d un livre public void affichedisque() { System.out.println(this); 3. Mettre à jour la classe nommée «Bibliotheque» qui modélise la bibliothèque. On suppose que Les livres et les disques sont mémorisés dans le même tableau. Les livres et les disques empruntés sont mémorisés dans le même tableau. Pour l ajout, on distingue entre les livres et les disques, pour cela, on définit les deux méthodes : public void ajoutelivre(string titre, String auteur, long isbn) public void ajoutedisque(string titre, String auteur, String type) class Bibliotheque{ private Ouvrage [] lesouvrages; private Ouvrage [] ouvragesempruntes; private int nbouvrages; private int nbouvragesemp ; public Bibliotheque(int n) { // identique à la partie I lesouvrages=new Ouvrage[n]; ouvragesempruntes = new Ouvrage[n]; public void ajoutelivre(string titre, String auteur, long isbn){ Livre unlivre = new Livre(titre, auteur, isbn); lesouvrages[nbouvrages]=unlivre; nbouvrages ++; Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 8/12

public void ajoutedisque(string titre, String auteur, String type){ Disque undisque = new Disque(titre,auteur, type); lesouvrages[nbouvrages]=undisque; nbouvrages ++; public void affichetouslesouvrages(){// identique à la partie I for(int i=0; i< nbouvrages; i++) System.out.println(lesOuvrages[i]); public void affichetouslesemprunts(){ // identique à la partie I for(int i=0; i<nbouvragesemp; i++) System.out.println(ouvragesEmpruntes[i]); public Ouvrage get(string code){ // identique à la partie I for(int i=0; i< nbouvrages; i++) if (lesouvrages[i].getcode().equals(code)) return lesouvrages[i]; return null; public boolean estemprunte(ouvrage o){ // identique à la partie I for(int i=0; i< nbouvragesemp; i++) if (ouvragesempruntes[i].getcode().equals(o.getcode())) return true; return false; public void emprunte(string code){ // identique à la partie I Ouvrag unouvrage=this.get(code); if(!estemprunte(unouvrage)) { OuvragesEmpruntes[nbOuvragesEmp]=unOuvrage; nbouvragesemp++ ; /* Dans la partie tests, on a besoin de faire l affichage des Disques et des livres. Pour l affichage des Disques: - Solution 1: on parcourt la liste des ouvrages, puis on fait des tests: si l ouvrage courant est un disque on l affiche sinon on passe à l ouvrage suivant. - Solution 2: Pour éviter les tests, on exploite le polymorphisme (voir le cours avec un exemple similaire). dans la classe «Ouvrage» on définie une méthode vide «affichedisque();» qui doit être rédéfinie la classe «Disque». */ public void affichedisqueempruntes(){ for(int i=0; i< nbouvragesemp; i++) ouvragesempruntes[i].affichedisque(); /* idem pour l affichage des Livres: Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 9/12

public void affichelivreempruntes(){ for(int i=0; i< nbouvragesemp; i++) ouvragesempruntes[i].affichelivre(); public Ouvrage [] gettouslesouvrages(){ return lesouvrages; public Ouvrag1 [] gettouslesemprunts(){ return ouvragesempruntes; 4. Mettre à jour la classe «TestBibliothèque» qui contient la méthode main(). Pour les tests : - On crée un objet de type «Bibliothèque» composé de 4 ouvrages (2 livres, un disque et un livre) - On emprunte le deuxième et le troisième ouvrage - On affiche tous les ouvrages empruntés. - On affiche tous les disques empruntés. - On affiche tous les livres empruntés. public class TestBibliotheque { InputStreamReader in = null; BufferedReader tampon = null; try { int n String titre, auteur; in = new InputStreamReader(System.in); tampon = new BufferedReader(in); n=integer.parseint(tampon.readline()); Bibliotheque m = new Bibliotheque(n); // ajoute un livre System.out.print("Entrez un Titre : "); titre = tampon.readline(); System.out.print("Entrez l'auteur : "); auteur = tampon.readline(); System.out.print("Entrez l'isbn : "); isbn=integer.parseint(tampon.readline()); m.ajoutelivre(titre,auteur,isbn); // ajoute un deuxième livre System.out.print("Entrez un Titre : "); titre = tampon.readline(); System.out.print("Entrez l'auteur : "); auteur = tampon.readline(); System.out.print("Entrez l'isbn : "); isbn=integer.parseint(tampon.readline()); m.ajoutelivre(titre,auteur,isbn); Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 10/12

// ajoute un disque System.out.print("Entrez un Titre : "); titre = tampon.readline(); System.out.print("Entrez l'auteur : "); auteur = tampon.readline(); System.out.print("Type : "); String type = tampon.readline(); m.ajoutedisque(titre,auteur, type); // ajoute un troisième livre System.out.print("Entrez un Titre : "); titre = tampon.readline(); System.out.print("Entrez l'auteur : "); auteur = tampon.readline(); System.out.print("Entrez l'isbn : "); isbn=integer.parseint(tampon.readline()); m.ajoutelivre(titre,auteur,isbn); System.out.println("Affichage de tous les ouvrages "); m.affichetouslesouvrages(); Ouvrag1 [] ouvr; ouvr = m.gettouslesouvrages(); m.emprunte(ouvr[1].getcode()); m.emprunte(ouvr[2].getcode()); System.out.println(); System.out.println(); System.out.println("Affichage de tous les ouvrages Empruntés "); m.affichetouslesemprunts(); System.out.println("Affichage de tous les Disques Empruntés "); m.affichedisqueempruntes(); System.out.println("Affichage de tous les Livres Empruntés "); m.affichelivreempruntes(); catch (IOException ioe) { System.out.println("Erreur d'entér sortie "); Il faut adapter la classe Ouvrage : Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 11/12

class Ouvrage { private String auteur; private String titre; private String code; private static int cptouvrags; public Ouvrage(String titre, String auteur){ // identique à la partie I this.titre = titre; this.auteur = auteur; cptouvrags++; if (auteur.length()==0) code = "?"; else if (auteur.length() < 3) code =auteur; else code = auteur.substring(0,3); code= cptouvrags+code; public String getcode(){ // identique à la partie I return code; public String tostring(){ // identique à la partie I return titre+"-- "+code; // Rajouter les méthodes affichedisque() et affichelivre() pour exploiter le polymorphisme public void affichedisque() { public void affichelivre() { N.B. - Pour la lecture d une chaine de caractères en utilise la classe Clavier.java de la manière suivante : int n = Clavier.lireInt() ; // pour saisir un entier String s = Clavier.lireString() ; // pour saisir une chaine de caractères. - On ne gère pas les exceptions qui peuvent être lancées. Barème : Exercice1 : 3pts, Exercice2 : 7pts, Problème : 10pts. 12/12