вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


1.9. Функции

Минимальная программа на С++ состоит из одной функции main, именно с нее начинается работа программы. Однако, мы можно (и нужно) пользоваться другими функциями. В языке С++ существует большое количество функций стандартной библиотеки STL ( глава 2), а также можно определять свои собственные функции.

1.9.1 Использование функций библиотеки STL (пример 11)

Стандартная библиотека C++ предлагает широкий набор функций для выполнения математических вычислений, операций со строками и символами, ввода-вывода, обработки ошибок и многих других полезных операций. Это облегчает работу программистов, поскольку эти функции реализуют многое из того, что им обычно требуется. Прототипы функций размещаются в заголовочных файлах, так что они могут использоваться любыми программами, включающими соответствующий заголовочный файл.

Например, в языке С++ не существует оператора возведения в степень, но зато есть функция возведения в степень, которой можно воспользоваться. Для этого нужно подключить заголовочный файл  <cmath> и в обратиться к функции  pow() в теле программы.

/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 11. Обращение к фукнции возведения числа в степень
// 
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение математической библиотеки
#include <cmath>
// подключение стандартного пространства имен для использования библиотек
using namespace std;

/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    double pi=3.14;

    // возведение числа в степень 
    // обращение к функции - пример 1
    double power = pow(3.14, 2); 
    // обращение к функции - пример 1
    power = pow(pi, 2);
    // обращение к функции - пример 3
    cout<<pow(pi, 2)<<endl;
}
/////////////////////////////////////////////////////////////////////////////

Функция  pow() возводит число 3.14 в квадрат и присваивает полученный результат переменной  power, где pow - имя функции; числа 3.14 и 2 — аргументы функции. В качестве аргументов функции может быть число или переменная соответствующего типа.

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

1.9.2 Определение новых функций

Определение (реализация) функции

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

в общем виде

пример

тип имя(список аргументов с типами) 
{ 
    инструкции 
    return возвращ.знач.; 
} 
double plus(double x, double y) 
{
    return x+y;
}

Тип возвращаемого значения может быть целым, вещественным, и т.д., кроме того, функция может не возвращать никакого значения, тогда при ее определении (и описании) указывают тип void.

void print_value(double res)
{
    cout<<"result is: "<<res<<endl;
}

Во время выполнения какой-либо функции управление возвращается в вызывающую программу, когда программа достигает закрывающей фигурной скобки или при исполнении оператора return. Если функция не возвращает никакого значения, оператор return должен быть "пустым", а если возвращает – после оператора return указывается возвращаемое значение. Для функции, не возвращающей никакого значения, наличие оператора return не является обязательным.

Описание функции (прототип)

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

в общем виде

пример

возвращ.тип имя (список аргументов с типами); 
 double plus(double x, double y)

Компилятор сверяется с прототипом функции, чтобы проверить, содержат ли вызовы функции правильное число аргументов нужных типов и перечислены ли типы аргументов в правильном порядке. Кроме того, прототип функции необходим компилятору для того, чтобы убедиться, что возвращаемое функцией значение корректно используется в вызвавшем функцию выражении (например, вызов функции, возвращающий void, не может входить в правую часть оператора присваивания). Каждый аргумент должен быть совместим с типом соответствующего параметра. Например, параметр типа double может принимать значения 7.35, 22 или -0.03456, но не строку вроде "hello". Если передаваемые функции аргументы не совпадают по типу с параметрами, указанными в прототипе функции, компилятор пытается преобразовать аргументы к соответствующему типу.

Обращение к функции (вызов функции)

Каждому параметру в определении функции (формальный параметр функции) должен соответствовать один аргумент в вызове функции. В данном примере, когда функция вызывается, параметр функции х инициализируется значением аргумента b, параметр у инициализируется значением аргумента c, а возвращаемое значение присваивается переменной a.

в общем виде

пример

			
имя (список аргументов); 
 double a, b, c; 
 a=plus(b, c); 

1.9.3 Пример функции (пример 12)

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

/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 12. Функция сложения двух чисел
// 
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;

// объявление функции (прототип функции)
// функция складывает два числа
double plus(double x, double y); 
// функция печати результата
void print_value(double res);
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    // объявление и инициализация двух переменных
    double x1=1, x2=2;

    // обращение к функции - пример 1
    double res = plus(x1, x2);
    // обращение к функции - пример 2 
    res = plus(55.5, res);
    print_value(res);
    // обращение к функции - пример 3
    cout<<plus(res, x2)<<endl;
    // обращение к функции - пример 4
    print_value(plus(res, x2));
}
/////////////////////////////////////////////////////////////////////////////
// Определение (реализация) функции сложения двух чисел
double plus(double x, double y)
{
    return x+y;
}
/////////////////////////////////////////////////////////////////////////////
// Определение (реализация) функции печати результата
void print_value(double res)
{
    cout<<"result is: "<<res<<endl;
}
/////////////////////////////////////////////////////////////////////////////