Урок 5. Циклы — for, while и repeat
Цикл повторяет действия много раз: вывести числа от 1 до 100, сложить все введённые числа, спрашивать пароль, пока не введут верный. В Pascal три цикла, и у каждого своё назначение.
for — когда известно, сколько раз
program Squares;
var
i: integer;
begin
for i := 1 to 5 do
writeln(i, ' в квадрате = ', i * i);
end.1 в квадрате = 1
2 в квадрате = 4
3 в квадрате = 9
4 в квадрате = 16
5 в квадрате = 25Переменная i — параметр цикла — сама принимает значения 1, 2, 3, 4, 5, и для каждого выполняется оператор после do. Параметр должен быть целого типа (или char) и описан в разделе var, как обычная переменная.
Чтобы считать вниз, вместо to пишут downto:
program Countdown;
var
i: integer;
begin
for i := 5 downto 1 do
write(i, ' ');
writeln('Старт!');
end.5 4 3 2 1 Старт!Правила for:
- шаг всегда 1:
toприбавляет единицу,downtoвычитает; - если начальное значение больше конечного (для
to), цикл не выполнится ни разу; - менять параметр внутри цикла нельзя, а после цикла его значение не определено — не полагайтесь на него;
- несколько действий в теле цикла заключают в
begin … end.
Накопление суммы
Типичная задача — сложить много чисел. Заводят переменную-«копилку», обнуляют её до цикла и в цикле прибавляют очередное значение:
program SumToN;
var
n, i: integer;
s: longint;
begin
readln(n);
s := 0;
for i := 1 to n do
s := s + i;
writeln('Сумма от 1 до ', n, ' = ', s);
end.10Сумма от 1 до 10 = 55Сумма описана как longint: для n = 1000 она равна 500 500 и в integer Free Pascal не поместится.
while — пока условие верно
while проверяет условие перед каждым повтором. Его берут, когда число повторов заранее неизвестно:
program Doubling;
var
x, steps: integer;
begin
x := 1;
steps := 0;
while x <= 1000 do
begin
x := x * 2;
steps := steps + 1;
end;
writeln('Шагов: ', steps, ', число: ', x);
end.Шагов: 10, число: 1024Программа удваивает число, пока оно не станет больше 1000. Если условие ложно с самого начала, тело while не выполнится ни разу.
Внутри while что-то обязательно должно менять условие. Если забыть x := x * 2, условие будет верно всегда и программа зациклится. Остановить её можно командой «Завершить» (Ctrl+F2) в PascalABC.NET или клавишами Ctrl+C в консоли.
repeat … until — хотя бы один раз
repeat проверяет условие после тела цикла, поэтому тело выполняется минимум один раз. Цикл повторяется, пока условие ложно, и останавливается, когда оно станет истинным:
program AskPositive;
var
n: integer;
begin
repeat
writeln('Введите положительное число:');
readln(n);
until n > 0;
writeln('Принято: ', n);
end.-3
0
8Введите положительное число:
Введите положительное число:
Введите положительное число:
Принято: 8Между repeat и until можно писать сколько угодно операторов — begin … end там не нужен.
Обратите внимание на разницу условий: while работает, пока условие верно, а repeat — до тех пор, пока условие не станет верным. while x <= 1000 и until x > 1000 — одно и то же правило остановки.
break и continue
break— немедленно выйти из цикла;continue— пропустить остаток тела и перейти к следующему повтору.
program BreakDemo;
var
i: integer;
begin
for i := 1 to 100 do
begin
if i * i > 50 then
break;
if i mod 2 = 0 then
continue;
write(i, ' ');
end;
writeln;
end.1 3 5 7Цикл выводит нечётные числа (continue пропускает чётные) и останавливается, как только квадрат числа превысит 50: 8 · 8 = 64.
Вложенные циклы
Внутри цикла может стоять другой цикл. Для каждого значения внешнего параметра внутренний цикл проходит целиком:
program Table;
var
i, j: integer;
begin
for i := 1 to 3 do
begin
for j := 1 to 5 do
write(i * j:4);
writeln;
end;
end. 1 2 3 4 5
2 4 6 8 10
3 6 9 12 15Формат :4 выводит каждое число в поле шириной 4 символа, поэтому столбцы ровные. writeln после внутреннего цикла переводит строку.
Какой цикл выбрать
| Цикл | Когда | Условие |
|---|---|---|
for | число повторов известно заранее | нет, считает сам |
while | повторять, пока что-то верно; может не выполниться ни разу | в начале, продолжать пока верно |
repeat | выполнить хотя бы раз, например запросить ввод | в конце, остановиться когда верно |
Частые ошибки
;послеdo.for i := 1 to 5 do;— цикл пять раз выполнит пустой оператор, а строка ниже выполнится один раз. Сwhile x > 0 do;программа зациклится.- Нет
begin … endвокруг нескольких действий вforиwhile— в цикле окажется только первое. - Сумма не обнулена перед циклом.
- Условие
whileникогда не становится ложным — бесконечный цикл.
Коротко
for i := 1 to n do— n повторов,downto— счёт вниз, шаг всегда 1.while условие do— проверка в начале, повторяет, пока условие верно.repeat … until условие— проверка в конце, хотя бы один раз, останавливается, когда условие верно.breakвыходит из цикла,continueпереходит к следующему повтору.- Копилку суммы обнуляют до цикла и берут
longint, если сумма может быть большой.