« COBOL/Conditions » : différence entre les versions

Contenu supprimé Contenu ajouté
Guillpetiot (discussion | contributions)
mAucun résumé des modifications
Ligne 24 :
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 :
 
<source lang="cobol">
IF condition
IF condition
THEN instructions
[ELSETHEN instructions]
[ELSE instructions]
END-IF.
END-IF.</source>
 
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 :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-condition.
000002 PROGRAM-ID. ex-condition.
000003
000003
000004 PROCEDURE DIVISION.
000004 PROCEDURE DIVISION.
000005 main.
000005 main.
000006 IF 2 < 4
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.</source>
 
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.
Ligne 49 ⟶ 51 :
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 :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-condition.
000002 PROGRAM-ID. ex-condition.
000003
000003
000004 DATA DIVISION.
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000005 WORKING-STORAGE SECTION.
000006 77 n PIC 9.
000006 77 n PIC 9.
000007
000007
000008 PROCEDURE DIVISION.
000008 PROCEDURE DIVISION.
000009 main.
000009 main.
000010 ACCEPT n.
000011000010 IFACCEPT n >= 1.
000012000011 IF n THEN>= 1
000013000012 IF n >= 2THEN
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.</source>
 
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.
Ligne 76 ⟶ 79 :
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 :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-condition.
000002 PROGRAM-ID. ex-condition.
000003
000003
000004 DATA DIVISION.
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000005 WORKING-STORAGE SECTION.
000006 77 n PIC 9.
000006 77 n PIC 9.
000007
000007
000008 PROCEDURE DIVISION.
000008 PROCEDURE DIVISION.
000009 main.
000009 main.
000010 ACCEPT n.
000011000010 IFACCEPT n >= 4 AND <= 7.
000012000011 IF n THEN>= DISPLAY "4 <= " n "AND <= 7"
000013000012 ELSETHEN DISPLAY n "4 <= 4" OUn 7" <= 7" n
000013 ELSE DISPLAY n " < 4 OU 7 < " n
000014 END-IF.
000015000014 STOP RUNEND-IF.
000015 STOP RUN.
000016 END PROGRAM ex-condition.
000016 END PROGRAM ex-condition.</source>
 
==Structure alternative généralisée==
Ligne 97 ⟶ 101 :
Le langage nous offre une autre instruction, plus générale, pour tester des conditions : l'instruction EVALUATE.
 
<source lang="cobol">
EVALUATE Z|condition|TRUE|FALSE
EVALUATE Z|condition|TRUE|FALSE
WHEN condition|TRUE|FALSE|{[NOT] X [THRU Y]}
instructions
...
WHEN OTHER instructions
END-EVALUATE.</source>
 
Cette forme est très générale, on peut en distinguer 2 formes particulières. Voici la première :
 
<source lang="cobol">
EVALUATE Z
EVALUATE Z
WHEN [NOT] X [THRU Y]
WHEN [NOT] X [THRU Y]
instructions
instructions
...
...
WHEN OTHER instructions
WHEN OTHER instructions
END-EVALUATE.
END-EVALUATE.</source>
 
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.
Ligne 117 ⟶ 123 :
Voici un exemple présentant ces deux possibilités :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-evaluate.
000002 PROGRAM-ID. ex-evaluate.
000003
000003
000004 DATA DIVISION.
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000005 WORKING-STORAGE SECTION.
000006 77 n PIC 9.
000006 77 n PIC 9.
000007
000007
000008 PROCEDURE DIVISION.
000008 PROCEDURE DIVISION.
000009 main.
000009 main.
000010 ACCEPT n.
000011000010 EVALUATEACCEPT 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.</source>
 
Voici la deuxième manière d'utiliser l'instruction EVALUATE :
 
<source lang="cobol">
EVALUATE condition|TRUE|FALSE
WHENEVALUATE condition|TRUE|FALSE
WHEN condition|TRUE|FALSE
instructions
instructions
...
...
WHEN OTHER instructions
WHEN OTHER instructions
END-EVALUATE.
END-EVALUATE.</source>
 
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.
Ligne 148 ⟶ 156 :
Voici un autre exemple, pour illustrer cette possibilité :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-evaluate.
000002 PROGRAM-ID. ex-evaluate.
000003
000003
000004 DATA DIVISION.
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000005 WORKING-STORAGE SECTION.
000006 77 n PIC 9.
000007000006 77 mn PIC 9.
000007 77 m PIC 9.
000008
000008
000009 PROCEDURE DIVISION.
000009 PROCEDURE DIVISION.
000010 main.
000010 main.
000011 ACCEPT n.
000012000011 ACCEPT mn.
000013000012 EVALUATE n =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.</source>
 
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).
Ligne 173 ⟶ 182 :
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.
 
<source lang="cobol">
77 x PIC ...
77 x PIC ...
88 nom-variable1 VALUE valeur1.
88 nom-variable2variable1 VALUE valeur2valeur1.
88 nom-variable2 VALUE valeur2.
...
...</source>
 
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 :
 
<source lang="cobol">
88 nom-variable VALUE littéral [THRU littéral].
88 nom-variable VALUE littéral [,THRU ...littéral].
88 nom-variable VALUE littéral [, ...].</source>
 
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.
 
<source lang="cobol">SET nom-condition ... TO TRUE.</source>
 
Précisons que l'instruction SET ... TO FALSE n'existe pas !
Ligne 193 ⟶ 204 :
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) :
 
<source lang="cobol">
000001 IDENTIFICATION DIVISION.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-condition.
000002 PROGRAM-ID. ex-condition.
000003
000003
000004 DATA DIVISION.
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000005 WORKING-STORAGE SECTION.
000006 77 choix PIC X.
000006 77 choix PIC X.
000007 88 oui VALUE "O", "o".
000008000007 88 nonoui VALUE "NO", "no".
000009000008 88 entiernon VALUE 0 THRU 9VALUE "N", "n".
000009 88 entier VALUE 0 THRU 9.
000010
000010
000011 PROCEDURE DIVISION.
000011 PROCEDURE DIVISION.
000012 main.
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.</source>
 
[[Catégorie:COBOL]]