Учебник 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 и передает управление на его заголовок, так что начинается выполнение очередной итерации цикла.