⚙️ C++

Цикл while и do-while в C++17: подробное руководство

Цикл while и do-while: когда повторять, не зная точного числа шагов

Зачем нужны эти циклы?

Представь, что ты играешь в компьютерную игру и твой персонаж бежит по бесконечному коридору. Он должен бежать пока не встретит монстра. Ты заранее не знаешь, сколько шагов он сделает — может, 5, а может, 100. Для таких ситуаций, когда количество повторений заранее неизвестно, в C++ есть два цикла: while и do-while. Они работают как "умные повторители": повторяют действие до тех пор, пока выполняется условие.

Цикл while: "Сначала проверь — потом делай"

Цикл while работает по принципу: пока условие истинно — выполняй тело цикла. Если условие ложно с самого начала, тело не выполнится ни разу.

Синтаксис:

while (условие) {
    // тело цикла — то, что повторяется
}

Пример 1: Счётчик до 5

#include <iostream>
using namespace std;

int main() {
    int i = 1;
    while (i <= 5) {
        cout << "Шаг номер " << i << endl;
        i = i + 1; // не забываем увеличивать счётчик!
    }
    cout << "Готово!" << endl;
    return 0;
}

Вывод:

Шаг номер 1
Шаг номер 2
Шаг номер 3
Шаг номер 4
Шаг номер 5
Готово!

Пример 2: Ввод чисел до нуля

#include <iostream>
using namespace std;

int main() {
    int число;
    cout << "Вводи числа (0 — закончить): ";
    cin >> число;
    while (число != 0) {
        cout << "Вы ввели: " << число << endl;
        cin >> число;
    }
    cout << "Конец." << endl;
    return 0;
}

Пример работы (ввод: 7 3 0):

Вводи числа (0 — закончить): 7
Вы ввели: 7
3
Вы ввели: 3
0
Конец.

Цикл do-while: "Сначала сделай — потом проверь"

Этот цикл — "младший брат" while. Его особенность: тело цикла всегда выполняется хотя бы один раз, а потом проверяется условие. Это удобно, когда действие нужно сделать обязательно, даже если условие сразу ложное.

Синтаксис:

do {
    // тело цикла
} while (условие); // не забудь точку с запятой!

Пример: Игра "Угадай число" (попытка хотя бы одна)

#include <iostream>
using namespace std;

int main() {
    int загаданное = 42;
    int попытка;
    do {
        cout << "Угадай число (от 1 до 100): ";
        cin >> попытка;
        if (попытка < загаданное)
            cout << "Слишком мало!" << endl;
        else if (попытка > загаданное)
            cout << "Слишком много!" << endl;
    } while (попытка != загаданное);
    cout << "Поздравляю! Ты угадал!" << endl;
    return 0;
}

Пример работы (ввод: 10 50 42):

Угадай число (от 1 до 100): 10
Слишком мало!
Угадай число (от 1 до 100): 50
Слишком много!
Угадай число (от 1 до 100): 42
Поздравляю! Ты угадал!

Разбор типичных задач

Задача "Робот-шахтёр"
Робот собирает кристаллы, пока энергия в сумке не станет >= 100. Каждый кристалл даёт случайное число энергии от 10 до 30.

#include <iostream>
#include <cstdlib>  // для rand()
#include <ctime>    // для time()
using namespace std;

int main() {
    srand(time(0)); // инициализация генератора случайных чисел
    int энергия = 0;
    int кристаллов = 0;
    
    while (энергия < 100) {
        int кристалл = 10 + rand() % 21; // от 10 до 30
        энергия += кристалл;
        кристаллов++;
        cout << "Найден кристалл на " << кристалл 
             << " энергии. Всего: " << энергия << endl;
    }
    cout << "Сумка полна! Собрано " << кристаллов 
         << " кристаллов." << endl;
    return 0;
}

Задача "Обратный отсчёт"
Доктор Вэнс запускает машину времени с координаты n и движется назад, пока не достигнет 0.

#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "Введите начальную временную координату: ";
    cin >> n;
    
    while (n > 0) {
        cout << "Текущая координата: " << n << endl;
        n--; // уменьшаем на 1
    }
    cout << "Машина остановилась в нуле!" << endl;
    return 0;
}

Ввод и вывод (n=5):

Введите начальную временную координату: 5
Текущая координата: 5
Текущая координата: 4
Текущая координата: 3
Текущая координата: 2
Текущая координата: 1
Машина остановилась в нуле!

Частые ошибки новичков

  • Бесконечный цикл: забыли изменить переменную в условии. Например, while (i < 10) без i++ внутри — программа будет работать вечно. Всегда проверяй, что условие когда-нибудь станет ложным.
  • Путаница while и do-while: Если нужно, чтобы действие выполнилось хотя бы один раз — используй do-while. Если может не выполниться ни разу — while.
  • Точка с запятой после while: while (x > 5); — это пустое тело цикла, программа зависнет. В do-while точка с запятой обязательна после условия.
  • Условие с = вместо ==: while (x = 5) — это присваивание, а не сравнение. Всегда используй == для сравнения.

Итоговый пример: "Волшебная экспедиция"

Юный исследователь находит артефакт, который начинает светиться. Сила артефакта удваивается каждую секунду, начиная с 1. Нужно дождаться, пока сила не превысит порог (вводится с клавиатуры). Вывести, сколько секунд прошло.

#include <iostream>
using namespace std;

int main() {
    int порог;
    cout << "Введите порог силы артефакта: ";
    cin >> порог;
    
    int сила = 1;
    int секунды = 0;
    
    while (сила <= порог) {
        секунды++;
        сила *= 2; // удваиваем силу
        cout << "Секунда " << секунды << ": сила = " 
             << сила << endl;
    }
    
    cout << "Артефакт активирован через " << секунды 
         << " секунд!" << endl;
    return 0;
}

Пример работы (порог = 10):

Введите порог силы артефакта: 10
Секунда 1: сила = 2
Секунда 2: сила = 4
Секунда 3: сила = 8
Секунда 4: сила = 16
Артефакт активирован через 4 секунд!

Важно запомнить:

  • while — проверяет условие перед выполнением (может не выполниться ни разу).
  • do-while — выполняет тело хотя бы один раз, затем проверяет.
  • Всегда следи за переменной в условии, чтобы цикл не стал бесконечным.
  • Используй эти циклы, когда количество шагов заранее неизвестно.