Initiation à la Programmation avec Java Semestre 1-2008/2009 Compte rendu final du Projet Jean-Baptiste Leprêtre Groupe Y1 Chargé de TD : Fabienne Thomarat 1
SOMMAIRE : I) Cahier des Charges II) Analyse du Programme 1) Classe Œuvre 2) Classe Principale o a) Chargement des Œuvres et création de la bibliothèque o b) Demande des critères de recherche o c) Recherche pour chaque critère o d) Demande si on veut ajouter un critère supplémentaire o e) Affichage des solutions o f) Transfert de support o g) Demande de nouvelle recherche III) Mode d emploi 2
I) Cahier des Charges : Le programme demandé doit pouvoir effectuer des recherches d œuvres ou d albums, à partir d une base de données représentée par un fichier.txt. Chaque œuvre est caractérisée par un titre, un artiste, un album, un style, un support, une année de parution ainsi qu un instrument. Mon programme permet ainsi de trouver une œuvre parmi la base de données et ayant telles ou telles caractéristiques. Nous pourrons ainsi trouver les œuvres datant de l année 1950. Il est noté que l on demande au lancement du programme si l utilisateur souhaite chercher plutôt un titre de morceau ou plutôt un album. Une grande attention a été effectuée sur les dates, puisque nous pourrons aussi demander les oeuvres précédant l année 1950 ou suivant l année 1950. Nous pourrons ajouter autant de critère à notre recherche que nous le voulons, ce qui permet d affiner la demande. Il sera ainsi possible de chercher quels sont les albums de Juliette, sur support mp3, et sortis après 1995. Lorsque nous avons fini d énumérer les critères demandés, le programme nous donne les réponses. Il préviendra s il n y a pas de solution. Il nous encouragera alors à faire une autre recherche. S il y a des réponses, il les affiche les unes en dessous des autres. Il va alors nous poser la question si nous souhaitons transférer ces fichiers obtenus sur un support. Nous pouvons alors les transférer n importe où, par exemple sur le disque dur. Puis nous pourrons faire, à nouveau, une recherche, où nous pourrons vérifier que les fichiers ont bien été transférés. De plus, la position des majuscules et minuscules n importe pas dans l ensemble des réponses. En résumé, ce programme permet donc de charger les œuvres depuis le fichier.txt, de faire des requêtes multiples et de transférer des fichiers d un support à un autre. J ai malheureusement un regret sur le fait que lorsque l on cherche des albums, il peut arriver, suivant les critères, qu une même réponse s affiche plusieurs fois à l écran. 3
II) Analyse du Programme : Lorsque j ai réalisé mon programme afin qu il fasse seulement des requêtes simples j ai utilisé une classe œuvre. Cependant, pour mon programme final, je n utilise plus cette classe. Je vais quand même proposer un développement de cette classe. 1) Classe Œuvre : Comme son nom l indique, cette classe représente une œuvre. Elle possède 7 attributs : Titre de type String Artiste de type String Album de type String Style de type String Support de type String Date de type String Instrument de type String Cette classe possède une méthode qui permet à partir du fichier.txt, de charger les œuvres. La signature de cette méthode est Œuvre chargement(string) 2) Classe Principale: La classe principale forme ainsi à la fin, l ensemble de mon programme. a) Chargement des Œuvres et création de la bibliothèque : 4
String message=utilitaire.lirefichier("c:/musique.txt"); int f=1; String []tableau; tableau=message.split("\n"); String [][] tableau2; tableau2 = new String[tableau.length][7]; tableau2[i]=tableau[i].split(";"); Nous créons, en fait, un tableau à deux dimensions où nous allons ranger nos œuvres. Il s appelle tableau2. Ce tableau regroupe des chaînes de caractères. Nous découpons le fichier.txt, en chaînes de caractères regroupant chaque ligne. (En effet chaque ligne correspond à une œuvre) Notre tableau2, celui à deux dimensions, aura donc autant de lignes qu il y a de ligne dans le fichier.txt. Il aura 7 colonnes correspondantes aux 7 critères caractérisant une œuvre. Pour remplir ces 7 colonnes, nous découpons chaque chaîne de caractère obtenue précédemment. Nous avons bien une bibliothèque avec l ensemble des œuvres. b) Demande des critères de recherche : int retour=0; String recherche=utilitaire.lirechaine("recherchez-vous un album ou une oeuvre?").touppercase(); while(retour==0){ int b=0; int []solution; solution=new int[tableau.length]; while(b==0){ String a=utilitaire.lirechaine("quel est votre critére de sélection? Titre, Auteur, Album, Style, Support, Date, Instrument ").touppercase(); Tout d abord, nous demandons si l utilisateur recherche une œuvre ou un album, afin de savoir ce qu il faudra afficher pour caractériser les réponses. On met la demande dans la variable chaîne de caractères «recherche». On crée une autre variable entier «retour» que l on initialise à 0. Tout le reste du programme va se retrouver dans une boucle «while», qui continuera tant que «retour» sera égal à 0. 5
Ceci permet de faire des requêtes l une après l autre, et l on est pas alors obligé de relancer le programme à chaque fois. Si on ne veut plus de questions, il suffira d augmenter «retour». Je crée de même une variable entier «b», initialisée à 0, qui permettra aussi grâce à une boucle «while» de faire des requêtes multiples. La base de mon système de recherche repose sur le tableau à une dimension «solution» qui possède autant d entrées qu il y a d œuvres dans la bibliothèque. C est un tableau d entier. La i éme entrée du tableau, correspond à la i éme œuvre de la bibliothèque. A chaque requête, si l œuvre remplit le critère, on ajoute 1 à l entrée du tableau correspondant à l œuvre. Pour trouver les œuvres répondant à tous les critères, il suffira de regarder quelles sont les entrées du tableau «solution» ayant la même valeur que le nombre de requêtes effectuées. Le programme ensuite demande quel est le critère de recherche. Il place ce critère dans une variable chaîne de caractère «a». La fonction.uppercase() permet de mettre l ensemble de la chaîne de caractères en majuscule, ce qui ne limite pas le programme à la stricte écriture du document.txt. c) Recherche pour chaque critère : if(a.equals("titre")){ String m=utilitaire.lirechaine("quel titre cherchezvous?").touppercase(); if(m.equals((tableau2[i][1]).touppercase())){ solution[i]=1+solution[i]; else if(a.equals("auteur")){ String m=utilitaire.lirechaine("quel auteur cherchezvous?").touppercase(); if(m.equals((tableau2[i][2]).touppercase())){ solution[i]=1+solution[i]; else if(a.equals("album")){ String m=utilitaire.lirechaine("quel album cherchezvous?").touppercase(); 6
if(m.equals((tableau2[i][3]).touppercase())){ solution[i]=1+solution[i]; else if(a.equals("style")){ String m=utilitaire.lirechaine("quel style cherchezvous?").touppercase(); if(m.equals((tableau2[i][4]).touppercase())){ solution[i]=1+solution[i]; else if(a.equals("support")){ String m=utilitaire.lirechaine("quel support cherchezvous?").touppercase(); if(m.equals((tableau2[i][5]).touppercase())){ solution[i]=1+solution[i]; else if(a.equals("date")){ int m=integer.parseint(utilitaire.lirechaine("quel date cherchez-vous?").touppercase()); String commande=utilitaire.lirechaine("cherchez-vous avant, pendant ou aprés cette date?").touppercase(); if(commande.equals("avant")){ if(integer.parseint(tableau2[i][6])<=m){ solution[i]=1+solution[i]; if(commande.equals("pendant")){ if(integer.parseint(tableau2[i][6])==m){ solution[i]=1+solution[i]; if(commande.equals("apres")){ if(integer.parseint(tableau2[i][6])>=m){ solution[i]=1+solution[i]; else{ String m=utilitaire.lirechaine("quel instrument cherchezvous?").touppercase(); if(m.equals((tableau2[i][7]).touppercase())){ solution[i]=1+solution[i]; 7
Nous allons utiliser une commande if qui permet de séparer les actions suivant la valeur de «a», c est à dire suivant le critère de recherche. Pour chaque critère, nous procédons de la même façon : On demande quel est le nom précis de la demande et on compare ce nom avec les éléments de la colonne correspondante au critère demandé. S il y a égalité, et donc que l on a trouvé un résultat, on ajoute plus 1, dans l entrée correspondante du tableau «solution». Pour le critère date, on rajoute une commande if pour savoir si on veut avant la date donnée, pendant ou après la date donnée. d) Demande si on veut ajouter un critère supplémentaire : String reponse=utilitaire.lirechaine("voulez-vous ajouter un critére de selection?").touppercase(); if(reponse.equals("oui")){ f++; else{b++; On demande si on veut ajouter des critères ou si on veut simplement afficher les réponses trouvées et on met la réponse dans une variable chaîne de caractères «réponse». Si la réponse est oui, on augmente la variable entier «f» de 1, «f» comptant le nombre de requête effectuée. Si c est non, on sort de la boucle «while» on augmentant «b» de 1. e) Affichage des solutions : int g=0; if(recherche.equals("album")){ if(solution[i]==f){g++; Utilitaire.ecrireLigne(tableau2[i][3]); else{for(int k=0;k<tableau.length;k++){ if(solution[k]==f){g++; 8
Utilitaire.ecrireLigne(tableau2[k][1]); if(g==0){ Utilitaire.ecrireLigne("Il n'y a pas de solution"); A partir d ici, on a fini d ajouter des critères. On crée tout d abord une variable entier «g», initialisée à 0 et qui va voir si on a des solutions. On différencie le cas où on recherche un album et celui où on recherche une œuvre grâce à la variable chaîne de caractères «recherche». On affiche alors les solutions qui correspondent à une entrée dans le tableau «solution» égale au nombre de requêtes. Si on trouve des solutions, on augmente «g» de 1. S il n y a pas de solution, on prévient l utilisateur. f) Transfert de support : else{ String action=utilitaire.lirechaine("voulez-vous transférer ces fichiers sur un support?").touppercase(); if(action.equals("oui")){ action=utilitaire.lirechaine("sur quel support voulezvous transférez ces fichiers?").touppercase(); if(action.equals("cd")){ if(solution[i]==f){ tableau2[i][5]="cd"; else if(action.equals("dd")){ if(solution[i]==f){ tableau2[i][5]="dd"; else if(action.equals("mp3")){ if(solution[i]==f){ tableau2[i][5]="mp3"; 9
On demande alors si on veut transférer ces fichiers obtenus sur un support. On stocke la réponse à la question. On utilise alors une commande if qui différencie entre la réponse oui et la réponse non. Si c est oui, le programme demande alors sur quel support. Avec une autre commande if, le programme différencie les cas et on change alors les valeurs dans le tableau2 qui représente la bibliothèque. Si c est non, on ne fait rien. g) Demande de nouvelle recherche : String fin=utilitaire.lirechaine("voulez-vous faire une autre recherche").touppercase(); if(fin.equals("non")){retour++; On demande alors si on veut faire une nouvelle recherche à critères multiples. Si la réponse est non, on sort du «while» en augmentant la valeur de «retour». Pour toute autre réponse, on recommence une autre recherche. III) Mode d emploi Après avoir chargé le programme sur une plate-forme JAVA, ce dernier vous guidera alors pas à pas. En effet, il vous demandera question après question, quels sont vos choix. Il vous demandera ainsi si vous cherchez un album ou un titre. Puis vous il posera autant de question que vous le souhaitez sur les critères de votre recherche. Vous pouvez vous arrêter à n importe quel moment. Il vous affichera alors les réponses. Vous pourrez ensuite transférer ces réponses sur un support, option que le programme vous proposera automatiquement. Vous aurez alors la possibilité, si vous le souhaitez, de recommencer une nouvelle requête. Ce programme a l avantage d être très intuitif. Il a aussi l autre avantage que les réponses ne dépendent pas de la place des majuscules. A noté, cependant qu il ne supportera pas les fautes d orthographes. 10