|
Автор: Пьянков Денис ИТП-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));
}
|