0

给定以下代码:

  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.

为什么输出为零?有什么不对?以及如何进行有符号/负输入?

4

2 回答 2

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您已将ed的字段定义为无符号。

嵌套 IF 的前两条“腿”将 ABSVAL 设置为零。剩下的腿取 ABSVAL 的现有值(来自VALUE ZEROS,所以它为零)并将其乘以负一。获得 -ve 零(可能),但随后将其存储在无符号字段中。因此,当您来到 ABSVAL 时,ABSVAL 将始终为零DISPLAY

您可以通过在 PICture 字符串前加上 S 来定义签名字段:

01  a-signed-field PIC S9(5).

根据您的编译器,您可以-在输入数据时键入 a ,它会在有符号字段(您必须定义)中愉快地作为负值保存,或者您必须自己编写代码。

于 2015-03-25T16:12:19.903 回答
0

在你上面更正之后

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

请观察你得到什么结果

于 2015-03-29T04:43:50.493 回答