Как стать автором
Обновить

COBOL (ч. 4.) – IF и его друзья…

Время на прочтение 3 мин
Количество просмотров 5K
Рассмотрев в предыдущих “уроках” структуру программы (http://habrahabr.ru/blogs/atnikvariat/115813/), простенькие арифметические функции (http://habrahabr.ru/blogs/atnikvariat/115821/) и описание переменных (http://habrahabr.ru/blogs/atnikvariat/115849/) мы пойдем все дальше и дальше!

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

Итак, я думаю все, кто хоть немного интересовался программированием помнят, что есть наверное во всех практически ЯП – такой оператор как IF (Если), есть он конечно же и в COBOL.


Как записывается?

IF <условие>
<действие1>
(по желанию ELSE )
END-IF.

ВНИМАНИЕ. Это Важно:

Каждое выражение в COBOL заканчивается знаком “.” (точка), это вы уже знаете, НО IF рассматривается как одно выражение, поэтому точка здесь ставится ТОЛЬКО после END-IF.

Будьте внимательны!

Возможные варианты условий:

1. Проверка на тип данных в переменной:
числовая (IS NUMERIC) — проверяется, что в переменной содержится число.
Буквенная (IS ALPHABETIC) – проверяется, что в переменной содержатся ТОЛЬКО буквы и пробелы.
Буквенная (заглавные буквы) и буквенная (прописные буквы) (IS ALPHABETIC-UPPER и ALPHABETIC-LOWER) – проверяется соответственно, что содержатся только заглавные или только прописные буквы и пробелы.
Применялось и применяется для проверки на правильность введенных данных и соответствующей обработки выявленных ошибок.
Например,

IF WS-A IS NUMERIC
MOVE WS-A TO WS-B
ELSE
DISPLAY “Error!”
END-IF.

2. Сравнение:
Оператор (полная форма записи), Сокращенная форма записи, Смысл
IS GREATER THAN IS > Больше, чем
IS NOT GREATER THAN IS NOT > Не больше, чем
IS LESS THAN IS < Меньше, чем
IS NOT LESS THAN IS NOT < Не меньше, чем
IS EQUAL TO IS = Равно
IS NOT EQUAL TO IS NOT = Не равно
IS GREATER THAN OR EQUAL TO IS >= Больше или равно, чем
IS LESS THAN OR EQUAL TO IS <= Меньше или равно, чем

И если со сравнением чисел все понятно, то сравнение буквенных переменных следует уточнить. COBOL подгоняет сравниваемые значения под один размер с помощью пробелов, добавляемых к правому концу. После чего начинается посимвольное сравнение с крайнего левого символа в соответствии с ASCII, EBCDIC (на мэйнфреймах) или другой указанной компилятору кодировкой.

IF TEXT-INPUT IS > «Orange»

DISPLAY «Orange»

DISPLAY TEXT-INPUT

ELSE

DISPLAY TEXT-INPUT

DISPLAY «Orange»

END-IF.


Если вы введете Apple то оно будет “меньше”, чем Orange, а вот apple, будет “больше”.

3. Проверка на знак числа:
IS POSITIVE – число положительное;
IS NEGATIVE – число отрицательное;
IS ZERO – число равно нулю;
IS NOT POSITIVE – число НЕ положительное (0 или отрицательное);
IS NOT NEGATIVE – число НЕ отрицательное (0 или положительное);
IS NOT ZERO – число НЕ равно нулю.

Например:

MOVE 100 TO WS-RESULT.

DISPLAY «WS-RESULT IS », WS-RESULT.

IF WS-RESULT IS NOT ZERO

DISPLAY «WS-RESULT IS NOT ZERO!»

END-IF.

IF WS-RESULT IS ZERO

DISPLAY «WS-RESULT IS ZERO!»

END-IF.

IF WS-RESULT IS NOT POSITIVE

DISPLAY «WS-RESULT IS NOT POSITIVE!»

END-IF.

IF WS-RESULT IS NOT NEGATIVE

DISPLAY «WS-RESULT IS NOT NEGATIVE!»

END-IF.

IF WS-RESULT IS POSITIVE

DISPLAY «WS-RESULT IS POSITIVE!»

END-IF.

IF WS-RESULT IS NEGATIVE

DISPLAY «WS-RESULT IS NOT ZERO!»

END-IF.

Вывод в этом случае будет выглядеть как:

WS-RESULT IS 000100

WS-RESULT IS NOT ZERO!

WS-RESULT IS NOT NEGATIVE!

WS-RESULT IS POSITIVE!

4. Использование переменной с условиями:

В одном из предыдущих уроков мы упоминали уровень переменной 88. Теперь пришло время разобраться с ней поближе. Переменная такого типа не имеет описания, она инициализируется сразу при объявлении и может быть только подуровнем другой переменной. Используется она как некий аналог CASE из других языков программирования и хранит в себе значение с которым будет сверяться IF. Например:

Описываем и инициализируем в DATA DIVISION.

01 NUMBER-CHECK PIC S9.
88 NC-ONE VALUE 1.
88 NC-ZERO VALUE 0.
88 NC-MINUS VALUE -1.

Используем в PROCEDURE DIVISION.

ACCEPT NUMBER-CHECK.
IF NC-ONE
DISPLAY “NUMBER-CHECK IS ONE”
END-IF.
IF NC-MINUS
DISPLAY “NUMBER-CHECK IS MINUS”
END-IF.
IF NC-ZERO
DISPLAY “NUMBER-CHECK IS ZERO”
END-IF.

Как это работает:
NC-ONE, NC-MINUS и NC-ZERO – переменные закрепленные за NUMBER-CHECK, когда мы используем IF NC-ONE, то фактически компилятор “подставляет”
IF NUMBER-CHECK = 1.

Помимо VALUE может использоваться VALUES <значение-от> THRU <значение-до>, в таком случае при 88 NC-ONE VALUES 1 THRU 10, будет проверяться попадание значения хранящегося в NUMBER-CHECK в диапазон от 1 до 10.

Помимо перечисленного IF поддерживает NOT, AND и OR, например, IF NOT WS-A = WS-B или IF ((WS-A = WS-B) AND (WS-A = WS-RESULT)) OR (WS-RESULT = WS-B).

Жду вопросов и предложений в комментариях.
До следующей Встречи! Впереди будет еще много интересного)

Воронцов “nerfur” Вячеслав. 2011.

Теги:
Хабы:
-4
Комментарии 0
Комментарии Комментировать

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн