添加两个整数在 cobol 中给出不需要的结果
Adding two integers giving unwanted result in cobol
我正在将文件读入 table,请注意第一行不是 table 的一部分。
1000
MS 1 - Join Grps Group Project 5 5
Four Programs Programming 15 9
Quiz 1 Quizzes 10 7
FORTRAN Programming 25 18
Quiz 2 Quizzes 10 9
HW 1 - Looplang Homework 20 15
在代码中,table表示如下:
01 GRADES.
05 GRADE OCCURS 1 TO 100 TIMES DEPENDING ON RECORD-COUNT INDEXED BY J.
10 ASSIGNMENT-NAME PIC X(20).
10 CATEGORY PIC X(20).
10 POINTS-POSSIBLE PIC 9(14).
10 POINTS-EARNED PIC 9(14).
我还有一些其他累加器变量指定用于稍后计算 sums/percentages。
01 RECORD-COUNT PIC 9(8) VALUE 0.
01 TOTAL-EARNED-POINTS PIC 9(14).
01 TOTAL-POSSIBLE-POINTS PIC 9(14) VALUE 0.
我的问题是,当我逐行阅读记录时,我想执行以下操作:
ADD POINTS-EARNED(RECORD-COUNT) TO TOTAL-EARNED-POINTS
其中 RECORD-COUNT
是迭代中的当前位置。
我希望在第一次迭代后 TOTAL-EARNED-POINTS
的值只是 5
,对吗?
但是,当我 DISPLAY
TOTAL-EARNED-POINTS 的值时,控制台显示:
50000000000000
这是50万亿吗?或者它是数字 5 的一个有趣的表示形式?
我怎样才能写这个,以便我可以用它做正确的数学运算来打印正确的成绩报告?
编辑:我知道可能有更好的方法来编写这个程序,但我在尝试编写这个程序之前从未使用过 cobol,而且我可能不会再使用它,或者至少在很长一段时间内不会使用它很久。这是针对 class,所以只要我能正确打印我的输出,我就很好。
到目前为止的完整代码:
IDENTIFICATION DIVISION.
PROGRAM-ID. GRADEREPORT.
AUTHOR. JORDAN RENAUD.
DATE-WRITTEN. 09/18/2020.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT GRADES-FILE ASSIGN TO "bill"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD GRADES-FILE.
01 INPUT-TOTAL-POINTS PIC 9(4).
01 INPUT-GRADES.
05 INPUT-GRADE OCCURS 1 to 100 TIMES DEPENDING ON RECORD-COUNT INDEXED BY I.
10 INPUT-ASSIGNMENT-NAME PIC X(20).
10 INPUT-CATEGORY PIC X(20).
10 INPUT-POINTS-POSSIBLE PIC 9(14).
10 INPUT-POINTS-EARNED PIC 9(14).
WORKING-STORAGE SECTION.
77 GRADES-FILE-EOF PIC 9.
01 RECORD-COUNT PIC 9(8) VALUE 0.
01 TOTAL-EARNED-POINTS PIC 9(4) VALUE ZERO.
01 TOTAL-POSSIBLE-POINTS PIC 9(14) VALUE 5.
01 K PIC 9(14) VALUE 1.
01 TMP PIC 9(14).
01 CURRENT-CATEGORY PIC X(20).
01 CATEGORY-WEIGHT PIC X(3).
01 LAST-CATEGORY PIC X(20).
01 TOTAL-POINTS PIC 9(4).
01 GRADES.
05 GRADE OCCURS 1 TO 100 TIMES DEPENDING ON RECORD-COUNT INDEXED BY J.
10 ASSIGNMENT-NAME PIC X(20).
10 CATEGORY PIC X(20).
10 POINTS-POSSIBLE PIC 9(14).
10 POINTS-EARNED PIC 9(14).
PROCEDURE DIVISION.
OPEN INPUT GRADES-FILE.
READ GRADES-FILE INTO TOTAL-POINTS.
DISPLAY TOTAL-EARNED-POINTS
PERFORM UNTIL GRADES-FILE-EOF = 1
READ GRADES-FILE
AT END SET
GRADES-FILE-EOF TO 1
NOT AT END
ADD 1 TO RECORD-COUNT
MOVE INPUT-GRADES TO GRADE(RECORD-COUNT)
SET TOTAL-EARNED-POINTS UP BY POINTS-EARNED(RECORD-COUNT)
DISPLAY TOTAL-EARNED-POINTS
END-READ
END-PERFORM.
CLOSE GRADES-FILE.
DISPLAY TOTAL-EARNED-POINTS.
SORT GRADE ASCENDING CATEGORY.
MOVE CATEGORY(1) TO LAST-CATEGORY.
PERFORM RECORD-COUNT TIMES
MOVE CATEGORY(K) TO CURRENT-CATEGORY
IF CURRENT-CATEGORY = LAST-CATEGORY THEN
DISPLAY "SAME CATEGORY"
ELSE
DISPLAY "NEW CATEGORY"
MOVE LAST-CATEGORY TO CURRENT-CATEGORY
END-IF
SET K UP BY 1
END-PERFORM
DISPLAY GRADES.
STOP RUN.
编辑 2:在实施给定答案以将输入从文件转换为数字形式后,table 的第一行读起来很好,但从那时起它都是空白值。
这是 READ 块的新代码,我不确定是否有更有效的方法来读取和转换组字段中的特定字段,但这是我认为应该完成的方式。
PERFORM UNTIL GRADES-FILE-EOF = 1
READ GRADES-FILE
AT END SET
GRADES-FILE-EOF TO 1
NOT AT END
ADD 1 TO RECORD-COUNT
MOVE INPUT-ASSIGNMENT-NAME(RECORD-COUNT) TO ASSIGNMENT-NAME(RECORD-COUNT)
DISPLAY INPUT-ASSIGNMENT-NAME(RECORD-COUNT)
DISPLAY ASSIGNMENT-NAME(RECORD-COUNT)
MOVE INPUT-CATEGORY(RECORD-COUNT) TO CATEGORY(RECORD-COUNT)
DISPLAY INPUT-CATEGORY(RECORD-COUNT)
DISPLAY CATEGORY(RECORD-COUNT)
MOVE FUNCTION NUMVAL (INPUT-POINTS-POSSIBLE(RECORD-COUNT)) TO POINTS-POSSIBLE(RECORD-COUNT)
DISPLAY INPUT-POINTS-POSSIBLE(RECORD-COUNT)
DISPLAY POINTS-POSSIBLE(RECORD-COUNT)
MOVE FUNCTION NUMVAL (INPUT-POINTS-EARNED(RECORD-COUNT)) TO POINTS-EARNED(RECORD-COUNT)
DISPLAY INPUT-POINTS-EARNED(RECORD-COUNT)
DISPLAY POINTS-EARNED(RECORD-COUNT)
COMPUTE TOTAL-EARNED-POINTS = TOTAL-EARNED-POINTS + POINTS-EARNED(RECORD-COUNT)
DISPLAY TOTAL-EARNED-POINTS
END-READ
END-PERFORM.
is it a funny looking representation of the number 5?
不,这是一个未经检查的致命异常:EC-DATA-INCOMPATIBLE
.
原因:
您的数据定义与 record-definition 不匹配:
10 POINTS-EARNED PIC 9(14).
会是
"00000000000005"
没有
"5 "
看起来更好的定义是
10 SOME-POSSIBILY-NUMERIC-DATA PIC X(14).
如果您按照标签的建议使用 GnuCOBOL,那么将 -debug
添加到编译命令中,您将看到致命异常停止程序(COBOL 标准定义默认情况下所有异常检查都处于关闭状态,在我的意见:因为遗留和性能,但至少对于开发和测试来说,激活它们是非常合理的[在大多数情况下,让程序中止而不是在测试结束时做错误的数学更合理])。
与任何计算机语言一样,您应该非常确定拥有有效数据(永远不要信任外部数据,无论它是区块链的一部分还是您阅读的文本文件中).
How can I write this so that I can do proper mathematics with it to
print a proper grade report?
如果你想使用“错误数据被忽略”(可能在这里是合适的)只需转换它:
MOVE FUNCTION NUMVAL (SOME-POSSIBILY-NUMERIC-DATA)
TO POINTS-EARNED(RECORD-COUNT)
否则进行显式检查(完全是数字 [自己检查],或者 left/right FUNCTION TEST-NUMVAL
可能有空格的数字)并停止 program/skip 错误行DISPLAY ... UPON SYSERR
或任何适合您的内容。
我正在将文件读入 table,请注意第一行不是 table 的一部分。
1000
MS 1 - Join Grps Group Project 5 5
Four Programs Programming 15 9
Quiz 1 Quizzes 10 7
FORTRAN Programming 25 18
Quiz 2 Quizzes 10 9
HW 1 - Looplang Homework 20 15
在代码中,table表示如下:
01 GRADES.
05 GRADE OCCURS 1 TO 100 TIMES DEPENDING ON RECORD-COUNT INDEXED BY J.
10 ASSIGNMENT-NAME PIC X(20).
10 CATEGORY PIC X(20).
10 POINTS-POSSIBLE PIC 9(14).
10 POINTS-EARNED PIC 9(14).
我还有一些其他累加器变量指定用于稍后计算 sums/percentages。
01 RECORD-COUNT PIC 9(8) VALUE 0.
01 TOTAL-EARNED-POINTS PIC 9(14).
01 TOTAL-POSSIBLE-POINTS PIC 9(14) VALUE 0.
我的问题是,当我逐行阅读记录时,我想执行以下操作:
ADD POINTS-EARNED(RECORD-COUNT) TO TOTAL-EARNED-POINTS
其中 RECORD-COUNT
是迭代中的当前位置。
我希望在第一次迭代后 TOTAL-EARNED-POINTS
的值只是 5
,对吗?
但是,当我 DISPLAY
TOTAL-EARNED-POINTS 的值时,控制台显示:
50000000000000
这是50万亿吗?或者它是数字 5 的一个有趣的表示形式? 我怎样才能写这个,以便我可以用它做正确的数学运算来打印正确的成绩报告?
编辑:我知道可能有更好的方法来编写这个程序,但我在尝试编写这个程序之前从未使用过 cobol,而且我可能不会再使用它,或者至少在很长一段时间内不会使用它很久。这是针对 class,所以只要我能正确打印我的输出,我就很好。 到目前为止的完整代码:
IDENTIFICATION DIVISION.
PROGRAM-ID. GRADEREPORT.
AUTHOR. JORDAN RENAUD.
DATE-WRITTEN. 09/18/2020.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT GRADES-FILE ASSIGN TO "bill"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD GRADES-FILE.
01 INPUT-TOTAL-POINTS PIC 9(4).
01 INPUT-GRADES.
05 INPUT-GRADE OCCURS 1 to 100 TIMES DEPENDING ON RECORD-COUNT INDEXED BY I.
10 INPUT-ASSIGNMENT-NAME PIC X(20).
10 INPUT-CATEGORY PIC X(20).
10 INPUT-POINTS-POSSIBLE PIC 9(14).
10 INPUT-POINTS-EARNED PIC 9(14).
WORKING-STORAGE SECTION.
77 GRADES-FILE-EOF PIC 9.
01 RECORD-COUNT PIC 9(8) VALUE 0.
01 TOTAL-EARNED-POINTS PIC 9(4) VALUE ZERO.
01 TOTAL-POSSIBLE-POINTS PIC 9(14) VALUE 5.
01 K PIC 9(14) VALUE 1.
01 TMP PIC 9(14).
01 CURRENT-CATEGORY PIC X(20).
01 CATEGORY-WEIGHT PIC X(3).
01 LAST-CATEGORY PIC X(20).
01 TOTAL-POINTS PIC 9(4).
01 GRADES.
05 GRADE OCCURS 1 TO 100 TIMES DEPENDING ON RECORD-COUNT INDEXED BY J.
10 ASSIGNMENT-NAME PIC X(20).
10 CATEGORY PIC X(20).
10 POINTS-POSSIBLE PIC 9(14).
10 POINTS-EARNED PIC 9(14).
PROCEDURE DIVISION.
OPEN INPUT GRADES-FILE.
READ GRADES-FILE INTO TOTAL-POINTS.
DISPLAY TOTAL-EARNED-POINTS
PERFORM UNTIL GRADES-FILE-EOF = 1
READ GRADES-FILE
AT END SET
GRADES-FILE-EOF TO 1
NOT AT END
ADD 1 TO RECORD-COUNT
MOVE INPUT-GRADES TO GRADE(RECORD-COUNT)
SET TOTAL-EARNED-POINTS UP BY POINTS-EARNED(RECORD-COUNT)
DISPLAY TOTAL-EARNED-POINTS
END-READ
END-PERFORM.
CLOSE GRADES-FILE.
DISPLAY TOTAL-EARNED-POINTS.
SORT GRADE ASCENDING CATEGORY.
MOVE CATEGORY(1) TO LAST-CATEGORY.
PERFORM RECORD-COUNT TIMES
MOVE CATEGORY(K) TO CURRENT-CATEGORY
IF CURRENT-CATEGORY = LAST-CATEGORY THEN
DISPLAY "SAME CATEGORY"
ELSE
DISPLAY "NEW CATEGORY"
MOVE LAST-CATEGORY TO CURRENT-CATEGORY
END-IF
SET K UP BY 1
END-PERFORM
DISPLAY GRADES.
STOP RUN.
编辑 2:在实施给定答案以将输入从文件转换为数字形式后,table 的第一行读起来很好,但从那时起它都是空白值。 这是 READ 块的新代码,我不确定是否有更有效的方法来读取和转换组字段中的特定字段,但这是我认为应该完成的方式。
PERFORM UNTIL GRADES-FILE-EOF = 1
READ GRADES-FILE
AT END SET
GRADES-FILE-EOF TO 1
NOT AT END
ADD 1 TO RECORD-COUNT
MOVE INPUT-ASSIGNMENT-NAME(RECORD-COUNT) TO ASSIGNMENT-NAME(RECORD-COUNT)
DISPLAY INPUT-ASSIGNMENT-NAME(RECORD-COUNT)
DISPLAY ASSIGNMENT-NAME(RECORD-COUNT)
MOVE INPUT-CATEGORY(RECORD-COUNT) TO CATEGORY(RECORD-COUNT)
DISPLAY INPUT-CATEGORY(RECORD-COUNT)
DISPLAY CATEGORY(RECORD-COUNT)
MOVE FUNCTION NUMVAL (INPUT-POINTS-POSSIBLE(RECORD-COUNT)) TO POINTS-POSSIBLE(RECORD-COUNT)
DISPLAY INPUT-POINTS-POSSIBLE(RECORD-COUNT)
DISPLAY POINTS-POSSIBLE(RECORD-COUNT)
MOVE FUNCTION NUMVAL (INPUT-POINTS-EARNED(RECORD-COUNT)) TO POINTS-EARNED(RECORD-COUNT)
DISPLAY INPUT-POINTS-EARNED(RECORD-COUNT)
DISPLAY POINTS-EARNED(RECORD-COUNT)
COMPUTE TOTAL-EARNED-POINTS = TOTAL-EARNED-POINTS + POINTS-EARNED(RECORD-COUNT)
DISPLAY TOTAL-EARNED-POINTS
END-READ
END-PERFORM.
is it a funny looking representation of the number 5?
不,这是一个未经检查的致命异常:EC-DATA-INCOMPATIBLE
.
原因:
您的数据定义与 record-definition 不匹配:
10 POINTS-EARNED PIC 9(14).
会是
"00000000000005"
没有
"5 "
看起来更好的定义是
10 SOME-POSSIBILY-NUMERIC-DATA PIC X(14).
如果您按照标签的建议使用 GnuCOBOL,那么将 -debug
添加到编译命令中,您将看到致命异常停止程序(COBOL 标准定义默认情况下所有异常检查都处于关闭状态,在我的意见:因为遗留和性能,但至少对于开发和测试来说,激活它们是非常合理的[在大多数情况下,让程序中止而不是在测试结束时做错误的数学更合理])。
与任何计算机语言一样,您应该非常确定拥有有效数据(永远不要信任外部数据,无论它是区块链的一部分还是您阅读的文本文件中).
How can I write this so that I can do proper mathematics with it to print a proper grade report?
如果你想使用“错误数据被忽略”(可能在这里是合适的)只需转换它:
MOVE FUNCTION NUMVAL (SOME-POSSIBILY-NUMERIC-DATA)
TO POINTS-EARNED(RECORD-COUNT)
否则进行显式检查(完全是数字 [自己检查],或者 left/right FUNCTION TEST-NUMVAL
可能有空格的数字)并停止 program/skip 错误行DISPLAY ... UPON SYSERR
或任何适合您的内容。