Основные определения
ЛЕКЦИЯ № 9
ТЕМА: ПОДПРОГРАММЫ (ФУНКЦИИ) в С/С++.
СОДЕРЖАНИЕ
9.1. Основные определения.
9.2. Передача параметров в подпрограммы.
9.3 Область видимости переменных в функциях С/С++,
расширение области видимости переменных.
9.4. Перегрузка функций в C++.
Подпрограмма – именованная, логически законченная группа операторов языка, которую можно вызвать для выполнения любое количество раз из различных мест программы. В языке С/С++ подпрограммы реализованы в виде функций. Функция принимает параметры и возвращает единственное скалярное значение. Как известно, программа на С/С++ состоит из одной или нескольких функций. Функция должна быть описана перед своим использованием.
Описание функции состоит из заголовка и тела функции.
Заголовок_функции
{
тело_функции
}
Заголовок функции имеет вид
type имя_функции ([список параметров])
type – тип возвращаемого функцией значения; Тип функции показывает, какое значение возвращает функция: целое, вещественное, строковое и так далее. Если тип функции не указан, то подразумевается, что функция возвращает целое значение типа int.
список параметров – список параметров (аргументов) содержит перечень типов и имен величин, разделенных запятыми, и заключенных в скобки. Если функция не имеет параметров, то скобки все равно необходимы, хотя в них ничего не указывается, то есть в скобках в этом случае будет пустое место.
Например:
fun1(int a, int b, float d);
В случае, если вызываемые функции определены до функции main,структура программы будет такой.
директивы компилятора
...
Тип_результата f1(Список_переменных)
{
Операторы
}
Тип_результата f2(Список_переменных)
{
Операторы
}
...
Тип_результата fn(Список_переменных)
{
Операторы
}
int main(Список_переменных)
{
Операторы основной функции, среди которых могут операторы вызова функций f1, f2, ..., fn
}
В случае, если вызываемые функции определены после функции main или даже в другом файле,необходимо до первого вызова функции сообщить программе тип возвращаемого функцией значения, а также количество и типы ее аргументов. Подобное сообщение называется прототипом функции.
директивы компилятора
...
Тип_результата f1(Список_переменных);
Тип_результата f2(Список_переменных);
...
Тип_результата fn(Список_переменных);
int main(Список_переменных)
{
Операторы основной функции, среди которых могут операторы вызова функций f1, f2, ..., fn
}
Тип_результата f1(Список_переменных)
{
Операторы
}
Тип_результата f2(Список_переменных)
{
Операторы
}
...
Тип_результата fn(Список_переменных)
{
Операторы
}
Прототипы функции.Прототип функции имеет следующий вид
тип<имя функции>(список параметров)
Использование прототипа называют еще объявлением функции или просто ее declaration. Прототип может полностью совпадать с заголовком функции, хотя при объявлении функции компилятору необходимо знать только имя функции, количество аргументов и их типы и тип возвращаемого функцией значения. Поэтому имена аргументов как имена формальных параметров не имеют никакого значения и игнорируются компилятором.
Поэтому прототип функции может иметь один из следующих видов:
int fun1(int x, int y, char* c); или int fun1(int, int, char*);
Если возврата функции не требуется, то тип возвращаемого значения функцией –void.
Возврат значений с помощью оператораreturn.
Для того, чтобы функция вернула какое-либо значение, в ней должен быть оператор возврата
return значение;
Если тип возвращаемого значения функцией –void,то оператор возврата просто –return и его можно даже опустить в теле функции.
Return вызывает немедленный выход из функции и возврат в основную подпрограмму. С помощью оператораreturnиз функции возвращается единственное значение. Это может быть число, адрес, структура.
Пример.Подпрограмма для вычисления определенного интеграла методом Ромберга.
Параметры
1. float (*f)(float ) – указатель на функцию, возвращающую тип float и имеющую один формальный параметр (float ).
2. float a –нижний предел интегрирования;
3. float b– верхний интегрирования.
float Romberg (float (*f)(float ),float a, float b)
{
float d,s,h ,rombint;
int m,n,i,j,k;
float t[15];
k =12;
d = b - a;
t[0] =(f(a) + f(b)) / (float)2.0;
n = 1;
for ( i = 1 ; i < k+1 ; i ++)
{
s = ( float ) 0.0;
n = 2 * n;
h = d / n;
for ( j = 1 ; j <= n ; j = j + 2)
s = s + f( a + j * h );
t [i+1-1]= ( 2* s/n + t [i-1]) / (float)2.0;
m = 1;
for ( j = i; j >= 1 ; j --)
{
m = 4 * m;
t[ j -1] = t [j ] + (t[j ] - t [j - 1])/ (m - 1);
}
}
rombint = t[0] * d;
return (rombint);
}