Рассмотрев в предыдущих “уроках” структуру программы (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.
В этот раз мы познакомимся с вкусностями условий (а также получим дополнительный маленький подарок для знаний в конце).
Итак, я думаю все, кто хоть немного интересовался программированием помнят, что есть наверное во всех практически ЯП – такой оператор как 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.