-Les tests conditionnels et les boucles-

Lors des 3 dernières rubriques nous avons vu la base des programmes. Nous nous attaquerons cette fois ci au cœur de tout programme : les tests et les boucles.

Le test conditionnel IF..THEN…ELSE…END

Généralités :

Il permet de comparer des nombres ou d’autres objets entre eux. Sa syntaxe est :
IF (test) THEN (clause a effectuer si le test est vrai) ELSE (clause à effectuer si le test est Faux) END.

Exemple : IF A B = = THEN A B + ELSE A B * END.

Si la valeur contenue dans A est égale à B, alors on additionne A à B. Si c’est faux alors on multiplie A par B.
Il faut noter que la clause ELSE n’est pas indispensable. La syntaxe devient alors :
IF
(test) THEN (clause a effectuer si le test est vrai) END.
Dans ce cas, si le test s’avère être faux, le programme continuera son exécution après l’instruction END.

Exemple : IF A B < THEN A B / END

Dans ce cas si la valeur contenue dans A est inférieure a celle contenue dans B, le programme divise A par B. sinon il ne fait rien.

Approfondissements :

En fait la fonction IF ne sait lire que 2 types d’arguments : le 1 et le 0. Le 1 représente un vrai et le 0 un faux. C’est la fonction de comparaison qui fournit le 1 ou le 0. On peut donc mettre la fonction de comparaison Avant la fonction IF.

Exemple : A B > IF THEN A 2 * ELSE A B + END

Le test A B > va fournir un chiffre (o ou 1 ) dans le niveau 1 de la pile. Ensuite IF prends ce chiffre et décide de faire exécuter le ou les instruction(s) après le THEN ou le ELSE.

Ce n’est donc pas la fonction IF qui limite les types d’objets que l’on peut comparer, mais les fonctions de comparaisons. Les opérateurs mathématiques (= = ; différent ; < ; > ; >= ; <= ; AND, OR ; XOR) permettent de comparer 2 chaînes de caractères entre elles, mais pas 2 égalités. Nous verrons un peu plus bas quels sont les différents opérateurs de comparaisons les plus utilisés.

Les Tests CASE…THEN….END…END

Généralités :

L’instruction CASE est en tout point semblable a l’instruction IF. Lorsque que l’on veut faire plusieurs test en cascades, il est plus simple d’utiliser cette instruction. Elle s’utilise de cette façon :

CASE (1er test) THEN (Clause si le premier test est vrai ) END
( 2nd test) THEN (Clause si le second test est faux) END
(3ieme test) THEN (Clause si le troisième test est vrai) END
(nieme test) THEN (clause si le nieme test est vrai) END
ELSE
(Clause si tous les tests sont faux) END.

Cette instruction permet donc d’éviter les répétitions de l’instruction IF.

Exemple :

CASE A B = = THEN A B + END
A B < THEN A B - END
A 2 * B > THEN A B * END
ELSE A B / END.

Dans notre exemple, Si A+B alors on additionne A à B. Si A est inférieur à B on soustrait A à B. Si 2*A est supérieur a B alors on multiplie A par B. Maintenant si aucune de ces clauses est vrai, on divise A par B.

Approfondissements :

Cette fonction se comporte exactement de la même façon que la fonction IF. Les contraintes et les astuces propres à IF sont également applicables a CASE. ON peut noter que la fonction ELSE n’est pas obligatoire tout comme dans la fonction IF. La syntaxe va donc ressembler à ceci :

CASE A B = = THEN A B + END
A B < THEN A B - END
A 2 * B > THEN A B * END END.

NB : Il faut toujours finir cette fonction par deux END.

La fonction IFERR

Cette fonction permet d’intercepter des erreurs lors de l’exécution d’un programme. En temps normal si le programme génère une erreur, celui ci stoppe immédiatement son exécution. Avec la fonction IFERR, s’il détecte une erreur, il exécute les instructions se trouvant après l’instruction THEN.
Sa syntaxe est :
IFERR (bout du programme pouvant générer une erreur) THEN (Clause à effectuer si on rencontre une erreur) END.

Les opérateurs de comparaisons

L’instruction == (égal) :

Elle compare 2 arguments entre eux. S’ils sont égaux (nombres) ou identiques (chaînes de caractères) elle renvoie 1 dans le niveau 1 de la pile. S’ils sont différents elle renvoie 0.

Elle peut comparer des réels, des complexes, des binaires, des listes, des tableaux, des vecteurs, des programmes, des unités…..

La seule chose quelle ne peut pas comparer, c’est des expressions mathématiques littérales comme : ‘A*B’ et ‘E*2’. Pour savoir si ces 2 expressions sont les mêmes comme ‘A*B’ et un autre ‘A*B, il faut utiliser l’instruction SAME.

L’instruction différent (notée <> ici):

Elle compare 2 arguments et donne 1 s’ils sont différents et 0 s’ils sont égaux. Les restrictions et possibilités sont les mêmes que pour l’instruction ==.

Les Instructions < (Inférieur), <= (inférieur ou égal), > (supérieur), >=(supérieur ou égal) :

Idem que les fonctions = = et < > au niveau des restrictions.

La fonction AND :

Cette fonction est un opérateur Booléen. Il s’appelle le ET logique. Par exemple :
IF A 2 > B < 5 AND THEN signifie : Si A est supérieur a 2 ET B inférieur à 5. Alors…..
C’est un peu le principe si la première porte est ouverte ET la seconde porte est ouverte, alors je peux passer ….
On peut mettre autant de AND que l’on souhaite.

La fonction OR :

Cette fonction est aussi un opérateur Booléen. Il s’appelle le OU logique. Par exemple :
IF A 2 > B 5 < OR THEN… signifie : Si A est supérieur a 2 OU B inférieur à 5. Alors…..
Il représente le principe de Si la première porte est ouverte OU la seconde porte est ouverte….. On peut aussi mettre autant de Or que l’on veut.

La fonction NOT :

C’est encore un opérateur Booléen. Il s’appelle le NON logique. Par exemple en supposant que la variable contienne le nombre 1 ou 0 suite a un test précédent :
IF A NOT THEN ….
Si A contenait 1 alors NOT donne 0 et le test est faux. Par contre si A contenait 0, NOT donne 1 et le test devient vrai.

Voilà, il existe bien sur d’autres opérateurs de comparaisons, mais ceux sont ceux les plus importants. Les autres interviennent que très rarement voir même jamais dans un programme pas très complexe.

Un exemple de petit jeu :

Nous allons réaliser un petit jeu de devinette. La HP tire un nombre entre 1 et 1000 et l’on doit le deviner le plus rapidement possible. Elle ne donne comme indication que s’il est plus grand ou plus petit que celui que l’on a entrer. Nous sommes donc amener a introduire la notion de boucles indéterminées. En effet on ne peut pas savoir a l’avance combien de coups le joueur va mettre pour deviner le nombre.

Les boucles indéterminées DO..UNTIL..END :

Sa syntaxe est :

DO (clause de boucle) UNTIL (test) END

En fait tant que le test compris entre le UNTIL et le END est faux, la machine exécute les instruction situées entre le DO et le UNTIL. Si maintenant ce test est vrai, le programme reprend après l’instruction END. Ces boucles sont dites indéterminées, car elle ne s’exécute pas un nombre de fois défini. Tant que le test est faux, la boucle recommence.

Moteur du programme :

En fait le programme va en premier : Tirer un nombre au hasard, mettre a 0 le compteur de coups.
Ensuite le programme sera compose d’une boucle indéterminée qui ne s’arrêtera que lorsque le joueur aura trouver le bon nombre.
A l’intérieur de cette boucle, 2 tests : Un pour déterminer si le nombre est plus grand, un autre pour déterminer si le nombre est plus petit. En fait c’est le test de boucle qui " verra " si le nombre est égal, dans ce cas il sort de la boucle.

L’architecture du programme va donc ressembler a cela :
<< (Tirage du nombre) (Mise a 0 du compteur) DO (Saisie du nombre par le joueur) (1er test : est t’il plus grand ?, si oui on affiche plus grand) (second test : est t’il plus petit ? si oui on affiche plus petit) UNTIL (test : est t’il egal ?) END (on affiche gagner et le nombre de coups réalisés par le joueur) >>
Nous avons vu il y a 2 tests a faire, mais on ne teste pas si le nombre est égal a celui tiré par la machine. Pourquoi cela ? En fait cela n’est pas nécessaire car si le nombre est a la fois ni plus grand ni plus petit que celui que l’on a entrer, c’est qu’il est égal. De toute façon ce test doit OBLIGATOIREMENT ce faire à la fin de la boucle. Cela ne sert donc a rien de le mettre en plus dans la boucle. Il y a 2 tests, au lieu de faire 2 instructions If il est plus habile de faire une instruction CASE faisant les 2 tests.

Le listing commenté :

<< RAND 1000 * 1 + IP ‘NB’ STO 0 ‘C’ STO DO 1 ‘C’ STO+ "Entrer un nombre" " " INPUT OBJ-> ‘N’ STO CASE N NB > THEN CLLCD "Le nombre est
plus petit " 1 DISP 0 WAIT DROP END N NB < THEN CLLCD "Le nombre est
plus grand " 1 DISP 0 WAIT DROP END END UNTIL NB N = = END CLLCD "Bravo gagner en : " 1 DISP C 2 DISP " Coups " 3 DISP 0 WAIT >>

Voilà donc notre programme décortiqué ligne par ligne.

RAND 1000 * 1 + IP ‘NB’ STO On tire un nombre, on prend sa partie entiere et on le stocke dans la variable NB
0 ‘C’ STO On met a 0 le compteur C
DO Début de la boucle
1 ‘C’ STO+ On ajoute 1 au compteur C. C’est un raccourci de la séquence : C 1 + ‘C’ STO
"Entrer un nombre" " " INPUT OBJ-> ‘N’ STO On demande au joueur d’entrer un nombre. On le stocke ensuite dans la variable N.
CASE On débute nos tests.
N NB > On regarde si NB est plus grand que N.
THEN CLLCD "Le nombre est plus petit " 1 DISP 0 WAIT DROP END Si oui, on vide l’affichage avec CLLCD, on affiche le texte a la première ligne d’affichage. On attends ensuite que l’utilisateur presse une touche. On efface ensuite le numéro de la touche qui se trouve dans le niveau 1 de la pile.
N NB < On regarde si le nombre est plus petit.
THEN CLLCD "Le nombre est plus grand " 1 DISP 0 WAIT DROP END END Si oui, on vide l’affichage avec CLLCD, on affiche le texte a la première ligne d’affichage. On attends ensuite que l’utilisateur presse une touche. On efface ensuite le numéro de la touche qui se trouve dans le niveau 1 de la pile.
END On termine l’instruction CASE
UNTIL NB N = = END On termine la boucle avec le test : le nombre est-il le même ?
CLLCD "Bravo gagner en : " 1 DISP C 2 DISP " Coups " 3 DISP 0 WAIT En sortant de la boucle on est sur que le joueur a gagner. Donc on fait afficher le nombre de coups que le joueur a mis pour trouver la bonne réponse.

Voici les différentes captures d'écran que génère le programme :

Dans le prochain numéro, nous verrons les différentes boucles qu’il est possible de faire avec le RPL. Bonne programmation ! Si vous avez des questions quelconques sur le RPL écrivez moi par e-mail.

LAFONT Cyril - e-mail : cyril.lafont@hol.fr