LP
IMApp

Scripts
Clients

Leçon 04

Leçon 04 : Les boucles

Contenu :

Cette leçon présente les structures de contrôle itératives. Les boucles permettent de répéter des portions de code en fonction de certains critères.

Objectifs :

Maîtriser les concepts de code itératif, d'expression booléennes et de test. Savoir écrire des codes simples utilisant les structures de contrôle while, do-while et for. Etre capable de choisir la bonne forme itérative en fonction de la situation.

La forme while

Dans de nombreuses situations, l'utilisateur d'une application web doit saisir des informations (nom, email, login, mot de passe, etc.) et l'application doit alors vérifier les informations fournies. Supposons par exemple qu'on demande à l'utilisateur de chosir un identifiant pour son inscription sur un site web avec la constrainte suivante : l'identifiant doit être une chaîne d'au moins cinq caractères. Si l'utilisateur propose un identifiant qui ne respecte pas la contrainte, le programme lui demande d'en proposer un autre. On peut résumer la situation de la façon suivante :

  1. demander un identifiant à l'utilisateur
  2. tant que l'identifiant ne respecte pas la contrainte :
    • redemander un identifiant à l'utilisateur
  3. traîter l'identifiant de l'utilisateur
Pour écrire le code équivalent en JavaScript on utilise la forme while :
var identifiant = prompt( "Votre identifiant ?","");

while ( identifiant.length < 5 ) {
	identifiant = prompt( "Identifiant non valide, recommencez :","");
}

alert( "Votre identifiant est " + identifiant );
Le mot-clef while définit le début de la boucle. Il est immédiatement suivi du test entre parenthèses et enfin du corps de la boucle. La toute première expression qui est évaluée dans une boucle while est le test. Si le test est vrai on exécute le corps de la boucle, puis on revient au test. Si le test est faux, on quitte la boucle et on passe aux instructions qui suivent la boucle. Le test est une expression à valeurs booléennes identique à celle utilisée dans une forme if. Cette expression peut être aussi complexe que l'on veut. Par exemple, le code suivant teste si l'identifiant fourni par l'utilisateur est une chaîne d'au moins cinq et d'au plus dix caractères :
var identifiant = prompt( "Votre identifiant ?","");

while ( identifiant.length < 5 || identifiant.length > 10 ) {
	identifiant = prompt( "Identifiant non valide, recommencez :","");
}

alert( "Votre identifiant est " + identifiant );
Remarquez que dans le code précédent, la variable identifiant est déclarée à l'extérieur de la boucle, sinon elle ne serait pas visible après la boucle dans l'expression paramètre de la fonction alert !

Exercice 1

Ecrivez un code qui demande à l'utilisateur un prix en euros (un nombre) et qui affiche le prix équivalent en francs (le taux de conversion est : 1 euro = 6,55957 francs). Tant que l'utilisateur ne fournit pas un nombre, le programme lui demande d'entrer une nouvelle valeur. Le résultat de la conversion doit être un nombre à au plus deux décimales (pensez à utiliser les fonctions isNaN, Number et toFixed)

Exercice 2

Ecrivez un programme qui permet de jouer au jeu suivant : le programme tire un nombre au hasard compris entre 1 et 100, et le joueur doit le deviner. Le jeu se déroule de la façon suivante :
  1. le joueur propose un nombre
  2. si le nombre est :
    • égal au nombre à deviner, le jeu se termine et le programme affiche un message adéquat
    • plus petit que le nombre à deviner, le programme affiche "trop petit" dans une fenêtre et revient à l'étape 1
    • plus grand que le nombre à deviner, le programme affiche "trop grand" dans une fenêtre et revient à l'étape 1
Produisez une deuxième version du programme qui affiche dans la fenêtre finale le nombre total d'essais du joueur.
Il est possible d'utiliser pour ce jeu une stratégie très simple qui garantit qu'on puisse découvrir le nombre (compris entre 1 et 100) en au plus sept essais !

Exercice 3

Ecrivez un programme qui ouvre une porte après que l'utilisateur ait fourni un mot de passe. Le mot de passe est une chaîne de caractères donnée (et stockée dans une variable du programme). L'ouverture de la porte est simulée par l'affichage d'une fenêtre avec le message "la porte est ouverte". Tant que le mot de passe fourni est erroné, le programme le redemande et n'ouvre pas la porte. Lorsque le bon mot de passe est fourni, la porte s'ouvre. Produisez une deuxième version du programme qui maintenant n'autorise que trois essais pour donner le mot de passe correct.

Exercice 4

Ecrivez un programme qui demande à l'utilisateur un nombre compris entre 2 et 10, et qui affiche dans une fenêtre la table de multiplication de ce nombre. Par exemple, si l'utilisateur saisit le nombre 7, le programme affiche une fenêtre du genre Table Si le nombre fourni par l'utilisateur n'est pas compris entre 2 et 10, le programme affiche un message d'erreur et redemande un nombre, et ce jusqu'à ce que le nombre fourni soit correct.

La forme do-while

La forme while est la structure de contrôle itérative fondamentale. Elle permet d'écrire un code itératif quelconque. Cependant, il existe deux autres structures de contrôle itératives mieux adaptées à certaines situations. La première de ces structures est la forme do-while. Cette forme ressemble beaucoup à la forme while mais cette fois, le test se trouve en bas, après le corps de la boucle. On peut reprendre un des exemples précédents et utiliser un do-while à la place d'un while :

var identifiant;

do {
	identifiant = prompt( "Entrez un identifiant :","");
} while ( identifiant.length < 5 || identifiant.length > 10 );

alert( "Votre identifiant est " + identifiant );
A la différence avec un while, dans une forme do-while, le corps de la boucle est toujours exécuté au moins une fois au début.

Exercice 5

Ecrivez un programme qui permet à l'utilisateur de saisir une suite de nombres quelconques, et qui affiche à la fin de la saisie le nombre total de nombres saisis, la somme de ces nombres et la moyenne de ces nombres. Pour terminer la saisie, l'utilisateur doit saisir la chaîne de caractères "stop". Si l'utilisateur fournit une chaîne de caractères qui n'est ni un nombre ni la chaîne "stop", le programme le signale et demande une nouvelle valeur. Utilisez la forme do-while pour implémenter la boucle.

La forme for

Cette forme s'utilise principalement quand on dispose d'une variable d'itération. Par exemple, le code suivant affiche une série de fenêtres contenant les entiers successifs de 1 à 10 :

for ( var i = 1; i <= 10; i++ ) {
	alert( i );
}
La boucle for est formée de quatre parties :
  1. la déclaration/initialisation de la variable d'itération : c'est l'instruction var i = 1 de l'exemple précédent. Dans cette partie, on déclare et on initialise la variable qui va contrôler la boucle. Bien entendu, la valeur initiale de la variable d'itération peut être absolument quelconque
  2. le test : c'est l'expression i <= 10 de l'exemple précédent. Tant que le test est vrai, on itère (c'est à dire on effectue le corps de la boucle), dès que le test devient faux, on quitte la boucle. Bien entendu, le test de la boucle peut être une expression à valeurs booléennes absolument quelconque
  3. le corps de la boucle : c'est l'instruction alert( i ) de l'exemple précédent. Le corps de la boucle peut être aussi long et complexe que l'on veut, et contenir par exemple d'autres structures de contrôle (comme des boucles)
  4. la mise à jour de la variable d'itération : c'est l'instruction i++ de l'exemple précédent. Cette instruction est exécutée à la suite des instructions contenues dans le corps de la boucle, et ce après chaque itération ! Bien entendu, l'instruction de mise à jour de la variable d'itération peut être absolument quelconque. L'expression i++ est équivalente à l'instruction i = i + 1. L'opérateur ++ s'appelle l'opérateur de post-incrémentation
Dans l'exemple précédent, la variable d'itération i est déclarée dans la boucle et en conséquence, reste locale à cette boucle. Voici un nouvel exemple dans lequel la variable d'itération est déclarée à l'extérieur de la boucle et dont la valeur décroît :
var j;

for ( j = 7; j >= 1; j-- )
	alert( j );

alert( "La valeur finale de j est " + j );
Remarquez que dans le code précédent, on a omis les parenthèses autour du corps de la boucle puisque celui-ci n'est constitué que d'une seule instruction.

Exercice 6

Reprenez l'exercice 4, en utilisant cette fois une boucle for à la place de la boucle while.

Exercice 7

Ecrivez un programme qui demande à l'utilisateur un nombre, et qui affiche dans une fenêtre tous les diviseurs de ce nombre, y compris 1 et lui-même. Par exemple, si l'utilisateur fournit le nombre 30, le programme affiche la fenêtre suivante : Diviseurs Au début, le programme boucle tant que l'utilisateur n'a pas fourni une chaîne de caractères qui est un nombre strictement positif. Pour savoir si un nombre x est divisible par un nombre y, il faut vérifier que le reste de la division entière de x par y est égal à 0 à laide de l'opérateur %. Ainsi, si le test x % y == 0 est vrai, alors x est divisible par y.

Exercice 8

Un nombre entier supérieur à 1 est un nombre premier si et seulement si il n'est divisible que par 1 et par lui-même. En vous inspirant de l'exercice précédent, écrivez un code qui demande à l'utilisateur un nombre entier supérieur à 1, et qui dit dans une fenêtre si le nombre est premier ou non. Produisez ensuite une deuxième version du programme qui utilise une boucle while pour déterminer si le nombre est premier ou non. Dans cette deuxième version, la boucle se termine dès qu'on a déterminé que le nombre n'était pas premier.