# Cobol ANS 74/Version imprimable

* Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
* Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
* Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.
Une version à jour et éditable de ce livre est disponible sur Wikilivres, une bibliothèque de livres pédagogiques, à l'URL : https://fr.wikibooks.org/wiki/Cobol_ANS_74

# Généralités
## Historique

Le langage COBOL (COmmon Business Oriented Language) a été créé par un comité de délégués de constructeurs et utilisateurs d'ordinateurs réunis à l'initiative du gouvernement américain. Ce comité de normalisation, la CODASYL (Conference On DAta SYstems Languages), s'est rassemblé pour la première fois en 1958. Il avait pour mission de définir un langage standard pour la programmation des ordinateurs en vue de résoudre les problèmes commerciaux et administratifs. En avril 1960, le comité publiait une première version du langage connu sous le nom de COBOL 60. Le langage fut ensuite revu, amélioré et complété en 61, 65 et 68. C'est en 1968 que fut défini l'USA Standard COBOL suite à une tentative de normalisation sous l'autorité de l'USASI (United States of America Standards Institute). De nouveau modifié en 1970, le COBOL USA porte maintenant le nom ANS COBOL spécifié par l'ANSI (American National Standards Institute). De nombreuses améliorations ont encore été apportées en 1974 et en 1985. Loin d'être un langage désuet et obsolète (il suffit de prendre connaissance de l'important nombre de grands comptes, publics ou privés, à maintenir à jour un ou plusieurs systèmes d'informations basés sur ce langage), le COBOL a fait l'objet d'une modernisation en 2002, implémentant la programmation orientée objet. Les normes ANS COBOL 1974 sont celles que nous étudierons dans ce cours.

## Objectifs du COBOL

Le langage COBOL a été conçu pour produire des programmes :

### standardisés

    Le COBOL utilise des instructions standards dans une structure de programme standardisée.
    Le COBOL est un essai d'utilisation d'un langage commun à tous les ordinateurs : il subsiste des différences d'un constructeur à l'autre, mais ces différences sont minimes.

### faciles à comprendre

    Parce qu'ils sont écrits en anglais, c'est-à-dire en un langage compréhensible des programmeurs, mais aussi ses non-programmeurs.

### orientés vers les problèmes administratifs et commerciaux
## Quelques termes de programmation COBOL
### La source d'un programme

    est le programme tel qu'il a été écrit par le programmeur.

### Compiler un programme

    est utiliser l'ordinateur pour traduire la source d'un programme COBOL en un programme écrit en langage machine. Durant la compilation, une liste des instructions de la source et de l'objet sont imprimés, de même que des messages indiquant les erreurs d'écriture que le compilateur a découvert dans le programme COBOL.

### Le programme objet

    est le programme obtenu par la traduction du programme source en langage machine.

### Le pré-compilateur

    est un programme qui traduit les instructions non COBOL (ex: SQL, CICS) en instruction COBOL pour être interprété par le compilateur.

### Le compilateur COBOL

    est un programme fourni par le constructeur qui dirige l'ordinateur durant la traduction de la source du programme en un programme objet.

### Le « source computer »

    est l'ordinateur utilisé pour compiler le programme source.

### L' « object computer »

    est l'ordinateur utilisé pour exécuter le programme objet.

## Un exemple de programme COBOL
# Environnement de développement
## Compilateur

Pour exécuter un programme écrit en COBOL, il faut le traduire en langage machine à l'aide d'un compilateur. Il existe des compilateurs disponibles gratuitement comme GnuCOBOL.

## Éditeur de code source

Tout éditeur de fichier texte peut être utilisé.
Cependant certains permettent une coloration syntaxique (Vi, Notepad++). Il existe aussi des extensions pour Visual Studio Code.

# Structure générale
## Format

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

Le format fixe est hérité des cartes perforées utilisées pour écrire les premiers programmes en COBOL.
Les lignes sont limitées à 80 caractères (80 colonnes) qui sont divisées comme suit :
| Colonnes | Description |
| 1 à 6 | Paquet de cartes perforées d'un programme COBOL pour système IBM 370. 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. Lors de la présentation des cartes perforées à la machine, ce numéro peut être utilisé pour mémoriser les lignes dans le bon ordre. Cependant beaucoup de machines ne tenaient pas compte de ce numéro, mais les cartes perforées pouvaient être triées automatiquement par une machine de tri. Ce numéro de 6 chiffres peut être décomposé en deux parties : 3 chiffres pour le numéro de page, et 3 chiffres pour le numéro de ligne dans la page. |
| 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. |
Des feuilles découpées en 72 colonnes permettaient de préparer un programme sur papier.
On peut remarquer que le dernier chiffre du numéro de ligne est vierge (0), et donc que le numéro est incrémenté par pas de 10. Cette technique permet de corriger un programme par insertion de nouvelles lignes sans avoir à renuméroter les lignes suivantes. Par exemple, pour insérer une ligne entre 010 et 020, une nouvelle ligne sera numérotée 015.
Cette technique peut également être appliquée aux numéros de pages.

### Format libre

Les systèmes modernes n'emploient plus de cartes perforées ; les contraintes du format fixes ne sont plus obligatoires avec le format libre. 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.

### Affichage

Les deux exemples précédents sont équivalents et affichent :
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).

## Quatre Divisions par programme

Un programme est constitué de quatre divisions (elles-mêmes constituées de sections), permettant de structurer le programme en séparant les informations d'identifications, la définition des variables et leur traitement (procédures).

### Identification du programme

Cette division est la première dans un programme ; elle est obligatoire. Elle définit les caractéristiques du programme : nom, auteur, ... La syntaxe est la suivante :
La clause PROGRAM-ID est obligatoirement présente et définit le nom donné au programme ; celui-i sert à le référencer depuis d'autres programmes pour l’utiliser. Cette clause est suivie de l'identification du programme composé de 1 à 30 caractères.
L'identifiant du programme, les noms de paragraphes et de variables peuvent utiliser les lettres et les chiffres et contenir des tirets comme séparateur (mais pas au début ou à la fin).
Exemple :
Le point marque la fin des noms de division, de clause et des valeurs associées à ces clauses.

### Environnement du programme

Cette division facultative décrit l'environnement dans lequel s'exécute le programme :
* Ordinateur utilisé pour compiler le programme source,
* Ordinateur utilisé pour exécuter le programme compilé.
Exemple :

### Déclaration des données (variables, structures)

Cette division facultative sert à définir les variables et structures utilisées par le programme.

### Traitements (procédures)

Cette division facultative contient les instructions du programme, sont regroupées en paragraphes. Un paragraphe est formé d’un nom suivi d’un point, et d’une séquence d'instructions, chacune terminée par un point.

### Fin du programme

La fin des division d'un programme est signalée par une ligne END PROGRAM suivie du nom du programme.
L'instruction STOP RUN met fin à l'exécution du programme, en provocant la fermeture de tous les fichiers ouverts.
Exemple de programme complet :

## Premier programme

Le programme ci-dessous affiche "Bonjour monde !" après avoir effacé l'écran.
L'instruction DISPLAY est suivie des valeurs à afficher et de directives :

### LINE y

    Positionner le curseur sur la ligne indiquée.

### POSITION x

    Positionner le curseur sur la colonne indiquée.

### ERASE EOS

    Effacer (erase) tout jusqu'à la fin de l'écran (EOS : End Of Screen).

### NO ADVANCING

    Ne pas avancer le curseur à la ligne suivante.

## Éléments du Cobol

* Ensemble de caractères
    L'ensemble des caractères disponibles dépend du compilateur et de la plateforme. Toutes les versions supportent les caractères suivants :
   * les lettres majuscules ABCDEFGHIJKLMNOPQRSTUVWXYZ
   * les chiffres 0123456789
   * (espace) et les caractères "$.,;<>-+/*=
* Identificateurs (nom de variables, fonctions, paragraphes)
    Les lettres et chiffres ainsi que le tiret sont autorisés : [A-Z][0-9][-]
    Exemple : 128A 128 IF TOTAL SOUS-TOTAL
    Les identifiants complètement numériques (que des chiffres) sont autorisés mais découragés pour éviter la confusion avec les nombres.
    Un identifiant peut utiliser le tiret mais pas en première ou dernière position.
* Constantes
** Numériques : [0-9], . (jamais à droite),+- (tjs devant)
** Alphabétiques : "..." ""->1"
** Figuratives : prédéfinies (tout numérique sauf 0 = alphanumérique).
    {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

PICTURE [V 9 X A]
EDITION [. , / B 0] // [+ - $ CR DB] // [Z *] // [+ - $] SIGN // {LEADING/TRAILING} SEPARATE
VALUE
USAGE // {DISPLAY/COMP}
REDEFINE
RENAMES
FILLER // Var
BLANK WHEN ZERO

### Nombre niveau

* reservé
    66 champ renommé
    77 champ indépendant (non groupé)
    88 réservé aux noms-conditions (vrai/faux)
* de groupage

### EXPR ARITHMETIQUE

[+ - * / **(exp)]

### INSTRUCTIONS
#### élémentaires

* 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
    -> 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.
    ADD A, B GIVING C; ON SIZE ERROR [instruction].
    -> A+B=1026 - trop grand pour C >> exec d'instruction

#### de contrôle

IF [c1] [ins]
* Condition de relation
* Condition de classe
* Condition de signe
* Condition de nom-condition
ETAT-CIVIL-FAUTIF si 0,5,6,7,8,9 (vrai) sinon (faux)
* Condition composée
[( ) NOT AND OR]
* Condition de relation simplifiee

### Feuille de programme

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

. Le point ferme l'instruction en Cobol et il est suivi d'un espace.
,; (facultatif) séparateur pour clarifier la notation

# Divisions, sections, paragraphes
## IDENTIFICATION DIVISION

Identification du programme, n'est formé que de paragraphes.

## ENVIRONMENT DIVISION

CONFIGURATION SECTION. (obligatoire) [INPUT-OUTPUT SECTION] (facultatif)

## DATA DIVISION
### WORKING STORAGE SECTION.
#### Les champs

Reçoit les vars
* nombre_niveau : niveau en pallier hiérarchique. En cobol tout est organisé en Enreg dont l'info principale est de niveau 1.
* FILLER : ligne DUMMY
* clause : taille/type/val. initiale
? Soit le champ article divisé en description et code article qui est divisé en code magasin et numéro couleur.
| ARTICLE | |
| DESCRIPTION | CODE ARTICLE CODE MAGASINNUMERO COULEUR |
* ici 3 Niveaux
* Champs de groupes avec (.) contient :
* des champs élémentaires.
* CARACTERES PICTURES (type de contenu de variable)
Les champs élémentaires reçoivent PIC :
   * 9 [0-9] ,v (donne position de virgule)
    ex. : PIC 99v999 (trois chiffres après la virgule)
   * - alphanumérique
    ex. : PIC -(6) = PIC - - - - - - (- alphanumériques)

## PROCEDURE DIVISION

* Reçoit les instructions de PROG.
* Reçoit toujours un paragraphe avant la premiére instruction.
* Toutes les instructions vont en marge B.

# Fichiers
## Fichier séquentiel

? FACTURE DE GAZ - créer un fichier de consommation de GAZ avec le nom en X(16), adresse X(40), ville X(15) et consommation 9(4)V99. > CRÉER ce fichier en le remplissant et s'il existe déjà, on demande si on veut le détruire (o/n). > FAIRE menu (1. Sortie écran / 2. Rechercher par nom / 3. Ajouter des personnes au fichier / 4. Modifier - smenu (1. nom / 2. adresse / 3. ville / 4. consommation / 0. fin) / 5. Sortie imprimante / 0. fin)
? Rajouter une option d'impression de liste de consommation par client avec numéro en bas de page
+ rajoutés dans ENVIRONMENT et DATA DIVISION.

## fichier indexe

* OPEN (INPUT/ I-O/ OUTPUT) FICHIER - active CP
* START FIC KEY IS ((>/ not</ =) nom); INVALID KEY...
** seq.: Act et pointe CP pour lecture séq.
** rand: START
** dyn.: Tous sens.
* READ
** seq.: READ ... [AT END ...]; INVALID KEY ...
** ran.: READ ... KEY IS ...; INVALID KEY ...
** dyn.: direct / READ ... KEY IS ...; INVALID KEY ...
** dyn.: sequen / READ ... NEXT [AT END ...]
* REWRITE ... ; INVALID KEY ... - modif tt sauf CP
* DELETE FNOM; INVALID KEY ... - charge CP et eff ENREG
* WRITE ENREG; INVALID KEY ... - I-O (ajouter), OUTPUT (écrire).
* CLOSE FNOM

### exercices

Soit le fichier suivant // (CP-ClePrimaire) est NUM-PROD et (CleAlternative) est DES-PROD
* ↑ https://www.mainframestechhelp.com/tutorials/cobol/coding-sheet.htm