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.
Objectif des TP : écrire ses premières classes Java — d'abord en compilant soi-même
au terminal, avant tout confort d'IDE — et enchaîner attributs, constructeurs,
toString, equals et tableaux sur deux cas d'usage : une bibliothèque de livres avec
panthéon de scores, puis des concurrents de course et un jeu de dés.
TP 1 — L'environnement d'abord
Le TP 1 commence par l'arborescence du projet, à conserver tout le semestre : un
répertoire devS2 contenant src, bin, lib, test, res — et un sous-dossier
tp01 pour les classes du jour. Le support conseille VSCodium et de compiler dans le
terminal au moins les quatre premières semaines : javac Book.java puis java Book,
sans erreur de compilation la première fois.
TP 1 — Book et la bibliothèque
La classe Book (auteur, titre, année) porte un constructeur complètement spécifié —
autant de paramètres que d'attributs — et un toString au format CSV :
<author>;<title>;<year>.
Le scénario de UseBook2 fait travailler la classe : une bibliothèque de 5 livres dans
un tableau défini en extension, affichage un livre par ligne, recherche du livre le
plus ancien. Le point pédagogique arrive ensuite : en objet, il n'est pas convenable que
le code d'une classe accède directement aux attributs d'une autre. Le calcul migre donc
dans Book :
public boolean isOldest(Book other) { return this.year < other.year; }Le main ne fait plus que trouver le livre qui répond true face aux autres — première
décomposition objet d'un traitement.
TP 1 — Score et HighScore trié
Score (nom, score, horodatage) s'affiche sous la forme (<timestamp>) <name> = <score> ;
HighScore stocke des scores dans un tableau de taille 100 par défaut. Trois
stratégies d'ajout se succèdent, chacune un exercice de tableau :
addFirstFreeSlot: remplir la première case libre, renvoyerfalsesi le tableau est plein. Le scénario reçoit la taille en argument dumainviaInteger.parseInt(args[0])— les scores surnuméraires sont simplement perdus.addHighestFirstavecshifting(int idx): conserver le tableau trié décroissant en décalant vers la droite les scores plus faibles — quand tout est plein, le plus faible disparaît, quel que soit son joueur.addOneSlotPerPlayer: un seul emplacement par joueur.ScoregagneisSamePlayeretisHigher, et l'insertion combine les deux règles : ajouter si le joueur est inconnu et qu'une case est libre, remplacer s'il bat son propre record.
Vérifier au fil de l'eau
Les classes UseHighScore... rejouent des scénarios avec affichage entre chaque étape
(**0 free slots ** termine le toString). Tester après chaque méthode ajoutée, pas
tout à la fin.
L'exercice complémentaire Irregular construit un tableau 2D à lignes de longueurs
variables : le constructeur Irregular(int[] lineSize) alloue la mémoire ligne par
ligne, randomFilling remplit, display prépare l'affichage, et isCommun(int) /
existCommon() cherchent un élément présent dans toutes les lignes.
TP 2 — Competitor
Un concurrent de roller porte un dossard, un score artistique (0 à 50) et un temps de vitesse exprimé en secondes. Le constructeur concentre le travail de validation et de conversion :
Competitor(int numberSign, int score, int min, int sec)transforme le numéro en chaîneNoXXet le tempsmin:secen secondes ;- dossard hors 1–100, score hors 0–50 ou minutes/secondes hors 0–60 :
numberSignvautnull(les autres attributs restent affectés) — l'objet invalide existe, c'est l'affichage qui le signale :(-invalide-, <score> points, <time> s). Le scénario n'affiche pas les invalides. equalsporte surnumberSignetscore, et sa validation se fait avec la classe de testUseCompetitor2.javafournie sous Moodle ;isFastercompare les temps, pour afficher tous les concurrents plus rapides qu'un concurrent de référence.
TP 2 — Dice et DicePlayer
Le jeu : un joueur lance un dé jusqu'à dépasser 20 points cumulés ; son score est le nombre de lancers nécessaires.
Dice: trois attributs privés (nombre de faces, générateurRandom, valeur courante). Le constructeur force 1 face si le paramètre est strictement négatif ou nul, et la valeur initiale du dé est tirée — le dé naît lancé.roll()relance,toStringaffiche la valeur.DicePlayer: nom, cumul, nombre de lancers, avec getters ;play(Dice)correspond à un unique lancer (cumul + compteur),playUntil(Dice, objective)boucle tant que le cumul n'excède pas l'objectif.OneDicePlayerGamedéroule la partie dans unmain.
Les exercices complémentaires généralisent : TwoDicePlayerGame fait jouer deux joueurs
à tour de rôle complet — chaque joueur épuise ses lancers avant de laisser l'autre —,
avec isWinner (moins de lancers ; à égalité, cumul comparé) et getWinner ;
NDicePlayerGame passe au tableau de N joueurs nommés par numéro d'ordre, avec
compareNbDiceRolls et un getWinners() capable de renvoyer plusieurs ex æquo.
Corrections et classes de test
Les corrections sont distribuées en archives _res sur Moodle, avec les classes de test
(UseCompetitor2 notamment). Ces pages restent des guides de démarche : le code
s'écrit en TP.
Parce qu'une classe ne doit pas fouiller les attributs d'une autre : le comparateur
entre deux livres est une responsabilité de Book, qui connaît ses propres attributs.
Le main devient plus court, et la règle « plus ancien » n'existe qu'à un endroit.
La convention de l'énoncé : l'objet est construit quand même, mais numberSign vaut
null. Le toString affiche (-invalide-, ...) et le scénario filtre à l'affichage
— la validation par construction, version douce, avant les exceptions du TP 9.
Elle décale les cases à partir de l'indice donné vers la droite, en écrasant la dernière — c'est elle qui garantit le tri après insertion. Bien traiter le cas du tableau plein : le score le plus faible sort du tableau.
Un dé sans valeur n'a pas de sens physique : le lancer initial garantit que tout dé fraîchement construit porte déjà une valeur cohérente avec son nombre de faces — aucun attribut n'est jamais laissé dans un état invalide.
tpOO_01.pdf
R2.01 · TP 1 — Notions de bases / prise en main des outils · 4 pages
Chargement du document…
tpOO_02.pdf
R2.01 · TP 2 — Gestion des concurrents / jeu de dés · 3 pages
Chargement du document…
Dernière mise à jour le
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.
TP 3-4 — Énums et encapsulation
Card et Task avec énumérations et commits GitLab, ToDoList qui grandit de 5 en 5 — puis encapsulation en cascade (Person/Student/StudentAbs/YearGroup) et réutilisation d'un jar documenté.