Chapitre 12 — D'autres boucles : REPEAT et WHILE
REPEAT ... UNTIL
Notre petit programme de cercle vient de se reposer pendant quelque temps, aussi réveillons-le
et parlons des boucles conditionnelles. Dans l'état où nous l'avions abandonné, lorsque l'utilisateur
avait fini, il devait le relancer. Ce serait bien si le programme se mettait en boucle jusqu'à ce que
l'utilisateur en ait terminé avec lui. Une boucle
FOR
ne serait pas bonne ici, parce que nous ne savons pas combien de fois notre utilisateur voudrait
faire tourner le programme. Voilà où nous rencontrons notre première boucle conditionnelle :
REPEAT
UNTIL.
Comme d'habitude, voici un exemple que j'expliquerai ensuite :
REM Aire d'un cercle
REPEAT
INPUT "Entrez un rayon : " Rayon
Aire = PI*Rayon^2
PRINT "L'aire de votre cercle est ";Aire
INPUT "Recommencer ? O/N " Reponse$
UNTIL Reponse$="N"
END
Vous pouvez deviner qu'ici le programme continue sa boucle jusqu'à ce que l'utilisateur tape
« N ». La boucle commence à la ligne 2 :
REPEAT.
Il n'y a ici ni condition ni d'autres mots-clés, mais juste un seul mot.
« BB4W »
décale horizontalement tout le code qui suit et reconnaît
UNTIL
à la ligne 7 comme la fin de la boucle.
UNTIL
teste une condition de la même façon que le fait un
IF.
Si la condition est fausse, on retourne à la ligne 2 pour un autre tour. Si la condition est vraie,
la boucle se termine et l'exécution se poursuit à la ligne suivante. Tout le côté intelligent
tient dans la ligne
UNTIL :
REPEAT
ne fait que marquer le début de la boucle.
Si vous avez essayé le programme, vous aurez remarqué que nous avons retrouvé notre ancien
problème : on imagine que l'utilisateur tapera la capitale « N ».
Le test que fait
UNTIL
peut être aussi complexe que toute instruction
IF,
et il utilise exactement la même logique pour faire les calculs, aussi pouvons-nous changer la ligne 7
en :
UNTIL Reponse$="N" OR Reponse$="n"
...et tout ira à nouveau bien. Armés de notre nouveau savoir, nous pouvons, c'est sûr, apercevoir
un autre candidat pour
REPEAT.
La ligne 6 demande Reponse$ ; nous pouvons le tester jusqu'à ce que nous ayons
une réponse valide avant de continuer. Essayez-le vous-même tout d'abord, et puis, comparez les résultats.
REM Aire d'un cercle
REPEAT
INPUT "Entrez un rayon : " Rayon
Aire = PI*Rayon^2
PRINT "L'aire de votre cercle est ";Aire
REPEAT
INPUT "Recommencer ? O/N " Reponse$
UNTIL INSTR("OoNn",Reponse$)<>0
UNTIL INSTR("Nn",Reponse$)<>0
END
J'ai utilisé
INSTR
ici, mais vous auriez de la même façon pu utiliser :
Reponse$="O" OR Reponse$="o", etc.
Le problème principal rencontré pendant les boucles conditionnelles, c'est le syndrome de la boucle
sans fin : assurez-vous toujours de mettre une condition de sortie à l'intérieur de la boucle.
REM REPEAT sans fin
Fini = FALSE
REPEAT
PRINT "Ai-je oublié quelque chose ?"
UNTIL Fini
END
WHILE ... ENDWHILE
Les boucles
REPEAT
testent une condition à la fin de la boucle. Ceci signifie que le code situé dans le corps
de la boucle est toujours exécuté au moins une fois. Quelquefois, on ne le souhaite pas.
Une boucle
WHILE
teste une condition avant d'entrer dans la boucle et d'exécuter le code qui y est contenu.
D'une façon assez différente, le code n'est exécuté que si la condition de test est vraie, à l'opposé des boucles
REPEAT
qui exécutent le code alors que la condition de test est fausse. Regardez cela de près.
La fin de la boucle est signalée par
ENDWHILE,
et nous faisons l'avertissement habituel pour ne pas couper ce mot en deux.
Voici un programme qui commence à 1 et ne cesse de le diviser par deux jusqu'à ce que le
BASIC
fasse un arrondi à zéro, pour essayer de trouver le plus petit nombre que
« BB4W »
pourra accepter. Cela ne donne pas véritablement tout à fait le plus petit nombre, mais il en est tout près.
REM Plus petit nombre en utilisant WHILE
Nombre = 1
WHILE Nombre > 0
DerNombre = Nombre
Nombre = Nombre / 2
ENDWHILE
PRINT "La valeur du nombre est ";Nombre
PRINT "La valeur précédente était ";DerNombre
END
Un truc : Sortie des boucles
|
La boucle
FOR
est très tolérante en matière de test de la condition de sortie. Si vous dépassez la valeur finale, le
BASIC
ne sera pas gêné et il terminera la boucle comme vous vous y attendez. Ce n'est pas le cas avec
REPEAT
et
WHILE.
Regardez le code suivant :
REM Boucles sans fin
I%=1
REPEAT
I%+=2
PRINT I%
UNTIL I%=10
END
La boucle ne se finira jamais, parce que le
BASIC
cherche une correspondance exacte. Il vaut mieux, avec
REPEAT
et
WHILE
ne pas utiliser de valeurs précises à moins que vous ne soyez à 100 % sûr qu'elles peuvent être atteintes.
Ceci est tout particulièrement vrai dans le cas de nombres à virgule flottante. Pour corriger l'exemple,
remplacez « = » par
« >= » dans la ligne
UNTIL
et la rectification sera faite.
|
Exercices
12.1
Produisez un programme qui demande que vous entriez une chaîne et affichez le code
ASCII
du premier caractère. Faites-le continuer jusqu'à ce que la chaîne demandée soit vide ("").
12.2
Écrivez un programme qui demande l'entrée d'un nombre. Ajoutez ce nombre à un total courant
actualisé. Répétez ceci jusqu'à ce que le nombre entré soit égal à 0. Affichez le résultat.
Fin du Chapitre 12
|