Cours BUT Info

TD 8 à 10 — Révisions

Trois TD de révision de fin de semestre : un Student itérable et comparable, premières lectures/écritures de fichiers avec exceptions personnalisées, et les objets génériques jusqu'au jeu de la Mourre.

Objectif : trois TD de révision qui rejouent, sur des cas neufs, les concepts des chapitres 7 à 10 — encapsulation, itérabilité, comparabilité, fichiers, exceptions, génériques — juste avant les TP correspondants.

TD 8 — Itérabilité et comparabilité d'un Student

La classe Student encapsule un Person fourni (nom, date de naissance) et y ajoute un code INE et une table Map<Mat, Double> des notes — l'enum Mat liste les matières (ALGO, BDD, SYS, COM, EN, PPP, MATH, GESTION). Les dix questions montent la pente du semestre :

  1. Encapsulation : Student délègue nom et âge à son Person interne.
  2. Surcharge : addGrade(Mat, double) et addGrade(String, double) — la seconde doit accepter le nom de la matière écrit de n'importe quelle manière, donc normaliser la chaîne avant Mat.valueOf.
  3. computeOverallGrade() moyenne les valeurs de la table et renvoie -1 si aucune note.
  4. Affichage à deux modes, civil (nom, date de naissance) ou pédagogique (INE, nom, résultats), avec un basculement qui doit concerner tous les étudiants à la fois et sans méthode d'affichage explicite : la solution est un attribut statique de mode, lu par toString — le passage par l'affichage standard impose ce design.
  5. Itérabilité : implements Iterable<Double> et une méthode iterator() déléguée à la collection de notes — for (Double g : s) devient possible sans exposer la table.
  6. Ordre naturel : Comparable<Student> sur la moyenne, pour classer du meilleur au moins bon via un simple Collections.sort.
  7. Critère alternatif : un Comparator<Student> par âge, du plus jeune au plus âgé.
  8. YearGroup, basée sur une liste, itérable sur les étudiants, avec addStudent.
  9. sortByAge() et sortByGrades() : les deux tris réutilisent le Comparable et le Comparator des questions précédentes.
  10. getAdultIt() : un itérateur qui ne rend que les étudiants majeurs — le filtrage se glisse dans hasNext/next d'un itérateur maison.

TD 9 — Premières interactions avec des fichiers

Deux exceptions dominent l'exercice 1 : IOException, la classe générale des échecs d'E/S, et FileNotFoundException, sa dérivée qui signale l'échec d'ouverture.

  1. Lecture : d'abord avec FileReader et son read() à -1 terminal, en gérant les exceptions ; puis la même lecture avec BufferedReader.readLine() — l'occasion de mesurer ce que gagne la mise en tampon.
  2. Écriture d'un tableau de double : avec FileWriter, puis avec PrintWriter et sa méthode println(double) — même travail, confort en plus.
  3. Saisie clavier : System.in est une instance de InputStream ; on crée le flux puis un Reader dessus. La division de deux entiers saisis fait identifier trois familles de problèmes — échec d'E/S à la lecture, saisie non entière, division par zéro — et à quelles instructions chacun survient, avant d'écrire inputToDivide() dans une classe KeyboardInput.
  4. FileCopy : programme en ligne de commande qui copie un fichier. Chaque vérification devient une exception personnalisée : WrongUsageException s'il n'y a pas exactement deux arguments (avec message de syntaxe), FileNotFoundException si la source n'existe pas, ExistingFileException si la destination existe déjà ; System.exit interrompt le programme après affichage du message. Variante FilteredFileCopy : un troisième paramètre borne la taille du premier mot des lignes copiées.
  5. Scanner : somme des entiers saisis au clavier jusqu'à la chaîne "bye" (toute autre chaîne est ignorée), puis lecture d'un annuaire nom année pour afficher l'âge calculé à la place de l'année de naissance.

TD 10 — Objets génériques

  1. Duo<E> : deux éléments de même type, deux constructeurs (un seul paramètre est utilisé deux fois), accesseurs, swap, identicalElements, puis deux comparaisons — orderedEquals et nonOrderedEquals — qui distinguent la prise en compte de l'ordre des éléments.
  2. Méthodes statiques génériques : mixDuos, qui mélange deux duos, rappelle la déclaration du type avant le type de retour (static <T> void ...) ; randomDuos(List<T>) construit et renvoie une List<Duo<T>> par tirage.
  3. Couple<T,S> : deux types paramétrés indépendants, une méthode d'instance sameAs et une méthode statique sameCouples — la généralisation directe du Duo.
  4. Le jeu de la Mourre, en mode objet : l'enum Mourre (ONE à FIVE) et l'interface IPlayer avec play() retournant un Couple<Mourre,Integer> — les doigts montrés et la somme annoncée. HumanPlayer saisit ses réponses sur l'entrée standard ; MourreGame.game(player1, player2) boucle tant que personne ne trouve la somme prétendue des doigts dressés, sans vainqueur si les deux trouvent ensemble. TwosomePlayer encapsule un Duo<Player> et fait jouer ses deux membres à tour de rôle ; RandomPlayer tire au hasard. Préparation directe du TP 10.

Le fil rouge des trois TD

Chaque question réactive une notion du cours avec un objectif précis : le double mode d'affichage force le static, l'itération sur les notes interdit d'exposer la table, la Mourre impose une interface pour unifier des joueurs de natures différentes. Ce sont exactement les réflexes attendus aux TP 8 à 10.


tdOO_08.pdf

R2.01 · TD 8 — Révisions : itérabilité et comparabilité · 10 questions

Consultation seule — téléchargement désactivé

Chargement du document…

tdOO_09.pdf

R2.01 · TD 9 — Premières interactions avec des fichiers · 4 exercices

Consultation seule — téléchargement désactivé

Chargement du document…

tdOO_10.pdf

R2.01 · TD 10 — Objets génériques · 3 exercices

Consultation seule — téléchargement désactivé

Chargement du document…

Dernière mise à jour le

Sur cette page