Тип_результата имя_функции ( список параметров )
Определение и вызов функции.
Каждая функция в программе должна быть определена (только один раз). Определение функции – это код функции, включающий ее заголовок и полный текст функции. Оно имеет следующий вид:
{
код функции
return выражение;
}
Параметры - это переменные, доступные внутри функции, значения которым присваиваются при вызове функции. Результат - это значение, передаваемое из функции обратно в вызывающую программу. Таким образом, параметры являются "входными данными" функции, а результат - "выходными данными".
В языке Си каждая функция – это отдельный блок программы, вход в который возможен только через вызов (использование) данной функции. Такие вызовы могут находиться в различных местах программы и должны иметь следующий формат:
имя_функции (список аргументов);
где в качестве аргументов можно использовать константы, переменные, выражения. Аргументы при вызове функции будут подставляться на место параметров функции.
Пример:
Функция, определяющей наименьшее значение из двух целочисленных переменных:
int Min (int x, int y)
{
return x<y ? x : y;
}
Вызов такой функции может иметь вид:
int a,b,c;
...
a=Min(b,c);
Рассмотрим подробно составные части определения пользовательской функции.
Список параметров состоит из перечня типов и идентификаторов параметров, разделенных запятыми. Список параметров определяет объекты, которые требуется передать в функцию при ее вызове.
Список аргументов. в вызове также перечисляется в круглых скобках через запятую. При вызове функции параметрам будут присваиваться значения соответствующих аргументов, в порядке следования (первому параметру - значение первого аргумента, второму - второго и т.д.) Аргументы в списке вызова должны совпадать со списком параметров вызываемой функции по количеству и порядку следования, а типы аргументов при передаче в функцию будут преобразованы, если это возможно, к типу соответствующих им параметров.
Заметим, что в списке параметров перед каждым параметром нужно непосредственно указывать его тип - нельзя, например, писать (double x, y), а нужно писать (double x, double y).
Функция может не иметь параметров, но круглые скобки необходимы в любом случае (и в определении, и в вызове). Если у функции отсутствует список параметров, то при декларации такой функции можно (для наглядности) в круглых скобках указать тип void("пустой"). Например, main(void){ ... }.
Тип результата определяет тип выражения, значение которого возвращается в точку вызова функции при помощи оператора возврата return выражение; Выражение, указанное в операторе return, преобразуется к типу_результата, указанному в заголовке функции, и передается в точку вызова. Чтобы в точке вызова использовать полученное значение результата, этот вызов должен находиться в составе какого-либо оператора (например, оператора присваивания, либо любого другого, аналогично использованию стандартных функций языка Си).
Тип возвращаемого функцией значения может быть любым базовым типом, а также указателем на массив или функцию (см. тему "Указатели"). Если функция не должна возвращать значение, указывается тип void("пустой"). В данном случае оператор return можно не ставить. Из функции, которая не описана как void, необходимо возвращать значение, используя оператор return. Если тип функции не указан, то по умолчанию устанавливается тип int.
В функции может быть несколько операторов return (например, в разных ветвях оператора if): выполнение любого из них завершает работу функции и передает управление обратно в точку ее вызова. После выполнения последнего оператора кода функции также происходит возврат в точку вызова.
При вызове функции параметрам присваиваются значения аргументов. Обратного же присваивания при возврате из функции не происходит, поэтому изменение обычных параметров внутри функции не окажет влияние на значения аргументов. Передавать результаты работы из функции вовне надо либо с помощью оператора return, либо другими способами, описанными ниже (глобальные переменные; параметры-указатели).
В программе может быть много вызовов одной и той же функции. Каждый из них может находиться в любой другой функции. Он может находиться и в самой вызываемой функции: в этом случае функция будет вызывать сама себя. Такой прием программирования называется рекурсией; при этом, чтобы избежать зацикливания, в функции необходимо предусмотреть условие прекращения рекурсивных вызовов.
Заметим, что вызов функции называют также обращением к функции. Иногда параметры функции называют формальными параметрами, а аргументы - фактическими параметрами.
Задача 1. Вычислить выражение
#include<iostream.h>
#include<conio.h>
double fact(int m) { // Хотя факториал - целое число,
double f=1; int i; // используем тип double, т.к.
for (i=1; i<=m; i++) f*=i; // результат может выйти за пределы
return f; // диапазона типа int
}
void main(){
int N,K; double D;
cout<<"Vvedite N,K :";
cin>>N>>K;
D=fact(N)+fact(K)+fact(N+K);
cout<<D<<endl;
getch();
}
Задача 2. Вычислить синус, косинус, тангенс и котангенс введенного числа. Каждое вычисленное значение выводить в отдельной строке, а перед ним - строку из звездочек.
#include<iostream.h>
#include<conio.h>
#include<math.h>
void st(void){ cout<<" *********************************** "; }
void main(){
double x;
cout<<"Vvedite x :";
cin>>x;
st();
cout<<"sin="<<sin(x);
st();
cout<<"cos="<<cos(x);
st();
cout<<"tg="<<tan(x);
st();
cout<<"ctg="<<1/tan(x)<<endl;
getch();
}
Результат работы программы (подчеркнуто число, введенное человеком):
Vvedite x :
3
***********************************
sin=0.14112
***********************************
cos=-0.989992
***********************************
tg=-0.142547
***********************************
ctg=-7.015253