Циклы в C# - C# и .NET

Циклы в C#

Циклы в 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);

Результат работы программы:Циклы в C#/Цикл while в C#

Цикл 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();

Результат работы программы:

Циклы в C#. Цикл do..while в C#

Цикл 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 (со счетчиком) в C#

Разберем этот пример подробно. Начнем с описания цикла:

for (int i = 1; i <= N; i++)
  • В блоке инициализатора мы инициализируем переменную i (счётчик цикла). Общепринято давать счётчикам цикла короткие имена типа ijk и т.д.
  • В блоке условия содержится логическое выражение 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для получения в теле цикла каждого символа строки. Результат работы программы:Циклы в C#. Цикл foreach в C#

Цикл foreach удобно использовать, когда нам необходимо перебрать каждый элемент последовательности, а размер этой последовательности нам неизвестен.

Подведем итог

Цель использования цикла – многократное повторение одного и того же блока кода. В C# используются различные виды циклов: while, do..while, for, foreach. Циклы позволяют значительно сократить объем кода, когда требуется многократное повторение одной и той же операции или блока операций.

Домашнее задание №12

Рассчитать десятое число Фибоначчи. Числа Фибоначчи — элементы числовой последовательности в которой первые два числа равны 0 и 1, а каждое последующее число равно сумме двух предыдущих чисел.