$ sudo teach IT
Модуль 4 · Цикл while

Урок 4.1 — Условный цикл while

Повторяем действие, пока условие истинно. Счётчики, аккумуляторы и бесконечные циклы.

Компьютеры хороши в одном — они умеют повторять действия миллионы раз без устали. Цикл while — это базовая конструкция, которая позволяет выполнять блок кода снова и снова, пока выполняется условие. Сегодня мы узнаем, как заставить программу делать рутинную работу за нас.

🔄

Синтаксис while и принцип работы

Цикл while состоит из двух частей: условия (bool-выражение) и тела цикла (блок кода, который повторяется).

Общая схема:

while (условие)
{
    // тело цикла — выполняется,
    // пока условие истинно
}

Сначала проверяется условие. Если true → выполняется тело. После каждого выполнения тело проверяется снова. Когда условие становится false → цикл завершается.

Рассмотрим простейший пример — вывод чисел от 1 до 5:

C# · Первый while
int i = 1;

while (i <= 5)
{
    Console.WriteLine(i);
    i = i + 1;  // или i++, но об этом позже
}

// Вывод:
// 1
// 2
// 3
// 4
// 5

Как это работает по шагам:

  1. i = 1. Проверка: 1 <= 5 → true. Выполняем тело: печатаем 1, увеличиваем i до 2.
  2. i = 2. Проверка: 2 <= 5 → true. Печатаем 2, i = 3.
  3. i = 3. Проверка: 3 <= 5 → true. Печатаем 3, i = 4.
  4. i = 4. Проверка: 4 <= 5 → true. Печатаем 4, i = 5.
  5. i = 5. Проверка: 5 <= 5 → true. Печатаем 5, i = 6.
  6. i = 6. Проверка: 6 <= 5 → false. Цикл завершён.
💡 Переменная, которая меняется в цикле и влияет на условие (как i), называется счётчиком цикла. Без её изменения цикл никогда не завершится.
🔢

Счётчики и аккумуляторы

В циклах используются две типичные переменные: счётчик — считает количество итераций, и аккумулятор — накапливает результат (например, сумму).

📊 Счётчик — считает итерации

Счётчик увеличивается (или уменьшается) на каждой итерации. Он нужен, чтобы ограничить количество повторений.

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. Они работают и здесь.

Более сложный пример — накопление произведения (факториал):

C# · Факториал числа
// Факториал 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», читай команды»
  • Сервер: «пока сервер запущен, обрабатывай запросы»
C# · Вечный цикл ввода
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
}

Другие типичные ошибки:

C# · Типичные ошибки
// ❌ Ошибка 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). Вот основные приёмы:

🔍 Приёмы отладки циклов:

  1. Точки остановки (breakpoints) — поставь на строке с условием while и смотри значения переменных
  2. Console.WriteLine временно — выводи значения на каждой итерации: Console.WriteLine($"i = {i}, sum = {sum}");
  3. Следи за счётчиком — проверь, меняется ли он так, как ты ожидаешь
  4. Проверь граничные случаи — что если n = 0? n = 1? n = отрицательное?
C# · Отладка через вывод
// Временно добавляем вывод для отладки:
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
💡 После отладки не забудь удалить временные Console.WriteLine. Их называют «отладочным мусором» (debug print).
🛠️

Практический пример — угадай число

Напишем игру «Угадай число». Компьютер загадывает число от 1 до 100, а пользователь пытается угадать:

C# · Игра «Угадай число»
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

💡 Ответы: 1 — A (3, 2, 1; при x=0 условие x>0 ложно). 2 — A (i=1: sum=1, i=3; i=3: sum=4, i=5; i=5 условие ложно). 3 — B (n не меняется, вечный цикл). 4 — B (чётные числа от 10 до 2).
🎮

Задача

Задание: Сумма цифр числа

Напиши программу, которая запрашивает у пользователя целое положительное число и вычисляет сумму его цифр.

Примеры:

  • Ввод: 1234 → Вывод: 1 + 2 + 3 + 4 = 10
  • Ввод: 999 → Вывод: 9 + 9 + 9 = 27
  • Ввод: 5 → Вывод: 5

Подсказка: чтобы получить последнюю цифру числа, используй % 10. Чтобы отбросить последнюю цифру — / 10.

Например: 1234 % 10 = 4, 1234 / 10 = 123. Повторяй, пока число > 0.

Дополнительно: проверь, что пользователь ввёл именно положительное целое число (через TryParse).

💡 Это классическая задача на while. Переменная-аккумулятор для суммы, счётчик не нужен — само число уменьшается на каждой итерации.
📌

Что важно запомнить

1️⃣
while (условие) — выполняет тело, пока условие истинно. Если условие изначально false — тело не выполнится ни разу.
2️⃣
Счётчик (i++) считает итерации. Аккумулятор (sum += value) накапливает результат.
3️⃣
while (true) — бесконечный цикл. Используется с break внутри. Без break программа зависнет.
4️⃣
Типичные ошибки: забытое изменение счётчика, точка с запятой после while, условие, которое никогда не станет false.
5️⃣
Отладка: используй точки остановки или временный Console.WriteLine для отслеживания переменных.

Тест: 4.1: Условный цикл

5 вопросов

Цикл while

Premium