COBOL/Opérations sur les chaînes

Une page de Wikiversité.


Opérations sur les chaînes
Computer-aj aj ashton 01.svg
Chapitre 8
Leçon : COBOL
Chap. préc. : Opérations arithmétiques
Chap. suiv. : Sous-programmes
Icon falscher Titel.svg

En raison de limitations techniques, la typographie souhaitable du titre, « COBOL : Opérations sur les chaînes
COBOL/Opérations sur les chaînes
 », n'a pu être restituée correctement ci-dessus.

Sommaire

[modifier] Sous-chaînes

Vous pouvez faire référence à des sous-chaînes de caractères, de la manière suivante :


Définition

chaine ( position : [longueur] )


où chaine est une chaîne de caractères et position et longueur sont des entiers. position doit être compris entre 1 et la longueur totale de la chaîne et longueur doit être compris entre 1 et la longueur totale de la chaîne - position. Si longueur n'est pas spécifiée, la sous-chaîne prendra tous les caractères de fin de la chaîne d'origine.

Considérons par exemple la chaine s contenant "bonjour". s(2:3) prendra 3 caractères à partir du 2ième : "onj". s(4:) prendra la fin de la chaîne à partir du 4ième caractère : "jour".

[modifier] Conversion de caractères

Il est possible de remplacer des caractères dans une chaîne, utilisons pour cela l'instruction INSPECT définie comme suit :


Définition

INSPECT chaine CONVERTING s1 TO s2


où chaine, s1 et s2 sont des chaînes de caractères. Les caractères de chaine vont être remplacés en respectant cette règle : des correspondances vont être établies position par position entre les caractères de s1 et s2, pour chaque position, le caractère de s1 sera remplacé (dans chaine) par le caractère de s2 se trouvant à cette même position.

Voici par exemple une instruction qui remplace dans la chaîne s toutes les voyelles minuscules par leur équivalent majuscule :


Exemple

INSPECT s CONVERTING "aeiouy" TO "AEIOUY"


[modifier] Exemple : Jeu du pendu

Et voici un programme complet illustrant cette instruction : le jeu du pendu dans lequel vous devez deviner les lettres d'un mot (ici, "mammouth").


Exemple

       IDENTIFICATION DIVISION.
        PROGRAM-ID. pendu.
 
       DATA DIVISION.
        WORKING-STORAGE SECTION.
         77 chaine PIC X(20) VALUE "mammouth".
         77 chaine-c PIC X(20).
         77 lettres PIC X(26) VALUE "azertyuiopqsdfghjklmwxcvbn".
         77 lettres-p PIC X(26) VALUE ALL "_".
         77 char PIC X.
 
       PROCEDURE DIVISION.
        pendu.
         MOVE chaine TO chaine-c.
         INSPECT chaine-c CONVERTING lettres TO lettres-p.
         DISPLAY chaine-c.
         PERFORM TEST AFTER UNTIL chaine = chaine-c
          ACCEPT char
          INSPECT lettres CONVERTING char TO "_"
          MOVE chaine TO chaine-c
          INSPECT chaine-c CONVERTING lettres TO lettres-p
          DISPLAY chaine-c
         END-PERFORM.
        STOP RUN.
        END PROGRAM pendu.


[modifier] Concaténation de chaînes de caractères

Nous pouvons concaténer plusieurs chaînes de caractères, c'est-à-dire les mettre "bout-à-bout" à l'aide de l'instruction STRING qui a cette forme :


Définition

STRING {s [DELIMITED c]} ...
  INTO z [POINTER k]


Entre les mots-clés STRING et INTO figure une liste de chaînes de caractères, ce sont ces chaînes qui seront concaténées. Pour chacune d'elles, vous pouvez préciser la clause DELIMITED dans laquelle vous indiquez la chaîne que vous utiliserez pour délimiter cette chaîne (ici c).

Après INTO figure l'identificateur de la chaîne dans laquelle sera stocké le résultat de la concaténation (ici z). La clause POINTER, optionnelle, permet de stocker dans un compteur (ici k) le nombre de caractères concaténés (la concaténation débute à la position de ce pointeur).

Voici un programme d'exemple dans lequel 3 chaînes (correspondant à un jour, un mois et une année) vont être concaténées pour n'en former qu'une seule (une date) :


Exemple

000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. concat.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 j PIC 99 VALUE 22.
000007     77 m PIC 99 VALUE 12.
000008     77 a PIC 9999 VALUE 2008.
000009     77 d PIC 99/99/9999.
000010 
000011 PROCEDURE DIVISION.
000012   main.
000013     STRING j "/" m "/" a INTO d.
000014     DISPLAY d.
000015     STOP RUN.
000016 END PROGRAM concat.


[modifier] Extraction de chaînes de caractères

Il est également possible d'effectuer l'opération inverse : extraire plusieurs sous-chaînes à partir d'une seule chaîne. Pour cela, nous utilisons l'instruction UNSTRING dont le format est le suivant :


Définition

UNSTRING s [DELIMITED c]
  INTO z ... [POINTER k]


La "chaîne-souche" est celle qui suit UNSTRING (ici s), les sous-chaînes suivent INTO. La clause optionnelle DELIMITED permet de préciser quel sera le séparateur utilisé pour délimiter les sous-chaînes. La clause POINTER, optionnelle, permet de stocker dans un compteur (ici k) le nombre de caractères traités (l'extraction débute à la position de ce pointeur).

Pour bien comprendre, voici un autre programme d'exemple, il permet de décomposer une date au format 99/99/9999 en un jour, un mois et une année :


Exemple

000001 IDENTIFICATION DIVISION.
000002   PROGRAM-ID. extraction.
000003 
000004 DATA DIVISION.
000005   WORKING-STORAGE SECTION.
000006     77 j PIC 99.
000007     77 m PIC 99.
000008     77 a PIC 9999.
000009     77 d PIC 99/99/9999 VALUE "22/12/2008".
000010 
000011 PROCEDURE DIVISION.
000012   main.
000013     UNSTRING d DELIMITED "/" INTO j m a.
000014     DISPLAY j SPACE m SPACE a.
000015     STOP RUN.
000016 END PROGRAM extraction.


La clause DELIMITED précise que la chaîne sera découpée selon le séparateur /.