Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Pointeri spre functii

c



+ Font mai mare | - Font mai mic



Pointeri spre functii

Numele unei functii este un pointer spre functia respectiva. El poate fi folosit ca parametru efectiv la apeluri de functii. In felul acesta, o functie poate transfera functiei apelate un pointer spre o functie. Aceasta, la randul ei, poate apela functia care i-a fost transferata in acest fel.



Exemplu:

Un exemplu matematic in care este nevoie de un astfel de transfer este cel cu privire la calculul aproximativ al integralelor definite. Sa presupunem ca dorim sa calculam integrala definita din functia f(x), intre limitele a si b, folosind formula trapezului:

I= h((f(a)+f(b))/2 +f(a+h)+f(a+2h)+. . . +f(a+(n-1)h)

unde

h=(b-a)/h.

In continuare construim o functie care calculeaza partea dreapta a acestei relatii. Numim aria_trapez aceasta functie.

Observatii:

1o. Deoarece functia f(x) din relatia de mai sus nu este definita in acest moment, ea trebuie sa figureze printre parametrii functiei aria_trapez, impreuna cu limitele de integrare si valoarea lui n.

2o. Functia aria_trapez returneaza valoarea aproximativa a integralei si ea se va apela printr-o expresie de atribuire, de exemplu:

aria=aria_trapez (a, b, n, f);

3o. Functia aria_trapez returneaza o valoare flotanta in dubla precizie. De asemenea, si functia f(x) returneaza o valoare flotanta in dubla precizie. De aici rezulta ca prototipul functiei aria_trapez este urmatorul:

double aria_trapez (double a, double b, int n, double (*f)());

sau

double aria_trapez (double, double, int , double (*)());

4o. Este necesar ca inaintea apelului functiei aria_trapez functia f(x) sa fie definita sau sa fie prezent prototipul ei , de exemplu:

double f();

5o. Constructia double (*f) () se interpreteaza in felul urmator:

- *f     inseamna ca f este un pointer;

- (*f)()    inseamna ca f este un pointer spre o functie;

- double (*f) () inseamna ca f este un pointer spre o functie care returneaza o valoare flotanta in dubla precizie.

6o. Trebuie sa se includa *f intre paranteze, deoarece constructia double *f(); este corecta, dar inseamna altceva, parantezele rotunde fiind prioritare operatorului unar *. In acest caz, se declara f ca o functie ce returneaza un pointer spre o valoare flotanta in dubla precizie.

7o. Ultimul parametru formal al functiei aria_trapez corespunde parametrului efectiv f si deci el trebuie declarat ca si pointer spre o functie ce returneaza o valoare flotanta in dubla precizie. Conform observatiei 5), daca p este numele parametrului formal ce corespunde parametrului efectiv f, atunci p se declara astfel:

double (*p)();

8o. In corpul functiei aria_trapez va trebui sa apelam functia f(x) pentru a calcula valorile:

f(a), f(b), f(a+h), . . . , f(a+(n-1)h).

In momentul programarii functiei aria_trapez, nu se cunoaste numele functiei concrete, ci numai pointerul p spre ea. De aceea, vom inlocui numele functiei prin *p, deci vom folosi apelurile:

(*p)(a), (*p)(b), (*p)(a+h), . . . ,(*p)(a+(n-1)h)

double aria_trapez(double x, double y, int m, double(*p)());

Vom utiliza functia aria_trapez pentru a calcula integrala definita din functia sin(x2) pe intervalul [0,1], cu o eroare mai mica decat 10-8. Vom nota cu In urmatoare suma:

In= h((f(a)+f(b))/2 +f(a+h)+f(a+2h)+. . . +f(a+(n-1)h)

Pasii algoritmului sunt urmatorii:

Pasul 1. Se alege o valoare initiala pentru n, de exemplu 10.

Pasul 2. Se calculeaza In.

Pasul 3. Se calculeaza I2n prin dublarea lui n.

Pasul 4. Daca |In-I2n| < 10-8, algoritmul se intrerupe si valoarea integralei, cu precizia admisa, este I2n; altfel se dubleaza n, se pune In=I2n; n, si se trece la pasul 3.

#define A 0.0

#define B 1.0

#define N 10

#define EPS 1e-8

#include <stdio.h>

#include <math.h>

double sinxp(double); // prototipul functiei sin(x*x)

double aria_trapez(double, double, int, double (*)());

void main (void) // functia principala

while (vabs >= EPS);

printf ("valoarea integralei este : %g.10n",i2n);

double aria_trapez(double x, double y, int m, double(*p)());

double sinxp (double x)



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 799
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved