-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 cur 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 dautres 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 cest faux alors on multiplie A par B.
Il faut noter que la clause ELSE nest pas indispensable. La syntaxe devient alors :
IF (test) THEN (clause a effectuer si le test est vrai) END.
Dans ce cas, si le test savère être faux, le programme continuera son exécution après linstruction END.
Exemple : IF A B < THEN A B / ENDDans 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 darguments : le 1 et le 0. Le 1 représente un vrai et le 0 un faux. Cest 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 nest donc pas la fonction IF qui limite les types dobjets que lon 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 :
Linstruction CASE est en tout point semblable a linstruction IF. Lorsque que lon veut faire plusieurs test en cascades, il est plus simple dutiliser cette instruction. Elle sutilise 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 linstruction 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 nest 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 dintercepter des erreurs lors de lexécution dun programme. En temps normal si le programme génère une erreur, celui ci stoppe immédiatement son exécution. Avec la fonction IFERR, sil détecte une erreur, il exécute les instructions se trouvant après linstruction 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
Linstruction == (égal) :
Elle compare 2 arguments entre eux. Sils sont égaux (nombres) ou identiques (chaînes de caractères) elle renvoie 1 dans le niveau 1 de la pile. Sils 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, cest 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 linstruction SAME.
Linstruction différent (notée <> ici):
Elle compare 2 arguments et donne 1 sils sont différents et 0 sils sont égaux. Les restrictions et possibilités sont les mêmes que pour linstruction ==.
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 sappelle 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 ..
Cest 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 lon souhaite.La fonction OR :
Cette fonction est aussi un opérateur Booléen. Il sappelle 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 lon veut.La fonction NOT :
Cest encore un opérateur Booléen. Il sappelle 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 dautres 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 lon doit le deviner le plus rapidement possible. Elle ne donne comme indication que sil est plus grand ou plus petit que celui que lon a entrer. Nous sommes donc amener a introduire la notion de boucles indéterminées. En effet on ne peut pas savoir a lavance 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 linstruction END. Ces boucles sont dites indéterminées, car elle ne sexé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 dune boucle indéterminée qui ne sarrêtera que lorsque le joueur aura trouver le bon nombre.
A linté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 cest le test de boucle qui " verra " si le nombre est égal, dans ce cas il sort de la boucle.Larchitecture 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 til plus grand ?, si oui on affiche plus grand) (second test : est til plus petit ? si oui on affiche plus petit) UNTIL (test : est til 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 nest pas nécessaire car si le nombre est a la fois ni plus grand ni plus petit que celui que lon a entrer, cest quil 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. Cest un raccourci de la séquence : C 1 + C STO |
"Entrer un nombre" " " INPUT OBJ-> N STO | On demande au joueur dentrer 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 laffichage avec CLLCD, on affiche le texte a la première ligne daffichage. On attends ensuite que lutilisateur 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 laffichage avec CLLCD, on affiche le texte a la première ligne daffichage. On attends ensuite que lutilisateur 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 linstruction 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 quil 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