Search code examples
cobol

Decimal value in an input file if the user inputs to it in COBOL


Another COBOL question here again. I have been playing around with COBOL and the problem is, I have to input a decimal value in the input file. So the output in the input file should look something like this:

2019-00042Alexander Bell           1.501.752.25
...

The numbers are grades in a quiz. 1.00 to 5.00. So I'm assuming in the print line, which is named as INF-PRINT-LINE in my code, I have to declare it as:

01  INF-PRINT-LINE.
    02 SNO-IN PIC X(10).
    02 SNAME-IN PIC X(25).
    02 Q1-IN PIC 9.9(2).
    02 Q2-IN PIC 9.9(2).
    02 Q3-IN PIC 9.9(2).

Now on the WORKING-STORAGE SECTION I have declared three separate variables (STUD-QX-IN) so that I'll move it later on to the INF-PRINT-LINE variables (QX-IN) which can be seen here:

01 STUD-Q1-IN PIC 999.
01 STUD-Q2-IN PIC 999.
01 STUD-Q3-IN PIC 999.

Now, when this program is executed, I'd get a chance to see what's the value of STUD-QX-IN and QX-IN because of the DISPLAY line that will be shown on Column 45 so the program should look now something like this in the command line:

    ENTER STUDENT NUMBER:         2019-00042
    ENTER STUDENT NAME:           Alexander Bell
    ENTER QUIZ 1:                 150       150       0.00
    ENTER QUIZ 2:                 175       175       5.00
    ENTER QUIZ 3:                 225       225       5.00
                             ENTER ANOTHER STUDENT(Y/N)

Now as you can see, what has passed down into the QX-IN variable is just the last digit of STUD-QX-IN, and the input file now would like something like this instead of what I was thinking about:

2019-00042Alexander Bell           0.005.005.00
...

What should I declare on the STUD-QX-IN so that I can pass down the correct value to QX-IN? I did try PIC 9V99 on STUD-QX-IN but it also doesn't work. Is the QX-IN PIC clause value were wrong after all?

Here's the full code:

      * -----------------------------
       IDENTIFICATION DIVISION.
       PROGRAM-ID. exercise.
      * -----------------------------
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
      *    INPUT
           
      *    OUTPUT
           SELECT INF-STUD-GRADES ASSIGN TO "STUDENTGRADES.DAT".
       DATA DIVISION.
       FILE SECTION.
       FD  INF-STUD-GRADES.
       01  INF-PRINT-REC PIC X(80).
       WORKING-STORAGE SECTION.
       *> INPUT THE ANSWER IN THIS SECTION
       01  INF-PRINT-LINE.
           02 SNO-IN PIC X(10).
           02 SNAME-IN PIC X(25).
           02 Q1-IN PIC 9.9(2).
           02 Q2-IN PIC 9.9(2).
           02 Q3-IN PIC 9.9(2).
       01  ANS PIC X VALUE 'Y'.
       01  L PIC 9.
       01 STUD-NO-IN PIC X(10).
       01 STUD-NAME-IN PIC X(25).
       01 STUD-Q1-IN PIC 999.
       01 STUD-Q2-IN PIC 999.
       01 STUD-Q3-IN PIC 999.
       SCREEN SECTION.
       01  BSCRN.
           02  BLANK SCREEN.
       PROCEDURE DIVISION.
           OPEN OUTPUT INF-STUD-GRADES.
           PERFORM INPUT-GRADES-RTN UNTIL ANS = 'N' OR ANS = 'n'.
           PERFORM CLOSE-INPUT-GRADES-RTN.
           PERFORM FINAL-CLOSE-RTN.

       INPUT-GRADES-RTN.
           DISPLAY BSCRN.
           MOVE 4 TO L.
           DISPLAY "ENTER STUDENT NUMBER: " LINE L COLUMN 5.
           ACCEPT STUD-NO-IN LINE L COLUMN 35.
           MOVE STUD-NO-IN TO SNO-IN.
           ADD 1 TO L.
           DISPLAY "ENTER STUDENT NAME: " LINE L COLUMN 5.
           ACCEPT STUD-NAME-IN LINE L COLUMN 35.
           MOVE STUD-NAME-IN TO SNAME-IN.
           ADD 1 TO L.
           DISPLAY "ENTER QUIZ 1: " LINE L COLUMN 5.
           ACCEPT STUD-Q1-IN LINE L COLUMN 35.
           DISPLAY STUD-Q1-IN LINE L COLUMN 45.
           MOVE STUD-Q1-IN TO Q1-IN.
           DISPLAY Q1-IN LINE L COLUMN 55.
           ADD 1 TO L.
           DISPLAY "ENTER QUIZ 2: " LINE L COLUMN 5.
           ACCEPT STUD-Q2-IN LINE L COLUMN 35.
           DISPLAY STUD-Q2-IN LINE L COLUMN 45.
           MOVE STUD-Q2-IN TO Q2-IN.
           DISPLAY Q2-IN LINE L COLUMN 55.
           ADD 1 TO L.
           DISPLAY "ENTER QUIZ 3: " LINE L COLUMN 5.
           ACCEPT STUD-Q3-IN LINE L COLUMN 35.
           DISPLAY STUD-Q3-IN LINE L COLUMN 45.
           MOVE STUD-Q3-IN TO Q3-IN.
           DISPLAY Q3-IN LINE L COLUMN 55.
           ADD 2 TO L.
           
           WRITE INF-PRINT-REC FROM INF-PRINT-LINE BEFORE 1 LINE.

           DISPLAY "ENTER ANOTHER STUDENT(Y/N)" LINE L COLUMN 30.
           ACCEPT ANS.

       CLOSE-INPUT-GRADES-RTN.
           CLOSE INF-STUD-GRADES.

       FINAL-CLOSE-RTN.
           STOP RUN.

Solution

  • You need to move fields defined as 9v99 to the output fields. The v means assumed decimal place.

    What you can do is

        01 work fields
           03 STUD-Q1-IN PIC 999.
           03 STUD-Q1-IN-V redefines STUD-Q1-IN PIC 9v99.
           03 STUD-Q2-IN PIC 999.
           03 STUD-Q2-IN-V redefines STUD-Q2-IN PIC 9v99.
           03 STUD-Q3-IN PIC 999.
           03 STUD-Q3-IN-V redefines STUD-Q3-IN PIC 9v99.
    

    You would then do

               MOVE STUD-Q1-IN-V TO Q1-IN.
    

    You could also do

         compute Q1-IN = STUD-Q1-IN / 100
         end-compute
    

    Redefines keyword

    The Redefines keyword lets you give a different definition to a field

    So if you do

        Move 123     to STUD-Q1-IN.
    

    Then

      STUD-Q1-IN = 123
      STUD-Q1-IN-V = 1.23