10. L’INSTRUCTION PERFORM

Il arrive fréquemment qu’une même séquence d’instructions intervienne à différents endroits dans le cours du programme. Il vient alors à l’esprit de n’écrire cette séquence d’instructions qu’une seule fois et de s’y référer chaque fois que cela s’avère nécessaire.

Si une telle séquence est extérieure au programme et donc compilée séparément on l’appellera un sous-programme et son utilisation sera réalisée au moyen d’une instruction CALL.
Si au contraire cette séquence d’instructions fait partie du programme, il s’agira alors d’une séquence indépendante sur laquelle on se branche par une instruction PERFORM.

Format 1 :
PERFORM paragraphe-1 [THRU parapgraphe-2]

Exemple :
PERFORM PAR1.

Cette instruction PERFORM provoque le branchement au paragraphe portant le nom de PAR1, lorsque le traitement de la dernière instruction de PAR1 est terminé le contrôle du programme repasse à l’instruction qui suit immédiatement le PERFORM.

Exemple :
PERFORM P1 THRU P3.

Dans ce cas, il y a branchement vers le paragraphe P1 et toutes les instructions comprises entre P1 et la dernière instruction du paragraphe P3 sont exécutées. Entre P1 et P3 il peut y avoir d’autres paragraphes qui seront traités de la même manière. Dans ce cas une instruction de type GO TO limitée à ces paragraphes ne rompt pas les liens de la programmation structurée.
Il arrive aussi que dans ce cas la seule et unique instruction du dernier paragraphe soit une instruction EXIT, qui ne génère rien mais permet le transfert en fin de procédure.

Exemple:
PERFORM P1 THRU P5.
P1.

P3.
    GO TO P5.
P4.

P5. EXIT.

Un format particulier du PERFORM existe sous la forme
PERFORM
instructions Cobol
END-PERFORM

Ce qui est équivalent à un bloc dont le début est le mot clé PERFORM et la fin END-PERFORM.

Exemple :
IF A = B PERFORM
           Instructions Cobol
         END-PERFORM

Format 2 :

Nom-de-donnée (ou entier) représente le nombre de fois que le ou les paragraphes désignés par le PERFORM doivent être exécutés successivement avant de revenir à l’instruction suivant le PERFORM.

        PERFORM X TIMES
                Instructions COB
        END-PERFORM

Avec X comme variable ou constante numérique entière.

Exemple: PERFORM P3 5 TIMES.

Format 3 :

Exemple :

        PERFORM CALCUL UNTIL ECART < 0.01

        CALCUL.
                MOVE X TO X0.
                COMPUTE X = (X0 + (A / X0)) / 2
                SUBTRACT X0 FROM X GIVING ECART.
OU
        PERFORM UNTIL ECART < 0.01
                MOVE X TO X0
                COMPUTE X = (X0 + (A / X0)) / 2
                SUBTRACT X0 FROM X GIVING ECART
        END-PERFORM.

Le paragraphe ou les instructions seront exécutées jusqu’à ce que la condition soit satisfaite, en option on peut choisir d’effectuer le test de la condition avant de pénétrer dans la boucle ou en sortie de la boucle.

Format 4 :

Exemple :
PERFORM TOUR WITH TEST AFTER
        VARYING J FROM 1 BY 1 UNTIL J > 10

Dès que la condition J > 10 est satisfaite, le traitement passe à l’instruction qui suit le PERFORM, il en va de même pour le PERFORM sans paragraphe.

PERFORM VARYING I FROM –100 TO 100 BY 5 UNTIL I > 100

PERFORM RECHERCHE VARYING I FROM 1 BY 1 UNTIL I > 25
                    AFTER K FROM 1 BY 1 UNTIL K > 25
                    AFTER M FROM 1 BY 1 UNTIL M > 25.

Le Cobol autorise les indices négatifs.

Avec AFTER on considère qu’il y a 3 boucles imbriquées dont la dernière tourne le plus rapidement, lorsque sa condition est remplie, on remonte d’un niveau et la boucle inférieure recommence et ainsi de suite jusqu’à ce que toutes les boucles atteignent leur condition d’arrêt.

Pour mettre un tableau à 2 dimensions à ZERO.

01 TABLEAU.
    02 LIGNE OCCURS 20.
        03 COLL OCCURS 20 PIC 99.

PROCEDURE DIVISION.
DEB.
    PERFORM VARYING J FROM 1 BY 1 UNTIL J >20
            AFTER K FROM 1 BY 1 UNTIL K > 20
            MOVE 0 TO COLL( J, K)
    END-PERFORM.

Dans ce genre de PERFORM et selon les besoins du programmeur, on peut utiliser soit 1, soit 2 soit 3 indices de boucles.

Cette instruction peut également utiliser des valeurs INDEX plutôt que des variables numériques, ce qui en fait une instruction de choix pour la manipulation des tableaux avec indices ou index.

Exemple:
01 TABLE.
    02 NOM OCCURS 200 PIC X(25) INDEXED BY J.

PROCEDURE DIVISION.
DEBUT.
    PERFORM VARYING J FROM 1 BY 1 UNTIL J > 200
        MOVE SPACES TO NOM(J)
    END-PERFORM.