Урок 5. Циклы — while, for, foreach
Цикл повторяет одни и те же команды, пока выполняется условие. Без циклов, чтобы сложить числа от 1 до 100, пришлось бы написать сто строк. В C# четыре вида циклов: while, do-while, for и foreach.
while — пока условие истинно
int n = int.Parse(Console.ReadLine() ?? "");
int digits = 0;
int sum = 0;
while (n > 0)
{
sum += n % 10;
n /= 10;
digits++;
}
Console.WriteLine($"Цифр: {digits}, сумма цифр: {sum}");2024Цифр: 4, сумма цифр: 8while проверяет условие перед каждым повтором. Здесь на каждом шаге n % 10 даёт последнюю цифру, а n /= 10 её отбрасывает: 2024 → 202 → 20 → 2 → 0. Когда n становится 0, условие ложно, и цикл заканчивается. Каждое выполнение тела цикла называют итерацией.
Если условие ложно с самого начала, тело не выполнится ни разу: для n = 0 программа скажет, что цифр 0. С отрицательным числом будет то же самое (условие n > 0 сразу ложно), поэтому его сначала делают положительным: n = Math.Abs(n);.
do-while — сначала сделать, потом проверить
do-while проверяет условие после тела, поэтому тело выполняется хотя бы раз. Это удобно, когда нужно спрашивать, пока не введут подходящее значение:
int number;
do
{
Console.Write("Введите число от 1 до 10: ");
number = int.Parse(Console.ReadLine() ?? "");
}
while (number < 1 || number > 10);
Console.WriteLine($"Принято: {number}");Введите число от 1 до 10: 15
Введите число от 1 до 10: 0
Введите число от 1 до 10: 7
Принято: 7for — со счётчиком
Когда заранее известно, сколько раз повторять, удобен for. В его скобках три части через ;: начальное значение счётчика, условие продолжения и шаг.
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine(sum);5050Порядок такой: int i = 1 выполняется один раз; затем перед каждой итерацией проверяется i <= 100; после каждой итерации выполняется i++. Шаг может быть любым:
for (int i = 10; i > 0; i -= 3)
{
Console.WriteLine(i);
}10
7
4
1Переменная i, объявленная в скобках for, существует только внутри цикла. После цикла её уже нет; если значение нужно и дальше, объявите переменную до цикла.
foreach — по каждому элементу
foreach проходит по всем элементам набора — строки, массива, списка — без всякого счётчика:
string word = "шарп";
foreach (char c in word)
{
Console.WriteLine(c);
}ш
а
р
пЧитается так: «для каждого символа c в строке word». С массивами и списками foreach встретится в следующем уроке. Менять элементы набора через переменную foreach нельзя — она только для чтения.
break и continue
break— немедленно выйти из цикла;continue— пропустить остаток текущей итерации и перейти к следующей.
for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
continue;
}
if (i > 7)
{
break;
}
Console.WriteLine(i);
}1
2
4
5
7Числа 3 и 6 пропущены из-за continue. На восьмёрке срабатывает break, и до 9 и 10 цикл уже не доходит.
Цикл while (true) сам не заканчивается никогда — из него выходят через break. Так часто пишут, когда условие выхода удобнее проверить в середине тела, например «читать числа, пока не введут 0».
Цикл в цикле
Внутри цикла может быть другой цикл. Внутренний проходит целиком на каждой итерации внешнего:
for (int row = 1; row <= 3; row++)
{
for (int col = 1; col <= 4; col++)
{
Console.Write($"{row * col,4}");
}
Console.WriteLine();
} 1 2 3 4
2 4 6 8
3 6 9 12{row * col,4} печатает число в поле шириной 4 знака — так столбцы получаются ровными. После каждой строки Console.WriteLine() переводит строку.
Частые ошибки
- Бесконечный цикл. Забыли изменить переменную условия (
i++вwhile) — программа работает вечно. Остановить её в терминале можно клавишамиCtrl+C. - Ошибка на единицу.
i <= nвместоi < nили наоборот — цикл делает на одну итерацию больше или меньше. Проверьте на маленьком примере, какие значения принимает счётчик. ;после заголовка:for (int i = 0; i < 5; i++);— у цикла пустое тело, а блок ниже выполнится один раз.- Изменение списка внутри
foreach. Добавление или удаление элементов в циклеforeachпо тому же списку останавливает программу ошибкойCollection was modified. Используйтеforили соберите изменения в отдельный список.
Коротко
while (условие) { ... }— проверка перед итерацией; тело может не выполниться ни разу.do { ... } while (условие);— проверка после, тело выполняется хотя бы раз.for (int i = 0; i < n; i++)— цикл со счётчиком;iживёт только внутри цикла.foreach (var x in набор)— по каждому элементу строки, массива, списка.break— выйти из цикла,continue— к следующей итерации.