Formation : IPS Intervenant : Vincent Ranwez TP 3 de SDD et Algo L’objectif de ce TP est de fusionner des fichiers en utilisant les classes HashSet et HashTable de Java. Chaque responsable de module envoie au responsable de formation IPS la liste des notes obtenues dans son module. On veut pouvoir regrouper dans un même fichier les notes obtenues par les étudiants d’IPS dans une série quelconque de modules. Chaque responsable de module envoie ses notes dans un fichier ayant le format suivant : CodeModule NumEtudiant1 NumEtudiant2 NumEtudiant3 NumEtudiant4 Question 1 : Nom1 Nom2 Nom3 Nom4 Prénom1 Prénom2 Prénom3 Prénom4 Note1 Note2 Note3 Note4 HashSet et HashTable Q.1.a : Consultez la documentation de la classe HashSet. Cette classe implémente plusieurs interfaces ; consultez leurs documentations. Regardez plus particulièrement la documentation de l’interface Collection et Set. Q.1.b : Consultez la documentation de la classe HashTable. Quel est l’équivalent de cette classe en python ? Q.1.c : Vous trouverez des exemples d’utilisation de ces classes sur le site "Java Developers Almanac". Regardez notamment l’exemple de création d’un HashSet. Dans cet exemple la création se fait à l’aide de l’instruction : Set set = new HashSet(); On aurait pu utilisez HashSet set = new HashSet(); mais ce serait moins pertinent. Vous pouvez lire à ce sujet l’article disponible sur le site de SUN : http://java.sun.com/developer/technicalArticles/Collections/Using/ (section Programming Tips and API Design). Question 2 : Construire une liste d’étudiants Q.2.a : Ecrivez un programme qui prend en paramètre la liste des fichiers contenant les notes des différents modules que vous voulez traiter et affiche en sortie la liste des noms d’étudiants ayants suivit au moins l’un de ces modules. Pour cela vous utiliserez la classe HashSet. Utilisez le site "Java Developers Almanac" pour trouver un exemple de lecture de fichier texte puis utilisez la méthode split() de la classe String pour récupérer les différents champs présents sur chaque ligne de vos fichiers. Q.2.b : Copiez votre HashSet dans un Vector en utilisant le constructeur approprié. Utilisez la méthode statique "sort()" de Collections pour triez ce vecteur et affichez les élèves dans l’ordre alphabétique. Pourquoi pouvez-vous utiliser la méthode sort ayant pour signature : static void sort(List list) Université Montpellier II Place Eugène Bataillon 34095 Montpellier Cedex5, France Formation : IPS Intervenant : Vincent Ranwez avec un Vector en paramètre ? Pouvait-on directement utiliser un objet de type Set ? Q.2.c : On peut directement gérer un ensemble trié à partir de SortedSet, modifiez votre programme pour utiliser cette solution au lieu de passer par le tri d’un Vector (Attention SortedSet n’est qu’une interface). Question 3 : Fusionner les notes On veut obtenir un fichier de synthèse des notes obtenues à une série de modules en indiquant les modules non choisit (NC) pour chaque étudiant. Le fichier présentera les étudiants dans l’ordre alphabétique et les modules dans l’ordre ou ils sont passés en paramètres. Ce fichier de synthèse sera de la forme : Nom1 Nom2 Nom3 Module1 NC 11 14 Module2 14 NC 11 Pour cela vous écrirez une classe Module qui possède comme attributs un nom de module et une hashTable dont la clef est le nom de l’étudiant et la valeur est la note obtenue par cet étudiant à ce module. Cette classe possède un constructeur qui prend en paramètre un nom de fichier. Vous créerez ensuite un Vecteur de Module correspondant aux fichiers que vous passez en paramètre à votre programme. En utilisant l’ensemble trié d’étudiants (Q2) et ce Vecteur de Modules vous pouvez maintenant construire le fichier de synthèse désiré. Question 4 : Pour aller plus loin (facultatif) Q.4.a : Ajoutez le calcul de la moyenne par étudiants et par module. Ajoutez une pondération aux modules (indiquée par exemple après le code module) et calculez les moyennes pondérées. Ajoutez un fichier AllEtudiants.txt qui contient l’ensemble des étudiants de la formation et qui permet de vérifier qu’il n’y a pas d’erreur dans les fichiers fournis par les responsables de modules (étudiants non inscrits, fautes de frappes sur les noms, etc.). La même approche peut être utilisée pour éviter les erreurs dans les codes de modules. Q.4.b : Vous pouvez également enrichir la classe Etudiant réalisée en TP de Prog/Java en lui ajoutant un attribut modulesSuivits de type Set qui contient les modules auxquels un étudiant est inscrit. Il est alors possible d’utiliser cette structure pour calculer la moyenne de l’étudiant. Q.4.c : Vous pouvez généraliser ce TP de plusieurs manières. La transformation d’un fichier texte en hashTable est souvent utile. Une méthode plus générale doit permettre d’indiquer le numéro de la colonne contenant la clef à utiliser, et les numéros des colonnes qui doivent être récupérées (sous forme d’un vecteur) ainsi que le comportement souhaité lorsqu’une même clef est présente plusieurs fois dans le fichier (erreur, seule une ligne est retenue, concaténation, etc.). Université Montpellier II Place Eugène Bataillon 34095 Montpellier Cedex5, France