Операторы цикла repeat-while-for

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

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

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

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

repeat
      внутренний оператор;

until логическое выражение;

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

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

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

repeat
      k:=i mod j;
      i:=j;
      j:=k;
until j=O;
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:

for i:=2 to 63 do
    if data[i]>max then max:=data[i];
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;