Смекни!
smekni.com

Курс лекций (стр. 21 из 24)

if K > 5 then

begin

X := X + 5; Y := 1

end

else

Y := -1;

Здесь после then следует составной оператор, перед словом else точки с запятой нет, а затем простой оператор (между ключевыми словами точки с запятой не требуется). Точка с запятой после else обязательна, т.к. она отделяет весь условный оператор от последующего.

Часть else <оператор 2> может быть опущена. При этом если условие дает False оператор пропускается и программа переходит к следующему.

Условные операторы могут быть вложенными друг в друга. При создании такой сложной конструкции самое главное - не запутаться в вариантах сочетаний условий (чему может помочь ступенчатая форма записи). При этом всегда действует правило: альтернатива else считается принадлежащей ближайшему условному оператору if, не имеющему своей ветви else. Пример:

if Условие1 then

if Условие2 then

ОператорA

else

ОператорБ;

Можно предположить, что ОператорБ будет выполнен при невыполнении Условия1. На самом деле, имея в виду введенное правило, ОператорБ будет выполнен при выполнении Условия1 и невыполнения Условия2. Точка с запятой после ОператорА не помогает, т.к. закрывает весь оператор, а else… становится как бы отдельным оператором. Выход - использование составного оператора:

if Условие1 then

begin

if Условие2 then

ОператорA

end

else

ОператорБ;

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

ОПЕРАТОР МНОЖЕСТВЕННОГО ВЫБОРА

Оператор выбора позволяет выбрать одно из нескольких возможных продолжений программы. Если варианта всего два, то можно использовать оператор if, если больше, то оптимален оператор case, структура которого имеет вид:

case <ключ выбора> of <список выбора> else <операторы> end

где <ключ выбора> - переменная или выражение любого порядкового типа кроме LongInt,

<список выбора> - одна или несколько констукций вида:

<константа выбора> : <оператор>; где константа выбора - константа того же типа, что и ключ выбора.

Если ключ выбора - выражение, то оно вычисляется при исполнении оператора case. В зависимсти от значения ключа выбора выбирается тот оператор, которому предшествует константа выбора, равная вычисленному значению. Оператор может быть простым или составным. Найденный оператор вычисляется, после чего оператор выбора завершает свою работу. Если в списке выбора не будет найдена константа, соответствующая вычисленному значению ключа выбора управление передается операторам (их может быть несколько), стоящим за словом else. Имеется принциальная возможность опускать часть else <операторы>. В этом случае при отсутствии в списке выбора нужной константы ничего не произойдет, и оператор выбора просто завершит свою работу. По-прежнему, перед end и else точка с запятой не обязательна (если поставить - работать будет). Константы выбора могут перечисляться через запятую, а также записываться в виде диапазона. Значения констант должны быть уникальными в каждом наборе, т.е. они могут появиться только в одном варианте. Пересечение набора значений в разных вариантах является ошибкой. Пример:

case I of {I : Word}

1 : X := X +1;

2,3 : X := X +2;

4..9 : begin

Write(X);

X := X + 3 {м.б. ";"}

end {м.б. «;»}

else

X := X*X;

Writeln(X) {м.б. «;»}

end;

Эффективность оператора case будет максимальным, если размещать наиболее вероятные значений первыми в порядке следования.

ОПЕРАТОР ЦИКЛА "ПОКА" (С ПРЕДУСЛОВИЕМ)

В практике программирования циклы - повторяющиеся выполнения одних и тех же операторов - играют очень важную роль. Один из трех стандартных способов организации циклических вычислений связан с использованием оператора цикла с предусловием. Формат:

while <условие> do <оператор>;

Оператор (простой или составной), стоящий после служебного слова do и называемый телом цикла будет выполняться циклически до тех пор, пока выполняется логическое условие, т.е. пока значение условия равно True. Само условие цикла может быть логической константой, переменной или выражением с логическим результатом.

Условие проверяется до начала выполнения каждой итерации. Поэтому, если условие не выполняется сразу на первом же шаге, то тело цикла игнорируется и будет выполняться оператор, стоящий сразу за телом цикла.

Следует помнить о двух моментах:

- чтобы цикл имел шанс когда-либо завершиться, содержимое его тела должно влиять на условие цикла;

- условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.

Пример вычисления 10!

Var

F,N : Integer;

Begin

F := 1; N := 1;

while N <= 10 do

begin

F := F*N;

Inc(N) {N := N + 1}

end;

Writeln(F)

End.

Здесь важно присваивание N := 1 перед началом цикла, без него значение N может быть любым, и условие может быть некорректным.

ОПЕРАТОР ЦИКЛА "ДО" (С ПОСТУСЛОВИЕМ)

Рассмотренный ранее оператор "Пока" решает выполнять свое тело или нет, еще до первой иттерации. Если это не соответствует логике алгоритма, то можно использовать оператор цикла "До" с постусловием, который решает делать или нет следующую иттерацию лишь после завершения предыдущей. В этом операторе тело цикла будет выполнено по крайней мере один раз. Т.о. эти операторы цикла различаются только первым шагом, далее они веду себя идентично. Формат:

repeat <операторы> until <условие>

Операторы между словами repeat и until образуют тело цикла. В теле можт быть несколько операторов, при этом слова begin и end не требуются, их функции выполнют слова repeat и until (перед until можно не ставить ";"). Cравнение с циклом "Пока", где один оператор в теле.

Условие - логическая переменная, константа или выражение с логическим результатом. В отличии от цикла "Пока", если условие имеет значение True, то цикл завершается. Т.е.

Цикл "Пока" - "пока условие истинно, выполнять операторы тела";

Цикл "До" - "выполнять тело цикла, пока не станет истинным условие, т.е. пока оно ложно";

Известна простая конструкция "вечного цикла", в котором тело - пустой оператор

repeat until False;

ОПЕРАТОР ЦИКЛА С ПАРАМЕТРОМ (ЦИКЛ ПО СЧЕТЧИКУ)

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

for <параметр цикла> := <мл.зн.> to <ст.зн.> do <оператор>

Параметр цикла - переменная порядкового типа, к этому же типу должны относиться младшее и старшее значении. На первом шаге параметру цикла присваивается младшее значение, после чего идет его наращивание с постоянным шагом, равным интервалу между двумя ближайшими значениями в типе, к которому относится параметр цикла (для целочисленных типов - это 1, для символьного - от одного символа к другому при увеличении кода на 1, и т.д.). Например,

Var

I : Integer; C : Char ; B : Boolean;

E : (E1,E2,E3,E4);

Begin

for I := -10 to 10 do Write(I);

for C := 'a' to 'z' do Write(C);

for B := False to True do Write(B);

for E := E1 to E4 do {здесь оператор - составной}

begin

I := ORD(E);

Write(I)

end

End.

Изменение параметра может быть не только возрастающим, как в рассмотренных примерах, но и убывающим. В этом случае несколько изменяется синтаксис:

for <параметр цикла> := <ст.зн.> downto <мл.зн.> do <оператор>

Условие, управляющее работой оператора for проверяется перед выполнением тела цикла. Поэтому, если условие не выполняется в самом начале работы, то тело цикла не будет выполнено ни разу. Например, в таком цикле:

for I := 4 downto 5 do …

Запрещается изменять параметр цикла и его младшее и старшее значения (в том случае, если они заданы переменными или выражениями с ними) изнутри тела цикла. Параметр цикла не может участвовать в построении диапазонов этого цикла (for I := I-5 to I+5 do …).

В тех. описании к ТР отмечается, что после выполнения цикла for значение его параметра не определено. На самом деле скорее всего оно будет иметь конечное значение. Тем не менее корректнее его будет переприсвоить. Исключение выход из цикла с помощью goto. В этом случае значение параметра будет таким, каким оно было к моменту исполнения goto.

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

Циклы for допускают вложенность при условии, что никакой из вложенный циклов не использует и не модифицирует переменные - параметры внешних циклов.

ОПЕРАТОР БЕЗУСЛОВНОГО ПЕРЕХОДА

Оператор goto, который имеется во многих алгоритмических языках, в свое время был подвергнут гонениям, как противоречащий принципам структурного программирования. Ибо было доказано, что можно вообще программировать без него. Однако хотя язык Pascal является классическим языком структурного программирования, в нем тем не менее существует этот оператор. Т.е. выбор между чистотой идеи (структурное программирование) и элементарным удобством (использование goto в отдельных случаях) был сделан в пользу последнего. Полный синтаксис оператора безусловного перехода:

goto <метка>;

где метка - описанный в блоке Label идентификатор (может начинаться с цифры). Метка может стоять в программе в любом месте между операторами и отделяется от второго оператора двоеточием ":". Каждая метка может появляться только один раз.

Label

L1, L2;

Begin