Входить внутрь оператора варианта по какому-либо оператору перехода GOTO, находящемуся вне оператора варианта, нельзя. Выполнение оператора варианта сводится к выполнению только одного из входящих в его состав операторов, поэтому переходить с одного из них на другой с помощью оператора перехода GOTO запрещается.
.............
...........
REPEAT
.............
End;
Begin
K1:=1;
UNTIL условие;
Оператор1, оператор2, ... , операторN
REPEAT
Оператор цикла с постусловием
Оператор цикла с предусловием
Если число повторений, выполняемых в цикле, заранее не известно или шаг приращения счетчика (параметра) цикла отличен от единицы, то необходимо использовать оператор цикла с предусловием. Оператор цикла этого вида имеет вид:
WHILE
условие
DO
оператор
;
где условие - это логическое выражение, от значения которого зависит- продолжать повторы или завершить цикл;
оператор - любой простой или составной оператор.
Выполнение оператора начинается с вычисления значения логического выражения. Если оно имеет значение "True" (истина), то выполняется оператор (операторы), входящий в цикл. Выполнение цикла продолжается до тех пор, пока логическое выражение в его заголовке не примет значение "False" (ложно). Если выражение равно "False" при первом же витке цикла, то работа цикла завершится, а входящие в него операторы не выполнятся ни разу. Поскольку в цикле типа WHILE...DO условие завершения его работы проверяется до выполнения входящего в него оператора, такой цикл называется "оператор цикла с предусловием".
Пример использования оператора цикла с предусловием:
Program Primer;
Var K:integer;
Begin
K:=0;
WHILE K<=10 DO
begin K:=K+2; Write('K= ',K:3) end;
Readln
End.
Цикл этой разновидности применяется в случаях, когда число повторений оператора, входящего в тело цикла, заранее не известно. Такой цикл похож на цикл с предусловием, но в данном случае условие завершения повторов проверяется после выполнения операторов, составляющих тело цикла. Общий вид оператора цикла с постусловием таков:
где оператор1, оператор2, ... , операторN - операторы тела цикла;
Оператор цикла с постусловием начинается с выполнения операторов внутри цикла. Затем проверяется истинность логического условия, стоящего после слова UNTIL. Если это условие справедливо (True), то осуществляется выход из цикла. Если же значение логического выражения ложно (False), то выполнение операторов тела цикла повторяется, после чего снова проверяется истинность логического условия.
Пример программы, использующей оператор цикла с постусловием:
Program Primer;
Var K:Integer;
Begin
K:=0;
REPEAT
K:=K+2; Write('K= ',K:3)
UNTIL K>10;
Readln
End.
4.2.7.5. Правила использования операторов цикла
При использовании операторов цикла следует учитывать следующие особенности:
1. Операторы, входящие в цикл Repeat...Until, всегда выполняются хотя бы один раз, поскольку истинность логического выражения в цикле этого типа проверяется после операторов, входящих в тело цикла. При использовании цикла типа WHILE...DO могут быть ситуации, когда операторы, входящие в цикл, не будут выполнены ни разу, если логическое выражение изначально имеет значение "FALSE".
2. Цикл Repeat...Until выполняется, пока логическое выражение имеет значение "FALSE". Цикл While...Do выполняется, пока логическое выражение имеет значение "TRUE". Этот нюанс следует учитывать при замене цикла одного типа другим.
Program Whl;
Var i:integer;
Begin
i:=1;
WHILE i<=10 DO
begin
Writeln('Привет');
i:=i+1
end;
Readln
End.
Program Rep;
Var i:integer;
Begin
i:=1;
REPEAT
Writeln('Привет');
i:=i+1
UNTIL i>10;
Readln
End.
3. Если тело цикла "WHILE...DO" состоит из нескольких операторов, их следует обрамлять операторными скобками "begin...end", образующими составной оператор. В цикле типа "REPEAT...UNTIL" операторные скобки не нужны.
4. Одной из опасностей, возникающих при использовании оператора цикла, является "зацикливание", т.е. возникновение ситуации, когда программа не выходит из цикла, бесконечно повторяя входящие в него операторы:
k1:=1; WHILE k1<5 DO Writeln('Бесконечный цикл');
Если в программе встретится такой фрагмент, то экран заполнится строками с фразой "Бесконечный цикл", выдача которой в режиме прокрутки (Scrolling) будет длиться до тех пор, пока программистом не будут приняты действия по принудительному завершению работы программы. Вывести программу из бесконечного цикла можно, дважды нажав сочетание клавиш “Ctrl” и “Break”, после чего надо нажать клавишу “ESC”.
Зацикливания не произойдет, если операторы, входящие в тело цикла, будут влиять на условие, определяющее завершение цикла:
WHILE k1<5 DO
Writeln('Цикл');
k1:=k1+1
В этом фрагменте цикл выполнится ровно 4 раза и компьютер перейдет к следующим командам.
5. При использовании операторов цикла с предусловием и постусловием необходимо быть осторожным в тех случаях, когда в логическом выражении (условии окончания цикла) фигурируют вещественные переменные. Следует помнить, что в компьютере значения выражений вещественного типа вычисляются приближенно, т.е. с небольшой погрешностью. Например, вещественное число 1.0 в компьютере может быть представлено как 0.99999999 или как 1.00000001 . Поэтому фрагмент
UNTIL X=B;
где X, B : Real, будет неправильным, хотя с математической точки зрения он верен. Условие "X=B" скорее всего никогда не выполнится, в результате произойдет "зацикливание" программы. Не следует управлять циклом с помощью логического выражения, в котором вещественные переменные проверяются на строгое равенство.
4.2.8. Оператор варианта "CASE"
Характерной чертой некоторых алгоритмов является широкая разветвленность задаваемого ими вычислительного процесса. Использование в таких случаях условного оператора IF...THEN может оказаться громоздким и недостаточно наглядным, поэтому лучше применять оператор варианта. Общий вид оператора варианта таков:
CASE селектор OF
метка1: оператор1;
метка2: оператор2;
................
меткаN: операторN
ELSE альтернативный оператор
END;
Оператор CASE состоит из селектора (переменной целого, символьного или логического типа) и списка операторов, каждому из которых предшествует метка варианта, представляющая собой значение того же типа, что и селектор. При работе оператора CASE будет выполнен тот входящий в него оператор, чья метка равна текущему значению селектора. Если ни одна из меток не содержит значения селектора, то не выполняется ни один оператор. Следует оговориться, что Турбо-Паскаль, в отличие от стандартного Паскаля, допускает использование в операторе CASE ключевого слова ELSE. В случае отсутствия меток, равных значению селектора, выполняется оператор, стоящий за словом ELSE (альтернативный оператор). Подчеркнем, что "метку варианта" не следует путать с "меткой оператора", используемой в операторе перехода GOTO. Метки варианта не описываются в блоке LABEL раздела описаний программы и не используются в операторе перехода GOTO.
Примеры использования оператора CASE:
..........
...........
Label Final;
Var
Var
Var Operator:Char;
i,m:integer;
Symbol:Char;
Rez:integer;k:integer;
Begin
Begin
Begin
CASE i OF
CASE Symbol OF
CASE Operator OF
0: m:= 0;
'=': k:=1;
'+': Rez:=Rez+1;
1: m:= -1;
'!': k:=2;
'-': Rez:=Rez-1;
2: m:= 1
'.': k:=3
ELSE GOTO Final
End;
End;
End;
............
..............
...............
............
..............
Final: ...............
End.
End.
End.
В операторе варианта предусмотрен случай, когда некоторый оператор должен выполняться при любом из нескольких возможных значений селектора. В этом случае оператору предшествует не одна метка, а список меток этого варианта:
...................
Var i,m:integer;
Begin
...................
CASE i OF
0: m:=0;
1,2,3: m:=4;
4: m:=-1
End;
...................
End.
Войти в оператор варианта можно только через его начало: CASE селектор OF;