IN101 – TP7 2009/2010
Sujet (à
n’imprimer qu’une seule fois par poste de travail)
Durée : 3 h
Nota : le travail demandé doit être terminé, en séance ou, à défaut, hors séance.
Si Bluej n'est pas ouvert, le
lancer. Visualiser le sujet dans un navigateur pour bénéficier des
liens.
Créer un répertoire tp7
dans In101 sur
votre compte. C'est dans ce répertoire que devront être stockés tous les
programmes Java et exercices relevant de ce tp.
Cet exercice s’inspire du projet DBShapes du tp6.
Télécharger le fichier shapeCollection.jar lié à cet énoncé, et l’enregistrer dans le répertoire tp7 précédemment créé.
Lancer BlueJ et ouvrir, le fichier .jar sauvegardé ci-dessus. [ Ouvrir non-BlueJ ... ].
Ce projet correspond à peu près à ce à quoi vous deviez aboutir à la fin du TP6, mais en ayant remplacé la classe Picture par la classe RandomPicture (quasi-vide pour l’instant).
1. Écrire dans la classe RandomPicture une fonction getOneColor() qui devra retourner une couleur (String) aléatoirement parmi "red", "green", "blue".
2. Pour
cela, utiliser un objet de la classe Random du JDK et un tableau des
3 couleurs possibles.
Choisir la bonne version de nextInt()
en consultant la javadoc version 6.
3. Essayer la nouvelle fonction en l’appelant vingt fois dans la méthode main() et en en affichant à chaque fois le résultat.
1. Écrire
dans la classe RandomPicture une
fonction getOneShape() qui devra
retourner une forme (DBShape)
aléatoirement parmi cercle, carré, triangle ou hexagone.
Elle prendra un seul paramètre de position qui sera utilisé à la fois pour les
2 coordonnées de la forme (ce qui la placera forcément sur une diagonale).
La couleur sera générée aléatoirement, ainsi que la (ou les) dimension(s)
nécessaire(s) ; chaque dimension devra varier entre 15 et 45 inclus.
2. Pour
cela, utiliser un objet de la classe Random
et une structure
de choix multiple.
Interdiction de créer plus d’une forme à chaque appel de getOneShape().
3. Essayer la nouvelle fonction en l’appelant 10 fois dans la méthode main() (au lieu des appels à getOneColor()), en partant de (0,0) et avec des positions espacées de 25, puis en affichant les résultats par System.out.println(). On améliorera l’affichage à l’exercice suivant.
1. Les affichages précédents ne sont pas très satisfaisants. Redéfinir la fonction toString() dans DBShape pour qu’elle retourne une String de la forme : {classe:couleur,surface} par exemple : {Circle:green,546.7769284744}
2. Pour
cela, lire la javadoc de getClass() ;
ensuite, dans la classe qu’elle retourne,
deux fonctions semblent a priori intéressantes : getName() et getSimpleName().
1. Dans
la classe RandomPicture,
déclarer un attribut « liste de formes ».
Pour rester le plus général possible, utiliser ici l’interface plutôt qu’une
implémentation.
2. Modifier le constructeur de la classe RandomPicture pour qu’il ajoute à la liste qu’il aura créée (choisir une ArrayList) pNb formes générées aléatoirement comme au 2.2.4.3., et remplacer le contenu de la méthode main() par un appel au constructeur en lui passant 10.
1. Créer une procédure printAllShapes() qui devra afficher textuellement toutes les formes de la liste (parcours simple d’une collection).
2. Dans la méthode draw(), afficher graphiquement toutes les formes de la liste (toujours un parcours simple), puis appeler la procédure créée à l’exercice précédent.
3. Dans le constructeur, ajouter un appel à draw(). + une ligne de séparation dans le Terminal.
4. Essayer plusieurs fois la méthode main()et vérifier la cohérence des affichages.
1.
Pour pouvoir filtrer une collection, nous avons besoin
de pouvoir passer en paramètre à la méthode de filtrage une condition que devra
vérifier toute forme que l’on voudra supprimer de la collection.
Écrire l’interface Condition ne
comportant qu’une fonction booléenne verif()
avec un paramètre DBShape (pour
vérifier une certaine propriété de cette forme).
2. Pour pouvoir tester, il nous faut créer au moins une condition. Écrire la classe EstUnHexagone qui vérifie si la forme passée en paramètre est bien un hexagone.
1.
Écrire la procédure supprimerSi()
qui accepte en paramètre une Condition
et qui supprime de la liste toutes les formes qui vérifient cette condition (et
ne les affiche plus).
Attention ! Ce n’est plus un parcours simple puisqu’il y a
modification de la collection.
2. A la fin de draw(), appeler la procédure précédente avec la condition EstUnHexagone.
3. Pour pouvoir mieux visualiser ce qui se passe, ajouter au début de supprimerSi() une pause de 3 secondes (méthode de Canvas) et à la fin un appel à printAllShapes().
1.
Écrire une nouvelle condition EstBleue qui vérifie si la forme passée en paramètre est
bien de couleur bleue.
2. Écrire une nouvelle condition AUneSurfaceSuperieureA qui vérifie si la forme passée en paramètre a bien une surface supérieure à celle stockée dans cette condition (et passée en paramètre au constructeur).
3. Ajouter à la fin de draw() deux nouveaux appels à supprimerSi() : le premier pour supprimer les formes bleues, le second pour supprimer les formes de surface supérieure à 600.
5. Essayer plusieurs fois la méthode main() et vérifier les affichages graphiques et textuels.
1.
Dans draw(),
mettre en commentaires ( F8 ) tout ce qui précède et tout ce qui suit l’appel à
printAllShapes().
2. Puisque aList est une collection, nous pouvons lui appliquer tous les algorithmes fournis dans la classe Collections. Essayer d’appeler reverse(collection) puis à nouveau printAllShapes().
1.
Ajouter maintenant un appel à shuffle(collection),
puis à nouveau à la méthode printAllShapes().
2. Essayer.
1.
Ajouter maintenant un appel à sort(collection)
sans paramètre, puis à nouveau à printAllShapes(). Pourquoi cela ne compile-t-il plus ?
2. L’erreur n’est pas facile à interpréter. Mais la javadoc de sort(collection) dit « All elements in the list must implement the Comparable interface ». Ce n’est pas le cas des DBShape …
3. Ajouter ce qu’il faut dans DBShape pour que les formes soient comparables par leur surface ; aide : compareTo() est déjà définie dans la classe Double …
Créer un nouveau projet BlueJ et une nouvelle classe.
1.
Dans une méthode statique test1() :
- déclarer (au moins) 2 variables entières first
et second
- déclarer un Scanner
et le connecter au clavier
- déclarer une String name et un entier value
2.
Faire
répétitivement (au moins une fois !) :
- demander un nom de variable (affichage du message + saisie d’un mot)
- demander une valeur (affichage du message + saisie d’un mot)
- selon le nom saisi, affecter la valeur à la bonne variable (sauf si le nom
n’existe pas)
- afficher le nom et la valeur des (au moins) 2 variables
- arrêter la boucle si le nom saisi était « quit »
3.
Compiler.
Tester. Que se passe-t-il si on saisit autre chose qu’un nombre quand on nous
demande une valeur ? Traiter l’exception en affichant un message signalant
qu’on attend une valeur et en n’oubliant pas que le mot « fautif »
n’a toujours pas été lu …
1.
Dans une méthode statique test2() :
- déclarer (au moins) 2 variables entières first
et second
- déclarer un Scanner
et le « connecter » au clavier
- déclarer une String name et un entier value, ainsi qu’une String line
2.
Faire
répétitivement (au moins une fois !) :
- demander un nom de variable suivi d’une valeur (affichage du message
+ saisie d’une ligne)
- déclarer un Scanner et le « connecter » à la ligne
précédemment lue
- récupérer le nom et la valeur saisis en testant préalablement leur
disponibilité
- selon le nom saisi, affecter la valeur à la bonne variable (sauf si le nom
n’existe pas)
- afficher le nom et la valeur des (au moins) 2 variables
- arrêter la boucle si le nom saisi était « quit »
3.
Compiler.
Tester. Que se passe-t-il si on ne saisit rien ou si on saisit autre chose
qu’un nombre après le nom de variable ? C’est l’avantage des tests
préalables …
Si pas fait antérieurement, générer (après l’avoir complétée !) la documentation de ces deux projets, puis sauvegarder les projets ouverts, puis fermer BlueJ [ menu Projet, choix Quitter ]. Si besoin, envoyer par mél à votre binôme, en fichiers attachés, tous les projets de ce tp (exportés sous forme de fichiers .jar). Se déloger.
Ce sujet a été élaboré par
Denis Bureau.
* travail personnel : doit être commencé au cours de la séance de TP s’il reste un peu de temps