Цикл — это последовательность каких-либо действий, которая может повторяться многократно.
В цикле всегда выделяют:
тело цикла — это те действия, что многократно повторяются;
управляющую конструкцию, предназначенную для определения необходимости повтора цикла.
По расположению управляющей части циклы делятся на циклы с предусловием и на циклы с постусловием.
В цикле с предусловием вначале определяется, можно ли выполнять тело цикла, и затем, если можно, тело цикла выполняется. И так происходит до тех пор, пока не станет ложным некоторое условие в заголовке цикла.
Цикл с постусловием всегда выполняется хотя бы один раз. В нём вначале выполняется тело цикла, а затем делается проверка: надо ли снова повторять цикл.
В языке С# имеется четыре оператора цикла: for, while, do и foreach. Первые три вида цикла унаследованы из языков C/C++, а последний — foreach — является новым. Конечно, цикл можно организовать и искусственно, применяя операторы if и goto, но рекомендуется всегда использовать «настоящие» операторы цикла.
Слово while переводится как «пока». То есть, пока истинно некое условие, повторять цикл.
Схематично этот цикл можно изобразить так, как показано на рисунке:
Как
видим — это цикл с предусловием. Вначале проверяем истинность
некоторого условия,
а затем, если оно истинно, выполняем операторы (один или несколько),
составляющие тело цикла.
Такой цикл не выполниться ни разу, если условие изначально ложно.
Условие — это любое выражение, имеющее результат логического типа, т.е. условие для операторов цикла записывается точно также, как для оператора ветвления if.
Формально оператор while можно записать так:
while(условие) // Заголовок
{
операторы тела цикла
}
Тело цикла практически всегда необходимо оформлять как блок, так как оператор while редко содержит в своём теле только один оператор.
Алгоритм работы оператора прост:
Вычисляется значение условия в заголовке оператора.
Если оно истинно, то выполняются операторы тела цикла, а затем управление снова передаётся на заголовок. Если условие ложно, то оператор заканчивает работу. После этого будет выполняться оператор, следующий сразу же за оператором цикла.
Пример. Найти сумму квадратов первых n натуральных чисел.
Возможный текст программы:
using System;
namespace Prim_while
{
class Program
{
public static void Main(string[] args)
{
int i, n, s;
Console.Write("n=");
n = int.Parse(Console.ReadLine());
s = 0;
i = 1;
while(i <= n)
{
s += i * i;
i++;
}
Console.WriteLine("s={0}", s);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результат работы программы:
n=3
s=14
Press any key to continue . . .
В языке С# оператор while используется реже, чем, к примеру, в Паскале, так как в C# отдают предпочтение очень мощному и универсальному циклу for.
Цикл do — это цикл с постусловием. Его схема выглядит так:
Формальная
запись:
do{
Операторы тела цикла
}while(Условие);
Цикл do всегда выполняется хотя бы один раз. И далеко не во всех задачах это хорошо. Для нашей только что рассмотренной задачи этот цикл может дать побочный эффект: если n по ошибке задать отрицательным или равным нулю, то s будет равно 1, что явно не так. А вот использовать цикл do для проверки входных данных очень даже удобно! Что мы и сделаем, тем самым избавимся от побочного эффекта.
Итак, та же задача: найти сумму квадратов первых n натуральных чисел.
Возможный текст программы с использованием цикла do:
using System;
namespace Prim_do
{
class Program
{
public static void Main(string[] args)
{
int i, n, s;
do
{
Console.WriteLine("Задайте n>0:");
n = int.Parse(Console.ReadLine());
}
while(n < 1);
s = 0;
i = 1;
do
{
s += i * i;
i++;
}
while(i <= n);
Console.WriteLine("s={0}", s);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результаты работы:
Задайте n>0:
-2
Задайте n>0:
3
s=14
Press any key to continue . . .
Как видите, здесь мы специально один раз задали неверное значение n (n=-2), и первый цикл do «забраковал» такое значение.
Обычная область применения цикла do: он используется для ввода данных с проверкой.
Это самый популярный оператор цикла для всех С-подобных языков. Популярность объясняется необычайной гибкостью и мощью этого оператора. Циклы for в языках типа Basic и тем более Pascal кажутся просто примитивными.
Формальная запись оператора for следующая:
for(начальные действия; условие; дополнительные действия)
{
Операторы тела цикла
}
Начальные действия — это любые операторы присваивания, записанные через запятую. Здесь, как правило, делается инициализация различных переменных, необходимых для работы в цикле for.
Условие — логическое выражение, записывается так же, как и для других операторов цикла и оператора if.
Дополнительные действия — любые записанные через запятую операторы присваивания и (или) операторы-выражения (автоувеличение, автоуменьшение).
Алгоритм работы оператора for:
Вычисляются операторы, составляющие начальные действия.
Вычисляется условие. Если оно ложно, то оператор заканчивает свою работу. Если условие истинно, то выполняются операторы тела цикла, потом — операторы, составляющие группу дополнительных действий, и затем снова делается проверка истинности условия. И так до тех пор, пока оно остаётся истинным.
Количество операторов в начальных и в дополнительных действиях может быть любым. Любая часть в заголовке (или даже все части) могут отсутствовать:
for( ; ; ) { операторы тела цикла }
Но точки с запятыми обязательно должны быть!
Снова вернёмся к нашему примеру, но реализуем его с помощью оператора for: найти сумму квадратов первых n натуральных чисел.
Возможный текст программы:
using System;
namespace Prim_for
{
class Program
{
public static void Main(string[] args)
{
int i, n, s;
do
{
Console.WriteLine("Задайте n>0:");
n = int.Parse(Console.ReadLine());
}
while(n < 1);
for(i = 1, s = 0; i <=n; i++)
s += i * i;
Console.WriteLine("s={0}", s);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результаты работы:
Задайте n>0:
-2
Задайте n>0:
3
s=14
Press any key to continue . . .
Как видим, ранее рассмотренный оператор цикла while — это сильно урезанный цикл for.
Цикл for позволяет работать более комфортно, записывать исходный текст в более естественной и компактной форме.
Это новый вид цикла, которого не было в языках C/C++. Он появился только в языке C#. Дословный перевод: «для каждого».
Формальная запись этого цикла следующая:
foreach(Тип Переменная in Коллекция)
{
// тело цикла
}
где
Тип — тип данных;
Переменная — имя переменной;
in — ключевое слово;
Коллекция — имя коллекции. Коллекции будем изучать позже. Пока можно считать, что это некий набор данных, имеющих общее имя.
Понимать оператор надо так: для каждого элемента коллекции в теле цикла надо выполнить требуемые действия.
Текущий элемент коллекции, с которым выполняются действия при очередном выполнении тела цикла, хранится во временной переменной Переменная, которая должна иметь тот же тип данных, что и элементы коллекции.
При работе с циклом foreach имеется целый ряд ограничений:
невозможно использовать без коллекций, то есть, к примеру, решить рассмотренную выше задачу: «Найти сумму квадратов первых n натуральных чисел» с помощью оператора foreach не получится;
элементы коллекции доступны только по чтению, то есть их можно распечатывать, суммировать и так далее, но их нельзя изменять в цикле foreach;
нельзя пройти только часть коллекции, например: от начала коллекции и до её середины, или идти с шагом, отличным от 1.
В общем, цикл foreach является частным случаем цикла for.
Пример. Распечатать значения элементов массива. Массив задан при его инициализации.
Возможный текст программы:
using System;
namespace Prim_foreach
{
class Program
{
public static void Main(string[] args)
{
// Описание и инициализация массива вещественных чисел
double [] x = {12.5, -4, 0, 2.1};
Console.WriteLine("Массив:");
foreach(double t in x)
Console.WriteLine("{0}",t);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результаты работы:
Массив:
12,5
-4
0
2,1
Press any key to continue . . .
|
|
|