3
votes

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.
1

1 Answers

5
votes

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