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署名なしとして編集されるフィールドを定義しました。

ネストされた IF の最初の 2 つの「レグ」は、ABSVAL をゼロに設定します。残りのレッグは、ABSVAL の既存の値 ( から取得されるVALUE ZEROSため、ゼロです) を取得し、マイナス 1 を掛けます。-ve zero を取得しますが (おそらく)、それを unsigned フィールドに格納します。したがって、 に来ると ABSVAL は常にゼロになりますDISPLAY

PICture 文字列の前に S: を付けて、署名付きフィールドを定義します。

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

コンパイラによっては-、データを入力するときに a を入力すると、符号付きフィールド (定義する必要があります) に負の値として喜んで保持されるか、自分でコーディングする必要があります。

于 2015-03-25T16:12:19.903 に答える