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 :
- Encapsulation :
Studentdélègue nom et âge à sonPersoninterne. - Surcharge :
addGrade(Mat, double)etaddGrade(String, double)— la seconde doit accepter le nom de la matière écrit de n'importe quelle manière, donc normaliser la chaîne avantMat.valueOf. computeOverallGrade()moyenne les valeurs de la table et renvoie-1si aucune note.- 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. - Itérabilité :
implements Iterable<Double>et une méthodeiterator()déléguée à la collection de notes —for (Double g : s)devient possible sans exposer la table. - Ordre naturel :
Comparable<Student>sur la moyenne, pour classer du meilleur au moins bon via un simpleCollections.sort. - Critère alternatif : un
Comparator<Student>par âge, du plus jeune au plus âgé. YearGroup, basée sur une liste, itérable sur les étudiants, avecaddStudent.sortByAge()etsortByGrades(): les deux tris réutilisent leComparableet leComparatordes questions précédentes.getAdultIt(): un itérateur qui ne rend que les étudiants majeurs — le filtrage se glisse danshasNext/nextd'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.
- Lecture : d'abord avec
FileReaderet sonread()à-1terminal, en gérant les exceptions ; puis la même lecture avecBufferedReader.readLine()— l'occasion de mesurer ce que gagne la mise en tampon. - Écriture d'un tableau de
double: avecFileWriter, puis avecPrintWriteret sa méthodeprintln(double)— même travail, confort en plus. - Saisie clavier :
System.inest une instance deInputStream; on crée le flux puis unReaderdessus. 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'écrireinputToDivide()dans une classeKeyboardInput. FileCopy: programme en ligne de commande qui copie un fichier. Chaque vérification devient une exception personnalisée :WrongUsageExceptions'il n'y a pas exactement deux arguments (avec message de syntaxe),FileNotFoundExceptionsi la source n'existe pas,ExistingFileExceptionsi la destination existe déjà ;System.exitinterrompt le programme après affichage du message. VarianteFilteredFileCopy: un troisième paramètre borne la taille du premier mot des lignes copiées.Scanner: somme des entiers saisis au clavier jusqu'à la chaîne"bye"(toute autre chaîne est ignorée), puis lecture d'un annuairenom annéepour afficher l'âge calculé à la place de l'année de naissance.
TD 10 — Objets génériques
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 —orderedEqualsetnonOrderedEquals— qui distinguent la prise en compte de l'ordre des éléments.- 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 uneList<Duo<T>>par tirage. Couple<T,S>: deux types paramétrés indépendants, une méthode d'instancesameAset une méthode statiquesameCouples— la généralisation directe duDuo.- Le jeu de la Mourre, en mode objet : l'enum
Mourre(ONE à FIVE) et l'interfaceIPlayeravecplay()retournant unCouple<Mourre,Integer>— les doigts montrés et la somme annoncée.HumanPlayersaisit 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.TwosomePlayerencapsule unDuo<Player>et fait jouer ses deux membres à tour de rôle ;RandomPlayertire 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.
Le basculement doit affecter tous les étudiants sans parcourir une liste : un
attribut d'instance exigerait de changer chaque objet un par un. Un attribut de
classe, lu par toString, change le rendu de tous les objets d'un coup.
Un accesseur livrerait la table interne — modifiable de l'extérieur. Iterable<Double>
n'offre qu'un parcours en lecture des notes, sans révéler la structure : c'est la
simplification de l'interface publique par délégation.
Quand la fonctionnalité ne dépend d'aucun état d'objet — mélanger deux duos, tirer
des paires d'une liste. Le paramètre de type se déclare alors avant le type de
retour : static <T> List<Duo<T>> randomDuos(List<T> elements).
Parce que le jeu doit manipuler indifféremment un humain, un binôme ou un bot :
MourreGame.game ne connaît que le contrat play(). C'est le traitement générique
par interface du chapitre 7, appliqué à un cas concret.
tdOO_08.pdf
R2.01 · TD 8 — Révisions : itérabilité et comparabilité · 10 questions
Chargement du document…
tdOO_09.pdf
R2.01 · TD 9 — Premières interactions avec des fichiers · 4 exercices
Chargement du document…
tdOO_10.pdf
R2.01 · TD 10 — Objets génériques · 3 exercices
Chargement du document…
Dernière mise à jour le
Ch. 10 — Programmation générique
Types paramétrés : conventions E/K/V/T, effacement de type et ses interdictions, méthodes génériques et inférence, invariance des collections et jokers ? extends / ? super.
TP 1-2 — Bases et références
Écrire ses premières classes Java en compilant au terminal : Book et un HighScore trié, structure irrégulière, puis concurrents de roller et jeu de dés — la démarche exercice par exercice.