Программирование циклических алгоритмов
Написать «Привет» один раз легко. А сто раз? Копировать одну команду сто раз никто не станет — для повторений в языках программирования есть циклы.
Что такое цикл
Циклический алгоритм — алгоритм, в котором одни и те же команды повторяются несколько раз. Повторяющиеся команды называют телом цикла, одно выполнение тела — шагом (итерацией).
Циклы бывают трёх видов:
- с предусловием — сначала проверить условие, потом выполнить тело; повторять, пока условие истинно;
- с постусловием — сначала выполнить тело, потом проверить условие; тело выполнится хотя бы один раз;
- с параметром — повторить заданное число раз, а переменная-счётчик сама меняется на каждом шаге.
Цикл с предусловием: while
Используют, когда число повторений заранее неизвестно. Программа считает сумму цифр числа: берёт последнюю цифру, добавляет к сумме и отбрасывает её — пока от числа что-то осталось.
#include <stdio.h>
int main(void) {
int n, sum = 0;
scanf("%d", &n);
while (n > 0) {
sum = sum + n % 10; // последняя цифра
n = n / 10; // отбросить её
}
printf("%d\n", sum);
return 0;
}
program DigitSum;
var
n, sum: integer;
begin
readln(n);
sum := 0;
while n > 0 do
begin
sum := sum + n mod 10; { последняя цифра }
n := n div 10; { отбросить её }
end;
writeln(sum);
end.
n = int(input())
total = 0
while n > 0:
total = total + n % 10 # последняя цифра
n = n // 10 # отбросить её
print(total)
Для числа 1234 цикл сделает четыре шага: сумма станет 4, 7, 9, 10, а число — 123, 12, 1, 0. На пятой проверке n > 0 ложно, цикл закончится, программа выведет 10.
Если условие ложно с самого начала, тело не выполнится ни разу. А если оно никогда не станет ложным, получится бесконечный цикл — программа «зависнет». Поэтому внутри тела что-то должно менять переменную из условия: здесь это n.
Цикл с постусловием
Тело выполняется хотя бы раз, а проверка стоит в конце. Удобно, когда нужно повторять ввод, пока пользователь не введёт подходящее значение:
int x;
do {
printf("Введите положительное число: ");
scanf("%d", &x);
} while (x <= 0); // повторять, ПОКА число неподходящее
repeat
write('Введите положительное число: ');
readln(x);
until x > 0; { повторять, ПОКА НЕ станет подходящим }
while True:
x = int(input("Введите положительное число: "))
if x > 0:
break # подходящее число — выходим из цикла
Обрати внимание на условия. В Си do … while повторяет, пока условие истинно. В Паскале repeat … until повторяет, пока условие ложно, то есть до тех пор, пока оно не станет истинным. Поэтому условия противоположные: x <= 0 и x > 0.
В Python цикла с постусловием нет. Его заменяют бесконечным циклом while True с выходом по команде break.
Цикл с параметром: for
Используют, когда число повторений известно заранее. Выведем квадраты чисел от 1 до 5:
int i;
for (i = 1; i <= 5; i++) {
printf("%d ", i * i);
}
for i := 1 to 5 do
write(i * i, ' ');
for i in range(1, 6):
print(i * i, end=" ")
Результат: 1 4 9 16 25. Счётчик i по очереди принимает значения 1, 2, 3, 4, 5.
- Си — в скобках три части через точку с запятой: начальное значение
i = 1, условие продолженияi <= 5и изменение после каждого шагаi++(увеличить на 1). - Паскаль —
for i := 1 to 5 do, счётчик растёт на 1 сам. Для счёта в обратную сторону естьdownto:for i := 5 downto 1 do. - Python —
range(1, 6)даёт числа от 1 до 5: правая граница в диапазон не входит.range(5)— это 0, 1, 2, 3, 4.
Пример. Сумма чисел от 1 до n
#include <stdio.h>
int main(void) {
int n, i, sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
sum = sum + i;
}
printf("%d\n", sum);
return 0;
}
program Total;
var
n, i, sum: integer;
begin
readln(n);
sum := 0;
for i := 1 to n do
sum := sum + i;
writeln(sum);
end.
n = int(input())
total = 0
for i in range(1, n + 1):
total = total + i
print(total)
Для n = 10 программа выведет 55. Переменную-сумму обязательно обнуляют до цикла: если сделать это внутри, сумма будет сбрасываться на каждом шаге.
Синтаксис коротко
| Си | Паскаль | Python | |
|---|---|---|---|
| с предусловием | while (усл) { … } | while усл do … | while усл: |
| с постусловием | do { … } while (усл);пока истинно | repeat … until усл;пока ложно | нет; while True + break |
| с параметром от 1 до n | for (i = 1; i <= n; i++) | for i := 1 to n do | for i in range(1, n + 1): |
| досрочный выход | break | break | break |
🎯 Самое главное
- Цикл повторяет тело. Три вида: с предусловием, с постусловием, с параметром.
while— когда число повторений заранее неизвестно;for— когда известно.- Тело цикла с постусловием выполняется хотя бы раз; с предусловием — может не выполниться ни разу.
- В Паскале
repeat … untilидёт до тех пор, пока условие не станет истинным. - В Python
range(a, b)не включаетb.
🤔 Проверь себя
1. Сколько раз выполнится тело цикла for i in range(3, 8) в Python? А for i := 3 to 8 do в Паскале?
В Python — 5 раз (3, 4, 5, 6, 7), в Паскале — 6 раз (от 3 до 8 включительно).
2. Что будет, если в программе суммы цифр забыть строку, которая отбрасывает последнюю цифру?
Число не будет уменьшаться, условие n > 0 останется истинным — получится бесконечный цикл.
3. Какой цикл подходит для задачи «спрашивать пароль, пока не введут правильный»?
Цикл с постусловием: спросить нужно хотя бы один раз, а проверить — после ввода.
4. Перепиши цикл for i := 10 downto 1 do на Си или Python.
Си: for (i = 10; i >= 1; i--); Python: for i in range(10, 0, -1): — третье число в range — шаг.
Ты знаешь все три основные алгоритмические конструкции: следование, ветвление и повторение. Из них собирается программа любой сложности.
Проверь себя
5 случайных вопросов по этому уроку — при следующем открытии будут другие. Ответы проверяются сразу, без регистрации.