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

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

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

Посчитать сумму чисел от 1 до 1000 можно тысячей строк сложения, а можно тремя строками цикла. Цикл повторяет блок команд, пока выполняется условие. Один проход цикла называют итерацией.

Цикл for

Самый частый цикл — когда заранее известно, сколько раз повторять:

C++
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        cout << i << " ";
    }
    cout << "\n";
    return 0;
}
Вывод
1 2 3 4 5

В скобках после for три части через ;:

  1. int i = 1 — начало: выполняется один раз перед циклом. Переменная i — счётчик цикла.
  2. i <= 5 — условие: проверяется перед каждой итерацией; как только оно ложно, цикл заканчивается.
  3. i++ — шаг: выполняется после каждой итерации.
for (int i = 1; i <= 5; i++) int i = 1 один раз перед циклом i <= 5 true cout << i << " "; тело i++ снова условие false после цикла значения i 1 2 3 4 5 6 условие ложно
Начало int i = 1 выполняется один раз, затем по кругу идут проверка i <= 5, тело и шаг i++: тело выполняется для i от 1 до 5, а при i = 6 условие ложно и цикл заканчивается.

Счётчик, объявленный внутри for, существует только в цикле: после закрывающей скобки i уже нет.

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

C++
#include <iostream>
using namespace std;

int main() {
    for (int i = 10; i > 0; i -= 3) {
        cout << i << " ";
    }
    cout << "\n";
    return 0;
}
Вывод
10 7 4 1

Сумма и счёт

Типичная задача: прочитать n, потом n чисел, и найти их сумму и количество положительных.

C++
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    long long sum = 0;
    int positive = 0;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        sum += x;
        if (x > 0) {
            positive++;
        }
    }
    cout << sum << " " << positive << "\n";
    return 0;
}
Ввод
5
3 -1 4 -1 5
Вывод
10 3

Переменные sum и positive объявлены до цикла и начинаются с нуля. Если объявить их внутри цикла, они будут обнуляться на каждой итерации. Сумму удобно держать в long long: так она не переполнится даже на миллионе больших чисел.

Запись for (int i = 0; i < n; i++) — привычный способ повторить ровно n раз. Счёт с нуля пригодится в следующем уроке: элементы массивов нумеруются с нуля.

Цикл while

while повторяет блок, пока условие истинно. Его берут, когда число повторений заранее неизвестно. Например, сумма цифр числа: последнюю цифру отрезают, пока число не станет нулём.

C++
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int digits = 0;
    while (n > 0) {
        digits += n % 10;   // последняя цифра
        n /= 10;            // отрезать её
    }
    cout << digits << "\n";
    return 0;
}
Ввод
2024
Вывод
8

n % 10 — последняя цифра числа, n / 10 — число без последней цифры. Это приём, который встречается во многих задачах.

n n % 10 digits += n % 10 n /= 10 2 0 2 4 4 0 + 4 = 4 202 2 0 2 2 4 + 2 = 6 20 2 0 0 6 + 0 = 6 2 2 2 6 + 2 = 8 0 n = 0: условие n > 0 ложно — цикл окончен, вывод 8
Для 2024 цикл четыре раза берёт последнюю цифру n % 10, прибавляет её к digits и отрезает через n /= 10; когда n становится 0, условие n > 0 ложно и выводится сумма 8.

Условие проверяется до итерации: если оно ложно сразу, тело не выполнится ни разу. Например, для n = 0 программа выше выведет 0.

Цикл do while

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

C++
#include <iostream>
using namespace std;

int main() {
    int x;
    do {
        cin >> x;
    } while (x <= 0);
    cout << "got " << x << "\n";
    return 0;
}
Ввод
-5 0 12
Вывод
got 12

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

break и continue

Пример: первый цикл ищет первое число больше 100, которое делится на 7, второй выводит нечётные числа до 9:

C++
#include <iostream>
using namespace std;

int main() {
    for (int i = 101; ; i++) {
        if (i % 7 == 0) {
            cout << i << "\n";
            break;
        }
    }
    for (int i = 1; i < 10; i++) {
        if (i % 2 == 0) {
            continue;
        }
        cout << i << " ";
    }
    cout << "\n";
    return 0;
}
Вывод
105
1 3 5 7 9

В первом цикле условие пропущено (for (int i = 101; ; i++)) — такой цикл бесконечный, и выйти из него можно только через break.

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

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

C++
#include <iostream>
using namespace std;

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

Внутренний цикл полностью проходит при каждой итерации внешнего, поэтому тело выполняется 3 · 4 = 12 раз. Помните об этом на олимпиадах: два вложенных цикла по 100 000 — это 10¹⁰ действий, а за секунду компьютер успевает порядка 10⁸–10⁹ простых операций.

внутренний цикл: j от 1 до 4 внешний цикл: i от 1 до 3 после строки j = 1 j = 2 j = 3 j = 4 i = 1 1 1 2 2 3 3 4 4 "\n" i = 2 5 2 6 4 7 6 8 8 "\n" i = 3 9 3 10 6 11 9 12 12 "\n" тело выполняется 3 · 4 = 12 раз
При каждом i внутренний цикл проходит j от 1 до 4 и выводит строку произведений, после неё — перевод строки; числа в углах показывают порядок, всего тело выполняется 12 раз.

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

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

Коротко

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

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

int main() {
    int n = 345, s = 0;
    while (n > 0) {
        s += n % 10;
        n /= 10;
    }
    cout << s << "\n";
    return 0;
}