Урок 4.1 — Условный цикл while
Повторяем действие, пока условие истинно. Счётчики, аккумуляторы и бесконечные циклы.
Компьютеры хороши в одном — они умеют повторять действия миллионы раз без устали. Цикл while — это базовая конструкция, которая позволяет выполнять блок кода снова и снова, пока выполняется условие. Сегодня мы узнаем, как заставить программу делать рутинную работу за нас.
Синтаксис while и принцип работы
Цикл while состоит из двух частей: условия (bool-выражение) и тела цикла (блок кода, который повторяется).
Общая схема:
while (условие)
{
// тело цикла — выполняется,
// пока условие истинно
}
Сначала проверяется условие. Если true → выполняется тело. После каждого выполнения тело проверяется снова. Когда условие становится false → цикл завершается.
Рассмотрим простейший пример — вывод чисел от 1 до 5:
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
i = i + 1; // или i++, но об этом позже
}
// Вывод:
// 1
// 2
// 3
// 4
// 5
Как это работает по шагам:
- i = 1. Проверка: 1 <= 5 → true. Выполняем тело: печатаем 1, увеличиваем i до 2.
- i = 2. Проверка: 2 <= 5 → true. Печатаем 2, i = 3.
- i = 3. Проверка: 3 <= 5 → true. Печатаем 3, i = 4.
- i = 4. Проверка: 4 <= 5 → true. Печатаем 4, i = 5.
- i = 5. Проверка: 5 <= 5 → true. Печатаем 5, i = 6.
- i = 6. Проверка: 6 <= 5 → false. Цикл завершён.
Счётчики и аккумуляторы
В циклах используются две типичные переменные: счётчик — считает количество итераций, и аккумулятор — накапливает результат (например, сумму).
📊 Счётчик — считает итерации
Счётчик увеличивается (или уменьшается) на каждой итерации. Он нужен, чтобы ограничить количество повторений.
int count = 0; // начальное значение
while (count < 5)
{
Console.WriteLine($"Итерация {count + 1}");
count++; // увеличиваем счётчик
}
📦 Аккумулятор — накапливает результат
Аккумулятор хранит промежуточный результат: сумму, произведение, конкатенированную строку.
int sum = 0; // аккумулятор — начинаем с 0
int n = 1;
while (n <= 10)
{
sum = sum + n; // накапливаем сумму
n++;
}
Console.WriteLine($"Сумма от 1 до 10 = {sum}"); // 55
💡 Обрати внимание: sum = sum + n — это классическая запись аккумулятора. Можно короче: sum += n. Мы разбирали составные операторы в уроке 2.4. Они работают и здесь.
Более сложный пример — накопление произведения (факториал):
// Факториал 5! = 1 * 2 * 3 * 4 * 5 = 120
int factorial = 1; // аккумулятор для произведения
int i = 1;
while (i <= 5)
{
factorial *= i; // factorial = factorial * i
i++;
}
Console.WriteLine($"5! = {factorial}"); // 120
Бесконечный цикл while (true)
Иногда нужно, чтобы цикл работал «вечно» — пока не произойдёт особое событие. Для этого используется while (true). Условие всегда истинно, поэтому цикл никогда не завершится сам. Выход из него делается вручную, обычно через break.
Где это нужно:
- Игровой цикл: «пока игра работает, обновляй кадры»
- Обработчик команд: «пока пользователь не ввёл «exit», читай команды»
- Сервер: «пока сервер запущен, обрабатывай запросы»
while (true)
{
Console.Write("Введите команду (exit для выхода): ");
string command = Console.ReadLine();
if (command == "exit")
{
Console.WriteLine("До свидания!");
break; // выход из цикла
}
Console.WriteLine($"Вы ввели: {command}");
}
// Программа будет работать, пока не ввести "exit"
⚠️ while (true) без break — это опасная конструкция. Программа зависнет навсегда, заполнит память и загрузит процессор. Всегда убедись, что в теле цикла есть break или return.
Опасность бесконечного цикла
Самая частая ошибка новичков — создать случайно бесконечный цикл. Это происходит, когда условие никогда не становится false.
❌ Бесконечный цикл
int x = 1;
while (x > 0)
{
Console.WriteLine(x);
// забыли уменьшить x!
}
// x всегда 1, условие всегда true
✅ Нормальный цикл
int x = 5;
while (x > 0)
{
Console.WriteLine(x);
x--; // уменьшаем — условие станет false
}
Другие типичные ошибки:
// ❌ Ошибка 1: точка с запятой после while
int i = 0;
while (i < 5); // ← точка с запятой! Тело цикла пустое
{
Console.WriteLine(i);
i++;
}
// Бесконечный цикл с пустым телом
// ❌ Ошибка 2: условие не меняется
int n = 10;
while (n < 20)
{
Console.WriteLine("Привет");
// n не меняется — бесконечно!
}
// ❌ Ошибка 3: забыли про инкремент
int k = 1;
while (k <= 10)
{
Console.Write(k + " ");
// забыли k++ — бесконечно печатает 1
}
💡 Если программа зависла — нажми Ctrl+C в консоли, чтобы прервать выполнение. В Visual Studio — кнопка «Stop» (красный квадрат) или Shift+F5.
Отладка циклов: пошаговое выполнение
Когда цикл работает не так, как ожидается, лучший способ разобраться — отладка (debug). Вот основные приёмы:
🔍 Приёмы отладки циклов:
- Точки остановки (breakpoints) — поставь на строке с условием while и смотри значения переменных
- Console.WriteLine временно — выводи значения на каждой итерации:
Console.WriteLine($"i = {i}, sum = {sum}"); - Следи за счётчиком — проверь, меняется ли он так, как ты ожидаешь
- Проверь граничные случаи — что если n = 0? n = 1? n = отрицательное?
// Временно добавляем вывод для отладки:
int n = 1;
int sum = 0;
while (n <= 5)
{
sum += n;
Console.WriteLine($"DEBUG: n = {n}, sum = {sum}"); // ← отладка
n++;
}
Console.WriteLine($"Результат: {sum}");
// Вывод:
// DEBUG: n = 1, sum = 1
// DEBUG: n = 2, sum = 3
// DEBUG: n = 3, sum = 6
// DEBUG: n = 4, sum = 10
// DEBUG: n = 5, sum = 15
// Результат: 15
Практический пример — угадай число
Напишем игру «Угадай число». Компьютер загадывает число от 1 до 100, а пользователь пытается угадать:
using System;
class Program
{
static void Main()
{
Random rand = new Random();
int secretNumber = rand.Next(1, 101); // число от 1 до 100
int guess;
int attempts = 0;
Console.WriteLine("Я загадал число от 1 до 100. Угадай!");
while (true)
{
Console.Write("Твой вариант: ");
string input = Console.ReadLine();
if (!int.TryParse(input, out guess))
{
Console.WriteLine("Введи число!");
continue;
}
attempts++;
if (guess < secretNumber)
Console.WriteLine("Больше!");
else if (guess > secretNumber)
Console.WriteLine("Меньше!");
else
{
Console.WriteLine($"Поздравляю! Ты угадал за {attempts} попыток!");
break;
}
}
}
}
continue — если пользователь ввёл не число, мы пропускаем оставшуюся часть итерации и начинаем следующую. Это как «перемотать» iteration. Мы подробно разберём continue в уроке 4.2.Мини-тест
Проверь, как ты понял while.
Вопрос 1
int x = 3;
while (x > 0)
{
Console.Write(x + " ");
x--;
}
Варианты: A) 3 2 1 B) 3 2 1 0 C) 2 1 0
Вопрос 2
int sum = 0;
int i = 1;
while (i <= 4)
{
sum += i;
i += 2;
}
Console.WriteLine(sum);
Варианты: A) 4 B) 6 C) 10
Вопрос 3
int n = 0;
while (n < 3)
{
Console.WriteLine("Раз");
}
Console.WriteLine("Два");
Варианты: A) Раз Раз Раз Два B) Бесконечный цикл C) Два
Вопрос 4
int count = 10;
while (count > 0)
{
if (count % 2 == 0)
Console.Write(count + " ");
count--;
}
Варианты: A) 10 9 8 ... 1 B) 10 8 6 4 2 C) 9 7 5 3 1
Задача
Задание: Сумма цифр числа
Напиши программу, которая запрашивает у пользователя целое положительное число и вычисляет сумму его цифр.
Примеры:
- Ввод: 1234 → Вывод: 1 + 2 + 3 + 4 = 10
- Ввод: 999 → Вывод: 9 + 9 + 9 = 27
- Ввод: 5 → Вывод: 5
Подсказка: чтобы получить последнюю цифру числа, используй % 10. Чтобы отбросить последнюю цифру — / 10.
Например: 1234 % 10 = 4, 1234 / 10 = 123. Повторяй, пока число > 0.
Дополнительно: проверь, что пользователь ввёл именно положительное целое число (через TryParse).
Что важно запомнить
Тест: 4.1: Условный цикл
5 вопросов