![[LOGO]](css/UGE.png) |
Boucles et fonctions en Javascript |
Comme pour les TPs précédents, on vous demande de créer un
répertoire tp5 qui contiendra les exercices de cette feuille de TP et de
faire un compte rendu de TP en HTML.
Exercice 1 : Affichage de formes dans la console
On cherche à afficher des formes simples dans la console.
- Recopiez la page Web exo1.html dans votre répertoire tp5.
- On souhaite afficher des croix qui formeront un triangle rectangle isocèle.
La fonction triangleRectangle(n) doit permettre d'afficher un tel triangle de côté n.
Par exemple, triangleRectangle(4) permet d'afficher les lignes
.
..
...
....
Remplir le corps de la fonction triangleRectangle de manière adéquate puis la tester avec plusieurs valeurs de n.
- On souhaite maintenant disposer d'un triangle isocèle dont l'axe de symétrie est vertical.
La fonction triangleIsocèle(n) doit permettre d'afficher un tel triangle de hauteur n et de base 2n-1.
Par exemple, triangleIsocèle(4) permet d'afficher les lignes
.
...
.....
.......
Remplir le corps de la fonction triangleIsocèle de manière adéquate puis la tester avec plusieurs valeurs de n.
- On souhaite ensuite disposer d'un rectangle.
La fonction rectangle(a,b) doit permettre d'afficher un tel rectangle de hauteur a et de largeur b, sans compter les cases occupées par les bords du rectangle.
Par exemple, rectangle(4,6) permet d'afficher les lignes
+------+
| |
| |
| |
| |
+------+
Remplir le corps de la fonction rectangle de manière adéquate puis la tester avec plusieurs valeurs de a et b.
- On souhaite enfin disposer d'un carré.
La fonction carré(n) doit permettre d'afficher un tel carré de côté n, sans compter les cases occupées par les bords du carré.
Par exemple, carré(4) permet d'afficher les lignes
+----+
| |
| |
| |
| |
+----+
Remplir le corps de la fonction carré de manière adéquate puis la tester avec plusieurs valeurs de n.
- Le corps de la fonction carré doit prendre au plus une ligne, facile à lire et à comprendre.
Si ce n'est pas le cas, commentez votre code et réécrivez la fonction carré de sorte à satisfaire cette nouvelle contrainte.
-
Dernière mission : on souhaite écrire une variante de la fonction rectangle en utilisant des fonctions ad hoc plutôt que console.log ; cette variante s'appellera rectangle2.
Les fonctions que l'on utilisera, et qui ont été créées uniquement pour les besoins de ce TP, sont :
- print(s), qui permet d'afficher un seul caractère (stocké dans une chaîne de caractères s) dans la console et ne revient pas à la ligne ;
- newLine(), qui permet de revenir à la ligne ;
On n'oubliera pas de revenir à la ligne après avoir affiché la ligne du bas du rectangle.
Attention ! Donner comme argument à la fonction print une chaîne de caractères contenant autre chose qu'un unique caractère déclenchera une erreur.
Attention ! Tenter d'appeler directement la fonction console.log() déclenchera une erreur.
Exercice 2 : Le lièvre et la tortue
Le lièvre et la tortue font la course : la tortue avance souvent, mais peu à chaque fois, tandis que le lièvre avance rarement, mais beaucoup à chaque fois.
On souhaite modéliser leur course en utilisant un
dé à 20 faces :
- On lance le dé, et on note n son résultat ;
- Si n vaut 14 ou moins, c'est la tortue qui avance de n ;
- Si, au contraire, n vaut 15 ou plus, c'est le lièvre qui avance de n.
Le premier qui franchit la ligne d'arrivée a gagné le droit de voir son histoire immortalisée dans une fable de La Fontaine.
- Recopiez la page Web exo2.html dans votre répertoire tp5.
-
Écrire une fonction uniforme(borne) qui prend en argument un entier borne strictement positif et renvoie un entier choisi uniformément au hasard parmi 1, 2, …, borne.
-
Écrire une fonction étape() qui simule un lancer de dé et son effet sur les positions du lièvre et de la tortue :
- elle lance le dé pour obtenir un entier n entre 1 et 20 ;
- elle renvoie un tableau résultat de taille 2, tel que résultat[0] soit l'avancée du lièvre et résultat[1] soit l'avancée de la tortue juste après le lancer de dé :
ainsi, résultat vaut [0,n] si n vaut 14 ou moins, et [n,0] si n vaut 15 ou plus
-
Écrire une fonction course(l) qui simule une course de longueur l entre le lièvre et la tortue, et renvoie "lièvre" si le lièvre a gagné la course, ou "tortue" si la tortue a gagné la course.
-
Organiser 10000 courses de longueur 5000. Parmi le lièvre et la tortue, y en a-t-il un qui semble gagner beaucoup plus souvent que l'autre ?
Pour les amateurs de mathématiques : comment aurait-on pu, ne serait-ce qu'intuitivement, prévoir un tel résultat ?
Exercice 3 : Seuls ceux qui passent les tests compteront !
Cet exercice est l'occasion d'écrire des fonctions qui prennent d'autres fonctions en argument, et/ou qui renvoient une fonction.
Comme d'habitude, on n'oubliera pas de tester chacune des fonctions que l'on aura écrites.
- Recopiez la page Web exo3.html dans votre répertoire tp5.
-
Écrire une fonction estPair qui, étant donné un entier k, renvoie true si k est pair, et false sinon.
-
Écrire une fonction estCarré qui, étant donné un entier k, renvoie true si k est un carré parfait, et false sinon.
-
Écrire une fonction comptePairs qui, étant donné un entier n strictement positif, énumère les entiers de 1 à n, compte combien d'entre eux sont pairs, et renvoie le résultat de son décompte.
-
Écrire une fonction compteCarrés qui, étant donné un entier n strictement positif, énumère les entiers de 1 à n, compte combien d'entre eux sont des carrés parfaits, et renvoie le résultat de son décompte.
Ci-dessus, on a écrit deux fois la même chose, à ceci près qu'on a décompté les entiers pairs dans notre première fonction, et les carrés parfaits dans notre deuxième fonction.
Comme
la duplication de code est une erreur critique en programmation, il faut revoir les choses.
On va donc réécrire de manière plus professionnelle les fonctions
comptePairs et
comptePairs, en créant une fonction
compte qui prend un argument
test et dont le comportement sera le suivant :
- L'argument test sera une fonction qui, à chaque entier k, associe un booléen (c'est-à-dire true ou false) ; les fonctions estPair et estCarré sont deux exemples de telles fonctions.
- Le résultat de compte(test) devra être une fonction qui, étant donné un entier n strictement positif, énumère les entiers de 1 à n, compte combien d'entre eux ont été associés au booléen true par la fonction test, et renvoie le résultat de son décompte ;
par exemple, la fonction comptePairs peut désormais se réécrire const comptePairs2 = compte(estPair).
- Comment écrire la fonction compteCarrés2, qui fait la même chose que compteCarrés, à partir des fonctions test et estCarré ?
Cette réécriture est censée prendre une seule ligne de code.
- Écrire la fonction compte.
Bien vérifier que les fonctions comptePairs2 et compteCarrés2 réécrites à partir de la fonction compte se comportent comme les fonctions comptePairs et compteCarrés.
- Écrire, en une seule ligne de code, une fonction compte1mod3 qui, étant donné un entier n strictement positif, énumère les entiers de 1 à n, compte combien d'entre eux sont congrus à 1 modulo 3, et renvoie le résultat de son décompte.
© Université Gustave Eiffel