Float sqr(float, float g);
Функции
1.1 Определение, описание, вызов функции
Каждая программа представляет собой либо одну главную функцию с именем main(), либо функцию main()и любое количество других дополнительных функций, предназначенных для выполнения определенных действий (вычислений, обмена данными и т.д.).
Функция main() обеспечивает точку входа в откомпилированную программу. Остальные функции, используемые в программе, явно или косвенно вызываются из главной функции. Функции, входящие в программу, могут бытьопределены, как в одном с главной функцией файле, так и в отдельных файлах.
Всем именам функций по умолчанию присваивается класс памяти extern, т.е. функции глобальны, имеют внешний вид компоновки, статическую продолжительность существования (до конца выполнения программы) и доступны при определенных условиях во всех модулях программы.
Любая функция, кроме главной функции main(), должна быть определена или описана до её использования (вызова) в конкретном модуле. Определение функции имеет следующий синтаксис
Тип_функции имя_функции(список_формальных_параметров)
{ тело функции }
Первая строка функцииназывается заголовком функции:
Тип_функции имя_функции(список_формальных параметров)
Тип_функции– это тип возвращаемого функцией значения, т.е. базовый (например, int, float, т.д.) или производный тип вычисленного в функции значения. Если функция ничего не возвращает, то тип функции обозначается void.
Имя_функции– это любой уникальный допустимый идентификатор, например, myfunc, sum, mult, F1.
Список_формальных_параметров (или сигнатура функции) – это пустоили void, если в функцию не передаются параметры, либо список спецификаций отдельных параметров с указанием типов и имен, записанных черех запятую.
Тело функции – это последовательность определений, описаний переменных и операторов, заключенных в фигурные скобки.
Когда функция вызывается, управление передается в начало тела функции. Возврат в точку вызова функции выполняется оператором return выражение или return. В теле функции может быть несколько операторов return. При этом выход из функции может быть осуществлен в нескольких точках. Если функция не возвращает никакого значения, т.е. имеет тип void, то выражение в операторе return отсутствует и сам оператор return тоже может отсутствовать.
Пример. Функция вычисляет сумму трех переменных типа float. Функция имеет формальные параметры и один оператор return.
Float sum(float a, float b, float c)
{float S=a+b+c;
return S;}
Пример. Функция находит большее из двух переменных. Функция имеет формальные параметры и два оператора return.
Int max(int x, int y)
{if (x>y)return x;
else return y;}
Пример. Функция выводит значение переменной на экран. Функция имеет один формальный параметр и не имеет оператора return.
Void prn1(int x)
{ printf("Заданное число =%d\n", x);}
Пример. Функция выводит строку на экран. Функция не имеет формальных параметров и оператора return.
Void prn2()
{ puts("Моя программа");}
Вызов функции(обращение к функции) – это выражение, в котором указывается имя функции и список фактических параметров в круглых скобках. Результатом этого выражения является возвращаемое значение, тип которого соответствует типу функции:
Имя_функции(список фактических параметров)
где список_фактических_параметров – это либо пусто, либо void, либо фактические параметры (константы или заранее определенные переменные, переменные с преобразованием типов, выражения).
При обращении к функции формальные параметры заменяются фактическими параметрами в строгом соответствии с типами параметров. Соответствие между формальными и фактическими параметрами устанавливается по их взаимному расположению в списках.
Например:
Int max(int x, int y)
{if (x>y)return x; else return y;}
Void main()
{int a=10,res1,res2; float f=55.9;
res1=max(a,20); // res1=20
res2=max(int(f),a+30);} // res2=55
Пример.
int func1(int a, int b) //Определение функции
{return a+b;}
float sqr(float f, float g) //Определение функции
{return f*g;}
Void main()
{int am=2,bm=3,res1;
res1=func1(am,bm); //Вызов функции
float em=2.5,gm=3.0,fm=4.2,res2,res3;
res2=sqr(fm,gm); //Вызов функции
res3=sqr(fm+0.5,sqr(em,gm)); //Вызов функции
int res4=(int)sqr(em,float(am)); } //Вызов функции
Если функция определена после функции main() или в другом файле, то до первого обращения к функции она должна быть описана. Описание функции называется прототипом. Это необходимо для проверки компилятором соответствия типов передаваемых в функцию параметров и возвращаемых значений. В прототипе можно не указывать имена формальных параметров. В конце прототипа обязательна точка с запятой. Примеры прототипов:
float sum(float a, float b, float c);
Int max(int, int y);
float sqr(float, float g);
Пример . Функция определена ниже своего первого вызова, перед вызовом помещен прототип.
#include <stdio.h>
int sum(int, int);//Прототип функции – описание функции
Void main()
{int a, b=3, g=4;
a=sum(b, g); //Вызов функции
printf("Сумма=%d\n", a); }
int sum(int arg1, int arg2) //Определение функции
{return arg1+arg2;}
1.2 Передача параметров в функции по значению и по указателю
В языке С++ передача параметров (кроме указателей и массивов) в функции при их вызове осуществляется по значению. Это означает, что для передаваемых (фактических) параметров в функции создаются копии этих параметров. Для формальных параметров выделяется память, в которую заносятся значения фактических параметров. Действия, производимые с этими параметрами (копиями) в функции не влияют на переменные вне функции, т.е. на фактические переменные. Формальные параметры недоступны вне тела функции. При выходе из функции выделенная для них память освобождается.
Пример.
#include <stdio.h>