Solution_TP_SMI_N°5_Java_S5_2012_2013

Transcription

Solution_TP_SMI_N°5_Java_S5_2012_2013
Université Mohammed Premier
Faculté des Sciences
Département de Mathématiques
et d’Informatique
Année universitaire 2012-2013
Filière SMI
Module : POO Java
Semestre : S5
Responsable du cours : El Mostafa DAOUDI
Solution TP: Série Numéro 5
Exercice 1 :
Ecrire une classe qui a deux méthodes:
- Une méthode qui prend en paramètre une chaine « s » de type String et un caractère « ch » et qui
retourne le nombre de caractères « ch » présents dans la chaine « s » en utilisant la méthode indexOf().
- La méthode main() dans laquelle on récupère les paramètres « s » et « ch » sur la ligne de commande.
Réécrire la méthode main() dans le cas où les paramètres sont lus au clavier.
Solution
Voir TD N°5
Exercice 2 :
Écrire un programme qui récupère une chaine de caractères « s » sur la ligne de commande et ensuite
affiche le nombre de lettres « a », le nombre de lettres « m » et le nombre de lettres « p » qui sont
présentes dans la chaine « s »:
N.B. On ne fait pas de différence entre les majuscules et les minuscules.
Solution
Voir TD N°5
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
Solution :
class Ouvrage {
private String auteur;
private String titre;
private String code;
private static int cptOuvrages; //numéro=ordre de création d’un objet
public Ouvrage(String titre, String auteur){
this.titre = titre;
SMI-S5 Solution TP5 : POO-Java, 2012-2013
1
this.auteur = auteur;
cptOuvrages++;
if (auteur.length()==0)
code = "?";
else if (auteur.length() < 3)
code =auteur;
else
code = auteur.substring(0,3);
code= cptOuvrages+code;
}
public String getAuteur() {
return auteur;
}
public String getCode(){
return code;
}
public String toString(){
return titre+"-- "+code;
}
}
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 String à savoir :
 lesOuvrages : pour mémoriser tous ouvrages de la biblothèque.
 ouvragesEmpruntes : pour mémoriser les ouvrages empruntés.
- 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.
Solution :
class Bibliotheque {
private Ouvrage [] lesOuvrags;
private Ouvrage [] OuvragesEmpruntes;
private int dernier=-1;
private int dernierEmp=-1;
public Bibliotheque(int n) {
lesOuvrages=new Ouvrage[n];
OuvragesEmpruntes = new Ouvrage[n];
}
public void ajouteOuvrag(String titre, String auteur){
Ouvrage unOuvrage = new Ouvrage(titre,auteur);
SMI-S5 Solution TP5 : POO-Java, 2012-2013
2
dernier ++;
lesOuvrages[dernier]=unOuvrage;
}
public void afficheTous(){
for(int i=0; i<=dernier; i++)
System.out.println(lesOuvrages[i]); // appel de toString
}
public void afficheEmpruntes(){
for(int i=0; i<=dernierEmp; i++)
System.out.println(OuvragesEmpruntes[i]);
}
public Ouvrag get(String code){
for(int i=0; i<=dernier; i++)
if (lesOuvrages[i].getCode().equals(code))
return lesOuvrages[i];
return null;
}
public boolean estEmprunte(Ouvrage o){
for(int i=0; i<=dernierEmp; i++)
if (OuvragesEmpruntes[i].getCode().equals(o.getCode()))
return true;
return false;
}
public void emprunte(String code){
Ouvrag unOuvrage=this.get(code);
if(!estEmprunte(unOuvrage)) {
dernierEmp ++;
OuvragesEmpruntes[dernierEmp]=unOuvrage;
}
}
public Ouvrage [] getTousLesOuvrages(){
return lesOuvrages;
}
public Ouvrage [] getTousLesEmprunts(){
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 {
public static void main(String[] args) {
int n= Clavier.lireInt() ;
String titre, auteur;
Bibliotheque m = new Bibliotheque(n);
SMI-S5 Solution TP5 : POO-Java, 2012-2013
3
System.out.print("Entrez un Titre : ");
titre = Clavier.lireString();
System.out.print("Entrez l'Auteur : ");
auteur = Clavier.lireString();
m.ajouteOuvrage(titre,auteur);
System.out.print("Entrez un Titre : ");
titre = Clavier.lireString() ;;
System.out.print("Entrez l'Auteur : ");
auteur = Clavier.lireString();
m.ajouteOuvrage(titre,auteur);
System.out.print("Entrez un Titre : ");
titre = Clavier.lireString();
System.out.print("Entrez l'Auteur : ");
auteur = Clavier.lireString();
m.ajouteOuvrage(titre,auteur);
System.out.print("Entrez un Titre : ");
titre = Clavier.lireString();
System.out.print("Entrez l'Auteur : ");
auteur = Clavier.lireString();
m.ajouteOuvrage(titre,auteur);
System.out.println();
System.out.print("Liste des ouvrages : ");
m.afficheTous();
Ouvrage [] ouvr;
ouvr = m.getTousLesOuvrages();
m.emprunte(ouvr[1].getCode());
m.emprunte(ouvr[2].getCode());
m.emprunte(ouvr[1].getCode());
System.out.println();
System.out.print("Liste des ouvrages empruntes : ");
m.afficheEmpruntes();
}
}
Solution 2 : lecture en utilisant les flux
public class TestBibliotheque {
public static void main(String[] args) {
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);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
m.ajouteOuvrage(titre,auteur);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
SMI-S5 Solution TP5 : POO-Java, 2012-2013
4
m.ajouteOuvrage(titre,auteur);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
m.ajouteOuvrage(titre,auteur);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
m.ajouteOuvrage(titre,auteur);
System.out.println();
System.out.print("Liste des ouvrages : ");
m.afficheTous();
Ouvrage [] ouvr;
ouvr = m.getTousLesOuvrages();
m.emprunte(ouvr[1].getCode());
m.emprunte(ouvr[2].getCode());
m.emprunte(ouvr[1].getCode());
System.out.println();
System.out.print("Liste des ouvrages empruntes : ");
m.afficheEmpruntes();
}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.
Solution :
class Livre extends Ouvrage{
private long isbn;
public Livre (String titre, String auteur, long isbn){
super(titre,auteur);
this.isbn = isbn;
}
public String toString(){
return super.toString()+"--"+isbn;
}
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.
SMI-S5 Solution TP5 : POO-Java, 2012-2013
5
-
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.
Solution :
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;
}
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)
Solution :
class Bibliotheque{
private Ouvrage [] lesOuvrages;
private Ouvrage [] ouvragesEmpruntes;
private int dernier=-1;
private int dernierEmp=-1;
public Bibliotheque(int n) {
lesOuvrages=new Ouvrage[n];
ouvragesEmpruntes = new Ouvrage[n];
}
public void ajouteLivre(String titre, String auteur, long isbn){
Livre unLivre = new Livre(titre, auteur, isbn);
dernier ++;
lesOuvrages[dernier]=unLivre;
}
public void ajouteDisque(String titre, String auteur, String type){
Disque unDisque = new Disque(titre,auteur, type);
dernier ++;
lesOuvrages[dernier]=unDisque;
}
public void afficheTousLesOuvrages(){
for(int i=0; i<=dernier; i++)
System.out.println(lesOuvrages[i]);
}
SMI-S5 Solution TP5 : POO-Java, 2012-2013
6
public void afficheTousLesEmprunts(){
for(int i=0; i<=dernierEmp; i++)
System.out.println(ouvragesEmpruntes[i]);
}
public void afficheDisqueEmpruntes(){
for(int i=0; i<=dernierEmp; i++)
ouvragesEmpruntes[i].afficheDisque();
}
public void afficheLivreEmpruntes(){
for(int i=0; i<=dernierEmp; i++)
ouvragesEmpruntes[i].afficheLivre();
}
public Ouvrage [] getTousLesOuvrages(){
return lesOuvrages;
}
public Ouvrag1 [] getTousLesEmprunts(){
return ouvragesEmpruntes;
}
public Ouvrage get(String code){
for(int i=0; i<=dernier; i++)
if (lesOuvrages[i].getCode().equals(code))
return lesOuvrages[i];
return null;
}
public int getDernierEmp() {
return dernierEmp;
}
public boolean estEmprunte(Ouvrage o){
for(int i=0; i<=dernierEmp; i++)
if (ouvragesEmpruntes[i].getCode().equals(o.getCode()))
return true;
return false;
}
public void emprunte(String code){
Ouvrag unOuvrage=this.get(code);
if(!estEmprunte(unOuvrage)) {
dernierEmp ++;
OuvragesEmpruntes[dernierEmp]=unOuvrage;
}
}
}
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.
SMI-S5 Solution TP5 : POO-Java, 2012-2013
7
Solution :
public class TestBibliotheque {
public static void main(String[] args) {
InputStreamReader in = null;
BufferedReader tampon = null;
try {
String titre, auteur;
in = new InputStreamReader(System.in);
tampon = new BufferedReader(in);
int n=10;
Bibliotheque m = new Bibliotheque(n);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
long isbn=234;
m.ajouteLivre(titre,auteur,isbn);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
isbn=244;
m.ajouteLivre(titre,auteur,isbn);
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);
System.out.print("Entrez un Titre : ");
titre = tampon.readLine();
System.out.print("Entrez l'Auteur : ");
auteur = tampon.readLine();
isbn=255;
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();
SMI-S5 Solution TP5 : POO-Java, 2012-2013
8
System.out.println();
System.out.println();
System.out.println("Affichage de tous les Disques Empruntés ");
m.afficheDisqueEmpruntes();
System.out.println();
System.out.println();
System.out.println("Affichage de tous les Livres Empruntés ");
m.afficheLivreEmpruntes();
Ouvrag1 [] emprunts;
emprunts = m.getTousLesEmprunts();
boolean b0=m.estEmprunte(ouvr[0]);
boolean b1=m.estEmprunte(ouvr[1]);
System.out.println(b0+ " "+b1);
}catch (IOException ioe) {
System.out.println("Erreur d'entér sortie ");
}
}
}
Remarque : Il faut adapter la classe Ouvrage :
class Ouvrage {
private String auteur;
private String titre;
private String code;
private static int cptOuvrags;
public Ouvrage(String titre, String auteur){
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 getAuteur(){
return auteur;
}
public String getCode(){
return code;
}
public String toString(){
return titre+"-- "+code;
}
public void afficheDisque() {
}
SMI-S5 Solution TP5 : POO-Java, 2012-2013
9
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.
Partie III
- Utiliser les entrées/sortie : Modifier le programme afin que les données soient sauvegardées dans des
fichiers.
- Utiliser les collections : Améliorer le programme en utilisant les collections à la place des tableaux.
- Utiliser les interfaces graphiques : Améliorer le programme en utilisant les interfaces graphiques.
- Faire la gestion des exceptions quand c’est nécessaire.
SMI-S5 Solution TP5 : POO-Java, 2012-2013
10