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 :

Recherche de maximum


Sujet :

Cobol

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Recherche de maximum
    Bonjour tout le monde,

    J'aimerais prendre le maximum d'une ligne et le mettre dans une variable.

    J'utilise cette ligne de code pour affecter le maximum dans la variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MOVE FUNCTION MAX(LIGNES(ALL)) TO MAXIMUM
    La ligne contient ceci :

    15624

    et le maximum est 4. pas normal

    Les autres lignes sont :

    79356 il me dit que s'est 6 le maximum
    15877 Il me dit que s'est 6 le maximum alors qu'il n'y a aucun 6

    Voici mon code.

    Merci d'avance pour votre aide.

    beegees

    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
    71
    72
    73
    74
    75
           IDENTIFICATION DIVISION.
           PROGRAM-ID. EXREV1.
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
          *ici il faut changer par le nom du fichier
               SELECT FICH-SAI ASSIGN "FICHTXTEX02.txt"
                   ORGANIZATION IS LINE SEQUENTIAL
                   ACCESS MODE IS SEQUENTIAL.
    
           DATA DIVISION.
          *Variables fichiers
           FILE SECTION.
           FD FICH-SAI.
           01 TABLE-SAI.
              02 TAB-FICH-SAI.
                 88 FIN-SAI   VALUE HIGH-VALUES.
          *ici il faut mettre le nombre d'élément qu'il y'a par ligne X
          *TIMES
          *On a besoin QUE de la ligne ici et pas de la colonne
               03 CHIFFR.
                   04 SAI-CHIFR PIC 9 OCCURS 5 TIMES.
          *Autres variables (77...)
           WORKING-STORAGE SECTION.
           01 Tableau.
               02 LIGNES OCCURS 3 TIMES.
                   03 COLONNES PIC 9 OCCURS 5 TIMES.
           77 I PIC 99.
           77 J PIC 99.
           77 MAXIMUM PIC 9.
    
    
    
           PROCEDURE DIVISION.
           BEGIN.
    
               MOVE 0 TO I.
               MOVE 0 TO J.
    
    
          * Ouverture en lecture uniquement du fichier
               OPEN INPUT FICH-SAI.
    
          * Lecture du 1er enregistrement (lecture d'une ligne)
               READ FICH-SAI
                  AT END SET FIN-SAI TO TRUE
               END-READ.
    
               PERFORM UNTIL (FIN-SAI)
               ADD 1 TO I
    
                   MOVE CHIFFR TO LIGNES(I)
          * Lecture des autres enregistrements (une ligne à chaque fois)
                   PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5
                       DISPLAY COLONNES(I,J) "     " WITH NO ADVANCING
                   END-PERFORM
    
                   MOVE FUNCTION MAX(LIGNES(ALL)) TO MAXIMUM
    
                   DISPLAY "LE MAXIMUM DE CETTE LIGNE EST " MAXIMUM
    
                   DISPLAY SPACES
    
    
    
          *        Lecture de l'enregistrement suivant
                   READ FICH-SAI
                      AT END SET FIN-SAI TO TRUE
                   END-READ
    
    
    
    
               END-PERFORM.
           STOP RUN.

  2. #2
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Salut beegees.

    Tu t'es fait avoir

    Voyons voir. En décorticant ton pgm, je le comprends le pauvre :
    LIGNES(ALL) veut dire tu parcours toutes les lignes.
    Remarque en passant, le I n'est pas initialisé à 0 avant le PERFORM, c'est une erreur à rectifier).

    - 1er tour du PERFORM :
    LIGNES(1) = 15624 LIGNES(2) = 00000 LIGNES(3) = 00000
    le maximum de ces 3 nombres est 15624, MAXIMUM = 4, c'est bon (un seul chiffre, celui du droite : règle du move des numériques)

    - 2è tour du PERFORM :
    LIGNES(1) = 15624 LIGNES(2) = 79356 LIGNES(3) = 00000
    le maximum de ces 3 nombres est 79356, MAXIMUM = 6, c'est bon.

    - 3è tour du PERFORM :
    LIGNES(1) = 15624 LIGNES(2) = 79356 LIGNES(3) = 15877
    le maximum de ces 3 nombres est toujours 79356, MAXIMUM = 6, c'est bon.

    Donc pour le pgm, il n'y pas de lézard.

    Par contre si toi tu cherches le maximum des chiffres de chaque ligne, il faut écrire ta fonction MAX autrement : pour une ligne (donc pour un I fixé), chercher le max des chiffres (pour tous les J, donc J =ALL)

    Je te laisse l'écrire.

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut Hédhili Jaïdane,

    Merci pour ta réponse complète qui m'a permis de comprendre mon erreur.

    J'ai cherché et voici ce qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                   PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5
                       MOVE FUNCTION MAX(COLONNES(I,ALL))TO MAXIMUM
                   END-PERFORM
    Je vais t'avouer que je ne comprends pas tout :

    - Est-ce indispensable d'avoir un PERFORM dans ce cas ?
    - J'ai essayé de remplacé le ALL par J mais ça n'a pas été (pourquoi ?)

    Je te remercie encore pour ton aide vraiment très précieuse.

    beegees

  4. #4
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par beegees Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
                       MOVE FUNCTION MAX(COLONNES(I,ALL))TO MAXIMUM
    Je vais t'avouer que je ne comprends pas tout :

    - Est-ce indispensable d'avoir un PERFORM dans ce cas ?
    - J'ai essayé de remplacé le ALL par J mais ça n'a pas été (pourquoi ?)
    ...
    C'est bon pour la fonction. Le PERFORM est inutile et inapproprié. Laisse la fonction dans sa place telle que dans le 1er post.

    Le ALL veut dire je parcours tous les J et je prends le MAX. Si tu cherches le MAX par tes propres moyens en faisant varier le J, il faut faire une comparaison et prendre l'élément qui est toujours > aux autres.

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Hédhili Jaïdane Voir le message
    C'est bon pour la fonction. Le PERFORM est inutile et inapproprié. Laisse la fonction dans sa place telle que dans le 1er post.

    Le ALL veut dire je parcours tous les J et je prends le MAX. Si tu cherches le MAX par tes propres moyens en faisant varier le J, il faut faire une comparaison et prendre l'élément qui est toujours > aux autres.
    Re-salut Hédhili Jaïdane,

    Merci pour ta réponse.

    J'ai supprimé le PERFORM et ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MOVE FUNCTION MAX(COLONNES(I,ALL))TO MAXIMUM
    Un tout grand merci à toi pour ton efficacité et pour ta disponibilité.

    beegees

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

Discussions similaires

  1. recherche du maximum
    Par benyamin dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 17/04/2008, 14h37
  2. Recherche du maximum d'une série de cellule
    Par Lechette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/03/2008, 10h13
  3. Recherche de maximum
    Par mat_de_lyon dans le forum MATLAB
    Réponses: 6
    Dernier message: 19/02/2008, 22h51
  4. Réponses: 6
    Dernier message: 02/04/2007, 14h20
  5. Recherche du maximum
    Par tchraad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/06/2005, 17h44

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