Урок по C# №9: «Циклы с параметрами »
В прошлом уроке мы познакомились с понятием цикла в программировании и разобрали два вида из них – цикл с предусловием и постусловием. Я постарался максимально доступно описать, как пользоваться ими.
Как вы поняли, циклы с пред и постусловием помогают решить массу задач. Тем не менее, иногда мы точно знаем, сколько раз будет выполняться тот или иной цикл. В этом случае следует использовать цикл с параметром.
Помните аналогию с отжиманиями? Нам там нужно было отжаться 30 раз. Иными словами, мы знаем количество отжиманий наперед, поэтому нам выгоднее использовать цикл с параметром.
Его синтаксис такой:
for (начальное значение цикла (с возможным объявлением;условие;приращение)
{
Если несколько выражений
}
Несмотря на то, что объявление выглядит громоздким, использовать такой цикл очень удобно. Давайте продемонстрируем это на примере с отжиманиями:
int i=0; for (; i < 30;i++,Console.WriteLine ("Вы сделали {0} отжиманий",i));
Кстати, как вы могли заметить, я часто привожу участки кода. Я не хочу загромождать страницу ненужной информацией, поэтому привожу саму суть. Если вы хотите скомпилировать программу, то набирайте этот код в теле метода Main.
Итак, давайте рассмотрим, что мы сделали. Обратите внимание на то, что я объявил переменную i вне скобок for. Я это сделал для того, чтобы можно было использовать i уже дальше в программе. Сейчас время сделать маленькое лирическое отступление.
Дело в том, что в сишной программе переменная будет делиться так или иначе на две группы – локальные и глобальные. Хотя в C# глобальных переменных нет (если сравнивать их с аналогиями в C++ и C), тем не менее, есть такие переменные, которые можно использовать в любом месте вашего класса. Это так называемые члены- класса. Более подробно мы это рассмотрим, когда будем изучать ООП.
В противовес им существуют локальные переменные. Они живут относительно небольшой промежуток времени в относительно небольшом участке кода. Для чего они нужны? Для ускорения работы программы. Дело в том, что локальные переменные заносятся в программный стек и оттуда их быстро извлечь. Если вам это пока непонятно, то вам стоит подождать, когда я буду писать о стеке.
Локальные переменные входят в методы, в тела условий и циклов, наподобие того, что мы сейчас рассмотрели. Особенность локальной переменной заключается в том, что она известна только в том участке кода, где мы ее используем. Это означает, что, например, в реализации нашего цикла таким образом (это, обычно, так нужно делать):
for (int i=0; i<30;i++); Console.WriteLine (i);
Мы получим ошибку компиляции, так как C# не знает о переменной i. А все лишь потому, что эта переменная известна только в теле цикла. Например, если бы мы написали так:
for(int i=0; i<30;i++)//обратите внимание, здесь нет точки с запятой, Console.WriteLine является телом цикла { Console.WriteLine (i); }
Наберите и запустите этот код. Посмотрите как он работает.
Кроме того, нам никто не запрещает самим указывать коффициент приращения. Например, нам нужно вывести список четных чисел от 2 до 50. Тогда мы поступим так:
for (int i=2; i<=50;i+=2} Console.WriteLine (i);
Думаю, смысл вам понятен. Еще один важный момент при использовании цикла с параметром является его гибкость в настройках. Хотя лично я не приветствую такой подход (все –таки, я начинал программировать с Паскаля, а там эти безобразия пресекались на корню), тем не менее, другие программисты часто используют эту возможность. Так что не удивляйтесь, если увидите такой код:
int k=3; for (;;) { k++; if (k>10) break;} Console.WriteLine (k);
Как видите, можно делать и такое. Кроме того, такой цикл всегда можно превратить в цикл с пред или постусловием.
Ну и напоследок. Где же применяются циклы с параметром? Как я уже сказал, когда мы точно знаем некие параметры цикла. Например, с использованием такого цикла очень легко вывести ряд Фибоначчи или же написать факториал. Ну и задача, подобная этим пресловутым отжиманиям.
Но гораздо большее применение цикла с параметром в обработке такой структуре данных, как массивы. Именно там вы и поймете прелесть подобного цикла. Но массивы и последний цикл foreach мы оставим на следующий урок. А пока все.
<<Предыдущий урок Следующий урок>>