3.06. Функции.md
Ваши программы для Рудирона
уже умеют работать с данными, принимать решения, повторять действия и хранить наборы значений в массивах. Но когда код становится длинным, он превращается в «пасту» из команд, в которой сложно разобраться. А что, если одну и ту же задачу, например, мигание светодиодом, нужно выполнить в разных частях программы? Копировать код - плохая идея.
Для решения этих проблем в C++
существует один из самых важных инструментов — функции. Функции позволяют нам упаковать блок кода в именованную «коробку», которую можно вызывать снова и снова. Это ключ к созданию чистого, организованного и эффективного кода.
Что такое функция?
Функция - это именованный блок кода, который выполняет определённую задачу.
Аналогия. Представьте, что вы пишете кулинарную книгу. Вместо того чтобы в каждом рецепте подробно расписывать, как приготовить тесто для пиццы, вы выносите этот процесс в отдельный рецепт под названием «Приготовить тесто». Теперь в любом другом рецепте вы можете просто написать: «Возьмите одну порцию теста (см. рецепт «Приготовить тесто»)».
Функция в программировании - это и есть такой «рецепт». Вы один раз описываете, как выполнить какое-то действие (мигнуть светодиодом, рассчитать расстояние, проверить датчик), а затем можете «вызывать» это действие из любой части программы, просто указав имя функции.
Функции помогают:
- Разбить большую программу на маленькие, логически завершённые части.
- Избежать повторения кода (принцип DRY — Don’t Repeat Yourself).
- Упростить отладку и внесение изменений (исправив ошибку в одном месте - в теле функции, вы исправите её везде, где эта функция вызывается).
Создание (определение) функции
Прежде чем использовать функцию, её нужно создать, или, как говорят программисты, определить. Определение функции - это и есть написание того самого «рецепта».
Синтаксис определения функции:
возвращаемыйТип имяФункции(параметры) {
// Тело функции: команды, которые нужно выполнить
}
Давайте разберём эту структуру:
возвращаемыйТип
. Тип данных, которые функция «вернёт» в качестве результата своей работы (например,int
,float
). Если функция просто выполняет действие и ничего не возвращает, используется специальный типvoid
.имяФункции
. Имя, которое вы придумываете для своего «рецепта» (например,blinkLed
,calculateDistance
).параметры
. Данные, которые мы передаём в функцию для работы. Это как ингредиенты для рецепта. Они перечисляются в круглых скобках()
. Если функции не нужны входные данные, скобки остаются пустыми.{ }
(тело функции). Блок кода в фигурных скобках, который и будет выполняться при каждом вызове функции.
Пример (функция, которая ничего не возвращает):
// Определяем функцию, которая мигает светодиодом
// Она принимает два "ингредиента": номер пина и количество миганий
void blinkLed(int pin, int times) {
for (int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
}
void setup() {
pinMode(LED_BUILTIN_1, OUTPUT);
// Вызываем нашу функцию, чтобы мигнуть светодиодом L1 три раза
blinkLed(LED_BUILTIN_1, 3);
}
void loop() {
// loop() пуст, так как всё действие происходит в setup()
}
В этом примере мы создали удобную функцию blinkLed()
, которую теперь можем использовать для мигания любым светодиодом любое количество раз.
Вызов функции и возвращаемые значения
Чтобы наш «рецепт» был исполнен, его нужно вызвать. Вызов функции - это просто указание её имени в том месте кода, где нужно выполнить её действия. Если функция принимает параметры (ингредиенты), мы должны передать их в круглых скобках.
Некоторые функции не просто выполняют действия, но и возвращают результат. Например, функция может что-то вычислить и «отдать» нам итоговое число. Для этого используется команда return
.
Пример (функция, которая возвращает значение).
Представим, что нам часто нужно переводить температуру из градусов Фаренгейта в градусы Цельсия. Создадим для этого функцию.
// Эта функция принимает температуру в Фаренгейтах (тип float)
// и возвращает результат тоже в виде float
float fahrenheitToCelsius(float fahrenheit) {
// Выполняем расчёт
float celsius = (fahrenheit - 32.0) * 5.0 / 9.0;
// Возвращаем результат
return celsius;
}
void setup() {
Serial.begin(9600);
float tempF = 77.0; // Температура в комнате +77°F
// Вызываем функцию и сохраняем её результат в новую переменную
float tempC = fahrenheitToCelsius(tempF);
Serial.print(tempF);
Serial.print(" градусов по Фаренгейту - это ");
Serial.print(tempC);
Serial.println(" градусов по Цельсию."); // Выведет: ...это 25.00 градусов...
}
void loop() {}
В этом примере функция fahrenheitToCelsius()
выполняет вычисления и с помощью return
передаёт результат обратно в setup()
, где мы сохраняем его в переменную tempC
.
Зачем это нужно?
Функции - это ключ к созданию понятных, гибких и надёжных программ. Они позволяют:
- Структурировать код: Вместо одной длинной
loop()
у вас будет набор коротких и понятных функций, каждая из которых отвечает за свою задачу (readSensors()
,moveRobot()
,updateDisplay()
). - Переиспользовать код: Написав функцию один раз, вы можете вызывать её сколько угодно раз в разных частях проекта.
- Упростить отладку: Если что-то работает не так, гораздо проще найти и исправить ошибку в маленькой, изолированной функции, чем в огромном блоке кода.
В проектах на Рудироне
функции помогают управлять датчиками, моторами, дисплеями и организовывать логику работы вашего устройства, делая код профессиональным и легко читаемым.
Вы освоили функции, которые делают программы для Рудирона
компактными, понятными и удобными для повторного использования. Теперь переходите к практикуму по функциям, чтобы применить их в реальных задачах, или к следующему параграфу, если хотите посмотреть готовые решения.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home