Операторы цикла используются для организации многократно повторяющихся действий. Виды операторов цикла в 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. С клавиатуры вводится номер цвета радуги, нужно определить сам цвет.