Cours BUT Info

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 :

  1. addFirstFreeSlot : remplir la première case libre, renvoyer false si le tableau est plein. Le scénario reçoit la taille en argument du main via Integer.parseInt(args[0]) — les scores surnuméraires sont simplement perdus.
  2. addHighestFirst avec shifting(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.
  3. addOneSlotPerPlayer : un seul emplacement par joueur. Score gagne isSamePlayer et isHigher, 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îne NoXX et le temps min:sec en secondes ;
  • dossard hors 1–100, score hors 0–50 ou minutes/secondes hors 0–60 : numberSign vaut null (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.
  • equals porte sur numberSign et score, et sa validation se fait avec la classe de test UseCompetitor2.java fournie sous Moodle ;
  • isFaster compare 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érateur Random, 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, toString affiche 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. OneDicePlayerGame déroule la partie dans un main.

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.


tpOO_01.pdf

R2.01 · TP 1 — Notions de bases / prise en main des outils · 4 pages

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

Chargement du document…

tpOO_02.pdf

R2.01 · TP 2 — Gestion des concurrents / jeu de dés · 3 pages

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

Chargement du document…

Dernière mise à jour le

Sur cette page