$ sudo teach IT
Модуль 6 · Цикл for

Урок 6.1 — Счётный цикл for

Цикл со счётчиком: инициализация, условие, шаг. Идеален для обхода коллекций по индексу.

Цикл for — это, пожалуй, самый важный инструмент программиста. Он позволяет выполнить блок кода заданное количество раз. Слово «счётный» означает, что мы точно знаем, сколько раз нужно повторить действие. В отличие от while, который крутится «пока условие верно», for чаще всего используется, когда мы перебираем элементы коллекции или делаем что-то определённое число раз.

📝

Синтаксис for

Цикл for состоит из четырёх частей:

for (инициализация; условие; шаг) { тело цикла }

  • Инициализация — выполняется один раз перед началом цикла. Обычно объявляет счётчик: int i = 0
  • Условие — проверяется перед каждой итерацией. Если true — цикл продолжается. Если false — цикл завершается: i < 10
  • Шаг — выполняется в конце каждой итерации. Обычно увеличивает счётчик: i++
  • Тело — код, который выполняется на каждой итерации

Порядок выполнения:

  1. Выполняется инициализация (один раз)
  2. Проверяется условие. Если false — выход из цикла
  3. Выполняется тело цикла
  4. Выполняется шаг
  5. Переход к шагу 2
C# · Простейший for
// Вывод чисел от 0 до 4
for (int i = 0; i < 5; i++)
{
    Console.WriteLine($"Итерация {i}");
}
// Вывод:
// Итерация 0
// Итерация 1
// Итерация 2
// Итерация 3
// Итерация 4
🔢

Разные варианты шага

Шаг может быть не только i++. Ты можешь увеличивать на любое число, уменьшать, делать шаг 2, идти в обратную сторону:

C# · Разные шаги
// Шаг 2 — чётные числа
for (int i = 0; i < 10; i += 2)
{
    Console.Write($"{i} ");  // 0 2 4 6 8
}
Console.WriteLine();

// Обратный отсчёт
for (int i = 5; i >= 0; i--)
{
    Console.Write($"{i} ");  // 5 4 3 2 1 0
}
Console.WriteLine();

// От 1 до 10 с шагом 3
for (int i = 1; i <= 10; i += 3)
{
    Console.Write($"{i} ");  // 1 4 7 10
}
Console.WriteLine();

// Умножение на 2 (геометрическая прогрессия)
for (int i = 1; i <= 64; i *= 2)
{
    Console.Write($"{i} ");  // 1 2 4 8 16 32 64
}
📚

Перебор массива и списка

Самое частое применение for — перебор элементов коллекции по индексу:

C# · Перебор массива
int[] numbers = { 10, 20, 30, 40, 50 };

// Прямой проход
for (int i = 0; i < numbers.Length; i++)
{
    Console.WriteLine($"numbers[{i}] = {numbers[i]}");
}

// Обратный проход
for (int i = numbers.Length - 1; i >= 0; i--)
{
    Console.WriteLine($"numbers[{i}] = {numbers[i]}");
}

// Изменение элементов
for (int i = 0; i < numbers.Length; i++)
{
    numbers[i] = numbers[i] * 2;  // удвоить каждый
}

Со списком List<T> — то же самое, только .Length → .Count:

C# · Перебор List
List<string> fruits = new() { "яблоко", "банан", "вишня" };

for (int i = 0; i < fruits.Count; i++)
{
    Console.WriteLine($"{i + 1}. {fruits[i]}");
}
// Вывод:
// 1. яблоко
// 2. банан
// 3. вишня
🔲

Область видимости переменной счётчика

Переменная, объявленная в инициализации for (int i = 0), видна только внутри цикла. После цикла она не существует:

C# · Область видимости
for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}
// Console.WriteLine(i);  // ❌ Ошибка! i не видна здесь

// Можно объявить счётчик до цикла (если нужен после):
int j;
for (j = 0; j < 5; j++)
{
    Console.WriteLine(j);
}
Console.WriteLine($"После цикла j = {j}");  // 5
⏹️

break и continue

break — прервать цикл досрочно

break полностью завершает цикл, и управление переходит к коду после цикла:

C# · break
int[] numbers = { 10, 20, 30, 40, 50, 60 };

// Найти первый элемент > 35 и остановиться
for (int i = 0; i < numbers.Length; i++)
{
    if (numbers[i] > 35)
    {
        Console.WriteLine($"Нашли: {numbers[i]} на индексе {i}");
        break;  // выходим из цикла
    }
}
// Вывод: Нашли: 40 на индексе 3

continue — пропустить итерацию

continue прерывает текущую итерацию и переходит к следующей (выполняет шаг и проверяет условие):

C# · continue
// Вывести только чётные числа
for (int i = 1; i <= 10; i++)
{
    if (i % 2 != 0)  // если нечётное
        continue;     // пропускаем
    Console.Write($"{i} ");
}
// Вывод: 2 4 6 8 10

⚠️ break и continue работают только с самым внутренним циклом. Если у тебя вложенные циклы, break выйдет только из того, в котором он вызван. Чтобы выйти из всех циклов, используй goto или флаг.

Выход из вложенных циклов

C# · Вложенные циклы с флагом
int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

bool found = false;
for (int row = 0; row < matrix.GetLength(0) && !found; row++)
{
    for (int col = 0; col < matrix.GetLength(1); col++)
    {
        if (matrix[row, col] == 5)
        {
            Console.WriteLine($"Нашли 5 на [{row},{col}]");
            found = true;
            break;  // выход из внутреннего цикла
        }
    }
    // условие !found в верхнем цикле завершит и его
}
⚖️

for vs while

Когда использовать for, а когда while?

for
while
Известно количество итераций
Неизвестно, ждём условия
Есть счётчик и шаг
Просто условие продолжения
Перебор массива/списка
Ожидание ввода, чтение файла

Оба цикла взаимозаменяемы:

C# · for и while эквивалентны
// for
for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}

// while (то же самое)
int j = 0;
while (j < 5)
{
    Console.WriteLine(j);
    j++;
}
🧩

Практические задачи

Давай решим несколько типичных задач с for:

Задача 1: Сумма элементов массива

C# · Сумма
int[] numbers = { 10, 20, 30, 40, 50 };
int sum = 0;

for (int i = 0; i < numbers.Length; i++)
{
    sum += numbers[i];  // sum = sum + numbers[i]
}
Console.WriteLine($"Сумма: {sum}");  // 150

Задача 2: Поиск максимального элемента

C# · Максимум
int[] numbers = { 5, 12, 8, 21, 3, 17 };

int max = numbers[0];  // начинаем с первого
for (int i = 1; i < numbers.Length; i++)
{
    if (numbers[i] > max)
    {
        max = numbers[i];  // нашли новый максимум
    }
}
Console.WriteLine($"Максимум: {max}");  // 21

Задача 3: Таблица умножения (вложенные циклы)

C# · Таблица умножения
for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        Console.Write($"{i * j,4}");  // выравнивание по 4 символа
    }
    Console.WriteLine();
}
// Вывод:
//   1   2   3   4   5   6   7   8   9
//   2   4   6   8  10  12  14  16  18
// ...
🧪

Мини-тест

Вопрос 1

Сколько раз выполнится тело цикла: for (int i = 0; i < 5; i++)?

Ответ: 5 (i = 0,1,2,3,4)

Вопрос 2

Что выведет: for (int i = 0; i < 5; i++) { if (i == 3) break; Console.Write(i); }?

Ответ: 0 1 2 (на i=3 break сработал)

Вопрос 3

Что выведет: for (int i = 0; i < 5; i++) { if (i % 2 == 0) continue; Console.Write(i); }?

Ответ: 1 3 (чётные пропущены через continue)

Вопрос 4

Сколько итераций: for (int i = 10; i > 0; i -= 3)?

Ответ: 4 (i = 10,7,4,1)

🧩

Задание для тренировки

Напиши программу, которая:

  1. Создаёт массив из 10 случайных чисел от 1 до 100
  2. Выводит все числа на экран
  3. Находит и выводит сумму всех чисел
  4. Находит и выводит среднее арифметическое
  5. Находит и выводит минимальное и максимальное значение
  6. Выводит только чётные числа
C# · Решение
using System;

class Program
{
    static void Main()
    {
        int[] numbers = new int[10];
        Random rnd = new Random();
        
        // Заполняем случайными числами
        for (int i = 0; i < numbers.Length; i++)
            numbers[i] = rnd.Next(1, 101);
        
        // Выводим
        Console.Write("Числа: ");
        for (int i = 0; i < numbers.Length; i++)
            Console.Write(numbers[i] + " ");
        Console.WriteLine();
        
        // Сумма
        int sum = 0;
        for (int i = 0; i < numbers.Length; i++)
            sum += numbers[i];
        Console.WriteLine($"Сумма: {sum}");
        
        // Среднее
        double avg = (double)sum / numbers.Length;
        Console.WriteLine($"Среднее: {avg:F2}");
        
        // Минимум и максимум
        int min = numbers[0];
        int max = numbers[0];
        for (int i = 1; i < numbers.Length; i++)
        {
            if (numbers[i] < min) min = numbers[i];
            if (numbers[i] > max) max = numbers[i];
        }
        Console.WriteLine($"Мин: {min}, Макс: {max}");
        
        // Чётные числа
        Console.Write("Чётные: ");
        for (int i = 0; i < numbers.Length; i++)
        {
            if (numbers[i] % 2 == 0)
                Console.Write(numbers[i] + " ");
        }
        Console.WriteLine();
    }
}
📌

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

1️⃣
Синтаксис: for (инициализация; условие; шаг) { тело }. Инициализация — один раз. Условие — перед каждой итерацией. Шаг — после каждой итерации.
2️⃣
Перебор коллекций: for (int i = 0; i < array.Length; i++) для массивов, i < list.Count для списков.
3️⃣
break — полный выход из цикла. continue — переход к следующей итерации. Работают только для самого внутреннего цикла.
4️⃣
Счётчик живёт только внутри цикла. Шаг может быть любым: i++, i--, i += 2, i *= 2.
5️⃣
for vs while: for — когда известно количество итераций. while — когда ждём выполнения условия.

Тест: 6.1: Счётный цикл

3 вопроса

Цикл for

Premium