Условный оператор IF...THEN...ELSE (если...то...иначе) имеет структуру
If Условие THEN Оператор1 ELSE Оператор2;
и служит для организации процесса вычислений в зависимости от какого-либо логического условия. Под условием понимается логическое значение True (истинно) или False (ложно), представленное константой, переменной или логическим выражением, например:
IF True THEN...; { крайний и бесполезный случай условия }
IF LogicalVar THEN...; { условие — логическая переменная }
IF not LogicalVar THEN...; {условие — логическое выражение}
IF x > 5 THEN...; { условие — результат операции сравнения}
Если условие представлено значением True, то выполняется оператор (простой или составной), следующий за словом THEN. Но если условие не выполняется, т.е. представлено значением False, то будет выполняться оператор (может быть простым или составным), следующий за словом ELSE. Например: {94}
IF x>5
THEN { ветвь при x>5 - истинно }
begin
x:=x+5; y:=1 { некий составной оператор }
end
ELSE { ветвь при x>5 - ложно }
y:=-1; { простой оператор }
В примере между ключевыми словами нет точек с запятой. Более того, их появление было бы ошибкой, что будет показано ниже. Но точка с запятой в конце всего оператора (после завершения ветви ELSE) обязательна. Она отделяет условный оператор от остальных, следующих за ним по тексту. Альтернативную ветвь ELSE можно опускать, если в ней нет необходимости. В таком «усеченном» условном операторе в случае невыполнения условия ничего не происходит, и выполняется следующий за условным оператор. Имеет «право на жизнь» условный оператор с ветвями, содержащими пустые операторы, например такой:
IF LogicFunc(x) THEN;
Он полезен в случаях, когда условием является возвращаемое значение какой-либо логической функции, имеющей побочный эффект. Например, известны библиотеки подпрограмм (Turbo Power Toolbox), где для создания окна на экране дисплея имеются функции, собственно строящие окно и возвращающие логическое значение в зависимости от результата построения. Приведенная выше конструкция позволяет проявиться побочному эффекту, игнорируя возвращаемое значение.
Условные операторы могут быть вложенными друг в друга:
IF Условие
THEN { "Условие" выполняется }
if ПодУсловие { "ПодУсловие" выполняется }
then
begin
...
end
else { "ПодУсловие" не выполняется }
begin
...
end
ELSE { "Условие" не выполняется }
begin
...
end; {95}
Еще раз обращаем внимание на отсутствие точки с запятой между ключевыми словами до самого внешнего слова END.
При вложениях условных операторов самое главное — не запутаться в вариантах сочетаний условий (отчасти этому может помочь ступенчатая форма записи операторов). Всегда действует правило: альтернатива ELSE считается принадлежащей ближайшему условному оператору IF, не имеющему ветви ELSE. Именно это правило заложено в компилятор, и, как следствие этого, есть риск создать неправильно понимаемые условия. Например:
IF Условие1
THEN
if Условие2
then ОператорА
ELSE
ОператорБ;
По записи похоже, что ОператорБ будет выполняться только при невыполнении Условия1. Но в действительности он будет отнесен к Условию2 и выполнится лишь при выполнении Условия1 и невыполнении Условия2. Попытка закрыть вложенный условный оператор установкой «;» после ОператораА лишь ухудшит положение. Выход здесь таков: нужно представить вложенное условие как составной оператор
IF Условие1
THEN
begin
if Условие2
then ОператорА
end
ELSE
ОператорБ;
и для ветви ELSE ближайшим «незакрытым» оператором IF окажется оператор с Условием1.
В условии оператора IF может стоять достаточно сложное логическое выражение. В нем придется учитывать приоритет различных логических и математических операций, а также текущую схему компиляции логических выражений в Турбо Паскале. (Подробнее об этом см. разд. 9.3 «Логические вычисления и операции отношения».)
6.3. Оператор варианта (CASE)
Оператор варианта необходим в тех случаях, когда в зависимости от значений какой-либо переменной надо выполнить те или иные {96} операторы (простые или составные). Если вариантов всего два, то можно обойтись и оператором IF. Но если их, например, десять? В этом случае оптимален оператор варианта CASE. Структура оператора CASE имеет вид
CASE УправляющаяПеременнаяИлиВыражение OF
НаборЗначений1: Оператор1;
НаборЗначений2: Оператор2;
НаборЗначенийЗ: ОператорЗ;
...
НаборЗначенийN: ОператорN
ELSE
АльтернативныйВсемНаборамОператор
END;
Между служебными словами CASE и OF должна стоять переменная или выражение (оно вычислится при исполнении оператора CASE). Тип переменной (или значения выражения) может быть только перечислимым (включая типы Char и Boolean), диапазоном или целочисленным одного из типов Byte, ShortInt, Integer или Word. Все прочие типы не будут пропущены компилятором Турбо Паскаля. Набор значений — это конкретные значения управляющей переменной или выражения, при которых необходимо выполнить соответствующий оператор, игнорируя остальные варианты. Если в наборе несколько значений, то они разделяются между собой запятыми. Можно указывать диапазоны значений. Между набором значений и соответствующим ему оператором обязательно должно ставиться двоеточие «:».
Оператор в конкретном варианте может быть как простым, так и составным. Конец варианта обязательно обозначается точкой с запятой. Турбо Паскаль допускает необязательную часть ELSE. Если значение переменной (выражения) не совпало ни с одним из значений в вариантах, то будет выполнен оператор, стоящий в части ELSE.
Завершает оператор CASE слово END. По-прежнему перед ELSE и END необязательна точка с запятой. Рассмотрим пример оператора варианта (в нем Err — переменная типа Word):
CASE Err OF
0: WriteLn('Нормальное завершение программы');
2, 4, 6: begin
WriteLn('Ошибка при работе с файлом');
WriteLn('Повторите действия снова.')
end; {97}
7..99: WriteLn('Ошибка с кодом ', Err)
ELSE
WriteLn('Код ошибки=",Err,' См. описание')
END;
Здесь в зависимости от значения переменной Err выводится на экран операторами WriteLn текст соответствующего сообщения. Наличие варианта ELSE (Err не равна 0, 2, 4, 6 и не входит в диапазон 7..99) гарантирует выдачу сообщения в любом случае.
Значения в каждом наборе должны быть уникальными, т.е. они могут появиться только в одном варианте. Пересечение наборов значений для разных вариантов является ошибкой, и она будет замечена компилятором.
Оператор варианта CASE очень удобен и, как правило, более эффективен, чем несколько операторов IF того же назначения. Эффективность его в смысле скорости будет максимальной, если размещать наиболее вероятные значения (или их наборы) первыми в порядке следования.