Программа разветвляющейся структуры




Программа разветвляющейся структуры обязательно содержит условия, в зависимости, от которых предусматривают выбор одной из нескольких последовательностей операторов (ветвей). Для организации разветвлений в программах используются операторы перехода, условий и выбора. Рассмотрим их конструкции и применение.

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 допускает последовательность операторов, разделенных символом '; ' (точка с запятой).



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: