Les boucles



--Téléchargez Les boucles en PDF --


Les boucles

La boucle fait partie des grandes structures de base de l’algorithmique. Passé ce chapitre, tout le reste n’est qu’une dérivation de ces différentes structures de base. La boucle, dite aussi structure itérative ou structure répétitive, est une séquence d’instructions destinées à être exécutée plusieurs fois.

Il existe deux types de boucles :la boucle qui va répéter le bloc d’instructions un nombre fixe de fois (n fois) et la boucle qui va se répéter indéfiniment tant que la condition de sortie de boucle n’est pas atteinte.

But d’une boucle

Prenons le cas d’une saisie au clavier (une lecture), où par exemple, le programme pose une question à laquelle l’utilisateur doit répondre par O (Oui) ou N (Non). Mais tôt ou tard, l’utilisateur, facétieux ou maladroit, risque de taper autre chose que la réponse attendue. Dès lors, le programme peut planter soit par une erreur d’exécution (parce que le type de réponse ne correspond pas au type de la variable attendu) soit par une erreur fonctionnelle (il se déroule normalement jusqu’au bout, mais en produisant des résultats fantaisistes).

Alors, dans tout programme un tant soit peu sérieux, on met en place ce qu’on appelle un contrôle de saisie, afin de vérifier que les données entrées au clavier correspondent bien à celles attendues par l’algorithme.

A vue de nez, on pourrait essayer avec un SI. Voyons voir ce que ça donne :

C’est impeccable. Du moins tant que l’utilisateur a le bon goût de ne se tromper qu’une seule fois, et d’entrer une valeur correcte à la deuxième demande. Si l’on veut également bétonner en cas de deuxième erreur, il faudrait rajouter un SI. Et ainsi de suite, on peut rajouter des centaines de SI, et écrire un algorithme aussi lourd qu’une blague des Grosses Têtes, on n’en sortira pas, il y aura toujours moyen qu’un acharné flanque le programme par terre.

La solution consistant à aligner des SI… en pagaille est donc une impasse. La seule issue est donc de flanquer une structure de boucle qui répète la demande de saisie tant que l’utilisateur obstiné ne tape pas sur O ou N. Voyons ce type de boucle.

La boucle indéfinie, WHILE (TantQue)

En français, nous aurions dit : « Tant que l’utilisateur ne tape pas sur O ou N, on répète la demande ». En algorithmique, on dit pareil !

La structure de la boucle indéfinie, ou boucle while, est la suivante :
La boucle while permet la répétition d’un bloc d’instructions tant que la condition vérifiée est vraie. Le booléen est une expression booléenne, qui peut être combinée grâce à vos connaissances du chapitre précédent. Si l’expression vérifiée est vraie, la boucle exécute le bloc d’instructions jusqu’au ENDWHILE. Ensuite il remonte au WHILE et un nouveau tour de boucle démarre.

Revenons à notre algorithme. Son principal défaut est de provoquer une erreur à chaque exécution. En effet, l’expression booléenne qui figure après le TantQue interroge la valeur de la variable Rep. Malheureusement, cette variable, si elle a été déclarée, n’a pas été affectée avant l’entrée dans la boucle. On teste donc une variable qui n’a pas de valeur, ce qui provoque une erreur et l’arrêt immédiat de l’exécution. Pour éviter ceci, on n’a pas le choix : il faut que la variable Rep ait déjà été affectée avant qu’on en arrive au premier tour de boucle. Pour cela, on peut faire une première lecture de Rep avant la boucle. Dans ce cas, celle-ci ne servira qu’en cas de mauvaise saisie lors de cette première lecture. L’algorithme devient alors :

Une autre possibilité, fréquemment employée, consiste à ne pas lire, mais à affecter arbitrairement la variable avant la boucle. Arbitrairement ? Pas tout à fait, puisque cette affectation doit avoir pour résultat de provoquer l’entrée obligatoire dans la boucle. L’affectation doit donc faire en sorte que le booléen soit mis à VRAI pour déclencher le premier tour de la boucle. Dans notre exemple, on peut donc affecter Rep avec n’importe quelle valeur, hormis « O » et « N » : car dans ce cas, l’exécution sauterait la boucle, et Rep ne serait pas du tout lue au clavier. Cela donnera par exemple :
Cette manière de procéder est à connaître, car elle est employée très fréquemment.

Il faut remarquer que les deux solutions (lecture initiale de Rep en dehors de la boucle ou affectation de Rep) rendent toutes deux l’algorithme satisfaisant, mais présentent une différence assez importante dans leur structure logique.

En effet, si l’on choisit d’effectuer une lecture préalable de Rep, la boucle ultérieure sera exécutée uniquement dans l’hypothèse d’une mauvaise saisie initiale. Si l’utilisateur saisit une valeur correcte à la première demande de Rep, l’algorithme passera sur la boucle sans entrer dedans.

En revanche, avec la deuxième solution (celle d’une affectation préalable de Rep), l’entrée de la boucle est forcée, et l’exécution de celle-ci, au moins une fois, est rendue obligatoire à chaque exécution du programme. Du point de vue de l’utilisateur, cette différence est tout à fait mineure ; et à la limite, il ne la remarquera même pas. Mais du point de vue du programmeur, il importe de bien comprendre que les cheminements des instructions ne seront pas les mêmes dans un cas et dans l’autre.

Bon, eh bien vous allez pouvoir faire de chouettes algorithmes, déjà rien qu’avec ça…

Exercices

Exercice 1

Écrire un algorithme qui demande à l’utilisateur un nombre compris entre 1 et 3 jusqu’à ce que la réponse convienne.

Exercice 2

Écrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la réponse convienne. En cas de réponse supérieure à 20, on fera apparaître un message : « Plus petit ! », et inversement, « Plus grand ! » si le nombre est inférieur à 10.

Exercice 3

Écrire un algorithme qui demande un nombre de départ, et qui ensuite affiche les dix nombres suivants. Par exemple, si l’utilisateur entre le nombre 17, le programme affichera les nombres de 18 à 27.

Exercice 4

Écrire un algorithme permettant de calculer la factorielle d’un nombre entier demandé à l’utilisateur.

Exercice 5

Écrire un algorithme qui permet d’élever un nombre X à la puissance N. N peut être positif, nul ou négatif. L’utilisation de math est interdite.

Exercice 6

Écrire un algorithme qui calcule la suite de Syracuse. La suite de Syracuse est une « aberration mathématique » se traduisant ainsi : pour tout nombre de départ, on effectuera le calcul 3x+1 si le nombre est impair, ou x/2 si le nombre est pair. On continue de calculer la suite de la même manière. On remarquera alors que la suite tendra toujours vers 1.

Exercice 7

Complétez l’exercice précédent en affichant la suite de Syracuse ainsi que les éléments suivants :

  • La hauteur maximale du vol (la valeur la plus grande de la suite) ;
  • La longueur du vol (le nombre d’éléments de la suite) ;
  • La longueur du vol en altitude (le nombre d’éléments au-dessus du nombre de départ)