Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования (пособие).doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
965 Кб
Скачать
☆

Тема 3.2. Функции

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

3.2.1Возвращаемое значение

Мы уже сталкивались с функциями, возвращающими значение. Например, функции sqrt(), sin(), cos() и т.д. Что же это означает, что функция возвращает значение? Если говорить упрощенно, то это означает, что в момент исполнения программы функция «превращается» в то значение, которая она возвращает. Рассмотрим пример.

//Вычисление площади треугольника

float sq = 0.5*a*b*sin(alpha);

При выполнении этой команды требуется, чтобы переменные a, b и alpha имели какие-то значения. Результатом выражения 0.5*a*b будет произведение этих трех чисел, а sin(alpha) в момент исполнения программы «превращается» синус от alpha; таким образом, переменная sq равняется произведению 0.5*a*b и этого результата. Получается, что функция sin() принимает в качестве аргумента число, производит внутри себя какие-то вычисления и возвращает результат этих вычислений. Это и есть концепция черного ящика. Ящик является черным, поскольку мы знаем, какие аргументы функция принимает и что она возвращает, но не знаем, что происходит внутри нее.

3.2.2Определение и вызов функции

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

#include <iostream>

using namespace std;

//Определение функции

double average(double x, double y, double z) {

double sum = x+y+z;

return sum/3.0;

}

int main() {

//Три вызова функции

cout << average(1,2,3) << endl;

cout << average(7,5,8) << endl;

double avg = average(2,2,2);

cout << avg << endl;

system("pause");

return 0;

}

Оператор return указывает, какое значение следует возвратить. Тип возвращаемого значения может быть любым. В нашем примере – это float:

float average(float x, float y, float z) {

…

}

Указание возвращаемого типа сообщает программисту, как вызывать функцию:

float avg = average(12.5,56.7,66.8);

Переменная avg имеет тип float в силу того, что при определении функции указан тип float.

3.2.3Название функции

Название функции – это идентификатор, поэтому оно должно подчиняться правилам создания идентификаторов. Название функции указывается при ее определении:

float average(float x, float y, float z) {

…

}

и при вызове:

cout << average(12.5, 56.7, 66.8);

3.2.4Формальные и фактические аргументы

После имени функции в круглых скобках перечисляются формальные аргументы этой функции:

float average(float x, float y, float z) {

…

}

Формальные аргументы указывают на то, значения каких типов можно передать в функцию при вызове:

cout << average(12.5, 56.7, 66.8);

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

cout << average(12.5);

cout << average("1.5", 6.7, 6.8);

cout << average();