Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Программирование_Тема7,8,9,10,11_функции...doc
Скачиваний:
5
Добавлен:
14.08.2019
Размер:
73.22 Кб
Скачать

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

В языке С++ функции имеют некоторые особенности. Опишем их.

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

Например,

int sum (int a=1, int b=2)

{return a+b;}

sum();//3

sum(10)//12

sum(10,5)//15

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

2. Допустимы функции, количество параметров у которых при компиляции определения функции не определено, в этом случае в определении функции в конце списка параметров после запятой ставится многоточие.

тип имя (список параметров, …);

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

Например, пусть

  1. функция int plus (int a, int b) – функция сложения двух целых чисел

  2. функция char * plus (char *a, char *b) – функция конкатенации (объединения) двух строк

plus (2,5) – вызов функции 1, plus (“Hello ”, “world”) – вызов функции 2

Тема 10Рекурсивные функции

Рекурсивные функции делят на собственно рекурсивные и косвенно рекурсивные.

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

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

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

Поэтому серьезное изучение рекурсивных методов нужно проводить, вводя динамические структуры данных.

Приведем классический пример рекурсивной функции – вычисление факториала. На практике, как было сказано выше, данную функции эффективнее реализовывать итерацией – детерминированным циклом.

long factorial (int k)

{

if (k<0) return 0;

if (k==0) return 1;

return k*factorial(k-1);

}

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

# include “имя файла”

включают в начало каждого из модулей программы.

Тема 11Функции стандартной библиотеки языка с для работы со строками (string.H) (см. П. 1.6. Уч. Пособия )

Тема 12. Функции стандартной библиотеки языка с для работы с файлами (stdio.H) (см. П. 1.6. Уч. Пособия )