В
библиотеке стандартных подпрограмм языка Си
имеется много полезных библиотечных функций. Для
нас особый интерес представляютя функции,
которые мы определяем сами. Не следует думать,
что выделение функции как самостоятельной
единицы целесообразно только тогда, когда к ней
приходится многократно обращаться. Часто
встречаются функции всего в несколько строк,
вызываемые единожды, но оформление как функции
только для более ясного написания.
Определение функции состоит из двух частей: заголовка
и тела. Заголовок определяет имя функции, ее
тип и формальные параметры, тело определяет
действия над данными, выполняемые функцией.
Возращающее функцией значение передается в
вызывающюю программу опрератором return (выражение).
Значение "выражения" и есть результат
функции (возращаемого значения). Если в нашей
программе функция физически следует за
вызывающей ее функцией main, то надо в последней
объявить функцию внешней с помощью
описателя extern: extern int fun(); или еще проще
int fun();. В противном случае при компиляции
будет выдана ошибка. Всякая функция имеет вид:
[тип] имя([список формальных
параметров])
описания формальных параметров;
{
описания;
операторы;
}
|
Здесь квадратные скобки указываютя, что
заключенная в них конструкция может
отсутствовать. По умолчанию тип функции целый.
Описание формальных параметров расположено
между списком параметров и левой скобкой. Каждое
описание заканчивается точкой с запятой.
Формальные параметры функции полностью
локализированы в ней и недоступны для других
функций. Аргументы функции передаются по
значению, а не их адреса.
Рассмотрим
пример программы возведения числа в степень. Для
этого составим функцию power(t,n); В нашей
реализации функция power предшествует головной
программе, поэтому она предварительно не
объявлена. Описание формальных параметров
функции происходит в заголовке (int t,n;) Оператор
int p=1; в теле функции определяет
переменную p целого типа и присваивает
ей начальное значение равное 1. Выражение int
p=1; в точности эквиалентно
последовательности операторов int p; p=1; Обращение
к функции задает один из аргументов стнадартной
функции printf в программе main. Выражение
power(t,n) предписывает вызов функции. Когда
программа main достигает этой точки, то все
управление передается функции power. Операторы ,
содержащиеся в теле функции power фактически
оперируютя данными. Когда достигается оператор return
, осуществляется переход в ту точку программы main,
из которой мы пришли в power. Значение, вычисляемое
функцией power, передается в головную программу с
помощью оператора return(p). В скобках в
общем случае может быть любое значение.
Прмер 2.0
/*Функция y=t**n*/
int power(t,n);
int t,n;
{
int p=1;
while(n!=0)
{
if(n%2 !=0) p=p*t;
n=n/2;
t=t*t;
}
return(p);
}
/*Возведение в степень- головная
программа*/
#include <stdio.h>
main()
{
int a,n;
printf("Введи a,n \n");
scanf("%d %d",&a,&n);
printf("%d в степени %d = %d",a,n
power(a,n));
} |
Рекурсия.
В языке Си
можно использовать рекурсивно, т.е. функция может
вызывать сама себя. Простейший пример 2.1, где
функция main вызывает сама себя остановить которую
можно только с помощью CTRL+C - ^С. При
рекурсивном обращении к функции - создается
новый экземпляр данных.
Пример 2.1
#include <stdio.h>
main()
{
printf("проверка рекурсии \n");
main();
} |
Следущий
пример 2.2 использует рекурсию для вычисления k!
. При первом вызове fact(i) , если не равно 1,
функция порождает выражение i*fact(i-1); в
свою очередь, вызов fact(i-1) производит (i-1)*fact(i-2),
что вместе с ранее полученным результатом дает i*(i-1)*fact(i-2).
Рекурсия закончистся, как только следующий вызов
функции получит аргумент, равный еденице.
Нетрудно сообразить, что в конечном счете мы
получим требуемое произведение.
Прмер 2.2
#include <stdio.h>
int fact(k);
int k;
{
if(k==1)
return(1);
else
return(k*fact(k-1));
}
main()
{
int i=1;
printf("проверка рекурсии\n");
while(i<8)
{
printf("%d!= %d\n",i, fact(i));
i=i+1;
}
}
|
< Дальше >
|