将两个整数相加会给cobol带来不必要的结果

乔丹·雷诺

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

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.
西蒙·索比施

它是数字5的有趣表示吗?

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

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

10点积分的图9(14)。

将会

 "00000000000005"

 "5             "

看起来更好的定义是

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

如果按照标签的建议使用GnuCOBOL,则将其添加-debug到compile命令中,您将看到致命异常停止程序(COBOL标准定义默认情况下所有异常检查均处于关闭状态,我认为这是由于遗留和性能所致,至少对于开发和测试来说,激活它们是非常合理的(在大多数情况下,让程序退出而不是在测试结束后进行错误的数学运算是更加合理的))。

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

我该怎么写,以便我可以用它做适当的数学以打印出适当的成绩报告?

如果要使用“只是忽略坏数据”(在这里可能适当),只需对其进行转换:

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

否则,请进行显式检查(完全数字[own check]或左侧/右侧可能有空格的数字FUNCTION TEST-NUMVAL),然后停止程序/使用aDISPLAY ... UPON SYSERR或适合您的内容跳过不良行

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#:将两个大整数相加会得出错误的结果

来自分类Dev

将两个整数之间的值相加?

来自分类Dev

仅使用1将两个整数相加

来自分类Dev

在两个单独页面上进行不必要的独立会话

来自分类Dev

Swift 3(省略不必要的词)导致两个函数具有相同的名称

来自分类Dev

计算两个速度相加的结果

来自分类Dev

COBOL取消最后一个数字,同时将两个十进制数字相加

来自分类Dev

将两个列表相加

来自分类Dev

将两个16位整数相加以在6502中产生16位答案?

来自分类Dev

将两个整数之间的所有数字相加

来自分类Dev

无限循环,同时使用按位运算将两个整数相加?

来自分类Dev

无限循环,同时使用按位运算将两个整数相加?

来自分类Dev

将两个相等大小的列表相乘并将结果相加(点积)

来自分类Dev

带有“位置”下拉列表的搜索栏将两个结果相加-PHP / mySQL

来自分类Dev

使用react native将两个值相加并显示结果

来自分类Dev

在两个不同的编辑器中使用同一种子会给我带来不同的结果(Pycharm和Jupyter Notebook)

来自分类Dev

GLSL Shader产生不必要的结果

来自分类Dev

jQuery不必要的总和结果

来自分类Dev

在cobol程序中得到不必要的输出

来自分类Dev

保存显示的两个浮点数相加的结果

来自分类Dev

将HTML和CSS代码分离到两个不同的位置会给HTML渲染带来问题。如何解决这个问题?

来自分类Dev

将两个列表的第i个元素相加

来自分类Dev

C-将两个单精度浮点普通数相加,无法将结果求无穷大

来自分类Dev

英特尔的时间戳读取asm代码示例是否使用了两个不必要的寄存器?

来自分类Dev

PHP如何将结果保持为十进制格式并删除不必要的零?

来自分类Dev

在6502中将两个n-bytre整数相加以生成n字节答案?

来自分类Dev

两个变量相加

来自分类Dev

使用指针将两个4向量与sse相加

来自分类Dev

ORACLE将两个SELECT与UNION相加

Related 相关文章

  1. 1

    C#:将两个大整数相加会得出错误的结果

  2. 2

    将两个整数之间的值相加?

  3. 3

    仅使用1将两个整数相加

  4. 4

    在两个单独页面上进行不必要的独立会话

  5. 5

    Swift 3(省略不必要的词)导致两个函数具有相同的名称

  6. 6

    计算两个速度相加的结果

  7. 7

    COBOL取消最后一个数字,同时将两个十进制数字相加

  8. 8

    将两个列表相加

  9. 9

    将两个16位整数相加以在6502中产生16位答案?

  10. 10

    将两个整数之间的所有数字相加

  11. 11

    无限循环,同时使用按位运算将两个整数相加?

  12. 12

    无限循环,同时使用按位运算将两个整数相加?

  13. 13

    将两个相等大小的列表相乘并将结果相加(点积)

  14. 14

    带有“位置”下拉列表的搜索栏将两个结果相加-PHP / mySQL

  15. 15

    使用react native将两个值相加并显示结果

  16. 16

    在两个不同的编辑器中使用同一种子会给我带来不同的结果(Pycharm和Jupyter Notebook)

  17. 17

    GLSL Shader产生不必要的结果

  18. 18

    jQuery不必要的总和结果

  19. 19

    在cobol程序中得到不必要的输出

  20. 20

    保存显示的两个浮点数相加的结果

  21. 21

    将HTML和CSS代码分离到两个不同的位置会给HTML渲染带来问题。如何解决这个问题?

  22. 22

    将两个列表的第i个元素相加

  23. 23

    C-将两个单精度浮点普通数相加,无法将结果求无穷大

  24. 24

    英特尔的时间戳读取asm代码示例是否使用了两个不必要的寄存器?

  25. 25

    PHP如何将结果保持为十进制格式并删除不必要的零?

  26. 26

    在6502中将两个n-bytre整数相加以生成n字节答案?

  27. 27

    两个变量相加

  28. 28

    使用指针将两个4向量与sse相加

  29. 29

    ORACLE将两个SELECT与UNION相加

热门标签

归档