Содержание
Циклы в C# – это конструкции языка программирования, которые позволяют выполнять определенный блок кода до тех пор, пока выполняется определенное условие. Цикл в программировании – это одна из важнейших конструкций при изучении практически любого языка программирования. Понять то, как работает цикл – это, фактически, залог успеха при решении большинства задач программирования. И в этой части мы рассмотрим различные виды циклов в C#, а также научимся их использовать.
Циклы в жизни
Мы ежедневно сталкиваемся с циклами в повседневной жизни. Цикл смены дня и ночи, цикличность времен года и так далее. Каждый день большинство из нас выполняет цепочку действий, которые, в итоге, складываются в цикл жизни: проснуться – умыться – позавтракать – пойти на работу – прийти с работы – поспать. Такой цикл может длиться до тех пор, пока мы живы. При этом, циклы могут быть условными, например, “Работать удаленно, пока находишься в другой стране”. Здесь условие выхода из цикла – возврат из другой страны домой.
В любом из этих примеров мы выполняем в цикле определенный набор действий – итерации цикла. Например, “проснуться – умыться – позавтракать – пойти на работу – прийти с работы – поспать” – это шесть действий одной итерации цикла.
Циклы в C#
Зачем использовать циклы в C#?
Цель использования цикла – многократное повторение одного и того же блока кода. Вместо того, чтобы раз за разом писать один и тот же код, когда это необходимо, намного проще (и правильнее!) использовать цикл. Например, нам необходимо вывести в консоль все четные числа с 1 до 20, то есть 2, 4, 6, 8, 10, 12, 14, 16, 18, 20. Всего 10 штук. Если не использовать циклы, то получится вот такой неприглядный код:
Console.WriteLine(2); Console.WriteLine(4); Console.WriteLine(6); Console.WriteLine(8); Console.WriteLine(10); Console.WriteLine(12); Console.WriteLine(14); Console.WriteLine(16); Console.WriteLine(18); Console.WriteLine(20);
то есть, мы раз за разом повторяем один и тот же код, меняя только цифру. Можно себе представить, что будет, если нам потребуется вывести четные числа до 1000? 2000? В данном случае, нам проще воспользоваться циклом, например, вот так:
for (int i = 2; i <= 20; i = i+2)
Console.WriteLine(i);
Этот код делает ровно то же самой, что и предыдущий – выводит четные числа от 1 до 20 включительно, но только делает это намного короче и элегантнее. Теперь более детально разберемся с тем, какие бывают циклы в C# и как они работают.
Цикл while в C# (цикл с предусловием)
Цикл while выполняется до тех пор, пока истинно условие. Синтаксис цикл whileследующий
while (условие)
{
инструкции;
}
если условиевозвращает true, то выполняются инструкции, которые также называются тело цикла. Если же условиевозвращает false, то мы выходим из цикла и выполняем прочие инструкции в коде.
Пример использования цикла: вывести сумму всех четных чисел с 2 до 50.
int num = 2; //начальное значение счётчика
int sum = 0; //переменная для хранения суммы
while (num <= 50) //перебираем числа до 50 включительно
{
sum += num;//прибавляем к сумме очередное четное число
Console.WriteLine($"{num} - {sum}");//выводим текущие значения четного числа и суммы
num += 2;//наращиваем счётчик на 2, чтобы получить следующее четное число
}
Console.WriteLine(sum);
Результат работы программы:
Цикл do..while в C# (цикл с постусловием)
Этот цикл аналогичен предыдущему, но выглядит следующим образом:
do
{
инструкции;
}
while (условие)
Принципиальное отличие этого цикла от предыдущего состоит в том, что цикл do..while выполняется хотя бы один раз, в то время как цикл while может не выполниться ни разу, если условие изначально будет ложным. Например, цикл do..while можно применить в случае, если мы изначально не знаем сколько раз необходимо выполнить тело цикла, но оно должно выполниться, хотя бы один раз.
Например, сформулируем задачу следующим образом: вывести числа от 5 до 0:
int counter = 5;
do {
Console.WriteLine(counter);
counter--;
}
while (counter >= 0);
Console.ReadKey();
Результат работы программы:

Цикл for (со счетчиком) в C#
Цикл for в C# выглядит следующим образом:
for (инициализатор ; условие; итератор)
{
инструкции;
}
- инициализатор — указанная в этом разделе операция выполняется один раз перед входом в цикл;
- условие — пока условие истинно (
true) цикл будет выполняться. Этот раздел должен содержать логическое выражение; - итератор — команда, которая выполняется каждый раз после выполнения тела цикла.
- инструкции — оператор или блок операторов, которые будут выполняться в цикле
Рассмотрим пример использования цикла for. Задача: вывести на экран все чётные числа от 1 до N включительно.
Без использования цикла такая задача, в принципе, не решается, как минимум по той причине, что мы не знаем значение N. Это может быть число и 0 и 100 и -100. Поэтому организуем следующий цикл for:
int N = 10; //задаем число до которого будем проверять все числа на чётность
for (int i = 1; i <= N; i++)
{
if (i % 2 == 0)
Console.WriteLine($"Число {i} - чётное");
}
Результат работы программы:
Разберем этот пример подробно. Начнем с описания цикла:
for (int i = 1; i <= N; i++)
- В блоке инициализатора мы инициализируем переменную
i(счётчик цикла). Общепринято давать счётчикам цикла короткие имена типаi,j,kи т.д. - В блоке условия содержится логическое выражение
i <= N. Так как по условиям задачи мы должны проверить все числа включительноN, то используется именно оператор меньше или равно (<=), иначе, если бы мы использовали оператор<, то программа бы вышла из цикла на значении 10 и мы бы не увидели последнюю строку. - В блоке итератора мы наращиваем значение переменной
iна1, используя постфиксный инкремент - Тело цикла содержит условный оператор
if..elseв котором мы проверяем число на чётность. Так как нам не требуется ничего выводить на экран, если число не чётное, то в данном случае, мы опустили вторую часть оператора —else.
Таким образом, мы дословно написали следующее — выполнять цикл, начиная с 1 и, заканчивая N включительно, наращивая на каждом шаге цикла счётчик на 1.
В блоке инициализатора можно использовать оператор присваивания, то есть задачу можно решить и вот таким способом:
int N = 10; //задаем число до которого будем проверять все числа на чётность
for (int i = 2; i <= N; i = i+2)
{
Console.WriteLine($"Число {i} - чётное");
}
Здесь в итераторе мы наращиваем счётчик сразу на 2, чтобы число гарантированно было чётным. Вы этом случае нам уже не потребуется условный оператор в теле цикла. Результат работы программы будет тот же, что и в предыдущем случае.
Цикл foreach в C#
Цикл foreachиспользуется для перебора некоторой последовательности элементов. Конструкция этого цикла следующая:
foreach (тип переменная in набор данных)
{
Действие;
}
В цикле используется тип переменной, и переменная через которую мы будем получать доступ к очередному значению в наборе данных. При этом, в качестве набора данных могут выступать любые последовательности.
Например, решим следующую задачу: пользователь вводит с клавиатуры любую последовательность символов. Вывести в консоль новую строку в которой каждый символ отделяется от предыдущего пробелом:
Console.Write("Введите любую строку: ");
string data = Console.ReadLine();
foreach (char c in data)
{
Console.Write($"{c} ");
}
так как строка (string) – это последовательность символов (char), то мы вполне можем воспользоваться циклом foreachдля получения в теле цикла каждого символа строки. Результат работы программы:
Цикл foreach удобно использовать, когда нам необходимо перебрать каждый элемент последовательности, а размер этой последовательности нам неизвестен.
Подведем итог
Цель использования цикла – многократное повторение одного и того же блока кода. В C# используются различные виды циклов: while, do..while, for, foreach. Циклы позволяют значительно сократить объем кода, когда требуется многократное повторение одной и той же операции или блока операций.
Домашнее задание №12
Рассчитать десятое число Фибоначчи. Числа Фибоначчи — элементы числовой последовательности в которой первые два числа равны 0 и 1, а каждое последующее число равно сумме двух предыдущих чисел.