2015-03-25 3 views
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. 

Почему выход ноль? Здесь что-то не так? И как вы делаете подписанный/отрицательный вход?

+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 

Вы можете думать, что что-то неправильно с выходом из значения-из-принимать (в зависимости от компилятора), но вы всегда можете переместить его в числовой отредактированные поля и дисплея.


Совет: Чтобы обратить вспять знак подписанного поля.

SUBTRACT field-to-reverse-sign 
          FROM ZERO 
    GIVING      the-reversed-field 

SUBTRACT быстрее, чем MULTIPLY.

Вы определили свое поле ACCEPT ed как неподписанное.

Первые две «ноги» вашего вложенного-IF набора ABSVAL равны нулю. Оставшаяся нога берет существующее значение ABSVAL (от VALUE ZEROS, так что оно равно нулю) и умножает его на минус один. Получение -ve zero (возможно), но затем сохранение его в неподписанном поле. Таким образом, ABSVAL всегда будет равен нулю, когда вы придете к DISPLAY.

Вы определяете подписанное поле, предваряя строку PICTURE с S:

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

В зависимости от компилятора, вы можете ввести - при вводе данных, и она будет проходить счастливо как отрицательное значение в подписанном поле (которое вы должны определить), или вам нужно его самостоятельно закодировать.

+0

Я думал, что он перейдет к следующему, если утверждение if-then ложно? Почему оставшаяся нога возьмет существующее значение ABSVAL? – MCMLXXXIX

+0

Потому что COMPUTE как оператор присваивания. Пусть (новое значение) ABSVAL будет равно (исходное значение) ABSVAL, умноженному на минус один. –

+0

Вам не нужна абсолютная ценность, не так ли? Вы хотите абсолютное значение для отрицательного числа, иначе ноль? –

0

после коррекции выше

Я не знаю, как вы проверяете его, но только для того, чтобы эти значения хранятся правильно, вы можете иметь как поля подписанную т.е. ПОС S9 или ПОС S99. Возможно, что без предшествующего S (знак) переменные на самом деле не сохраняют отрицательный знак независимо от того, что показывает экран.

PLS, чтобы посмотреть, какие результаты вы получите

+0

Без S это невозможно, чтобы знак был сохранен, а не возможно, что это не так. –