Обучение C#

Формула программиста
основатель — Волосатов Евгений Витольдович

Операторы цикла

Цикл предполагает многократное повторение блока операций – тела цикла.
В языке C# определены 4 типа цикла:
  • цикл с предусловием while;
  • цикл с постусловием dowhile;
  • параметрический цикл for;
  • цикл перебора элементов foreach.

Цикл с предусловием


Синтаксис цикла с предусловием
while(условие)
{
  тело цикла;
}

Пока условие, указанное в круглых скобках выполняется (имеет истинное значение), выполняется тело цикла. При входе в цикл сначала осуществляется проверка условия, а затем, при его выполнении, выполняются операции тела цикла. Затем снова осуществляется проверка условия. Цикл заканчивает свое выполнение, когда условие повторения цикла, записанное в круглых скобках, станет ложным.
Если при входе в цикл с предусловием условие будет иметь ложное значение, цикл не выполнится ни разу.
Если тело цикла состоит только из одной операции, в фигурные скобки его можно не заключать.
Используя цикл с предусловием, необходимо следить за тем, чтобы внутри тела цикла происходило изменение операндов, участвующих в формировании условия. В противном случае может произойти зацикливание – выход из цикла не будет осуществлен.
В качестве примера применения цикла while рассмотрим программу, которая считает количество цифр во введенном числе.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int value = int.Parse(Console.ReadLine());
      int count = 0;
      if (value == 0) count = 1; // проверка на ввод 0
      while(value > 0)
      {
        value = value / 10;
        count++;
      }
      Console.WriteLine(count);
      Console.ReadKey(count);
    }
  }
}

Рассмотренный пример содержит дополнительную проверку на ввод нулевого значения value. Если убрать эту проверку, при вводе нулевого значения выведется количество цифр во введенном числе равным 0. Использования дополнительной проверки можно избежать если использовать цикл с постусловием.

Закрепить тему циклов с предусловием Вы можете в разделе Пока-цикл курса Алгоритмика

Цикл с постусловием


Синтаксис оператора цикла с постусловием
do
{
  тело цикла;
} while(условие);

При выполнении цикла с постусловием сначала выполняется тело цикла, а затем осуществляется проверка условия. В случае если условие выполняется (имеет истинное значение), выполнение тела цикла повторяется. Выход из цикла осуществляется в случае если условие имеет ложное значение.
Поскольку при входе в такой цикл сначала осуществляется выполнение тела цикла, а затем проверка условия, цикл с постусловием всегда выполняется хотя бы один раз.
Применение цикла с постусловием удобно в случае если проверяемое выражение формируется во время итерации цикла.
Рассмотрим пример определения количества цифр в числе с использованием цикла с постусловием.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int value = int.Parse(Console.ReadLine());
      int count = 0;
      do
      {
        value = value / 10;
        count++;
      } while (value > 0);
      Console.WriteLine(count);
      Console.ReadKey();
    }
  }
}

Закрепить тему циклов с постусловием Вы можете в разделе Do-рацикл курса Алгоритмика

Параметрический цикл


Синтаксис параметрического цикла
for(инициализация; условие; модификация)
{
  тело цикла;
}

Чаще всего в формировании выражений для инициализации, условия и модификации применяется одна и та же переменная – параметр цикла.
В блоке инициализации задаются начальные значения параметров цикла. Блок условие формирует условие, при котором будет выполняться тело цикла. Блок модификации предполагает изменение параметров цикла для следующей проверки условия.
Рассмотрим пример вычисления суммы цифр от 1 до введенного числа n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int n = int.Parse(Console.ReadLine());
      int sum = 0;
      for (int i = 1; i <= n; i++)
        sum += i;
      Console.WriteLine(sum);
      Console.ReadKey();
    }
  }
}

При входе в цикл объявляется целочисленная переменная i и задается ее начальное значение, равное 1. Затем проверяется условие i<=n, и в случае его выполнения выполняется тело цикла. По окончании выполнения тела цикла производится модификация параметра цикла – значение i увеличивается на 1 – и вновь проверяется условие выполнения цикла. Выход из цикла выполняется когда значение i становится больше n.
В блоке инициализации может быть произведена инициализация нескольких параметров. В этом случае параметры с их начальными значениями указываются через запятую. При этом область видимости параметров должна быть одинакова (нельзя jодин параметр цикла описать внутри тела цикла, а другой - за его пределами).
Модификация параметров цикла также может включать в себя несколько действий, разделенных запятой. Последовательность выполнения действий, разделенных запятой – слева направо.
В примере, описанном выше, будем использовать переменную sum в качестве второго параметра цикла. Тело цикла при этом будет пустым, то есть будет состоять из единственного пустого оператора «точка с запятой» - ;.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int n = int.Parse(Console.ReadLine());
      int sum, i;
      for (i = 1, sum = 0; i <= n; sum += i, i++) ;
      Console.WriteLine(sum);
      Console.ReadKey();
    }
  }
}

Параметрический цикл может не содержать какой-либо блок внутри круглых скобок, но всегда содержит два символа-разделителя «точка с запятой». Пример бесконечного параметрического цикла
for(; ;)
{
  тело цикла;
}

Закрепить тему параметрических циклов Вы можете в разделе For-to-чки курса Алгоритмика


Цикл перебора элементов


Цикл перебора элементов foreach служит для поочередного обращения ко всем элементам коллекции. Частным случаем коллекции является массив.
Синтаксис цикла перебора элементов следующий
foreach(тип ИмяПеременной in коллекция)
{
  тело цикла;
}

Для каждого элемента, входящего в коллекцию, повторяется тело цикла. При этом обращение к текущему рассматриваемому элементу коллекции производится через ИмяПеременной, область видимости которой всегда ограничивается рамками цикла. Тип переменной указывается в зависимости от типа элементов или объектов, содержащихся внутри коллекции. Выбор типа переменной можно предоставить компилятору, если указать неявный тип переменной var. В этом случае тип переменной цикла будет выбран исходя из типов элементов рассматриваемой коллекции.
Ограничением на использование цикла foreach является то, что значения объектов, входящих в состав коллекции не могут быть изменены в теле цикла.
Рассмотрим пример задания и вывода элементов целочисленного массива. Для задания элементов массива цикл foreach использовать нельзя.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      int n = int.Parse(Console.ReadLine());
      int [] array = new int[n];
      for (int i = 0; i < n; i++)
        array[i] = (i+1) * 2;
      foreach (var s in array)
      Console.WriteLine(s);
      Console.ReadKey();
    }
  }
}

Вложенные циклы


Любые типы циклов могут быть вложенными. В этом случае один цикл размещается внутри другого. Во внешнем цикле при этом помимо внутреннего цикла могут размещаться дополнительные операции.
В качестве примера рассмотрим вывод чисел от 0 до 99 на экран в форме двумерного массива.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      for (int i = 0; i < 10; i++)
      {
        for (int j = 0; j < 10; j++)
          Console.Write("{0,3} ", i * 10 + j);
        Console.WriteLine();
      }
      Console.ReadKey();
    }
  }
}

Результат выполнения программы показан на рисунке

Параметр внешнего цикла изменяется от 0 до 9 и представляет собой величину десятков числа. Во внешнем цикле размещается вложенный цикл, параметр которого также меняется от 0 до 9, но представляет собой величину единиц числа. Кроме вложенного цикла, внешний цикл содержит в себе вызов функции перевода строки.

Закрепить тему вложенных циклов Вы можете в разделах Любимые циклы, Матрёшки курса Алгоритмика

Операторы передачи управления


К операторам передачи управления относятся
  • оператор возврата из метода return;
  • оператор прерывания цикла или ветвления break;
  • оператор продолжения цикла continue;
  • оператор посылки исключения throw (будет рассмотрен позднее).

Оператор return осуществляет возврат управления из вызванного метода в вызвавший его метод и в общем случае может вернуть некоторое значение. Общий синтаксис оператора
return значение;

Тип возвращаемого значения обязательно должен совпадать с типом возвращаемого значения, указанным в заголовке метода. Если метод имеет тип void, то возврат значения не предусмотрен, и оператор возврата имеет вид
return;


Оператор прерывания цикла break предназначен для принудительного выхода из цикла. Он прекращает выполнение операций цикла и передает управление следующей операции, размещенной после цикла. При использовании вложенных циклов оператор break осуществляет выход из цикла, внутри которого он непосредственно размещен.
В качестве примера рассмотрим тот же вывод чисел от 0 до 99 в виде матрицы, но при условии, что у всех выводимых чисел разряд единиц должен быть не больше разряда десятков.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      for (int i = 0; i < 10; i++)
      {
        for (int j = 0; j < 10; j++)
        {
          if (j > i) break;
          Console.Write("{0,3} ", i * 10 + j);
        }
        Console.WriteLine();
      }
      Console.ReadKey();
    }
  }
}

Результат выполнения программы представлен на рисунке

Оператор break также используется для окончания выполнения действий, размещенных по метке переключателя в операторе множественного выбора switch.

Оператор continue используется для перехода к следующей итерации цикла без завершения тела цикла для текущей итерации. При этом осуществляется переход к модификации (для цикла for) и проверке условия выполнения следующей итерации цикла (для всех циклов).
В качестве примера рассмотрим вывод чисел от 0 до 99 в форме двумерной матрицы, но при условии, что выводимые числа не содержат цифру 5.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
namespace MyProgram
{
  class Program
  {
    static void Main(string[] args)
    {
      for (int i = 0; i < 10; i++)
      {
        if (i == 5) continue;
        for (int j = 0; j < 10; j++)
        {
          if (j == 5) continue;
          Console.Write("{0,3} ", i * 10 + j);
        }
        Console.WriteLine();
      }
      Console.ReadKey();
    }
  }
}

Результат выполнения программы представлен на рисунке

Закрепить тему операторов передачи управления Вы можете в разделе Обман цикла курса Алгоритмика

Автор: Вставская Елена Владимировна

 
Написать комментарий:




Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.