Les boucles sont un des fondements de la programmation, alors voyons comment ça se passe avec les spécificités de COBOL.
Boucler N fois
Cette forme de boucle est la plus simple que vous pouvez rencontrer : elle permet de répéter une ou plusieurs instructions un certain nombre de fois. Ce nombre vous devez le définir vous-mêmes, voyons ça avec un exemple :
* Entête du code avec déclaration d'une variable numérique x PIC 99
INITIALIZE x.
PERFORM 5 TIMES
COMPUTE x = x + 5
END-PERFORM
* Et on affiche x pour connaitre sa valeur :
DISPLAY pla-x.
PERFORM
peut se traduire par "effectuer" donc là nos instructions seront effectuées 5 fois, vous remarquerez que comme les conditions, il n’y a pas de point dans les instructions d’une boucle, vous obtiendrez donc :
Valeur de la variable x : 25
Rien de plus simple, mais vous verrez que la suite est moins drôle.
Boucle booléenne
Maintenant nous allons passer à une autre sorte de boucle qui n’est pas beaucoup plus compliquée que l’autre. Celle-ci permet de boucler tant que la condition d’arrêt n’est pas remplie.
IDENTIFICATION DIVISION.
PROGRAM-ID. boucle.
DATA DIVISION.
77 i PIC 999.
SCREEN SECTION.
01 pla-ligne.
02 LINE i COL 10 VALUE "Ligne numero ".
02 PIC zz FROM i.
PROCEDURE DIVISION.
MOVE 1 TO i.
PERFORM UNTIL i > 10
DISPLAY pla-ligne
COMPUTE i = i + 1
END-PERFORM
STOP RUN.
Ce qui se traduit en français par : tant que i est strictement inférieur à 10, alors on itère et on ajoute 1 à i
à chaque fois.
J’aimerais également attirer votre attention sur la plage d’affichage, vous avez remarqué quelque chose ? Non ? Eh bien vous auriez dû !
Pour l’instruction qui donne le numéro de la ligne où doit apparaitre ma phrase, j’ai utilisé la valeur de la variable i
pour que les lignes s’écrivent les unes en dessous des autres, et éviter ainsi qu’elle s’impriment les unes sur les autres.
Surtout vérifiez bien vos conditions d’arrêts, sinon vous risquez de partir dans une boucle infinie !
Vous obtiendrez alors :
Ligne numero 1
Ligne numero 2
Ligne numero 3
Ligne numero 4
Ligne numero 5
Ligne numero 6
Ligne numero 7
Ligne numero 8
Ligne numero 9
Ligne numero 10
Vous pouvez bien entendu utiliser AND
et OR
dans votre condition si vous avez besoin de faire plus complexe.
Boucle avancée
Incrémentation particulière
On va voir une nouvelle manière d’incrémenter nos variables : cette syntaxe va nous permettre de ne pas faire de COMPUTE
pour incrémenter une valeur, lors de l’itération d’une boucle avec UNTIL
. Voilà la bête :
IDENTIFICATION DIVISION.
PROGRAM-ID. boucleAvancee.
DATA DIVISION.
77 i PIC 999.
SCREEN SECTION.
01 pla-ligne.
02 LINE i COL 10 VALUE "Ligne numero ".
02 PIC zz FROM i.
PROCEDURE DIVISION.
MOVE 42 TO i.
PERFORM VARYING i FROM 5 BY 2 UNTIL i > 20
DISPLAY pla-ligne
END-PERFORM.
STOP RUN.
Et voilà le résultat :
Ligne numero 5
Ligne numero 7
Ligne numero 9
Ligne numero 11
Ligne numero 13
Ligne numero 15
Ligne numero 17
Ligne numero 19
Cette boucle permet de faire une incrémentation par 2 tant que i
n’est pas supérieur à 20, j’ai mis 2 mais j’aurais pu prendre n’importe quelle valeur à la place. Pour les anglophobes, VARYING
peut se traduire par "variant", donc il s’agit du choix de la variable qui va… varier.
Cependant, si vous avez bien regardé le code, à la ligne 14 on met 42 dans i
. Et pourtant la boucle commence à 5 ! C’est à cause du mot FROM
que i
est remis à 5.
Les mots TEST BEFORE/AFTER
On va continuer sur l’exemple que je vous ai donné plus haut. Vous allez remplacer la ligne :
PERFORM VARYING i FROM 5 by 2 UNTIL i > 20
Par :
PERFORM TEST AFTER VARYING i FROM 5 by 2 UNTIL i > 20
Compilez, et regardez le résultat :
Ligne numero 5
Ligne numero 7
Ligne numero 9
Ligne numero 11
Ligne numero 13
Ligne numero 15
Ligne numero 17
Ligne numero 19
Ligne numero 21
Vous avez vu ? On a une itération de plus ! Essayez de remplacer AFTER
, par BEFORE
et vous verrez que le nombre d’itérations est le même que sans les mots TEST BEFORE
, on peut donc considérer que ça revient au même de ne pas le mettre.
Je vais vous donner un schéma pour résumer le fonctionnement d’une boucle avec BEFORE
ou AFTER
:
Test Avant/Après
Pour faire l’analogie avec d’autres langages, on peut dire que le test BEFORE
ressemble au tradictionnel "while", et AFTER
à "do… while".
J’espère que vous êtes prêt, parce que je vais vous interroger, et pas plus tard qu’au prochain chapitre !