已更新如何修复 IF/DISPLAY 和编程数学?

UPDATED How do I fix IF/DISPLAY and program math?

[已更新] 我有一个程序需要打印第一列和第二列的总数(工作中)。然后假设显示第一列的总数除以第二列的总数(.--)(不工作)。然后显示相应的字母等级(不起作用)。然后对测试部分做同样的事情。最后显示总百分比 (.--) 和相应的成绩。(无效)

程序代码:

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
 
       SELECT GRADES-FILE-IN
           ASSIGN TO 'GRADES.SEQ'
           ORGANIZATION IS LINE SEQUENTIAL.
 
       SELECT GRADES-FILE-OUT
           ASSIGN TO 'GRADES.RPT'
           ORGANIZATION IS LINE SEQUENTIAL.
 
   DATA DIVISION.
   FILE SECTION.
   FD  GRADES-FILE-IN.
   01  GRADES-RECORD-IN.
       05  ASG-TEST-ID-IN                 PIC X(14).
       05                                 PIC X.
       05  ACTUAL-POINTS-IN               PIC 9(3).
       05                                 PIC X.
       05  AVAILABLE-POINTS-IN            PIC 9(3).
      
   FD  GRADES-FILE-OUT.
   01  GRADES-RECORD-OUT               PIC X(80).
      
   WORKING-STORAGE SECTION.
   01  ARE-THERE-MORE-RECORDS       PIC X(3)       VALUE 'YES'.
   01  WS-AVERAGE                   PIC XX.
   01  WS-LETTER                    PIC XX.
   01  WS-TOTAL-ACTUAL              PIC 9(4)       VALUE ZERO.
   01  WS-TOTAL-AVAILABLE           PIC 9(4)       VALUE ZERO.
   01  WS-TOTAL-PERCENT             PIC 9V999      VALUE ZERO.
   01  WS-GRAND-TOTAL-ACTUAL        PIC 9(4)       VALUE ZERO.
   01  WS-GRAND-TOTAL-AVAILABLE     PIC 9(4)       VALUE ZERO.
   01  WS-GRAND-TOTAL-PERCENT       PIC 9V99       VALUE ZERO.
   
   01  DETAIL-LINE.
       05  DL-ASG-TEST-ID                  PIC X(14).
       05                                  PIC X(3).
       05  DL-ACTUAL-POINTS                PIC Z,ZZ9.
       05                                  PIC X(3).
       05  DL-AVAILABLE-POINTS             PIC Z,ZZ9.
       
       
       
   01  TOTALS-LINE.
       05                              PIC X(6)       VALUE 'TOTALS'.
       05                              PIC X(11)      VALUE SPACES.
       05  TL-POINTS-ACTUAL            PIC Z,ZZ9.
       05                              PIC X(3)       VALUE SPACES.
       05  TL-POINTS-AVAILABLE         PIC Z,ZZ9.
       05                              PIC X(2)       VALUE SPACES.
       05                              PIC X(7)       VALUE 'Percent'.
       05                              PIC X          VALUE SPACES.
       05                              PIC X          VALUE '='.
       05                              PIC X          VALUE SPACES.
       05  TL-PERCENTAGE               PIC Z.ZZ.
       05                              PIC X(2)       VALUE SPACES.
       05                              PIC X(5)       VALUE 'Grade'.
       05                              PIC X          VALUE SPACES.
       05                              PIC X          VALUE '='.
       05                              PIC X          VALUE SPACES.
       05  TL-LETTER-GRADE             PIC XX.
       
   01  GRAND-TOTALS-LINE.
       05                              PIC X(11)      VALUE 'FINAL GRADE'.
       05                              PIC X(17)      VALUE SPACES.
       05                              PIC X(7)       VALUE 'Percent'.
       05                              PIC X          VALUE SPACES.
       05                              PIC X          VALUE '='.
       05                              PIC X          VALUE SPACES.
       05  GT-PERCENTAGE               PIC Z.ZZ.
       05                              PIC X(2)       VALUE SPACES.
       05                              PIC X(5)       VALUE 'Grade'.
       05                              PIC X          VALUE SPACES.
       05                              PIC X          VALUE '='.
       05                              PIC X          VALUE SPACES.
       05  GT-LETTER-GRADE             PIC XX.
   
   PROCEDURE DIVISION.
   100-MAIN.
       OPEN INPUT GRADES-FILE-IN
       OPEN OUTPUT GRADES-FILE-OUT
       
       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO'
           READ GRADES-FILE-IN
               AT END
                   MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 200-PROCESS-ONE-RECORD
           END-READ
       END-PERFORM
       
       PERFORM 300-PRINT-TOTALS-LINE
       PERFORM 500-PRINT-FINAL-TOTALS-LINE
       
       CLOSE GRADES-FILE-IN
       CLOSE GRADES-FILE-OUT
       STOP RUN.
 
   200-PROCESS-ONE-RECORD.
       IF ASG-TEST-ID-IN = 'Test #1'
           PERFORM 300-PRINT-TOTALS-LINE
       END-IF
       MOVE ASG-TEST-ID-IN TO DL-ASG-TEST-ID    
       MOVE ACTUAL-POINTS-IN TO DL-ACTUAL-POINTS  
       MOVE AVAILABLE-POINTS-IN TO DL-AVAILABLE-POINTS
       MOVE DETAIL-LINE TO GRADES-RECORD-OUT
       WRITE GRADES-RECORD-OUT.
       COMPUTE WS-TOTAL-ACTUAL = WS-TOTAL-ACTUAL + ACTUAL-POINTS-IN
       COMPUTE WS-TOTAL-AVAILABLE = WS-TOTAL-AVAILABLE + AVAILABLE-POINTS-IN.
       COMPUTE WS-TOTAL-PERCENT ROUNDED = WS-TOTAL-ACTUAL / WS-GRAND-TOTAL-AVAILABLE.
           
   300-PRINT-TOTALS-LINE.
       MOVE WS-TOTAL-ACTUAL TO TL-POINTS-ACTUAL
       MOVE WS-TOTAL-AVAILABLE TO TL-POINTS-AVAILABLE
       MOVE WS-TOTAL-PERCENT TO TL-PERCENTAGE
       MOVE TOTALS-LINE TO GRADES-RECORD-OUT
       WRITE GRADES-RECORD-OUT AFTER ADVANCING 1 LINES
       MOVE SPACES TO GRADES-RECORD-OUT
       WRITE GRADES-RECORD-OUT AFTER ADVANCING 3 LINES
       
       ADD WS-TOTAL-ACTUAL TO WS-GRAND-TOTAL-ACTUAL
       ADD WS-TOTAL-AVAILABLE TO WS-GRAND-TOTAL-AVAILABLE
       ADD WS-TOTAL-PERCENT TO WS-GRAND-TOTAL-PERCENT
       
       MOVE ZERO TO WS-TOTAL-ACTUAL
       MOVE ZERO TO WS-TOTAL-AVAILABLE
       MOVE ZERO TO WS-TOTAL-PERCENT.
       
       
   400-CALCULATE-LETTER.
           
       EVALUATE WS-AVERAGE
       WHEN <= .59
           MOVE 'E' TO WS-LETTER
       WHEN <= .66
           MOVE 'D' TO WS-LETTER
       WHEN <= .69
           MOVE 'D+' TO WS-LETTER
       WHEN <= .72
           MOVE 'C-' TO WS-LETTER
       WHEN <= .76
           MOVE 'C' TO WS-LETTER
       WHEN <= .79
           MOVE 'C+' TO WS-LETTER
       WHEN <= .82
           MOVE 'B-' TO WS-LETTER
       WHEN <= .86
           MOVE 'B' TO WS-LETTER
       WHEN <= .89
           MOVE 'B+' TO WS-LETTER
       WHEN <= .94
           MOVE 'A-' TO WS-LETTER
       WHEN OTHER
           MOVE 'A+' TO WS-LETTER
       END-EVALUATE.

   
   500-PRINT-FINAL-TOTALS-LINE.
       MOVE WS-GRAND-TOTAL-PERCENT TO GT-PERCENTAGE
       MOVE WS-AVERAGE TO GT-LETTER-GRADE
       MOVE GRAND-TOTALS-LINE TO GRADES-RECORD-OUT
       WRITE GRADES-RECORD-OUT.

当前的RPT文件打印出这样的:

Assignment #1       10      10
Assignment #2       28      30
Assignment #3       45      50
Assignment #4      109     130
Assignment #5       95     100
Assignment #6        0       0
Assignment #7        0       0
Assignment #8        0       0
Assignment #9        0       0
Assignment #10       0       0

TOTALS             287     320  Percent =       Grade =



Test #1              9      12
Test #2             18      18
Test #3             28      37
Test #4             19      25
Test #5             43      55
Test #6             15      23
Test #7              0       0
Test #8              0       0
Test #9              0       0

TOTALS             132     170  Percent =  .41  Grade =



FINAL GRADE                 Percent =  .41     Grade =

需要像这样打印:

Assignment #1       10      10
Assignment #2       28      30
Assignment #3       45      50
Assignment #4      109     130
Assignment #5       95     100
Assignment #6        0       0
Assignment #7        0       0
Assignment #8        0       0
Assignment #9        0       0
Assignment #10       0       0

TOTALS             287     320  Percent =  .90  Grade = B+


Test #1              9      12
Test #2             18      18
Test #3             28      37
Test #4             19      25
Test #5             43      55
Test #6             15      23
Test #7              0       0
Test #8              0       0
Test #9              0       0

TOTALS             132     170  Percent =  .78  Grade = C


FINAL GRADE                     Percent =  .84  Grade = B-

200 个处理...问题

你有

   COMPUTE WS-TOTAL-ACTUAL = WS-GRAND-TOTAL-ACTUAL + ACTUAL-POINTS-IN
   COMPUTE WS-TOTAL-AVAILABLE = WS-GRAND-TOTAL-AVAILABLE + AVAILABLE-POINTS-IN.
   COMPUTE WS-TOTAL-PERCENT ROUNDED = WS-GRAND-TOTAL-ACTUAL / WS-GRAND-TOTAL-AVAILABLE.

如果您在 - 符号的两边使用相同的变量,这会有所帮助

   COMPUTE WS-TOTAL-ACTUAL = WS-TOTAL-ACTUAL + ACTUAL-POINTS-IN
   COMPUTE WS-TOTAL-AVAILABLE = WS-TOTAL-AVAILABLE + AVAILABLE-POINTS-IN.
   COMPUTE WS-TOTAL-PERCENT ROUNDED = WS-TOTAL-PERCENT ROUNDED / WS-GRAND-TOTAL-AVAILABLE.

400 个问题

添加一些 elseend-if 会有所帮助,同时尝试将值移动到输出记录而不是使用显示

改变

         IF WS-AVERAGE <= .59
               DISPLAY 'E'
         IF WS-AVERAGE <= .66

           IF WS-AVERAGE <= .59
               move 'E'    to ...
           else
              IF WS-AVERAGE <= .66
                 ...
              else
                 ...
              end-if
           end-if

evaluate 声明会是更好的选择

evaluate true
when WS-AVERAGE <= .59
     move 'E'    to ...
when WS-AVERAGE <= .66
     ...

让成绩发挥作用

在300-需要调用400-并将成绩结果移动到输出记录

300-PRINT-TOTALS-LINE。

       MOVE WS-TOTAL-ACTUAL TO TL-POINTS-ACTUAL
       MOVE WS-TOTAL-AVAILABLE TO TL-POINTS-AVAILABLE
       MOVE WS-TOTAL-PERCENT TO TL-PERCENTAGE

       perform 400-CALCULATE-LETTER
       move  WS-LETTER              to TL-LETTER-GRADE

       MOVE TOTALS-LINE TO GRADES-RECORD-OUT
       WRITE GRADES-RECORD-OUT AFTER ADVANCING 1 LINES