Найти тему
informatics_for_everyone

Циклы в Arduino

Оглавление

Цикл for

Цикл for при запуске принимает три настройки: инициализация, условие и изменение. Цикл for обычно содержит переменную, которая изменяется на протяжении работы цикла, а мы можем пользоваться её значением в своих целях.

  • Инициализация – здесь обычно присваивают начальное значение переменной цикла. Например: int i = 0;
  • Условие – здесь задаётся условие, при котором выполняется цикл. Как только условие нарушается, цикл завершает работу. Например: i < 100;
  • Изменение – здесь указывается изменение переменной цикла на каждой итерации. Например: i++

В теле цикла мы можем пользоваться значением переменной i, которая примет значения от 0 до 99 на протяжении работы цикла, после этого цикл завершается. Как это использовать?

-2

Именно при помощи цикла for очень часто работают с массивами. Можно сложить все элементы массива для поиска среднего арифметического:

-3

Что касается особенностей использования for в языке C++: любая его настройка является необязательной, то есть её можно не указывать для каких-то особенных алгоритмов. Например вы не хотите создавать переменную цикла, а использовать для этого другую имеющуюся переменную. Пожалуйста! Но не забывайте, что разделители настроек (точка с запятой) обязательно должны присутствовать на своих местах, даже если настроек нет!

-4

В цикле for можно сделать несколько счётчиков, несколько условий и несколько инкрементов, разделяя их при помощи оператора запятая, смотрите пример:

-5

Также в цикле может вообще не быть настроек, и такой цикл можно считать вечным:

-6

Выйти из цикла при помощи оператора break.

Цикл “for each”

В свежих версиях компилятора появилась поддержка аналога цикла foreach, который есть в некоторых других языках программирования. Реализация позволяет сократить код для прохода по любому массиву данных. Рассмотрим типичный пример вывода массива чисел в порт:

-7

Как это работает: мы завели цикл for с переменной-счётчиком i, который меняется от 0 до размера массива, который вы вычисляем через sizeof(). Внутри цикла мы используем счётчик как индекс массива, чтобы обратиться к каждой его ячейке как [i] . Но цикл for для работы с массивом можно записать более красиво:

-8

В нашем примере вывода это будет выглядеть так:

-9

Как это работает: мы создаём переменную val такого же типа как массив, а также указываем имя массива через двоеточие. На каждой итерации цикла переменная val будет принимать значение ячейки массива в порядке от 0 до размера массива с шагом 1. Таким образом мы решили ту же задачу, но написали меньше кода.

Важный момент: на каждой итерации цикла значение ячейки присваивается к переменной val, то есть фактически мы можем только прочитать значение (через буферную переменную). Для непосредственного доступа к элементам массива нужно создавать ссылку, то есть просто добавить оператор &

-10

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

В такой реализации цикла for у нас нет счётчика, что может быть неудобным для некоторых алгоритмов, но счётчик всегда можно добавить свой. Например забьём массив числами от 0 до 90 с шагом 10:

-11

Оператор break

Оператор break позволяет выйти из цикла. Использовать его можно как по условию, так и как-угодно-удобно. Например давайте досрочно выйдем из цикла при достижении какого-то значения:

-12

Или вот такой абстрактный пример, покинем “вечный” цикл при нажатии на кнопку:

-13

Выход из цикла является не единственным интересным инструментом, ещё есть оператор пропуска – continue.

Оператор continue

Оператор continue досрочно завершает текущую итерацию цикла и переходит к следующей. Например давайте заполним массив, как делали выше, но пропустим один элемент:

-14

Таким образом элемент под номером 10 не получит значения 25, итерация завершится до операции присваивания.

Цикл while

Цикл while, он же “цикл с предусловием”, выполняется до тех пор, пока верно указанное условие. Если условие изначально неверно, цикл будет пропущен, не сделает ни одной итерации. Объявляется очень просто: ключевое слово while, далее условие в скобках, и вот уже тело цикла:

-15

Это полный аналог цикла for с настройками (int i = 0; i < 10; i++). Единственное отличие в том, что на последней итерации i примет значение 10, так как на значении 9 цикл разрешит выполнение. Ещё интересный вариант, который можно встретить на просторах чужого кода. Работает на основе того факта, что любое число кроме нуля обрабатывается логикой как true:

-16

Цикл while тоже удобно использовать как вечный цикл, например, ожидая наступление какого-либо события (нажатие кнопки):

-17

Пока условие не произойдёт, код не пойдёт дальше, застрянет на этом цикле. Как вы уже поняли, оператор if тут не нужен, нужно указывать именно логическое значение, можно даже вот так:

-18

Цикл do while

do while – “делать пока”, работа этого цикла полностью аналогична циклу while за тем исключением, что здесь условие задаётся после цикла, т.е. цикл выполнится как минимум один раз, затем проверит условие, а не наоборот. Пример:

-19

Где применять? Да где угодно, по ходу написания собственных программ вы почувствуете, где удобнее использовать тот или иной цикл.