Les conditions sont un concept simple et repris dans pratiquement (tous ?) les langages de programmation, et nous allons voir comment cela fonctionne en COBOL.
Paragraphe et booléen
Notion de paragraphe
L’utilisation de paragraphe peut être utile pour répéter certaines portions de code sans avoir à les copier/coller (comme une sorte d’include en PHP). Un paragraphe peut contenir des plages, des conditions, etc. En bref, un paragraphe est constitué d’une suite d’instructions diverses.
Tout ce passe encore une fois dans PROCEDURE DIVISION
, on va déclarer notre paragraphe :
mon-paragraphe.
* instruction 1.
* instruction 2.
* instruction 3.
* etc.
Comme vous le voyez, afin de définir le nom de notre paragraphe on va lui attribuer une étiquette qui va nous être utile au moment où on va vouloir réutiliser la portion de code.
Un paragraphe se termine toujours par un point !
Ensuite pour appeler notre paragraphe il suffit de faire ceci :
PERFORM mon-paragraphe.
Les booléens
Je ne vous en ai pas parlé plus tôt mais en Cobol, il est tout à fait possible d’utiliser des booléens, voici la manière de procéder :
Déclaration
DATA DIVISION.
77 note PIC 99v99.
88 parfait VALUE 20.
Décodons un peu ces quelques lignes, comme vous pouvez le constater j’ai créé une variable note qui est de type numérique avec 4 chiffres dont 2 décimales ; jusque là, rien de nouveau.
Si vous regardez la ligne du dessous, on a 88, c’est une convention pour déclarer nos booléens. S’ensuit le nom de notre booléen et la valeur qui fait que notre booléen soit à true
. Pour que parfait soit à true
il faut que la valeur de note soit de 20.
Étoffons un peu notre exemple comme ceci :
DATA DIVISION.
77 note PIC 99v99.
88 passable VALUE 10 THRU 11.99.
88 assez_bien VALUE 12 THRU 13.99.
88 bien VALUE 14 THRU 16.
88 parfait VALUE 20.
Ici, il y a une petite nouveauté avec le mot clef THRU : si on traduit la ligne 4 en français, cela signifie "Si la valeur de note va de 10 à 11,99 passable vaut true, sinon faux".
Vous l’aurez peut-être compris, mais toutes les déclarations de booléen après une variable sont rattachées à cette même variable. Dans notre exemple : passable, assez_bien, bien, parfait sont rattachées à la variable note.
Gardez cela dans un coin de votre tête, on va en avoir besoin très bientôt !
La base "if ... else"
Voici le code sur lequel on va se baser pour cette partie :
IDENTIFICATION DIVISION.
PROGRAM-ID. conditions.
DATA DIVISION.
77 val PIC 999.
SCREEN SECTION.
01 pla-titre.
02 BLANK SCREEN.
02 LINE 2 COL 25 VALUE "Superieur ou inferieur".
01 pla-sup.
02 LINE 6 COL 10 VALUE "La valeur de 'val' est superieur ou".
02 VALUE " egale a 100".
01 pla-inf.
02 LINE 6 COL 10 VALUE "La valeur de 'val' est inferieur a 100".
PROCEDURE DIVISION.
MOVE 50 TO val.
DISPLAY pla-titre.
* C'est dans ce bloc que l'on va placer nos conditions.
STOP RUN.
Les conditions n’ont rien de plus compliqué qu’ailleurs, la syntaxe se rapproche un peu des scripts Batch.
Exemple classique
IF val < 100 THEN
DISPLAY pla-inf
ELSE
DISPLAY pla-sup
END-IF.
Attention, vous voyez qu’il n’y a pas de point à l’intérieur de la condition ! C’est une erreur d’en mettre !
En effet, dans cet exemple c’est pla-inf qui sera affiché sur votre écran mais si vous essayez de changer la valeur insérée dans val et que vous mettez 125, ce sera pla-sup qui s’affichera.
Exemple avec un paragraphe
Comme je vous l’ai expliqué plus haut un paragraphe permet d’exécuter un bloc d’instructions, voyons un exemple concret :
evaluation.
IF val < 100 THEN
DISPLAY pla-inf
ELSE
DISPLAY pla-sup
END-IF.
* Du code...
* Encore du code...
MOVE 150 TO val.
* Et vous avez besoin de réutiliser le code de l'évaluation alors vous appelez votre paragraphe :
PERFORM evaluation.
Dans ce cas vous aurez un message d’erreur, mais si vous retournez sur la console vous verrez bien :
Superieur ou inferieur
La valeur de 'val' est superieure ou egale a 100
On est d’accord, dans cet exemple ça n’a pas de réel intérêt mais c’est simplement pour vous montrer leur utilisation.
Imbrication
Bien sûr, vous pouvez imbriquer vos conditions de cette manière :
IF x < 50 THEN
* ...
ELSE
IF a > 150 OR b < 125 THEN
* ...
ELSE
* ...
END-IF
END-IF
Remarquez qu’on a une condition un peu plus complexe ici, j’ai mis OR
(OU). J’aurais très bien pu mettre AND
(ET) si j’avais voulu mais ici c’est juste un exemple.
Petite astuce
Si vous avez testé ce code, vous avez probablement été confronté à un souci d’espace dû à la taille de la zone de saisie, du coup vous êtes obligé de faire un retour à la ligne comme je l’ai fait :
01 pla-sup.
02 LINE 6 COL 10 VALUE "La valeur de 'val' est superieure ou".
02 VALUE " egale a 100".
Pour pouvoir continuer mon texte j’ai dû réécrire à la 3e ligne 02 VALUE " egale a 100"
, voici une petite astuce pour les utilisateurs de NetExpress qui permet d’écrire cela autrement avec le signe - (moins) dans la colonne 7 (comme pour les commentaires) :
Retour aux booléens
J’espère que vous n’avez pas oublié ce que je vous ai expliqué plus haut, car nous allons y revenir !
On a vu comment déclarer nos booléens, c’est bien mais les utiliser c’est encore mieux et maintenant que vous avez le nécessaire pour les utiliser, ça serait dommage de s’en priver.
* Entête du programme
77 note PIC 99v99.
88 passable VALUE 10 THRU 11.99.
88 assez_bien VALUE 12 THRU 13.99.
88 bien VALUE 14 THRU 16.
88 parfait VALUE 20.
SCREEN SECTION.
* On créé nos plages de test
01 pla-pass.
02 LINE 7 COL 10 'C''est passable'.
01 pla-ab.
02 LINE 7 COL 10 'C''est pas mal'.
01 pla-b.
02 LINE 7 COL 10 'C''est bien'.
01 pla-p.
02 LINE 7 COL 10 'C''est parfait'.
01 pla-nul.
02 Line 7 COL 10 'Il n''y a pas de mention'.
PROCEDURE DIVISION.
MOVE 20 TO note.
IF passable THEN
DISPLAY pla-pass
ELSE
IF assez_bien THEN
DISPLAY pla-ab
ELSE
IF bien THEN
DISPLAY pla-b
ELSE
IF parfait
DISPLAY pla-p
ELSE
* Si aucune des conditions est à TRUE, alors il n'y a pas de mention
DISPLAY pla-nul
END-IF
END-IF
END-IF
END-IF.
STOP RUN.
Regardez les ligne surlignées, pour vérifier si un booléen est à TRUE
, il suffit simplement de recopier le nom qu’on lui a attribué lors de nos déclarations dans une condition. Là, la plage affichée sera pla-p qui correspond à "C’est parfait" puisque note vaut 20 (comme toutes les notes d’élèves normalement constitués).
À mon avis l’exemple est assez parlant pour ne pas avoir besoin de vous donner des explications supplémentaires, mais si jamais quelque chose n’est pas clair, n’hésitez pas à relire le chapitre.
Dans la déclaration des plages d’affichage, vous avez peut-être remarqué des doubles guillemets simples ; il ne s’agit pas d’une erreur, mais d’une manière de pouvoir mettre des apostrophes dans une phrase.
Choix multiples
Les choix multiples sont comparables au switch dans les autres langages, voici donc leur syntaxe (ça rappelle entre autres le PL/SQL) :
EVALUATE choix
WHEN 1
* Action 1 quand la variable choix vaut 1...
WHEN 2
* Action 2 quand la variable choix vaut 2...
WHEN 3
* Action 3 quand la variable choix vaut 3...
WHEN OTHER
* Action par défaut pour toutes les autres valeurs de choix...
END-EVALUATE.
Donc je pense qu’il n’y a rien de spécial à dire, on va évaluer la valeur de choix à chaque WHEN
. On retrouve la condition d’entrée à tous les WHEN
et à la fin on met WHEN OTHER
pour prendre tous les cas que l’on a prévu dans notre application.
Maintenant, si vous le voulez bien, direction les boucles !