如何显示绝对值

时间:2015-03-25 15:53:54

标签: cobol absolute-value

给出以下代码:

  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.

为什么输出为零?有什么不对?你如何进行签名/否定输入?

2 个答案:

答案 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

SUBTRACTMULTIPLY快。


您已将ACCEPT字段定义为无符号字段。

前两个"腿"嵌套IF的设置为ABSVAL为零。剩余的分支采用ABSVAL的现有值(来自VALUE ZEROS,因此它为零)并将其乘以减1。获取-ve零(可能),然后将其存储在无符号字段中。因此,当您来到DISPLAY时,ABSVAL将始终为零。

您可以通过在PICture字符串前加上S:

来定义有符号字段
01  a-signed-field PIC S9(5).

根据您的编译器,您可以在输入数据时键入-,并且它可以在签名字段(您必须定义)中作为负值幸运地持有,或者您必须编码为你自己。

答案 1 :(得分:0)

以上更正后

我不确定你是如何测试它的,但为了确保值存储正确,你可能希望两个字段都已签名,即图片S9或图片S99。可能的是,如果没有前面的S(符号),无论屏幕显示什么,变量都不会真正存储负号。

请注意你得到的结果