已更新如何修复 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 个问题
添加一些 else
和 end-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
[已更新] 我有一个程序需要打印第一列和第二列的总数(工作中)。然后假设显示第一列的总数除以第二列的总数(.--)(不工作)。然后显示相应的字母等级(不起作用)。然后对测试部分做同样的事情。最后显示总百分比 (.--) 和相应的成绩。(无效)
程序代码:
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 个问题
添加一些 else
和 end-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