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--;
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ