Глиф Учебники

Урок 4. Циклы: for, while и do while

Курс «C» · урок 4 из 10 · 4 минуты чтения

Цикл повторяет команды, пока выполняется условие. Без циклов, чтобы сложить сто чисел, пришлось бы написать сто строк. В C три вида циклов: while, for и do while.

Цикл while

while проверяет условие и, если оно верно, выполняет тело цикла — команды в фигурных скобках. Потом снова проверяет — и так до тех пор, пока условие не станет ложным.

C
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    printf("Сумма цифр: %d\n", sum);
    return 0;
}
Ввод
2025
Вывод
Сумма цифр: 9

Это сумма цифр числа: n % 10 — последняя цифра, n /= 10 отбрасывает её. Цикл идёт, пока у числа остаются цифры. Если условие ложно с самого начала (например, ввели 0), тело не выполнится ни разу.

nn > 0n % 10sum += n % 10n /= 10 2 0 2 5 да 5 0 + 5 = 5 202 шаг 1 2 0 2 да 2 5 + 2 = 7 20 шаг 2 2 0 да 0 7 + 0 = 7 2 шаг 3 2 да 2 7 + 2 = 9 0 шаг 4 0 нет цикл окончен Сумма цифр: 9
Для 2025 цикл while делает четыре шага: n % 10 берёт последнюю цифру и прибавляет её к sum, n /= 10 отбрасывает её; когда n становится 0, условие n > 0 ложно, и выводится «Сумма цифр: 9».

Цикл for

Когда заранее известно, сколько раз повторять, удобнее for. В скобках три части через точку с запятой: начальное значение, условие продолжения и шаг.

C
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i * i);
    }
    printf("\n");
    return 0;
}
Вывод
1 4 9 16 25

Порядок работы: сначала int i = 1 (один раз), затем проверка i <= 5, тело, шаг i++, снова проверка — и так, пока условие верно. Переменная i, объявленная в скобках for, существует только внутри цикла.

for (int i = 1; i <= 5; i++) { printf("%d ", i * i); } 1 2 4 3 i i <= 5 вывод 1 да 1 2 да 4 3 да 9 4 да 16 5 да 25 6 нет — int i = 1 1 один раз i <= 5 2 да printf("%d ", i * i); 3 i++ 4 снова проверка нет выход из цикла
В for (int i = 1; i <= 5; i++) начальное значение задаётся один раз, затем по кругу идут проверка i <= 5, тело и шаг i++; при i = 6 проверка не проходит, и цикл заканчивается, выведя 1 4 9 16 25.

Шаг может быть любым: i += 2 — через одно, i-- — в обратную сторону:

C
#include <stdio.h>

int main(void) {
    for (int i = 10; i > 0; i -= 3) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
Вывод
10 7 4 1

Пример посложнее — сумма и факториал. Факториал быстро растёт, поэтому для него берётся long long:

C
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    long long sum = 0, fact = 1;
    for (int i = 1; i <= n; i++) {
        sum += i;
        fact *= i;
    }
    printf("Сумма от 1 до %d: %lld\n", n, sum);
    printf("%d! = %lld\n", n, fact);
    return 0;
}
Ввод
15
Вывод
Сумма от 1 до 15: 120
15! = 1307674368000

Факториал 15 в int уже не поместился бы: int хранит числа примерно до 2,1 миллиарда. А long long хватает до 20!.

Цикл do while

do while сначала выполняет тело, а потом проверяет условие — поэтому тело выполнится хотя бы один раз. Удобно, когда нужно повторять ввод, пока не введут подходящее значение:

C
#include <stdio.h>

int main(void) {
    int x;
    do {
        scanf("%d", &x);
    } while (x <= 0);
    printf("Принято: %d\n", x);
    return 0;
}
Ввод
-3
0
42
Вывод
Принято: 42

После while (…) в конце do while точка с запятой обязательна.

while проверка — до тела n > 0 да sum += n % 10; n /= 10; нет после цикла при n = 0 тело не выполнится ни разу do while проверка — после тела scanf("%d", &x); x <= 0 да нет после цикла тело выполнится хотя бы один раз
while проверяет условие до тела, поэтому при n = 0 тело не выполнится ни разу, а do while сначала выполняет тело — scanf читает число, — и только потом проверяет x <= 0.

break и continue

C
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 10; i++) {
        if (i % 3 == 0) {
            continue;
        }
        if (i > 8) {
            break;
        }
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}
Вывод
1 2 4 5 7 8

Числа, кратные трём, пропущены через continue, а на 10 цикл остановил break (9 пропущено раньше, как кратное трём).

Вложенные циклы

Цикл внутри цикла: внутренний проходит целиком на каждом шаге внешнего. Так выводится таблица:

C
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 4; j++) {
            printf("%4d", i * j);
        }
        printf("\n");
    }
    return 0;
}
Вывод
   1   2   3   4
   2   4   6   8
   3   6   9  12

break во вложенном цикле выходит только из внутреннего цикла, внешний продолжает работать.

Чтение чисел до конца ввода

В задачах часто дают числа, но не говорят, сколько их. scanf возвращает количество прочитанных значений, а в конце ввода — особое значение EOF (end of file — «конец файла»). Поэтому цикл «пока число читается» пишется так:

C
#include <stdio.h>

int main(void) {
    int x, count = 0, max = 0;
    while (scanf("%d", &x) == 1) {
        if (count == 0 || x > max) {
            max = x;
        }
        count++;
    }
    printf("Чисел: %d, наибольшее: %d\n", count, max);
    return 0;
}
Ввод
4 -2 17
8 3
Вывод
Чисел: 5, наибольшее: 17

При вводе с клавиатуры конец ввода обозначается сочетанием Ctrl+D в Linux и macOS и Ctrl+Z, а затем Enter в Windows.

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

Коротко

Проверьте себя

1. Сколько раз выполнится тело цикла for (int i = 0; i < 10; i += 2)?
2. Чем do while отличается от while?
3. Что выведет программа?
C
#include <stdio.h>

int main(void) {
    int s = 0;
    for (int i = 1; i <= 4; i++);
    {
        s += 10;
    }
    printf("%d\n", s);
    return 0;
}
4. Что делает continue внутри цикла?