PERFORM UNTIL

Boucle "Do While"PERFORM UNTIL avec test en fin

En COBOL, la boucle qui se rapproche le plus d’un Do While (exécuter au moins une fois, puis répéter tant que la condition est vraie) s’écrit avec :

PERFORMUNTIL + une condition inversée (test en fin de boucle)

Cette forme garantit que le bloc est exécuté au moins une fois, même si la condition est fausse dès le départ.

Exemple concret : Saisir un mot de passe (au moins une tentative)

IDENTIFICATION DIVISION.
PROGRAM-ID. MOT-DE-PASSE-DO-WHILE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  MDP-SAISI           PIC X(10) VALUE SPACES.
01  MDP-CORRECT         PIC X(10) VALUE "secret123".
01  NB-TENTATIVES       PIC 9 VALUE 0.

PROCEDURE DIVISION.
    PERFORM ESSAYER-SAISIE
        UNTIL MDP-SAISI = MDP-CORRECT
           OR NB-TENTATIVES >= 3

    IF MDP-SAISI = MDP-CORRECT
        DISPLAY "Accès autorisé ! Bienvenue."
    ELSE
        DISPLAY "Trop de tentatives. Compte bloqué."
    END-IF

    STOP RUN.

ESSAYER-SAISIE.
    ADD 1 TO NB-TENTATIVES
    DISPLAY "Tentative n°" NB-TENTATIVES " - Entrez le mot de passe : "
    ACCEPT MDP-SAISI
    DISPLAY " ".
        
Télécharger le code

Exemple de déroulement possible

Tentative n°1 - Entrez le mot de passe : essai Tentative n°2 - Entrez le mot de passe : secret123 Accès autorisé ! Bienvenue.

Explication détaillée

Différence avec PERFORM UNTIL … (test en début)
Si vous écrivez :
PERFORM TRAITEMENT UNTIL condition-vraie
→ test avant la première exécution (comme un while classique).

Avec le paragraphe + UNTIL → test après → comportement do-while.

Variante sans paragraphe nommé (style plus compact) :

    MOVE 0 TO NB-TENTATIVES
    PERFORM UNTIL MDP-SAISI = MDP-CORRECT OR NB-TENTATIVES >= 3
        ADD 1 TO NB-TENTATIVES
        DISPLAY "Tentative n°" NB-TENTATIVES
        ACCEPT MDP-SAISI
    END-PERFORM
        

Cette forme est très courante en COBOL moderne (depuis COBOL 85) et correspond exactement à un do-while.