138.75K
Категория: ПрограммированиеПрограммирование

Параметр функции – указатель на функцию

1.

Лекция «Параметр функции –
указатель на функцию»
Читает старший преподаватель
Филимонова Ольга Александровна

2.

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

3.

Нижняя граница интегрирования (double a)
Верхняя граница интегрирования (double b)
Количество разбиения интервала интегрирования
(количество прямоугольников) (int n)
Подынтегральная функция ( ??? )
Проблема: можно ли передать в функцию
Другую функцию?

4.

Необходимо ответить на вопросы:
Как объявить соответствующий параметр
функции?
Как внутри функции вызвать Другую
функцию?
Какой аргумент передать при вызове
функции?

5.

Функция (как и массив) передается по адресу,
следовательно параметр функции –
Указатель на Другую функцию

6.

Рассмотрим несколько вариантов объявлений:
void (*F1) (void);
int (*F2) (int, float);
double (*F3) (double);
Объявлены переменные:
F1- указатель на функцию типа void без параметров
F2 – указатель на функцию целого типа с параметрами int,
float
F3 – указатель на функцию типа double c параметром double

7.

Из примеров видно, что при объявлении указателя
на функцию важны характеристики функции:
Тип функции
Количество параметров функции
Типы параметров функции

8.

Пусть объявлен параметр функции:
double (*F3) (double)
Для вызова этой функции необходимо:
Объявить переменную под результат;
Знать аргумент.
Например:
double Result, Arg=3.14;
Result=F3(Arg);
При вызове используем указатель как имя функции

9.

Пусть объявлена функция с параметром:
double Func (double (*F3) (double) );
Имя конкретной функции с точно такими же
характеристиками, как у указателя, является ее адресом.
Например:
double Result;
Result=Func(sin); // передаем функцию
// double sin(double)
При вызове используем имя конкретной функции как ее
адрес

10.

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

11.

- ----double Integral(double (*F)(double), double a, double b, int n)
{
int i;
double h=(b-a)/n, result=0;
for(i=0; i<n; i++)
result+=F(a+i*h);
return h*result;
}
int main(void)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
double a, b, res;
int n ;
cout<< "\nВведите a, b, n: ";
cin>>a>>b>>n;
res=Integral(sin, a, b, n);
cout<< "\nИнтеграл равен "<<res<<endl;
return 0;
}

12.

Если необходимой подынтегральной функции
нет, напишите ее сами, и ее имя передайте при
вызове.
Например:
double MyFunc(double x)
{
return x*x+1;
}
Вызов:
res=Integral(MyFunc, a, b, n);

13.

Среди стандартных функций есть функции с
параметром – указателем на Другую функцию.
Например - функция быстрой сортировки:
Функция qsort() объявляется в stdlib.h так:
void qsort(void*p, int N, int width,
int (*fcmp)(const void*, const void*));

14.

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

15.

При объявлении функции пишем:
void Func(int a, int b=0);
При определении функции пишем:
void Func(int a, int b)
{

}
Варианты вызова: Func(10, 20); Func(15);
Важно! Параметры со значением по умолчанию
располагаем в конце списка параметров.

16.

Например, известная стандартная функция
имеет характеристики:
…getline(char*str, int n, char lim=‘\n’);
Часто вызывается:
char str[80];
cin.getline(str, 80);
Но можно и так:
cin.getline(str, 80, ‘!’);
English     Русский Правила