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 :
PERFORM … UNTIL + 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 " ".
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
PERFORM ESSAYER-SAISIE UNTIL ...
Le blocESSAYER-SAISIEest exécuté au moins une fois.
Ensuite, COBOL teste la condition :
MDP-SAISI = MDP-CORRECT→ vrai → on sort
OU
NB-TENTATIVES >= 3→ vrai → on sort
Sinon → on recommence- Pourquoi c’est un "
do-while" ?
La condition est testée après l’exécution du bloc.
Même si l’utilisateur entre le bon mot de passe dès la première fois, le bloc s’exécute une fois (on lui demande au moins une saisie). ADD 1 TO NB-TENTATIVES
Compteur incrémenté à chaque tour (premier tour inclus).ACCEPT MDP-SAISI
Simulation d’une saisie utilisateur (en environnement batch ou console).
Différence avec
Si vous écrivez :
→ test avant la première exécution (comme un while classique).
Avec le paragraphe + UNTIL → test après → comportement
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.