Cobol ANS 74/Version imprimable
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
modifierLe 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
modifierLe 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 le traitement des affaires
- orientés vers les problèmes administratifs et commerciaux
Quelques termes de programmation COBOL
modifier- 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
modifier1 2 3 4 5 6 7 123456789012345678901234567890123456789012345678901234567890123456789012 IDENTIFICATION DIVISION. PROGRAM-ID. EXEMPLE. AUTHOR. SMITH. DATE-WRITTEN. 25 SEP 1988. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. MINTA. OBJECT-COMPUTER. MINTA. INPUT_OUTPUT SECTION. FILE_CONTROL. SELECT FICHIER1 ASSIGN TO CARD-READER. SELECT FICHIER2 ASSIGN TO PRINTER. DATA DIVISION. FILE SECTION. FD FICHIER1 LABEL RECORD IS OMITTED DATA RECORD IS COMMERCE. 01 COMMERCE. 02 IMPORT. 03 MECANIQUE PICTURE 9(5). 03 ELECTRIQUE PICTURE 9(5). 02 EXPORT. 03 ALIMENTAIRE PICTURE 9(5). 03 DIVERS PICTURE 9(5). FD FICHIER2 LABEL RECORD IS OMITTED DATA RECORD IS STAT_COMMERCE. 01 STAT°COMMERCE. 02 FILLER PICTURE X(3); VALUE SPACE. 02 EXP_IMP PICTURE 9(5). 02 PCT_MECA PICTURE 9.99. 02 PCT_ALIM PICTURE 9.99. WORKING-STORAGE SECTION. 77 FLAG PICTURE 9. PROCEDURE DIVISION. PROG. PERFORM D-PROG. PERFORM LECTURE-CALCUL-ECRITURE UNTIL FLAG = 1. PERFORM F-PROG; STOP RUN. D-PROG. OPEN INPUT FICHIER1. OPEN OUTPUT FICHIER2. MOVE 0 TO FLAG. READ FICHIER1 AT END MOVE 1 TO FLAG. LECTURE-CALCUL-ECRITURE. COMPUTE EXP-IMP = ALIMENTAIRE + DIVERS - MECANIQUE - ELECTRIQUE. COMPUTE PCT_MECA = MECANIQUE / (MECANIQUE + ELECTRIQUE). COMPUTE PCT-COMMERCE AFTER ADVANCING 1 LINE. WRITE STAT-COMMERCE AFTER ADVANCING 1 LINE. READ FICHIER1 AT END MOVE 1 TO FLAG. F-PROG. CLOSE FICHIER1, FICHIER2.
Environnement de développement
Compilateur
modifierPour 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
modifierTout é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
modifierLe 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
modifierLe 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 |
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 :
|
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.
Des feuilles découpées en 72 colonnes permettaient de préparer un programme sur papier[1].
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
modifierLes 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.
- L'indicateur
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
modifierLes 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).
Quatre Divisions par programme
modifierUn 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
modifierCette 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 :
IDENTIFICATION DIVISION.
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 :
IDENTIFICATION DIVISION.
PROGRAM-ID. EXEMPLE.
AUTHOR. FR-WIKIBOOKS-ORG.
Le point marque la fin des noms de division, de clause et des valeurs associées à ces clauses.
Environnement du programme
modifierCette 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é.
ENVIRONMENT DIVISION.
Exemple :
ENVIRONMENT DIVISION.
SOURCE-COMPUTER. CPU1.
OBJECT-COMPUTER. CPU1.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ...
Déclaration des données (variables, structures)
modifierCette division facultative sert à définir les variables et structures utilisées par le programme.
DATA DIVISION.
Traitements (procédures)
modifierCette 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.
PROCEDURE DIVISION.
Fin du programme
modifierLa 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 :
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.
END PROGRAM EXEMPLE.
Premier programme
modifierLe programme ci-dessous affiche "Bonjour monde !" après avoir effacé l'écran.
IDENTIFICATION DIVISION.
PROGRAM-ID. bonjour-monde.
DATE-WRITTEN. 2024/08/13.
AUTHOR FR-WIKIBOOKS-ORG.
PROCEDURE DIVISION.
bonjour-monde.
DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
DISPLAY "Bonjour " LINE 12 POSITION 20 NO ADVANCING.
DISPLAY "monde !".
STOP RUN.
END PROGRAM bonjour-monde.
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
modifier- 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
"$.,;<>()-+/*=
- les lettres majuscules
- 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)
ex.: .013.34.56-.45.+65-12.
- 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
modifierPICTURE [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- 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[+ - * / **(exp)]
COMPUTE A, C = A*(B**-3). // A=A*(B**-3), C=A*(B**-3) //
INSTRUCTIONS
modifierélémentaires
modifier- 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
modifierIF [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
modifierFeuille à 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. 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.
Bases du Cobol
Divisions, sections, paragraphes
IDENTIFICATION DIVISION
modifierIdentification du programme, n'est formé que de paragraphes.
78 | IDENTIFICATION DIVISION *----------------------- PROGRAM-ID. EXEMPLE. AUTHOR. NOM.
ENVIRONMENT DIVISION
modifierCONFIGURATION SECTION. (obligatoire) [INPUT-OUTPUT SECTION] (facultatif)
78 | ENVIRONMENT DIVISION *-------------------- CONFIGURATION SECTION. OBJECT-COMPUTER. MINTA. SOURCE-COMPUTER. MINTA. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT (F1) ASSIGN TO DISK; FILE STATUS IS FS. SELECT (F2) ASSIGN TO PRINTER.
DATA DIVISION
modifierWORKING STORAGE SECTION.
modifier78 | DATA DIVISION *------------- WORKING STORAGE SECTION.
Les champs
modifierReçoit les vars
nombre_niveau {nom } [clause] ... {FILLER}
- 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 |
|
- 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 ---. 03 NUMERO-COULEUR PIC 99. 77 CPT PIC 99.
- 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
modifier- Reçoit les instructions de PROG.
- Reçoit toujours un paragraphe avant la premiére instruction.
- Toutes les instructions vont en marge B.
78 | PROCEDURE DIVISION *------------------ PROG. ADD... MOVE...
Fichiers
Fichier séquentiel
modifierENVIRONMENT DIVISION.
...
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FNOM ASSIGN TO (DISK/PRINTER);
ORGANIZATION IS SEQUENTIAL;
ACCESS MODE RANDOM;
FILE STATUS IS FS.
01 ENREG.
02 NM1 PIC X(15).
02 FILLER PIX X(5); VALUE SPACE.
02 NM2 PIX X(20).
DATA DIVISION.
FILE SECTION.
FD FNOM LABEL RECORD STANDARD;
VALUE OF FILE-ID IS "FNOM.DAT".
*OPEN (INPUT/OUTPUT/I-O/EXTEND) FNOM.
*READ FNOM [AT END [INS ... ]].
*WRITE ENREG.
*REWRITE ENREG. - open I-O.
*CLOSE FNOM.
? 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)
*8 | | | | | | | | | | | | | | | |
IDENTIFICATION DIVISION
PROGRAM-ID. FICHIER-GAZ.
AUTHOR. AUT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. CPU1.
OBJECT-COMPUTER. CPU2.
SPECIAL-NAMES.
* DECIMAL-POINT IS COMMA.
CURRENCY SIGN IS "E".
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FGAZ ASSIGN TO DISK;
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD FGAZ LABEL RECORD STANDARD;
VALUE OF FILE-ID IS "FGAZ.DAT";
RECORD CONTAINS 77.
01 FENREG.
02 NOM PIC X(16).
02 ADR PIC X(40).
02 VIL PIC X(15).
02 CNS PIC 9(4)V99.
WORKING-STORAGE SECTION.
77 FS PIC XX.
88 FS-OK VALUE "00".
88 FS-KO VALUE "10".
77 CH PIC X.
88 CH-OK VALUES "o", "O".
88 CH-KO VALUES "n", "N".
77 NMF PIC X(10).
77 NMR PIC X(16).
77 CHM PIC 9.
77 EOF PIC 9; VALUE 0.
*EDITION
77 CONS-ED PIC Z(3)9.99.
PROCEDURE DIVISION.
*structure principale
PROG.
PERFORM D-PROG.
IF FS-OK PERFORM FOK
ELSE PERFORM CREER.
PERFORM I1-PROG.
PERFORM MENU UNTIL CHM = 0.
PERFORM F-PROG.
STOP RUN.
FOK.
PERFORM D-FOK.
PERFORM CHK1 UNTIL CH-OK OR CH-KO.
PERFORM I2-FOK.
IF CH-OK PERFORM CREER
ELSE PERFORM DMY.
PERFORM F-FOK.
MENU.
PERFORM D-MENU.
IF CHM = 1 PERFORM AFF
ELSE IF CHM = 2 PERFORM RCH-STRT
ELSE IF CHM = 3 PERFORM AJO
ELSE IF CHM = 4 PERFORM MOD
ELSE IF CHM = 5 PERFORM IMP
ELSE IF CHM = 0 PERFORM FIN
ELSE PERFORM ERR.
PERFORM F-MENU.
*traitement principal
D-PROG.
DISPLAY ECRAN.
OPEN INPUT FGAZ.
CLOSE FGAZ.
D-FOK.
DISPLAY "RECREER FICHIER ? (O/N)".
ACCEPT CH.
CHK1.
ACCEPT CH.
I2-FOK.
EXIT.
CREER.
OPEN OUTPUT FGAZ.
CLOSE FGAZ.
DMY.
EXIT.
F-FOK.
EXIT.
I1-PROG.
PERFORM SCR1.
ACCEPT CHM.
D-MENU.
EXIT.
F-MENU.
PERFORM SCR1.
ACCEPT CHM.
F-PROG.
EXIT.
AFF.
*----------
PERFORM D-AFF.
PERFORM AFF1 UNTIL EOF = 1.
PERFORM F-AFF.
D-AFF.
DISPLAY (1, 1) ERASE.
DISPLAY "NOM---------------------------------------------------------------------------".
OPEN INPUT FGAZ.
READ FGAZ AT END MOVE 1 TO EOF.
AFF1.
DISPLAY FENREG.
READ FGAZ AT END MOVE 1 TO EOF.
F-AFF.
DISPLAY "------------------------------------------------------------------------------------".
CLOSE FGAZ.
MOVE 0 TO EOF.
STOP "APPUYEZ SUR UNE TOUCHE POUR CONTINUER".
RCH-STRT.
*----------
OPEN INPUT FGAZ.
PERFORM RCH-NM UNTIL NMR > 2.
PERFORM RCH UNTIL EOF = 1 OR NMR = NOM.
PERFORM RCH-ENR THRU RCH-STOP.
RCH-NM.
*----------
DISPLAY "NOM A RECHERCHER ?".
ACCEPT NMR.
RCH.
*----------
READ FGAZ AT END MOVE 1 TO EOF.
RCH-ENR.
*----------
IF NMR = NOM DISPLAY FENREG
ELSE DISPLAY "ENREGISTREMENT INCONNU".
MOVE 0 TO NMR.
RCH-STOP.
*----------
CLOSE FGAZ.
MOVE 0 TO EOF.
STOP "APPUYER SUR UNE TOUCHE".
AJO.
*----------
PERFORM D-AJO.
PERFORM AJO1 UNTIL CH-KO.
PERFORM F-AJO.
D-AJO.
MOVE "o" TO CH.
DISPLAY (1, 1) ERASE.
DISPLAY "NOUVEL ENREG".
OPEN EXTEND FGAZ.
AJO1.
DISPLAY "nom adr vil cns ?".
ACCEPT NOM.
ACCEPT ADR.
ACCEPT VIL.
ACCEPT CNS.
WRITE FENREG.
DISPLAY "encore (o/n) ?".
ACCEPT CH.
F-AJO.
CLOSE FGAZ.
MOD.
*----------
PERFORM D-MOD.
PERFORM MOD1 UNTIL NMR = "*".
PERFORM F-MOD.
MOD1.
PERFORM D-MOD1.
PERFORM RCH UNTIL NOM = NMR OR EOF = 1.
PERFORM I-MOD1.
IF EOF = 0 PERFORM MOK
ELSE PERFORM MKO.
PERFORM F-MOD1.
MOK.
PERFORM D-MOK.
PERFORM MMOD UNTIL CHM = 0.
PERFORM F-MOK.
MMOD.
PERFORM D-MMOD.
IF CHM = 1 PERFORM M1
ELSE IF CHM = 2 PERFORM M2
ELSE IF CHM = 3 PERFORM M3
ELSE IF CHM = 4 PERFORM M4
ELSE PERFORM ERR.
PERFORM F-MMOD.
D-MOD.
DISPLAY (1, 1) ERASE.
DISPLAY "NOM A RECHERCHER ? (* pour aucun)".
ACCEPT NMR.
D-MOD1.
OPEN I-O FGAZ.
I-MOD1.
EXIT.
D-MOK.
PERFORM SCR2.
DISPLAY "CHOIX ? 1-4".
ACCEPT CHM.
D-MMOD.
EXIT.
M1.
DISPLAY NOM.
DISPLAY "NOUVEAU NOM ?".
ACCEPT NOM.
M2.
DISPLAY ADR.
DISPLAY "NOUVELLE ADRESSE ?".
ACCEPT ADR.
M3.
DISPLAY VIL.
DISPLAY "NOUVELLE VILLE ?".
ACCEPT VIL.
M4.
DISPLAY CNS.
DISPLAY "NOUVELLE CONSOMMATION ?".
ACCEPT CNS.
F-MMOD.
PERFORM D-MOK.
F-MOK.
DISPLAY "ENREGISTREMENT"
REWRITE FENREG.
MKO.
DISPLAY "NOM INCONNU".
STOP "APPUYEZ UE TOUCHE".
F-MOD1.
CLOSE FGAZ.
MOVE 0 TO EOF.
PERFORM D-MOD.
F-MOD.
EXIT.
IMP.
*----------
EXIT.
FIN.
*----------
EXIT.
ERR.
*----------
DISPLAY "CHOIX INCORRECT !".
*MENUS
*----------------------------------------
SCR1.
DISPLAY (1, 1) ERASE.
DISPLAY "MENU PRINCIPAL".
DISPLAY "--------------".
DISPLAY "1 AFFICHER TOUT".
DISPLAY "2 RECHERCHER NOM (*=STOP)".
DISPLAY "3 AJOUTER ENREG".
DISPLAY "4 MODIFIER ENREG".
DISPLAY "5 IMPRIMER FICHIER".
DISPLAY "0 QUITTER".
SCR2.
DISPLAY (1, 1) ERASE.
DISPLAY "MENU MODIFIER".
DISPLAY "-------------".
DISPLAY "1. NOM".
DISPLAY "2. ADRESSE".
DISPLAY "3. VILLE".
DISPLAY "4. CONSOMMATION".
DISPLAY "0. QUITTER".
? 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.
8 | | | | | | | | | | | | | | | |
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
SELECT FIMP ASSIGN TO PRINTER.
DATA DIVISION.
FILE-SECTION.
FD FIMP LABEL RECORD OMITTED;
LINAGE IS 25 WITH FOOTING AT 23;
LINES TOP 2; LINES BOTTOM 2.
01 LIGNE PIC X(80).
WORKING-STORAGE SECTION.
01 TITRE.
02 FILLER PIC X(3); VALUE "NOM".
02 FILLER PIC X(35); VALUE SPACE.
02 FILLER PIC X(12); VALUE "CONSOMMATION".
01 SOUL.
02 FILLER PIC X(3); VALUE ALL "-".
02 FILLER PIC X(35); VALUE SPACE.
02 FILLER PIC X(12). VALUE ALL "-".
01 ENR-IMP.
02 NOMI PIC X(30).
02 FILLER PIC X(7); VALUE SPACE.
02 CONSI PIC ZZZ9.99.
01 BAS-PAGE.
02 FILLER PIC X(30). VALUE SPACE.
02 FILLER PIC X(5). VALUE "PAGE ".
02 NUM PIC 99.
77 BLANCHE PIC X; VALUE SPACE.
77 NP PIC 9.
77 SAUT PIC 99.
PROCEDURE DIVISION.
*STRUCTURE
IMPRESSION.
PERFORM D-IMPRESSION.
IF EOF = 0 PERFORM IOK
ELSE PERFORM IKO.
PERFORM F-IMPRESSION.
IOK.
PERFORM D-IOK.
PERFORM IMP UNTIL EOF = 1.
PERFORM F-IOK.
IMP.
PERFORM D-IMP.
IF NP = 1 PERFORM NEWPAGE
ELSE PERFORM MEMPAGE.
PERFORM F-IMP.
*TRAITEMENTS
D-IMPRESSION.
OPEN INPUT FGAZ.
MOVE 0 TO EOF.
READ FGAZ AT END MOVE 1 TO EOF.
D-IOK.
OPEN OUTPUT FIMP.
MOVE " LISTE DES CLIENTS" TO LIGNE.
WRITE LIGNE BEFORE 2.
WRITE LIGNE FROM TITRE BEFORE 1.
WRITE LIGNE FROM SOUL BEFORE 2.
MOVE 0 TO NP.
MOVE 1 TO NUM.
D-IMP.
MOVE CORR ENR-GAZ TO ENR-IMP.
MEMPAGE.
WRITE LIGNE FROM ENR-IMP BEFORE 1;
AT EOP MOVE 1 TO NP.
NEWPAGE.
WRITE LIGNE FROM BLANCHE BEFORE 1.
WRITE LIGNE FROM BAS-PAGE BEFORE PAGE.
WRITE LIGNE FROM TITRE BEFORE 1.
WRITE LIGNE FROM SOUL BEFORE 2.
* WRITE LIGNE FROM ENR-IMP BEFORE 1.
MOVE 0 TO NP.
ADD 1 TO NUM.
F-IMP.
READ FGAZ AT END MOVE 1 TO EOF.
F-IOK.
SUBTRACT LINAGE-COUNTER FROM 25 GIVING SAUT.
WRITE LIGNE FROM BAS-PAGE AFTER SAUT.
CLOSE FIMP.
F-IKO.
EXIT.
F-IMPRESSION.
CLOSE FGAZ.
fichier indexe
modifier- 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
modifierSoit le fichier suivant // (CP-ClePrimaire) est NUM-PROD et (CleAlternative) est DES-PROD
*8 | | | | | | | | | | | | | | | |
ENVIRONMENT DIVISION
...
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FPROD ASIGN TO DISK;
ORGANIZATION INDEXED;
ACCESS MODE ...
RECORD KEY IS NUM-PROD;
ALTERNATE RECORD DES-PROD DUPLICATES;
FILE STATUS IS STAT-PROD.
DATA DIVISION.
FILE SECTION.
FD FPROD LABEL RECORD STANDARD;
VALUE OF FILE-ID IS "FPROD.DAT".
01 ENR-PROD.
02 NUM-PROD.
03 FAM-PROD PIC XX.
03 FILLER PIC X(4).
02 NOM-PROD.
03 DES-PROD PIC X(5).
03 FILLER PIC X(10).
02 INFO PIC XX.
WORKING-STORAGE SECTION.
77 STAT-PROD PIC XX.
? 1/ Faire programme pour CREER, REMPLIR, AFFICHER, MODIFIER, EFFACER dans ce fichier
- acces sequentiel
- ? 2/ En acces sequentiel, afficher tout le fichier
*8 | | | | | | | | | | | | | | | |
PROCEDURE DIVISION.
*STRUCTURE
PROG.
PERFORM D-PROG.
PERFORM AFF UNTIL EOF=1.
PERFORM F-PROG.
*TRAITEMENTS
D-PROG.
OPEN INPUT FPROD.
MOVE 0 TO EOF.
READ FPROD AT END MOVE 1 TO EOF.
AFF.
DISPLAY ENR-PROD.
READ FPROD AT END MOVE 1 TO EOF.
F-PROD.
CLOSE FPROD.
- ? 3/ Afficher tous les produits dont le nom commence par B
D'abord en dynamique puis s'il est dedans la suite du fichier en sequentiel.
*8 | | | | | | | | | | | | | | | |
PROCEDURE DIVISION.
*STRUCTURE
PROG.
PERFORM D-PROG.
IF FLAG = 0 PERFORM OK
ELSE PERFORM KO.
PERFORM F-PROG.
OK.
PERFORM D-OK.
PERFORM AFF UNTIL DES-PROD > "BZZZZ".
PERFORM F-OK.
*TRAITEMENTS
D-PROG.
OPEN INPUT FPROD.
MOVE "B" TO DES-PROD.
START FPROD KEY IS NOT < DES-PROD;
INVALID KEY MOVE 1 TO FLAG.
D-OK.
MOVE 0 TO EOF.
READ FPROD.
AFF.
DISPLAY ENR-PROD.
READ FPROD AT END MOVE 1 TO EOF.
F-OK.
EXIT.
KO.
DISPLAY "PAS DANS FICHIER".
F-PROG.
CLOSE FPROD.
- acces random
- ? 4/ Entrer un numero de produit et l'afficher
8 | | | | | | | | | | | | | | | |
*STRUCT
RECHERCHE.
PERFORM I1-PROG.
IF FLAG = 0 PERFORM OK
ELSE PERFORM KO.
PERFORM I2-PROG.
*TRAITEMENT
I1-PROG.
OPEN INPUT FPROD.
DISPLAY "NUM ?".
ACCEPT NUM-PROD.
MOVE 0 TO FLAG.
READ FPROD; INVALID KEY MOVE 1 TO FLAG.
OK.
DISPLAY ENR-PROD.
KO.
DISPLAY NUM-PROD, " INEXACT".
I2-PROG.
CLOSE FPROD.
- acces dynamique
- ? 5/ En dynamic, affichet tous les produits dont le nom est "rivet"
Arbre programmatique
0 (PROG) -c01- 1 [I2-] (AKO) (AOK) [I1-] 2 [F-] (AFF) [D-] -c02> CONDITIONS: c01 : {FLAG = 0 / STAT-PROD <> "23"} c02 : DES-PROD <> "rivet" OR {EOF = 1/STAT-PROD = "10"}
Traitements
8 | | | | | | | | | | | | | | | |
*STRUCTURE
...
*TRAITEMENTS
I1-PROG.
OPEN INPUT FPROD.
MOVE "RIVET" TO DES-PROD
READ FPROD KEY IS DES-PROD.
D-AOK.
MOVE 0 TO EOF.
AFF.
DISPLAY ENR-PROD.
READ FPROD NEXT; INVALID KEY MOVE 1 TO EOF.
* pas de invalid key avec file status
F-AOK.
EXIT.
AKO.
DISPLAY "NON TROUVE".
I2-PROG.
CLOSE FPROD.
- ? 6/ Faire les 5 exercices precedents en acces dynamique
- ? 7/ Afficher le 1er produit sans faire OPEN à partir de n'importe ou
- ? 8/ Pour tous les produits de la famille K2, si l'info est AA, elle devient XX. Si l'info est BB, on supprime le produit.
- ? 9/ Afficher tous les produits à partir du produit H51025. (En 2 versions // Toujours le faire / Le faire uniquement s'il est dedans)
fichier relatif
modifier- SELECT
SELECT FICHIER ORGANISATION RELATIVE; ACCESS MODE [sequential/random/dynamic]; RELATIVE KEY IS [VAR]; STATUS IS [VAR].
- OPEN
OPEN {INPUT/OUTPUT/I-O} [FICHIER]
- START
START [FNOM] KEY IS {=/>/NOT <} clé-relative; [INVALID KEY]
- READ
- sequentiel : READ ... AT END ...
- random : READ ... INVALID KEY ...
- dynamic :
- seq : READ ... NEXT AT END ...
- dir : READ ... INVALID KEY ...
- REWRITE [ENREG] INVALID KEY ...
- En random ecrit en fonction de la cle.
- En dynamique ecrit le dernier lu.
- DELETE FNOM INVALID KEY ...
- En dynamique efface à la clé.
- En seqentiel efface le dernier lu.
- WRITE [ENREG]; INVALID KEY ...
- I-O
- Pas en séquentiel.
- Random et dynamique, en fonction de clé
- OUTPUT
- Crée dans ordre croissant de la clé.
files status
modifier- Chaque entrée/sortie fichier génère un status.
FS | I/O | ORGANISATION | MODE | SIGNIFICATION |
00 | All | All | All | Successful |
02 | REWRITE WRITE | Ind | All | Created duplicate alternate key |
02 | READ | Ind | All | Detected alternate duplicate key |
04 | READ | All | All | Record not size of user's buffer |
05 | OPEN | All | All | Optional file not present |
07 | CLOSE OPEN | All | All | Invalid file organization or device |
10 | READ | All | Seq | No next logical record or option file not present (at end) |
14 | READ | Rel | All | Relative record number too large |
21 | REWRITE | Ind | Seq | Primary key changed after READ |
21 | WRITE | Ind | Seq | Attempted nonascending key value (invalid key) |
22 | REWRITE | Ind | All | Duplicate alternate key (invalid key) |
22 | WRITE | Ind, Rel | Ran | Duplicate key (invalid key) |
23 | DELETE READ REWRITE START | Ind, Rel | Ran | Record not in file; optional file not present (invalid key) |
24 | WRITE | Ind, Rel | All | Boundary violation or relative record number too large (invalid key) |
30 | All | All | All | All other permanent errors |
34 | WRITE | Seq | Seq | Boundary violation |
35 | OPEN | All | All | File not found |
37 | OPEN | All | All | Inappropriate device type |
38 | OPEN | All | All | File previously closed with lock |
39 | OPEN | All | All | Conflict of file attributes |
41 | OPEN | All | All | File already opened |
42 | CLOSE | All | All | File not opened |
43 | DELETE REWRITE | All | Seq | No previous READ or START |
44 | REWRITE WRITE | All | All | Invalid record size |
46 | READ | All | Seq | No valid next record (at end) |
47 | READ START | All | All | File not open, or incompatible open mode |
48 | WRITE | All | All | File not open, or incompatible open mode |
49 | DELETE REWRITE | All | All | File not open, or incompatible open mode |
90 | All | All | All | Record locked by another user (record available) |
91 | OPEN | All | All | Open is unsuccessful; file locked by another access stream |
92 | DELETE READ REWRITE START WRITE | All | All | Record locked by another user (record not available) |
93 | UNLOCK | All | All | No current record |
94 | UNLOCK | All | All | File not open, or incompatible open mode |
95 | OPEN | All | All | No file space on device |
Tables
Acces par Indice, Index, Search
- OCCURS (1 par dimension)
- ne va pas en 01 66 77 88
Une dimension
modifier01 TAB. 02 ELEM PIC 99; OCCURS 10. 88 NUL VALUE 0. *INITIALISATION. 01 TAB; VALUE "0102030405". 02 ELEM PIC 99; OCCURS 5.
- ->TAB (5*2bit)
Multitables
modifier01 TAB. 02 FILLER PIC X(9) VALUE "JANVIER". 02 FILLER PIC X(9) VALUE "FEVRIER". 02 FILLER PIC X(9) VALUE "MARS". 02 FILLER PIC X(9) VALUE "AVRIL". 02 FILLER PIC X(9) VALUE "MAI". 02 FILLER PIC X(9) VALUE "JUIN". 02 FILLER PIC X(9) VALUE "JUILLET". 02 FILLER PIC X(9) VALUE "AOUT". 02 FILLER PIC X(9) VALUE "SEPTEMBRE". 02 FILLER PIC X(9) VALUE "OCTOBRE". 02 FILLER PIC X(9) VALUE "NOVEMBRE". 02 FILLER PIC X(9) VALUE "DECEMBRE". 01 TAB-MOIS REDEFINES TAB. 02 MOIS PIC X(9) OCCURS 12.
- ->TAB et TAB-MOIS (9*12bit)
Multidimension
modifier01 ECOLE. 02 NOM-ECOLE PIC X(20). 02 CLASSE OCCURS 15. 03 NOM-CLASSE PIC X(10). 03 ELEVES OCCURS 20. 04 NOM-ELEVE PIC X(20). 04 ADR-ELEVE PIC X(30). 03 PROF OCCURS 10. 04 NOM-PROF PIC X(20). 04 COURS OCCURS 5. 05 INTITULE PIC X(15). 05 HEURES PIC 99.
- -> INTITULE(15, 10, 5) // INTITULE du 5e cours de 10e prof de 15e classe
- -> COURS(15, 10, 5) // INTITULE+HEURES du 5e cours de 10e prof de 15e classe
- -> NOM-PROF(15, 10) // NOM-PROF du 10e prof de 15e classe
- -> PROF(15, 10) // 10e PROF de 15e classe
- -> ADR-ELEVE(15, 11) // ADR-ELEVE de 11e eleves de 15e classe
- -> NOM-CLASSE(3) // NOM-CLASSE de 3e classe
Recherche dans un tableau
modifierindices
modifierPERFORM RCH VARYING I FROM 1 BY 1 UNTIL I > 15 AFTER J FROM 1 BY 1 UNTIL J > 20 OR ADR-ELEVE(I, J) = "DANIEL".
AP (CHK) -c1-> [F] (ANAL) [D] -c2--> [X] (X) (INC-OCC) [X] (RCH) [D] -c3-> c1: EOF=1 // c2: I:1->80 // c3: J=6 OR CARAC(I)=PONCT(J) les feuilles X ne sont pas instruites
*8 | | | | | | | | | | | | | | | | SELECT FTEXTE ASSIGN TO DISK. FILE SECTION. FD FTEXTE... 01 LIGNE. 02 CARAC PIC X; OCCURS 80. WORKING STORAGE SECTION. 01 VECT-PONCT; VALUE ".,:;!?". 02 OCC PIC 99; OCCURS 6. 01 VECT-OCC. 02 OCC PIC 99; COMP-0; OCCURS 6. 77 I PIC 99; COMP-0. 77 J PIC 99; COMP-0. 77 EOF PIC 9. 77 OCC-ED PIC Z9. PROCEDURE DIVISION. *structure incomplete *-------------------- ... CHK. PERFORM ANAL VARYING I FROM 1 BY 1 UNTIL I = 80. ANAL. PERFORM D-ANAL. PERFORM RCH VARYING J FROM 1 BY 1 UNTIL J = 6 OR CARAC(I) = PONCT(J). ... ... *traitements *--------------------- INIT-OCC. MOVE 0 TO OCC(J). I1-PROG. OPEN INPUT FTEXTE. MOVE 0 TO EOF. READ FTEXTE; AT END MOVE 1 TO EOF. D-ANAL. MOVE 1 TO J. RCH. ADD 1 TO J. INC-OCC. ADD 1 TO OCC(J). F-TRAITE. READ FTEXTE; AT END MOVE 1 TO EOF. I-PROG. CLOSE FTEXTE. AFF-RES. MOVE OCC(J) TO OCC-ED. DISPLAY "il y a ", OCC-ED, PONCT(J).
index
modifier- accelere la recherche sur champs:
01 TAB. 02 A OCCURS 5; INDEXED BY I1. 03 B OCCURS 7; INDEXED BY I2, I3. 04 C PIC 9; OCCURS 4 INDEXED BY I4
- -> Chaque tab reçois un index !
- Dans l'exemple suivant si C(4, 2, 3)=7 est le premier 7 trouvé, on aura un arret à ((3*7*4)+(1*2*3)) soit la 90e boucle de I4.
PERFORM RCH VARYING I1 FROM 1 BY 1 UNTIL I1 > 5 AFTER I2 FROM 1 BY 1 UNTIL I2 > 7 AFTER I4 FROM 1 BY 1 UNTIL I4 > 9 OR C=(I1, I2, I4) = 7.
- index permet le calcul et les const-> C(I1+3, I2-7, (4+3))
- l'adressage n'accepte pas la présence d'indice et index en même temps//
C(Index,1,indice) - SET index TO {index/ch-index/entier} //initialiser
- SET index1, index2 {UP/DOWN} by entier //incrementer
- champ index : sert à sauver valeur d'un index
77 CH-INDEX USAGE INDEX.
- même AP
*8 | | | | | | | | | | | | | | | | FILE SECTION. FD FTEXTE... 01 LIGNE. 02 CARAC PIC X; OCCURS 80; INDEXED BY IND1. WORKING STORAGE SECTION. 01 VECT-PONCT; VALUE ".,:;!?". 02 OCC PIC 99; OCCURS 6; INDEXED BY IND2. 01 VECT-OCC. 02 OCC PIC 99; COMP-0; OCCURS 6; INDEXED BY IND3. 77 I PIC 99; COMP-0. 77 J PIC 99; COMP-0. 77 EOF PIC 9. 77 OCC-ED PIC Z9. PROCEDURE DIVISION *meme structure ... *traitements *--------------------- INIT-OCC. MOVE 0 TO OCC(IND3). I1-PROG. OPEN INPUT FTEXTE. MOVE 0 TO EOF. READ FTEXTE; AT END MOVE 1 TO EOF. D-ANAL. SET IND2 TO 1. RCH. SET IND2 UP BY 1. INC-OCC. SET IND3 TO IND2. ADD 1 TO OCC(IND3). F-TRAITE. READ FTEXTE; AT END MOVE 1 TO EOF. I-PROG. CLOSE FTEXTE. AFF-RES. SET IND3 TO IND2. MOVE OCC(IND3) TO OCC-ED. DISPLAY "il y a ", OCC-ED, PONCT(IND2).
search
modifier- SEARCH nom [VARYING{index/ch-index/ch-entier}]
- [AT END ins]
- [WHEN cond1 {ins/NEXT SENTENCE}]
- [WHEN cond1 {ins/NEXT SENTENCE}]
- ...
- OCCURS entier TIMES
- {{ASCENDING/DESCENDING} KEY IS nom1 (nom2)...}...
- INDEXED nom1 [,nom2...
search all
modifier- Sur champs triés
- SEARCH ALL nom1
- [AT END ins]
- WHEN {nom-cond/nom2{EQUAL}{expr/const/ident}
- [AND{nom-cond/nom2{EQUAL}{expr/const/ident}]
- {ins/NEXT SENTENCE}
inspect
modifier- INSPECT ident1 TALLYING
- {ident2 FOR {{{ALL/LEADING}CHARACHTER}{ident3/literal1}}
- [{before/after} INITIAL {ident4/literal2}]}...}...
string
modifier- STRING {{ident1/cont1}[ident2/const2]...
- DELIMITED BY {ident1/const1/SIZE}}...
- INTO ident4 [WITH POINTER ident5]
- [ON OVERFLOW ins]
unstring
modifier- UNSTRING identificateur-1
- [DELIMITED BY [ALL] {ident1/constante1},[OR[ALL] {ident1/const1}]]
- INTO {ident4([DELIMITER ident5]/[COUNT ident6])}
- [WHITH POINTER ident7]
- [TALLYING ident8]
- [ON OVERFLOW ins]
Exercices de synthese
modifier? Faire la gestion d'une bibliotheque ?
- Partant des deux fichiers FLIVRE et FTHEME, faire
- A/ MenuPrincipal
- 1/ Ajout new livre (ouvre SousMenu2).
- 2/ Ajout nouvel exemplaire
- 3/ Modifier un livre
- 4/ Recherche de livre par (1/ titre, 2/ autheur, 3/ code, (? 4/ theme))
- B/ SousMenu2
- >Sort tous les enreg de FTHEME + num (a introduire en A1)
| | | | | | | | | | | | | | | | | ENVIRONMENT DIVISION. ... INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FLIVRE ASSIGN TO DISK ;ORGANIZATION INDEXED ;ACCESS MODE DYNAMIC ;RECORD KEY IS COD-LIV ;ALTERNATE ... ;STATUS IS SLIV. SELECT FTHEME ASSIGN TO DISK ;ORGANIZATION RELATIVE ;ACCESS MODE ... ;RELATIVE KEY IS ... ;STATUS IS STHEME. DATA DIVISION. FILE SECTION. FD FLIVRE LABEL RECORD STANDARD VALUE OF FILE-ID IS "FLIVRE.DAT". 01 ENR-LIV. 02 CODE PIC X(5). 02 TITRE PIC X(30). 02 AUTHEUR PIC X(15). 02 THEME PIC 99. 02 QTY-LIV PIC 99. 02 QT-RESTE PIC 99; COMP-0. FD FTHEME LABEL RECORD STANDARD VALUE OF FILE-ID IS "FTHEME.DAT". 01 ENR-THE. 02 DESC PIC X(20). 02 RAYON PIC X(8). 02 QT-MAX PIC 99. WORKING STORAGE SECTION. ...
| | | | | | | | | | | | | | | | | * GESTION DE BIBLIOTHEQUE // PARTIE 1 *----------------------------------------------- * Microsoft COBOL Compiler * Version 2.20 (C)Copyright Microsoft Corp. 1982-87 *----------------------------------------------- IDENTIFICATION DIVISION. *------------------------ PROGRAM-ID. BIBLIO. AUTHOR. NICK. ENVIRONMENT DIVISION. *--------------------- CONFIGURATION SECTION. SOURCE-COMPUTER. CPU1. OBJECT-COMPUTER. CPU1. SPECIAL-NAMES. * DECIMAL-POINTS IS COMA. CURRENCY SIGN IS 'E'. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FLIVRE ASSIGN TO DISK ORGANIZATION INDEXED; ACCESS MODE DYNAMIC; RECORD KEY IS COD OF ENR-LIV; ALTERNATE RECORD TITRE OF ENR-LIV; ALTERNATE RECORD AUTHEUR OF ENR-LIV DUPLICATES; ALTERNATE RECORD THEME OF ENR-TMP DUPLICATES; STATUS SLIV. SELECT FTHEME ASSIGN TO DISK ORGANIZATION RELATIVE; ACCESS MODE DYNAMIC; RELATIVE CLE-THE; STATUS STHE. DATA DIVISION. *-------------- FILE SECTION. FD FLIVRE LABEL RECORD STANDARD; VALUE OF FILE-ID IS "FLIVRE.DAT". 01 ENR-LIV. 02 COD PIC X(5). 02 TITRE PIC X(30). 02 AUTHEUR PIC X(15). 02 THEME PIC 99. 02 QTY-LIV PIC 99. 02 QT-RESTE PIC 99; COMP-0. 01 ENR-TMP REDEFINES ENR-LIV. 02 COD PIC X(5). 02 TITRE PIC X(30). 02 AUTHEUR PIC X(15). 02 THEME PIC XX. 02 QTY-LIV PIC XX. 02 QT-RESTE PIC 99. FD FTHEME LABEL RECORD STANDARD; VALUE OF FILE-ID IS "FTHEME.DAT". 01 ENR-THE. 02 DESC PIC X(20). 02 RAYON PIC X(8). 02 QT-MAX PIC 99. WORKING-STORAGE SECTION. 77 TXT PIC X(30). 77 TMPX PIC X(5). 77 SLIV PIC XX. 77 STHE PIC XX. 77 EOF PIC 9. 77 CPT PIC 999. 77 C PIC 99. 77 CLE-THE PIC 999. 77 FLG PIC 9. 88 OK VALUE 1. 88 KO VALUE 0. 77 DSC-TMP PIC X(20). PROCEDURE DIVISION. *------------------- *MAIN STRUCTURE--------------------------------- INIT. MOVE 0 TO C. DISPLAY "GESTION DE BIBLIOTHEQUE". DISPLAY "-----------------------". PERFORM PROG UNTIL C = 4. STOP RUN. PROG. PERFORM DEBUT-PROG. PERFORM CHK UNTIL SLIV = "00" AND STHE = "00". PERFORM I1-PROG. PERFORM CHK2 UNTIL C > 0 AND C NOT > 4. PERFORM I2-PROG. IF C = 1 PERFORM GES ELSE IF C = 2 PERFORM CLN ELSE IF C = 3 PERFORM PRE ELSE PERFORM ERR. PERFORM FIN-PROG. *TRAITEMENTS------------------------------------ DEBUT-PROG. OPEN INPUT FLIVRE. OPEN INPUT FTHEME. CLOSE FLIVRE. CLOSE FTHEME. CHK. OPEN OUTPUT FLIVRE. OPEN OUTPUT FTHEME. CLOSE FLIVRE, FTHEME. I1-PROG. PERFORM MENU1. ACCEPT C. CHK2. ACCEPT C. I2-PROG. EXIT. FIN-PROG. EXIT. *GESTION DES LIVRES----------------------------- GES. PERFORM D-GES. PERFORM GES1 UNTIL C = 5. D-GES. MOVE 0 TO C, FLG. GES1. PERFORM D-GES1. IF C = 1 PERFORM ANL ELSE IF C = 2 PERFORM ANE ELSE IF C = 3 PERFORM MOD ELSE IF C = 4 PERFORM RCH. */---------- D-GES1. PERFORM MENU2. ACCEPT C. MOVE 0 TO FLG. */ajout nouveau livre--------------------------- * * (ANL) * -OK-> * * [X] (ANL1) [D-] * -OK--> *.anl1 * [F-] (CHK5) [I4-] (CHK4) [I3-] (CHK3) [I2-] (CHK1) [I1-] (THE) [D-] * -c4--> -c3--> -c2--> -c1--> -OK-> * *c1 : C POSITIVE AND C NOT > CPT / c2 : SLIV ="23" / c3 : SLIV="23" / c4 : C POSITIVE *----------------------------------------------- ANL. PERFORM D-ANL. PERFORM ANL1 UNTIL OK. D-ANL. MOVE 0 TO FLG. ANL1. PERFORM D-ANL1. PERFORM THE UNTIL OK. PERFORM I1-ANL1. PERFORM CHK1 UNTIL C POSITIVE AND C NOT > CPT. PERFORM I2-ANL1. PERFORM CHK3 UNTIL SLIV = "23". PERFORM I3-ANL1. PERFORM CHK4 UNTIL SLIV = "23". PERFORM I4-ANL1. PERFORM CHK5 UNTIL C POSITIVE. PERFORM F-ANL1. *//---------- D-ANL1. MOVE 0 TO FLG. I1-ANL1. DISPLAY "THEME ?". ACCEPT C. CHK1. IF C = 0 PERFORM NTH ELSE PERFORM THE. PERFORM F-CHK1. F-CHK1. PERFORM THE. DISPLAY "CHOIX THEME : ". ACCEPT C. I2-ANL1. MOVE C TO THEME OF ENR-TMP. OPEN I-O FLIVRE. DISPLAY "CODE ?". ACCEPT COD OF ENR-LIV. READ FLIVRE. CHK3. ACCEPT COD OF ENR-LIV. READ FLIVRE. I3-ANL1. MOVE COD OF ENR-LIV TO COD OF ENR-TMP. DISPLAY "TITRE ?". ACCEPT TITRE OF ENR-TMP. MOVE TITRE OF ENR-TMP TO TITRE OF ENR-LIV. READ FLIVRE KEY IS TITRE OF ENR-LIV. CHK4. DISPLAY "!", COD OF ENR-LIV, " - ", TITRE OF ENR-LIV, "!". DISPLAY "NOUVEAU TITRE ?". ACCEPT TITRE OF ENR-TMP. MOVE TITRE OF ENR-TMP TO TITRE OF ENR-LIV. READ FLIVRE KEY IS TITRE OF ENR-LIV. I4-ANL1. DISPLAY "AUTHEUR ?". ACCEPT AUTHEUR OF ENR-TMP. DISPLAY "QUANTITE ?". ACCEPT C. CHK5. ACCEPT C. F-ANL1. MOVE C TO QTY-LIV OF ENR-TMP, QT-RESTE OF ENR-TMP. MOVE CORR ENR-TMP TO ENR-LIV. WRITE ENR-LIV. CLOSE FLIVRE. MOVE 1 TO FLG. *----------------------------------------------- */ajout nouvel exemplaire----------------------- * * (ANE) * * [X] (ANE1) [X] * -OK--> * *.ane1 -c3-- -c2-- -c1-- * [X] (X) (AN1) [X] (RCH2)(RCH1) [D-] * *.an1 * [F-] (CH9) [D-] * -c4-> * *c1 : C=1 / c2 : C=2 / c3 : C>0 AND C<3 / c4 : C POSITIVE */----------- ANE. PERFORM ANE1 UNTIL OK. ANE1. PERFORM D-ANE1. IF C = 1 PERFORM RCH1 ELSE IF C = 2 PERFORM RCH2 ELSE DISPLAY "SEUL CHOIX : 1 OU 2". IF C POSITIVE AND C < 3 PERFORM AN1. AN1. PERFORM D-AN1. PERFORM CH9 UNTIL C POSITIVE. PERFORM F-AN1. *//---------- D-ANE1. OPEN I-O FLIVRE. PERFORM MENU3. ACCEPT C. D-AN1. DISPLAY "NOMBRE D'EXEMPLAIRE(S) A AJOUTER ?". ACCEPT C. CH9. ACCEPT C. F-AN1. ADD C TO QTY-LIV OF ENR-LIV, QT-RESTE OF ENR-LIV. REWRITE ENR-LIV. CLOSE FLIVRE. MOVE 1 TO FLG. *----------------------------------------------- */modification des livre----------------------- * * (MOD) * -OK-> * * .mod -c5- -c4- -c3- -c2- -c1- * [F-] (M3) (M2) (M1) [X] (CHA) [I-] (RCH2) (RCH1) [D-] * -c3-> * * .m1 .m3 * [F-] (M11) [D-] [F-] (M31) [D-] * -c6-> -c7-> * *c1 : C=1 / c2 : C=2 / c3 : C POSITIVE AND C NOT > 3 *c3 : C=1 / c4 : C=2 / c5 : C=3 / c6 : SLIV = "23" *c7 : C POSITIVE AND C NOT > CPT *----------------------------------------------- MOD. PERFORM D-MOD. IF C=1 PERFORM RCH1 ELSE IF C=2 PERFORM RCH2. PERFORM I-MOD. PERFORM CHA UNTIL C POSITIVE AND C NOT > 3. IF C=1 PERFORM M1 ELSE IF C=2 PERFORM M2 ELSE IF C=3 PERFORM M3. PERFORM F-MOD. M1. PERFORM D-M1. PERFORM M11 UNTIL SLIV = "23". PERFORM F-M1. M3. PERFORM D-M3. PERFORM M31 UNTIL C POSITIVE AND C NOT > CPT. PERFORM F-M3. *//---------- D-MOD. PERFORM MENU3. DISPLAY "CHOIX 1/2 ?". ACCEPT C. OPEN I-O FLIVRE. I-MOD. DISPLAY "MODIF 1/ TITRE 2/ AUTHEUR 3/ THEME ?". ACCEPT C. CHA. ACCEPT C. D-M1. DISPLAY "NEW TITRE ?". ACCEPT TXT. MOVE TXT TO TITRE OF ENR-LIV. READ FLIVRE KEY IS TITRE OF ENR-LIV. M11. DISPLAY "TITRE EXISTANT: ", TITRE OF ENR-LIV. ACCEPT TXT. MOVE TXT TO TITRE OF ENR-LIV. READ FLIVRE KEY IS TITRE OF ENR-LIV. F-M1. MOVE TMPX TO COD OF ENR-LIV. READ FLIVRE. D-M3. PERFORM THE. DISPLAY "THEME ?". ACCEPT C. M31. ACCEPT C. F-M3. MOVE C TO THEME OF ENR-TMP. M2. DISPLAY "NEW AUTHEUR ?". ACCEPT AUTHEUR OF ENR-TMP. F-MOD. MOVE TXT TO TITRE OF ENR-TMP. DISPLAY "MODIF : ", ENR-TMP. MOVE ENR-TMP TO ENR-LIV. REWRITE ENR-LIV. CLOSE FLIVRE. STOP "PAUSE". *----------------------------------------------- */recherche de livre *-------------------------------------------- * (RCH) * -c1-> *[X] (RCH4) (RCH3) (RCH2) (RCH1) (RCH0) [D-] *c1: ok *-------------------------------------------- RCH. PERFORM D-RCH. IF C = 0 PERFORM RCH0 ELSE IF C = 1 PERFORM RCH1 ELSE IF C = 2 PERFORM RCH2 ELSE IF C = 3 PERFORM RCH3 ELSE IF C = 4 PERFORM RCH4. PERFORM F-RCH. D-RCH. PERFORM MENU3. ACCEPT C. OPEN INPUT FLIVRE. *//listing--------------------------- * (RCH0) * [X] (CH0) [D-] * -c2-> *C2: SLIV = "10" *---------------------------------- RCH0. PERFORM D-RCH0. PERFORM CH0 UNTIL SLIV = "10". *------------------- D-RCH0. MOVE LOW-VALUE TO COD OF ENR-LIV. START FLIVRE KEY IS NOT < COD OF ENR-LIV. CH0. READ FLIVRE NEXT. MOVE CORR ENR-LIV TO ENR-TMP. DISPLAY ENR-TMP. *//par code------------------------- * (RCH1) * [F-] (CH1) [D-] * -c3-> *c3: SLIV = "00" *---------------------------------- RCH1. PERFORM D-RCH1. PERFORM CH1 UNTIL SLIV = "00". PERFORM F-RCH1. *------------------- D-RCH1. DISPLAY "CODE ?". ACCEPT COD OF ENR-LIV. READ FLIVRE. CH1. DISPLAY "LIVRE NON TROUVE / CODE ?". ACCEPT COD OF ENR-LIV. READ FLIVRE. F-RCH1. MOVE COD OF ENR-LIV TO TMPX. MOVE CORR ENR-LIV TO ENR-TMP. DISPLAY ENR-TMP. *//par titre--------------------------- * (RCH2) * [F-] (CH2) [D-] * -c4-> *c4: SLIV = "00" *---------------------------------- RCH2. PERFORM D-RCH2. PERFORM CH2 UNTIL SLIV = "00". PERFORM F-RCH2. *------------------- D-RCH2. DISPLAY "TITRE ?". ACCEPT TITRE OF ENR-LIV. READ FLIVRE KEY IS TITRE OF ENR-LIV. CH2. DISPLAY "TITRE NON TROUVE : TITRE ?". ACCEPT TITRE OF ENR-LIV. READ FLIVRE KEY IS TITRE OF ENR-LIV. F-RCH2. MOVE COD OF ENR-LIV TO TMPX. MOVE CORR ENR-LIV TO ENR-TMP. DISPLAY ENR-TMP. *//par autheur------------------------- * (RCH3) * [x] (CH4) [X] (CH3) [D-] * -c6-> -c5-> *c5: SLIV = "00" *c6: AUTHEUR OF ENR-LIV NOT = TXT OR SLIV = "10" *---------------------------------- RCH3. PERFORM D-RCH3. PERFORM CH3 UNTIL SLIV = "00". PERFORM CH4 UNTIL AUTHEUR OF ENR-LIV NOT = TXT OR SLIV = "10" - . *------------------- D-RCH3. DISPLAY "AUTHEUR ?". ACCEPT TXT. MOVE TXT TO AUTHEUR OF ENR-LIV. READ FLIVRE KEY IS AUTHEUR OF ENR-LIV. CH3. DISPLAY "AUTHEUR NON TROUVE". ACCEPT AUTHEUR OF ENR-LIV. READ FLIVRE KEY IS AUTHEUR OF ENR-LIV. CH4. MOVE CORR ENR-LIV TO ENR-TMP. DISPLAY ENR-TMP. READ FLIVRE NEXT. *//par theme------------------------- * (RCH4) * * [X] (CH6) [I-] (CH5) [D-] * -c8-> -c7-> * * .ch6 -c01- * [F-] (X) (CMN) [X] * *c01: THEME OF ENR-LIV = C *c7 : C POSITIVE AND C NOT > CPT *c8 : SLIV = "10" *---------------------------------- RCH4. PERFORM D-RCH4. PERFORM CH5 UNTIL C POSITIVE AND C NOT > CPT. PERFORM I-RCH4. PERFORM CH6 UNTIL SLIV = "10". CH6. IF THEME OF ENR-LIV = C PERFORM CMN. PERFORM F-CH6. *------------------- D-RCH4. PERFORM THE. DISPLAY "THEME ?". ACCEPT C. CH5. DISPLAY "THEME ?". ACCEPT C. I-RCH4. READ FLIVRE NEXT. CMN. MOVE CORR ENR-LIV TO ENR-TMP. DISPLAY ENR-TMP. F-CH6. READ FLIVRE NEXT. *-------test par enr-tmp.theme----- * RCH4. * PERFORM D-RCH4. * PERFORM CH5 UNTIL C POSITIVE AND C NOT > CPT. * PERFORM I-RCH4. * PERFORM CH6 UNTIL SLIV = "00". * PERFORM CH7 UNTIL SLIV = "23" OR SLIV = "10". * * D-RCH4. * PERFORM THE. * DISPLAY "THEME ?". * ACCEPT C. * CH5. * DISPLAY "THEME ?". * ACCEPT C. * I-RCH4. * MOVE C TO THEME OF ENR-TMP. * READ FLIVRE KEY IS THEME OF ENR-TMP. * CH6. * PERFORM CH5. * MOVE C TO THEME OF ENR-TMP. * READ FLIVRE KEY IS THEME OF ENR-TMP. * CH7. * MOVE ENR-LIV TO ENR-TMP. * DISPLAY ENR-TMP. * READ FLIVRE NEXT. *---------------------------------- F-RCH. CLOSE FLIVRE. STOP "PAUSE". MOVE 1 TO FLG. *----------------------------------------------- *GESTION DES CLIENTS---------------------------- CLN. EXIT. *----------------------------------------------- *GESTION DES PRETS------------------------------ PRE. EXIT. *----------------------------------------------- *AFFICHER THEME--------------------------------- THE. DISPLAY (1, 1) ERASE. DISPLAY "LISTE DES THEMES // 0 - NOUVEAU THEME". PERFORM D-THE. PERFORM ATHE UNTIL EOF=1. PERFORM F-THE. *------------ D-THE. MOVE 0 TO EOF, CLE-THE. OPEN INPUT FTHEME. READ FTHEME NEXT AT END MOVE 1 TO EOF. ATHE. DISPLAY CLE-THE, " - ", DESC. READ FTHEME NEXT AT END MOVE 1 TO EOF. F-THE. MOVE CLE-THE TO CPT. CLOSE FTHEME. MOVE 1 TO FLG. *----------------------------------------------- *ADD new theme --------------------------------- NTH. PERFORM D-NTH. PERFORM RCH-THE UNTIL EOF = 1. PERFORM I-NTH. PERFORM NFO UNTIL RAYON POSITIVE AND QT-MAX POSITIVE. PERFORM F-NTH. RCH-THE. PERFORM DMY. IF DSC-TMP = DESC PERFORM THE-KO ELSE PERFORM DMY. PERFORM F-RCH-THE. *---------------- D-NTH. OPEN I-O FTHEME. DISPLAY "NOUVEAU THEME ?". ACCEPT DSC-TMP. MOVE 0 TO EOF. READ FTHEME NEXT; AT END MOVE 1 TO EOF. THE-KO. DISPLAY "TITRE EXISTANT : ", CLE-THE, " - ", DESC. CLOSE FTHEME. PERFORM D-NTH. F-RCH-THE. READ FTHEME NEXT; AT END MOVE 1 TO EOF. I-NTH. MOVE DSC-TMP TO DESC. DISPLAY "RAYON / QT-MAX ?". ACCEPT RAYON. ACCEPT QT-MAX. NFO. DISPLAY "RAYON / QT-MAX ?". ACCEPT RAYON. ACCEPT QT-MAX. F-NTH. ADD 1 TO CLE-THE. WRITE ENR-THE INVALID KEY DISPLAY "ERROR", STHE. CLOSE FTHEME. *----------------------------------------------- *UTILS------------------------------------------ DMY. EXIT. *\ERREURS----------------------- ERR. EXIT. *MENUS------------------------------------------ MENU1. DISPLAY (1, 1) ERASE. DISPLAY "1/ GESTION DES LIVRES". DISPLAY "2/ GESTION DES CLIENTS". DISPLAY "3/ GESTION DES EMPRUNTS". DISPLAY "4/ QUITTER". MENU2. DISPLAY (1, 1) ERASE. DISPLAY "1/ AJOUTER NOUVEAU LIVRE". DISPLAY "2/ AJOUTER NOUVEL EXEMPLAIRE". DISPLAY "3/ MODIFIER UN LIVRE". DISPLAY "4/ RECHERCHER". DISPLAY "5/ QUITTER". MENU3. DISPLAY (1, 1) ERASE. DISPLAY "0/ LISTER TOUS LES LIVRES". DISPLAY "1/ PAR CODE". DISPLAY "2/ PAR TITRE". DISPLAY "3/ PAR AUTHEUR". DISPLAY "4/ PAR THEME". DISPLAY "5/ QUITTER".
Liens
Autres projets
modifier- Cobol sur wikipédia
Autres sites
modifierDocuments
modifier- http://www.bitsavers.org/pdf/microsoft/cpm/Microsoft_COBOL-80_1978.pdf Documentation de Microsoft COBOL-80
GFDL | Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la licence de documentation libre GNU, version 1.2 ou plus récente publiée par la Free Software Foundation ; sans sections inaltérables, sans texte de première page de couverture et sans texte de dernière page de couverture. |