Процедурное программирование на языке С. Часть 2. Указатели на объекты. Многоуровневая адресация: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 4

{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.

4.5.АДРЕС ФУНКЦИИ – ЗНАЧЕНИЕ, ВОЗВРАЩАЕМОЕ ФУНКЦИЕЙ

Возможны ситуации, когда  некоторая функция программы определяет адрес одной из множества однотипных функций, которой следует передать управление в зависимости от конкретных условий, выявленных в ходе работы. В таких случаях значение, возвращаемое функцией,  –  это адрес функции. 

Синтаксическая форма объявления функции 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?  = ");