1. Введение
В программировании регулярно приходится выполнять одни и те же действия много раз подряд. Например:
- Пройтись по всем элементам списка.
- Считать с клавиатуры значения, пока пользователь не введет нужное.
- Считать сумму всех чисел от 1 до 100.
- Запрашивать у пользователя пароль до тех пор, пока он не станет правильным.
Если попытаться всё это реализовать без циклов, получится длинно, скучно и не масштабируемо. Представьте, что вы пишете программу-калькулятор и решаете складывать числа от 1 до 10 вручную:
int sum = 0;
sum += 1;
sum += 2;
sum += 3;
// ... и так 10 раз. Мда.
Вы заскучаете раньше, чем закончите! Решение — циклы. Они позволяют описать повторение действий лаконично и понятно. Сегодня мы познакомимся с самым базовым, но чертовски полезным циклом — while.
2. Знакомство с циклом while
Синтаксис и базовая схема
Цикл while — это "попугай" в мире программирования: он повторяет один и тот же фрагмент кода до тех пор, пока выполняется некое условие. Как только условие перестаёт быть истинным, попугай замолкает (цикл заканчивается).
while (условие)
{
// Тело цикла
}
while с блоком команд
Диаграмма
Вот простая блок-схема для понимания работы цикла while:
3. Примеры: цикл while в действии
Классический счетчик
Сделаем простую программу, которая считает от 1 до 5 и выводит числа:
int i = 1;
while (i <= 5)
{
Console.WriteLine($"Шаг № {i}");
i++; // Не забудьте увеличить счетчик!
}
// Выведет:
// Шаг № 1
// Шаг № 2
// Шаг № 3
// Шаг № 4
// Шаг № 5
Обратите внимание: если забыть увеличить переменную i, цикл никогда не завершится (наш попугай станет бессмертным и вечным повторятелем). Это называется бесконечный цикл — пугающая штука.
Ввод с клавиатуры до нужного значения
Нередко цикл используется для того, чтобы "дожимать" пользователя до верного ответа:
string password = "";
while (password != "qwerty")
{
Console.Write("Введите пароль: ");
password = Console.ReadLine();
}
Console.WriteLine("Добро пожаловать!");
Здесь программа просит ввести пароль, пока вы не напечатаете магическое "qwerty". Не забудьте: если удалить строку password = Console.ReadLine();, цикл снова станет бесконечным (будет спрашивать пароль, но не будет читать ввод — залипнет навсегда, как сломавшийся робот).
4. Виды и сценарии использования цикла while
Обычный цикл while
Этот цикл, как было показано выше, интересуется условием до первой итерации. Если условие ложно сразу — тело цикла не выполнится ни разу.
Пример: условие не выполняется сразу
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // Не выполнится никогда!
}
Что, собственно говоря, логично. Именно так, как тут и написано.
Вложенные циклы while
Иногда нужно сделать цикл внутри цикла. Например, перебрать все строки, и в каждой из них проверить все символы. На данном этапе это скорее авантюра, но вот пример по-простому:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
Console.WriteLine($"i = {i}, j = {j}");
j++;
}
i++;
}
// i = 1, j = 1
// i = 1, j = 2
// i = 2, j = 1
// i = 2, j = 2
// i = 3, j = 1
// i = 3, j = 2
Подробнее мы разберем вложенные циклы через пару лекций, просто хотел вас попугать :)
Бесконечный цикл
Иногда циклы завершаются, а иногда — живут вечно.
while (true)
{
Console.WriteLine("Я вечен!");
}
Используется редко, обычно для каких-нибудь фоновых процессов (например, работа сервера), но тоже применяется на практике.
5. Как не писать глупости: частые ошибки с while
В программировании цикл — это как электричество: классно, но надо знать правила безопасности.
Проблема 1: бесконечный цикл по невнимательности
Очень часто новички забывают обновлять переменную, от которой зависит условие. В результате цикл работает "бесконечно", и приходится останавливать программу принудительно (например, сочетанием Ctrl + C).
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
// i++; // ОЙ! Забыли увеличить i
}
Проблема 2: неверно заданное условие
Иногда разработчик сам себе роет яму: условие, наоборот, никогда не бывает истинным. В результате цикл не выполняется вообще.
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // Данный код никогда не сработает.
i++;
}
Проблема 3: ошибка с типами данных
В условии цикла всегда должно быть булево выражение — то есть результат вычислений должен быть true или false.
int number = 5;
while (number) // Ошибка! Ожидался bool, а не int.
{
number--;
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ