{int i; double sum = uk_fun(a)+ uk_fun(b);
for (i=1;i<n;i++) {if (i%2) sum+=4*uk_fun(a+i*h);
else sum+=2*uk_fun(a+i*h); } return sum*h/3; }
void main(void)
{ int n, numb_f=0; double a , b , h, rezult;
double (*fun[])( double ) = {fun_1,fun_2,fun_3};
printf("\nn= "); scanf("%d",&n); printf("\n a = "); scanf("%lf",&a);
printf("\nVvod b < a, b = "); scanf("%lf",&b); h=(b-a)/n;
while (numb_f < 3)
{ rezult = form_Simps(n,a,b,h,fun[numb_f]);
printf("\n Integral N %d = %lf",numb_f,rezult); numb_f++; }
}
На каждой из 3-х итераций цикла while происходит вызов функции form_Simps(). На каждой итерации первые четыре аргумента функции не изменяются, а 5-ый аргумент зависит от номера итерации, т.е. от значения переменной numb_f, соответствующего номеру функции, для которой рассчитывается интеграл. Переход к очередному элементу массива указателей на функции осуществляется за счет увеличения на 1 значения переменной numb_ f.
Возможны ситуации, когда некоторая функция программы определяет адрес одной из множества однотипных функций, которой следует передать управление в зависимости от конкретных условий, выявленных в ходе работы. В таких случаях значение, возвращаемое функцией, – это адрес функции.
Синтаксическая форма объявления функции 1, возвращающей адрес функции 2, имеет вид:
<спецификация типа> (*идентификатор(<список 1> )) (<список 2>);
Здесь
· <идентификатор > соответствует имени (адресу) функции 1;
· <список 1> – список типов ( и имен) формальных параметров функции 1;
· < спецификация типа > – тип значения, которое возвращает функции 2;
· <список 2> – список типов ( и имен) формальных параметров функции 2.
В примере 4.4 описаны фрагменты программы, выполняющей расчеты определенных интегралов по формуле Симпсона (функция form_Simps()) и по формуле трапеций (функция form_ trap()). Формула трапеций:
≈ .
Функция formula() определяет формулу для расчета интеграла и возвращает либо адрес функции form_Simps(), либо адрес функции form_trap(). В текст рассматриваемой программы должны быть включены описания всех функций, кроме функции main(), из примера 4.3.
Пример 4.4.
double form_trap(int n, double a, double b, double h,double (*uk_fun)( double ))
/* описание функции для расчета определенного интеграла по формуле трапеций */
{int i; double sum = uk_fun(a)+ uk_fun(b);
for (i=1;i<n;i++) sum+=2*uk_fun(a+i*h);
printf("\n Formula trapezij"); return sum*h/2; }
double (*formula(void)) (int , double , double , double ,double (*uk_fun)( double ))
{char f;
printf("\n Choice of formula: S - Simpson; T - Trapezij\n formula = ");
fflush(stdin); scanf("%c",&f);
if (f=='S') return form_Simps;
else return form_trap;
}
void main(void)
{ int end=1, n, numb_f;
double a , b , h, rezult;
double (*form) (int , double , double , double ,double (*uk_fun)( double ));
double (*fun[])( double ) = {fun_1,fun_2,fun_3};
printf("\nVvod n = "); scanf("%d",&n);
printf("\nVvod a = "); scanf("%lf",&a);
printf("\nVvod b > a, b = "); scanf("%lf",&b);
h=(b-a)/n;
while (end)
{ if (!end) break;
printf("\nVvod number of function {0, 1, 2): number = ");
scanf("%d",&numb_f);
form = formula();
rezult = form(n,a,b,h,fun[numb_f]);
printf("\n Integral N %d = %lf",numb_f,rezult);
printf("\n Uslovie prodoljenija: 1 - yes, 0 - no\nProdoljim? = ");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.