TP_POO_JAVA
TP_POO_JAVA
TP_POO_JAVA
Exercice 0 : Préparation du TP
Organiser votre espace de travail
Avant tout chose organisez votre espace disque afin de pouvoir par la suite retrouver
facilement le travail effectué lors des différentes séances de TPs. Pour cela :
1. créez dans votre répertoire TPS un sous répertoire Java dans lequel vous mettrez tous
les TPs concernant cette partie du cours.
2. dans le répertoire Java créez un sous répertoire TP01 dans lequel vous rangerez le
travail effectué au cours ce premier TP.
Si vous n'obtenez pas les réponses attendues, il faut installer le JDK et configurer votre
environnement avant de pouvoir travailler :
Plusieurs versions de Java SE sont disponibles, la dernière en date (au 03/01/2022) étant la
version 17. Lorsque vous utilisez les documentations du JDK, il vaut mieux vous référer à
celle correspondant à la version installée sur votre machine (voir exercice 0) :
La page
d'accueil de l'API du JDK 8 (capture du 15/12/2020)
• Quelle est l'URL de cette page ? Pensez à l'enregistrer dans vos favoris, elle vous sera
utile par la suite.
• Que signifie le terme API ?
• L'API Java est structurée autours de la notion de package. Qu'est-ce qu'un package
Java ?
Retrouvez la documentation de la classe Math de l'API java, classe définie dans le package
java.lang.
• Quelle est l'URL de cette page ? Pensez à l'enregistrer dans vos favoris, elle vous sera
utile par la suite.
• Sur cette page les packages n'apparaissent plus directement. L'API est structurée
autour de la notion de modules. Qu'est-ce qu'un module ?
• Dans quel module se trouve le package java.lang
• En utilisant l'outil Search situé en haut de la page de l'API retrouvez la description de
la classe Frame. A quel package appartient cette classe ?
Cet exercice reprend la leçon The "Hello World !" Application du programme
d'apprentissage Getting Started des tutoriaux java d'Oracle.
Nous n'allez pas ici, suivre ce tutoriel dans son entier, vous pourrez vous y référer pour les
étapes de compilation et d'exécution si nécessaire.
Si les versions de java sont compatibles, un même programme doit pouvoir être exécuté sur
des machines différentes sans nécessiter de recompilation.
.............................................................................................................
.............................................................................................................
Exercice 2.4 : Méthodes dépréciées
.......................................................................................................................
12. La compilation de cette classe vous indique que certaines méthodes utilisées par ce
programme sont dépréciées. Présentes dans les premières versions de la plateforme
java, ces méthodes ont depuis été remplacées par de nouvelles méthodes introduites
dans les versions successives de la plate-forme java. Toutefois les messages de
"dépréciation" sont simplement des avertissements (warnings), le code compilé est
exécutable. Ces messages sont là pour signifier au programmeur l'utilisation de
méthodes dépréciées qui peuvent s'avérer dangereuses ou risquent de ne plus être
supportées dans de futures versions de java et qu'il serait préférable de remplacer par
de nouvelles fonctionnalités de la plate-forme java.
Quelle option du compilateur java permet de voir le détail des méthodes dépréciées ?
.......................................................................................................................
13. Recompilez la classe AfficherHeure avec cette option. Quelles sont les méthodes
dépréciées utilisées dans AfficherHeure ? Dans quelle classe sont elles définies ?
Que dit la documentation javadoc à leur sujet ?
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
..............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
..............................................................................................................................
12. Dans l'exercice précédent (2.3) vous avez pu constater que plusieurs des méthodes de
la classe Date sont dépréciées. Pour remédier à ce problème, la javadoc de cette classe
vous recommande d'utiliser un objet Calendar du package java.util.
et les messages
• un répertoire src (sources) contenant les fichiers source des classes JAVA
• un répertoire classes contenant les fichiers compilé (byte-code) des classes JAVA
• un répertoire docs contenant la documentation des différentes classes JAVA
Dans l'exercice qui suit, vous allez expérimenter cette organisation avec une application qui
permet l'animation de visages sur l'écran. Cette application est constituée de 3 classes Java :
• VisageRond qui décrit des objets modélisant un Visage animé.
• Dessin qui décrit l'objet chargé de la gestion et l'affichage des différents objets
Visages qu'il contient
• AppliVisage1 le programe principal qui crée les Visages, les place dans la zone de
dessin et lance l'animation.
a) compilation de l'application
b) exécution de l'application
o
sous windows
(https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html)
o sous unix
(https://docs.oracle.com/javase/8/docs/technotes/tools/unix/classpath.html)
4. Déplacez le fichier AppliVisage1.class du répertoire classes vers le répertoire
Visages.
Que constatez-vous ?
..........................................................................................................
o sous windows
o ( https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jar.html)
o sous unix (https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jar.html)
3. Que fait la commande jar tvf appliquée au fichier jar que vous venez de créer ?
.....................................................................................................
4. Déplacez le fichier jar dans le répertoire Visages.
5. Replacez-vous dans le répertoire Visages et lancez à nouveau l'exécution en utilisant
ce fichier jar dans l'option -classpath de la commande java.
o Quelle est la commande à utiliser pour lancer cette exécution ?
..............................................................................................
6. D'après vous quel est l'interêt des fichiers jars ? (Des éléments de réponse sont dans la
documentation de la commande jar)
..........................................................................................................................
..........................................................................................................................
..........................................................................................................................
• sous windows
(https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html)
• sous unix (https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html)
1. Modifiez le source de classe VisageRond afin que la taille par défaut d'un visage soit
de 100x100 pixels au lieu de 50x50 pixels
2. Recompilez cette classe (en prenant bien soin de placer le fichier bytestrong dans le
répertoire classes).
o Quelle commande avez-vous utilisée ?
................................................................................
o Quelles ont été les classes recompilées ?
................................................................................
3. Vérifiez que votre modification fonctionne en réexécutant l'application AppliVisage1.
o Quelle commande avez-vous utilisée pour cette exécution ?
.......................................................................................
f) Erreurs de compilation
g) Erreurs d'exécution
Objectifs: Le but de ce TP est de vous faire expérimenter les constructions de base du langage
JAVA (types simples, instructions de contrôle, itérations) qui sont très proches syntaxiquement
de celles utilisées par le langage C. Les programmes que vous aurez à écrire ne feront donc que
très peu appel aux notions d'objets et classes, mais avant d'expérimenter celles-ci, il paraît
préférable de vous assurer que vous maîtrisez correctement ces constructions élémentaires. De
plus, cela vous permettra de parfaire votre maitrise des outils de base (compilateur javac,
interpréteur java) du JDK vus lors du TP1.
Ressource utiles
• Les types simples (entiers, réels, ...) et les instructions de base du langage JAVA:
o les slides de présentation du cours.
• Pour effectuer des lectures au clavier:
o utilisez la classe Scanner (javadoc : JDK 17 ou bien JDK 8) du package standard
java.util (dans le module java.base pour versions du JDK supérieures à 9). Dans
le fichier ScannerDemo.java fourni avec ce TP vous trouverez un exemple
d'utilisation de cette classe pour lire des données au clavier.
Les exercices proposés dans ce TP sont indépendants et sont organisés par thème
(expressions, instructions conditionnelles, itérations. Les thèmes sont présentés selon un
ordre de difficulté croissant.
Chaque thème comporte plusieurs exercices. Traitez ces thèmes selon leur ordre de présentation
en effectuant au moins un des exercices proposés. Lorsque vous aurez abordé tous les thèmes,
vous pourrez revenir en arrière pour réaliser les exercices que vous n'avez pas encore traités.
Rappel: tout programme source JAVA doit avoir comme suffixe .java. La version compilée
d'un programme JAVA a le même nom que le programme source correspondant mais son
suffixe est .class.
Style de codage: Adopter un style de codage uniforme et cohérent est un principe de base dans
l'activité de programmation : cela facilite la lecture et la compréhension du code.
1. Les noms de classes sont définis par un identificateur débutant par une majuscule.
2. Les noms de variables locales sont définis par un identificateur débutant par une
minuscule.
3. Les programmes doivent être correctement indentés.
Prenez dès maintenant de bonnes habitudes de codage Java. Il vous est demandé de respecter
impérativement les 3 règles ci-dessus.
Pour en savoir plus sur les bonnes pratiques, vous pouvez vous référer au document de Google:
Google Java Style (https://google.github.io/styleguide/javaguide.html)
Thème 1 : Expressions
Exercice 1 : Conversion de températures
C:\JAVA\TP2>java Degres
donnez une temperature en Fahrenheit : O.O
cette temperature equivaut a -17.8 degres Celsius
C:\JAVA\TP2>java Degres
donnez une temperature en Fahrenheit : 60.0
cette temperature equivaut a 15.6 degre Celsius
C:\JAVA\TP2>
Ecrire un programme Hjms.java en langage JAVA qui pour un nombre de secondes donné
calcule et affiche son équivalent en nombre de jours, d'heures, de minutes et de secondes.
C:\JAVA\TP2>java Hjms
donnez une durée en secondes : 3621
cette durée équivaut à 0 jours 1 heures 0 minutes 21 secondes
C:\JAVA\TP2>java Hjms
donnez une durée en secondes : 567231
cette durée équivaut à 6 jours 13 heures 33 minutes et 51 secondes
C:\JAVA\TP2>
Thème 2 : Instructions conditionnelles
Exercice 1 : Déterminer de l'appartenance d'un point à une couronne
Ecrire un programme Couronne.java en langage JAVA qui pour un pour un point P du plan
détermine si ce point se trouve ou non à l'intérieur de la couronne de centre l'origine et définie
par la donnée de son rayon extérieur rext et son rayon intérieur rint
C:\JAVA\TP2>java Couronne
rayon extérieur : 14
rayon intérieur : 10
donnez un point
x : 12
y : 0
ce point est dans la couronne
C:\JAVA\TP2>
Ecrire un programme TroisNombres.java qui lit 3 nombres au clavier, les classes dans l'ordre
croissant et les affiche du plus petit au plus grand sur la console.
C:\JAVA\TP2>java TroisNombres
1er nombre : 14
2ème nombre : 10
3ème nombre : 17
les nombres dans l'ordre croissant : 10 14 17
C:\JAVA\TP2>
Thème 3 : itérations
Exercice 1 : Moyenne olympique
Ecrire un programme qui lit au clavier une suite de nombres réels positifs ou nuls
(correspondant à des notes), terminée par la valeur -1, et calcule la moyenne olympique de ces
valeurs, c'est à dire la moyenne des notes sans prendre en compte la note la plus élevée ni la
note la moins élevée.
Exemple de trace d'exécution (en vert les valeurs introduites par l'utilisateur):
C:\JAVA\TP3java>MoyenneOlympique
donnez une note ( >=0 ou -1 pour arrêter): 9.6
donnez une note ( >=0 ou -1 pour arrêter): 9.7
donnez une note ( >=0 ou -1 pour arrêter): 10.0
donnez une note ( >=0 ou -1 pour arrêter): 9.8
donnez une note ( >=0 ou -1 pour arrêter): 9.2
donnez une note ( >=0 ou -1 pour arrêter): 9.9
donnez une note ( >=0 ou -1 pour arrêter): -1
La note la plus élevée (10.0)et la note plus basse (9.2) ont été retirées
La moyenne olympique est : 9.75
C:\JAVA\TP3>
Ecrire un programme affiche un motif triangulaire dont la taille est fixée par une valeur lue au
clavier.
Exemple de trace d'exécution (en vert les valeurs introduites par l'utilisateur):
C:\JAVA\TP3>java Triangle1
donnez taille du motif : 7
*
**
***
****
*****
******
*******
C:\JAVA\TP3>
Même exercice que le précédent mais le motif affiché n'est plus un triangle mais une pyramide
(voir ci-dessous) et le choix des instructions pour le réaliser est laissé à votre jugement.
Exemple de trace d'exécution (en vert les valeurs introduites par l'utilisateur):
C:\JAVA\TP3>java Pyramide
donnez taille du motif : 7
*
***
*****
*******
*********
***********
*************
C:\JAVA\TP3>
b) Ecrire un programme Fibo2.java qui permet d'obtenir la valeur et le rang du premier terme
de cette suite supérieure à une valeur donnée par l'utilisateur.
Ecrire un programme Premier.java qui permet de tester si un nombre introduit par l'utilisateur
est premier ou non.
Exemple de trace d'exécution (en vert les valeurs introduites par l'utilisateur):
C:\JAVA\TP2>java Premier
donnez un entier positif : 7
7 est un nombre premier
a) Le jeu consiste à découvrir par essais successifs le prix d'un lot . Pour chaque essai, le joueur
reçoit un message : "Trop grand", "Trop petit" ou "BRAVO ! Vous avez trouvé en K essais".
Le jeu est fini quand le joueur a trouvé le prix du lot.
On propose d'écrire un programme JAVA PrixLot1.java qui joue le rôle de meneur de jeu ;
l'exécution de ce programme vous fera tenir le rôle du joueur. Le programme Prixlot1doit
définir le prix du lot en tirant un entier aléatoire entre 1 et 1000 et dialoguer avec le joueur
pendant le jeu.
Pour choisir un nombre au hasard on utilisera la méthode random de la classe Math qui retourne
un réel (double) tiré au hasard et de manière uniforme dans l'intervalle [0 1].
exemple :
double x; x = Math.random();
C:\JAVA\TP3>java PrixLot1
Le but est de chercher un prix entre 0 et 1000
Tapez un prix : 566
Trop grand
Tapez un prix : 400
Trop grand
Tapez un prix : 150
Trop petit
Tapez un prix : 200
Trop petit
Tapez un prix : 214
BRAVO ! Vous avez gagné en 5 essais
C:\JAVA\TP3>
• enchaîner plusieurs jeux consécutifs lors d'une même exécution du programme (à la fin
de chaque jeu, il est demandé au joueur de préciser s'il veut s'arrêter ou rejouer)
• limiter le nombre d'essais du joueur lors d'une partie (au début de chaque partie, le
programme demandera le nombre maximum d'essais autorisés).
C:\JAVA\TP3>java PrixLot2
Le but est de chercher un prix entre 0 et 1000
1ère partie. Nombre maximum d'essais : 4
Tapez un prix : 678
Trop petit
Tapez un prix : 920
Trop grand
Tapez un prix : 860
Trop petit
Tapez un prix : 910
Trop petit
PERDU ! Vous avez épuisé le nombre d'essais autorisés
Le prix était : 917
Le programme PrixLot3 effectue 20 parties ; il affiche pour chaque partie le prix tiré au sort
et le nombre d'essais successifs qui ont été nécessaires pour le trouver avec la tactique
programmée.
Pouvez-vous prévoir, pour la tactique que vous avez choisie, l'ordre de grandeur des nombres
d'essais ? Compléter le programme PrixLot3 en lui faisant calculer la moyenne des 20 nombres
d'essais obtenus pour les 20 parties.
Exercice 7 : Calcul de xn
Pour effectuer ce calcul on ne fera pas appel aux méthodes de la classe Math (pow ou exp et
log), mais on utilisera des instructions itératives (for, while ou do while). Le programme
devra permettre de traiter tous les cas possibles : n = 0, n > 0 et n < 0 avec X réel négatif, positif
ou nul. Rappelons que :
• X0 = 1 pour X > 0,
• 00 = 1 par convention,
• X0 n'est pas défini pour X < 0,
• 0n = 0 pour n > 0,
• 0n n'est pas défini pour n < 0.
exemple d'exécution :
C:\JAVA\TP2>java Puissance2
x = 2.0
n = 3.0
xn = 8.0
voulez-vous faire un autre calcul O/N : o
x = 3.5
n = -3
xn = 0.0233236151
voulez-vous faire un autre calcul O/N : n
C:\JAVA\TP2>
On considère un nombre réel positif A ; on sait que la suite (un) n=0,1,2,... définie par la donnée
d'un réel u0 positif et par la relation de récurrence un = (un-1 + A / un-1) * 0,5 (pour n > 0)
converge vers la racine carrée de A . On suppose le nombre A compris entre 1 et 100, et on
prend u0 = A / 2.
Pour obtenir une valeur approchée de racine carrée de A, on cherche le premier terme un tel que
| un2 - A | < E-5 . Le nombre trouvé est une valeur approchée de racine carrée de A ( en effet |
un2 - A | < E-5 implique que | un- rac(A) | < E-5 / ( un+ rac(A) où rac(A) correspond à la racine
carrée de A).
1. de lire le nombre A,
2. de calculer et d'afficher les approximations intermédiaires et la valeur approchée de la
racine carrée de A définie ci-dessus.
2. Ecrivez une troisième application donnant aux visages qui se déplacent dans la fenêtre
graphique une trajectoire moins répétitive. Au lieu de se déplacer uniquement selon une
diagonale, les visages se déplacent selon les quatre directions Nord-Ouest -> Sud-Est,
Sud-Ouest -> Nord-Est, Sud-Est -> Nord-Ouest et Nord-Est -> Sud-Ouest. La direction
du déplacement d'un visage sera modifiée à chaque rencontre de ce dernier avec un
bord de la fenêtre. Si vous avez le temps vous pouvez aussi animer les visages en les
dotant d'un changement d'expression à chaque changement de direction.
TP3: Tutoriel d'initiation à l'utilisation de Visual Studio Code
pour développer en Java
Ce document présente le minimum vital pour une utilisation de VSCode pour le développement
Java. Les captures d'écran ont été réalisées sous Windows 10 avec la version 1.63.2 de Viusal
Studio Code et la JDK 17.1.0 d'Oracle .
Avant de commencer, organisez votre espace disque afin de pouvoir par la suite retrouver
facilement le travail effectué lors de cette séance de TP. Pour cela, dans le répertoire TPS/Java
créé lors du TP1, ajoutez un sous répertoire TP03 dans lequel vous rangerez le travail effectué
au cours ce TP.
1. Configuration de VSCode
Avant toute chose, il faut au préalable que vous ayez installé un JDK 11 ou + sur votre
ordinateur. Il vous faut ensuite ajouter à VSCode les extensions qui vous permettront de
travailler avec le langage Java. L'Extension Pack for Java regroupe les extensions de base les
plus populaires qui vous aideront à développer en Java sous VSCode.
• un support pour l'édition du code Java (auto complétion, navigation, refacoring, code
snippets...)
• un support pour l'exécution et le débogage du code Java
• Un support pour la gestion de projets Java (gestions de librairies et dépendances, des
classes et packages ...)
• ...
Un projet Java est un ensemble de fichiers source Java et des informations associées (classpath,
comment construire et exécuter le projet, etc...), la manière dont ces fichiers sont organisés
dépend à la fois de la nature du projet (Application Java standard, Application web, Application
JEE...) et de l'outil de construction de projet (Build Tool) choisi. VSCode offre plusieurs
possibilités pour l'outil de construction de projets :
Dans cette introduction à Java sous VSCode nous ne nous intéresserons dans un premier temps
qu'aux projets sans outils de construction.
La figure ci-dessous vous montre les différentes étapes pour créer un nouveau projet
d'application Java
Etapes de création d'un projet Java sans outils de construction (build tool)
Dommage votre navigateur ne supporte pas les vidéos HTML5. Vidéo : Création d'un projet
Java
Structure du projet
VSCode crée sur votre disque dur, dans le dossier choisi à l'étape 4, un nouveau dossier dont
le nom est celui que vous avez fourni à l'étape 5 (HelloJava). La figure ci-dessous vous
montre la structure du projet ainsi créé.
La structure du projet HelloJava Dommage votre navigateur ne supporte pas les vidéos
HTML5. Vidéo : Exploration de la structure d'un projet Java
Dommage votre navigateur ne supporte pas les vidéos HTML5. Compilation automatique du
code Java
Pour exécuter l'application, là aussi c'est très simple. Deux possibilités vous sont offertes :
a. soit en cliquant sur le texte Run situé dans l'éditeur juste au dessus de la méthode main
b. soit en cliquant sur le bouton situé en haut à droite de l'éditeur.
Une fois l'exécution lancée, VSCode ouvre automatiquement un terminal dans lequel il exécute
la commande java avec les options adéquates pour exécuter le code de la classe App.java. La
figure ci-dessous vous montre le déroulement de cette exécution.
Déroulement de l'exécution du projet HelloJava
4. Utilisation de l'éditeur
Vous allez maintenant modifier le code de la class App pour voir rapidement quelques unes des
possibilités de l'éditeur Java de VSCode.
Lorsqu'il le peut, l'éditeur vous propose une complétion automatique du code. Par exemple
arrêtez la frappe après avoir tapé Sys, l'éditeur vous propose un certain nombre de complétion
possibles avec la documentation javadoc associée.
Dommage votre navigateur ne supporte pas les vidéos HTML5. Autocomplétion du code Java
L'éditeur n'attend pas toujours qu'une compilation ait été lancée pour vous signaler d'éventuelles
erreurs. Au fur et à mesure que vous tapez votre texte, la syntaxe java est vérifiée et en cas
d'erreur un ~ rouge est affiché sous le texte où l'erreur a été détectée. En positionnant le curseur
de la souris sur celui-ci vous aurez un message d'explication indiquant la nature de l'erreur. Pour
apprécier cette fonctionnalité supprimez le ; à la fin de l'instruction System.out.println("Bye
Bye World !").
La vidéo ci-dessous vous montre plus en détail comment les erreurs détectées sont matérialisées
dans l'éditeur de VSCode.
Dommage votre navigateur ne supporte pas les vidéos HTML5. Matérialisation des erreurs dans
le code Java
Modifiez maintenant le code de votre classe App afin que le programme lise un nombre entier
au clavier et affiche autant de fois les messages Hello World ! et Bye Bye World ! Votre code
doit être le suivant :
import java.util.Scanner;
La classe Scanner est une classe du package java.util, pour pouvoir l'utiliser dans votre code
il est nécessaire d'effectuer un import au début du programme. Normalement lorsque vous avez
déclaré la variable sc cet import a été effectué automatiquement. Si vous supprimer cet import,
une erreur apparaît dans votre code. En plus de signaler l'erreur, l'éditeur peut vous proposer
des actions pour la corriger (fixer) automatiquement. Ceci est matérialisé par une qui apparaît
sur la ligne où est placé le curseur.
La vidéo ci-dessous vous montre plus en détail ces possibilités de correction du code.
Dommage votre navigateur ne supporte pas les vidéos HTML5. Source Action pour corriger les
erreurs
Recopiez dans le répertoire src de ce nouveau projet les sources des classes de l'application
AppliVisage vue lors du TP n° 1 :
• AppliVisage1.java
• VisageRond.java
• Dessin.java
Dommage votre navigateur ne supporte pas les vidéos HTML5. Lancement puis interruption
de l'application AppliVisage1
Dommage votre navigateur ne supporte pas les vidéos HTML5. Générer la javadoc
Pour comprendre l'origine de cette erreur vous allez utiliser le debugger de Java intégré à
VSCode qui vous permettra de positionner des points d'arrêt, d'effectuer une exécution pas à
pas et d'observer l'état des variables.
2. Lancez ensuite une exécution sous le contrôle du debugger. Pour cela deux possibilités
: a) cliquez sur Debug au dessus de la méthode main ou bien b) cliquez sur le bouton
situé en haut à droite de l'éditeur. et sélectionnez
4. L'exécution est interrompue à la ligne 75 (qui n'a pas encore été exécutée). Pour faire
avancer l'exécution pas à pas cliquez sur le bouton Step Over de la barre d'outils du
debugger.
Répétez cette opération plusieurs fois et observez l'état des variables du programme.
5. Lorsque vous arrivez à la ligne 84 (appel de lireUneNote dans la boucle while) de la
méthode main, faites avancez l'exécution en rentrant dans la méthode lireUneNote.
Pour cela cliquez sur le bouton Step Into .
6. Continuez à avancer pas à pas (bouton Step Over) jusqu'à ce que vous ayez lu une
seconde note et que l'exécution soit arrêtée sur la ligne 53.
7. Placez un second point d'arrêt sur cette ligne, puis poursuivez l'exécution jusqu'au
prochain point d'arrêt (le premier point d'arrêt que vous aviez défini ligne 75). Pour
aller directement jusqu'à ce point d'arrêt cliquez sur le bouton Continue.
8. Poursuivez l'exécution sous le contrôle du debugger jusqu'à ce que vous ayez identifié
la cause de l'erreur. Interrompez alors l'exécution du debugger en cliquant sur le
bouton Stop.
9. Corrigez le bug, et vérifiez que le programme s'exécute correctement et peut être
arrêté une fois trois notes saisies.
Avant tout chose organisez votre espace disque afin de pouvoir par la suite retrouver facilement
le travail effectué lors de cette séance de TP. Pour cela, dans le répertoire TPS/Java créé lors
du TP1, ajoutez un sous répertoire TP05 dans lequel vous rangerez le travail effectué au cours
ce TP.
1. Créez une classe Rational, possédant deux attributs entiers num et denom
• . (Reportez vous au TP03 pour voir comment créer un projet Java et une classe avec l'IDE
VSCode).
• Écrivez un programme de test qui crée une fraction 3/2
Exceptions
1. Modifiez votre programme de test pour créer un autre rationnel de dénominateur égal à
0. Est-ce possible ? Si oui, en quoi est-ce un problème ?
2. Pour empêcher la création et la manipulation d’objets rationnels ayant pour
dénominateur 0. Vous ajouterez au constructeur de votre classe Rational un test qui au
cas où le dénominateur serait nul exécute l'instruction suivante :
Opérations arithmétiques
Pour rappel (au cas où...), la multiplication de deux rationnels est définie de la manière suivante:
nd×n′d′=nn′dd′
1. Ajoutez à votre classe Rational une méthode mult prenant en paramètre un autre
rationnel, et le multipliant au rationnel sur lequel elle est appliquée. La méthode ne
renvoie rien (type de retour void).
Cette opération modifie l’état de l’objet sur lequel la méthode est invoquée : a.mult(b)
revient à faire a←a∗b
. Il n’est pas possible en Java de redéfinir des opérateurs (comme en C++), sinon ce serait
équivalent à a∗=b
• Modifiez votre programme de test en créant un second rationnel (1/3 par exemple), en le
multipliant au premier, et en affichant le résultat. Compilez et exécutez.
• Mêmes questions pour l’addition. Pour rappel, l’addition de deux rationnels est définie de
la manière suivante :
nd +n′d′=nd′+n′ddd′
Fractions irréductibles
En plus d’interdire la création et la manipulation de rationnels dont le dénominateur est à 0,
nous souhaitons que tout rationnel soit toujours sous sa forme irréductible. Il s’agit d’un
invariant de classe : à tout instant, et ce dès sa création, un objet Rational est toujours sous
forme irréductible.
Pour rappel, un rationnel n/d est sous forme irréductible si et seulement si pgcd(n,d)=1,
avec :
fonction pgcd(a,b)
si b est égal à 0
renvoyer a
sinon
renvoyer pgcd(b, reste(a,b))
Une chenille est constituée d’une tête suivie d’une suite d’anneaux (figure 1).
le repère associé à
une fenêtre de
dessin a son
origine dans le
coin supérieur
gauche de la
fenêtre. Les
points-écran
(pixels) à
l’intérieur d’une
fenêtre sont à
coordonnées figure 2 : Position initiale d’une chenille dans une fenêtre de largeur xMax et hauteur
entières. La taille yMax.
d’une fenêtre
indique la taille de
la zône
d’affichage, elle
ne tient pas
compte du cadre
qui entoure celle-
ci.
figure 3 : Déplacement d’une chenille (en italique les éléments de la chenille à l’instant t,
en normal les éléments de la chenille à l’instant t+1)
Pour modéliser une chenille en langage JAVA on décide de définir trois classes d’objets :
• une classe Anneau qui décrit les objets représentant chaque anneau de la chenille.
• une classe Tête qui décrit l’objet représentant la tête de la chenille. La tête peut être
vue comme un cas particulier d’anneau. La classe Tête sera donc définie en héritant
de la classe Anneau (autrement dit la classe Tête sera une sous-classe de la classe
Anneau).
• une classe Chenille qui décrit un objet modélisant une chenille dans son ensemble
et donc qui utilisera les services des classes Tête et Anneau.
Un Anneau est un objet défini par trois attributs (les coordonnées x,y du centre du cercle le
représentant et le rayon r de ce cercle) et capable de se placer à une position donnée, de
s’afficher. La spécification du constructeur et des méthodes de la classe Anneau vous est
donnée ci-dessous.
/**
* crée un Anneau en fixant sa position initiale et son rayon
* @param xInit abscisse du centre de l’anneau
* @param yInit ordonnée du centre de l’anneau
* @param r rayon de l’anneau
*/
public Anneau(int xInit, int yInit, int r)
/**
* retourne abscisse du centre de l’anneau
* @return abscisse du centre de l’anneau
*/
public int getX()
/**
* retourne ordonnée du centre de l’anneau
* @return ordonnée du centre de l’anneau
*/
public int getY()
/** positionne le centre de l’anneau en un point donné
* @param px abscisse du point
* @param py ordonnée du point
*/
public void placerA(int px, int py)
/**
* affiche l’anneau en le matérialisant par un cercle noir
* @param g objet de classe Graphics qui prend en charge la gestion
* de l’affichage dans la fenêtre de dessin
*/
public void dessiner(Graphics g)
Parameters:
x - the x coordinate of the upper left corner of the oval to be drawn.
y - the y coordinate of the upper left corner of the oval to be drawn.
width - the width of the oval to be drawn.
height - the height of the oval to be drawn.
La classe Tête est définie comme une sous-classe de la classe Anneau. En effet comme un
anneau, une tête est définie par trois attributs (les coordonnées de son centre et son rayon) et
est capable de se placer à une position donnée, de s’afficher et de s’effacer. Les différences
sont les suivantes :
La classe Tête enrichit la classe Anneau d’un nouvel attribut : cap un réel (double) qui
définit la direction de déplacement de la tête.
La position, le rayon et le cap initial d’une tête sont fixés à sa création (donnés en paramètre
du constructeur).
La méthode dessiner est redéfinie de manière ne plus afficher un cercle (noir ou blanc)
selon le cas mais un disque (cercle plein) (utiliser la méthode fillOval de
java.awt.Graphics en lieu et place de drawOval).
x’ = x + R * cos(cap) et y’ = y + R * sin(cap)
La classe Chenille définit quatre attributs pour une chenille (sa tête, la liste de ses anneaux
stockée dans un tableau, la taille en x et en y de la fenêtre dans laquelle la chenille est
dessinée). Elle possède un constructeur permettant à partir d’une taille de fenêtre donnée en
paramètre de créer une chenille en position initiale (horizontale avec le centre de la tête placé
au centre de la fenêtre). Elle possède également 2 méthodes publiques: une pour dessiner la
chenille, l’autre pour faire effectuer à la chenille un déplacement élémentaire selon
l’algorithme donné au § 2.2.
4. Travail à effectuer
Avant toute chose, créez un répertoire (td3 ou chenille, à votre choix) dans lequel vous
vous placerez pour réaliser cette application.
indications :
b) Imaginez de nouveaux types de chenilles. Par exemple des chenilles colorées, des chenilles
mutantes dont le nombre d’anneaux varie au cours de leur existence (par exemple ajout d’un
anneau lorsque l’un des bords est atteint, sauf dans le cas où il s’agit du bord supérieur de la
fenêtre, dans ce dernier cas la chenille perd un anneau).
Ecrire les classes représentant ce (ces) nouveau(x) type(s) de chenille et modifiez
l’application de sorte à ce que plusieurs chenilles d’espèces différentes soient animées
simultanément.
c) Déposez dans la zone de dessin des " salades " matérialisées par des disques verts.
Programmez une nouvelle espèce de chenilles, les chenilles gourmandes, dont la taille
(diamètre des anneaux) croit chaque fois qu’elles " mangent " une salade (c’est à dire chaque
fois que la tête de la chenille passe sur une salade). Bien sûr, pour ne pas faire éclater les
chenilles on prendra soin de retirer les salades au fur et à mesure que les chenilles les
dévorent.
Modifiez les classes existantes et écrivez les nouvelles classes nécessaires pour cette
application.
TP6 de Programmation Orientée Objet – JAVA
Objectifs : Il s'agit de se familiariser avec les notions d'héritage, de réutilisation et
d'abstraction et de polymorphisme et à leur réalisation dans le langage JAVA.
Exercice 1
Il s'agit d'écrire en JAVA une application de jeu. Ce jeu consiste à déplacer un curseur (à
l'aide de la souris, par exemple) et à détruire des cibles qui apparaissent dans une fenêtre sur
l'écran.
Le repère associé à une fenêtre a son origine dans le coin supérieur gauche, l'axe des y est
orienté vers le bas (repère indirect). La figure qui suit montre par exemple une fenêtre de jeu
de taille 800x600 pixels (points).
Dans cet exercice, on ne s'intéressera qu'à la programmation des cibles. On supposera donc
que la fenêtre de jeu est représentée par un objet de classe FenêtreDeJeu qui propose deux
méthodes :
Un cible est définie par une position (couple de coordonnées entières) et une forme, qui peut
être soit un cercle soit un carré. Si la cible est circulaire sa position donne le centre du cercle
la matérialisant, si la cible est carrée sa position indique les coordonnées de son coin supérieur
gauche.
L'utilisateur peut déplacer le curseur de tir. Lorsque le curseur se trouve à l'intérieur d'une
cible (carré ou cercle) et que l'utilisateur enclenche le tir la cible est atteinte. Le comportement
d'une cible lorsqu'elle est atteinte varie selon la nature de la cible.
Pour représenter les différents types de cibles les classes suivantes sont définies :
La classe Cible
La position initiale est fixée lors de la création d'une cible (les valeurs de l'abscisse et de
l'ordonnée de la position sont passées en paramètre du constructeur de la classe Cible ainsi
que la référence de l'objet FenêtreDeJeu dans lequel le jeu se déroule).
qui permet de tester si un point (le curseur) est à l'intérieur de la cible. Cette méthode
prend en paramètres un couple x, y de coordonnées entières et retourne une valeur
booléenne (true si le point (x,y) est à l'intérieur de la cible, false sinon).
c'est la méthode qui est appelée lorsque la cible est effectivement atteinte. Son action
dépend bien sur du type de la cible.
La classe CibleCirculaire
La classe CibleCirculaire définit comme son nom l'indique des cibles de forme circulaire.
Lorsqu'elles sont atteintes par un tir du joueur, les cibles circulaires ont le comportement
suivant (comportement implémenté dans la méthode choc()) :
la cible voit son rayon diminuer d'une unité (un pixel). Lorsque ce rayon devient nul, la cible
est repositionnée de façon aléatoire dans la fenêtre de jeu et le rayon reprend sa valeur initiale
(valeur qu'avait le rayon de la cible avant d'être atteinte pour la première fois et fixée lors à la
création de la cible).
La classe CibleCirculaireMobile
• un entier dx, qui désigne de combien de pixels la cible doit être déplacée lors de
l'appel de la méthode deplacer (voir ci-dessous). Cette variable d'instance est fixée
lors de la création de la cible (donnée en paramètre du constructeur).
lors de l'appel à cette méthode, la cible est déplacée de dx pixels suivant l'axe des
abscisses (on peut remarquer que si dx>0, la cible se déplace vers la droite et que si
dx<0, la cible se déplace vers la gauche). Lorsque la cible rencontre un des bords
verticaux de la fenêtre, elle rebondit et son déplacement se fait alors en sens inverse.
Enfin, les cibles circulaires mobiles ont un comportement particulier lorsqu'elles sont atteintes
par le tir du joueur (méthode choc()). En effet, non seulement leur rayon diminue d'une unité
(avec les mêmes conséquences que pour les cibles fixes de type Cible si le rayon devient
nul), mais en plus, leur sens de déplacement s'inverse (comme lorsqu'elles rencontrent un des
bords verticaux de la fenêtre).
Question 2) Ecrire le code JAVA de la classe Cible. Définir ses variables d'instance
(attributs), écrire son constructeur et ses différentes méthodes.
On supposera que laFenetre est une variable qui contient une référence valide vers un objet
de classe FenetreDeJeu.
Les paramètres 125,340,20 pour la CibleCirculaireMobile sont respectivement l'abscisse
et l'ordonnée de sa position initiale et son rayon initial.
Les paramètres 100,100,10,-3 pour la CibleCirculaireMobile sont respectivement
l'abscisse et l'ordonnée de sa position initiale, son rayon initial et la valeur de son déplacement
élémentaire.
Ecrire les instructions Java correspondant aux parties de l'algorithme ci-dessus écrites en gras,
sachant que pour gérer l'ensemble de cibles on décide d'utiliser un objet de la classe
ArrayList définie dans java.util. Cette classe, dont voici un extrait de la
documentation, se comporte comme un tableau dynamique. Elle permet de permet de
construire dynamiquement une liste d'objets, chaque objet présent dans la liste pouvant être
accédé directement par un index (0 pour le premier élément de la liste, 1 pour le deuxième,
etc....). Contrairement aux tableaux il n'est pas nécessaire de spécifier la taille d'un ArrayList,
de plus celle-ci croit dynamiquement au fur et à mesure que la liste des éléments qu'il contient
augmente.
Constructor Summary
ArrayList()
Constructs an empty list.
...
ArrayList(int initialCapacity)
Constructs an empty list with the specified initial capacity.
Method Summary
void add(int index, Object element)
Inserts the specified element at the specified position in this list.
boolean add(Object o)
Appends the specified element to the end of this list.
... ...
Object get(int index)
Returns the element at the specified position in this list.
... ...
int size()
Returns the number of elements in this list.
... ...
Modifiez l'application d'animation afin d'afficher indifféremment dans la même fenêtre des
chenilles et des visages créés de manière aléatoire. Créez ensuite une nouvelle classe d'objets
animables en procédant de manière à ne pas avoir à modifier le code de la classe Dessin.