
|
|
|
QBasic - Les boucles conditionnelles
|
Autre langage disponible pour cet article :
Rubrique : QBasic
lundi 25 mars 2002 18:44
|
Voir les commentaires pour QBasic - Les boucles conditionnelles
|
- La boucle FOR...NEXT
- La boucle DO...LOOP
- La boucle WHILE...WEND
- L'instruction EXIT
- Imbrication de boucles
- Un dernier point
Vous êtes maintenant encore plus en colère, car ce sort que le Marabou vous a conseillé ne fonctionne
absolument pas. Vous retournez le voir et celui-ci vous dit qu'il faut écrire 987245679137542 fois 'Il va t'
arriver malheur', pas une de plus, pas une de moins. Vous retournez chez vous, et regardez votre ordinateur. Comment faire ?
Nous allons utiliser ce qu'on appelle une boucle conditionnelle. Comme son nom le laisse indiquer, une boucle conditionnelle
ne s'exécute que sous certaines conditions. Il en existe plusieurs que nous allons étudier.
La boucle FOR...NEXT
Une boucle FOR...NEXT fonctionne un peu comme un Big-Mac (un Sandwich). Entre les deux
tranches de pain se trouvent les instructions que vous voulez répéter X fois. Voici la première ligne
d'une structure FOR...NEXT. C'est la partie FOR :
FOR UneVariable = 1 TO 987245679137542
Voici ce que l'on a écrit dans l'ordre. D'abord, le mot-clef FOR. Ensuite, le nom d'une variable numérique.
Ici, on l'a appelée 'UneVariable', mais on aurait très bien pu l'appeler 'Cheval' ou 'Peter'.
Vient ensuite le signe égal '='. Ca ne vous rappelle rien? Et oui, on va affecter à la variable spécifiée une
valeur. La première valeur sera 1 car c'est celle qu'on a spécifié. Mais si on avait écrit FOR UneVariable = 5 TO 987245679137542,
la première valeur aurait été 5.
Ensuite intervient le 'TO'. Le second chiffre, '987245679137542', est la limite supérieure à laquelle la boucle
s'arrêtera. C'est à dire que quand la variable 'UneVariable' sera égale à '987245679137542',
la boucle s'arrêtera.
Après cette ligne, on écrit les instructions à exécuter. Dans notre cas, il n'y en a qu'une seule :
PRINT "Il va t'arriver malheur !"
Pour finir, on place la tranche de mie de pain inferieure, c'est à dire le NEXT, suivi du nom de la variable :
NEXT UneVariable
Le programme complet doit donner :
FOR UneVariable = 1 TO 987245679137542 ' La boucle va se répéter 987245679137542 fois
PRINT "Il va t'arriver malheur !"
NEXT UneVariable ' On retourne au FOR
Cette fois-ci, le nombre de fois sera respecté. Vous pouvez quand même quitter avec CONTROL + PAUSE.
Avec FOR...NEXT, on peut également effectuer un décompte. Observez le programme suivant qui
réalise un compte à rebours de 10000 à 0 :
FOR I = 10000 TO 0 STEP -1 ' Compte à rebours de 10000 à 0 de 1 en 1
PRINT I
NEXT I
Vous remarquez que l'on a fait appel à un nouveau mot-clef : STEP. En Anglais, STEP
signifie PAS. En effet, dans une boucle FOR...NEXT, le PAS par défaut est de 1. Pour effectuer
un compte à rebours, il nous faut aller de -1 en -1.
La boucle FOR...NEXT peut s'avérer très utile en cas de structure répétitive. Elle peut aussi
servir à réaliser des temporisations, bien qu'il existe des possibilités plus efficaces.
Attention ! On pourrait penser qu'une boucle FOR...NEXT s'exécute, quoiqu'il arrive, le nombre de
fois spécifiées. Essayez donc ce petit exemple :
CLS
FOR i = 1 TO 10000
i = 10000
PRINT "Hello !"
NEXT i
On pourrait penser que le programme va écrire 10000 fois 'Hello !'. Et bien non. La boucle ne s'arrête non
pas au bout de 10000 fois, mais lorsque la variable i est égale à 10000. Comme on a affecté la valeur 10000 à i
avant d'entrer dans la boucle, la boucle ne s'exécute qu'une fois ! Ne riez pas, ce genre d'erreur arrive plus souvent que vous ne le croyez...
La boucle DO...LOOP
La boucle DO...LOOP est d'un tout autre ordre. Ici, il n'y a pas de compteur comme dans une
boucle FOR...NEXT. La seule analogie possible entre les deux, est que elle aussi est un Big-Mac.
Avant toute chose, essayez ce programme :
DO ' Tête de la boucle
INPUT "Quel âge avez vous ?", Age ' Instruction(s)
LOOP ' Queue de la boucle
Vous observez que le programme vous demande continuellement votre âge. Vous pouvez arrêter avec
CONTROL + PAUSE. Une autre façon de la stopper serait de compléter la boucle par une CONDITION.
Pour imposer une condition à une boucle DO...LOOP, il y a deux mots-clefs à connaître :
- UNTIL : en Anglais, signifie jusqu'à. On aurait pu écrire :
DO
INPUT "Quel âge avez vous ?", Age
LOOP UNTIL Age > 18 ' Faire une boucle JUSQU'À
PRINT "Vous êtes majeur" ' ce que Age soit SUPERIEUR à 18
Vous l'aurez certainement deviné, cette boucle se répéte jusqu'à ce que l'utilisateur
attribue à la variable 'Age', une valeur supérieure à 18 par l'intermédiaire de l'instruction 'INPUT'.
À la sortie de la boucle, l'ordinateur nous confirme notre Etat Civil.
- WHILE : en Anglais, signifie tant que. On aurait pu écrire :
DO
INPUT "Quel âge avez vous ?", Age
LOOP WHILE Age < 18 ' Faire une boucle TANT QUE
PRINT "Vous êtes majeur" ' Age est INFERIEUR à 18
Là aussi vous l'aurez deviné, la boucle se répéte tant que l'utilisateur attribue
à la variable 'Age' une valeur inférieure à 18 par l'intermédiaire de l'instruction 'INPUT'.
Ici aussi l'ordinateur nous confirme notre Etat Civil.
Ces deux exemples sont équivalents. C'est à vous d'utiliser UNTIL ou WHILE selon la situation. Ici, on aurait
plutôt utilisé UNTIL.
La condition imposée peut se positionner soit derrière DO, soit derrière LOOP. Cela influence
du tout au tout le comportement du programme. Observez :
Age = 35 ' On initialise préalablement
DO ' la variable Age à 35
INPUT "Quel âge avez vous ?", Age
LOOP UNTIL Age > 18
PRINT "Vous êtes majeur"
De toute évidence la boucle fonctionne normalement, la variable étant testée à la fin de la boucle.
Mais si on avait placé la condition après DO :
Age = 35 ' On initialise préalablement
DO UNTIL Age > 18 ' la variable Age à 35
INPUT "Quel âge avez vous ?", Age
LOOP
PRINT "Vous êtes majeur"
Ici, la variable est testée en début de boucle. Age étant supérieur à 18, la boucle est stoppée dès le
début, et les instructions ne sont pas exécutées. L'ordinateur passe directement aux instructions situées
après la boucle.
La boucle WHILE...WEND
La boucle WHILE...WEND a un comportement identique à la boucle DO...LOOP. Mais elle est très peu
utilisée et la boucle DO...LOOP lui est préférée.
Les raisons de son manque de popularité sont les suivantes :
- Seule la condition tant que est utilisable.
- La condition n'est positionnable qu'en tête de boucle
- Cette boucle ne supporte pas l'instruction
EXIT (voir ci-dessous)
Notre exemple précédent aurait pu s'écrire :
WHILE Age < 18 ' Tant que Age est inférieur à 18,
INPUT "Quel âge avez vous ?", Age ' la boucle s'exécute
WEND
PRINT "Vous êtes majeur"
Il semble que cette structure de boucle est été conservée dans QBasic pour assurer la compatibilité
de programme écrit dans des versions de BASIC antérieures.
L'instruction EXIT
L'instruction EXIT permet de sortir d'une boucle FOR...NEXT ou DO...LOOP. Pour une boucle
DO...LOOP, on utilisera EXIT DO et EXIT FOR pour une boucle FOR...NEXT. EXIT
doit forcement être utilisé à l'intérieur d'une boucle :
DO
PRINT "Nous allons utiliser l'instruction EXIT"
EXIT DO ' On sort de la boucle
PRINT "Ces lignes ne seront pas exécutées car on sort de la boucle"
LOOP
ou avec FOR...NEXT :
FOR i = 1 to 10000
PRINT "Nous utilisons l'instruction EXIT FOR"
EXIT FOR ' On sort de la boucle
PRINT "Ces lignes ne seront pas exécutées car on sort de la boucle"
NEXT i
Imbrication de boucles
Plusieurs boucles peuvent être imbriquées l'une dans l'autre, à la manière des poupées russes. Il
faut tout de même respecter une certaine logique. Le haut de la petite poupée ne s'emboîte pas avec
le base de la grande :
FOR i = 1 TO 10
FOR j = 1 TO 10
PRINT j; " fois "; i;" égal "; j * i
NEXT i
NEXT j
Ainsi l'exemple ci-dessus qui calcule les tables de multiplication de 1 à 10 ne fonctionnera pas car
on a permuté NEXT i et NEXT j. Si on exécute, l'erreur 'NEXT sans FOR' se produira. Après correction, cela donne :
FOR i = 1 TO 10
FOR j = 1 TO 10
PRINT j; " fois "; i;" égal "; j * i
NEXT j
NEXT i
De même, avec DO...LOOP :
FOR i = 1 TO 10
DO
PRINT "Personne N°"; i
INPUT "Quel âge avez vous ?", Age
NEXT i
LOOP UNTIL Age > 18
Ce programme est complétement faux. Là aussi, l'erreur 'NEXT sans FOR' se produit. Il faudrait écrire :
FOR i = 1 TO 10
DO
PRINT "Personne N°"; i
INPUT "Quel âge avez vous ?", Age
LOOP UNTIL Age > 18
NEXT i
Un dernier point
Vous aurez remarqué qu'à chaque fois, lorsque l'on a utilisé une boucle, on a observé un retrait de
2 caractères par rapport aux autres instructions. Ce n'est nullement obligatoire mais bien utile
pour distinguer chaque blocs du programme.
|
Voir les commentaires pour QBasic - Les boucles conditionnelles
|
|
|
|