COBOL/Boucles
Les boucles, ou structures répétitives, ou encore structures itératives permettent de répéter une certaine séquence d'instructions un certain nombre de fois, ou bien tant qu'une condition est vérifiée. L'instruction PERFORM
nous permet d’utiliser de telles structures ; voyons les différents formats de cette instruction.
Itérer en fonction d'une condition
modifier
En utilisant ce format, les instructions du corps de la boucle seront exécutées jusqu'à ce que la condition énoncée après le UNTIL
soit vérifiée. Le NOT
permet de nier cette condition.
La clause facultative TEST BEFORE|AFTER
précise si le test de la condition doit se faire avant ou après chaque exécution de la boucle. Si vous faites le test après (TEST AFTER
), la boucle sera parcourue au moins une fois. Le comportement par défaut est celui du TEST BEFORE
, c'est-à-dire que l’on teste la condition avant d'entrer dans la boucle.
Voici un premier exemple dans lequel on boucle jusqu'à ce que l'utilisateur entre 1 ou 2 au clavier :
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-boucle.
000003
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000006 77 saisie PIC 9 VALUE 0.
000007 88 correcte VALUE 1, 2.
000008 COBOL
000009 PROCEDURE DIVISION.
000010 main.
000011 PERFORM TEST AFTER UNTIL correcte
000012 DISPLAY "saisie = " NO ADVANCING
000013 ACCEPT saisie
000014 END-PERFORM.
000015 DISPLAY "Saisie correcte !".
000016 STOP RUN.
000017 END PROGRAM ex-boucle.
On déclare une variable saisie (initialisée à 0) et une variable conditionnelle associée, correcte qui vaut TRUE quand saisie vaut 1 ou 2. On définit ensuite une boucle qui s'exécute jusqu'à ce que correcte soit vérifiée (donc avec saisie = 1 ou = 2).
Itérer un certain nombre de fois
modifier
Ce format de l'instruction PERFOM
nous permet d'exécuter les instructions de la boucle exactement n fois. Dans ce cas, n doit être un entier naturel.
Voici par exemple un programme qui demande à l'utilisateur de saisir une phrase et un entier et qui répète autant de fois cette phrase :
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-boucle.
000003
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000006 77 phrase PIC X(40).
000007 77 n PIC 99.
000008
000009 PROCEDURE DIVISION.
000010 main.
000011 DISPLAY "Phrase : " NO ADVANCING ACCEPT phrase.
000012 DISPLAY "Répétitions : " NO ADVANCING ACCEPT n.
000013 PERFORM n TIMES
000014 DISPLAY phrase
000015 END-PERFORM.
000016 STOP RUN.
000017 END PROGRAM ex-boucle.
Itérer avec un compteur
modifier
En utilisant ce dernier format, les instructions du corps de la boucle seront exécutées jusqu'à ce que la condition énoncée après le UNTIL
soit vraie. Le NOT
permet, là aussi, de nier cette condition. Cette condition doit être une condition numérique (égalité, infériorité, supériorité, différence, etc.).
i doit être un identificateur de variable numérique, il sera modifié à chaque itération : il fera office de compteur. Il doit figurer dans la condition de sortie de cette boucle.
x doit être de type numérique, il indiquera la valeur prise par le compteur pour la première itération.
y doit également être de type numérique, il indique le pas du compteur : c’est la valeur qui sera ajoutée au compteur à chaque itération.
Voici un exemple dans lequel on utilise ce dernier format :
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. ex-boucle.
000003
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000006 77 k PIC 99.
000007 77 compteur PIC 99.
000008
000009 PROCEDURE DIVISION.
000010 main.
000011 DISPLAY "k : " NO ADVANCING ACCEPT k.
000012 PERFORM VARYING compteur FROM 1 BY 2 UNTIL compteur > k
000013 DISPLAY compteur " ; " NO ADVANCING
000014 END-PERFORM.
000015 STOP RUN.
000016 END PROGRAM ex-boucle.
On demande à l'utilisateur un entier k, on va ensuite lister tous les nombres impairs de 1 jusqu'à k. La variable compteur
va contenir successivement chacun de ces nombres impairs.