A) Programmation des notions de base / 60 points Pour les questions de 1.1) à 1.5) (total de 5 x 4 points) dans cette section, le mot terme désigne un mot ou quelques mots et liste désigne une liste (LinkedList) des personnes ( exemple Liste2.java expliqué en classe et disponible sur le site du cours ). 1.1) Écrivez les trois termes les plus appropriés associés à l’instruction : System.out.println("Contenu de la liste de personnes : \n" + liste); Réponse : 1) toString() de l’hiérarchie LinkedList redéfinition 2) toString() de Personne 3) 1.2) Écrivez les trois termes les plus appropriés associés à liste.getFirst() : System.out.println("\nPremière personne : " + liste.getFirst()); Réponse : 1) liste.get(0) 2) liste.element() 3) liste.peek() 1.3) Écrivez les trois termes les plus appropriés associés à la méthode indexOf … : Personne aChercher = new Personne("Dube Francoise", ' ', 0.0, 0.0, 0) ; int k = liste.indexOf(aChercher); Réponse : 1) redéfinition de equals 2) vs lastIndexOf 3) recherche séquentielle 1.4) Écrivez les trois termes les plus appropriés associés à la méthode equals de Personne : Réponse : 1) indexOf() 2) lastIndexOf 3) contains(…) 1.5) Écrivez les trois termes les plus appropriés associés à l’instruction : Collections.sort(liste); Réponse : 1) Interface Comparable 2) implémenter compareTo 3) binarySearch fonctionnelle IFT 1170 A, modèle d’un examen final ( 40 % ) 1 2) Récursivité ( 15 points ) static void afficher(int n) { if(n == 1) System.out.printf("Go\n"); else { System.out.print("Saute "); afficher(n-1); } } static void afficher2(int n) { for (int i = 1; i < n ; i++) System.out.print("Saute "); System.out.printf("Go\n"); } 3) Fichier Binaire, LinkedList ( 25 points ) Dans Binaire2.java, vous travaillez avec deux fichiers binaires Femme.Bin et Homme.Bin Écrivez le code permettant de 3.1) créer deux «LinkedList» listeFem : liste des femmes et listeHom : liste des hommes ; 3.2) trier listeFem selon les numéros ; 3.3) ajouter 4 cm à la taille de la dernière personne de listeHom. 3.1) Appels : LinkedList<Personne> listeFem = relire("Femmes.Bin"), listeHom = relire("Hommes.Bin"); Méthode : static LinkedList<Personne> relire(String nomALire) throws IOException{ System.out.println("On lit le fichier binaire du nom " + nomALire); LinkedList<Personne> uneListe = new LinkedList<Personne> (); DataInputStream aLire = new DataInputStream ( new FileInputStream(nomALire)); boolean finFichier = false ; char sexe = ' '; IFT 1170 A, modèle d’un examen final ( 40 % ) 2 while ( ! finFichier ) { try { sexe = aLire.readChar(); } catch ( EOFException e ) { finFichier = true; } if (!finFichier) { double taille = aLire.readDouble(), poids = aLire.readDouble(); int numero = aLire.readInt(); String nomPre = ""; for (int i = 0; i < 30; i++) nomPre += aLire.readChar(); Personne pers = new Personne(nomPre, sexe, taille, poids, numero); uneListe.add(pers); } } aLire.close(); return uneListe; } 3.2) trier listeFem selon les numéros : class Personne implements Comparable<Personne> { . . . etc . . . public int compareTo(Personne autre) { return numero - autre.numero; } } Dans main(…) : Collections.sort(listeFem); IFT 1170 A, modèle d’un examen final ( 40 % ) 3 3.3) ajouter 4 cm à la taille de la dernière personne de listeHom. Personne lastHom = listeHom.getLast(); lastHom.setTaille( lastHom.getTaille() + 0.04); Dans Personne, on écrit des méthodes d’accès et de modifications nécessaires. B) LinkedList, Interface Comparable … / 40 points Données : Fichier de type texte Personne.txt 0123456789012345678901234567890123456789012345678901234567890123456789 ROY CHANTAL F 1.63 54.9 2754 MOLAISON CLAUDE M 1.57 62.2 1848 ROBITAILLE SUZANNE F 1.79 72.3 2007 etc . . . Écrire le code permettant de : - concevoir la classe Personne pour répondre aux questions ci-dessous; - lire le fichier texte, de créer une liste (LinkedList) des personnes; - faire une démonstration de Collections.min, Collections.max, Collections.sort, recherche séquentielle, recherche dichotomique - etc . . . Voir Liste2.java disponible sur le site du cours. /* Fichier Liste2.java (liste des personnes) * Données Personne.txt * * Lire le fichier, créer une liste des personnes * Démonstration de Collections.min, Collections.max, * Collections.sort, recherche séquentielle, * recherche dichotomique * * Fin de matières pour le final * Préparé par LVN pour IFT 1170 */ import java.io.*; import java.util.*; class Personne implements Comparable<Personne> { private String nomPre; private char sexe; private double taille, poids; IFT 1170 A, modèle d’un examen final ( 40 % ) 4 private int numero; public Personne(String nomPre, char sexe, double taille, double poids, int numero) { this.nomPre = nomPre; this.sexe = sexe; this.taille = taille; this.poids = poids; this.numero = numero; } public String toString() { return String.format("%-30s %8.2f %7.1f %10d %s", nomPre, taille, poids, numero, (sexe == 'F'? "feminin":"masculin")); } // implémenter l'interface Comparable public int compareTo(Personne autre) { return nomPre.toUpperCase().trim().compareTo( autre.nomPre.toUpperCase().trim() ); } public int getNumero() { return numero; } public boolean equals(Object obj) { if (this == obj) return true; else if ( ! (obj instanceof Personne)) return false; else { Personne autre = (Personne) obj; return nomPre.trim().equalsIgnoreCase(autre.nomPre.trim()); } } } public class Liste2 { // lire un fichier, remplir et retourner une liste des personnes static LinkedList<Personne> lireCreer(String nomFichier) throws IOException { LinkedList<Personne> liste = new LinkedList<Personne>(); // liste vide au début boolean existeFichier = true ; // à ajuster après IFT 1170 A, modèle d’un examen final ( 40 % ) 5 FileReader fr = null; // initialiser pour Java // essayer de LOCALISER le fichier à partir de son nom try { fr = new FileReader (nomFichier) ; } // intercepter l'erreur si le fichier n'existe pas catch ( java.io.FileNotFoundException erreur) { System.out.println("Probleme d'ouvrir le fichier " + nomFichier); existeFichier = false ; // ajuster } if (existeFichier) { // construire l'objet d'entrée qui va permettre // d'appliquer la lecture d'une ligne de texte BufferedReader entree = new BufferedReader(fr); boolean finFichier = false ; while ( !finFichier ) { // lire une ligne String uneLigne = entree.readLine(); if (uneLigne == null) finFichier = true ; else { /* 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 MICHAUD NORMAND M 1.73 103.7 3428 */ String nomPre = uneLigne.substring(0, 30); char sexe = uneLigne.charAt(30); double taille = Double.parseDouble(uneLigne.substring(37, 41)); double poids = Double.parseDouble(uneLigne.substring(51, 56).trim()); int numero = Integer.parseInt(uneLigne.substring(64).trim()); liste.add(new Personne(nomPre, sexe, taille, poids, numero)); } } entree.close(); } return liste; } IFT 1170 A, modèle d’un examen final ( 40 % ) 6 static void afficher(LinkedList<Personne> liste, int debut, int fin, String message) { System.out.println("\nListes des " + debut + " premieres et " + fin + " dernieres personnes " + message + " :\n"); for (int i = 0, n = liste.size(); i < n ; i++) if ( (i < debut && i < n ) || i >= n - fin ) System.out.printf("%2d) %s\n",i, liste.get(i)); else if ( i == debut ) System.out.printf("%2d) etc . . .\n", i); System.out.println(); } static void demoRechercheSequentielle(LinkedList<Personne> liste) { System.out.println("\nRecherche séquentielle (grâce à la redéfinition de equals) : "); String[] nomPre = { "Dube Francoise", "Tremblay Marc", "Olivier Jean" }; for(int i = 0; i < nomPre.length; i++) { Personne aChercher = new Personne(nomPre[i], ' ', 0.0, 0.0, 0) ; int k = liste.indexOf(aChercher); System.out.printf("\nDans la recherche de %s, k vaut %d\n", nomPre[i], k); System.out.printf("liste.contains(aChercher) vaut %s\n\n", liste.contains(aChercher)); } } static void demoRechercheDichotomique(LinkedList<Personne> liste) { System.out.println("\nRecherche dichotomique (interface Comparable) : "); String[] nomPre = { "Dube Francoise", "Tremblay Marc", "Olivier Jean" }; for(int i = 0; i < nomPre.length; i++) { Personne aChercher = new Personne(nomPre[i], ' ', 0.0, 0.0, 0) ; int k = Collections.binarySearch(liste, aChercher); System.out.printf("\nDans la recherche dichotomique de %s, k vaut %d\n", nomPre[i], k); } } public static void main (String[] args)throws IOException { LinkedList<Personne> liste = lireCreer("Personne.txt"); System.out.println("On vient de creer une liste de " IFT 1170 A, modèle d’un examen final ( 40 % ) 7 + liste.size() personnes\n"); afficher(liste, 7, 8, "apres la création"); + " demoRechercheSequentielle(liste); System.out.println("Premiere personne en ordre alphabetique :\n" + Collections.min(liste)); System.out.println("Derniere personne en ordre alphabetique :\n" + Collections.max(liste)); Collections.sort(liste); afficher(liste, 7, 11, "apres le tri selon les noms des personnes"); demoRechercheDichotomique(liste); } } /* Exécution: --------------------Configuration: <Default>-------------------On vient de creer une liste de 24 personnes Listes des 7 premieres et 8 dernieres personnes apres la création : 0) 1) 2) 3) 4) 5) 6) 7) 16) 17) 18) 19) 20) 21) 22) 23) ROY CHANTAL MOLAISON CLAUDE ROBITAILLE SUZANNE BEDARD MARC-ANDRE MONAST STEPHANE JALBERT LYNE DUBE FRANCOISE etc . . . BERGEVIN GUILLAUME DUMITRU PIERRE ROBITAILLE MICHEL FILLION ERIC DESMARAIS DENISE TREMBLAY MARC TREMBLAY SYLVAIN ROBITAILLE SUZANNE 1,63 1,57 1,79 1,43 1,65 1,63 1,68 54,9 62,2 72,3 80,5 61,7 52,6 67,5 2754 1848 2007 2636 1750 2168 4612 feminin masculin feminin masculin masculin feminin feminin 1,84 1,92 1,78 1,78 1,75 1,79 1,83 1,58 86,4 99,4 85,1 75,7 58,7 64,9 86,2 60,2 2277 3629 6002 2630 3215 3529 1538 4119 masculin masculin masculin masculin feminin masculin masculin feminin Recherche séquentielle (grâce à la redéfinition de equals) : Dans la recherche de Dube Francoise, k vaut 6 liste.contains(aChercher) vaut true Dans la recherche de Tremblay Marc, k vaut 21 liste.contains(aChercher) vaut true IFT 1170 A, modèle d’un examen final ( 40 % ) 8 Dans la recherche de Olivier Jean, k vaut -1 liste.contains(aChercher) vaut false Premiere personne en ordre alphabetique : BEDARD MARC-ANDRE 1,43 Derniere personne en ordre alphabetique : TREMBLAY SYLVAIN 1,83 80,5 2636 masculin 86,2 1538 masculin Listes des 7 premieres et 11 dernieres personnes apres le tri selon les noms des personnes : 0) 1) 2) 3) 4) 5) 6) 7) 13) 14) 15) 16) 17) 18) 19) 20) 21) 22) 23) BEDARD MARC-ANDRE BEGIN MARIE-LUCE BERGEVIN GUILLAUME COUTU PIERRE DESMARAIS DENISE DUBE FRANCOISE DUMITRU PIERRE etc . . . MONAST STEPHANE RICHER AGATHE RIVERIN HELENE ROBITAILLE MICHEL ROBITAILLE SUZANNE ROBITAILLE SUZANNE ROBITAILLE SUZANNE ROBITAILLE SUZANNE ROY CHANTAL TREMBLAY MARC TREMBLAY SYLVAIN 1,43 1,62 1,84 1,72 1,75 1,68 1,92 80,5 49,0 86,4 62,1 58,7 67,5 99,4 2636 4101 2277 4008 3215 4612 3629 masculin feminin masculin masculin feminin feminin masculin 1,65 1,65 1,71 1,78 1,79 1,72 1,48 1,58 1,63 1,79 1,83 61,7 53,1 60,8 85,1 72,3 65,4 61,5 60,2 54,9 64,9 86,2 1750 3563 2340 6002 2007 2325 4371 4119 2754 3529 1538 masculin feminin feminin masculin feminin feminin feminin feminin feminin masculin masculin Recherche dichotomique (interface Comparable) : Dans la recherche dichotomique de Dube Francoise, k vaut 5 Dans la recherche dichotomique de Tremblay Marc, k vaut 22 Dans la recherche dichotomique de Olivier Jean, k vaut -15 Process completed. */ IFT 1170 A, modèle d’un examen final ( 40 % ) 9