Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

10.6.Указатели на функции

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

double (*f) (double x, double y);

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

double *f (double x, double y);

определяет f как функцию, с двумя аргументами типа double, которая возвращает указатель на double.

Программа 27. Поиск максимума функции

Пусть требуется найти максимальное значение некоторой математической функции

y=f(x)

на отрезке [a, b]. Применим для решения этой задачи метод перебора. Выберем n точек на отрезке [a, b], расположенных на одинаковом расстоянии

x =(b - a)/(n - 1)

друг от друга. Их координаты можно вычислить по формуле:

xi = a + i x, i = 0, 1, 2,…, n-1.

В каждой из этих точек вычислим значение функции:

yi = f(xi), i = 0, 1, 2,…, n-1

и выберем среди этих значений максимальное.

Большая часть работы описанного алгоритма поиска максимума не зависит от вида математической функции, максимум которой нужно найти, поэтому хотелось бы написать программу, пригодную для поиска максимума любой математической функции. Это можно сделать, если алгоритм поиска максимума реализовать в виде функции, которой в качестве аргумента будет передаваться указатель на функцию для вычисления f(x).

// Файл MaxFunc.cpp

/* maxfun: возвращает максимальное значение функции, значения которой вычисляются с помощью функции, заданной указателем f */

double maxfun(double (*f)(double), double a, double b, int n)

/*

f – указатель на функцию с одним аргументом типа double,

возвращающую значение типа double;

a, b – границы отрезка определения функции;

n – число точек на отрезке, в которых вычисляется функция.

*/

{

double dx, fx, max;

dx = (b - a)/(n - 1); // Расстояние между узлами

max = f(a); // Может быть максимум достигается на левой границе

while((a += dx) <= b){

fx = f(a); // Значение функции в текущей точке

if(fx > max) // Если текущее значение функции больше,

max = fx; // запоминаем его

}

return max;

}

#include <math.h>

#include <iostream.h>

#include <conio.h>

double erf(double); // Прототип некоторой функции

void main()

{

// Исследуем библиотечную функцию синус

cout << "\nmax sin(x) при 0 < x < Pi = " << maxfun(sin, 0, M_PI, 50);

// Исследуем функцию erf

cout << "\nmax erf (x) при -2 < x < 2 = " << maxfun(erf, -2, 2, 50);

getch();

}

double erf (double x) // Определение функции для исследования

{

return exp(-x * x) / sqrt(2 * M_PI);

}

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

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

.

Данная программа выводит:

max sin(x) при 0 < x < Pi = 0.999486

max erf(x) при -2 < x < 2 = 0.398278