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

Операторы цикла используются для организации многократно повторяющихся действий. Виды операторов цикла в C #:

– цикл с предусловием while,

– цикл с постусловием do…while,

– цикл с параметром for,

– цикл перебора foreach.

Оператор цикла с предусловием while организует выполнение одного оператора (простого или составного – блока) неопределенное заранее число раз. Синтаксис цикла с предусловием:

while (<Условие>) <Оператор>;

Здесь Условие определяет, будет ли выполняться Оператор. Если Условие == истина, то тело цикла (Оператор) выполняется, а затем снова проверяется Условие; если Условие == ложь, тело цикла не выполняется и управление передается на оператор, следующий непосредственно после тела цикла. Таким образом, Условие проверяется перед каждым выполнением тела цикла. Отсюда следует два крайних варианта. Первый: если результат Условия окажется ложным при первой же проверке, то тело цикла не выполнится ни разу. Второй крайний вариант: если в теле цикла отсутствуют операторы, влияющие на изменение Условия, то возможна ситуация зацикливания (бесконечный цикл), то есть отсутствия возможности корректного завершения цикла. Чтобы ошибки не произошло, в процессе работы цикла Условие должно стать ложным.

Рассмотрим простой пример:

int i = 0;

while (i < 5)

Console.Write("{0} ", ++i);

Эти операторы выполняют вывод на экран целых чисел из интервала от 1 до 5 – пока переменная i не станет больше или равна 5, ее значение увеличивается на единицу (начальное значение 0) и выводится на экран. Выход из цикла происходит, когда условие (i < 5) станет равно false, а учитывая, что i увеличивается на 1, выход произойдет, когда i станет равен 5.

Оператор цикла с постусловием do…while также организует выполнение одного оператора (простого или составного) неопределенное заранее число раз. В отличие от цикла с предусловием while условие завершения цикла проверяется после выполнения тела цикла. Синтаксис цикла с постусловием:

do Оператор while (Условие);

Здесь, так же, как и в операторе цикла while, Условие определяет, будет ли выполняться Оператор. Сначала Оператор (тело цикла) выполняется, а затем производится проверка – если Условие == истина, то тело цикла выполняется снова, если Условие == ложь, тело цикла больше не выполняется и управление передается на оператор, следующий непосредственно после оператора цикла. Таким образом, Условие проверяется после каждого выполнения тела цикла, поэтому в отличие от цикла с предусловием, который может не выполниться ни разу, тело цикла с постусловием всегда выполняется хотя бы один раз. Возможная ошибка, связанная с зацикливанием, здесь остается, поэтому в теле цикла обязательно должны присутствовать операторы, влияющие на изменение Условия со значения true на значение false.

В качестве примера рассмотрим тот же вывод целых чисел от 1 до 5.

int i = 0;

do

Console.Write("{0} ", ++i);

while (i < 5);

Рассмотрим еще один пример, в большей мере демонстрирующий специфику цикла с условием: в предыдущем примере мы заранее можем сказать, сколько раз выполнится тело цикла (5 раз), здесь этого сказать заранее невозможно:

int a = 0;

do

{

Console.WriteLine("Введите четное число > 10");

a = int.Parse(Console.ReadLine());

}

while ((a <= 10) || (a % 2 == 1));

Console.WriteLine("Число {0} > 10 и четное", a);

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

К этой задаче больше подходит именно цикл с постусловием – он обязательно должен выполниться хотя бы один раз, чтобы выдать сообщение о вводе числа и определить значение переменной a, хотя цикл с предусловием тоже можно использовать для решения этой задачи.

Заметьте, если тело цикла состоит из нескольких операторов, то они должны быть оформлены в блок с помощью фигурных скобок. Если их опустить, при компиляции определяются синтаксические ошибки.

Следующий вид циклического оператора – цикл с параметром for. Тело такого цикла выполняется заранее определенное количество раз. Синтаксис:

for (<Инициализация>; <Условие>; <Модификация>) <Оператор>;

Инициализация, Условие, Модификация могут содержать несколько опе­раторов, разделенных запятой.

Инициализация используется для задания параметрам (также называемых счетчиками или переменными цикла) начальных значений. Если параметр объявляется в части Инициализации, то его областью действия является цикл и вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла.

Условие определяет, будет ли выполняться тело цикла: если Условие == истина, цикл выполняется, если Условие == ложь, цикл завершается и управление передается на следующий после цикла оператор. Условие проверяется перед каждым выполнением тела цикла. Если этот блок содержит несколько логических выражений через запятую, то запятая равносильна операции логическое И (&&).

Модификация выполняется после каждой итерации цикла перед проверкой Условия.

Оператор – это тело цикла. Он может быть простым или составным (оформленным в блок с помощью фигурных скобок).

Цикл for выполняется следующим образом: сначала выполняется Инициализация, затем проверяется Условие, и если оно истинно, то выполняется тело цикла – Оператор. После этого производится Модификация и снова проверяется Условие. Как только Условие становится ложным, цикл завершает свою работу.

Любая из частей оператора for (Инициализация, Условие, Модификация, Оператор) может отсутствовать, но в таком случае символ “точка с запя­той”, определяющий позицию пропускаемой части, все равно нужно оставлять.

Поскольку Условие проверяется перед каждым выполнением тела цикла, можно сказать, что цикл с параметром реализо­ван как цикл с предусловием. Соответственно, здесь тоже возможен случай, что тело цикла не выполняться ни разу (если Условие сразу равно false), и есть опасность зацикливания (нужно заботиться о достижении Условием значения false). Работать цикл for будет так же, как и приведенный ниже цикл while:

<Инициализация>;

while (<Условие>)

{

<Оператор>;

<Модификация>;

}

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

Вернемся к примеру, который мы рассматривали при изучении циклов с условием. Ниже приведено несколько вариантов использования цикла с параметром для решения этой задачи, результат их работы будет одинаковый – вывод целых чисел от 1 до 5.

Вариант 1:

for (int i = 1; i <= 5; i++)

Console.Write("{0} ", i);

Особенности этого варианта: все блоки содержат по одному оператору, параметр описан и его начальное значение определено в блоке Инициализации.

Вариант 2:

for(int i = 0; i < 5;)

Console.Write("{0} ", ++i);

Особенности этого варианта: блок модификации отсутствует, изменение параметра происходит с помощью операции инкремента в теле цикла.

Вариант 3:

for (int i = 1; i <= 5; Console.Write("{0} ", i), i++);

Особенности этого варианта: блок модификации содержит два оператора, разделенных запятой, тело цикла состоит из пустого оператора.

Вариант 4:

for (int i = 1; i <= 5; Console.Write("{0} ", i++));

Особенности этого варианта: тело цикла пустое – действие, которое должно выполняться по циклу, и изменение параметра заключены в метод Write ().

Вариант 5:

int i = 1;

for (; i <= 5; Console.Write("{0} ", i++));

Особенности этого варианта: инициализация переменной-параметра происходит до цикла, блок Инициализации пуст (точка с запятой оставлена).

Таким образом, C # предоставляет множество вариантов использования цикла с параметром, программист может выбрать такой, который ему наиболее удобен.

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

Рассмотрим пример использования вложенных циклов:

for (int i = 1; i <= 5; Console.WriteLine(), i++)

for (int j = 1; j <= 5; j++)

Console.Write("{0},{1} ", i, j);

Что будет выведено на экран в результате выполнения этих операторов?

Упражнение 2.2. С клавиатуры вводится номер цвета радуги, нужно определить сам цвет.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: