Передача в функцию другой функции.

Автор: Пьянков Денис
ИТП-3-08

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

float f1(float x)
{
  return x * sin(x);
}

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

Синтаксис объявления указателя на функцию:

тип результата функции (*имя указателя)
([список типов формальных параметров функции])

или

тип результата функции (*имя указателя) 
([список формальных параметров функции])

Пример объявления указателя f на функцию с одним вещественным параметром, которая возвращает вещественное число:

float(*f) (float x);

Пример прототипа функции вычисления определенного интеграла:

float integ (float a, float b, int n, float (*f)(float x));

В этом объявлении: integ – имя функции вычисления значения интеграла, a и b – пределы интегрирования, n – количество разбиений отрезка интегрирования [a,b], f – указатель на функцию с одним вещественным параметром, которая возвращает значение подынтегральной функции в точке х. f - указатель, через который передается в функцию адрес конкретной подынтегральной функции.

Пример программы вычисления двух интегралов

методом левых прямоугольников для заданного количества разбиений отрезка интегрирования. Для приближенного вычисления интеграла с пределами интегрирования a и b в программе используется формула левых прямоугольников:

где h = (b - a) / n.

#include <iostream.h>
#include <math.h>
#include <conio.h>

float f1(float x); //подынтегральная функция 1 интеграла
float f2(float x); //подынтегральная функция 2 интеграла

//Вычисление интеграла методом левых прямоугольников
float integ(float a, float b, int n, float (*f)(float x)); 

void main()
{
  int n; //количество разбиений
  cout « "n? ";
  cin » n;
  cout « "integ1 = " « integ(0, M_PI_2, n, f1) « endl; 
  cout « "integ2 = " « integ(10.5, 1, n, f2);
  getch();
}

float integ(float a, float b, int n, float (*f)(float x))
{
  float h, x; //длина элементарного отрезка и левая граница отрезка
  float s; //сумма
  int i; //номер отрезка
  h = (b - a) / n;
  s = 0;
  x = a;
  for(i = 1; i <= n; ++i)
  {
    s = s + f(x);
    x = x + h;
  }
  return s * h;
}

float f1(float x)
{
  return x * x * cos(x * x);
}

float f2(float x)
{
  return log(sqrt(1 / x));
}
Предыдущая страница         Следующая страница
Сайт создан в системе uCoz