Содержание     GOTO Логические операции IF Циклы SELECT CASE  
 

 

Управляющие операторы

 

Рассматриваемые до сих пор программы были линейными, т.е. выполнялись последовательно оператор за оператором с начала до конца программы. В таких программах невозможно влиять на последовательность выполнения операторов, когда, например, происходит повторение фрагментов программы или выполнение ряда действий зависит от определенных условий. В этой главе Вы познакомитесь с операторами, которые позволяют управлять ходом выполнения программы. Группу таких операторов часто объединяют понятием "Управляющие операторы".
 

1. Оператор безусловного перехода


Оператор GOTO позволяет изменить последовательность выполнения шагов программы, но его применение нежелательно, так как увеличивается время выполнения, снижается наглядность и понимаемость программы. В предыдущих версиях BASICa не было возможности отказаться от применения GOTO, так как практически не существовало других языковых элементов для управления программой.

GOTO Метка_перехода
Метка_перехода Объявленная в программе метка. Метка объявляется произвольным именем, заканчивающимся двоеточием.
 

Пример 1:
В приведенной ниже программе происходит переход к последнему оператору PRINT, В
результате на экране получаем сообщение "Хелло, Долли!".
'Оператор GOTO
CLS
PRINT "Хелло, "
GOTO weiter
PRINT "Здесь проявляется GOTO";
Welter: ‘Метка перехода
PRINT "Долли!"
'Конец программы

Если указать в операторе GOTO метку, не объявленную в программе, то при запуске программы, появится соответствующее сообщение об ошибке. Если одну метку объявить в программе дважды, тоже появится сообщение об ошибке.

Пример 2:
В этом примере представлена "бесконечная" (зациклившаяся) программа, которая всегда возвращается к своему началу.
'Зациклившаяся программа (прервать нажатием клавиш "CTRL" + "Pause")
anfang:
PRINT 234.23
GOTO anfang 'Недосягаемый конец программы
 

Пример 3:
Последний пример показывает, насколько плохую услугу при конструировании программ оказывает оператор GOTO.
'Как не надо писать программы
anfang:
GOTO schritti
schritt4:
PRINT "совсем непонятная "
GOTO schritt5
schritt6:
GOTO ende
schritti:
CLS
GOTO schritt2
schrin3:
PRINT "простая, но "
GOTO schritt4
schritt2:
PRINT "Это очень"
GOTO schrin3
Schritt5:
PRINT "программа."
GOTO schritt6
PRINT "Здесь работает Goto-"
ende:
PRINT "Наконец готово!"
'Конец программы

2. Условия


Результат сравнения может принимать только два значения: "истина", когда высказы- вание справедливо, или "ложь" — в противном случае. Говорят также, что истинность таких выражений либо "true" (t)(-1), либо "false" (f)(0).

Конструкция логических выражений в QBASIC довольно проста. В качестве сравниваемых значений (сравниваемых операндов) могут участвовать строки, числа, константы, переменные, арифметические и строковые выражения. Используют следующие операции сравнения:
 

Операция Значение
> больше
< меньше
>= больше или равно
<= меньше или равно
= равно
<> Не равно


Схематически условие можно представить следующим образом:
Выражение_1 Операция_сравнения Выражение_2

Для того чтобы сравнить строки (т.е. применить операторы ">" или "<" к строковым данным), необходимо учитывать порядок расположения символов в таблице кодов ASCII: "О" < "1" <,...< "9 "< "А ",...< "Z" < "а" <... "z".
Итак, Строка_1 больше (меньше) Строки_2, если при посимвольном сравнении строк код первого несовпадающего символа из Строки_1 больше (меньше) кода соответствующего символа из Строки_2.
Числовые переменные(константы) сравниваются обычным образом.
Также в QВasic можно использовать переменные типа Boolean, т.е. переменные которым можно присвоить какое-то логическое выражение, и значение этой переменной будет зависеть от истинности или ложности определяющего выражения. Если значение выражения ложно, то переменной будет присвоено значение 0, а если истинно, то -1.
 

Пример:
'Использование логических выражений
А=2>5
B=6<=6
C=8<>9
PRINT A
PRINT B
PRINT C
END
'Конец программы

В результате на экране вы увидите:
0
-1
-1

Также в логических выражениях можно использовать логические операции AND(и), OR(или), NOT(не), XOR(исключающее или, либо). Приведём таблицу истинности и приоритет операций.
 

Выражение А Выражение В A AND B A OR B NOT A A XOR B
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0

 

Логические операции


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

 

Рассмотрим пример:
'Пример, подводящий читателя к применению более сложных логических условий
DIM zahl1%, zahl2%
CLS
INPUT "Ввести число 1, zahl1%
INPUT "Ввести число 2", zahl2%
'Конец программы

Предположим входные данные должны вводится только тогда, когда zahll % больше нуля, и одновременно zahl1% меньше нуля. Как проверить одно из условий, Вы уже знаете. Рассмотрим способ, позволяющий объединить оба условия.
 

Логическое И (AND)
 

AND (И) коньюктивно объединяет логические условия:
Условие_1 AND Условие_2 [AND Условие_3] …

Результат такого объединения лишь тогда истинен, когда истинно каждое отдельное условие.

Пример :
DIM zahl1%, zahl2%
CLS
DO
INPUT "Введите число 1> 0", zahl1%
INPUT "Введите число 2 < 0 ", zahl2%
LOOP UNTIL zahll %>0 AND zahl2% < 0
PRINT "Спасибо за корректный ввод"
'Конец программы

Только тогда, когда zahl1% > 0 и zahl2%< 0, значение всего логического выражения станет истинно, а значит, выполнение цикла закончится.

 

Логическое ИЛИ (OR)
OR (ИЛИ) дизъюнктивно объединяет логические условия:
Условие_1 OR Условие_2 [OR Условие_3...]

Результат такого объединения только тогда ложен, когда ложны все составляющие.

Пример:
DIM zahl1%, zahl2%
CLS
DO
PRINT "Число 1 или число 2 должно быть больше нуля"
INPUT "Введите число 1", zahl1%
INPUT "Введите число 2", zahl2%
LOOP UNTIL zahl1% >0 OR zahl2% >0
PRINT "Спасибо за корректный ввод"
'Конец программы

В этом примере выход из LOOP-цикла не произойдет только в том случае, если значение каждого из вводимых чисел будет меньше или равно нулю.
 

Логическое отрицание (NOT)
NOT инвертирует (меняет на противоположное) значение логического выражения, т.е. то, что было "ложь", становится "истиной" и наоборот.

Пример:
DIM zahl%
CLS
INPUT "Введите число " zahl%
IF NOTzahl% > 0 THEN
PRINT "Число не больше нуля"
ELSE
PRINT "Число больше нуля"
END IF
'Конец программы

 

Приоритет


В первую очередь вычисляется значение функции под операцией NOT, потом AND, и в конце OR, XOR.
 

Пример:
'Использование в логических выражениях логические операции
А=((2>5) AND (6<=6)) OR (NOT(8<>9))
PRINT A
END
'Конец программы


В результате на экране вы увидите:
0

 

Оператор условного перехода в программе


Этот оператор позволяет изменять порядок выполнения операторов в программе в зависимости от определенных условий. Синтаксис оператора:
IF Условие THEN
[Оператор 1-1]
[Оператор 1-n]
[ELSE
[Оператор 2-1]
[Оператор 2-m]
END IF


Как видно из синтаксического описания, оператор IF состоит из THEN-ветви с операторами 1-1 ... 1-n и из ELSE-ветви, которая содержит операторы 2-1 ... 2-m. Если условие, заданное в операторе IF истинно, то выполняется THEN-ветвь, т.е. последовательно выполняются операторы 1-1 ... 1-n. В противном случае выполняются операторы 2-1... 2-m ELSE-ветви. После выполнения одной из ветвей работа программы продолжается с оператора, следующего за END IF, если ход выполнения программы не изменяется оператором GOTO.

Если отсутствует ELSE-ветвь и условие в операторе IF ложно, то работа программы всегда продолжается с оператора, следующего за END IF. В отличие от ELSE ключевое слово THEN пропускать нельзя. В прежних версиях BASIC часто незаменимой была конструкция условного перехода, т.е. комбинация операторов IF и GOTO.

3. Циклические структуры

 

Цикл WHILE


С помощью конструкции WHILE … WEND можно реализовать выполнение ряда операторов до тех пор, пока выполняется определенное условие. Последовательность операторов, выполнение которых повторяется циклически, называется циклом.
WHILE Условие
[Оператор_1]
.
.
.
[Оператор_n]
WEND

До тех пор пока соблюдается условие, последовательно выполняются операторы от 1 до n. Ключевое слово WEND закрывает конструкцию по аналогии с командой END IF. Если условие цикла больше не соблюдается, то выполнение программы продолжается, начиная с оператора, следующего за WEND.Если условие цикла WHILE не выполняется с самого начала, то управление сразу же передается оператору, расположенному за WEND. Следите за тем, чтобы действия внутри цикла влияли на WHILE-условие. В данном примере показано, что произойдет, если эту рекомендацию не выполнить.
 

Пример:
'Конструкция цикла WHILE с подвохом
DIM i%
i%=1
WHILE i%=1
PRINT "1-ый оператор в While-цикле"
PRINT "2-ой оператор в While-цикле"
WEND
'Конец программы

Примечание: Если Вы используете цикл WHILE ... WEND, следите за тем, чтобы к моменту первой проверки логического условия переменные, входящие в него, были установлены соответствующим образом.

Цикл DO

Конструкция DO...LOOP очень похожа на WHILE...WEND. Здесь также имеется последовательность операторов, повторное выполнение которых зависит от некоторых условий.
 

Вариант 1:
DO
[Оператор_1]
.
.
.
[Оператор_n]
[EXIT DO]
LOOP [{WHILE I UNTIL} Условие ]
Вариант 2:
DO [{WHILE I UNTIL} Условие]
[Оператор_1]
.
.
.
[Оператор_n]
[EXIT DO]
LOOP

 

{WHILE I UNTIL} - Ключевыми словами WHILE или UNTIL определяется способ проверки условий. При использовании WHILE цикл выполняется до тех пор, пока соблюдается условие (значение логического выражения истинно). И, наоборот, при использовании UNTIL цикл выполняется только тогда, когда условие не соблюдается (значение логического выражения ложно).
EXIT DO - Оператор EXIT DO преждевременно прерывает выполнение цикла.
DO...LOOP- Работа программы продолжается с оператора, следующего за LOOP.

В первом варианте цикл выполняется по крайней мере один раз, так как проверка условия находится в конце цикла. А во втором варианте цикл может вообще не выполняться, если соответствующее условие с самого начала не позволяет входить в него. Этот вариант очень похож на цикл WHILE...WEND. Как видно из синтаксического описания, DO...LOOP может работать без проверки условий. В этом случае из бесконечного цикла можно выйти с помощью оператора EXIT DO.

 

Цикл FOR...NEXT

 

Используя оператор FOR...NEXT, можно программировать циклы, количество прохождений которых зависит от значения счетчика.
FOR Счетчик = Нач_значение ТО Кон_значение [STEP Шаг]
[Оператор_1]
.
.
.
[Оператор_n]
[EXIT FOR]
NEXT Счетчик


Счетчик - Арифметическая переменная, которая изменяется при повторении цикла. Ее часто называют управляющей переменной цикла.
Нач.значение- Арифметическое выражение, задающее начальное значение счетчика.
Кон.значение - Арифметическое выражение, задающее конечное значение счетчика.
Шаг - Арифметическое выражение, задающее приращение счетчика при каждом прохождении цикла. Если эта опция пропущена, значение шага по умолчанию принимается равным +1
EXIT FOR- Прерывает выполнение цикла. Программа продолжает работу с оператора,
следующего за NEXT FOR.

Операторы между FOR и NEXT повторяются до тех пор, пока управляющая переменная цикла не превысит конечное значение. После каждого прохождения цикла переменная цикла изменяется на величину шага. Если шаг — положительное число, то начальное значение переменной цикла должно быть меньше конечного значения, иначе цикл ни разу не выполнится, и, наоборот, если шаг отрицательный, то начальное значение переменной цикла должно быть больше конечного, иначе опять-таки цикл ни разу не отработает. В остальных случаях количество прохождений цикла с шагом — это ближайшее большее целое от выражения: "( конечное значение — начальное значение+1) / шаг", если шаг положительный, и "(конечное значение—начальное значение-1) / шаг", если шаг отрицательный.

4. Оператор выбора SELECT CASE


SELECT CASE предназначен для выполнения одного из альтернативных действий, перечисленных в нем. Выбор определяется значением управляющей переменной. Начнем с представления синтаксиса:
SELECT CASE Переменная
CASE Сравнение_1
[Операторы_1]
[CASE Сравнение_2
[Операторы_2] ]...
[CASE ELSE
[Операторы] ]
END SELECT


Сначала выполняется Сравнение_1. Если результат истинен, выполняются Операторы_1, после чего выполнение программы продолжается с оператора, следующего за END SELECT. Если результат Сравнения_1 ложен, то проверяется условие следующей ветви CASE. В итоге выполняются операторы той CASE-ветви, для которой выполняется условие сравнения. Если же ни для одной ветви результатом сравнения не является истина, то выполняются операторы ветви CASE ELSE.

Примечание: Применение CASE ELSE не обязательно. Однако эту ветвь все же следует описывать, так какv QBASIC выдает сообщение об ошибке, если ее нет и ни для одного из сравнений не был получен истинный результат.

CASE-сравнение в простейшем случае состоит только из одного выражения (например, из чисел или из переменных). Однако можно включать списки выражений (выражение_1, выражение_2,.„) или даже целые области (выражение_1 ТО выражение_2). Далее значение переменной можно оценивать с помощью операторов сравнения, как в случае с условиями. Для этого после CASE применяется ключевое слово IS, за которым следует операция отношения и выражение.

Пример 1:
В этом примере вводимое число проверяется на принадлежность к определенному интервалу.
‘ SELECT ... CASE
CONST zehn%= 10
DIM zahl%
CLS
INPUT "Задать число "; zahl%
SELECT CASE zahl%
CASE 1, 2 'список значений
PRINT "Число 1 или 2"
CASE 3 TO 10 'область значений
PRINT "Число в диапазоне от 3 до 10"
CASE IS = 11 'сравнение с IS и оператор
PRINT "Число 11"
'Разумеется, выражение для сравнения может быть и посложнее
CASE IS < zehn% + 10
PRINT "Число меньше 20"
CASE ELSE
PRINT "Это все, что я знаю о числе "
END SELECT
PRINT "Конец"
'Конец программы

Пример 2:
Иногда важно, в какой последовательности располагаются CASE-ветви. Рассмотрим пример.
'SELECT...CASE с подвохом
DIM zahl%
CLS
INPUT "Ввести число "; zahl%
SELECT CASE zahl%
CASE IS < 10
PRINT "Число меньше 10"
CASE IS < 20
PRINT "Число меньше 20"
CASE IS < 5
PRINT "Число меньше 5"
CASE ELSE
PRINT "Решение не встретилось"
END SELECT 'Конец программы

Третья CASE-ветвь никогда не будет выполнена, так как число, которое меньше 5, всегда меньше 10, а значит, после первой CASE-ветви выполнение оператора SELECT завершится.