Учебник Turbo Pascal. Введение - Операторы цикла for...to...do... и for...downto...do...

ОГЛАВЛЕНИЕ

Операторы цикла for...to...do... и for...downto...do...

Третий вариант оператора цикла — цикл со счетчиком. Можно считать, что есть две очень похожих друг на друга разновидности цикла со счетчиком. Первый из этих операторов имеет вид

for j   := expression1 to expression2 do statement;

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

При выполнении оператора for сначала вычисляется значение выражения expression1, затем вычисляется значение выражения expression2, далее управляющая переменная цикла последовательно пробегает все значения от expression1 до expression2. В том случае, когда значение expression1 оказывается больше значения expression2, тело цикла не будет выполняться вовсе. Эти значения остаются неизменными в ходе выполнения всего цикла for. Рассматриваемый вариант цикла for эквивалентен следующей последовательности операторов:.

j := expression1; 
k := expression2;
while j <= k do
begin
    statement;
    inc(j);
end:

в предположении, что при каждом выполнении оператора statement не изменяются значения j и к.

Оператор for вида for j := expression1 to expression2 do statement; неэквивалентен последовательности операторов

begin
    j := expression1;
    while j <= expression2 do
    begin
        statement;
        j := j + 1;
    end;
end;

потому что выражение expression2 может изменяться при каждом выполнении оператора statement в цикле while.

В теле цикла for следует избегать операторов, изменяющих значение управляющей переменной j. Несмотря на то что использование подобных конструкций не приводит к ошибкам компиляции, они потенциально опасны и могут приводить к неприятным последствиям. Рассмотрим пример:

sum := 0;
for k := 1 to 100 do
begin
    sum := sum + Sqr(k);
    k := k + 2;
end;

Этот фрагмент программы является попыткой просуммировать n2 по всем целым значениям вида n * (3*&+1), лежащим в диапазоне от 1 до 100. Здесь допущена ошибка реализации алгоритма, так как управляющая переменная k изменяется в составном операторе, управляемом той же переменной k. Правильной будет конструкция следующего вида:

sum := 0;
for k := 0 to 33 do
    sum := sum + Sqr(3*k + 1);
или
sum := 0;
k := 1;
repeat
    sum := sum + Sqr(k);
    k := k + 3;
until k > 100;

После выполнения цикла for значение управляющей переменной становится неопределенным.

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

for j := expression1 downto expression2 do statement;

Подводя итоги, для применения циклов можно сформулировать следующие ^рекомендации:

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

Иногда бывает удобно проводить проверку на возможный выход из цикла где-нибудь в его середине, а не в начале или конце. Такой выход из цикла обеспечивается процедурой Break модуля System, которая прерывает выполнение самого внутреннего вложенного цикла, будь то for, whilе или repeat. Указанный модуль подключается к программе автоматически, если в этом есть необходимость. Пример:

while true do 
begin
    statement1;
    if expression then Break;
    statement2;
end;

Следует также упомянуть процедуру Continue, которая прерывает выполнение тела самого внутреннего цикла for, while или repeat и передает управление на его заголовок, так что начинается выполнение очередной итерации цикла.