« Programmation Cobol » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Ligne 12 :
 
Plusieurs programmes Cobol sont toujours en utilisation dans des entreprises majeures, notament dans les institutions financières. Certains pensent que l'utilisation d'une arithmétique de décimales en série a rendu les programmes plus vulnérables à des problèmes tels que le bogue de l'an 2000. Par contre, le gestion des décimales du Cobol évite plusieurs problèmes qui peuvent arriver lors de l'utilisation de nombre à virgule flotante pour les calculs financiers.
 
= Approche structurelle =
 
Le langage procedural COBOL dont l'architecture est basée sur les arbres programmatiques [[Programmation_LDA#Les_arbres_programmatiques_.28AP.29|AP]] est développé ici selon l'approche Bertini et Tallineau.
 
==Exemples d'AP==
Sequence = suite d'instructions simples.
 
<b>? Programme qui fait la table de multiplication d'un entier entré au clavier entre 1 et 20 et qui passe à la table suivante jusqu'a condition d'arret inputé par l'utilisateur</b>
 
[[image:AP_TabMul.gif]]
 
:<small>D_PROG: rep = 'O'</small>
:<small>TABLE: while rep = 'n' ou 'N'
:<small>D_TABLE: entrez n entre 1 et 20</small>
:<small>RECOM: while !(n>=1 et n<=20)</small>
:<small>I_TABLE: display "table de ",n</small>
:<small>CALCUL (1->10): calc des multiples</small>
:<small>F_PROG: entrer rep (O/N)</small>
 
<b>? Entrer deux entiers et un choix grace à menu avec ADDITION / SOUSTRACTION / MULTIPLICATION / DIVISION </b>
 
Analyse :
:>entrer 2 entiers
:>1. add
:>2. sous
:>3. mul
:>4. div
:>0. fin
 
[[image:AP_OpMath.gif]]
 
:<small>D_PROG: ? a et b, affiche menu, ? choix</small>
:<small>D_MENU: add, sous, mul, div, erreur</small>
:<small>F_MENU: ? choix</small>
 
<b>? Soit une matrice d'entiers à dimension variable, un vecteur d'entier dont la taille egal le nombre de colonne de la matrice. Compter le nombre de lignes égales au vecteur</b>
 
[[image:AP_Matrice.gif]]
 
==Généralités==
===4 Divisions par Programme===
Divisions comprennent Section/Paragraphes
 
*IDENTIFICATION DIVISION.
*ENVIRONMENT DIVISION.
**CONFIGURATION SECTION.
***OBJECT-COMPUTER. COMPUTER.
***SOURCE-COMPUTER. COMPUTER.
**INPUT-OUTPUT SECTION. (Description fonctionnelle)
*DATA DIVISION. (Données description)
**FILE SECTION. (Données du fichier)
**WORKING STORAGE. (Variables)
**LINKAGE SECTION. (Param. Description)
*PROCEDURE DIVISION. (Instructions)
 
===Elements du Cobol===
* 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 <s>13.34.56</s> -.45 <s>.+65</s> <s>-12.</s>
**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) // <s>ALL (0(doit être non num))</s>
===Clauses===
*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]//Insertion simple - formatage
***[+ - $ CR DB]//Insertion fixe - formatage
***[Z *]//Suppression de 0 non significatif
***[+ - $]//Flottant
 
 
*SIGN // {LEADING/TRAILING} SEPARATE
77 A PIC S999;LEADING SEPARATE.
77 B PIC S999;TRAILING SEPARATE.
77 C PIC S999;LEADING.
77 D PIC S999;TRAILING.
*VALUE
77 A PIC 999; VALUE 199.
01 GROUPE; VALUE "00102003".
02 UN PIC 999.
02 DEUX PIC 99.
02 TROIS PIC 999.
 
*USAGE // {DISPLAY/COMP} /
77 B PIC 999;DISPLAY. (sauvé en car)
77 B PIC 999;COMP. (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).
*FILLER
:Var vide de test
01 ENREG.
02 FILLER PIC X(30).
02 CP PIC 9(4).
02 FILLER PIC X(6).
88 OK VALUE SPACE.
*Condition composée
<b>AND</b> <b>OR</b> NOT
 
===Nombre niveau===
*reservé
:66 champ renommé
:77 champ indépendant (non groupé)
:88 reserve aux noms-condition (vrai/faux)
*de groupage
01 ARTICLE.
02 DESCRIPTION PIC X(10).
03 CODE-MAGASIN PIC XXX.
03 NUMERO-COULEUR PIC 99.
 
===EXPR ARITHMETIQUE===
[+ - * / **(exp)]
COMPUTE A, C = A*(B**-3). // A=A*(B**-3), C=A*(B**-3) //
===INSTRUCTIONS===
====elementaires====
*AFFECTATION
**ACCEPT
ACCEPT A.
**MOVE
MOVE (X) TO D, E, F, G, H.
// X : cst/var/str
{| border="1" align="center"
|- align=left
| recepteur/emetteur || alphabetique || numerique || alphanumerique || groupe
|- align=left
|alphabetique || oui || non || oui || oui
|- align=left
|numerique || non || oui || oui mais || oui
|- align=left
|alphanumerique || oui mais || oui mais || oui || oui
|- align=left
|groupe || oui || oui || oui || oui
|}
*OPERATION
**ADD
ADD (X) TO A, B.
ADD (X) GIVING C, D.
// X : somme // X+A>A, X+B>B, X>C, X>D
**SUBTRACT
SUBTRACT (X) FROM A, B.
SUBTRACT (X) FROM x1 GIVING C, D.
// X : somme // X-A>A, X-B>B, X-x1>C, X-x1>D
**MULTIPLY
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
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 decimal non inclu
<pre>
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
</pre>
**OPT / ON SIZE ERROR = Sur partie entière, si champ trop petit, le champ n'est pas rempli et exec d'instruction.
<pre>
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
</pre>
*DISPLAY
DISPLAY X, " est une var".
*PERFORM
PERFORM nm (x times)
 
PERFORM nm UNTIL cond
 
PERFORM nm VARYING X FROM 2 BY 1 UNTIL cond
 
PERFORM nm1 THRU nm2
 
*STOP
STOP RUN
STOP "CHANGER LE PAPIER DE L'IMPRIMANTE"
 
====de controle====
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===
Feuille à 80 colonnes issue du modèle des cartes perforrées.
 
Structure :
*1->6 : Num de sequence (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 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.
 
===Synthaxe===
*<u>majuscules:</u> mots réservés du langage (si souligné est obligatoire sinon facultatif).
*<u>minuscules:</u> mots au choix du programmeur.
*[]: optionnel
*{≡}: choisis parmis les possibilités
*...: répéter ce qui est avant
 
MOVE {constante} TO var 2 [,var 3].
{variable}
MOVE 3 TO A.
MOVE A TO B D E F.
MOVE A+1 TO B. <erroné (A+1)<>const, var
MOVE A, 1 TO C, D, 3. <erroné (A, 1) const ou var // 3 = const
 
==Bases du COBOL==
(Divisions, sections, paragraphes) vont en marge A.
 
===IDENTIFICATION DIVISION===
Identification du programme, n'est formé que de paragraphes.
 
78 |
IDENTIFICATION DIVISION
*-----------------------
PROGRAM-ID. EXEMPLE.
AUTHOR. NOM.
 
===ENVIRONMENT DIVISION===
CONFIGURATION SECTION. (obligatoire)
[INPUT-OUTPUT SECTION] (facultatif)
 
78 |
ENVIRONMENT DIVISION
*--------------------
CONFIGURATION SECTION.
OBJECT-COMPUTER. MINTA.
SOURCE-COMPUTER. MINTA.
 
===DATA DIVISION===
====WORKING STORAGE SECTION.====
 
78 |
DATA DIVISION
*-------------
WORKING STORAGE SECTION.
 
=====Elements du cobol=====
 
*Identificateurs
:[A-Z][0-9][-]
:ex: 128A <s>128</s> <s>-ABC</s> <s>IF</s> <s>NUM.ART</s> <s>total</s>
*Constantes
*
 
====Les champs====
Recoit les vars
 
nombre_niveau {nom } [clause] ...
{FILLER}
 
*nombre_niveau : niveau en pallier hierarchique. En cobol tout est organisé en Enreg dontl'info principale est de niveau 1.
*FILLER : ligne DUMMY
*clause : taille/type/val. initiale
 
<b>? Soit le champ article divisé en description et code article qui est divisé en code magasin et numéro couleur.</b>
 
{| border="1" align="center"
|- align=left
| ARTICLE ||
|- align=left
| DESCRIPTION ||
{| border="1" align="center"
|- align=left
| CODE ARTICLE ||
|- align=left
| CODE MAGASIN || NUMERO COULEUR
|}
|}
 
*ici 3 Niveaux
*Champs de groupes avec (.) contient :
*des champs élémentaires.
 
78 |
DATA DIVISION
*-------------------------
WORKING STORAGE SECTION.
01 ARTICLE.
02 DESCRIPTION PIC X(10).
02 CODE-ARTICLE.
03 CODE-MAGASIN PIC XXX.
03 NUMERO-COULEUR PIC 99.
77 CPT PIC 99.
 
*CARACTERES PICTURES (type de contenu de variable)
Les champs élémentaires recoivent PIC :
:*9 [0-9] ,v (donne position de virgule)
:ex: PIC 99v999 (trois chiffres apres la virgule)
:*X alphanumerique
:ex: PIC X(6) = PIC XXXXXX (6 alphanumeriques)
 
===PROCEDURE DIVISION===
*Recoit les instructions de PROG.
*Recoit toujours un paragraphe avant la premiere instruction.
*Toutes les instructions vont en marge B.
 
78 |
PROCEDURE DIVISION
*------------------
PROG.
ADD...
MOVE...