Циклы C#: создание и управление циклами, циклы с пред и постусловиями

Циклы — это конструкции языка программирования, которые позволяют выполнять определенный блок кода до тех пор, пока выполняется определенное условие. В C# существуют четыре вида циклов — for, foreach, while и do while. Без использования циклов вряд ли сегодня обходится хоть какая-то более менее серьезная программа.

Цикл for

Также можно встретить название этого цикла — цикл со счётчиком. Конструкция цикла for следующая:

for (инициализатор ; условие; итератор)
    {
       тело цикла; 
    }
  • инициализатор — указанная в этом разделе операция выполняется один раз перед входом в цикл;
  • условие — пока условие истинно (true) цикл будет выполняться. Этот раздел должен содержать логическое выражение;
  • итератор — команда, которая выполняется каждый раз после выполнения тела цикла.
  • тело цикла — оператор или блок операторов, которые будут выполняться в цикле

Пример использования цикла for

Рассмотрим пример использования цикла 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} - чётное");
}

В консоли мы увидим следующие значения:

Число 2 — чётное
Число 4 — чётное
Число 6 — чётное
Число 8 — чётное
Число 10 — чётное

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

for (int i = 1; i <= N; i++)
  • В блоке инициализатора мы инициализируем переменную i (счётчик цикла). Общепринято давать счётчикам цикла короткие имена типа i, j, k и т.д.
  • В блоке условия содержится логическое выражение i <= N. Так как по условиям задачи мы должны проверить все числа включительно N, то используется именно оператор меньше или равно (<=), иначе, если бы мы использовали оператор <, то программа бы вышла из цикла на значении 10 и мы бы не увидели последнюю строку.
  • В блоке итератора мы наращиваем значение переменной i на 1, используя постфиксный инкремент
  • Тело цикла содержит условный оператор if..else в котором мы проверяем число на чётность. Так как нам не требуется ничего выводить на экран, если число не чётное, то в данном случае, мы опустили вторую часть оператора — else.

Таким образом, мы дословно написали следующее — выполнять цикл, начиная с 1 и, заканчивая N включительно, наращивая на каждом шаге цикла счётчик на 1. В данном случае наше приложение будет работать следующим образом:

  1. Переменной i присваивается значение 1.
  2. Проверяется условие i < 10 (N = 10).
  3. Условие истинно, следовательно, выполняем тело цикла
  4. Наращиваем значение i на 1 (i++)
  5. Проверяем условие. Теперь это будет условие 2<10
  6. Условие истинно — выполняем тело цикла
  7. и т.д. до момента пока i не станет равно 11 — в этом случае условие будет ложно и мы выйдем из цикла.
Скачать код проекта из Github

Возвращаясь к теме описания цикла for так же стоит отметить следующую его особенность инициализация ; условие; порядок выполнения могут отсутствовать и добавляются по желанию.

Например, в C# можно создать бесконечный цикл for:

for ( ; ; )
{
    // действия, которые будут выполняться бесконечно
}

Есть и другие особенности этого цикла, например, использование запятых в инициализации и порядке выполнения, но это всё уже тонкости программирования, которые нам пока не потребуются для дальнейшего изучения языка C#.

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

Цикл for, обычно, используется, когда количество итераций заранее известно. Например,

  • перебор элементов в различных коллекциях (списках, кортежах, строках, массивах).
  • работа с диапазонами. Выше мы использовали цикл for для поиска четных чисел в диапазоне от 1 до 10.
  • создание новых коллекций на основе существующих. Например, можно отобрать только чётные числа из списка
  • работа с файлами, для чтения или записи данных.

Также, цикл for удобно использовать, когда нам необходимо выполнять итерации с каким-либо шагом, например, проверять не каждое число подряд из диапазона, а каждое второе, каждое третье и так далее. В этом случае, итератор цикла позволит нам реализовать более сложную логику.

Цикл while

Также, этот цикл носит название цикл с предусловием. Конструкция цикла while:

while (условие)
  {
     Тело цикла;
  }

Как и цикл for, цикл while выполняется до тех пор пока условие возвращает истину (true). Тело цикла while может не выполнится ни разу, если условие изначально будет ложно.

Пример использования цикла while

Условия задачи: выводить на экран четные числа, начиная с 2 до тех пор пока их сумма не станет больше 200. Решить такую задачу можно с использованием цикла while следующим образом:

int i = 2;
int sum = 0;
while (sum < 200)
{
    sum += i;
    Console.WriteLine($"Число {i} чётное");
    i += 2;
    Console.WriteLine($"Сумма чётных чисел {sum}");
}

Здесь мы в теле цикла уже ничего не проверяем, так как из школьного курса математики знаем, что чётные числа — это числа которые делятся на 2 без остатка — 2, 4, 6, 8 и т.д. Поэтому в теле цикла мы увеличиваем переменную i каждый раз на 2

i += 2; //это то же самое, что и i = i + 2

Также, в теле цикла мы каждый раз рассчитываем сумму чётных чисел, чтобы проверить перед очередным шагом (итерацией) цикла условие. В результате в консоли мы увидим следующий вывод:

Число 2 чётное
Сумма чётных чисел 2
Число 4 чётное
Сумма чётных чисел 6
Число 6 чётное
Сумма чётных чисел 12
Число 8 чётное
Сумма чётных чисел 20
Число 10 чётное
Сумма чётных чисел 30
Число 12 чётное
Сумма чётных чисел 42
Число 14 чётное
Сумма чётных чисел 56
Число 16 чётное
Сумма чётных чисел 72
Число 18 чётное
Сумма чётных чисел 90
Число 20 чётное
Сумма чётных чисел 110
Число 22 чётное
Сумма чётных чисел 132
Число 24 чётное
Сумма чётных чисел 156
Число 26 чётное
Сумма чётных чисел 182
Число 28 чётное
Сумма чётных чисел 210

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

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

Примеры применения цикла while:

  • Обработка пользовательского ввода. Цикл while позволяет повторно запрашивать у пользователя ввод до тех пор, пока он не введёт допустимое значение.
  • Обработка событий. Цикл while полезен для обработки событий или процессов, которые продолжают происходить до тех пор, пока не изменится определённое условие.
  • Реализация алгоритмов. Цикл while используется для реализации различных алгоритмов, таких как поиск, сортировка или математические вычисления.
Скачать код проекта из Github

Цикл do…while

Также, этот цикл носит название — цикл с постусловием. Конструкция цикла do..while:

do
  {
    Действие;
  }
while (Условие)

Думаю, не стоит повторять, что значит условие или действие в описании конструкции цикла. Стоит лишь только добавить, что этот цикл выполниться хотя бы один раз минимум, тогда как предыдущий цикл while может не выполниться не разу, если будет задано заведомо ложное условие.

Пример использования цикла do..while

Условия задачи: пользователь вводит с клавиатуры целые числа. До тех пор, пока пользователь не введет 0 определять минимальное из введенных значений

В данном случае нам подходит только цикл do..while так как пользователь должен ввести хотя бы одно число (0). Решением задачи будет следующий код:

int min = int.MaxValue;
int num;
do
{
    Console.Write("Введите целое число: ");
    num = Convert.ToInt32(Console.ReadLine());
    if ((num < min) && (num != 0))
    {
        min = num;
    }
}
while (num != 0);
Console.WriteLine($"Минимальное значение {min}");

Здесь стоит обратить внимание на пару моментов. В-первых, так как мы не знаем, что введет пользователь, то мы присваиваем переменной min, которая будет хранить минимальное из введенных значений, заведомо самое большое число для типа int:

int min = int.MaxValue;

во вторых, в цикле мы проверяем сразу два условия — что введенное число меньше минимального (num<min) и, что пользователь не ввел 0 (num != 0) так как по условию задачи 0 — это условие выхода из цикла и участвовать в поиске минимума это число не должно. Как только пользователь вводит 0, то условие цикла while (num != 0) становится ложным и мы выходим из цикла. В результате мы можем получить в консоли следующий вывод:

Введите целое число: 2
Введите целое число: 1
Введите целое число: 4
Введите целое число: 0
Минимальное значение 1
Скачать код проекта из Github

Когда использовать цикл do..while?

Цикл do..while используется в тех случаях, когда нам необходимо выполнить хотя бы одну итерацию цикла. В целом, примеры использования этого цикла могут быть точно такими же, как и для цикла while, указанные выше.

Цикл foreach

Конструкция цикла foreach:

foreach (тип переменная in набор данных)
  {
     Действие;
  }

В цикле используется тип переменной, и переменная через которую мы будем получать доступ к очередному значению в наборе данных. При этом, в качестве набора данных могут выступать любые последовательности.

Пример использования цикла foreach

Например, так как строка (string) в C# — это последовательность символов (char) и мы можем вывести каждый символ строки по отдельности, используя цикл foreach:

Console.Write("Введите строку: ");
string str = Console.ReadLine();
foreach (char ch in str)
{
    Console.WriteLine(ch);
}

В консоли мы можем увидеть, например, такой вывод:

Введите строку: Привет
П
р
и
в
е
т
Скачать код проекта из Github

Когда использовать цикл foreach?

Цикл foreach удобно использовать в том случае, когда необходимо получить последовательный доступ к каждому значению коллекции и произвести над ним одну и ту же операцию. Примеры использования цикла foreach могут быть следующие:

  • Преобразование данных. Цикл foreach подходит для операций, изменяющих данные на месте без создания новых наборов данных. В этом случае цикл foreach предоставляет нам простой, лаконичный и понятный подход.
  • Рендеринг списков в веб-приложениях — цикл foreach часто используется, когда нужно отобразить каждый элемент массива на странице

Управление циклами в C#

При работе с циклами бывает необходимо не проходить все итерации цикла целиком, а прервать выполнение цикла по какому-либо дополнительному условию или же пропустить какую-то часть тела цикла и начать новую итерацию. Для этих целей мы можем управлять циклами в C#. Управлять циклами в C# возможно с использованием двух операторов перехода:

  • continue — прерывает текущую итерацию цикла и переходит к следующей;
  • break — полностью прерывает выполнение цикла.

Пример с continue

Условия задачи: пользователь вводит с клавиатуры числа. Считать сумму только чисел больше 0. Условием выхода из программы является ввод числа 0

Как известно, любую задачу можно решить несколькими способами. Решим эту задачу, используя оператор continue:

int sum = 0;
int num;
do
{
    Console.Write("Введите число: ");
    num = Convert.ToInt32(Console.ReadLine());
    if (num <= 0)
        continue; //пропускаем весь код, расположенный ниже оператора и переходим к следующей итерации
    sum += num;
}
while (num != 0);
Console.Write($"Сумма введенных чисел: {sum}");

здесь, если пользователь вводит отрицательное число или число равное нулю, то срабатывает оператор continue и мы переходим к следующей итерации цикла или выходим из цикла. Результат работы приложения в консоли:

Введите число: 3
Введите число: -3
Введите число: 1
Введите число: 0
Сумма введенных чисел: 4
Скачать код проекта из Github

Пример с break

Условия задачи: Выводить все символы строки до тех пор, пока не встретится символ !

Console.WriteLine("Введите любую строку:");
string str = Console.ReadLine();
foreach (char ch in str)
{
    if (ch == '!')
        break; //полностью прерываем цикл 
    Console.WriteLine(ch);
}

Так как пользователь может сразу же первым символом задать символ восклицательного знака, то проверка символа стоит перед его выводом на экран. Пример вывода в консоли:

Введите любую строку:
Привет! Мир!
П
р
и
в
е
т
Скачать код проекта из Github

Итого

Сегодня мы разобрались с циклами в C#, посмотрели как они работают, а также научились управлять циклами в нашем приложении с помощью операторов continue и break. В зависимости от условий задачи мы можем выбрать цикл со счётчиком, цикл с предусловием, с постусловием или цикл для перебора элементов последовательности.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии