M1202 - TP Séance 2
Durée : 2h00
Objectifs
- Manipuler et modifier un code Java pour comprendre son fonctionnement
- Ecrire un programme de dessin en Java en utilisant quelques algorithmes de base
Au menu
- Cours
- Consignes
- Compréhension d'un code en Java
- Dessin d'un échiquier
Rappels
Nous avons vu précédemment :
- qu'un algorithme est une suite d'instructions pour résoudre un problème :
il fournit un résultat en sortie à partir de données en entrée
- lorsqu'on a besoin d'un algorithme, on va l'utiliser grâce à un appel d'algorithme :
on écrit le nom de l'algorithme, suivi de parenthèses qui contiennent l'ensemble
des données en entrée (voir exercice 2 de la feuille de TD : Algo2(3,5)).
On procède aussi comme cela en Java (voir TP1 : nombreAleatoire(1,10))
- on renvoie les données en sortie en utilisant renvoyer en pseudo-code et
return en Java (voir exercice 2 de la feuille de TD).
- on utilise des variables pour stocker des valeurs : chaque variable a un nom,
un type (l'ensemble de toutes les valeurs qu'elle peut prendre : par exemple
entier ou chaîne de caractères en pseudo-code, qui correspondent à
int et String en Java), et une valeur, qui peut changer
par une affectation notée "<-" en pseudo-code et "=" en Java
(voir exercice 2 de la feuille de TD). La première affectation dans une variable
est appelée initialisation.
- quand on veut désigner le contenu d'une chaîne de caractères, c'est-à-dire un
bloc de texte, on l'entoure de guillemets droits pour le distinguer d'un nom de variable
(voir exercice 4 de la feuille de TD).
- pour mettre deux chaînes de caractères l'une à la suite de l'autre, on
utilise le symbole "+" (voir TP1 et exercice 4 de la feuille de TD), qu'on appelle
concaténation.
- pour qu'un algorithme adopte un comportement différent en fonction de différentes
situations, on peut utiliser un test, qui fait les instructions blabla
si la condition conditionAVerifier est vraie, blibli sinon. On écrit le test
de cette manière :
- en pseudo-code :
Si conditionAVerifier alors :
blabla
Sinon :
blibli
Fin Si
- en Java :
if(conditionAVerifier){
blabla;
}else{
blibli;
}
- il est possible d'écrire un test qui ne contient pas de alors
(c'est-à-dire un if sans else en Java)
Nouveautés
Nous allons aujourd'hui utiliser les éléments suivants :
- pour pouvoir utiliser une variable en Java, avant son initialisation, il faut faire une déclaration de la variable,
c'est-à-dire écrire son nom précédé de son type. Par exemple : int nombreUtilisateur; String texte;
- pour créer un algorithme en Java, on va aussi déclarer l'algorithme, en écrivant d'abord
public static, puis le type de sortie de l'algorithme (on écrit void si
l'algorithme ne renvoie rien), puis le nom de l'algorithme, puis, entre parenthèses,
toutes les variables d'entrée précédées de leur type. On écrit ensuite les instructions blabla de
l'algorithme les unes à la suite des autres dans un seul bloc entre crochets.
Par exemple pour l'algorithme Algo2 de l'exercice 2 de la feuille de TD :
public static int Algo2(int a, int b){
blabla;
}
- il est possible de répéter un groupe d'instructions blabla en Java
tant qu'une certaine condition conditionAVerifier est vraie, à l'aide d'une boucle while,
de la manière suivante :
while(conditionAVerifier){
blabla;
}
- souvent, on souhaite répéter un certain nombre de fois, par exemple 6 fois,
le groupe d'instructions blabla. Pour cela, il est possible d'utiliser une variable qui
jouera le rôle de compteur, en l'initialisant à 0 et en lui ajoutant 1 à chaque passage
dans la boucle en continuant tant que le compteur est inférieur strictement à 6 :
int compteur=0;
while(compteur<6){
blabla;
compteur=compteur+1;
}
Quizz
Pour bien retenir les éléments ci-dessus, allez
répondre à ce quizz.
Afin de m'aider à évaluer votre avancement lors de ce TP,
vous devrez enregistrer vos réponses aux questions C5, C7, C8, C9, C13
(et si vous avez le temps, D1, D2 et D3)
dans un fichier texte (comme indiqué aux questions C2 et C3).
Vous m'enverrez ce fichier par mail à philippe.gambette<AROBASE>univ-mlv.fr,
à la fin du TP.
Lisez attentivement cet énoncé de TP/TD
en suivant les instructions.
En cas d'interrogation,
faites appel à moi,
que ce soit pour en savoir plus sur un des points abordés pendant le TP, ou
pour savoir comment effectuer une des tâches demandées (numérotées pour pouvoir
y faire référence simplement).
Attention, lors de ce TP il sera particulièrement indispensable d'utiliser un crayon
et une feuille de papier pour faire des dessins et visualiser ou calculer des coordonnées.
Surtout
ne restez pas bloqué(e) sur une des questions.
Entre parenthèses, à côté des titres de sous-sections, est indiqué
le temps que vous avez dû passer à effectuer les étapes précédentes.
question(); ?>Créez un dossier dédié à ce TP2
(de la même manière que vous en aviez créé un dédié au TP1).
question(); ?>Enregistrez-y ce fichier
TP2.java et ce fichier
TP2reponses.txt.
question(); ?>Renommez le fichier
TP2reponses.txt en "VotreNom".txt.
Vous y inscrirez les réponses aux questions dont le numéro
est indiqué dans le fichier.
Nous allons nous concentrer sur le code de l'algorithme
paint,
situé des lignes 11 à 35, qui dessine des objets en faisant appel
aux algorithmes suivants :
- dessineRectangle(Graphics g, int abscisseCoin, int ordonneeCoin, int largeur, int hauteur, Color couleur)
qui dessine sur l'objet g un rectangle vide dont la bordure est de couleur
Color, et dont le coin en haut à gauche a pour coordonnées (abscisseCoin,ordonneeCoin),
et qui a pour largeur largeur et pour hauteur hauteur
- dessineRectanglePlein(Graphics g, int abscisseCoin, int ordonneeCoin, int largeur, int hauteur, Color couleur),
qui dessine sur l'objet g un rectangle dont l'intérieur est coloré de la même couleur
Color que la bordure, dont le coin en haut à gauche a pour coordonnées (abscisseCoin,ordonneeCoin),
et qui a pour largeur largeur et pour hauteur hauteur
- dessineLigne(Graphics g, int abscisse1, int ordonnee1, int abscisse2, int ordonnee2, Color couleur),
qui dessine sur l'objet g une ligne commençant au point de coordonnées
(abscisse1,ordonnee1) et se terminant au point de coordonnées (abscisse2,ordonnee2).
- couleurRGB(int r,int g,int b) qui renvoie une couleur, de type Color,
qui est une combinaison de rouge, vert et bleu, ces trois couleurs correspondant
aux variables d'entrée r, g et b qui sont des entiers entre
0 et 255.
Notons en lisant les variables en entrée de ces algorithmes
que nous n'avons pas encore rencontré le type
Graphics,
qui est un type d'objet sur lequel on fait des dessins.
De plus, nous n'avons pas encore rencontré en Java (seulement en cours)
le type
Color qui sert à exprimer une couleur.
Remarquez aussi qu'à la ligne 24, on utilise la chaîne de caractères "//"
pour indiquer que ce sont des commentaires qui suivent. Ainsi
Java n'essaiera pas de compiler/exécuter la fin de la ligne.
question(); ?>Compilez
TP2.java puis exécutez le programme.
question(); ?>Qu'est-ce qui est dessiné par le programme ?
En vous inspirant de la façon dont la couleur rouge a été créée,
question(); ?>définissez une couleur grise,
que vous stockez dans une variable appelée gris.
Utilisez-la pour recolorer le toit en gris :
question(); ?>quelle(s) ligne(s) ajoutez-vous ou modifiez-vous
dans le programme pour faire cela ? Testez-le pour vérifier que ça fonctionne.
question(); ?>Où se trouve le point de coordonnées (0,0) dans
la fenêtre créée par le programme ? En haut à gauche, en haut à droite, en bas à gauche,
en bas à droite, ou au milieu ?
question(); ?>Comment avez-vous fait pour répondre
à cette question ?
Dans les questions qui suivent, il sera utile de reproduire le dessin sur un papier
et y indiquer les coordonnées de quelques points de référence : cela vous aidera à
ajouter les éléments suivants au dessin.
question(); ?>Modifiez le programme pour que les murs de la maison soient blancs
(attention, ils ne doivent pas être transparents, l'intérieur des murs doit être entièrement blanc).
question(); ?>Ajoutez un sol vert au premier plan.
question(); ?>Ajoutez un ciel bleu clair à l'arrière plan.
question(); ?>Copiez le code obtenu pour l'algorithme paint
vers l'intérieur du fichier "VotreNom".txt.
Question bonus (quand vous aurez fini la partie D ci-dessous) :
question(); ?>écrivez un nouvel algorithme remplitRectangle
qui prend les mêmes entrées que dessineRectanglePlein, avec une variable d'entrée supplémentaire
couleurInterieur de type Color. Cet algorithme dessinera un rectangle plein
dont la couleur de la bordure est couleur, et dont la couleur de l'intérieur est couleurInterieur.
Cet algorithme ne doit faire appel qu'aux algorithmes
dessineRectangle
et
couleurRGB : il faut donc trouver une stratégie pour remplir
un rectangle en le couvrant de plusieurs rectangles vides.
Dans la suite, si vous avez un nom (ou un prénom) de plus de 10 caractères, utilisez
la valeur 10 quand on évoque la longueur de votre nom (ou de votre prénom).
Vous allez maintenant effacer l'intérieur de l'algorithme
paint et y écrire
un code permettant d'afficher un échiquier contenant autant de lignes et de colonnes
que le nombre de lettres de votre prénom, et dont chaque case (avec une alternance
cases noires, cases blanches, comme sur un échiquier) fait autant de pixels de côté
qu'il y a de lettres dans votre nom.
Pour cela,
question(); ?>commencez par dessiner une
case blanche à côté d'une case noire, aux dimensions voulues.
question(); ?>Utilisez ensuite une boucle et
une variable compteur pour
dessiner une ligne de cases noires et blanches alternées, avec le nombre
voulu de cases dans la ligne.
Astuce : vous pouvez utiliser le test de parité, à programmer à l'aide de
l'opération "reste modulo" ("%" en Java).
question(); ?>Utilisez une autre boucle (et un autre
compteur ? ou bien un nouvel algorithme ?) pour dessiner l'ensemble des lignes de l'échiquier demandé.
Attention, l'alternance des couleurs noir/blanc doit aussi être respectée
verticalement.