gpt4 book ai didi

cobol - 为什么我的 COBOL 工作存储变量有尾随零?

转载 作者:行者123 更新时间:2023-12-05 01:04:12 27 4
gpt4 key购买 nike

我正在构建一个 COBOL 程序来计算最多 15 个整数的平均值。执行显示的数字远大于预期,并带有很多尾随零。以下是相关代码:

       Data Division.
Working-Storage Section.
01 WS-COUNTER PIC 9(10).
01 WS-INPUT-TOTAL PIC 9(10).
01 WS-NEXT-INPUT PIC X(8).
01 WS-CONVERTED-INPUT PIC 9(8).
01 WS-AVG PIC 9(8)V99.

Procedure Division.
PROG.
PERFORM INIT-PARA
PERFORM ADD-PARA UNTIL WS-COUNTER = 15 OR WS-NEXT-INPUT = 'q'
PERFORM AVG-PARA
PERFORM END-PARA.
INIT-PARA.
DISPLAY 'This program calculates the average of inputs.'.
MOVE ZERO TO WS-COUNTER
MOVE ZERO TO WS-INPUT-TOTAL
MOVE ZERO TO WS-AVG.
ADD-PARA.
DISPLAY 'Enter an integer or type q to quit: '
ACCEPT WS-NEXT-INPUT
IF WS-NEXT-INPUT NOT = 'q'
MOVE WS-NEXT-INPUT TO WS-CONVERTED-INPUT
ADD WS-CONVERTED-INPUT TO WS-INPUT-TOTAL
ADD 1 TO WS-COUNTER
END-IF.
AVG-PARA.
IF WS-COUNTER > 1
DIVIDE WS-INPUT-TOTAL BY WS-COUNTER GIVING WS-AVG
DISPLAY 'Your average is ' WS-AVG '.' WS-NEXT-INPUT
END-IF.

我将 WS-NEXT-INPUT 作为字母数字并将其移动到数字 WS-CONVERTED-INPUT 如果 IF 条件的原因满意是因为我希望它能够使用“q”来打破 UNTIL 循环,但是在满足条件之后,我想要一个用于算术语句的数字变量。以下是数字 10 和 15 作为输入的样子:

10is program calculates the average of inputs.
Enter an integer or type q to quit:
15
Enter an integer or type q to quit:
q
Your average is 1250000000.

控制台有点问题,所以它迫使我大部分时间在左上角输入 10。不用担心。

你在那个执行中看到了我的问题。结果应该是 00000012.50 而不是 1250000000。我尝试将一些其他变量插入到该显示语句中,它们基本上都应该是除了 WS-INPUT-TOTAL 之外这个数字组合最终是 0025000000 而不是 0000000025 正如我所期望的那样。为什么这些数字会以如此奇怪和意想不到的方式存储?

最佳答案

由于未定义的行为 - 使用空格计算,您会得到奇怪的输出。

您提供的 MOVE 具有完全相同的 USAGE 和相同的大小 - 它通常会“按原样”被接管,它通常不会将尾随空格转换为一些魔法,所以 WS-CONVERTED-INPUT10 结束。正如标准所说的那样:

De-editing takes place only when the sending operand is a numeric-edited data item and the receiving item is a numeric or a numeric-edited data item.

如果它是一个已编辑的字段,那么它仍然应该在 MOVE 上引发异常:

When a numeric-edited data item is the sending operand of a de-editing MOVE statement and the content of that data item is not a possible result for any editing operation in that data item, the result of the MOVE operation is undefined and an EC-DATA-INCOMPATIBLE exception condition is set to exist.

当使用空格进行计算时,您通常会引发 fatal error ,但您的编译似乎没有激活该错误(并且因为您没有共享您的编译命令甚至您的编译器,我们对此无能为力)。

不同的 COBOL 方言通常对无效数据使用零(仅在未激活会导致中止的检查时部分使用)零,至少对于空格(但它们可以使用所有内容。这将导致到 WS-CONVERTED-INPUT “视为” 10000000 - 所以你的计算将包括那些大数字。

因此,如果您在输入时输入必要数量的前导零,您的程序应该可以工作。

一般:

  • “从不信任输入数据 - 验证”(必要时出错或转换)
  • 至少如果某些东西看起来可疑 - 激活所有可用的运行时检查,然后重试。

解决方案 - 进行显式转换:

MOVE FUNCTION NUMVAL(WS-NEXT-INPUT) TO WS-CONVERTED-INPUT,这将去除周围的空格,然后从左到右转换,直到找到无效数据。优秀的编码员也会使用 FUNCTION TEST-NUMVAL 预先检查,否则如果有人输入“TWENTY”,则计算为零。

关于cobol - 为什么我的 COBOL 工作存储变量有尾随零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72568448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com