Цикл — это команда в программировании, которая выполняет один и тот же участок программного кода несколько раз. В буквальном смысле, цикл нужен для многократного повторения некоторых действий внутри программы. Это может быть работа со строками, отправка информации через интернет, сохранение картинок, обработка набора файлов, и что угодно прочее.
Объединяющей особенностью для циклов является именно повторение программного кода, выполняющего однотипное действие. К таким однотипным действиям, например, часто относится работа с массивами (наборами данных). Использование циклов позволяет «упаковывать» одинаковый код в компактный вид, давая программисту возможность создавать простые и понятные программы.
Циклы имеют повсеместное применение практически во всех программах, и они есть практически во всех языках. Циклы используются для управления логикой, для работы с данными, и для взаимодействия с пользователями.
Потребность в циклах — пример
Представь себе текстовый файл, внутри которого есть 5 тысяч строк. Допустим, это имена и фамилии известных физиков с датами их рождения. У программиста стоит задача создать программу, которая должна найти физика по фамилии «Эйнштейн», и показать на экране дату его рождения. Логичный способ решения такой задачи — использовать оператор IF, и сравнить все строки в файле со словом «Эйнштейн», одну за другой. Вот что-то вроде этого:
Уроки Python для начинающих: Циклы в программировании, как работает цикл while #10
IF (строка1 СОДЕРЖИТ «Эйнштейн»)
IF (строка2 СОДЕРЖИТ «Эйнштейн»)
IF (строка5000 СОДЕРЖИТ «Эйнштейн»)
При таком подходе, с точки зрения линейного программирования, у нас получится 5 тысяч однотипных конструкций IF. Это не очень-то удобно, правда? Вот именно в такой ситуации к нам на помощь и придут циклы.
Простейший цикл позволит нам радикально сократить программный код, и сделать структуру программы более понятной. И это явно улучшит как нашу жизнь, так и жизнь других программистов из нашей команды.
Применяем простой цикл
Так вот. В примере с файлом, вместо 5 тысяч одинаковых конструкций IF, мы можем применить один простой цикл FOR. В этом случае, программный код скукожится буквально до нескольких строк, вот так:
FOR (int i = 0; i < 5000; i++)
IF (строка[i] СОДЕРЖИТ «Эйнштейн»)
Иначе говоря, мы объявили цикл FOR, внутри которого попросили программу повторить некоторое действие 5 тысяч раз. Для нумерации конкретного шага, мы объявили числовую переменную i. В этой переменной, на каждом шаге цикла, будет доступен номер текущего шага (1,2, 5, 4000, и так далее). Внутри тела цикла, мы обратились к конкретной строке по её номеру, используя квадратные скобки [i]. То есть, мы обратились к строке по её номеру для каждого шага который будет сделан при работе цикла. Если упрощать ещё дальше, то на шаге 4600 программа дешифрует и буквально выполнит конкретно вот эту команду:
IF(Строка[4600] СОДЕРЖИТ «Эйнштейн»)
Для упрощения понимания циклов, давай обратим внимание вот на что. Программный код выполняется сверху вниз. Всегда. Точно так же, как мы пишем текст в файле, и новые строчки добавляются в нижнюю сторону. Вот именно так и выполняется программный код: от строки 1, к строке 2, потом 3, и так далее.
Соответственно, когда мы «зациклили» некоторый код, то он будет выполняться сверху вниз, но уже не один раз, а несколько (в соответствии с количеством шагов в цикле). Дойдя до последней строчки программа проверит, есть ли новые шаги в цикле. Если они есть — то выполнение перепрыгнет к строчке 1, и продолжится.
Какие типы циклов существуют?
Существует несколько типов циклов. В классическом высокоуровневом стеке ООП это циклы For, While, Do-While, Foreach .
Самый простой и популярный цикл — FOR. Он предназначен для последовательного выполнения программного кода, шаг за шагом. Именно его мы использовали в примере выше. Технически, внутри такого цикла объявляется переменная, условие завершения цикла (например переменная должна быть меньше 100), и выражение для увеличения переменной. Все блоки заключаются в круглые скобки, и разделяются точкой с запятой. Вот так:
FOR (ПЕРЕМЕННАЯ; УСЛОВИЕ; УВЕЛИЧЕНИЕ-ПЕРЕМЕННОЙ)
Такой ПовторяющийсяКод в фигурных скобках будет выполняться шаг за шагом, пока выполняется УСЛОВИЕ.
И ещё. Во многих языках, ПЕРЕМЕННАЯ и УВЕЛИЧЕНИЕ-ПЕРЕМЕННОЙ не являются обязательными. Для продолжения работы цикла FOR достаточно, чтобы условие продолжало выполняться. Например, вот такой цикл будет работать бесконечно, пока выполняется программа: FOR ( ; 2х2 == 4 ; )
Философия использования циклов
И конечно же немного философии, куда без неё? Любая программа по своей сути предназначена для решения конкретной задачи. На мой взгляд, для правильного понимания программирования, стоит рассматривать именно такую интерпретацию.
Будильники, шагомеры, социальные сети, редакторы фотографий, интерактивные карты — всё это программы для решения задач, больших или маленьких, но вполне конкретных. Как известно, любая задача содержит входные данные, набор условий, и выходные данные. Условный будильник принимает на входе дату и время срабатывания, а на выходе активирует динамик телефона с мелодией звонка. Шагомер получает на входе сигнал от акселерометра (специальный датчик в телефоне), а на выходе рисует красивые графики на экране. И так далее.
Независимо от предметной области и задачи, программа обычно работает с большим набором данных, и практически всегда сталкивается с повторяющимся программным кодом. Тот же самый шагомер обычно рисует нам 7 столбиков с количеством шагов, соответствующих дням недели. Тот же будильник отображает на экране 12 часовых меток, одну за другой. И там и там, для последовательного рисования, используются циклы. В одном случае — условный цикл рисования столбиков от 1 до 7, в другом — цикл для рисования часовых меток от 1 до 12.
Таким образом, используя обычный мобильный телефон или смотря любимый сериал, мы сталкиваемся с циклами. Да, это та самая чудо-конструкция, которая окружает наш мир повсеместно, решая задачи от самых простых, до самых сложных. Каждый день.
Источник: dzen.ru
Операторы цикла
Цикл – это многократно повторяемая последовательность действий (операторов).
Применение циклов в программе позволяет эффективно использовать ПК, приводит к уменьшению объема программы к уменьшению времени на ее составление и отладку. Программы с циклом называются циклическими.
Особенность операторов цикла: повторяющиеся записи записываются один раз.
В TP существует 3 вида операторов цикла:
1. Цикл с параметром (счетчик)
Используется тогда, когда точно известно сколько раз должна повторяться циклическая часть.
Формат записи: for i:=a to b do тело цикла>;
где i – параметр цикла, a – начальное значение, b – конечное значение, — последовательность повторяющихся действий.
Направление изменения значения параметра цикла определяется с помощью зарезервированных слов to – возрастание, downto – убывание.
Принцип действия: Переменная i последовательно принимает значения от a до b с шагом 1. Для каждого из значений i выполняется тело цикла, которое может быть составным оператором.
Цикл с параметром может быть реализован 2 способами:
I способ.
II способ.
2. Цикл с предварительным условием (с предусловием, цикл «Пока»)
Цикл с предусловием используется тогда, когда заранее неизвестно число повторений цикла. В TP используется оператор while.
Формат записи: while do
пока выполнить
While, do – служебные слова
Принцип действия: предварительно проверяется значение логического выражения (условия). Пока оно истинно, выполняется тело цикла. Как только оно становится ложным, происходит выход из цикла. Если с самого начала значение логического выражения ложно, то тело цикла не выполняется ни разу.
Если состоит из нескольких операторов, то их следует заключить в операторные скобки.
Задача. Вычислить 10! с помощью цикла с предварительным условием.
Источник: studfile.net
Циклы
Цикл – это блок кода, который выполняется сверху вниз и повторяется с начала, когда достигает конца. Продолжается это дело до тех пор, пока выполняется какое то условие. Есть два основных цикла, с которыми мы будем работать, это for и while .
Цикл for
Цикл for , в простонародии счётчик. При запуске принимает три настройки: инициализация, условие и изменение. Цикл for обычно содержит переменную, которая изменяется на протяжении работы цикла, а мы можем пользоваться её значением в своих целях.
- Инициализация – здесь обычно присваивают начальное значение переменной цикла. Например: int i = 0;
- Условие – здесь задаётся условие, при котором выполняется цикл. Как только условие нарушается, цикл завершает работу. Например: i < 100;
- Изменение – здесь указывается изменение переменной цикла на каждой итерации. Например: i++;
for (int i = 0; i < 100; i++) < // тело цикла >
В теле цикла мы можем пользоваться значением переменной i , которая примет значения от 0 до 99 на протяжении работы цикла, после этого цикл завершается. Как это использовать? Вспомним предыдущий урок про массивы и рассмотрим пример:
// создадим массив на 100 ячеек byte myArray[100]; for (int i = 0; i < 100; i++) < // заполним все ячейки значением 25 myArray[i] = 25; >
Именно при помощи цикла for очень часто работают с массивами. Можно сложить все элементы массива для поиска среднего арифметического:
// создадим массив byte myVals[] = ; // переменная для хранения суммы int sum = 0; for (int i = 0; i < 6; i++) < // суммируем весь массив в sum sum += myVals[i]; >// разделим sum на количество элементов // и получим среднее арифметическое! sum /= 6; // получилось 94!
Что касается особенностей использования for в языке C++: любая его настройка является необязательной, то есть её можно не указывать для каких-то особенных алгоритмов. Например вы не хотите создавать переменную цикла, а использовать для этого другую имеющуюся переменную. Пожалуйста! Но не забывайте, что разделители настроек (точка с запятой) обязательно должны присутствовать на своих местах, даже если настроек нет!
int index = 0; // свой счётчик for (; index < 60; index += 10) < // переменная index принимает значения // 0, 10, 20, 30, 40, 50 >
В цикле for можно сделать несколько счётчиков, несколько условий и несколько инкрементов, разделяя их при помощи оператора запятая , смотрите пример:
// объявить i и j // прибавлять i+1 и j+2 for (byte i = 0, j = 0; i < 10; i++, j += 2) < // тут i меняется от 0 до 9 // и j меняется от 0 до 18 >
Также в цикле может вообще не быть настроек, и такой цикл можно считать вечным:
Использование замкнутых циклов не очень приветствуется, но иногда является очень удобным способом поймать какое-то значение, или дать программе “зависнуть” при наступлении ошибки. Выйти из цикла при помощи оператора break , о нём поговорим чуть ниже.
Цикл “for each”
В свежих версиях компилятора появилась поддержка аналога цикла foreach, который есть в некоторых других языках программирования. Реализация позволяет сократить код для прохода по любому массиву данных. Рассмотрим типичный пример вывода массива чисел в порт, как в уроке про массивы:
int vals[] = ; for (int i = 0; i
Как это работает: мы завели цикл for с переменной-счётчиком i , который меняется от 0 до размера массива, который вы вычисляем через sizeof() . Внутри цикла мы используем счётчик как индекс массива, чтобы обратиться к каждой его ячейке как [i] . Но цикл for для работы с массивом можно записать более красиво:
for (тип_данных_массива переменная : массив) <>
В нашем примере вывода это будет выглядеть так:
int vals[] = ; for (int val : vals)
Как это работает: мы создаём переменную val такого же типа как массив, а также указываем имя массива через двоеточие. На каждой итерации цикла переменная val будет принимать значение ячейки массива в порядке от 0 до размера массива с шагом 1. Таким образом мы решили ту же задачу, но написали меньше кода.
Важный момент: на каждой итерации цикла значение ячейки присваивается к переменной val , то есть фактически мы можем только прочитать значение (через буферную переменную). Для непосредственного доступа к элементам массива нужно создавать ссылку, то есть просто добавить оператор for (int int count = 0; for (int i < 100; i++) < // покинуть цикл при достижении 50 if (i == 50) break; >
Или вот такой абстрактный пример, покинем “вечный” цикл при нажатии на кнопку:
Выход из цикла является не единственным интересным инструментом, ещё есть оператор пропуска – continue .
Оператор continue
Оператор continue (англ. “продолжить”) досрочно завершает текущую итерацию цикла и переходит к следующей. Например давайте заполним массив, как делали выше, но пропустим один элемент:
// создадим массив на 100 ячеек byte myArray[100]; for (int i = 0; i < 100; i++) < // если i равно 10, пропускаем if (i == 10) continue; // заполним все ячейки значением 25 myArray[i] = 25; >
Таким образом элемент под номером 10 не получит значения 25, итерация завершится до операции присваивания.
Цикл while
Цикл while (англ. “пока”), он же “цикл с предусловием”, выполняется до тех пор, пока верно указанное условие. Если условие изначально неверно, цикл будет пропущен, не сделает ни одной итерации. Объявляется очень просто: ключевое слово while , далее условие в скобках, и вот уже тело цикла:
int i = 0; while (i
byte a = 5; while (a—) < // выполнится 5 раз >
Цикл while тоже удобно использовать как вечный цикл, например, ожидая наступление какого-либо события (нажатие кнопки):
// выполняется, пока не нажата кнопка while (кнопка не нажата);
Пока условие не произойдёт, код не пойдёт дальше, застрянет на этом цикле. Как вы уже поняли, оператор if тут не нужен, нужно указывать именно логическое значение, можно даже вот так:
while (true);
Всё, вертимся здесь бесконечно! Помимо цикла с предусловием есть ещё цикл с постусловием, так называемый do while
Цикл do while
do while – “делать пока”, работа этого цикла полностью аналогична циклу while за тем исключением, что здесь условие задаётся после цикла, т.е. цикл выполнится как минимум один раз, затем проверит условие, а не наоборот. Пример:
do < // тело цикла >while (условие);
Где применять? Да где угодно, по ходу написания собственных программ вы почувствуете, где удобнее использовать тот или иной цикл.
Видео
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с Aliexpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
Источник: alexgyver.ru