Conversation with Merlin [email protected] · Fri Jan 05 2024

Exercice n° 1 (= 12 points): Dans cet exercice tous les attributs des classes sont private, et supposez l'existence de la définition de leurs getters et setters. Dans une bibliothèque, on peut emprunter différents types d'ouvrage : livre, magazine, CD-ROM... Tous les ouvrages ont un code (type entier), un titre, un état booléen initialement à false (pour indiquer qu'un ouvrage est emprunté ou non), numéro de la carte du lecteur qui va emprunter l'ouvrage et le nombre de fois que l'ouvrage a été emprunté. Les livres sont décrits. en plus, par leur nom d'auteur et maison d'édition. Les magazines ont, de plus, les propriétés numéro et périodicité (hebdomadaire, mensuel. trimestriel). Enfin les CD-ROM ont de plus un thème.

  1. Définir la classe «< Ouvrage >> qui, à part ses attributs, contient : Un constructeur pour initialiser le code et le titre uniquement.
  • Une méthode << toString >> qui retourne une chaine contenant la valeur de ses attributs.
  • Une méthode << affiche >> qui affiche le résultat retourné de << toString >>.
  • Une méthode << emprunter >> qui admet comme paramètre le numéro de la carte du lecteur qui va emprunter l'ouvrage et modifie certains attributs de cet ouvrage. Un ouvrage ne peut être emprunté que son état le permet.
  1. Définir les classes << Livre >>, << Magazine >> et << Cdrom >> à partir de la classe << Ouvrage >>. Chacune de ces classes:
  • Contiendra un constructeur pour initialiser ses attributs local et hérités
  • Redéfinira la méthode << toString >> en incluant ses propres attributs.
  1. Définir une classe exécutable << Bibliotheque >> qui permet, à travers sa fonction main, de (choisir vous même les valeurs des instances):
  • Créer une instance de la classe << Livre »,
  • Créer une instance de la classe << Magazine »>,
  • Créer une instance de la classe << Cdrom >> Effectue les opérations suivantes : 。 emprunter le livre au lecteur dont le numéro de sa carte est 13, o emprunter le Cdrom au lecteur dont le numéro de sa carte est 8, Le lecteur dont le numéro de carte est 13 rend le livre qu'il a emprunté, emprunter le livre au lecteur dont le numéro de sa carte est 20. Affiche les valeurs des attributs de ces 3 instances. 4. Donner le résultat de l'affichage réalisé suite à l'exécution du main de la classe «Bibliotheque ».
  1. Maintenant on souhaite comptabiliser le nombre total de tout les emprunts effectués. Indiquer le code à ajouter dans la classe Ouvrage pour permettre de réaliser ce souhait.

Pour répondre à cette question, nous allons procéder étape par étape:

  1. Définition de la classe Ouvrage :
public class Ouvrage { private int code; private String titre; private boolean estEmprunte; private int numeroCarteLecteur; private int nombreEmprunts; public Ouvrage(int code, String titre) { this.code = code; this.titre = titre; this.estEmprunte = false; this.numeroCarteLecteur = 0; this.nombreEmprunts = 0; } public String toString() { return "Code: " + code + ", Titre: " + titre + ", Emprunté? " + estEmprunte + ", Numéro de carte: " + numeroCarteLecteur + ", Nombre d'emprunts: " + nombreEmprunts; } public void affiche() { System.out.println(this.toString()); } public void emprunter(int numeroCarte) { if (!estEmprunte) { estEmprunte = true; numeroCarteLecteur = numeroCarte; nombreEmprunts++; } } }

Pour les getters et setters, je vais les omettre car ceci est une pratique usuelle et vous avez mentionné qu'ils sont supposés exister.

  1. Définition des classes Livre, Magazine et Cdrom :
public class Livre extends Ouvrage { private String nomAuteur; private String maisonEdition; public Livre(int code, String titre, String nomAuteur, String maisonEdition) { super(code, titre); this.nomAuteur = nomAuteur; this.maisonEdition = maisonEdition; } public String toString() { return super.toString() + ", Auteur: " + nomAuteur + ", Maison d'édition: " + maisonEdition; } } public class Magazine extends Ouvrage { private int numero; private String periodicite; public Magazine(int code, String titre, int numero, String periodicite) { super(code, titre); this.numero = numero; this.periodicite = periodicite; } public String toString() { return super.toString() + ", Numéro: " + numero + ", Périodicité: " + periodicite; } } public class Cdrom extends Ouvrage { private String theme; public Cdrom(int code, String titre, String theme) { super(code, titre); this.theme = theme; } public String toString() { return super.toString() + ", Thème: " + theme; } }
  1. Définition de la classe exécutable Bibliotheque :
public class Bibliotheque { public static void main(String[] args) { Livre livre = new Livre(1, "Les Misérables", "Victor Hugo", "Gallimard"); Magazine magazine = new Magazine(2, "Le Point", 1234, "Hebdomadaire"); Cdrom cdrom = new Cdrom(3, "Apprendre Java", "Programmation"); livre.emprunter(13); cdrom.emprunter(8); // Simuler le retour du livre // Si nous avions un attribut "estEmprunte" setter nous pourrions faire // livre.setEstEmprunte(false); // Simuler un autre emprunt par une autre personne livre.emprunter(20); livre.affiche(); magazine.affiche(); cdrom.affiche(); } }
  1. Résultat de l'affichage:

En supposant que les attributs restent inchangés (pas de méthode de retour de l'ouvrage implémentée) et que les emprunts ne sont pas affectés (pas de méthode pour changer estEmprunte de true à false), l'affichage serait le suivant:

Code: 1, Titre: Les Misérables, Emprunté? true, Numéro de carte: 20, Nombre d'emprunts: 2, Auteur: Victor Hugo, Maison d'édition: Gallimard Code: 2, Titre: Le Point, Emprunté? false, Numéro de carte: 0, Nombre d'emprunts: 0, Numéro: 1234, Périodicité: Hebdomadaire Code: 3, Titre: Apprendre Java, Emprunté? true, Num