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