1. Знакомство с циклом do-while
Давайте отвлечемся на минутку и представим: вы решили написать программу, которая угадывает число, загаданное пользователем. Вам нужно, чтобы программа хотя бы один раз спросила у пользователя число, и спрашивала снова и снова, пока не угадает. Но если условие не выполняется с первой попытки, обычный while даже не войдет внутрь цикла.
Вот тут и появляется как раз цикл do-while. В отличие от while, он всегда выполнит тело цикла хотя бы один раз — даже если условие сразу ложно. Это как если бы вам дали бесплатную жвачку независимо от того, купили вы что-нибудь или нет.
do
{
// Тело цикла: этот код выполнится хотя бы один раз
}
while (условие);
Обратите внимание на точку с запятой ; в конце после скобки условия! В обычном while ее нет, а тут она есть. Вот такой вот маленький капкан для начинающего :)
Описание шагов цикла do-while
- Вход в тело цикла (всегда хотя бы раз).
- Проверка условия.
- Если условие истинно — повторить тело.
- Если условие ложно — выйти из цикла.
2. Отличие от обычного while
Вспомним основной сценарий работы обычного while:
while (условие)
{
// Тело цикла
}
Тело не выполнится ни разу, если условие ложно с самого начала!
Теперь пример с do-while:
do
{
// Тело цикла
}
while (условие);
Тело цикла выполнится хотя бы один раз, даже если условие ложно сразу!
Давайте проиллюстрируем разницу кодом:
// Обычный while
int count = 0;
while (count > 0)
{
Console.WriteLine("count = " + count);
count--;
}
// Ничего не выведется
// do-while
int count2 = 0;
do
{
Console.WriteLine("count2 = " + count2);
count2--;
}
while (count2 > 0);
// Выведет "count2 = 0" хотя условие ложно!
Иногда это выглядит как "странность", но порой именно такое поведение спасает ваш код (например, при пользовательском вводе и валидации данных).
3. Практические сценарии применения do-while
Где этот цикл встречается чаще всего?
Валидация данных
Самый популярный сценарий — вы хотите, чтобы пользователь ввел что-то правильное (например, только цифры, или пароль не короче 6 символов), и повторяете запрос, пока не получите корректный ввод.
string password;
do
{
Console.Write("Введите новый пароль (не менее 6 символов): ");
password = Console.ReadLine();
}
while (password.Length < 6);
Console.WriteLine("Пароль принят!");
В этом примере тело цикла выполняется хотя бы раз — даже если пользователь с первого раза введет длинный пароль.
Меню в консольных приложениях
Очень частый и полезный паттерн: отображать меню, ждать команду пользователя и заканчивать цикл только по специальной команде.
string command;
do
{
Console.WriteLine("Меню:");
Console.WriteLine("1. Показать приветствие");
Console.WriteLine("2. Выйти");
Console.Write("Выберите действие: ");
command = Console.ReadLine();
if (command == "1")
{
Console.WriteLine("Привет, мир!");
}
else if (command != "2")
{
Console.WriteLine("Неизвестная команда.");
}
}
while (command != "2");
Console.WriteLine("Пока!");
4. Сравнение while и других циклов
| Тип цикла | Проверка условия | Сколько раз может выполниться тело | Где уместно |
|---|---|---|---|
| while | До | 0 и более раз | Пока не знаем числа повторений заранее |
| do-while | После | 1 и более раз | Когда надо выполнить хотя бы раз |
| for | До | 0 и более раз | Когда заведомо известно количество итераций |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ