8. Функции

Функция – это последовательность операторов, выполняющих определенное задание. Каждая программа должна иметь функцию main() (с которой она и начинает своё выполнение), но в программах используют и много других функций.
В правильно составленной программе последовательность операторов, которые выполняют одно действие и встречаются в программе несколько раз, необходимо выделять в отдельную функцию и устанавливать вызов функции в необходимых местах.
Вызов функции – это выражение, которое указывает процессору прервать текущую функцию и выполнить другую. Процессор «оставляет закладку» в текущей точке выполнения, а затем вызывает (выполняет) определенную функцию. Когда выполнение вызываемой функции завершается, процессор возвращается к месту, где «осталась закладка» и возобновляет выполнение.
При завершении выполнения функции все внутренние переменные уничтожаются. Имена переменных внутри функции могут повторяться с переменными из вне функции, это не вызывает конфликта.
Функция, не возвращающая значения, определяется ключевым словом void.

Функция, возвращающая значения, определяется типов возвращаемого значения. Например: int, string, bool.

Внутри вызываемой функции используется оператор return, чтобы указать, какое конкретно значение будет возвращаться в основную функцию main.
В функции предусмотрен вызов с изменяемыми параметрами.Пример использования данной функции.

Пример: Роботу необходимо объезжать препятствие, при этом размеры препятствий и их форма могут меняться. Для этого необходимо в программе создать две функции с параметрами: «Езда прямо на расстояние» и «Поворот на угол «

Параметры функции носят внутренние имена переменных, которые используются только внутри функции.
Зачем используют функции?
Функции предназначены для упрощения кода. Они имеют ряд преимуществ, которые делают их чрезвычайно полезными в нетривиальных программах:
1. Структура. Как только программы увеличиваются в размере и в сложности, сохранять весь код внутри main() становится трудно. Функция — это как мини-программа, которую мы можем записать отдельно от головной программы, не задумываясь при этом об остальной части кода. Это позволяет разбивать сложные задачи на более мелкие и простые, что кардинально снижает общую сложность программы.
2. Повторное использование. После объявления функции, её можно вызывать много раз. Это позволяет избежать дублирования кода и сводит к минимуму вероятность возникновения ошибок при копировании/вставке кода. Функции также могут использоваться и в других программах, уменьшая объем кода, который нужно писать с нуля каждый раз.
3. Тестирование. Поскольку функции убирают лишний код, то тестировать кода остается меньше. И так как функция — это самостоятельная единица, то нам будет достаточно протестировать её один раз, чтобы убедиться в её работоспособности и можно будет без дальнейшего тестирования повторно использовать её много раз (до тех пор, пока мы не внесем изменения в эту функцию).
4. Модернизация. Когда нужно внести изменения в программу или расширить её функционал — функции отличный вариант. С их помощью можно внести изменения в одном месте и всё будет корректно работать при каждом вызове этой функции.
5. Абстракция. Для того, чтобы использовать функцию, нам нужно знать её имя, данные ввода, данные вывода и где эта функция находится. Нам не нужно знать, как она работает. Это очень полезно для написания понятного другим кода (например, стандартная библиотека RobotС и всё, что в ней находится, создана по этому принципу).
Основные рекомендации при написании функций
Код, который появляется более одного раза в программе, лучше переписать в виде функции.

Код, который используется для обработки чего-либо, лучше также записать в виде отдельной функции.

Функция должна выполнять одно (и только одно) задание.

Когда функция становится слишком большой, сложной или непонятной – её следует разбить на несколько подфункций.
При изучении языка программирования Вам предстоит написать много программ, которые будут включать следующие три подзадания:

  1. Получение данных о окружающей среды с использованием датчиков.
  2. Обработка данных.
  3. Вывод результата или действие на результат.
Для простых программ (меньше, чем 30 строк кода) частично или все из этих трех подзаданий можно записать в функции main(). Для более сложных программ (или просто для практики) каждое из этих трех подзаданий является хорошим вариантом для написания отдельной функции.
Пример кода без функций
task main()
{
motor[MotorA]=100;
motor[MotorB]=100;
wait1Msec(1000);
motor[MotorA]=50;
motor[MotorB]=50;
wait1Msec(10000);
motor[MotorA]=-100;
motor[MotorB]=100;
wait1Msec(500);
}
Пример кода с функций
void go(int v1, int v2, int t)
{
motor[MotorA]=v1;
motor[MotorB]=v2;
wait1Msec(t);
}
task main()

{
go(100, 100, 1000);
go(50, 50, 10000);
go(-100, 100, 500);
}
Задачи
Пример 1. Перепишите код программы. Убрав из программы дублирование кода и создав функцию и вызовы функции.

task main()
{
motor[MotorA]=100;
motor[MotorB]=100;
wait1Msec(1000); motor[MotorA]=0;
motor[MotorB]=0;
wait1Msec(1);

motor[MotorA]=-50;
motor[MotorB]=50;
wait1Msec(750);
motor[MotorA]=0;
motor[MotorB]=0;
wait1Msec(1);

}
Пример 2. Перепишите код программы. Убрав из программы дублирование кода и создав функцию и вызов функции.

task main(){
int n=0;
while(n<4){
motor[MotorA]=100;
motor[MotorB]=100;
wait1Msec(1000); motor[MotorA]=0;
motor[MotorB]=0;
wait1Msec(1);
motor[MotorA]=-100;
motor[MotorB]=100;
wait1Msec(750);
motor[MotorA]=0;
motor[MotorB]=0;
wait1Msec(1);
n=n+1;}
int n=0;
1/14