Слайд 2
Приклад вказівника на функцію, що має два параметри і
повертає вказівник
на дані з типом char
char* (*pfun) (char*, unsigned)
Якщо оголошено дві функції
char* FindWord (char* st, unsigned num);
char* DelWord (char* sent, unsigned k);
то коректними будуть присвоєння
pfun = FindWord або pfun = &FindWord
pfun = DelWord або pfun = & DelWord
Вказівник можна застосовувати для звертання до функції.
Після першого присвоєння, наступне звертання (*pfun)(str, 3);
рівнозначне виклику FindWord (str, 3);
Можна використовувати спрощене звертання pfun (str, 3),
але краще конструкцію з розадресованим вказівником.
Слайд 3
Приклад
#include
#include
void print(char *s)
{
puts(s);
}
void main(void)
{
void (*efct)(char *s);
efct=&print; /* efct=print */
(*efct)("Function
Print!"); /* efct("Function Print!"); */
}
Слайд 4
Покажчикам на функції можна присвоювати адреси стандартних
бібліотечних функцій.
#include
#include
#include
void main(void)
{
double (*fn)(double);
float
y,x=1;
fn=sin;
y=fn(x);
printf("sin(%g)==%g\n",x,y);
fn=cos;
y=fn(x);
printf("cos(%g)==%g\n",x,y);
}
Слайд 5
Найчастіше вказівники на функції використовуються як
формальні параметри у функціях
вищого рівня. Це дає змогу
створювати функції, які використовують інші функції без огляду
на їх конкретні імена та внутрішнє наповнення.
Приклад
#include
#include
#include
double fn(double (*pfn)(double ), double x)
{
double y=pfn(x);
printf("y==%g\n", y);
return y;
}
Слайд 6
double fun1 (double x)
{
return sin(x)*cos(x);
}
double fun2 (double x)
{
if (x>=0)
return
3*cos(1.5*x)
else
return cos(x)*cos(x);
}
void main(void)
{
fn(sin,1);
fn(fun1,1);
fn(&fun2,1);
}
Слайд 7Приклад. Знайти додатний корень трансцендентного
рівняння exp(x) - 2 – x=0 з
похибкою EPS
#include
#include
#define EPS 1e-10 // точність результату
double f (double x);
int main()
{ double l = 0, r = 2, c;
while( r - l > EPS )
{ c = ( l + r ) / 2; //середина проміжку
if( f(c) * f(r) < 0 ) //визначаємо, в якій з частин
l = c; // знаходиться корень
else r = c; }
printf ("%.10lf\n", (l + r)/2 );
}
Слайд 8
double f (double x)
{
return exp(x) - 2 -
x;
}
Запрограмовано алгоритм ділення навпіл. Корень
знаходиться між l = 0 та r = 2. Знаходимо середину c
відрізка [l, r). Корень буде на одному з відрізків : на [l, c), або
на [с, r), там, де значення функції на кінцях мають різні знаки
(теорема Ролля). Обираємо потрібний з двох відрізків та
повторюємо алгоритм. Виконуємо ділення навпіл, поки
довжина відрізку не стане меньше заданої точності.
Слайд 9
В прикладі обчислювався нуль конкретної функції
f(x) = exp(x) - 2
– x . Запишемо функцію, яка знаходить нулі
довільних функцій. Для цього потрібно передавати функцію
в якості аргумента.
#include
#include
#define EPS 1e-16
double root (double l, double r, double (*f)(double));
double f1 (double x);
double f2 (double x);