Les boucles

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. :diable:

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û ! :p

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 ! :-°