Цикл 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— выполняет тело хотя бы один раз, затем проверяет.- Всегда следи за переменной в условии, чтобы цикл не стал бесконечным.
- Используй эти циклы, когда количество шагов заранее неизвестно.