IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Cobol Discussion :

Traitement de fichier séquentiel de données numériques


Sujet :

Cobol

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Traitement de fichier séquentiel de données numériques
    Bonjour, je cherche a faire un programme en cobol mais apres avoir lu la doc et tout, j'éprouve encore les pires difficultés à le realiser.

    En fait j'essaie avec un fichier contenant 30 enregistrements qui sont des nombres sur 5 positions, de faire un prog qui me ressort a la fin:
    -Les valeurs qui sont positives.
    -Celles qui sont negatives.
    -De sortir aussi la valeur la plus elevee ainsi que la plus petite tout en donnant sa position dans le fichier.

    Et je voudrais sortir le nombre de valeurs negatives, positives et nulles.

    Bon en logique je sais que je dois lire le premier nombre.
    Le sotcker dans une variable (plusgrand, pluspetit).
    Que je dois lire le nombre suivant et le tester par rapport a "plusgrand" et "pluspetit" avec des IF pour voir si c'est toujours le plus grand ou le plus petit ainsi que si il est negatif, incrementer une variable compteurnegatif, si il est positif compteurpositif et si il est nulle, compteurnulle.

    Que en // aussi je dois garder l'indice d'enregistrement pour savoir la position du nombre dans le fichier de depart.

    Et que au final je dois faire un DISPLAY des valeurs trouvees.

    Mais mon gros souci est que je patauge totalement dans tout le language des que je dois mettre ca en pratique...

    Je ne sais pas si quelqu'un sur ce forum saurait me depanner en me proposant une solution que je puisse m'inspirer pcq je ne m'y retrouve plus?

    Tout ce que j'ai su sortir en Cobol, c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
           IDENTIFICATION DIVISION.
           PROGRAM-ID. nombres.
    
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
                    FILE-CONTROL.
                    SELECT fileEntree ASSIGN TO "fileentree.cpt".
                    ACCESS MODE IS SEQUENTIAL.
    
           DATA DIVISION.
           FILE DIVISION.
           FD fileEntree.
             01 fileentree.
               02 nombre   PIC 9(5).
    
           WORKING-STORAGE SECTION.
           01 fileEntree.
              05 NAME PIC 9(5).
           77 pluspetit PIC 9(5).
           77 plusgrand PIC 9(5).
           77 pospluspetit PIC 9(2).
           77 postplusgrand PIC 9(2).
           77 nbrpositif PIC 9(2).
           77 nbrnegatif PIC 9(2).
           77 nbrnulles PIC 9(2)
    
           PROCEDURE DIVISION.
           MAIN.
               OPEN INPUT fileEntree.
               READ fileEntree INTO fileEntree
    
               READ fileEntree NEXT
    
    
           STOP RUN.
    Je cale surtout sur le fait de comment recuperer les données du fichier.
    Je ne comprend pas bien, pcq ici je vois que des exemples avec des buffers, d'autre sans puis avec des clef et tout ca et j'avoue etre un peu perdu...

    Merci d'avance

  2. #2
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    votre souci est la cinématique de fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    IDENTIFICATION DIVISION.
    PROGRAM-ID. nombres.
    
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
         SELECT ENT ASSIGN TO "fileentree.cpt"
         ACCESS MODE IS SEQUENTIAL.
    
    DATA DIVISION.
    FILE DIVISION.
    FD ENT.
    01 ENT-ENR.
       02 ENT-nombre PIC 9(5).
    
    WORKING-STORAGE SECTION.
    
    
    PROCEDURE DIVISION.
    MAIN.
        OPEN INPUT ENT.
    LECT.
        READ ENT AT END GO TO FIN.
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123
        ici ENT-ENR est alimenté et donc ENT-NOMBRE disponible
        faites vos traitements
    GO TO LECT. FIN. CLOSE ENT STOP RUN.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Pour compléter la réponse d'HRS, je ne sais pas si sur ton OS c'est le cas mais le COBOL est rarement Case sensitive.

    Je te conseille donc de donner un nom logique au fichier (SD ENT) différent de la zone de FILE SECTION dans laquelle l'enregistrement sera stocké (01 ENT-ENR).

    La commande READ x INTO y permet, en plus du chargement du record lu en FILE SECTION (x), de stocker les mêmes données ailleurs (y) en FILE SECTION, WORKING SECTION ou autres.

    A utiliser selon les nécessités de programmation mais pas obligatoire.

    Cordialement
    Fred

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Un grand merci en tout cas, j'y vois déjà nettement plus clair!
    Pour le compilateur, j'uilise NetExpress sous Windows XP Pro Edition.

    Merci

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut Autres remarques et exemple
    Re-salut

    Si tu veux pouvoir tester des nombres négatifs, il te faut signer le nombre dans le fichier d'entrée ainsi que les zones destinées à recevoir le plus petit et le plus grand.
    Sinon, tu n'auras que du positif.
    De plus, dans ton fichier d'entrée, tu ne pourras pas saisir un négatif avec le signe "-".
    S9(5) en étendu signifie que ta zone comporte 5 chiffres plus le signe mais n'occupe que 5 octets. Le signe est en général confondu avec la position la plus à droite :
    91 donne 00091
    -91 doit donné 0009A
    92 donne 00092
    -92 doit donné 0009B et ainsi de suite.
    A vérifier ! Cela dépend peut-être des OS.

    Voici un exemple de ce que pourrait être ton programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
           IDENTIFICATION DIVISION.
           PROGRAM-ID. nombres.
           
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
                SELECT ENT ASSIGN TO "fileentree.cpt"
                ACCESS MODE IS SEQUENTIAL.
           
           DATA DIVISION.
           FILE DIVISION.
           FD ENT.
           01 ENT-ENR.
              02 ENT-NOMBRE PIC S9(5).
           
           WORKING-STORAGE SECTION.
           77 PLUSPETIT PIC S9(5) VALUE 99999.
           77 PLUSGRAND PIC S9(5) VALUE -99999.
           77 POSPLUSPETIT PIC 9(2) VALUE 0.
           77 POSTPLUSGRAND PIC 9(2) VALUE 0.
           77 NBRPOSITIF PIC 9(2) VALUE 0.
           77 NBRNEGATIF PIC 9(2) VALUE 0.
           77 NBRNULLES PIC 9(2) VALUE 0.
           
           77 COMPTEUR  PIC 9(2) VALUE 0.
    
           77  W-EOF                        PIC 9 VALUE 0.
             88  EOF                         VALUE 1.
           
           PROCEDURE DIVISION.
           
               OPEN INPUT ENT
               PERFORM UNTIL EOF
                 READ ENT
                   AT END
                     SET EOF TO TRUE
                   NOT AT END
                     PERFORM COMPTAGE
                 END-READ
               END-PERFORM
               
          * mettre ici les display
               CLOSE ENT
               STOP RUN. 
                 
           COMPTAGE.      
               ADD 1 TO COMPTEUR  
               EVALUATE ENT-NOMBRE
                 WHEN POSITIVE
                   ADD 1 TO NBRPOSITIF
                 WHEN NEGATIVE        
                   ADD 1 TO NBRNEGATIF
                 WHEN OTHER
                   ADD 1 TO NBRNULLES
               END-EVALUATE
               
               IF ENT-NOMBRE > PLUSGRAND
                 MOVE COMPTEUR TO POSPLUSGRAND
                 MOVE ENT-NOMBRE TO PLUSGRAND 
               END-IF 
               
               IF ENT-NOMBRE < PLUSPETIT
                 MOVE COMPTEUR TO POSPLUSPETIT
                 MOVE ENT-NOMBRE TO PLUSPETIT 
               END-IF.
    A ta dispo si nécessaire.
    Fred

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Je regarde
    Merci pour l'exemple, c'est sympas de ta part

    EDIT: Bon ok la je peux dire que j'ai bien compris l'accès séquentiel sur un fichier.
    Un grand merci en tout cas!

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bon, je me suis penche sur un exercice un peu plus complexe que le precedent.
    Cette fois ci j'ai su faire un peu plus que la premiere fois (bon signe^^) mais j'ai encore quelques souci dedant.

    En fait l'exercice que j'essaie de faire cette fois ci consiste a afficher sur base d'un fichier contenant des enregistrements, les personnes qui ont un age compris entre 30 et 40ans inclus et dont leur salaire au sein de l'entreprise est compris entre 1200 et 1800 euros inclus.

    Bon, j'ai fait sur base de la fiche que je dispose la repartition des données pour les recuperer et ce enregistrement par enregistrement mais il me sort des erreur de compilation qui je pense sont des erreurs de syntaxe.

    Dans mon exemple je me base juste sur l'annee pour calculer l'age de la personne car la date de naissance est fourni dans le fichier avec 2 positions pour l'annee, 2 pour le mois et 2 pour le jour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
           IDENTIFICATION DIVISION.
           PROGRAM-ID. nombres.
    
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
           SELECT ENT ASSIGN TO "filegens.cpt"
           ACCESS MODE IS SEQUENTIAL.
    
           DATA DIVISION.
           FILE SECTION.
                   FD ENT.
                       01 ENT_nom PIC X(20).
                       01 ENT_prenom PIC X(15).
                       01 ENT_adresse PIC X(30).
                       01 ENT_annee PIC 9(2).
                       01 ENT_mois PIC 9(2).
                       01 ENT_jour PIC 9(2).
                       01 ENT_sar PIC 9(7).
    
    
    
           WORKING-STORAGE SECTION.
    *      Je declare les variables vont vont m'etre utiles dans le prog.
           77 AGE PIC 9(3).
           77 SALAIRE PIC 9(10).
           77 ANNEEACTU PIC 9(2).
           77 MOISACTU PIC 9(2).
           77 JOUR ACTU PIC 9(2).
    
           77 W-EOF PIC 9 VALUE 0.
           88 EOF VALUE 1.
    
           PROCEDURE DIVISION.
    *      On demande a l'utilisateur de specifier la date actuelle.
           DISPLAY "Encodez l'annee".
           ACCEPT ANNEEACTU.
           DISPLAY "Encodez le mois".
           ACCEPT MOISACTU.
           DISPLAY "Encodez le jour".
           ACCEPT JOURACTU.
    *      On ouvre en entree le fichier.
           OPEN INPUT ENT
    *      On va jusqu'a la fin de celui-ci (end of file).
           PERFORM UNTIL EOF
    *      On lit le premier enregistrement.
           READ ENT
    *      On calcule l'age de la personne.
           COMPUTE AGE = ANNEEACTU - ENT_annee.
    *      On verifie si il a entre 30 et 40ans.
           IF AGE < 40
               IF AGE > 29
    *      On test alors si son salaire est entre 1200 et 1800euro.
                   IF ENT_sar < 1200
                       IF ENT_sar > 1800
    *      Alors on affiche son nom et prenom.
                           DISPLAY ENT_nom.
                           DISPLAY ENT_prenom.
    *      On ferme tous les IF.
           END-IF
           END-IF
           END-IF
           END-IF
           AT END
           SET EOF TO TRUE
           END-READ
           END-PERFORM
    
           CLOSE ENT
           STOP RUN.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Salut,

    Tu ne peux avoir qu'un niveau 01 par enregistrement (si tu +s 01, cela correspond a un fichier multi-enregistrements, parfois avec longueur variable).


    FD ENT.
    01 ENT-ENR .
    05 ENT_nom PIC X(20).
    05 ENT_prenom PIC X(15).
    05 ENT_adresse PIC X(30).
    05 ENT_annee PIC 9(2).
    05 ENT_mois PIC 9(2).
    05 ENT_jour PIC 9(2).
    05 ENT_sar PIC 9(7).

    Quand tu lis, c'est toujours un fichier (car tu ne sais pas a priori a quel enregistrement il correspond dans le cas d'un fichier multi-enreg) : READ ENT

    Quand tu écris, c'est toujours un enregistrement (pour le même motif).
    WRITE ENT-ENR

    Concernant le bloc READ, te ne peux pas intercaler de commande entre le READ et le AT END

    READ ENT -> déclenche la lecture
    AT END -> executé en cas de fin de fichier
    END-READ
    suite des commandes

    Dans ton cas, si tu replace le AT END après le READ, tu auras un problème à la détection de fin de fichier car le test du perform se fait en début de boucle. Le read va detecter la fin de fichier et va mettre EOF a TRUE puis tu vas exécuter les commandes entre le END-READ et le END-PERFORM :
    PERFORM UNTIL EOF
    ...
    READ
    AT END SET EOF TO TRUE
    END-READ
    ...
    END-PERFORM

    Plusieurs façon d'y remédier :
    Remplacer le SET EOF TO TRUE par un appel au bloc de fermeture comprenant tes display, le close de fichier, et le stop run. Comme ça, pas de retour possible.
    Mettre les commandes a exécuter si présence de fichier après la commande NOT AT END. Il exécutera ainsi, soit le pavé de fin, soit l'autre.
    Utiliser une structure de programme plus à l'ancienne :

    PERFORM LECTURE (d'initialisation)
    PERFORM UNTIL EOF
    saisir ici les commandes de traitement de ton enregistrement
    PERFORM LECTURE (après traitement de ton enreg, nelle lecture)
    END PERFORM
    ...
    STOP RUN.
    LECTURE.
    READ ENT (lecture d'initialisation)
    AT END SET EOF TO TRUE
    END-READ.


    Attention de ne pas laisser trainer de "." intempestif en fin de phrase si tu utilises les end-if.
    Le IF se termine après un point ou après le END-IF.
    Ton DISPLAY ENT_nom va mettre fin au IF. Le reste sera traité dans tous les cas ou erreur de compile plutôt.
    Le point est seulement obligatoire en fin de paragraphe dans la PROCEDURE DIVISION.

    Dernière chose, évite les imbrications de IF trop importantes.
    Tu peux regrouper tes conditions :
    IF (AGE > 29 AND < 41) AND (ENT-SAR >1200 AND < 1800)

    Tu peux aussi déclarer des booléens :
    77 AGE PIC 9(3).
    88 AGE-OK VALUE 30 thru 40.
    AGE-OK est un booléen qui est TRUE si la zone qui le précèdent (AGE) à sa valeur entre 30 et 40.

    IF AGE-OK AND SALAIRE_OK ...

    A toi de bosser.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok merci, je vais refaire ca sur bases de test conseils.
    Oui au niveau syntaxe, je suis plus habitué a celle du Java ou du C, c'est surtout ca mon gros defaut en Cobol.
    Encore merci

    Edit: oui donc avec les if en fait les . sont comme des ; en C
    Pour les condition regroupée, je savais que ca existait en C mais je ne savais pas comment le noter en Cobol.
    En tout cas cette fois c'est noté (ca fait vite moins de lignes )

    ReEdit: J'ai une erreur de compilation que je ne comprend pas.
    Il me dit qu'il a un verb non reconnu la dedant:

    ELSE (MOISACTU = ENT-mois) AND (JOURACTU < ENT-jour) AND
    (ENT-sar > 1199 AND ENT-sar < 1801)

    mais syntaxiquement je ne vois rien qui me semble mauvais.

    Il entend quoi exactement par le mot "Unreconized Verb" ?

    Oula je viens de me rendre compte de la stupidite de ce que j'ai ecrit...
    Une condition sur un else.... (ok je vais me jeter...)
    On mettra ca sur le dos de la fatigue :-/

    Voila ca marche maintenant, merci en tout cas.

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 62
    Points
    62
    Par défaut
    Il aurait fallu en effet que tu colles un IF après le ELSE.

    Rassure-toi. Niveau syntaxe, j'ai les mêmes problèmes que toi, mais pour le C et le Java.

    Bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/05/2010, 14h43
  2. Réponses: 1
    Dernier message: 10/02/2009, 08h46
  3. Récupérer les données numériques d'un fichier text
    Par casper84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 11/01/2008, 22h21
  4. Réponses: 4
    Dernier message: 11/09/2006, 13h47
  5. fichiers séquentiels indexés VS base de données relationnell
    Par Clotilde dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 22/08/2005, 06h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo