Процедурное программирование на языке С. Часть 1. Основные понятия языка С: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 7

В примере 2.2 приведено  определение (описание) функции, вычисляющей факториал целого числа.

Пример 2.2.

intfact(intk)                 заголовок функции

{inti, j=1;                                                                                              определение

for (i=1; i<=k; i++)           тело

         j*= i;                            функции

returnj;                                                                                                  функции

}

В данном примере идентификатор k используется в качестве имени единственного формального параметра функции, jи iимена локальных переменных функции, jимя переменной, которое используется в качестве возвращаемого значения.

Описания используемых в программе функций могут следовать в любом месте программы: за описанием функции main(), перед ним, находится в другом файле. Однако для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых в функцию значений типам формальных параметров, необходимо выполнять правило 2.5.

Правило 2.5. Перед вызовом любой функции в программе она (функция) должна быть либо объявлена, либо определена.

Объявление (прототип)  функции имеет такой же вид, что и определение функции, с той лишь разницей, что отсутствуют тело функции и (возможно) имена формальных параметров.

Объявление (прототип) функции имеет следующий формат:

[<спецификация класса памяти>][<спецификация типа возвращаемого значения>] <имя функции>([<список формальных параметров>]) ;

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

Для функции с именем fact , вычисляющей факториал, прототип может иметь вид:

int fact(int); или  fact(int); Возможен и вариант   int fact(int k);

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

Вызов функции, в соответствии с синтаксисом языка С, может иметь одну из двух форм:

1. <имя функции> ([<список фактических параметров>])

2. <адресное выражение> ([<список фактических параметров>])

Использование второй формы требует знакомства с темой «указатели», поэтому пока остановимся на первой форме – наиболее естественной и понятной.

Место появления в программе выражения <имя функции> ([<список фактических параметров>]) – и есть точка вызова функции.

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

Таким образом, список фактических параметров – это список выражений, значения которых заменяют формальные параметры функции при ее вызове.

Правило  2.6. Соответствие между формальными и фактическими параметрами устанавливается по их расположению в списках.

В примере 2.3 приведена программа вычисления биномиального коэффициента для целых положительных чисел nи m  с использованием функции вычисления факториала, определенной в примере 2.2. Для коэффициента используется выражение  .

Пример 2.3.

# include <stdio.h>

 int fact(int );                                                                          прототип необходим

void main()

{   int m,n;

     printf("\n Enter n = "); scanf("%d",&n);

     printf("\n Enter m < n, m = ");  scanf("%d",&m);