
- •Введение
- •Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор return
- •Return (выражение);
- •Функция возвращает значение любого простого типа
- •Функция возвращает указатель на скаляр, массив, структуру, файл или функцию
- •А) Функция возвращает указатель на скаляр
- •Б) Функция возвращает указатель на первый элемент одномерного массива
- •3) Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •2.2.2 Рекурсивные функции
- •2.2.3 Указатели на функции
- •( * Имя указателя) (список фактических параметров);
- •2.2.4 Массивы указателей на функции
- •2.2.5 Определение типа указателя на функцию
- •2.2.6 Указатель на функцию - параметр функции
- •2.3 Задание на выполнение лабораторной работы
- •Порядок выполнения работы
- •Пример выполнения лабораторной работы
- •2.6 Контрольные вопросы
- •2.7 Варианты заданий лабораторной работы
- •Лабораторная работа № 6 Разработка программ с использованием структурированных данных
- •3.1 Цель лабораторной работы
- •Теоретические сведения
- •3.2.1 Структурные типы и структуры
- •Для обращения к элементам, входящим в состав конкретной структуры используются уточненные имена:
- •(*Имя указателя). Имя элемента структуры
- •3.2.2 Инициализация структур
- •3.2.3 Динамическое выделение памяти под структуру и массив структур
- •Элементы структур
- •Элементы структуры могут иметь одинаковый тип, тогда при описании таких элементов можно указывать их общий тип, а имена перечислить через запятую:
- •Struct def { def a , int b; } ; // - ошибка!
- •Strspy ( a.Fio, “ Петров”) ;
- •3.2.5 Структуры и функции
- •3.2.6 Использование массива указателей, инициированного строками
- •3.3 Задание на выполнение лабораторной работы
- •3.4 Порядок выполнения работы
- •3.5. Пример выполнения лабораторной работы
- •3.6 Контрольные вопросы
- •3.7 Варианты заданий лабораторной работы
- •4. Список литературы
2.2.6 Указатель на функцию - параметр функции
Указатели на функции удобно использовать в качестве параметров функций, реализующих ту или иную обработку других функций, которые заранее не определенны.
Например, можно определить функцию вычисления определенного интеграла. Подынтегральная функция может быть передана в функцию вычисления интеграла с помощью параметра-указателя.
В таких случаях формальным параметром функции должен быть указатель на передаваемую функцию, а фактическим параметром должен быть адрес в оперативной памяти передаваемой функции, то есть идентификатор этой функции. Передаваемая функция должна по типу результата и сигнатуре параметров соответствует указателю.
В определении функции (в теле функции) указатель-параметр используется для вызова передаваемой по указателю функции. При вызове функции формальный параметр – указатель получает значение адреса передаваемой функции, ее имя.
В С++ все функции внешние, любую определенную функцию можно вызывать в теле любой другой функции непосредственно по имени, не передавая имя функции через механизм параметров.
Указатели на функции как параметры функций целесообразно использовать, когда в создаваемой функции должна быть заложена возможность обработки не конкретной, а произвольной функции. В этом случае адрес обрабатываемой функции целесообразно передавать в функцию посредством параметра. В качестве формального параметра следует определять указатель на функцию, а при вызове функции передавать в качестве фактического параметра идентификатор (адрес) нужной обрабатываемой функции.
Указатели на функции в качестве формальных параметров можно использовать, например, в функциях:
формирования таблиц результатов, получаемых с помощью различных функций (формул);
вычисления интегралов с различными подынтегральными функциями;
нахождения сумм рядов с различными общими членами и т. д.
Пример: определить и вызвать функцию table() для построения таблицы значений различных функций. Функция table() использует в качестве параметров указатели на функции, которые определяют функции для вычислений значений в таблице.
Алгоритм задания:
определяются три однотипных функции с одним вещественным параметром (a(x), b(x), c(x)) для расчета значений, выводимых в таблицу;
объявляется тип указателя func на такие функции;
определяется массив S из трех указателей на функции инициированный именами функций a, b, c;
определяется функция table, выводящая в виде таблицы значения трех функций передаваемых в table посредством параметров; аргументами функции table являются:
во-первых, массив ptrA указателей на функции с открытыми границами для передачи функций, вычисляющих значения и целочисленный параметр n для передачи количества указателей в массиве;
и, во-вторых, параметры для аргумента передаваемых функций – начальное значение - xn, конечное значение - xk и шаг изменения аргумента - dx;
в главной функции производится вызов функции table() и передаются фактические параметры – инициированный конкретными функциями массив S , количество указателей в массиве 3 и значения аргумента – начальное, конечное и шаг изменения аргумента функций массива.
Алгоритм функции table:
устанавливается начальное значение аргумента функций x=xn;
пока аргумент функций не достигнет своего конечного значения (x<= xk) выполняется повторяющаяся обработка: при каждом значении аргумента выводится строка значений трех функций, вызовы которых производятся с использованием указателей на функции из массива указателей и затем значение аргумента увеличивается на величину dx.
Текст программы:
# include <iostream.h>
float a ( float x) { return x*x }
float b ( float x) { return (x*x +100) }
float c ( float x) { return sqrt ( fabs(x)) +x;}
typedef float (* func) ( float x) ;
func S [3] = { a , b , c }
void table ( func ptrA [ ] , int n, float xn , float xk , float dx )
{ float x = xn;
while ( x<= xk )
{ cout <<”\n”;
for (int i=0; i< n; i++)
{ cout. width(10); cout <<(* ptrA[i] ) (x); }
x+=dx ;
}
}
void main { table ( S , 3, 0. , 2 . , 0.1 ) }
Указатель на функцию может быть результатом работы функции, то есть функция может возвращать указатель на функцию с помощью оператора return и с помощью формального параметра (например, передача параметра по ссылке).
Ниже приведен пример программы, в котором используются функции, возвращающие указатели на функции с помощью return и с помощью формального параметра (передача параметра по ссылке).
. . .typedef void ( * menu) ( )
menu act [4] = { act1, act2 , act3 , act 4};
menu F1 (int i) { return act [i] } // функция возвращает указатель на
// функцию как результат работы функции;
void F2 (int i , menu & r) { r = act [i] } // функция возвращает указатель на
// функцию, используя формальный параметр;
void main ( )
{ int i ;
menu p1 , p2; // объявлены два указателя на функции;
while(1) // бесконечный цикл;
{ cin >> i ;
if ( i>=1 && i<=4 )
{ p1 = F1 ( i-1);
p1( ) ; // вызов функции;
act [i-1] ( ) ; // вызов функции;
F2( i-1, p2) ;
p2 ( ) ; // вызов функции;
}
else exit ( 0) ;
}
}