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 :

Inverser la position d'un nombre avec un autre sans utiliser de IF


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 Inverser la position d'un nombre avec un autre sans utiliser de IF
    Bonjour tout le monde,

    Je suis occupé à faire un exercice qui consiste à inverser les colonnes d'un tableau comme le montre l'exemple ci-dessous :

    333639883256

    devient

    563288393633 (le dernier devient le premier...)

    Je me demandais si il y'avait une fonction qui permettait de le faire sans devoir utiliser IF THEN END IF.

    J'ai essayé ceci :

    MOVE FUNCTION REVERSE(TA2(I,J)) TO TA2(I,NB-K)

    Mais il inverse les nombres avant de les positionner au bon endroit, ça donne avec l'exemple ci-dessus :

    652388936333

    Merci d'avance pour votre aide.

    beegees

    PS: voici mon code :

    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
    108
    109
           IDENTIFICATION DIVISION.
           PROGRAM-ID. ExamenCobol2eSession.
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
          *AssignATION NOM PHYSIQUE - NOM LOGIQUE
           SELECT FICH2008 ASSIGN "tableaux.txt"
           ORGANIZATION IS LINE SEQUENTIAL
           ACCESS MODE IS SEQUENTIAL.
    
           DATA DIVISION.
           FILE SECTION.
           FD FICH2008.
             01 STRUCTURE.
                02 TAB-FICH.
          *Permet de savoir si on est à la fin du fichier
                     88 FIN-FICH   VALUE HIGH-VALUES.
          *Ici on a besoin que de la ligne
          *Je crée un niveau supplémentaire car plus facile de copier la
          *ligne dans le tableau.
                      03 CHIFR.
                         04 C PIC 99 OCCURS 8 TIMES.
    
           WORKING-STORAGE SECTION.
          *TABLEAU
            01 TABLEAU.
          *les lignes du tableau
              03 TA1 OCCURS 4 TIMES.
          *les colonnes
              04 TA2 PIC XX OCCURS 6 TIMES.
    
           77 I PIC 99.
           77 J PIC 99.
          * NB-K : nombre de colonne et K la constante de ces colonnes
           77 K PIC 9 VALUE 6.
           77 NB-K PIC 9.
          * VASE : vase pour la permutation des données
           77 VASE PIC 99 VALUE 0.
    
    
           PROCEDURE DIVISION.
           PAR.
          ***************DEBUT DU CODE DE L'AFFICHAGE A L'ECRAN*************
    
          *Ouverture du fichier en lecture
           OPEN INPUT FICH2008.
    
          *Ce I va servir à sélectionner la colonne du tableau
           MOVE 0 TO I.
          *Lecture de la première ligne
           READ FICH2008
              AT END SET FIN-FICH TO TRUE
           END-READ
    
          *Tant qu'on est pas à la fin du fichier
           PERFORM UNTIL FIN-FICH
           ADD 1 TO I
    
           MOVE CHIFR TO TA1(I)
    
           READ FICH2008
               AT END SET FIN-FICH TO TRUE
           END-READ
    
           END-PERFORM.
           CLOSE FICH2008.
    
               DISPLAY "************************************".
               DISPLAY "*        TABLEAU DE DEPART         *".
               DISPLAY "************************************".
    
           AFFICH-TAB.
          * Affichage du tableau
               PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
                 PERFORM VARYING J FROM 1 BY 1 UNTIL J > 6
                    DISPLAY TA2(I,J) " " WITH NO ADVANCING
                 END-PERFORM
                 DISPLAY ' '
               END-PERFORM.
          **************FIN DU CODE DE L'AFFICHAGE A L'ECRAN****************
    
           TRAITEMENT.
               DISPLAY " ".
               DISPLAY "************************************".
               DISPLAY "*        TABLEAU ARRIVEE           *".
               DISPLAY "************************************".
    
    
          * Traitement de l'information
               MOVE K TO NB-K.
               PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
                 PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
          *         Si on avait un nombre de colonne impaire on ne devrait
          *         pas remplacer la colonne du milieu
                    IF TA2(I,J) <> TA2(I,NB-K)
    
                   MOVE FUNCTION REVERSE(TA2(I,J)) TO TA2(I,NB-K)
    
          *         Si on avait un nombre de colonne impaire on ne devrait
          *         pas remplacer la colonne du milieu
    
                    END-IF
                    ADD -1 TO NB-K
                 END-PERFORM
                    MOVE K TO NB-K
               PERFORM AFFICH-TAB.
    
    
           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
    Bonjour beegess.
    Citation Envoyé par doc IBM
    The REVERSE function returns a character string that is exactly the same length as the argument, whose characters are exactly the same as those specified in the argument, except that they are in reverse order.
    Donc la fonction REVERSE inverse l'ordre des charactères dans une zone alphanumérique. "ABCD" devient "DCBA". C'est comme si tu le lisais en sens inverse.
    Comme dans ton exemple tu veux inverser l'ordre de nombres de 2 chiffres dans une suite, ça ne marche pas.
    La bonne inversion devrait se faire par le MOVE d'un élément de la ligne I de la position J (colonne) à la position NB-K en passant par la zone de travail de permutation VASE.

  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 ne vois pas l'utilité du IF. En fait, tu as déjà quasiment tout dans ta boucle d'affichage. Sur le compteur secondaire J, tu calcules un compteur J2 qui vaut 7 - J, et tu places l'occurence J dans l'occurence J2. Quand la boucle est finie, hop, l'inversion est faite.

    Hedhili a raison, il faut éviter la fonction dans ce cas là. Elle ne marche que pour paquets de 1 seul caractères.
    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
    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
    Bonjour beegess.

    Donc la fonction REVERSE inverse l'ordre des charactères dans une zone alphanumérique. "ABCD" devient "DCBA". C'est comme si tu le lisais en sens inverse.
    Comme dans ton exemple tu veux inverser l'ordre de nombres de 2 chiffres dans une suite, ça ne marche pas.
    La bonne inversion devrait se faire par le MOVE d'un élément de la ligne I de la position J (colonne) à la position NB-K en passant par la zone de travail de permutation VASE.
    Citation Envoyé par el_slapper Voir le message
    Je ne vois pas l'utilité du IF. En fait, tu as déjà quasiment tout dans ta boucle d'affichage. Sur le compteur secondaire J, tu calcules un compteur J2 qui vaut 7 - J, et tu places l'occurence J dans l'occurence J2. Quand la boucle est finie, hop, l'inversion est faite.

    Hedhili a raison, il faut éviter la fonction dans ce cas là. Elle ne marche que pour paquets de 1 seul caractères.
    Bonjour,

    Merci à vous deux pour vos réponses.

    J'ai donc laisser le move pour ce genre d'opération.

    Je vous remercie encore pour votre aide.

    beegees

  5. #5
    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
    Bonjour,

    Merci à vous deux pour vos réponses.

    J'ai donc laisser le move pour ce genre d'opération.

    Je vous remercie encore pour votre aide.

    beegees
    Oui mais est ce que le résultat est bon ? enfin celui que tu attendais.

  6. #6
    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
    Oui mais est ce que le résultat est bon ? enfin celui que tu attendais.
    Le résultat attendu est rencontré, merci de t'en enquiêter.

    C'est juste que le Prof souhaîte qu'on utilise des fonctions et non des boucles pour l'exam.

    Merci encore.

    beegees

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

Discussions similaires

  1. Travailler avec JSP/Access sans utiliser des servlets
    Par sonia5 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 25/02/2010, 11h24
  2. comparaison une serie de nombre avec une autre serie
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/07/2007, 19h24
  3. sum avec des nombres avec virgule
    Par Bruno2000 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/09/2004, 15h01
  4. [Format]nombres avec des 0
    Par zozolh2 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 01/06/2004, 08h43

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