En COBOL, il n’existe pas d’instruction native pour inverser une chaîne comme REVERSE() dans d’autres langages. On doit donc construire manuellement la chaîne inversée en parcourant la chaîne source de la fin vers le début.
Cet exemple montre une méthode claire et pédagogique qui respecte deux règles importantes :
• la chaîne originale S reste intacte
• chaque caractère est traité individuellement (compatible avec les caractères multi-octets si on reste en PIC X)
Exemple de code
IDENTIFICATION DIVISION.
PROGRAM-ID. INVERSE-CHAINE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 S PIC X(24) VALUE "Bonjour le monde COBOL".
01 T PIC X(24) VALUE SPACES.
01 LONGUEUR PIC 9(3).
01 I PIC 9(3).
01 J PIC 9(3).
PROCEDURE DIVISION.
MOVE FUNCTION LENGTH(S) TO LONGUEUR
PERFORM VARYING I FROM LONGUEUR BY -1
UNTIL I < 1
ADD 1 TO J
MOVE S(I:1) TO T(J:1)
END-PERFORM
DISPLAY "Original : " S
DISPLAY "Inversée : " T
STOP RUN.
Résultat attendu
Original : Bonjour le monde COBOL
Inversée : LOBC monde el ruojnoB
Explication détaillée pour débutants
01 S PIC X(24) VALUE "Bonjour le monde COBOL".
Chaîne source que l’on veut inverser. On la déclare avec une taille fixe suffisante.01 T PIC X(24) VALUE SPACES.
Chaîne destination qui recevra le résultat inversé. Initialisée avec des espaces.MOVE FUNCTION LENGTH(S) TO LONGUEUR
On récupère la longueur réelle de la chaîneS(ici 23 caractères + espaces si besoin).FUNCTION LENGTHest très pratique.PERFORM VARYING I FROM LONGUEUR BY -1 UNTIL I < 1
Boucle qui part de la fin (LONGUEUR) et descend jusqu’à 1.
BY -1= on décrémente de 1 à chaque tour.ADD 1 TO J
Jsert de position dans la chaîne résultat. On commence à 1 et on monte progressivement.MOVE S(I:1) TO T(J:1)
On prend 1 caractère à la positionIdeSet on le place à la positionJdansT.
La notation(I:1)signifie « à partir de la position I, prendre 1 caractère ».END-PERFORM
Fin de la boucle d’inversion.
Note : les espaces finaux de S deviennent des espaces initiaux dans T. Si vous voulez une version sans espaces superflus, on peut utiliser FUNCTION TRIM avant ou après (à voir dans un prochain cours).