Cobol ANS 74/Structure générale

Un livre de Wikilivres.

Format[modifier | modifier le wikicode]

Le code source en COBOL peut utiliser un format fixe (hérité des cartes perforées) ou un format libre depuis COBOL 2002.

Les perforations des cartes perforées ne permettait que l'encodage des lettres en capitales ; cela explique que les mots-clés et les noms en COBOL n'utilisent pas de lettres en minuscules.

Format fixe[modifier | modifier le wikicode]

Le format fixe est hérité des cartes perforées utilisées pour écrire les premiers programmes en COBOL.

Carte perforée d'une ligne de COBOL commençant à la colonne 12

Les lignes sont limitées à 80 caractères (80 colonnes) qui sont divisées comme suit :

Colonnes Description
1 à 6 Numéro de séquence, utilisé à l'origine pour numéroter les cartes, c'est-à-dire les lignes car une carte perforée stocke une ligne de code.

Cette partie est ignorée par le compilateur.

7 Caractère indiquant le type de la ligne entière :
  • ​ ​ – (espace) Ligne de code normale.
  • D – Ligne de code active en mode de débogage seulement, sinon ignorée par le compilateur.
  • - – Ligne continuant la précédente, celle-ci pouvant être interrompue au milieu d'une chaîne de caractères.
  • * – Ligne de commentaire.
  • / – Ligne de commentaire à imprimer en haut d'une nouvelle page.
8 à 11 Zone A où débute certaines lignes : DIVISION, SECTION, en-têtes de procedure, descripteurs de fichier ou rapport de niveau 01 et 77.
12 à 72 Zone B où débute toutes les autres lignes.
73 à 80 Nom du programme, servant à identifier à quel programme appartient la carte perforée, ignoré par le compilateur.
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      *A   B
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
      ***** Variables
       77 NOM PIC X(20).
       77 COMPTEUR PIC 9(3).
       PROCEDURE DIVISION.
      ***** Initialisation
           MOVE "monde" TO NOM.
           MOVE 99 TO COMPTEUR.
      ***** Affichage
           DISPLAY 'Bonjour ' NOM ' !'.
           DISPLAY 'Vous avez ' COMPTEUR ' messages.'.
           STOP RUN.

Format libre[modifier | modifier le wikicode]

Le format libre est possible en COBOL à partir de la version 2002 :

  • La position du début de ligne (indentation) n'est plus imposée ;
  • Il n'y a plus de limitation à 80 caractères par ligne ;
  • Les indicateurs sont supprimés :
    • L'indicateur * pour une ligne de commentaire est remplacé par *> en début de ligne.
    • L'indicateur - de continuation n'est plus nécessaire vu qu'il n'y a plus de limitation de longueur de ligne.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
*>**** Variables
77 NOM PIC X(20).
77 COMPTEUR PIC 9(3).
PROCEDURE DIVISION.
*>**** Initialisation
MOVE "monde" TO NOM.
MOVE 99 TO COMPTEUR.
*>**** Affichage
DISPLAY 'Bonjour ' NOM ' !'.
DISPLAY 'Vous avez ' COMPTEUR ' messages.'.
STOP RUN.

Affichage[modifier | modifier le wikicode]

Les deux exemples précédents sont équivalents et affichent :

Bonjour monde                !
Vous avez 099 messages.

Cet affichage montre que les variables sont affichées pleinement, sans suppression des espaces finaux ou des zéros initiaux :

  • La variable nom est définie comme une chaîne (PIC X) de 20 caractères : 77 NOM PIC X(20).
  • La variable compteur est définie comme un entier (PIC 9) sur 3 chiffres : 77 COMPTEUR PIC 9(3).

4 Divisions par Programme[modifier | modifier le wikicode]

Un programme est divisé en quatre divisions :

IDENTIFICATION DIVISION.
(Obligatoire) Identification du programme par un nom composé de 1 à 30 caractères.
IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.
ENVIRONMENT DIVISION.
Description de l'environnement de programme :
  • Ordinateur utilisé pour compiler le programme source
  • Ordinateur utilisé pour exécuter le programme compilé
ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...
DATA DIVISION.
Définition des données (structures, variables) utilisées.
PROCEDURE DIVISION.
Définition des instructions du programme à exécuter.
IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.
ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...
DATA DIVISION.
 FILE SECTION.
  FD FNOM LABEL RECORD STANDARD/OMITTED
  01 FENR.
     02 NOM1 PIC X(10).
 WORKING-STORAGE SECTION.
  66 NOM RENAMES NOMA THRU NOMB.
  77 INDEP PIC X(10)
     88 IND-OK VALUES 1 THRU 10.
     88 IND-KO VALUES 11 THRU 20.
PROCEDURE DIVISION.

Éléments du Cobol[modifier | modifier le wikicode]

  • Identificateurs (nom var, f., paragraphes)
[A-Z][0-9][-]
ex.: 128A 128 -ABC IF NUM.ART total
  • Constantes
    • Numeriques: [0-9], . (jamais à droite),+- (tjs devant)
 ex.: .0 13.34.56 -.45 .+65 -12.
    • Alphabetiques: "..." ""->1"
    • Figuratives: prédéfinies (tout numérique sauf 0 = alphanumerique).
{zero, zeros, zeroes} :0
{space, spaces} :
{quote,quotes} : "
{high-value, high-values} : met plus grande valeur que var peut recevoir
{low-value, loww-values} : met plus petite valeur que var peut recevoir
ALL : demande de repeter const non numerique

ex: ZERO(alphanum) // "ZERO"(alpha) // 0(num) // 0.0(num) // ALL ZERO(alpha) // ALL "ZERO"(alpha) // ALL (0(doit être non num))

Clauses[modifier | modifier le wikicode]

PICTURE [V 9 X A]

77 A PIC 9(4)V99; VALUE 193654 >> |1|9|3|6|.|5|4|
77 B PIC X(3)XX; VALUE "A24ZE" >> |A|2|4|Z|E|
77 C PIC A;VALUE "Z" >> |A|

EDITION [. , / B 0] // [+ - $ CR DB] // [Z *] // [+ - $] SIGN // {LEADING/TRAILING} SEPARATE

77 A PIC S999;LEADING SEPARATE. (- devant)
77 B PIC S999;TRAILING SEPARATE. (- derriere)
77 C PIC S999;LEADING. (¢ devant)
77 D PIC S999;TRAILING. (¢ derriere)

VALUE

77 A PIC 999; VALUE 199.

USAGE // {DISPLAY/COMP}

77 B PIC 999;DISPLAY. (sauvé en car)
77 B PIC 999;COMP-0/3. (sauvé en bin).

REDEFINE

01 MONTANT PIC 9(4)V99.
01 REDEF REDEFINES MONTANT.
   02 EURO PIC 9(4).
   02 CENT PIC 99.
01 A REDEFINES MONTANT PIC 9(6).

RENAMES

66 NM RENAMES NB1 THRU DEF1.

FILLER // Var

01 ENREG.
   02 FILLER PIC X(30).
   02 CP PIC 9(4).
   02 FILLER PIC X(6).
      88 OK VALUE SPACE.

BLANK WHEN ZERO

77 A PIC 999; BLANK ZERO; VALUE ZERO.
77 B PIC ZZ9; BLANK ZERO; VALUE ZERO.
A<->" "/B<->" "

Nombre niveau[modifier | modifier le wikicode]

  • reservé
66 champ renommé
77 champ indépendant (non groupé)
88 réservé aux noms-conditions (vrai/faux)
  • de groupage
01 ARTICLE.
   02 DESCRIPTION PIC X(10).
      03 CODE-MAGASIN PIC XXX.
      03 NUMERO-COULEUR PIC 99.

EXPR ARITHMETIQUE[modifier | modifier le wikicode]

[+ - * / **(exp)]

COMPUTE A, C = A*(B**-3). // A=A*(B**-3), C=A*(B**-3) //

INSTRUCTIONS[modifier | modifier le wikicode]

élémentaires[modifier | modifier le wikicode]

  • ACCEPT [VAR]
  • MOVE (X) TO D, E, F, G, H.
  • OPERATION
ADD (X) TO A, B.
ADD (X) GIVING C, D.
-> X : somme // X+A>A, X+B>B, X>C, X>D
SUBTRACT (X) FROM A, B.
SUBTRACT (X) FROM x1 GIVING C, D.
-> X : somme // A-X>A, B-X>B, x1-X>C, x1-X>D
MULTIPLY x1 BY A, B.
MULTIPLY x1 BY x2 GIVING C, D.
-> x1*A>A, x1*B>B, x1*x2>C, x1*x2>D
DIVIDE x1 INTO A, B.
DIVIDE x1 {INTO/BY} x2 GIVING C, D REMAINDER E.
-> A/x1>A, B/x1>B, x2/x1>C (into), x2/x1>D (into), x1/x2>C (by), x1/x2>D (by), x1-x2*D>E (reste)
OPT / ROUNDED : +5 au premier digit décimal non inclu
 77 A PIC 99V99; VALUE 23.43.
 77 B PIC 99V99; VALUE 35.56.
 77 C PIC 99V9.
-> A+B=58.99
ADD A,B GIVING C.
-> c = |5|8|9| = 58.9
ADD A,B GIVING C ROUNDED.
-> c(Rounded) = 58.99 + .05 = 59.04 = |5|9|0| = 59.0
OPT / ON SIZE ERROR = Sur partie entière, si champ trop petit, le champ n'est pas rempli et exec d'instruction.
 77 A PIC 999; VALUE 876.
 77 B PIC 999; VALUE 150.
 77 C PIC 999.
ADD A, B GIVING C; ON SIZE ERROR [instruction].
-> A+B=1026 - trop grand pour C >> exec d'instruction

de contrôle[modifier | modifier le wikicode]

IF [c1] [ins]

  ELSE IF [c2] [ins]
  ELSE [ins]
  • Condition de relation

[= < > <= >=]

... [NOT]= ...
... [NOT]> ...
... [NOT]< ...

  • Condition de classe
... [NOT] {numeric/alphabetic}
  • Condition de signe
... [NOT] {POSITIVE/NEGATIVE/ZERO} 
  • Condition de nom-condition
77 ETAT-CIVIL PIC 9.
   88 CELIBATAIRE VALUE 1.
   88 MARIE       VALUE 2.
   88 DIVORCE     VALUE 3.
   88 VEUF        VALUE 4.
   88 ETAT-CIVIL-FAUTIF VALUES ARE 0, 5 THRU 9.
   88 SANS-CONJOINT     VALUES ARE 1, 3, 4.

ETAT-CIVIL-FAUTIF si 0,5,6,7,8,9 (vrai) sinon (faux)

  • Condition composée

[( ) NOT AND OR]

IF MARIE AND FEMME OR (AGE > 30).
  • Condition de relation simplifiee
IF A=B OR A=C OR A>D
IF A=B OR =C  OR >D
IF A=B OR C   OR >D

Feuille de programme[modifier | modifier le wikicode]

Feuille à 80 colonnes issue du modèle des cartes perforées.

Structure :

  • 1->6 : Num de séquence (facultatif)
  • 7 : Indicateur (*(cmt) /(cmt+nl) -(merge))
  • 8->72 : Ecriture du PRG (marge A : 8->11, marge B : 12->72)
  • 73->80 : Identification

Symboles[modifier | modifier le wikicode]

. Le point ferme l'instruction en Cobol et il est suivi d'un espace.

IF A = B MOVE 1 TO C
    ELSE MOVE 3 TO C
         MOVE 1 To B D.

,; (facultatif) séparateur pour clarifier la notation

ELSE MOVE 3 TO C;
     MOVE 1 TO B, D.