Урок 6.1 — Счётный цикл for
Цикл со счётчиком: инициализация, условие, шаг. Идеален для обхода коллекций по индексу.
Цикл for — это, пожалуй, самый важный инструмент программиста. Он позволяет выполнить блок кода заданное количество раз. Слово «счётный» означает, что мы точно знаем, сколько раз нужно повторить действие. В отличие от while, который крутится «пока условие верно», for чаще всего используется, когда мы перебираем элементы коллекции или делаем что-то определённое число раз.
Синтаксис for
Цикл for состоит из четырёх частей:
for (инициализация; условие; шаг) { тело цикла }
- Инициализация — выполняется один раз перед началом цикла. Обычно объявляет счётчик:
int i = 0 - Условие — проверяется перед каждой итерацией. Если
true— цикл продолжается. Еслиfalse— цикл завершается:i < 10 - Шаг — выполняется в конце каждой итерации. Обычно увеличивает счётчик:
i++ - Тело — код, который выполняется на каждой итерации
Порядок выполнения:
- Выполняется инициализация (один раз)
- Проверяется условие. Если false — выход из цикла
- Выполняется тело цикла
- Выполняется шаг
- Переход к шагу 2
// Вывод чисел от 0 до 4
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Итерация {i}");
}
// Вывод:
// Итерация 0
// Итерация 1
// Итерация 2
// Итерация 3
// Итерация 4
Разные варианты шага
Шаг может быть не только i++. Ты можешь увеличивать на любое число, уменьшать, делать шаг 2, идти в обратную сторону:
// Шаг 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 — перебор элементов коллекции по индексу:
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:
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), видна только внутри цикла. После цикла она не существует:
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 полностью завершает цикл, и управление переходит к коду после цикла:
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 прерывает текущую итерацию и переходит к следующей (выполняет шаг и проверяет условие):
// Вывести только чётные числа
for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0) // если нечётное
continue; // пропускаем
Console.Write($"{i} ");
}
// Вывод: 2 4 6 8 10
⚠️ break и continue работают только с самым внутренним циклом. Если у тебя вложенные циклы, break выйдет только из того, в котором он вызван. Чтобы выйти из всех циклов, используй goto или флаг.
Выход из вложенных циклов
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
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
// while (то же самое)
int j = 0;
while (j < 5)
{
Console.WriteLine(j);
j++;
}
Практические задачи
Давай решим несколько типичных задач с for:
Задача 1: Сумма элементов массива
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: Поиск максимального элемента
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: Таблица умножения (вложенные циклы)
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)
Задание для тренировки
Напиши программу, которая:
- Создаёт массив из 10 случайных чисел от 1 до 100
- Выводит все числа на экран
- Находит и выводит сумму всех чисел
- Находит и выводит среднее арифметическое
- Находит и выводит минимальное и максимальное значение
- Выводит только чётные числа
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();
}
}
Что важно запомнить
for (инициализация; условие; шаг) { тело }. Инициализация — один раз. Условие — перед каждой итерацией. Шаг — после каждой итерации.for (int i = 0; i < array.Length; i++) для массивов, i < list.Count для списков.i++, i--, i += 2, i *= 2.Тест: 6.1: Счётный цикл
3 вопроса