< COBOL
fin de la boite de navigation du chapitre

Les conditions permettent d'exécuter certaines instructions en fonction de l'état de l'environnement (état des variables définies dans l'environnement du programme).

Structure conditionnelle

Une condition se présente comme ceci :

X [IS] | [NOT] < | Y
       |       > |
       |       = |
       |  >=     |
       |  <=     |

Où X (respectivement Y) peut être un identificateur, un littéral ou une expression arithmétique. IS est facultatif et ne fait qu'ajouter de la lisibilité à la condition. NOT est également facultatif mais permet de nier la condition.

Une condition est utilisée au sein d'une structure en IF / ELSE, dite structure conditionnelle. Une telle structure se présente sous cette forme :

Définition
IF condition
  THEN instructions
  [ELSE instructions]
END-IF.


Si la condition suivant le IF est vérifiée, alors les instructions suivant le THEN sont exécutées, celles suivant éventuellement le ELSE sont ignorées. Sinon, si la condition n’est pas vérifiée, alors les instructions suivant le THEN sont ignorées et celles suivant le ELSE sont exécutées. Voici un exemple simple de condition :

Exemple
000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. ex-condition.
000003 
000004 PROCEDURE DIVISION.
000005   main.
000006     IF 2 < 4
000007       THEN DISPLAY "2 < 4"
000008       ELSE DISPLAY "2 >= 4"
000009     END-IF.
000010     STOP RUN.
000011 END PROGRAM ex-condition.
Fin de l'exemple


Bien sûr, dans ce cas la condition est triviale : 2 est toujours strictement inférieur à 4 et donc l'exécution du programme provoque toujours le même résultat. Pour en modifier l'issue, vous pouvez donc déclarer une variable, y stocker une valeur saisie au clavier et tester différentes possibilités.

Conditions complexes

Il est également possible d'imbriquer les conditions : placer des structures en IF / ELSE après des THEN ou des ELSE. Voici à quoi cela pourrait ressembler :

Exemple
000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. ex-condition.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 n PIC 9.
000007 
000008 PROCEDURE DIVISION.
000009   main.
000010     ACCEPT n.
000011     IF n >= 1
000012       THEN
000013         IF n >= 2
000014           THEN DISPLAY n " >= 2"
000015           ELSE DISPLAY "2 > " n " >= 1"
000016         END-IF
000017       ELSE DISPLAY n " < 1"
000018     END-IF.
000019     STOP RUN.
000020 END PROGRAM ex-condition.
Fin de l'exemple


Dans cet exemple, nous saisissons une variable n au clavier, si cette valeur est supérieure ou égale à 1, on teste si elle est supérieure ou égale à 2, si c’est le cas, on affiche n >= 2, sinon on affiche 2 > n >= 1 ; si elle n’est pas supérieure ou égale à 1, on affiche n < 1.

Pour simplifier ce genre de conditions, il est possible d’utiliser les mots-clés AND et OR qui vont combiner plusieurs conditions en une seule. Voici comment cela fonctionne : une condition formée de deux sous-conditions jointes par un AND est vérifiée si les 2 sous-conditions sont vérifiées. Une condition formée de deux sous-conditions liées par un OR est vérifiée si au moins une des 2 sous-conditions est vérifiée. Il est possible de placer des conditions entre parenthèses pour les évaluer en priorité (comme pour les calculs).

Voici un autre exemple, utilisant la conjonction de conditions, dans lequel on teste si un entier est supérieur ou égal à 4 ET inférieur ou égal à 7 :

Exemple
000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. ex-condition.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 n PIC 9.
000007 
000008 PROCEDURE DIVISION.
000009   main.
000010     ACCEPT n.
000011     IF n >= 4 AND <= 7
000012       THEN DISPLAY "4 <= " n " <= 7"
000013       ELSE DISPLAY n " < 4 OU 7 < " n
000014     END-IF.
000015     STOP RUN.
000016 END PROGRAM ex-condition.
Fin de l'exemple


Structure alternative généralisée

Le langage nous offre une autre instruction, plus générale, pour tester des conditions : l'instruction EVALUATE.

Définition
EVALUATE Z|condition|TRUE|FALSE
  WHEN condition|TRUE|FALSE|{[NOT] X [THRU Y]}
    instructions
  ...
  WHEN OTHER instructions
END-EVALUATE.


Cette forme est très générale, on peut en distinguer 2 formes particulières. Voici la première :

Définition
EVALUATE Z
  WHEN [NOT] X [THRU Y]
    instructions
  ...
  WHEN OTHER instructions
END-EVALUATE.


Dans cette forme, Z, X et Y peuvent être des identificateurs, des expressions ou des valeurs littérales. THRU (équivalent à THROUGH) sert à spécifier un ensemble de valeurs (bornes incluses). Nous pouvons donc tester l'égalité de deux valeurs (WHEN [NOT] X) ou l'appartenance d'une valeur à un ensemble de valeurs (WHEN [NOT] X THRU Y). Si un des cas satisfait une égalité ou une appartenance, les instructions qui le suivent seront exécutées, et l'évaluation prend fin. Si aucun cas n'est satisfaisant, les instructions suivant éventuellement le WHEN OTHER seront exécutées.

Voici un exemple présentant ces deux possibilités :

Exemple
000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. ex-evaluate.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 n PIC 9.
000007 
000008 PROCEDURE DIVISION.
000009   main.
000010     ACCEPT n.
000011     EVALUATE n
000012       WHEN 0 DISPLAY "nul"
000013       WHEN 1 THRU 4 DISPLAY "entre 1 et 4"
000014       WHEN OTHER DISPLAY "> 4"
000015     END-EVALUATE.
000016     STOP RUN.
000017 END PROGRAM ex-evaluate.
Fin de l'exemple


Voici la deuxième manière d’utiliser l'instruction EVALUATE :

Définition
EVALUATE condition|TRUE|FALSE
  WHEN condition|TRUE|FALSE
    instructions
  ...
  WHEN OTHER instructions
END-EVALUATE.


Dans cette deuxième forme, on teste l'égalité de conditions / valeurs booléennes TRUE ou FALSE (respectivement "la condition est vérifiée" ou "ne l'est pas"). Le premier cas pour lequel la valeur booléenne associée est équivalente à la valeur booléenne à évaluer sera sélectionné, et les instructions qui le suivent seront exécutées. Si aucun cas n'est sélectionné, les instructions suivant éventuellement le WHEN OTHER seront exécutées.

Voici un autre exemple, pour illustrer cette possibilité :

Exemple
000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. ex-evaluate.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 n PIC 9.
000007     77 m PIC 9.
000008 
000009 PROCEDURE DIVISION.
000010   main.
000011     ACCEPT n.
000012     ACCEPT m.
000013     EVALUATE n = m
000014       WHEN TRUE DISPLAY n " = " m
000015       WHEN FALSE DISPLAY n " <> " m
000016     END-EVALUATE.
000017     STOP RUN.
000018 END PROGRAM ex-evaluate.
Fin de l'exemple


Dans cet exemple, si n = m, on exécute les instructions du TRUE, sinon on exécute les instructions du FALSE (dans ce cas, le WHEN OTHER serait équivalent au WHEN FALSE).

Variables conditionnelles

Il est possible de créer des variables conditionnelles, elles sont définies dans la DATA DIVISION et ont pour niveau 88. Elles doivent être rattachées à d'autres variables de niveau inférieur.

Exemple
77 x PIC ...
  88 nom-variable1 VALUE valeur1.
  88 nom-variable2 VALUE valeur2.
  ...
Fin de l'exemple


Le booléen TRUE est assigné à la variable conditionnelle dont la valeur correspond à la valeur de la variable dont les variables conditionnelles dépendent (ici x), le booléen FALSE est assigné à toutes les autres variables conditionnelles. Les valeurs des variables conditionnelles doivent correspondre à l'image de la variable dont elles dépendent. Elles peuvent être une valeur littérale, une liste de valeurs ou un ensemble de valeurs. Le format général de la déclaration d'une variable conditionnelle est donc :

Exemple
88 nom-variable VALUE littéral [THRU littéral].
88 nom-variable VALUE littéral [, ...].
Fin de l'exemple


Il est possible de mettre explicitement une variable conditionnelle à TRUE, toutes les autres variables conditionnelles qui lui sont apparentées seront automatiquement mises à FALSE. L'instruction qui permet cela est SET.

Définition
SET nom-condition ... TO TRUE.


Précisons que l'instruction SET ... TO FALSE n'existe pas !

Exemple : saisie d'un choix

Voici un exemple dans lequel vous voyez les possibilités de définitions des variables conditionnelles et leur évaluation via une structure EVALUATE (vous pouvez faire de même avec une structure en IF / ELSE) :

Exemple
000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. ex-condition.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 choix PIC X.
000007       88 oui    VALUE "O", "o".
000008       88 non    VALUE "N", "n".
000009       88 entier VALUE 0 THRU 9.
000010 
000011 PROCEDURE DIVISION.
000012   main.
000013     ACCEPT choix.
000014     EVALUATE TRUE
000015       WHEN oui DISPLAY "oui"
000016       WHEN non DISPLAY "non"
000017       WHEN entier DISPLAY "entier"
000018       WHEN OTHER DISPLAY "choix incorrect"
000019     END-EVALUATE.
000020     STOP RUN.
000021 END PROGRAM ex-condition.
Fin de l'exemple
Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.