Цикл 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. - Счётчик цикла нельзя изменять внутри тела — этим управляет сам цикл.