Page 2 of 3

Re: modulus operation

PostPosted: Fri Aug 16, 2013 3:53 am
by BillyBoyo
A less CPU-strenuous version:

 01  WS-VARS.
      05  WS-DATA                 PIC X(44)
      VALUE '11245668796981831928381768678756'.
      05  WS-REDEF                REDEFINES WS-DATA.
          10  WS-A                PIC 9(09).
          10  WS-B                PIC 9(07).
          10  WS-C                PIC 9(07).
          10  WS-D                PIC 9(07).
          10  WS-E                PIC X(14).
      05  WS-B1-CALC              PIC 9(09).
      05  FILLER REDEFINES WS-B1-CALC.
          10  WS-A1-REMAINDER     PIC 99.
          10  WS-B1               PIC 9(07).
      05  WS-C1-CALC              PIC 9(09).
      05  FILLER REDEFINES WS-C1-CALC.
          10  WS-B1-REMAINDER     PIC 99.
          10  WS-C1               PIC 9(07).
      05  WS-D1-CALC              PIC 9(09).
      05  FILLER REDEFINES WS-D1-CALC.
          10  WS-C1-REMAINDER     PIC 99.
          10  WS-D1               PIC 9(07).
      05  WS-E1-STRING           PIC X(16).
      05  FILLER REDEFINES WS-E1-STRING.
          10  WS-D1-REMAINDER     PIC 99.
          10  WS-E1               PIC X(14).
      05  WS-E1-CALC              PIC 9(16).
      05  WS-E-NUM                PIC 9(14).
      05  WS-MODULUS-VALUE        PIC 9(02) VALUE 97.
      05  WS-RESULT               PIC 9(02).
      05  WS-E-DIGITS             PIC 9(02).
      05  WS-DIVISOR              PIC 9(09).
      05  WS-DIVIDEND             PIC 9(09).
 PROCEDURE DIVISION.
                                                         
     MOVE WHEN-COMPILED           TO W-WHEN-COMPILED
     DIVIDE WS-A BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-A1-REMAINDER
     MOVE WS-B TO WS-B1
     MOVE WS-C TO WS-C1
     MOVE WS-D TO WS-D1
     MOVE WS-E TO WS-E1
     DIVIDE WS-A BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-B1-REMAINDER
     DIVIDE WS-B1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-B1-REMAINDER
     DIVIDE WS-C1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-C1-REMAINDER
     DIVIDE WS-D1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-D1-REMAINDER
     DIVIDE WS-D1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-D1-REMAINDER
     UNSTRING WS-E1-STRING DELIMITED BY SPACE
         INTO WS-E1-CALC
     DIVIDE WS-E1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-RESULT
     DISPLAY 'FIRST  DIVISION ' WS-A ' ' WS-A1-REMAINDER
     DISPLAY 'SECOND DIVISION ' WS-B ' ' WS-B1-REMAINDER
     DISPLAY 'THIRD  DIVISION ' WS-C ' ' WS-C1-REMAINDER
     DISPLAY 'FOURTH DIVISION ' WS-D ' ' WS-D1-REMAINDER
     DISPLAY 'SECOND DIVISION ' WS-E ' ' WS-RESULT
                                                         
     GOBACK
     .


Output is:

FIRST  DIVISION 112456687 28     
SECOND DIVISION 9698183 20       
THIRD  DIVISION 1928381 86       
FOURTH DIVISION 7686787 59       
SECOND DIVISION 56             39


The remainder is preprended to a copy of each segment of the input. The final one, with a variable number of digits prepended with the previous remainder, is made into a number using UNSTRING to a numeric field. It will even work when the last 14 bytes are blank, because there will always be a numeric value (the remainder from the previous calculation).

Re: modulus operation

PostPosted: Fri Aug 16, 2013 3:35 pm
by rajitha_nair01
Robert Sample wrote:. As long as the 31st through 44th digits are not all zero, the code will process correctly.



and what if a series of 22 charachters is provided as an input.

And is there any way to try the same thing without using intrinsic functions?

Re: modulus operation

PostPosted: Fri Aug 16, 2013 4:06 pm
by rajitha_nair01
BillyBoyo wrote:A less CPU-strenuous version:

 01  WS-VARS.
      05  WS-DATA                 PIC X(44)
      VALUE '11245668796981831928381768678756'.
      05  WS-REDEF                REDEFINES WS-DATA.
          10  WS-A                PIC 9(09).
          10  WS-B                PIC 9(07).
          10  WS-C                PIC 9(07).
          10  WS-D                PIC 9(07).
          10  WS-E                PIC X(14).
      05  WS-B1-CALC              PIC 9(09).
      05  FILLER REDEFINES WS-B1-CALC.
          10  WS-A1-REMAINDER     PIC 99.
          10  WS-B1               PIC 9(07).
      05  WS-C1-CALC              PIC 9(09).
      05  FILLER REDEFINES WS-C1-CALC.
          10  WS-B1-REMAINDER     PIC 99.
          10  WS-C1               PIC 9(07).
      05  WS-D1-CALC              PIC 9(09).
      05  FILLER REDEFINES WS-D1-CALC.
          10  WS-C1-REMAINDER     PIC 99.
          10  WS-D1               PIC 9(07).
      05  WS-E1-STRING           PIC X(16).
      05  FILLER REDEFINES WS-E1-STRING.
          10  WS-D1-REMAINDER     PIC 99.
          10  WS-E1               PIC X(14).
      05  WS-E1-CALC              PIC 9(16).
      05  WS-E-NUM                PIC 9(14).
      05  WS-MODULUS-VALUE        PIC 9(02) VALUE 97.
      05  WS-RESULT               PIC 9(02).
      05  WS-E-DIGITS             PIC 9(02).
      05  WS-DIVISOR              PIC 9(09).
      05  WS-DIVIDEND             PIC 9(09).
 PROCEDURE DIVISION.
                                                         
     MOVE WHEN-COMPILED           TO W-WHEN-COMPILED
     DIVIDE WS-A BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-A1-REMAINDER
     MOVE WS-B TO WS-B1
     MOVE WS-C TO WS-C1
     MOVE WS-D TO WS-D1
     MOVE WS-E TO WS-E1
     DIVIDE WS-A BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-B1-REMAINDER
     DIVIDE WS-B1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-B1-REMAINDER
     DIVIDE WS-C1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-C1-REMAINDER
     DIVIDE WS-D1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-D1-REMAINDER
     DIVIDE WS-D1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-D1-REMAINDER
     UNSTRING WS-E1-STRING DELIMITED BY SPACE
         INTO WS-E1-CALC
     DIVIDE WS-E1-CALC BY WS-MODULUS-VALUE
        GIVING WS-DIVISOR
        REMAINDER WS-RESULT
     DISPLAY 'FIRST  DIVISION ' WS-A ' ' WS-A1-REMAINDER
     DISPLAY 'SECOND DIVISION ' WS-B ' ' WS-B1-REMAINDER
     DISPLAY 'THIRD  DIVISION ' WS-C ' ' WS-C1-REMAINDER
     DISPLAY 'FOURTH DIVISION ' WS-D ' ' WS-D1-REMAINDER
     DISPLAY 'SECOND DIVISION ' WS-E ' ' WS-RESULT
                                                         
     GOBACK
     .


Output is:

FIRST  DIVISION 112456687 28     
SECOND DIVISION 9698183 20       
THIRD  DIVISION 1928381 86       
FOURTH DIVISION 7686787 59       
SECOND DIVISION 56             39


The remainder is preprended to a copy of each segment of the input. The final one, with a variable number of digits prepended with the previous remainder, is made into a number using UNSTRING to a numeric field. It will even work when the last 14 bytes are blank, because there will always be a numeric value (the remainder from the previous calculation).






just to know:

just to tell you. i mite get numbers that are smaller than 31 too.

and this code dint work for

111023200000435195001213180

just an expample i tried.

correct me if i am wrong in using your code.

Re: modulus operation

PostPosted: Fri Aug 16, 2013 4:12 pm
by Akatsukami
rajitha_nair01 wrote:And is there any way to try the same thing without using intrinsic functions?

COBOL intrinsic functions will not attack you the moment you take your eye off of them.

Re: modulus operation

PostPosted: Fri Aug 16, 2013 4:32 pm
by rajitha_nair01
Akatsukami wrote:
rajitha_nair01 wrote:And is there any way to try the same thing without using intrinsic functions?

COBOL intrinsic functions will not attack you the moment you take your eye off of them.




thats right indeed!!

but we here are asked to use intrinsic functions only if there is no otjer way out. STANDARDS!!!!...

Re: modulus operation

PostPosted: Fri Aug 16, 2013 4:37 pm
by BillyBoyo
Since you set out the 9,7,7,7 yourself, I'm a little surpised that you can have fewer than 30 digits, and freely admit I didn't cater for it.

However, by applying the same technique as I used for the last field to any field which may contain (or be entirely) trailing space, you can easily overcome the mis-description.

Continuing with the two-digit remainder after your number has ended is not a problem, but you can also avoid it by testing the last byte of any possible "space" fields for being space, and knowing that you don't then need to go further.

Re: modulus operation

PostPosted: Fri Aug 16, 2013 4:41 pm
by BillyBoyo
Yes, you can avoid using intrinsic FUNCTIONs. Since they are only here for the "last part" of your data, you already have a non-FUNCTION way to deal with it, and there are any number of others.

Re: modulus operation

PostPosted: Fri Aug 16, 2013 4:58 pm
by Robert Sample
and what if a series of 22 charachters is provided as an input.

And is there any way to try the same thing without using intrinsic functions?
All right, you need to stop and define the rules for us. Your data contained fields of 9, 7, 7, 7 bytes or 30 bytes total with 14 additional bytes after that. If you can have only 22 bytes then the code could be written to check each 7-byte field to be numeric and if not use NUMVAL on it. You would also need to build in some logic to check for all spaces since 22 bytes means the last 7-byte field would be all spaces. Since you are only giving us pieces of the picture, we will let you figure out the code changes to implement such a strategy -- once you've fully defined the rules.

And why would you want to code up without intrinsic functions? They are a part of COBOL just like the STRING statement and in their place just as useful. It would not be hard (merely tedious) to move the 9-byte and 7-byte fields, one byte at a time using reference modification (or arrays), to a variable that is redefined as numeric -- but why bother when the intrinsic functions provide what is needed?

You have solutions to your original problem -- so now you need to stop trying to change the rules on us and go implement one of the solutions.

Re: modulus operation

PostPosted: Fri Aug 16, 2013 5:01 pm
by rajitha_nair01
BillyBoyo wrote:Since you set out the 9,7,7,7 yourself, I'm a little surpised that you can have fewer than 30 digits, and freely admit I didn't cater for it.


its not somthing i thought of. thats an algorithm fr somthing that we are workingg here. its just a way to acheive what is required.

Re: modulus operation

PostPosted: Fri Aug 16, 2013 5:09 pm
by rajitha_nair01
thanks all for ur replies. will figure out snthing based on all of your solutions.