Слайд 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

Приклад #include #include void print(char *s) { puts(s); } void main(void) {
Print!"); /* efct("Function Print!"); */ }

Слайд 4


Покажчикам на функції можна присвоювати адреси стандартних
бібліотечних функцій. #include #include #include void main(void) {      double (*fn)(double);      float

Покажчикам на функції можна присвоювати адреси стандартних бібліотечних функцій. #include #include #include
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

double fun1 (double x) { return sin(x)*cos(x); } double fun2 (double x)
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 з

Приклад. Знайти додатний корень трансцендентного рівняння 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 -

double f (double x) { return exp(x) - 2 - x; }
x;
}
Запрограмовано алгоритм ділення навпіл. Корень
знаходиться між l = 0 та r = 2. Знаходимо середину c
відрізка [l, r). Корень буде на одному з відрізків : на [l, c), або
на [с, r), там, де значення функції на кінцях мають різні знаки
(теорема Ролля). Обираємо потрібний з двох відрізків та
повторюємо алгоритм. Виконуємо ділення навпіл, поки
довжина відрізку не стане меньше заданої точності.

Слайд 9


В прикладі обчислювався нуль конкретної функції
f(x) = exp(x) - 2

В прикладі обчислювався нуль конкретної функції 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);
Имя файла: Функции-.pptx
Количество просмотров: 98
Количество скачиваний: 0