【问题标题】:Adding two integers giving unwanted result in cobol在 cobol 中添加两个整数会产生不需要的结果
【发布时间】:2020-09-21 08:45:39
【问题描述】:

我正在将文件读入表格,注意第一行不是表格的一部分。

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            

在代码中,表格表示如下:

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

我还有一些其他累加器变量指定用于稍后计算总和/百分比。

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,而且我可能不会再使用它,或者至少在很长一段时间内都不会使用它.这是一个班级,所以只要我能正确打印我的输出,我就很好。 到目前为止的完整代码:

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:在实现将输入从文件转换为数字形式的给定答案后,表的第一行读取正常,但从那时起它都是空白值。 这是 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.

【问题讨论】:

    标签: cobol gnucobol


    【解决方案1】:

    数字 5 是不是看起来很有趣?

    不,这是一个未经检查的致命异常:EC-DATA-INCOMPATIBLE

    原因:
    您的数据定义和记录定义不匹配:

    10 分赚取的 PIC 9(14)。

     "00000000000005"
    

    不是

     "5             "
    

    看起来更好的定义是

    10 SOME-POSSIBILY-NUMERIC-DATA PIC X(14).
    

    如果您按照标签的建议使用 GnuCOBOL,则将-debug 添加到编译命令中,您将看到停止程序的致命异常(COBOL 标准定义默认情况下所有异常检查都是关闭的,在我看来:因为遗留和性能,但至少对于开发和测试来说,激活它们是非常合理的[在大多数情况下,让程序异常结束而不是在测试结束时做错数学更合理])。

    与任何计算机语言一样,您应该非常确定拥有有效数据(从不信任外部数据,无论它是区块链的一部分还是您读入的文本文件)。 p>

    我怎样才能写这个,以便我可以用它做适当的数学运算 打印一份适当的成绩报告?

    如果你想使用“坏数据被忽略”(可能在这里是合适的),只需转换它:

    MOVE FUNCTION NUMVAL (SOME-POSSIBILY-NUMERIC-DATA)
      TO POINTS-EARNED(RECORD-COUNT)
    

    否则进行显式检查(完全数字 [自己检查],或在左/右可能有空格的数字 FUNCTION TEST-NUMVAL)并停止程序/使用 DISPLAY ... UPON SYSERR 或任何适当的方式跳过错误行给你。

    【讨论】:

    • “永远不要相信外部数据,无论它是区块链的一部分还是你读入的文本文件”
    • 这绝对是有道理的,我想我必须解析和转换输入,这是分配所需的文件格式,所以我无能为力。实施并测试解决方案后,我会将其标记为已接受的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多