Chapitre 9 — Exécution conditionnelle
Jusque là, dans tous les cas que nous avons vus, le code est exécuté lorsque le programme est lancé.
Très souvent, ce n'est pas cela que l'on veut faire.
On a besoin d'un moyen pour « faire
tourner » un bloc de code seulement si certaines
conditions existent. Ce besoin
est tellement fondamental pour les langages de programmation qu'ils en ont tous un, et beaucoup
d'entre eux (le
Pascal, le
C
ou le
C++ ,
le Java
et, bien sûr, le
BASIC, pour n'en citer
que quelques-uns) utilisent le même mot :
IF.
Exemple :
INPUT "Entrez votre score: " Score%
IF Score%>40 THEN PRINT "Vous êtes reçu !"
END
On remarquera le mot
THEN qui signifie alors.
Il faut comprendre :
Si la condition est remplie, alors
faire ceci ou cela.
La ligne 2 fait un test sur la variable Score% et l'instruction
PRINT n'est lancée que
si la condition est vérifiée comme vraie. On trouvera ci-dessous
une liste de toutes les comparaisons, mais comme on le voit, on s'est servi pour les construire
de bon sens et de mathématiques de base.
| Expression | est évaluée comme vraie si |
| A < B | A est plus petit que B |
| A <= B | A est inférieur ou égal à B |
| A = B | A égale B |
| A >= B | A est supérieur ou égal à B |
| A > B | A est plus grand que B |
| A <> B | A n'est pas égal à B |
Nous pouvons étendre notre programme de contrôle :
INPUT "Entrez votre score : " Score%
IF Score%>40 THEN PRINT "Vous êtes reçu !"
IF Score%=40 THEN PRINT "Reçu de justesse !"
IF Score%<40 THEN PRINT "Vous avez échoué !"
END
De plus, les variables A et B peuvent être des expressions en elles-mêmes :
IF MonAge%=VotreAge%+5 THEN PRINT "Je suis plus âgé"
Quand il est utilisé dans une expression comme celle qui précède, le signe égale [ = ] agit
comme une comparaison, et non comme une affectation, ce qui signifie qu'en fait aucune valeur ne sera modifiée
pendant ce test.
Il est parfaitement possible de tester également des chaînes. Dans ce cas, le test est fait sur
la valeur des caractères prise dans le tableau
ASCII,
comme cela a été mentionné dans le chapitre sur les chaînes. Lorsqu'il compare des chaînes, le
BASIC commence avec le premier
caractère de la première chaîne et le compare avec le premier caractère de la deuxième chaîne. S'ils sont
identiques, il testera le deuxième caractère des deux chaînes et ainsi de suite, jusqu'à ce qu'il puisse
prendre une décision. Voici quelques exemples :
IF "abc"="abc" PRINT "les deux sont identiques"
IF "abc"<"bcde" PRINT "a vient avant b"
IF "abc"<"abde" PRINT "c vient avant d"
IF "abc"<>"ABC" PRINT "les casses sont différentes"
IF "ABC"<"abc" PRINT "les capitales d'abord"
END
AND et OR
Tapez et lancez ce petit programme :
REM Quiz
INPUT "Londres est-elle capitale du Royaume-Uni";A$
IF A$="O" THEN PRINT "Correct"
IF A$="N" THEN PRINT "Faux"
END
La ligne 3 ci-dessus ne fonctionnerait que si l'utilisateur tapait la capitale
« O » (la lettre O). S'il tapait « ? »,
il ne découvrirait jamais combien il est malin. Pas très gentil. Il est possible de combiner plus d'une
condition en même temps en utilisant les mots-clés
AND et
OR.
Nous pouvons modifier les lignes 3 et 4 dans ce sens :
REM Quiz
INPUT "Londres est-elle capitale du Royaume-Uni";A$
IF A$="O" OR A$="o" THEN PRINT "Correct"
IF A$="N" OR A$="n" THEN PRINT "Faux"
END
C'est beaucoup plus utilisable.
Nous pouvons aussi ajouter un blocage pour les réponses incorrectes :
REM Quiz
INPUT "Londres est-elle capitale du Royaume-Uni";A$
IF A$="O" OR A$="o" THEN PRINT "Correct"
IF A$="N" OR A$="n" THEN PRINT "Faux"
IF A$<>"O" AND A$<>"o" \
\ AND A$<>"N" AND A$<>"n" \
\ THEN PRINT "Réponse non valide"
END
Habituellement, à ce point, on fournit une table de vérité
des diverses conditions :
| Table de vérité AND (et) |
| Quand A est | AND (et) B est | Résultat |
| Faux | Faux | Faux |
| Vrai | Faux | Faux |
| Faux | Vrai | Faux |
| Vrai | Vrai | Vrai |
| Table de vérité OR (ou) |
| Quand A est | OR (ou) B est | Résultat |
| Faux | Faux | Faux |
| Vrai | Faux | Vrai |
| Faux | Vrai | Vrai |
| Vrai | Vrai | Vrai |
En lisant la troisième ligne de la table AND, on voit que si A est faux et B est vrai,
le résultat global sera jugé faux. En fait, c'est du bon sens.
EOR
EOR
(c'est le délice des étudiants partout où cela se prononce comme le cri de l'âne dans
« Winnie l'Ourson ») signifie « Exclusive OR ».
Il effectuera le test d'une condition comme
OR
mais ne sera vrai que si un seul des deux tests est vrai, mais pas les deux.
Peut-être une table de vérité expliquera-t-elle mieux cela :
| Table de vérité EOR (ou exclusif) |
| Quand A est | EOR (ou exclusif) B est | Résultat |
| Faux | Faux | Faux |
| Vrai | Faux | Vrai |
| Faux | Vrai | Vrai |
| Vrai | Vrai | Faux |
NOT
NOT
est un autre mot qui peut être utilisée dans les comparaisons. À la différence de
ANDAND,
OR et
EOREOR,
il n'est pas utilisé pour relier des instructions mais il transforme simplement une condition en condition
négative. Comme exemple, prenez le test de réponse négative à la fin de notre programme de
« Quiz » :
REM ...
IF A$="O" OR A$="o" THEN PRINT "Correct"
IF A$="N" OR A$="n" THEN PRINT "Faux"
IF A$<>"O" AND A$<>"o" \
\ AND A$<>"N" AND A$<>"n" \
\ THEN PRINT "Réponse non valide"
END
Comme la ligne 4 est un peu longue, nous décidons que toute réponse
qui n'est ni « O » ni « o » peut produire
le même message. La ligne 4 peut être réécrite et la ligne 3 ôtée :
IF NOT(A$="O" OR A$="o") THEN PRINT "Faux"
END
Il y a une grande variété de mots utilisables ici. Ne les mélangez pas : ils sont là pour servir
à rendre votre programme plus intelligible. Si vous avez l'impression que vos tests logiques vous donnent
une tête de linotte (ou de li-NOT, hé ! hé !), il y a probablement une meilleure façon de
les exprimer : essayez de faire une restructuration.
ELSE
Dans cet exemple, nous voulons définir une variable pour indiquer si l'utilisateur a réussi un test non.
La variable pourrait être utilisée dans des instructions
IF
dans tout le reste du programme. Nous pourrions faire ceci :
INPUT "Entrez votre score : " Score%
IF Score%>=40 THEN Reussi=1
IF Score%<40 THEN Reussi=0
END
Pourtant, il semble bien inefficace d'utiliser deux lignes qui s'excluent mutuellement. Dans ce cas,
IF
peut être combiné avec
ELSE.
INPUT "Entrez votre score : " Score%
IF Score%>=40 THEN Reussi=1 ELSE Reussi=0
END
Si Score%>=40, la première instruction est exécutée. Si elle est fausse, la deuxième
est exécutée. Ce n'est pas tellement différent de la langue française, somme toute, et dans le cas
où le niveau de réussite change, il n'y a qu'une ligne à modifier.
Le mot
THEN
n'est habituellement pas obligatoire dans des instructions
IF
sur une seule ligne (les instructions sur plusieurs lignes arrivent juste un peu plus bas), à la condition
que le sens soit clair :
IF Score%>=40 Reussi=1 ELSE Reussi=0
Instructions IF sur plusieurs lignes
« BB4W »
vous permet de répartir les instructions
IF
sur des lignes multiples. Par exemple, il est possible de faire quelque chose comme cela :
IF Salaire>1E6 THEN AchatYacht=1 : AchatVilla=1
Si Salaire est supérieur à 1 million (admettons qu'ici, on n'est pas en Turquie !), alors
les deux variables seront mises à 1. Si nous étions vraiment dans l'abondance, nous aurions
peut-être aussi envie d'acheter un hélicoptère. Si on ajoute des éléments à notre ligne, on court
le risque d'avoir des éléments qui deviennent illisibles parce qu'ils vont sortir de l'écran.
N'est-ce pas plus facile de le lire ainsi :
IF Salaire>1000000 THEN
AchatYacht=1
AchatVilla=1
AchatHelico=1
ENDIF
De cette façon, on peut lancer une grande quantité de codes conditionnels. Lorsque
THEN
est la dernière instruction sur une ligne (même une
REM n'est pas autorisée ici),
« BB4W » sait
qu'il va lui être soumis un
IF
à lignes multiples. La fin du bloc est signalée par l'instruction correspondante
ENDIF.
Ne mettez jamais d'espace dan
ENDIF.
D'autres formes de
BASICaccepteront
END IF comme deux mots séparés.
BBC BASIC
non. Il prendra le premier
END comme la fin du programme
et s'arrêtera net. L'éditeur repoussera vers l'intérieur (décalera) automatiquement des blocs comme celui-ci
pour qu'il soit plus facile de les lire. Si le « rentré » (le décalage) se fait
de travers, c'est un avertissement que quelque chose est erroné.
Vous pouvez aussi utiliser
ELSE
dans cette structure :
IF Salaire>1000000 THEN
AchatYacht=1
AchatVilla=1
AchatHelico=1
ELSE
PRINT "Du boulot, toujours plus de boulot"
ENDIF
Chaque instruction
IF
ne peut avoir qu'un seul
ENDIF
correspondant et un
ELSE,
mais ce dernier n'est pas obligatoire. Il est possible d'imbriquer les instructions :
IF Salaire>1000000 THEN
AchatYacht=1
IF TresDepensier=1 THEN
AchVilla=1
AchHelico=1
ENDIF
ELSE
PRINT "Du boulot, toujours plus de boulot"
ENDIF
Priorité des opérateurs
Il est possible de combiner les comparaisons avec les instructions
AND et
OR,
dans toute forme de combinaison permise par la logique, mais attention : l'interprétation par le
BASIC ne sera peut-être
pas la vôtre.
IF Pluie=1 OR Neige=1 AND Bottes=0 THEN
PRINT "Mets tes bottes"
ENDIF
Si nous remontons au tableau de priorité des opérateurs dans le Chapitre 5, nous voyons que
AND
a la priorité sur
OR.
La ligne sera interprétée comme ceci :
IF Pluie=1 OR (Neige=1 AND Bottes=0) THEN
PRINT "Mets tes bottes"
ENDIF
S'il pleut, on vous dira toujours de prendre vos bottes, que vous les portiez ou non. Ce n'est
qu'en cas de neige ou si vous n'avez pas de bottes qu'on vous demandera de les mettre. Quand vous êtes
dans le doute, utilisez des parenthèses :
IF (Pluie=1 OR Neige=1) AND Bottes=0 THEN
PRINT "Mets tes bottes"
ENDIF
TRUE et FALSE
Pour terminer cette section, je voudrais signaler que
BBC BASIC
a deux variables prédéfinies :
TRUE et
FALSE.
Elles ont en fait une valeur ; pour vous en rendre compte, passez en
Mode direct (immédiat) tapez :
PRINT TRUE, FALSE
On dirait qu'elles ne paraissent pas très utiles, mais elles sont formidables pour tester
des situations de « oui / non » et pour rendre un programme plus lisible.
REM Utilisation de TRUE / FALSE
INPUT "Entrez votre mot de passe " MotPasse$
IF MotPasse$="Super" THEN
Superviseur%=TRUE
ELSE
Superviseur%=FALSE
ENDIF
IF Superviseur% THEN
REM Voir l'écran de configuration principal
PRINT "Bienvenue, maître"
ELSE
REM Voir l'écran d'un utilisateur ordinaire
PRINT "Que voulez-vous faire ?"
ENDIF
END
La variable utilisée pour tester la situation vraie ou fausse est souvent appelée un drapeau (ou
« flag »). Si ce programme était beaucoup plus gros, nous pourrions utiliser
le drapeau de façon répétée plutôt que de refaire la même comparaison. De cette façon, lorsque le mot de passe
change, nous n'avons à changer qu'une seule ligne de code, et non de nombreuses lignes. Regardez la ligne 8.
Ceci est équivalent à :
IF Superviseur%=TRUE ...
mais le
BASIC est assez intelligent
pour insérer le
=TRUE
implicite à notre place quand il fonctionne, rendant ainsi à nouveau le code plus lisible.
Si vous vouliez tester la condition inverse, il vous faudrait toujours mettre :
IF Superviseur%=FALSE ...
ou bien
IF NOT Superviseur% ...
Un truc : Pour désactiver un bloc de code
|
Toute expression avec
IF
est évaluée jusqu'à ce qu'elle renvoie
TRUE ou
FALSE.
Pour désactiver du code pendant les tests, nous pouvons l'insérer dans un bloc, comme suit :
REM Code divers
IF FALSE THEN
CLS
PRINT "Écrans de présentation"
ENDIF
REM Reste du code
IF
recherche une condition vraie.
FALSE,
par définition, n'est jamais vrai, par conséquent le code ne sera jamais lancé.
|
Exercice
09.1
Voici un échantillon de la sortie de deux lancements d'un programme qui agit comme une simple
calculatrice :
Entrez le premier nombre : 5
Entrez le second nombre : 6
Tapez 1 pour additioner ; 2 pour soustraire : 1
5 + 6 = 11
>RUN
Entrez le premier nombre : 45
Entrez le second nombre : 55
Tapez 1 pour additioner ; 2 pour soustraire : 2
45 - 55 = -10
>
Pouvez-vous écrire le programme qui produit l'écran ci-dessus ? Introduisez un
INPUT pour chaque nombre, un
INPUT pour les opérations.
Utilisez
IF
pour choisir l'instruction
PRINT correcte pour afficher
le résultat. Vous aurez des points en plus si vous élargissez le programme pour y inclure la multiplication
et la division.
Fin du Chapitre 9
|