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 :

[Débutant] Les indices et les index


Sujet :

Cobol

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1
    Points : 2
    Points
    2
    Par défaut [Débutant] Les indices et les index
    Bonsoir,

    J'apprends actuellement de façon autodidacte COBOL, et j'ai des incompréhensions concernant les indices et les index.

    Déjà, j'arrive pas à voir comment on peut affecter un indice à une variable.

    Imaginons que j'ai un tableau regroupant 50 valeurs. Et je fais un programme qui va me donner la valeur la plus grande. Je veux que le programme n'aille pas plus loin que l'indice 40 (soit ma quarantième valeur).

    Comment traduire celà dans le working storage et dans le traitement ? (perform varying...?)

    Voilà si quelqu'un peut me faire un petit topo pour avoir les idées claires.

    Merci

  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
    Citation Envoyé par b0y_95 Voir le message
    Bonsoir,

    J'apprends actuellement de façon autodidacte COBOL, et j'ai des incompréhensions concernant les indices et les index.

    Déjà, j'arrive pas à voir comment on peut affecter un indice à une variable.

    Imaginons que j'ai un tableau regroupant 50 valeurs. Et je fais un programme qui va me donner la valeur la plus grande. Je veux que le programme n'aille pas plus loin que l'indice 40 (soit ma quarantième valeur).

    Comment traduire celà dans le working storage et dans le traitement ? (perform varying...?)

    Voilà si quelqu'un peut me faire un petit topo pour avoir les idées claires.

    Merci
    Bonjour.

    Grosso modo indices et index c'est du pareil au même pour les tableaux. La gestion et les performances ne sont pas identiques.

    Le plus simple, est de commencer par comprendre les indices.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WORKING-SORAGE SECTION.
    77  I PIC 9999 COMP.
    01 MONT-MAX  PIC 9(7)V99 COMP-3.
    01 NUMCLI-MAX  PIC X(7).
    01 MONTANTS-CLIENTS. 
       03 MONTANTS OCCURS 50.
          05 NUMCLIENT  PIC X(7).
          05 MONTANT PIC 9(7)V99 COMP-3.
    Ceci veut dire que j'ai un tableau MONTANTS-CLIENTS qui contient 50 postes MONTANTS. Chaque poste MONTANTS contient deux chapms NUMCLIENT et MONTANT.

    Si je veux accéder au I ième poste ou ses composants, j'utiliserai I comme indice pour les adresser : MONTANTS(I), NUMCLIENT(I), MONTANT(I).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE DIVISION.
    MOVE 0 TO MONT-MAX.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 50
                 IF MONTANT(I) > MONT-MAX 
                    MOVE MONTANT(I) TO MONT-MAX
                    MOVE NUMCLIENT(I) TO NUMCLI-MAX.
    En fait pourquoi ce 40. Tu t'intérese qu'au 40 premiers ?
    On peut écrire ce perform de plusieurs façons et même le traduire par une jolie petite boucle frisée à l'ancienne.
    On peut aussi utiliser la fonction intrinsèque MAX. Celà dépend du compilateur et de son niveau de version.

  3. #3
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    je suis hirs-sujet, mais.....tu n'utilises pas le END-PERFORM? Perso, je trouves que le point à la fin est hyper piégeux à la maintenance; et comme je bosses sur des programmes de 25 ans d'âge, j'ai tendance à faire gaffe à ce genre de détails....

    pour prendre en compte la limite à 40.....en repartant de ton excellent code(je pichouille, mais tes codes sont toujours excellents)
    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
    77  I PIC 9999 COMP.
    77 IND-MAX PIC 9999 COMP.
    77 IND-LIM PIC 9999 COMP.
    01 MONT-MAX  PIC 9(7)V99 COMP-3.
    01 NUMCLI-MAX  PIC X(7).
    01 MONTANTS-CLIENTS. 
       03 MONTANTS OCCURS 50.
          05 NUMCLIENT  PIC X(7).
          05 MONTANT PIC 9(7)V99 COMP-3.
    .................
    PROCEDURE DIVISION.
    MOVE 40 TO IND-MAX
    MOVE 0 TO MONT-MAX
    MOVE SPACES TO NUMCLI-MAX
    COMPUTE IND-LIM =
         ((LENGTH OF MONTANTS-CLIENTS) / (LENGTH OF MONTANTS))
    PERFORM VARYING I FROM 1 BY 1 UNTIL (I > IND-LIM) OR (I > IND-MAX)
                 IF MONTANT(I) > MONT-MAX 
                    MOVE MONTANT(I) TO MONT-MAX
                    MOVE NUMCLIENT(I) TO NUMCLI-MAX
    END-PERFORM
    .
    avec une astuce(que j'ai trouvée ici, dans un autre post) pour éviter de se trimballer en dur la le nombre dl'occurs. Si soudain je passe mon nombre d'occurs à 30 ou à 100, mon code marche toujours.
    Et ma manie de foutre un seul point, à la fin, au cas ou il faille encapsuler sans douleur le code dans un IF, un PERFORM ou un EVALUATE.....Question d'habitude évidemment.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  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
    Salut el_slapper.

    Ce code a été pondu à la volée, rien de génial là dedans et ta remarque sur le END-PERFORM est fortement pertinente. On peut faire encore mieux avec un ODO, un INDEXED BY, un ASCENDING/DESCENDING, un SEARCH.... Mais pour quelqu'un qui débute ça devient vite compliqué, c'est pour ça, par exemple, que je n'ai pas insisté sur l'utilisation des index.

    @b0y_95 : tu vois que le forum est fait pour que plus de gens puissent répondre et apporter éventuellemnt des correctifs, chose que les MP ne permettent pas. Et en plus ça peut profiter à tout le monde.

  5. #5
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    L'intéret de la gestion d'un taleau par index est uniquement la performance, meilleure qu'avec une gestion par indice.
    Quand on veut accéder par exemple au premier poste d'un tableau, on fait un Move 1 to INDICE
    Pour un index on fait un set INDEXE to 1. La différence est que l'index, qui est structement associé à un tableau, contiendra directement l'adresse du poste correspondant à la valeur chargée par l'ordre SET.
    Une recherche dans un tableau via un PERFORM sera donc plus rapide, puisque généré n'aura pas à recalculer l'adresse du poste à chaque nouveau poste.
    Si on donne un INDEX dans le PERFORM, chaque nouveau poste sera simplement obtenu par l'incrément de la longueur du poste.
    Structurellement le Perform ne change pas. Simplement un index n'a pas à être réservé et si on a besoin de le valoriser pour un numéro de poste, ce sera via un ordre SET.
    Pour montrer que la gestion par index n'est guerre plus compliquée, je suis reparti de l'exemple de EL SLAPPER pour 3 cas :
    1 - recherche par indice
    2 - recherche par index
    3 - utilisation d'une fonction et d'un ordre SEARCH
    Le pgm de démo suivant a été compilé et vérifié sous z/OS - Enterprise COBOL.
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
           Identification Division.                                        
           Program-id. COBINDX.                                            
          *------------------------------------------------*               
          * EXEMPLE DE GESTION INDICE / INDEX D'UN TABLEAU *               
          *------------------------------------------------*               
           Environment Division.                                           
          *-----------------------                                         
           Data Division.                                                  
           Working-Storage Section.                                        
          *-----------------------                                         
           01.                                                             
              03               Pic x(9)  value '$COBINDX'.                 
              03 I1            Pic s9(4) binary.                           
              03 I1-MAX        Pic s9(4) binary.                           
              03 IND-LIM       Pic s9(4) binary.                           
              03 INDX-LIM      Index.                                      
              03 MONT-MAX      Pic 9(7)V99 Comp-3.                         
              03 NUMCLI-MAX    Pic X(7).                                   
           01 MONTANTS-CLIENTS.                                            
              03 MONTANTS OCCURS 50                                        
          *                         ajout d'un index                       
                          Indexed by INDX1.                                
                 05 NUMCLIENT  Pic X(7).                                   
                 05 MONTANT    Pic 9(7)V99 COMP-3.                         
          *-------------------                                             
           Procedure Division.  
          *-------------------                                           
           DEBUT-PROGRAMME.                                              
          *----------------*                                             
          * valorisation du tableau pour tests                           
               Perform INITIALISATION                                    
          * Cas 1 : recherche par indice                                 
               Perform TRAITEMENT-INDICE                                 
               Perform AFFICHER-RESULTAT                                 
          * Cas 2 : recherche par index                                  
               Perform TRAITEMENT-INDEX                                  
               Perform AFFICHER-RESULTAT                                 
          * Cas 3 : recherche par fonction                               
               Perform TRAITEMENT-FONCTION                               
               Perform AFFICHER-RESULTAT                                 
               Move zero to Return-Code                                  
               Stop Run.                                                 
                                                                         
           INITIALISATION.                                               
          * initialisation du nombre de postes du tableau
          * (calcul, effectivement plus malin qu'un Move 50 to IND-LIM)                
               Compute IND-LIM =                                         
                 ((Length Of MONTANTS-CLIENTS) / (Length Of MONTANTS))   
          * initialisation de valeurs de test.                           
               Initialize       MONTANTS-CLIENTS                         
               Move 100      to MONTANT(10)                              
               Move 'MINI'   to NUMCLIENT(10)                            
               Move 200      to MONTANT(11)  
               Move 'MEDIAN' to NUMCLIENT(11)                            
               Move 500      to MONTANT(12)                              
               Move 'MAXI'   to NUMCLIENT(12)                            
                            .                                            
                                                                         
           TRAITEMENT-INDICE.                                            
          * Cas 1 : gestion par indice                                   
               Perform Varying I1 From 1 BY 1 Until I1 > IND-LIM         
                  If MONTANT(I1) > MONT-MAX                              
                           Move I1            To I1-MAX                  
                           Move MONTANT(I1)   To MONT-MAX                
                           Move NUMCLIENT(I1) To NUMCLI-MAX              
                  End-if                                                 
               End-Perform                                               
                           .                                             
           TRAITEMENT-INDEX.                                             
          * Cas 2 : recherche par indexes.                               
          *    Valorisation index maxi                                   
               Set  INDX1    to IND-LIM                                  
               Set  INDX-LIM to INDX1                                    
          *    INDX1 = index associé à la table. Non déclaré en WSS      
               Perform Varying INDX1 from 1 BY 1 Until INDX1 > INDX-LIM  
                  If MONTANT(INDX1) > MONT-MAX                           
          *                Valorisation no poste maxi et valeurs         
                           Set  I1-MAX           To INDX1                
                           Move MONTANT(INDX1)   To MONT-MAX             
                           Move NUMCLIENT(INDX1) To NUMCLI-MAX           
                  End-if                                                    
               End-Perform                                                  
                              .                                                 
           TRAITEMENT-FONCTION.                                             
          * Cas 3 : recherche par fonction et ordre search                  
               Compute MONT-MAX  = function max(MONTANT(ALL))               
               Set     INDX1 to 1                                           
               Search  MONTANTS                                             
                  When  MONTANT(INDX1) not LESS MONT-MAX                    
          *                Valorisation no poste maxi et valeurs            
                           Set  I1-MAX           To INDX1                   
                           Move NUMCLIENT(INDX1) To NUMCLI-MAX              
                           Display 'Poste trouvé='  I1-MAX                  
               End-Search                                                   
                            .                                               
           AFFICHER-RESULTAT.                                               
          * Display du numero de poste maxi et des valeurs                  
               Display 'Indice Max = '    I1-MAX                            
               Display 'Client Max = '    NUMCLI-MAX                        
                       ', Montant Max = ' MONT-MAX                          
          *    Réinit pour cas de test suivant                              
               Move Zero              to  I1-Max                            
                                          MONT-MAX                          
               Move Space             to  NUMCLI-MAX                        
                              .                                                  
           End program COBINDX.

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

Discussions similaires

  1. [OSG] Resortir les vertices et les Indices d'un modèle.
    Par tyke91 dans le forum OpenSceneGraph
    Réponses: 3
    Dernier message: 27/05/2008, 16h22
  2. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  3. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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