Pascal. Операторы цикла (WHILE, REPEAT, FOR)

Операторы цикла задают повторное выполнение определенных операторов.

Если число повторений заранее известно, то подходящей конструкцией является оператор for. В противном случае следует использовать операторы while или repeat.

Операторы цикла с последующим условием (REPEAT)

В операторе цикла repeat выражение, которое управляет повторным выполнением последовательности операторов, содержится внутри оператора repeat.

REPEAT
Внутренний оператор;
UNTIL логическое выражение;

Результатом выражения должен быть результат булевского типа.

Операторы, заключенные между ключевыми словами repeat и until, выполняются последовательно до тех пор, пока результат выражения не примет значения True. Последовательность операторов выполняется по крайней мере один раз, поскольку вычисление выражения производится после каждого выполнения последовательности операторов.

Приведем примеры оператора repeat:

1)

repeat
K:=I mod J;
I:=J;
J:=K;
until J=O;

2)

repeat
Write (‘введите значение (0..9):’);
Readln (I);
until (I >=0) and (I <=9);

Операторы цикла с предварительным условием (WHILE)

Оператор цикла while содержит в себе выражение, которое управляет повторным выполнением оператора (который может быть составным оператором).

WHILE выражение DO
BEGIN
Внутренний оператор;
END;

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

Примерами оператора цикла while могут служить:

а)

while Data[I] <> X do
I:=I + 1;

б)

while I > 0 do
begin
if Odd(I) then Z:=Z * X;
I:=I div 2;
X:=Sqr(X);
end;

в)

while not Eof(InFile) do
begin
Readln (InFile, Line);
Process (Line);
end;

Операторы цикла с параметром (FOR)

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

FOR управляющая переменная:=исходное значение
TO конечное значение
DO оператор

Если управляющая переменная пробегает значения от большего значения к меньшему, то форма записи имеет вид:

FOR управляющая переменная:=исходное значение
DOWNTO конечное значение
DO оператор

В качестве управляющей переменной должен использоваться идентификатор переменной, который обозначает переменную, объявленную локальной в блоке, в котором содержится оператор for. Управляющая переменная должна иметь порядковый тип. Начальное и конечное значения должны иметь тип, совместимый по присваиванию с этим порядковым типом.

Когда начинает выполняться оператор for, начальное и конечное значения определяются один раз, и эти значения сохраняются на протяжении всего выполнения оператора for.

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

Когда в операторе цикла используется ключевое слово downto, значение управляющей переменной уменьшается при каждом повторении на единицу. Если начальное значение в таком операторе меньше, чем конечное значение, то содержащийся в теле оператора цикла оператор не выполняется.

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

Если принять во внимание эти ограничения, то оператор

for V:=E1 to E2 do Body;

эквивалентен оператору

begin
Temp1:=E1;
Temp2:=E2;
if Temp1 <=Temp2 then
begin
V:=Temp1;
Body;
while V <> Temp2 do
begin
V:=Succ(V);
Body;
end;
end;
end;

где Temp1 и Temp2 - вспомогательные переменные, тип которых совпадает с основным типом переменной V и которые не встречаются в другом месте программы.

Приведем примеры оператора цикла for:

1)

for I:=2 to 63 do
if Data[ I ] > Max then
Max:=Data[ I ];

2)

for I:=1 to 10 do
for J:=1 to 10 do
begin
X:=0;
for K:=1 to 10 do
X:=X + Mat1[I, K] * Mat2[K, J];
Mat [I, J]:=X;
end;