Циклы

advertisement
C# ЦИКЛЫ
Циклом называется один или несколько операторов, повторяющихся заданное число раз
или до тех пор, пока не будет выполнено определенное условие.
В языке C# существует 4 разновидности циклов:
1. Цикл с перечислением (цикл типа for)
2. Цикл с предусловием (типа while)
3. Цикл с постусловием (типа do)
4. Цикл итерации (типа foreach)
ЦИКЛ С ПЕРЕЧИСЛЕНИЕМ (ТИПА FOR).
В первой программе был пример цикла с перечислением на вычисление суммы
for (int k = 1; k <= n; k = k + 1 /*или k+=1 или k++*/)// Организация цикла по индексу k
sum = sum + k;//или sum+=k;
Там же был комментарий к работе этого цикла.
Еще раз посмотрим, как работает цикл с перечислением на примере простого цикла печати
последовательности чисел
for (int i = 0; i < 5; i++)
Console.WriteLine(i);
Цикл приводит к печати на экране 5 целых чисел от 0 до 4 включительно.
В цикле три секции:
- инициализации (здесь int i = 0),
- условия выхода из цикла (здесь i < 5; если условие не выполняется, выход из цикла),
- итерации (здесь значение i увеличивается на единицу оператором ++).
Операторы, стоящие в теле цикла (здесь один оператор Console.WriteLine(i);), выполняются
каждый раз после проверки условия, если оно выполняется.
Условие проверяется в самом начале после инициализации и каждый раз после итерации.
Итерация выполняется каждый раз после выполнения операторов в теле цикла.
Собственно этот алгоритм и создает цикл:
«условие -> операторы тела (или выход) -> итерация -> условие->…»
Инициализация выполняется один единственный раз в самом начале.
Условие проверяется вслед за инициализацией и, если оно не выполняется, то операторы
тела могут не выполниться ни разу. Поэтому цикл типа for относится к циклам с
предусловием.
Второй цикл с предусловием имеет более примитивную структуру.
ЦИКЛ С ПРЕДУСЛОВИЕМ ТИПА WHILE
Цикл с предусловием while имеет более примитивную структуру while(condition).
В его описании есть только раздел условия, при выполнении которого операторы, стоящие в
теле цикла выполняются.
Тот же код, что записан выше, будет выглядеть следующим образом:
int l=0;
while(l<5)
{
Console.WriteLine("l = {0}",l);
l++;
}
Как видим, для алгоритма перечисления с изменением параметра больше подходит цикл
типа for, который включает в свою запись разделы инициализации и итерации
естественным образом.
Цикл типа while имеет смысл применять в алгоритмах, не содержащих обычного
перечисления, где удобнее использовать цикл типа for.
Например, если необходимо проверить правильность ввода числа с клавиатуры, можно
использовать метод TryParse в следующих операторах с применением цикла типа while:
1
©Фомин Георгий Викторович
int n;
Console.Write("Введите целое число n = ");
// int.TryParse здесь проверит,
// можно ли представить вводимое с консоли сочетание символов целым числом.
// Если да, то метод вернет true, а в параметре out n образуется введенное число.
// Если нет, то метод вернет false.
// Здесь оператор внутри цикла while выполняется каждый раз, когда
// метод TryParse возвращает false.
while(!int.TryParse(Console.ReadLine(),out n))
Console.Write("Ошибка ввода. Попробуйте еще раз.\nn = ");
Console.WriteLine("OK!");
ЦИКЛ С ПОСТУСЛОВИЕМ ТИПА DO-WHILE
Цикл do-while имеет структуру do {} while(condition). Раздел условия помещен в
завершающую часть цикла, а операторы, из которых состоит тело цикла, расположены
между do и while.
Важное отличие цикла do-while от уже рассмотренных типов в том, что операторы тела
цикла выполняются хотя бы один раз в самом начале. Пример алгоритма, в котором
использование цикла do-while было бы к месту.
Найдем факториал заданного целого значения числа m.
int m;
do
{
Console.Write("Введите целое число m > 1 ");
while(!int.TryParse(Console.ReadLine(), out m) || m < 2)// Обратите внимание на условие
Console.Write("Ошибка ввода или m < 2. Попробуйте еще раз.\nm = ");
int mCur = m;// Текущее значение m
double f = 1; // Для подсчета факториала
do
f *= mCur--;
while (mCur > 1);
Console.WriteLine("{0}! = {1:n0}", m, f);// Обратите внимание на строку формата n0
Console.WriteLine("Нажмите esc для завершения или любую клавишу для повтора.");
}
while (Console.ReadKey(true).Key != ConsoleKey.Escape);
ЦИКЛ FOREACH
Цикл для итерации по элементам списка произвольных объектов известного типа.
Синтаксис foreach (<тип объектов> current in <список объектов указанного типа>).
Опишем небольшой массив чисел типа int и поместим в него нечетные числа. Так выглядит
описание и инициализация массива
int[] odd = { 1, 3, 5, 7, 9, 11 };
Используем цикл foreach для вывода этих чисел на экран
Console.WriteLine("Немного нечетных чисел");
foreach (int oddNmb in odd)
Console.WriteLine(oddNmb);
Выше нам встречался пример так называемого перечислимого типа (enumerable,
сокращенно enum). Это был тип ConsoleKey, в котором перечислялись все клавиши
клавиатуры.
Рассмотрим еще один перечислимый тип ConsoleColor.
Набрав имя ConsoleColor и поставив точку, мы получим список цветов, которые могут быть
отображены в "черном окне" консоли.
2
©Фомин Георгий Викторович
Используя цикл foreach, можно перечислить все цвета изображения текста
foreach (ConsoleColor clr in Enum.GetValues(typeof(ConsoleColor)))
{
Console.ForegroundColor = clr;
Console.WriteLine(clr);
}
Здесь использовался метод GetValues класса Enum, который возвращает массив всех
значений указанного перечислимого типа (в данном случае ConsoleColor). Аргументом
метода GetValues является объект класса Type. Объекты класса Type отражают информацию
об объектах любого класса. Это так называемая мета-информация. Получить объект класса
Type, отвечающий любому классу, можно, воспользовавшись оператором typeof.
Еще один пример. Используем цикл foreach для вывода на экран дней недели. Это элементы
перечислимого типа DayOfWeek.
Console.WriteLine("\nРабочие дни недели");
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
// Если хотим вывести только рабочие дни
if (day == DayOfWeek.Saturday || day == DayOfWeek.Sunday)
continue;
Console.WriteLine(day);
}
3
©Фомин Георгий Викторович
Download