На данном уроке мы познакомимся с циклами. Иногда их называют «петлями».
Циклы в коде нам порой требуются для того, чтобы некоторый его участок выполнить какое-то количество раз. Причём это количество может быть заранее известно, либо неизвестно. Если неизвестно, то количество зависит от некоторых условий.
Начнём с цикла типа while, так как, я считаю, что из всех трёх рассматриваемых нами в данном занятии видов циклов он самый простой.
Выглядит цикл с оператором while примерно вот так
Данный цикл состоит из оператора, условия в скобках и тела с инструкциями и командами. В тело цикла мы попадаем только тогда, когда условие в скобках будет истинным или будет иметь положительный результат.
То есть если мы, например в скобках напишем просто единичку (1), то цикл наш станет бесконечным. Это конечно в теории. Цикл можно окончить, если где-то в теле применить определённые команды, с которыми мы будем знакомиться позже. Не всё сразу.
Давайте попробуем работу цикла на практике. Конечно, пока будем выполнять только простейшие операторы, чтобы было понятнее.
Проект создадим с именем MYPROG06 из проекта прошлого занятия.
Из тела функции main() в файле main.c удалим весь код, кроме команды возврата значения, останется у нас вот это
int main()
{
return 0; //Return an integer from a function
}
Объявим и сразу инициализируем целочисленную переменную
1 2 3 |
int main() { int i=10; |
А теперь добавим наш цикл
1 2 3 4 5 6 7 8 |
int i=10; //------------------------ while(i) { printf("i = %d\r\n", i); i--; } //------------------------ |
Тело цикла будет многократно повторяться до тех пор, пока значение переменной i будет положительным, то есть будет иметь результат больший или равный нулю.
Попробуем собрать наш код и запустить приложение. Посмотрим на результат работы нашей программы
Как видим, наш счётчик досчитал от 10 до 1 в обратную сторону, так как у нас внутри цикла применено декрементирование. Причём, так как декрементирование происходит после вывода результата в консоль, то как только i становится равным нулю, мы в тело цикла больше не попадаем, а перепрыгиваем его полностью и переходим к команде return 0.
Думаю, для начала нам будет понятно, как работает цикл с оператором while (кстати с английского переводится «пока»).
Следующий тип цикла — это цикл с двумя операторами do while.
Такой цикл выглядит уже вот таким образом
Здесь всё происходит подобным образом, но, в отличие от первого варианта, здесь мы хотя бы раз в тело цикла все равно попадаем. А истинность (или положительный результат) условия проверяется только после того, как мы выполнили все инструкции в теле цикла. И, если условие не выполнится (окажется ложным), то мы уже повторно проходить тело цикла не будем, а «провалимся» вниз на следующую инструкцию, находящуюся в коде после цикла.
Казалось, бы, зачем нужен такой тип цикла. Хочется вспомнить даже поговорку «Начала делать блины, разогрела сковороду, а оказалось, что молока и муки нет». Поэтому данным типом цикла мы в нашей жизни пользуемся гораздо реже, чем первым вариантом, но иногда приходится. Например, возьмём ситуацию на проверку правильности ввода пароля. Проверка введённого пароля происходит в цикле и, если он совпал с настоящим, то мы выходим из цикла, а если нет (в этом случае правильность условия будет — несовпадение пароля), то повторяем ввод, то есть повторно входим в условие цикла. Если будет цикл первого типа, то мы ни разу не сможем проверить правильность ввода пароля. Это одна из ситуаций и таких много.
Давайте данный цикл попробуем на деле.
Зададим сначала те же условия, что и в предыдущем участке кода, но уже применим второй тип цикла, не забыв, конечно, вернуть состояние переменной
1 2 3 4 5 6 7 8 9 10 |
i--; } //------------------------ printf("=========================\r\n"); i = 10; do { printf("i = %d\r\n", i); i--; } while(i); |
Соберём код и посмотрим результат, который в нашем случае окажется таким же как и в случае применения цикла первого типа
Теперь давайте попробуем задать в условии обеих циклов такое условие, которое никогда не бывает истинным, например обычный ноль (0)
while(0)
Соберём код и посмотрим результат
Мы видим, что в первом случае (до двойных чёрточек) у нас вообще ничего не вывелось в консоль, потому что условие не выполнилось и мы вообще ни разу не попали в тело цикла, а во втором случае один раз тело цикла было выполнено. Теперь мы знаем разницу между этими двумя типами циклов.
Третий тип цикла — это цикл for. Данный цикл как правило используется тогда. когда заранее известно количество повторений. Но это классический вариант. А вообще, сфера использования данных циклов очень велика. Мы ещё встретимся в наших уроках с этим разнообразием различных вариантов циклов.
Цикл for выглядит следующим образом
Здесь немного посложнее. Но не сильно. Данный тип цикла работает следующим образом. Сначала, ещё не входя в тело цикла, сразу выполняется инструкция под названием «инициализация», затем проверяется истинность условия, и если оно истинно, то мы входим в тело цикла, выполняем все инструкции, затем выполняется инструкция, стоящая в третьей позиции под названием «модификация», снова проверяется условие, и, если оно истинно, то мы опять входим в тело цикла и выполняем там все инструкции, и так до тех пор, пока после выполнения инструкции под названием «модификация» наше условие не перестанет выполняться. Как только оно станет ложным или не будет иметь положительный результат, мы больше не входим в тело цикла, «перепрыгиваем» его и выполняем инструкции, находящиеся уже после тела цикла.
Думаю, что объяснил вполне популярно. Я старался описать не слишком заумно, чтобы было понятно всем.
Давайте теперь проверим работу данного типа цикла на практике и добавим в нашу функцию main() следующий код
1 2 3 4 5 6 7 8 |
} while(0); //------------------------ printf("=========================\r\n"); for(i=0; i<10; i++) { printf("i = %d\r\n", i); } //------------------------ |
Мы видим в условии знак '<'. Это операция сравнения «меньше». Хотя мы ещё не знакомились с такими операциями, но, думаю, что и так будет понятно. Наше условие — «значение переменной i должно быть меньше 10». Цикл будет работать следующим образом. Поначалу переменная i примет значение равное 0, затем проверив, то что это значение меньше 10, мы попадаем в тело цикла, выполняем его, выведя значение переменной в консоли и перейдя на следующую строку. Затем значение переменной i увеличивается на 1, то есть инкрементируется, проверяется то, что оно также меньше 10. Затем опять выполняется тело цикла. И так до тех пор, пока не перестанет выполняться условие «10».
Соберём код и запустим нашу программу
Мы видим, что счётчик i у нас досчитал до 9, то есть до тех пор, пока он был меньше 10 и затем считать перестал, после чего вход в тело цикла больше не осуществился и произошел прыжок (или переход) на инструкцию возврата значения из функции main().
Итак, на данном уроке мы познакомились с циклами трёх видов — while, do while и for, а затем подтвердили свои полученные знания на практике.
Всем спасибо за внимание!
Предыдущий урок Программирование на C Следующий урок
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Огромное Вам спасибо! С нетерпением ждём продолжений! Дай Бог здоровья!
Доброго времени суток! такой вопрос, почему цикл while и do while перестанет работать именно когда i = 0? я пробовал менять число после return на -1 и -2 но результат все равно не меняется
и как сделать чтобы цикл while закончился при i = -1, -2 и т.д.
Я разобрался, спешил с вопросом, извините на тупой вопрос 🙁
Спасибо огромное за Вашу работу! Очень нравится характер изложения, круто!!))