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

Contribuez Discussion :

estUnNumerique


Sujet :

Contribuez

  1. #1
    Inactif  
    estUnNumerique
    Bonjour,

    Dans la même lancée que ce matin, un tout petit programme destiné à nous permettre de vérifier si une saisie est numérique.

    Il a été choisi parmi d'autres solutions proposées.

    ___

    Il prend en entrée une saisie, 10 caractères (on peut le modifier dans le CS)

    En sortie, un indicateur, 1 non numérique, 0 numérique, ainsi que l'entier retourné.
    ___
    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
          **************************************************************************
          *0011111111112222222222333333333344444444445555555555666666666677*7777777*
          *8901234567890123456789012345678901234567890123456789012345678901*3456789*
          **************************************************************************
           IDENTIFICATION DIVISION.
           PROGRAM-ID. estUnNumerique.
           AUTHOR. Deallyra.
           DATE-WRITTEN. 14-03-2009.
           DATE-COMPILED. 14-03-2009.
           
          *    ***************
          *    VERIFICATION D'UNE SAISIE NUMERIQUE
          *    ***************
          
           ENVIRONMENT DIVISION.
           DATA DIVISION.
           WORKING-STORAGE SECTION.
               01 W-CNT PIC 9.
           LINKAGE SECTION.
          *    Une saisie "numérique"
               01 W-ALPHANUMERIQUE PIC X(10).
          *    Le résultat
               01 W-INVALIDE PIC 9.
               01 W-NUMERIQUE PIC X(10).
          *************************************************************************      
          *0011111111112222222222333333333344444444445555555555666666666677*7777777*
          *8901234567890123456789012345678901234567890123456789012345678901*3456789*
          **************************************************************************
           PROCEDURE DIVISION USING W-ALPHANUMERIQUE W-INVALIDE W-NUMERIQUE.
          
          *    ***************
          *    Spécifiations fonctionnelles
          *
          *    Le nombre passé en paramètre est contrôlé.
          *      Est-ce un nombre ou une chaîne de caractère ?
          *
          *    W-ALPHANUMERIQUE             Input
          *      La saisie que l'on reçoit en paramètre.
          *    W-INVALIDE
          *      1 si la saisie est invalide, non numérique
          *      0 sinon.
          *    ***************
           DEBUT.
          
          *    On considère la saisie comme étant invalide, non numérique
               MOVE 1 TO W-INVALIDE
    
          *  On vérifie la saisie reçue
               INSPECT W-ALPHANUMERIQUE REPLACING LEADING  ' ' BY '0'
               MOVE FUNCTION REVERSE(W-ALPHANUMERIQUE) TO W-NUMERIQUE
               MOVE 0 TO W-CNT
               INSPECT W-NUMERIQUE TALLYING W-CNT FOR LEADING SPACE
               COMPUTE W-CNT = LENGTH OF W-ALPHANUMERIQUE - W-CNT
               IF W-ALPHANUMERIQUE(1:W-CNT) IS NUMERIC THEN
                 MOVE 0 TO W-INVALIDE
                 MOVE W-ALPHANUMERIQUE(1:W-CNT) TO W-NUMERIQUE
               END-IF
               EXIT PROGRAM
           FIN.
               EXIT.
    et le petit test :
    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
          **************************************************************************
          *0011111111112222222222333333333344444444445555555555666666666677*7777777*
          *8901234567890123456789012345678901234567890123456789012345678901*3456789*
          **************************************************************************
           IDENTIFICATION DIVISION.
           PROGRAM-ID. test.
           AUTHOR. Deallyra.
           DATE-WRITTEN. 14-03-2009.
           DATE-COMPILED. 14-03-2009.
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
           DATA DIVISION.
           FILE SECTION.
           WORKING-STORAGE SECTION.
               01 W-ALPHANUMERIQUE PIC X(10).
               01 W-NUMERIQUE PIC 9(10).
               01 W-CONTROLE PIC 9.
           SCREEN SECTION.
           PROCEDURE DIVISION.
           DEBUT.
               MOVE "abc" TO W-ALPHANUMERIQUE
               CALL "estUnNumerique" USING
                 BY CONTENT W-ALPHANUMERIQUE,
                 BY REFERENCE W-CONTROLE W-NUMERIQUE.
               DISPLAY W-CONTROLE"|"W-NUMERIQUE
               ADD 1 TO W-NUMERIQUE
               DISPLAY W-NUMERIQUE
               MOVE "123" TO W-ALPHANUMERIQUE
               CALL "estUnNumerique" USING
                 BY CONTENT W-ALPHANUMERIQUE,
                 BY REFERENCE W-CONTROLE W-NUMERIQUE.
               DISPLAY W-CONTROLE"|"W-NUMERIQUE
               ADD 1 TO W-NUMERIQUE
               DISPLAY W-NUMERIQUE
               ACCEPT W-CONTROLE
               EXIT PROGRAM
           FIN.
               EXIT.
    ___

    Je suis ouverte à toutes les possibilités d'amélioration du code

    Merci à vous.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Inactif  
    Bonjour,

    J'ai trouvé une erreur à mon code que je n'arrive pas à résoudre.

    Dès que la saisie que je passe au sous-programme n'est pas déclarée PIC X(10), mais X(6) ou X(8), X(n), le numérique n'est plus reconnu.

    Même si je bouge la saisie vers un X(10).

    par exemple, un MOVE "ldz" vers la zone de saisie nous retournera 0, la saisie est reconnue en tant que numérique.

    Donc code buggé, désolée
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  3. #3
    Membre à l'essai
    kikoo toi,

    Ca ne va pas ce que tu as fait...

    Regardes ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MOVE W-ALPHANUMERIQUE(1:W-CNT) TO W-NUMERIQUE
    Les déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    01 W-ALPHANUMERIQUE PIC X(10).
    01 W-NUMERIQUE PIC X(10).
    Si je suis ton algo, tu pars d'une chaine quelconque ..123..... (je symbolise les espaces par des points).
    Te remplaces les points initiaux par des 0 : 00123.....
    Tu utilises reverses : .....32100
    Tu comptes les nombres d'espaces : 5
    Ensuite : 10 -5 = 5
    Tu prends en suite les cc 1 à 5 de 00123..... : 00123
    et tu mets ça dans la zones w-numerique... Ben ça, ça fait que tu as : 0012300000 dans w-numerique

  4. #4
    Inactif  
    En effet...

    Mais c'est le même problème si W-NUMERIQUE est déclaré en 9(10), avec un alignement à droite cette fois ci.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  5. #5
    Membre à l'essai
    Ah ah Padawan du Cobol...

    si tu utilises Reverse sur du Pic 9... m'est avis qu'il ne va pas aimer... MAIS ce n'est que mon avis

  6. #6
    Inactif  
    Hum... Je ne vois pas comment résoudre mon problème sinon
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  7. #7
    Membre à l'essai
    Le problème vient que tu ne peux pas déplacer aussi facilement que ça du pic X dans du pic 9.

    Si tu déplaces ..123... tu auras 00123000.

    Si tu utilises reverses, tu auras 00032100, ton algo se basant sur les leading spaces...

    Tu as plusieurs possibilités pour régler ton problème :
    A-
    Tu déplaces dans une zone intermédiaire ton nombre tu as :
    123......., tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SUBTRACT W-CNT FROM 10 GIVING WC-CNT
    MOVE W-ALPAHNUMERIQUE (1 : W-CNT) TO W-ZONETEMP (WC-CNT:10)
    MOVE W-ZONETEMP TO W-NUMERIQUE
    B-
    Tu écris une petite boucle simpliciste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PERFORM VARYING ITER FROM 1 BY 1
         UNTIL ITER > 10
       IF W-ALPHANUMERIQUE (ITER : 1) IS NUMERIC
          MULTIPLY W-NUMERIQUE BY 10
          ADD W-ALPHANUMERIQUE (ITER : 1) TO W-NUMERIQUE
       END-IF
    END-PERFORM
    Deux façons de résoudre ton problème de numéricité
    Mais il y en a d'autres, le principal n'est pas la solution, mais que ça marche à la fin.

  8. #8
    Membre confirmé

    Si tu déplaces ..123... tu auras 00123000.
    Pas si simple, visiblement ça va dépendre de la plateforme et du compilateur.
    Pour parler de ce que je connais, avec Enterprise COBOL z/OS, seul le caractère de droite sera forcé à numérique si la zone réceptrice est en PIC 9, Display et de même longueur.
    Un moyen de mettre tout ce monde d'accord quand on move du Pix X sur du pic 9, les redefines ou les reference qualifiers
    Move DATA-IN to DATA-OUT(1:length of DATA-OUT)

    Une donnée DISPLAY qui utilise les réference qualifiers est toujours traitée comme si elle était de picture X.

    si tu utilises Reverse sur du Pic 9... m'est avis qu'il ne va pas aimer... MAIS ce n'est que mon avis
    Vrai quand on ne travaille avec du numérique, mais dans ce cas précis, avec Enterprise COBOL en tous cas, ça marche. Sinon, la règle pour les fonctions COBOL: on fait un MOVE FUNCTION quand on travaille avec une constante ou de l'alpha numérique et un COMPUTE result = FUNCTION quand on travaille avec du PIC 9.
    Il faut décidément que je retrouve la dizaine de pages de résumé des apports COBOL norme ANSI 2002. cette restriction devrait disparaître mais c'est encore vrai en tous cas avec Enterprise Cobol z/OS. Dès que je retrouve, je le mettrais à dispo.
    Dernier point, pour un module général pourquoi ne pas communiquer la longueur de la zone de communication ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     CALL 'COBTSNUM' USING WSS-WORK BY CONTENT LENGTH OF WSS-WORK
    Si on tient compte du premier octet qui rend numérique ou non, il devient facile de calculer la longueur de la donnée à vérifier (longueur totale -1, / 2), égale à la longueur de la donnée à restituer, constitutive, cadrée et numérisée.
    Comme on travaille sur des longueurs calculées, on les utilise avec des référence qualifiers donc en alpha numérique, donc aucun pb quelque soit la plateforme.
    Je ne suis pas certain d'être clair et je vais donc tester ce W.E. un COBOL avant de le soumettre à l'épreuve des balles.

  9. #9
    Membre confirmé
    Bon, jai testé ça (Enterprise Cobol z/OS).
    * 2 sources inclus. Le premier lit un fichier des cas de test, le second est le module de contrôle de numéricité d'un montant cadré à gauche pour le restituer cadré à droite, immédiatement après le montant à vérifier.
    Le code de ce dernier est un peu plus long, mais c'est écrit pour accepter n'importe quelle longueur de montant de 1 à 31 (maximum possible pour des opérations numériques avec 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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
           Identification Division.
           PROGRAM-ID. VSAISIE.
          *---------------------*                                           
          * - Lecture d'un fichier de test qui contient la longueur d'un    
          *           et le montant dont on veut vérifier la validité       
          * - Appel d'un programme CSAISIE qui controle ce montant          
          *  (en source interne pour validation de tous les cas de tests)   
          *---------------------*                                           
           Environment Division.                                            
          *---------------------*                                           
           Configuration Section.                                           
           Input-Output Section.
           File-Control.
               Select FICIN Assign to SYSIN.
           Data Division.
           File Section.
           FD  FICIN
               Recording mode is F
               Block 0.
           01  FICHIER-TEST.
               05 FICIN-DATA-LG   PIC 9(3).
               05 FICIN-DATA      PIC X(77).
    
           Working-Storage Section.
           01  WS-WORK.
               05  WS-LECTURE       pic X.
               88  FINI             Value '1'.
               05  WS-COUNT         Pic s9(8) Binary.
               05  WS-COMM.
                   10  WS-COMM-RET  pic x.
                   10  WS-COMM-DATA pic x(64).
    
           Procedure Division.
               Move space to WS-WORK
               Open Input FICIN.
               Perform until FINI
                  Read FICIN
                     At End Set FINI to TRUE
                     Not At End
                        Display 'LIGNE : ' FICHIER-TEST(1:40)
                        If FICIN-DATA-LG numeric and
                           FICIN-DATA-LG not = ZERO
                           Compute WS-COUNT = FICIN-DATA-LG
                                            + FICIN-DATA-LG + 1
                           Move FICIN-DATA   to WS-COMM-DATA
                           CALL 'CSAISIE' Using WS-COMM WS-COUNT
                           Display 'RENDU :   ' WS-COMM(1:65)
                        End-if
                  End-Read
               End-Perform
    
               Close FICIN
               Goback.
    
           Identification Division.
           PROGRAM-ID. CSAISIE.
          *==============================================================*
          * Module de contrôle de numéricité d'un montant cadré à gauche *
          * de 1 à 31 caractères =maximum en pic 9 ;z/OS si ARITH(EXTEND)*
          * Reçoit l'adresse d'une zone de communication et sa longueur  *
          * sur un mot pour CALL 'CSAISIE' Using ZCOMM                   *
          *                                By Content length of ZCOM     *
          * Reçoit dans la zone de communication un code retour rendu à :*
          * Blanc si le montant cadré à gauche est numérique             *
          *            (mais en tenant compte de blancs éventuels devant)*
          * 'E'   si la longueur recue est invalide ou oubliée           *
          * '0'   si le montant cadré à gauche est n'est pas numérique   *
          * Ce code retour est suivi du montant de 1 à 32 caractères,    *
          * Lequel est lui même suivi du montant restitué cadré à droite *
          *==============================================================*
           Data Division.
           Working-Storage Section.
           01 WS.
              05 WS-PTR          Pointer.
              05 WS-LENGTH       Pic  s9(4) Binary.
              05 WS-COUNT        Pic  s9(4) Binary.
              05 WS-RESTIT       Pic  s9(4) Binary.
              05 WS-DATA         Pic  x(33).
    
           Linkage Section.
          *================
           01  LS-ZCOMM.
               05  LS-RET        Pic  x.
               05  LS-DATA       Pic  x(64).
           01  LS-LONGUEUR       Pic  s9(8) Binary.
    
           Procedure Division using LS-ZCOMM LS-LONGUEUR.
          *    On élimine les cas de longueur reçue invalide
               Move   'E'   to            LS-RET
               Set WS-PTR   to address of LS-LONGUEUR
               if  WS-PTR      = NULL  or
                   LS-LONGUEUR = ZERO  or Greater 65 Then Goback
               End-if
    
          *    Longueur ZCOM valide : calcul longeur du montant à traiter
          *    Code retour non numérique par défaut.
               Move   '0'  to           LS-RET
               Compute WS-LENGTH = ((LS-LONGUEUR - 1) / 2)
    
          *    Donnée de restitution calculée et initialisée à zéro
               Compute WS-RESTIT = WS-LENGTH + 1
               Move ZERO to LS-DATA(WS-RESTIT:WS-LENGTH)
    
          *    Gestion du montant reçu
               Move function REVERSE(LS-DATA(1:WS-LENGTH)) to WS-DATA
               Move    Zero     to        WS-COUNT
               Inspect WS-DATA  Tallying  WS-COUNT  For Leading Space
               Add     WS-COUNT to WS-RESTIT
               Compute WS-COUNT  = WS-LENGTH - WS-COUNT
               If WS-COUNT > 0
          *       Si MONTANT à blancs WS-COUNT = 0, sinon restit. si OK
                  Inspect LS-DATA(1:WS-COUNT) Replacing Leading ' ' BY '0'
                  If LS-DATA(1:WS-COUNT)      is Numeric
                     Move Space               to LS-RET
                     Move LS-DATA(1:WS-COUNT) to LS-DATA(WS-RESTIT:WS-COUNT)
                  End-if
               End-if
               Goback.
           End Program CSAISIE.
    
           End Program VSAISIE.

###raw>template_hook.ano_emploi###