给出以下代码:
IDENTIFICATION DIVISION.
PROGRAM-ID. FABS.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM PIC 9 VALUE ZEROS.
01 ABSVAL PIC 99 VALUE ZEROS.
PROCEDURE DIVISION.
PROGRAM-BEGIN.
DISPLAY "This program returns the absolute value of a number.".
DISPLAY SPACE.
DISPLAY "Input value: " WITH NO ADVANCING.
ACCEPT NUM.
IF (NUM = -0) THEN
COMPUTE ABSVAL = 0
ELSE
IF (NUM > 0) THEN
COMPUTE ABSVAL = 0
ELSE
COMPUTE ABSVAL = ABSVAL * -1
END-IF
END-IF.
DISPLAY "|", NUM "| = ", ABSVAL.
PROGRAM-DONE.
STOP RUN.
为什么输出为零?有什么不对?你如何进行签名/否定输入?
答案 0 :(得分:1)
考虑你的任务,而不是为什么你得零,这很容易。
我们假设您通过ACCEPT获得签名值。
01 value-from-accept PIC S9.
01 absolute-value-for-output PIC 9.
MOVE value-from-accept TO absolute-value-for-output
DISPLAY
"|"
value-from-accept
"| = "
absolute-value-for-output
您可能认为value-from-accept(取决于编译器)的输出有问题,但您始终可以将其移动到数字编辑的字段并显示该字段。
提示:要反转签名字段的符号。
SUBTRACT field-to-reverse-sign
FROM ZERO
GIVING the-reversed-field
SUBTRACT
比MULTIPLY
快。
您已将ACCEPT
字段定义为无符号字段。
前两个"腿"嵌套IF的设置为ABSVAL为零。剩余的分支采用ABSVAL的现有值(来自VALUE ZEROS
,因此它为零)并将其乘以减1。获取-ve零(可能),然后将其存储在无符号字段中。因此,当您来到DISPLAY
时,ABSVAL将始终为零。
您可以通过在PICture字符串前加上S:
来定义有符号字段01 a-signed-field PIC S9(5).
根据您的编译器,您可以在输入数据时键入-
,并且它可以在签名字段(您必须定义)中作为负值幸运地持有,或者您必须编码为你自己。
答案 1 :(得分:0)
以上更正后
我不确定你是如何测试它的,但为了确保值存储正确,你可能希望两个字段都已签名,即图片S9或图片S99。可能的是,如果没有前面的S(符号),无论屏幕显示什么,变量都不会真正存储负号。
请注意你得到的结果