Операторы повтора

Операторы повтора используются при организации циклов. Цикл - это последовательность операторов, которая может выполняться более одного раза. Если количество повторов известно заранее, используется оператор for, если количество повторов неизвестно, применяются операторы repeat или while.

Оператор повтора for состоит из заголовка и тела цикла. Он может быть представлен в двух форматах:

1. for < параметры цикла >:= <S1> to <S2> do < оператор >;

2. for < параметры цикла >:=<S1> downto <S2> do <оператор>;

S1 и S2 - выражения, определяющие соответственно начальное и конечное значение параметра цикла. for..do - заголовок цикла, <оператор> - тело цикла. Тело цикла может быть простым или составным оператором. Оператор for обеспечивает выполнение тела цикла от начального до конечного. Например, оператор

for I:=1 to 20 do write('*');

20 раз выведет на экран в одной строке символ "*", а оператор

for I:=1 to 20 do writeln(Sqrt(I));

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

Параметры цикла, его начальные и конечные значения должны принадлежать к одному и тому же типу данных. При этом допустим любой скалярный тип, кроме вещественного. Если используются типы Integer, Byte и интервальный, то значение параметра цикла последовательно увеличивается (при for..to) или уменьшается (при for..downto) на единицу при каждом повторе.

Оператор Результат

for I:=10 to 14 do write(I:3); 10 11 12 13 14

for I:=14 downto 10 do write(I:3); 14 13 12 11 10

Параметром цикла может служить и переменная типа Char.

Оператор Результат

for Ch:='a' to 'e' do write(Ch:2); a b c d e

for Ch:='e' downto 'a' do write(Ch:2); e d c b a

В операторе for Pascal не допускает изменение параметра цикла на величину, отличную от единицы. Однако это не является большим недостатком, так как любой шаг можно задать при организации циклов в операторах repeat и while.

Количество повторов тела цикла в операторе for можно определить по табл.1.

Таблица 1

Количество повторов тела цикла в операторе for

Оператор S1<S2 S1>S2
for..to for..downto S2-S1+1 раз не выполняется не выполняется S1-S2+1 раз

В операторе for после do может находиться составной оператор, в теле которого запрещены операторы, меняющие значение параметра цикла:

for i:=1 to 10 do

begin

rez:=i/Pi;

i:=i+1 {ошибка, попытка изменить параметр цикла}

end;

Для выхода из цикла до момента достижения параметром цикла конечного значения можно воспользоваться процедурой break:

for i:=1 to 45 do

begin

f:=f+i;

if (f>100) or (i=39) then break

end;

После нормального завершения оператора for значение параметра цикла равно конечному значению. Если оператор for не выполняется, значение параметра цикла не определено.

В теле оператора for могут находиться другие операторы for. Это позволяет строить циклы, содержащие внутренние циклы. Такие внутренние циклы называются вложенными:

for i:=1 to 10 do

for j:=1 to 5 do

a[i,j]:=0; {обнуление элементов матрицы}

Параметром цикла может быть и переменная перечисляемого типа:

Var Sort:(s1,s2,s3):

.............

for Sort:=s1 to s3 do...

Ниже приведена простая программа с использованием оператора for для получения суммы чисел от 1 до n.

program demofor;

{значение n запрашивается у пользователя}

{ I - параметр цикла}

{ summa - переменная для суммирования I,I+1... }

Var n,I,summa:integer;

begin

write ('Введите значение n');

read(n); writeln;

summa:=0;

for I:=1 to n do summa:=summa+1;

writeln(' сумма чисел в диапазоне 1-',n:3,' равна',summa:4)

end.

Оператор повтора repeat состоит из заголовка (repeat), тела и условия окончания (until).

Формат:

Repeat

< оператор;>

< оператор;>

. ...........

< оператор;>

until < условие >;

Условие - выражение булевского типа. При написании условия допустимы булевские операции и операции отношения. Операторы, заключенные между словами repeat и until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат булевского выражения false, тело цикла активизируется еще раз, если результат true - происходит выход из цикла.

Оператор repeat имеет три характерные особенности: выполняется по крайней мере один раз; тело цикла выполняется, пока условие равно false; в теле может находиться произвольное число операторов без операторных скобок begin...end.

По крайней мере один из операторов тела цикла должен влиять на значение условия, иначе цикл будет выполняться бесконечно:

d:=1;s:=0; d:=1;s:=0;

repeat repeat

s:=s+d s:=s+d;

until (d<100); d:=d+1

{бесконечный цикл} { изменение переменной,

влияющей на условие}

until (d<100);

{ цикл имеет завершение}

Для преждевременного выхода из цикла можно использовать процедуру break:

repeat

s:=100/a;

d:=a/5;

if s<0.5 then break;

a:=a+1

until (a<=100) and (d<>0);

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

Ниже приведена программа, вычисляющая с помощью оператора repeat сумму четных чисел в интервале от 0 до 10 включительно.

program demorepeat;

var i,sum:integer;

begin

i:=0;sum:=0;

repeat

sum:=sum+i;

i:=i+2

until (i>10);

writeln ('сумма четных чисел равна',sum)

end.

Оператор while аналогичен оператору repeat, но проверка условия выполнения тела цикла проводится в самом начале оператора.

Формат: while < условие > do < тело цикла >;

Условие - булевское выражение, а тело цикла - простой или составной оператор. Перед каждым выполнением тела цикла вычисляется значение выражения условия. Если результат равен true, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен false, происходит выход из цикла и переход к первому после while оператору. Если перед первым выполнением цикла значение выражения было false, тело цикла вообще не выполняется и происходит переход на следующий оператор.

Пример:

i:=30;

while i<0 do i:=i+1;

write (i);

В данном случае наращивание параметра i не произойдет, так как условие с самого начала имеет значение false.

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

В ряде случаев цикл изначально предполагается как бесконечный. Тогда в условии записывается константа true или очевидный факт, который в любой ситуации возвращает значение true. Второй вариант менее предпочтителен.

Пример.

while true do write ('бесконечный цикл');

while 1=1 do write ('бесконечный цикл'); {очевидно, что результат выражения 1=1 всегда равен true}

Оператор while, как и другие операторы организации циклов, может быть вложенным.

Ниже приведена программа, где с помощью оператора while вычисляется сумма нечетных чисел в интервале 0 -10.

program demowhile;

var i,sum:integer;

begin

sum:=0;i:=1;

while i<11 do

begin

sum:=sum+i;

i:=i+2

end;

write(' сумма нечетных чисел равна',sum:3)

end.

Для начинающих программистов использование оператора while вызывает гораздо меньшее число ошибок, чем применение оператора repeat, поэтому при прочих равных условиях лучше пользоваться оператором while.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: