Программа разветвляющейся структуры обязательно содержит условия, в зависимости, от которых предусматривают выбор одной из нескольких последовательностей операторов (ветвей). Для организации разветвлений в программах используются операторы перехода, условий и выбора. Рассмотрим их конструкции и применение.
3.2Оператор безусловного перехода
Оператор безусловного перехода вызывает передачу управления оператору, которому предшествует метка. Общий вид такой:
goto метка;
Метка должна быть описана в разделе label. Объявление метки имеет вид: label метка;
Допускается объявить список меток:
label метка1, метка2, метка3;
Между меткой и данным оператором можно включить один или несколько пробелов.
Пример.
label 10, М2
goto М2;
10: A:=2;
........
32: Y: =X/A;
Оператор, следующий непосредственно после оператора goto, всегда должен иметь метку (иначе он никогда не будет выполнен).
Между словами go и tо пробел не допускается.
При использовании элементов перехода должны соблюдаться следующие правила:
Все метки, используемые в блоке, должны быть описаны, причем каждая не более одного раза.
Метка, указанная в операторе перехода, должна помечать оператор, находящийся в том же блоке, что и сам оператор перехода. Т.е. не допускаются переходы из внешних процедур во внутренние и наоборот.
Переход внутрь структурного оператора может вызвать непредсказуемые эффекты, хотя компилятор не выдает сообщения об ошибке. Использование безусловных передач управления в программе считается теоретически избыточным и подвергается серьезной критике, так как поощряет создание малопонятных и трудно модифицируемых программ, которые вызывают большие сложности при отладке и сопровождении. При использовании операторов перехода рекомендуется соблюдать следующие правила:
следует стремиться применять операторы перехода (если кажется невозможным обойтись без них) для передачи управления только ВНИЗ по тексту программы (вперед); при необходимости передачи управления “назад” следует использовать операторы цикла.
расстояние между меткой и оператором перехода на нее не должно превышать одной страницы текста (или высоты экрана дисплея).
Оператор условного перехода IF
Полная форма условного оператора имеет вид:
if < логическое_выражение > then оператор_1 [ else оператор_2];
Если логическое выражение истинно, то выполняется оператор 1; иначе выполняется оператор 2. Квадратные скобки в записи полной формы условного оператора означают, что конструкция else с оператором 2 может отсутствовать. В этом случае имеем краткую форму условного оператора:
if логическое выражение_ then оператор 1.
Например:
if A>25 then Y: =X-6;
Z: =SUM+1
В этом фрагменте представлено два независимых оператора. Один из них условный, другой оператор присваивания. Если условие А>25 истинно, то вычисляется значение Y и происходит передача управления на вычисления значения Z.
Если условие А>25 ложно, т. е. А? 25, то сразу выполняется оператор присваивания Z=SUM+1.
Целесообразно при написании программ использовать следующую форму записи оператора if:
if логическое выражение then
оператор 1
Else
оператор 2
Следует помнить, что перед else точка с запятой не ставится.
Оператор 1,2-это простые или составные операторы. Если логическое выражение истинно, то выполняется оператор 1, иначе - оператор 2 (или следующий за if оператор, если else отсутствует). В качестве операторов 1,2 могут использоваться другие операторы if. В этом случае каждое else относится к ближайшему слева if, не имеющему else.
Условные операторы имеют вложенную конструкцию, когда после then или else используется также условный оператор. При этом справедливо следующее правило: else всегда относится к ближайшему слева оператору if.
Действие условного оператора можно расписать путем использования составного оператора. В этом случае после слов then и else могут быть составные операторы;
if < логическое_выражение> then
Begin
оператор 1;
оператор 2;
...........
оператор n-1;
оператор n
End
Else
Begin
оператор 1;
оператор 2;
..........
оператор n-1;
оператор n;
End
Перед служебным словом else не ставится знак точки с запятой. Внутри составных операторов могут быть также условные операторы, содержащие простые или составные операторы.
Пример 1.
Для программной реализации этих вычислений можно использовать вложенную конструкцию условного оператора.
if x>0 then
if x>=1 then
Y: =Sqrt(X)*Sin(X)
Else
Y: =Exp(1/3*Ln(X))*Cos(X)
Else
Y: =Exp(1/4*Ln(Abs(X)))/4;
или
if X>=1 then
Y: =Sqrt(X)*Sin(X)
Else
if X>0 then
Y: =Exp(1/3*Ln(X))*Cos(X)
Else
Y: =Exp(1/4)*Ln(Abs(X)))/4;
Второй вариант записи более предпочтителен с точки зрения удобства чтения и наглядности программы.
Пример 2. Запишем оператор if для следующей алгебраической схемы:
if A=B then
if C<D then
X: =1
Else
X: =2
Else
X: =3;
Заметим, что точка с запятой ставится в конце оператора. Этот же оператор можно записать с использованием трех операторов if:
if (A=B) and (C<D) then X: =1;
if (A=B) and (C>=D) then X: =2;
if A<>B then X: =3;
В этом примере наличие скобок в логических выражениях операторов if является обязательным, так как операции сравнения имеют более низкий приоритет, чем логические операции. Ввиду этого следующий оператор if не приведет к желаемой цели
if A=B and C=D then
X: =1;
В состав условного оператора может входить только один оператор. Если в какую либо ветвь требуется вставить несколько операторов, то они объединяются в один составной оператор, для чего в начале записывается слово begin (начало), а в конце служебное слово end (конец).
Пример 3. Составить программу для вычисления следующего выражения:
где a=2, 34*10; b=17, 2
program raz1;
Const
A=2. 34E+2;
B=17. 2;
Var
K, K1, K2: real;
Begin
K1: =Sqrt(15*A*A+21*B*B);
K2: =Sqrt(15*B*B+21*A*A);
if A>B then
K: =K1;
if (A>1) and (A<=B) then
K: =K2;
if A<=1 then
Writeln (' Результат не определен ')
Else
Write (' K=', k)
end.
Другой менее удачный вариант этой же программы:
Program raz2;
label 10;
Const
A=2.34E+2;
B=17. 2;
Var
K: real;
Begin
if A>B then
K: =Sqrt(15*A*A+21*B*B);
if (A>1) and (A<=B) then
K: =Sqrt(15*B*B+21*A*A);
if A<=1 then
Begin
write (' Результат не определен');
goto 10;
end;
Write(' K=', K);
10:;
end.
Оператор выбора CASE
Данный оператор является обобщением условного оператора.
Его общий вид следующий:
case выражение of
список_констант_1: оператор_1;
список_констант_2: оператор_2;
...
список_констант_n: оператор_n
end;
Здесь значения выражения и констант должны быть одного и того же скалярного типа (кроме real), т. е. integer, boolean, char, ограниченный тип или тип “перечисление”. Оператор выбора действует следующим образом: если значение выражения равно одной из констант, то выполняется соответствующий ей оператор. Затем управление передается за пределы оператора выбора. Если значение выражения не совпадает ни с одной константой, то управление сразу передается за пределы оператора выбора.
Пример:
case I+1 of
2: X: =0;
1OO, 3: X: =X*X;
4: X: =sin(X)
end;
A: =A+1;
Если значение I+1 есть 100 или 3, то выполняется оператор X: =Х*Х, а затем управление передается на оператор А: =А+1.
Замечание. Метки оператора case не описываются в разделе lаbel, и на них нельзя переходить оператором goto.
В Тurbo Pascale оператор case может использоваться с ключевым словом else, имеющем тот же смысл, что и слово else в операторе if:
case выражение of
список_констант_1: оператор_1;
..............................
список_констант_n: оператор_n
else оператор
end;
Перед else, как и в операторе if, точка с запятой не ставится.
Пример:
program pr;
Var
I: char;
Begin
read (I);
case I of
'A'.. 'Z', 'a'.. 'Z': Write (' Введена буква');
'0'.. '9': Write (' Введена цифра')
else Write (' Введен символ, отличный от буквы и цифры')
end;
end.
Кроме одиночных констант в альтернативах оператора варианта могут быть заданы списки и / или диапазоны значений, которые в этом случае должны разделятся символом ', ' (запятая), например:
case Switch of
1.. 2: Proc1;
3, 4, 10.. 20: Proc2;
5, 6: Proc3
Else
Proc4
End
В этом примере оператор процедуры Proc 2 будет выполнен в том случае, когда переменная switch будет иметь одно из следующих значений:
3, 4, 10, 11, 12, …, 19, 20
При использовании оператора варианта должны выполнятся следующие правила:
Значение выражения - “переключателя”, записанного после служебного слова case, должно принадлежать дискретному типу; для целого типа они должны лежать в диапазоне -32769.. 32768.
Все константы, предшествующие операторам альтернатив, должны иметь тип, совместимый с типом выражения.
Все константы в альтернативах должны быть уникальны в пределах оператора варианта (то есть повторения констант в альтернативах не допускаются); диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах.
Следует обратить внимание на то, что синтаксис языка предполагает один оператор для каждой альтернативы; при необходимости задания нескольких операторов следует сгруппировать их в составной оператор. В то же время ветвь else допускает последовательность операторов, разделенных символом '; ' (точка с запятой).