Цикл for: повторяем известное число раз

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

Цикл for повторяет команды, автоматически меняя переменную-счётчик от начального значения до конечного.

Зачем нужны циклы

Представьте, что вас попросили вывести числа от 1 до 100. Писать сто команд writeln — безумие. А если попросят до миллиона? Компьютеры созданы как раз для того, чтобы делать однообразную работу за нас. Конструкция, которая повторяет действия, называется циклом. Это, наряду с переменными и условиями, один из трёх китов программирования.

Когда мы заранее знаем, сколько раз нужно повторить действие, идеально подходит цикл for (по-английски «для»). Он сам ведёт счётчик: задаёшь, от какого числа до какого считать, — и цикл прогоняет тело нужное число раз.

Цикл for со счётом вверх (to)

Базовая форма цикла for выглядит так:

var
  i: integer;
begin
  for i := 1 to 5 do
    writeln('Шаг номер ', i);
end.

Читается почти по-русски: «для i от 1 до 5 выполнять...». Здесь iпеременная-счётчик. Цикл работает так: сначала i равно 1, выполняется тело, потом i автоматически становится 2, снова выполняется тело, и так до 5 включительно. После того как тело отработает при i = 5, цикл заканчивается. Слово to означает счёт вверх с шагом 1. Запустите аналог на Python (там диапазон range(1, 6) — до 6, не включая):

for i in range(1, 6):
    print('Шаг номер', i)

Вывод:

Шаг номер 1
Шаг номер 2
Шаг номер 3
Шаг номер 4
Шаг номер 5

Счётчик i можно использовать внутри тела — это часто и нужно. А если повторить надо несколько команд, тело оборачивают в составной оператор begin...end, как и в условиях.

Накопление суммы — главный приём

Самая частая задача с циклом — что-то накопить: сумму, произведение, количество. Делается это так: заводят переменную-«копилку», обнуляют её до цикла, а внутри цикла на каждом шаге добавляют к ней очередное значение.

var
  i, sum: integer;
begin
  sum := 0;                  // копилка пуста
  for i := 1 to 10 do
    sum := sum + i;          // добавляем очередное число
  writeln('Сумма чисел от 1 до 10: ', sum);
end.

Логика та же, что в уроке про присваивание: sum := sum + i берёт старую сумму и прибавляет к ней i. После всех шагов в sum накопится 1+2+...+10 = 55. Этот шаблон — обнулить, накапливать в цикле, вывести — вы будете использовать постоянно. Запустите:

sum = 0
for i in range(1, 11):
    sum = sum + i
print('Сумма чисел от 1 до 10:', sum)

Вывод:

Сумма чисел от 1 до 10: 55

Цикл со счётом вниз (downto)

Иногда считать нужно в обратную сторону — от большего к меньшему. Тогда вместо to пишут downto («вниз до»):

var
  i: integer;
begin
  for i := 5 downto 1 do
    write(i, ' ');
  writeln('Старт!');
end.
for i in range(5, 0, -1):
    print(i, end=' ')
print('Старт!')

Вывод:

5 4 3 2 1 Старт!

Запомните: to — вверх (шаг +1), downto — вниз (шаг −1). Это единственные два направления у паскалевского for; шаг всегда равен единице. Если нужен другой шаг (например, через два), используют while — о нём в следующем уроке.

Важное правило: не меняй счётчик внутри

Цикл for сам управляет счётчиком. Не пытайтесь менять переменную-счётчик внутри тела цикла (например, писать i := i + 5). В Паскале это запрещено и приведёт к ошибке или непредсказуемому поведению. Счётчик — «собственность» цикла; вы можете его читать, но не изменять. Если нужен особый шаг или сложное условие выхода — это сигнал, что вам нужен while, а не for.

Попробуй сам

Напишите программу, которая вычисляет факториал числа 5 (это произведение 1·2·3·4·5 = 120). Заведите «копилку» f, но обнулите её не в 0, а в 1 (ведь это произведение!), и в цикле умножайте: f := f * i. Проверьте на Python:

f = 1
for i in range(1, 6):
    f = f * i
print('5! =', f)

Вывод:

5! = 120

Частые ошибки

  • Не обнулили копилку. Если забыть sum := 0 до цикла, в сумму попадёт случайный мусор. Для произведения копилку обнуляют в 1.
  • Перепутали to и downto. for i := 5 to 1 с to вообще не выполнится ни разу: вверх от 5 до 1 идти некуда. Для счёта вниз нужен downto.
  • Меняют счётчик внутри. Запись i := i + 2 в теле for недопустима.
  • Забыли begin/end для нескольких команд. Без них к циклу относится только первая команда тела.
  • Не объявили счётчик. Переменную i нужно объявить в разделе var как integer.

Итоги

  • Цикл for i := A to B do повторяет тело, меняя счётчик от A до B включительно с шагом +1.
  • downto заставляет счётчик идти вниз с шагом −1.
  • Шаблон накопления: обнулить копилку до цикла (0 для суммы, 1 для произведения), накапливать внутри, вывести после.
  • Несколько команд в теле объединяют в begin...end.
  • Счётчик цикла нельзя изменять внутри тела — этим управляет сам цикл.
Проверьте себя
1. Сколько раз выполнится тело цикла for i := 1 to 5 do?
A4 раза
B5 раз
C6 раз
DБесконечно
2. Чем отличается downto от to в цикле for?
Adownto считает вниз с шагом -1, to считает вверх с шагом +1
Bdownto работает быстрее
Cdownto можно использовать только с дробными числами
DМежду ними нет разницы
3. Каким значением нужно инициализировать 'копилку' для накопления произведения?
A0
B1
CЛюбым числом
DКонечным значением счётчика
Поддержать проект