Алгоритмы с циклической структурой . Операторы циклов While и Repeat. Общие черты и различия циклических операторов.
Поскольку алгоритмы с циклической структурой применяются для решения почти любой серьёзной задачи, то в языке Pascal для реализации циклов предусмотрено 3 различных оператора. С одним из них – оператором For – мы познакомились на прошлом занятии. Теперь давайте познакомимся с двумя оставшимися – операторами While и Repeat.
Оператор while имеет следующую структуру:
while логическое условие do
тело цикла
Если расшифровать эту надпись простыми словами, оператор while имеет следующий смысл:
Делать (do) что-то - тело цикла, пока (while) будет выполняться логическое условие
Например, пока i<=10, будем прибавлять к числу a пятёрку:
i:=1;
while i<=10 do
begin
a:=a+5;
inc(i);//функция inc увеличивает значение i на 1 (i:=i+1)
end;
Как видим, мы сами задаём, как будет изменять наш счётчик цикла i. Причём совершенно необязательно, чтобы он изменялся ровно на 1. Например, мы можем задать шаг счётчика цикла (его изменение) равным 0,5 или 4.
Изменение в теле цикла счётчика цикла обязательно, иначе цикл будет выполняться бесконечно (в отличие от оператора For, при использовании которого компилятор сам автоматически прибавляет к счётчику цикла по единице (в случае For k:=x to y, если x<y) или убавляет на единицу (в случае For k:=y down to x, если x<y)). Итак, важная особенность применения операторов while и repeat заключается в необходимости следить за счётчиком цикла, чтобы в итоге выйти из цикла.
Кроме того, если оператор For можно использовать только в том случае, когда заранее или в процессе работы программы при подходе к циклу точно известно, сколько раз будет выполнен данный цикл, то операторы while и repeat можно использовать в любом случае, в том числе и вместо цикла с For.
Например, цикл
For k:=4 to 6 do sum:=sum+3
можно записать с помощью оператора while следующим образом:
k:=4;
while k<=6 do
begin
sum:=sum+3;
k:=k+1;
end;
Оба этих цикла будут выполнены 3 раза.
Также для задания циклической структуры используется и оператор Repeat:
Repeat
тело цикла
until логическое условие
Этот оператор можно трактовать следующим образом:
повторяем (repeat) что-то (тело цикла), пока (until) логическое условие не перестанет выполняться
Давайте посмотрим на фрагмент программы, представленный выше:
k:=4;
while k<=6 do
begin
sum:=sum+3;
k:=k+1;
end;
и запишем его с помощью оператора repeat:
k:=4;
repeat
sum:=sum+3;
k:=k+1
untilk>6
Заметьте, что операторы whileи repeat имеют противоположные задания условий: в случае while наше условие k<=6 (пока kменьше или равно 6), а в случае применения оператора repeatэто условие будет обратным: k>6 (до тех пор, пока k не станет больше 6).
Кроме этого, в операторе repeatнет необходимости ставить операторные скобки begin-end, так как тело цикла чётко ограничивается словами repeat-until и перед until «;» необязательна.
Если вы посмотрите внимательно, то увидите, что особенность оператора repeat такова, что тело цикла выполнится хотя бы 1 раз. В случае же с while цикл может не выполнится ни разу. Это подтверждает следующий пример:
i:=7
while i>7 do
тело цикла;
i:=i-0.3;
end;
В данном случае цикл не выполнится ни разу
i:=7;
repeat
тело цикла;
i:=i-0.3;
until i<7
Во втором случае тело цикла выполнится 1 раз, так проверка (until i<7) производится уже после выполнения тела цикла.
Для лучшего понимания наших операторов давайте напишем одну простую программу, которая возводит введённое пользователем число xв степень, пока это число не станет большим некоторого второго введённого числа y(x2, x3, x4и т.д.):
Program Pr_17_18;
Var
x,y,z: real;
Begin
Writeln(‘Введитеx,y:’);
Readln(x,y);
z:=x;
while z<y do
begin
writeln(z);
z:=z*x;
end;
Readln;
End.
Если мы введём x=2, y=15, то программа выведет числа: 2, 4, 8.