- •11.5.1. Масиви - параметри функцій
- •11.5.2. Символьні рядки - параметри функцій
- •Int day; /* на зовнішньому рівні */
- •11.8. Опрацювання структур у функціях
- •11.9.1. Оголошення вказівника на функцію. Звертання через вказівник
- •11.9.2. Вказівник на функцію як параметр функцій
- •11.9.3. Функції, що повертають вказівник на функцію
- •11.9.4. Масиви вказівників на функцію
- •Void Menu (void);
- •Int main (void)
- •Void Menu (void) /* функція формування меню */
- •Int nuro, nitems;
- •If (pred — null) (
- •Int* FindElement (int nfind, int arr[], int k)
- •If (*pel «nfind) return pel; /* число знайдено */
- •11.11.2. Макрозасоби для роботи з неогопошеними параметрами
11.9.2. Вказівник на функцію як параметр функцій
Найчастіше вказівники на функції використовуються як формальні параметри у функціях вищого (в алгоритмічно-структурному розумінні) рівня. Це дає змогу створювати функції, які опрацьовують або використовують певний тип інших функцій без огляду на їх конкретні імена та внутрішнє наповнення.
Розглянемо функцію, призначену для обчислення середнього значення довільної математичної' функції однієї змінної, аргумент і значення якої мають дійсний тип. 'Значення відповідної математичної'функції повинні обчислюватися у к послідовних і очках проміжку [хО, хк].
/' Функція обчислення середнього значення математичної функції, заданої вхазівнихом pf, ва інтервалі [хО,хк] "/
•define К 100 /* кількість точок аналізу Функції */
double AverFunValue (double хО, double xk, double('pf)(double))
і
double x, dx, fsum ■ 0; dx = (xk-xO)/<K-l); /* віддаль між точками аналізу */
for (х-хО, xk+=dx/10; х < xk; x*«dx)
fsum+- (*pf)(x); /* сумування значень функції */
return fsum / K;
Функція AverFunValue () мас три параметри: перші два задають межі проміжку, а третій - pf вказує на математичну функцію, для якої обчислюється середнє значення. В оголошенні pf та в звертаннях до математичної функції використано операцію розадресації вказівника на функцію:
doublet * pf) (double) - оголошення вказівника;
(" pf) (х) - звертання до функції. В обох випадках можна було скористатися спрощеними формами:
double pf (double) - для оголошення вказівника;
pf (х) - для звертання до функції.
аЗвернемо увагу на ще одну осо5ливість програми: в загоповку циклу значення кінцевої межі проміжку хк дещо посувається вправо: хк +- dx/10. Це зроблено для того, щоб через імовірне нагромадження похибки, викликаної багаторазовим додаванням дійсного значення кроку dx, не пропустити останню точку проміжку.
Проілюструємо використання функції AverFunValue (ї прикладом програми, яка обчислює середнє значення двох математичних функцій funl() та fun2() на проміжку, заданому користувачем.
/•••*•** /
/• Обчислення середнього значення двох математичних функцій «/ /■•*••**•**»•*■■*.*•****.**•• **•***************•******«**»****/
•include <stdio.h> •include <math.h> •define K 100
double funl (double); /* прототипи функцій */
double fun2 (double);
double AverFunValue (double, double, double (') (double)) ;
int main (void)
<
double a, b; /* межі проміжку */
printf <"Чпінтервал -> "); scanf ('■%lf%lf", sa JbJ;
printf <"\n Середнє значення Фунхції_1 -> %+.41f,
AverFunValue(a, b, funi));
printf ("\n Середнє значення фунхції_2 -> %+.41f\n",
AverFunValue(a, b, fun2));
return 0;
)
/* функція, що визначає середнє значення математичної функції,
заданої вказівником pf, на інтервалі аналізу [x0,xkl */
double AverFunValue (double х0, double xk, double('pf)(double)) і
double x, dx, fsjm-0; dx-(xk-xO)/(K-l);
for (x-xO, xk+-dx/10; x<xk; x+-dx)
fsum+- (*pf)(x); return fsum / K;
)
double funl (double x) /* перша математична функція */
{
return sin(2*x) - 0.85'cos(x+1.4);
)
double fun2 {double x! /* друга математична функція •/
I
if (x>-0)
return 3*cos(1.5-x); else
return cos(x)*cos(x);
)
Приклад виконання:
Інтервал -> -0.6 2.7
Середнє значення фунхції_1 -> +0.3418 Середнє значення функції_2 -> -0.3252
У викликах функції AverFunValue ( ), що виконуються в main (}, третім параметром вказується ім'я тієї математичної функції програми, для якої обчислюється середнє значення. Можна явно вказати, шо передається саме адреса функції, записавши перед її іменем знак & . Два наступні виклики рівнозначні:
AverFunValue(a, b, funl) ■ AverFunValue(a, b, tfunl)
