Каждая функция в языке ***C*** должна быть определена, то есть должны быть указаны:
- тип возвращаемого значения;
- имя функции;
- информация о формальных аргументах;
- тело функции.

Определение функции имеет следующий синтаксис:
``` c
ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
   ТелоФункции;
  ...
  return(ВозвращаемоеЗначение);
}
```

Например, функция сложения двух вещественных чисел:
``` c
float function(float x, float z)
{
  float y;
  y=x+z;
  return(y);
}
```
В этом примере возвращаемое значение имеет тип ***float***. В качестве возвращаемого значения в вызывающую функцию передается значение переменной ***y***. Формальными аргументами являются значения переменных ***x*** и ***z***.

Если функция не возвращает значения, то тип возвращаемого значения для нее указывается как ***void***. При этом операция return может быть опущена. Если функция не принимает аргументов, в круглых скобках также указывается ***void***.

Так же различают ***системные*** (в составе систем программирования) и ***собственные*** функции.

***Системные функции*** хранятся в стандартных библиотеках, и пользователю не нужно вдаваться в подробности их реализации. Достаточно знать лишь их сигнатуру. Примером системных функций, используемых ранее, являются функции ***printf()*** и ***scanf()***.

***Собственные функции*** — это функции, написанные пользователем для решения конкретной подзадачи (например, функция из примера выше).


Вызов функции имеет следующий вид:
``` c
Переменная = ИмяФункции(СписокФактическихАргументов);
```
***Фактический аргумент*** — это величина, которая присваивается ***формальному аргументу*** при вызове функции. Таким образом, ***формальный аргумент*** — это переменная в вызываемой функции, а ***фактический аргумент*** — это конкретное значение, присвоенное этой переменной вызывающей функцией. Фактический аргумент может быть константой, переменной или выражением. Если фактический аргумент представлен в виде выражения, то его значение сначала вычисляется, а затем передается в вызываемую функцию. Если в функцию требуется передать несколько значений, то они записываются через запятую. При этом формальные параметры заменяются значениями фактических параметров в порядке их следования в сигнатуре функции.

Пример вызова функции:
``` c
float a = 1.2f;
float b = 1.8f;
float sum = function(a, b); // sum = 1.2 + 1.8 = 3.0
```

Так же функция может быть рекурсивной - вызывает сама себе. Пример такой функции - функция вычисления факториала:
``` c
int fact(int num)  // вычисление факториала числа num
{
  if (num <= 1)   return 1;  // если число не больше 1, возвращаем 1
  else return num*fact(num - 1);  // рекурсивный вызов для числа на 1 меньше
}
```
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence