For — цикл со счетчиком в Pascal
Создано: 08.04.2026
Цикл for в Паскале представляет собой цикл со счетчиком. Он используется, когда число повторений не связано с тем, что происходит в теле цикла, то есть количество повторений известно заранее.
В Паскале цикл for существует в виде двух циклических операторов — это for...to...do... и for...downto...do....
В заголовке for указываются два значения. Первое присваивается так называемой переменной–счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет с шагом равным единице (в случае to) или минус единицы (при downto). Второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым числом плюс единица.
Чтобы лучше понять, как меняется значение счетчика, будем выводить его на экран при каждом повторении цикла:
var i, j: integer; begin for i:=1 to 10 do write(i, ' '); writeln; for j:=5 downto 0 do write(j, ' '); writeln; end.
1 2 3 4 5 6 7 8 9 10 5 4 3 2 1 0
В отличие от while удобство for заключается в отсутствии необходимости в теле цикла менять значение используемой в условии переменной. For делает это сам, его тело в принципе не должно содержать выражений, изменяющих счетчик.
Проверьте, что будет если первое значение счетчика окажется больше второго в случае to или первое значение меньше второго при downto. Также опытным путем выясните, можно ли присваивать счетчику отрицательные целочисленные значения.
Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, уже точно известно, сколько раз цикл выполнится.
var i, n: integer; begin write('Количество знаков: '); readln(n); for i := 1 to n do write('*'); writeln; end.
Количество знаков: 5 *****
Количество знаков: 13 *************
Измените программу так, чтобы в ней был цикл с downto, а не to.
Напишем с циклом for программу, в которой вычисляется сумма N-ного количества чисел:
var i, n, a, sum: integer; begin sum := 0; write('Количество чисел: '); readln(n); for i := 1 to n do begin read(a); sum := sum + a; end; writeln(sum); end.
Код цикла немного короче, чем с while, но в последнем мы могли бы обойтись без переменной i:
while n > 0 do begin read(a); sum := sum + a; n := n - 1; end;
Однако отличие не только в лишней переменной. В случае while необходимо менять значение n. Если нужно сохранить исходное, то цикл for будет предпочтительней.
Вообще, в программе не обязательно использовать несколько счетчиков (как в первом примере этого урока). Для всех циклов может быть достаточно только одной переменной–счетчика, если перед выполнением каждого цикла ей присваивается новое исходное значение. Это не касается ситуаций, когда один цикл вкладывается в другой. Используя цикл for, перепишем программу с подсчетом суммы нескольких наборов чисел:
var rows, items, n, sum, i, j: integer; begin write('Количество наборов: '); readln(rows); for i := 1 to rows do begin write('Количество чисел: '); read(items); sum := 0; for j := 1 to items do begin read(n); sum := sum + n; end; writeln('Сумма: ', sum); end; end.
Здесь, когда работает внутренний цикл, и меняется значение j, текущее значение переменной i должно оставаться одним и тем же. Другими словами, каждая переменная–счетчик считает свое. Одна хранит номер итерации внешнего цикла, другая — вложенного в него.
Отметим, внешний и внутренний циклы не обязательно должны быть одноименными. Так в цикле while может быть for, как и наоборот.
Счетчик — это переменная любого из перечисляемых типов. Из таких мы пока знаем только integer. Отсюда следует, что переменная–счетчик не может быть объявлена как real, и ей нельзя присваивать дробные числа. С другой стороны, начальные и конечные числа могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных.
Рассмотрим программу, в которой находятся все делители числа, кроме единицы и его самого:
var i, n: integer; begin readln(n); for i:=2 to n div 2 do if n mod i = 0 then write(i, ' '); writeln; end.
255 3 5 15 17 51 85
Если мы понимаем, что максимальный делитель не может быть больше половины "исследуемого" числа, то нет смысла перебирать натуральные числа до этого числа, достаточно до его половины. Поэтому в заголовке цикла мы используем выражение n div 2, которое для наглядности могли бы взять в скобки.
Измените программу так, чтобы делители выводились бы в обратном порядке: от большего к меньшему.
Задания для дополнительной или самостоятельной работы:
- Придумайте программу, в которой внутри цикла for уместно было бы использовать цикл repeat.
- На экран надо вывести каждое третье число из заданного диапазона. С каким циклом,
forилиwhile, проще решить эту задачу? Напишите такую программу с этим циклом.