Урок C# №8: «Циклы с пост и предусловием»


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

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

Итак, вы наверняка следите за своей физической формой и делаете по утрам хотя бы отжимания от пола. Ваш алгоритм действий примерно такой: вы принимаете упор лежа, отжались раз, распрямили руки и вновь отжались. И так пока вы либо не устанете, либо не выполните поставленное условие (мне надо отжаться сегодня 100 раз!).  Как видите, сам процесс отжимания это не более чем обычный повтор одних и тех же действий, т.е. тот же по сути цикл. Надеюсь, вы поняли суть. Если нет, то ниже мы уже разберем цикл на примерах. Для тех, кто лучше усваивает визуальную информацию,  можете посмотреть мой урок по с++ 6. В нем я  также приводил блок-схемы циклов.

В C# циклы делятся на четыре группы: цикл с предусловием, цикл с постусловием, параметризованный цикл и так называемый цикл Для каждого (foreach). Давайте рассмотрим их на нашем примере с отжиманием.

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

а) Цикл с предусловием:

while (условие)

действие;

б)Цикл с постусловием

do

{

Действие;

}

while (условие выхода из цикла);

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

while (условие)

{Действие1;

Действие2;

}

А теперь давайте рассмотрим, как работают  эти циклы.

Итак, опишем наш алгоритм с помощью цикла с предусловием. Допустим, что вы собрались отжаться 30 раз. Тогда наш алгоритм будет выглядеть так:


int  КоличествоОтжиманий=0; //пока мы не отжимались

while (КоличествоОтжиманий<30){
КоличествоОтжиманий++;
}

Как видите, все предельно просто. Я ввел счетчик КоличествоОтжиманий, который потом уже использовал в качестве проверки условия. В теле цикла я уже приращивал этот счетчик на единицу. Как только у меня КоличествоОтжиманий сравнялось 30, цикл прекращает свою работу.

Хорошо, а как же тогда работает цикл с постусловием. Представьте себе «спортсмена», для которого эти самые отжимания в тягость. Он делает отжимание и с надеждой вслушивается в голос тренера, который ему сообщает сколько он сделал. И тогда этот спортсмен обреченно делает эти отжимания до тех пор, пока не будет выполнена поставленная норма. Конечно, я несколько утрирую, но просто в памяти вскочил армейский эпизод :).


int  КоличествоОтжиманий=0; //пока мы не отжимались

do

{

КоличествоОтжиманий++;

}

while (КоличествоОтжиманий<30)

Обратили внимание на тот факт, что этот цикл выполнится хотя бы один раз? В этом и есть самое главное различие. Представьте себе, когда тренер говорит своему подопечному, чтобы тот отжался 30 раз. Если спортсмен делал это уже, то он его просто пошлет куда подальше:


int  КоличествоОтжиманий=30;

//Этот цикл уже никогда не выполнится

while (КоличествоОтжиманий<=30)
{
КоличествоОтжиманий++;
}

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

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


bool  Устал=true;

string Ответ;

int  КоличествоОтжиманий=0;

while (!Устал)

{

КоличествоОтжиманий++;

Console.WriteLine (“Вы устали? (да/нет)”);

Ответ=Console.ReadLine ();

Ответ=Ответ.ToLower().Trim (); //уберем пробелы и сделаем  текст  строчным

if (Ответ.Equals(“да”))

Устал=true;

}

Console.WriteLine (“Вы сделали всего  {0} отжиманий”, КоличествоОтжиманий);

Пробежитесь мысленно по коду. Думаю, что здесь для вас все ясно. Единственное, на что стоит обратить внимание —  в последней строчке кода в методе WriteLine я написал непонятную для вас {0}. Дело в том, что этот метод умеет форматировать вывод, а нам нужно, чтобы наш счетчик плавно вписался в текст. Поставив {0}, я указал, что в этом месте будет наш счетчик. 0 обозначает порядок вывода переменных. Если бы я указал после запятой несколько переменных, то другие бы в тексте были бы помечены как {1}, {2} и т.д. Более подробно мы рассмотрим это с вами, когда будем изучать классы и методы, а это уже совсем скоро.

В циклах часто бывают ситуации, когда мы точно не знаем, где будет точка выхода. Например, предыдущий код можно отнести к подобному.  В случае такого цикла нужно использовать оператор прерывания цикла break. Встретив этот оператор, C# сразу же покинет тело цикла. В случае нашего верхнего кода можно было бы не присваивать переменной Устал значение true, а написать так:


if (Ответ.Equals(“да”))

break;

Все, цикл прервался. Это очень часто используемый в циклах оператор, так что имейте это в виду. У него есть брат continue, о котором мы поговорим в следующем уроке.

А пока на этом все. Отдыхайте и готовьтесь к следующему уроку.

<<Предыдущий урок                                                         Следующий урок>>

Рубрика: Уроки по C#

Комментарии

6 коммент. на “Урок C# №8: «Циклы с пост и предусловием»”
  1. Данила Коловрат:

    Добрый день, в этом уроке надо исправить кучу ошибок или опечаток и недописок в циклах, рабочий только 1 — последний.

    • admin:

      Да, я уже знаю об ошибках. При копировании с Wordа много не докопировалось, а я не проверил. Все циклы вообще должны быть рабочими. Я все исправлю.
      Сказывается моя привычка не проверять работу =)

  2. Паша:

    Я так и не понял, а где в цикле с предусловием счётчик?
    Вообще, чет по циклам я у вас тормознул — не понятно как работают(код).
    И дальше так же ошибки?

    • admin:

      Прошу прощения за ошибки в этом уроке. Не все скопировалось как нужно с Word, а я не проверил материал перед публикацией. Попробуйте вновь прочитать уже исправленный урок. Если что не понятно, спрашивайте

      • Паша:

        О! Теперь понятно.
        Благодарю за редактирование).
        Очень классно предоставлен материал. Все понятно и доходчиво.
        Спасибо за труд)

  3. Павел:

    Цитирую: Если оно истина, то выходим, ложь – продолжаем дальше

    У меня в MVSE 2012 все наоборот если условие истина, то цикл выполняется, если условие ложь, то выход из цикла.

Добавить комментарий

Внимание! Не будут добавляться комментарии в виде откровенного спама или прямого анкора на свои сайты. Все спамеры будут передаваться в базу Akismet

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: