Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologia_programmirovania.pdf
Скачиваний:
182
Добавлен:
08.04.2015
Размер:
1.76 Mб
Скачать

84

Глава 7. Функции

Термином функции в языке С++ называют подпрограммы. В виде функций оформляются вычисления, преобразования, другие действия, которые затем могут быть выполнены неоднократно с различными аргументами.

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

Определение любой функции имеет вид:

тип-результата имя-функции(объявления аргументов)

{

объявления и инструкции

}

Отдельные части определения могут отсутствовать, например, следующая функция ничего не делает:

void dummy() {}

Тип результата функции void означает, что функция ничего не возвращает.

Вычисления в функции завершаются при достижении последней закрывающей фигурной скобки } или при выполнении инструкции return. Когда функция завершает работу, управление передается в вызывающую программу той инструкции, которая следует за вызовом функции.

Если функция завершается инструкцией return выр;

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

Функции могут возвращать значения любых типов. Например, следующая функция возвращает логическое значение true (истина), если ее аргумент a больше b, иначе значением функции будет false (ложь).

bool greater(int a, int b)

{

return a > b;

}

Функции 85

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

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

int sum(int a, int b)

{

return a + b;

}

Здесь a и b – формальные параметры функции sum.

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

#include <iostream.h> int main()

{

cout << ”3 + 2 = ” << sum(3, 2); int x = 3, y = 2;

cout << ”\nx + y = ” << sum(x, y); return 0;

}

Впервом случае фактическими аргументами являются константы 3

и2, во втором – переменные x и y.

Приведенную программу можно выполнить, разместив в одном файле сначала функцию sum, а затем функцию main. Программа напечатает:

3 + 2 = 5 x + y = 5

В языках Си и C++ аргументы передаются в функцию по значению. Это значит, что внутри функции создаются локальные копии фактических аргументов, которые и используются в вычислениях. Отсюда следует, что фактические аргументы не могут быть непосредственно изменены внутри функции. Рассмотрим функцию:

void add(int c)

{

c++;

}

На первый взгляд, функция add увеличивает свой аргумент на 1, попробуем применить ее:

86 7

#include <iostream.h> int main()

{

int x = 1;

add(x); cout << ”x = ” << x; add(2);

return 0;

}

Здесь производится попытка увеличить переменную x на 1 и попытка изменить значение константы 2. Программа напечатает:

x = 1

Таким образом, значение аргумента x не изменилось, так же, как ничего не произошло с константой 2. Просто при первом вызове add формальный параметр c был инициализирован значением переменной x, а во втором – константой 2. Внутри функции add переменная c изменяется, что никак не сказывается ни на x, ни на константе 2.

Память под формальные параметры функции выделяется при вызове функции и освобождается при завершении ее работы.

Если необходимо изменить фактический аргумент внутри функции, в нее должен передаваться адрес аргумента или ссылка на аргумент. Как это сделать, будет описано позже.

Пpограмма.14. Степени целых чисел

В приводимой ниже программе определена функция power для возведения целого m в целую степень n. В main функция power вызывается для вычисления степеней чисел 2 и –3.

//Файл PowerInt.cpp

//Функция power возводит m в степень n

int power(int m, int n) // power - имя функции; m, n - аргументы функции

{

int i, p = 1;

 

for(i = 1; i <= n; i++)

// m возводится

p = p * m;

// в n-ю степень

return p;

// Возвращение вычисленного значения

}

 

#include <iostream.h>

 

#include <conio.h>

 

int main()

// Использование функции power

{

 

int i;

 

for(i = 1; i < 10; i++)

 

Функции 87

cout << "2 в степ. " << i << " =\t" << power(2, i)

<< "\t-3 в степ. " << i << " =\t" << power(-3, i) << "\n"; getch();

return 0;

}

Программа выдает следующее:

2 в степ. 1 =

2

-3 в степ. 1 =

-3

2 в степ. 2 =

4

-3 в степ. 2 =

9

2 в степ. 3 =

8

-3 в степ. 3 =

-27

2 в степ. 4 =

16

-3 в степ. 4 =

81

2 в степ. 5 =

32

-3 в степ. 5 =

-243

2 в степ. 6 =

64

-3

в степ. 6 =

729

2 в степ. 7 =

128 -3

в степ. 7 =

-2187

2 в степ. 8 =

256 -3

в степ. 8 =

6561

2 в степ. 9 =

512 -3

в степ. 9 =

-19683

В данной программе сначала идет определение функции power с двумя аргументами целого типа. Для вычисления mn величина p умножается n раз на m. Начальное значение p устанавливается в 1. Вычисленный результат возвращается из функции инструкцией:

return p;

Внутри функции power определены локальные переменные i и p. Они создаются (под них выделяется память) только в момент вызова функции, а при завершении работы функции память, занимавшаяся локальными переменными, освобождается. Это значит, что то место памяти, которое занимали i и p, может быть использовано для других переменных.

Функция main направляет значение, возвращаемое функцией power, в выходной поток.

Сама функция main вызывается на выполнение операционной системой, а возвращаемое ею значение может быть каким-либо образом использовано в среде ОС, например, для анализа успешности завершения программы.

Обратите внимание на использование символа табуляции ’\t’. Вывод символа табуляции переводит курсор в следующую позицию табуляции, которые во всех строках экрана находятся в одинаковых местах. Благодаря этому результаты вывода выравниваются по левому краю.