Программирование на Arduino. Урок 2. Основные алгоритмы.

Урок 2. Циклы и условные операторы

На прошлом занятии мы с вами познакомились с платформой Arduino, разобрались с ее строением и назначением пинов. А сегодня давайте «оживим» ее и начнем работу со знакомства с видами алгоритмов.

Алгоритмы это основа любой программы, ведь нам нужно «объяснить» контроллеру, чего мы от него ожидаем, именно для этого и пишется программа. Программа, написанная посредством определенного языка программирования - это перевод в письменный код ожиданий оператора. Т.к. любая программа выполняется последовательно строка за строкой, за исключением прерываний (но о них чуть позже), то мы должны понимать, что происходит на каждом шаге выполнения программы, чтобы получить желаемый результат.

В «природе» существует два основных вида алгоритмов: условные и циклические.
Начнем с простых и интуитивно понятных – Условные алгоритмы.  Как можно догадаться из их названия, мы имеем дело с условиями. На алгоритмическом языке они выглядят так: «…Если (условие) верно, то…» или «…Если (условие) верно, то…, а если не верно, то…».

Рис. 1 Неполное ветвление            
 

              Рис. 2 Полное ветвление

Здесь основное различие состоит в том, что при неполном ветвлении мы выполняем действие, которое предписывает нам условие, если оно принимает значение «true», если же оно «false», т.е. ложно, пропускаем фрагмент программы с условием и идем дальше.
На языке программирования это ветвление выглядит так:
void setup() //запишите здесь те команды, которые будут выполняться один раз
{
 int result = 0; //объявляем переменную, в которой у нас будет храниться результат вычислений
 int a = 5; //Объявляем переменную с именем "а" и записываем в нее значение "5"
 int b = 7; //Объявляем переменную с именем "b" и записываем в нее значение "7"
 if (a > b) { //"Если значение переменной "а" больше, чем значение переменной "b", то выполнится оператор (result=a-b)
 result = a - b;
 } //если условие не верно (как в нашем случае), то программа закончит свою работу
void loop() { //Запишите здесь те команды, которые будут повторяться
// в бесконечном цикле нет команд
}
Программа «Неполное ветвление»

Если же имеем дело с полным ветвлением, то в обоих случаях и когда условие принимает значение «true», и когда условие принимает значение «false», у нас заданы определенные действия, которые мы будем выполнять.
На языке программирования это ветвление выглядит так:
void setup() //запишите здесь те команды, которые будут выполняться один раз
{
 int result = 0; //объявляем переменную, в которой у нас будет храниться результат вычислений
 int a = 5; //Объявляем переменную с именем "а" и записываем в нее значение "5"
 int b = 7; //Объявляем переменную с именем "b" и записываем в нее значение "7"
 if (a > b) { //"Если значение переменной "а" больше, чем значение переменной "b", то выполнится оператор (result=a-b)
 result = a - b;
 } else {
 result = b - a; //если условие не верно (как в нашем случае), то выполнится оператор, обозначенный как else (иначе)

void loop() { //Запишите здесь те команды, которые будут повторяться
// в бесконечном цикле нет команд
}
Программа «Полное ветвление»

А теперь приступим к циклическим алгоритмам. Их у нас существует три разновидности: цикл с «предусловием», цикл с «постусловием» и цикл с «параметром».


Рис. 7 Цикл с «предусловием»
Этот цикл выполняется до тех пор, пока условие остается «true», если же условие становится «false», цикл заканчивается и переходит к дальнейшему выполнению программы. При этом, если условие заведомо было ложным, этот цикл не выполнится ни разу (это удобно при проверке, например, знаменателя дроби, ведь если он 0, то проводить деление мы не будем).


void setup() //запишите здесь те команды, которые будут выполняться один раз
{
}
void loop() { //Запишите здесь те команды, которые будут повторяться
 int a = 20; //Объявляем переменную с именем "а" и записываем в нее значение "20"
 int b = 1; //Объявляем переменную с именем "b" и записываем в нее значение "1"
 while (a > b) { //"Если значение переменной "а" больше, чем значение переменной "b", то выполнится оператор (a=a-5), в переменную "а" записывается новое значение и цикл возвращается к проверке условия
 a =a - 5;
 } 
 }



Рис. 8 Цикл с «постусловием»


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



void setup() //запишите здесь те команды, которые будут выполняться один раз
{
}
void loop() { //Запишите здесь те команды, которые будут повторяться
int a = 20; //Объявляем переменную с именем "а" и записываем в нее значение "20"
int b = 1; //Объявляем переменную с именем "b" и записываем в нее значение "1"
do {
a = a - 5; //в переменную "а" записывается новое значение и цикл возвращается к проверке условия
}
while (a > b) { //"Если значение переменной "а" больше, чем значение переменной "b", то цикл завершит свою работу



Рис. 9 Цикл с «параметром»
А теперь мой любимый цикл, а любимый потому, что мы заранее знаем, сколько раз он выполнится. Да, вы правильно поняли, речь идет о цикле с «параметром».
Такой цикл мы используем, когда нам необходимо повторить определенное действие в программе несколько раз. С помощью него мы можем избежать повторения одинаковых записей в коде программы.



void setup () {
 pinMode (3, OUTPUT); //будем использовать 3 пин на плате, поэтому конфигурируем его "на выход"
 }
void loop () {
 for (int i = 1; i < 10; i++) { //Объявляем цикл с параметром
 //int i - переменная - счетчик, которой мы присваием начальное значение
 //i < 10 - условие выполнения цикла, цикл будет выполнятся пока значение переменной - счетчика не будет противоречит условию выполнения цикла
 //i++ - шаг переменной - счетчика (тоже самое, что i = i + 1)
 digitalWrite (3, HIGH); //передаем на 3 пин логическую 1 (5 V)
 delay (1000);
 digitalWrite (3, LOW); //передаем нв 3 пин логический 0 (0 V)
 }
 }

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

Все вопросы, которые мы не осветили в этой статье, оставляйте в комментариях, будем рады на них ответить.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.