Sunteți pe pagina 1din 21

Algoritmi si tehnici

de programare
- curs 2-

Pointeri la funcii
1.

2.
3.
4.

5.

Introducere
Declararea unui pointer la o functie
Pointeri la functii
Vectori de pointeri la funcii
Parametru tip pointer la funcie

1. Introducere
Se pot declara pointeri ctre:
orice tip de date (standard in C si pe care le definite de utilizator)
funcii pointerii pot fi folositi pentru a transmite functii ca parametri
pentru alte functii

Numele unei funcii poate fi folosit ca pointer constant (asemntor masivelor)


Semnificaia:
adresa din memorie unde se afl codul executabil al subprogramului

respectiv

Tipul:
Pointer ctre un subprogram care primete o anumit list de parametri i

ntoarce un anumit tip de rezultat

Utilizare:
Transmiterea subprogramelor ca parametri pentru alte subprograme
3

2. Declararea unui pointer la o functie


Declarare:
tip_functie (*nume_pointer_la_functie) (tip_parametru1,
tip_parametru2, ...);

Exemplu:
float (*pointerFct) (int a, int b);

Parantezele din jurul lui *pointerFct - sunt necesare,


compilatorul va intelege declaratia ca o declaratie de
functie care returneaza un pointer la float.
4

Etape

Pas: 1 Scrierea functiei spre care sa se pointeze

Pas: 2 Declararea unei variabile de tip procedural


(pointer spre funcie)

Pas 3: Descrierea funciei care utilizeaz parametrii


procedurali

Pas 4: Apelul funciei cu parametri procedurali

Rol nume functie


void Afisare(int nrAfisat)
{}
Afisare pointer ctre o funcie care primete ca parametru un
ntreg i are rezultat de tip void

float Maxim (float v[], int n, int poz[], int* nr);


{}

Maxim pointer ctre o funcie care primete ca parametri un


vector cu elemente de tip float, un ntreg, un vector cu elemente
ntregi i un pointer ctre ntreg i are rezultat de tip float
6

3.Pointeri la functii

Exemplu 1 Hello world ! si


Nr.
void HelloWorld1 (char *mesaj)
{
printf("Hello %s !\n", mesaj);

//apelul functiei prin intermediul pointer-ului


functionPointer1(sir); //variabila citita in main
functionPointer1("world"); // valoare data in apelul
functiei

void HelloWorld2 (int nrAfisat)


{ printf("Afisare numar functie: %d\n", nrAfisat); }

void main()
{ int t=10;
char *sir= "world";

//atribuirea adresei functiei spre care pointeaza;


functionPointer2= &HelloWorld2; //sau fara &

//declararea pointer-ului
void (*functionPointer1)(char *m);

//apelul functiei prin intermediul pointer-ului


functionPointer2(23); //variabila citita in main
functionPointer2(t); // valoare data in apelul functiei

//atribuirea adresei functiei spre care pointeaza;


functionPointer1= &HelloWorld1; //sau fara &

//declararea pointer-ului
void (*functionPointer2)(int m);

Ce va afisa programul
dupa rulare ?
7

Exemplu 2 functie cu mai multi parametrii


//definim o functie cu doi parametri de tip int si care returneaza void.
void functieUnu(int a, int b)
{ printf ("Functia unu cu doi parametri de tip int: %d si %d.\n", a, b); }
void main(void)
{void (*fctPointer1) (int y, int z);
// adresa primei functii este atribuita pointerului.
fctPointer1 = &functieUnu;
// se apeleaza prima functie
functieUnu(5, 10);
// se apeleaza prima functie prin intermediul pointerului
(*fctPointer1).
// parantezele se pun pentru a se asigura ordinea
operatiilor.
(*fctPointer1) (15, 20);
}

Rezultat

10

Exemplu 3 functie care returneaza un intreg

float functie (float a, float b)

int r=0; //instructiuni;


return r;
}

void main(){
int x;
float (*pf)(float, float);
pf=functie;
x=(*pf)(1,2);
printf(Rezultatul este %d, x);}

11

Este corect ?
float functie (float a, float b)
{
float r=0; //instructiuni;
return r;
}
int main(){
float x;
float (*pf)(float, float);
pf=functie;
x=(*pf)(1,2);
printf("Rezultatul este %f", x);
getch();
}

Tipul pt. r si x trebuie sa fie float !

4.Vectori de pointeri la funcii


Exemplu 4 Sortare vector utilizand un pointer la functia de
sortare
Sa se sorteze elementele unui vector in ordine crescatoare.
Operatia se va realiza intr-un subprogam. Rezultatul va fi
obtinut in functia main:
- prin apelul direct al functiei care sorteaza vectorul
- prin crearea unui pointer la funcia care sorteaza
elementele vectorului.

12

Exemplu 4 - Rezolvare

#include<stdio.h>
#include<conio.h>

void sortareV (float v[], int n)


{ int i,j; float aux;

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)

if (v[i]>v[j]) { aux=v[i]; v[i]=v[j];


v[j]=aux; } }

void citireV(float v[], int m)

{ int i;

for (i=0;i<m;i++)

{ printf ("v[%d]= ",i);

scanf("%f", &v[i]); } }

void afisareV (float v[], int m)

{ int i;

for (i=0;i<m;i++)

printf ("v[%d]= %5.2f", i, v[i]);}


13

void main()
{ void (*pointerSort)(float x[], int m);
//nu conteaza x si m
int n; float z[10];

printf("Dati dim. Vect. =");


scanf("%d",&n);
citireV (z,n);
afisareV (z,n);
pointerSort=&sortareV;
// sortareV(z,n);
// afisareV(z,n);
printf("\n");

(*pointerSort)(z,n);
afisareV(z,n);
}

Vector de pointeri la funcii

Exemplu 1

S se creeze un vector de pointeri la funcii care sorteaza


crescator si descrescator elementele unui vector i
afieaz rezultatul operaiilor.
Se va scrie i un exemplu de utilizare a vectorului de
pointeri la funcii.

14

Rezolvare (1)

#include<stdio.h>
#include<conio.h>
void sortareCresc (float v[], int n)
{ int i,j; float aux;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (v[i]>v[j]) { aux=v[i]; v[i]=v[j]; v[j]=aux;
}}
void sortareDescr (float v[], int n)
{ int i,j; float aux;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (v[i]<v[j]) { aux=v[i]; v[i]=v[j]; v[j]=aux; }
}

15

void citireV(float v[], int m)


{ int i;
for (i=0;i<m;i++)
{ printf ("v[%d]= ",i);
scanf("%f", &v[i]);
}
}
void afisareV (float v[], int m)
{ int i;
for (i=0;i<m;i++)
printf ("v[%d]= %5.2f", i, v[i]);
}

Rezolvare (2)

void main()
{ void (*pointerSort[2])(float x[], int m);
//nu conteaza x si m
int n,i;
float z[10];

printf("Dati dimensiunea vectorului =");


scanf("%d", &n);

citireV (z,n);
afisareV (z,n);
printf("\n");
printf("\n");

16

pointerSort[0]=sortareCresc;

pointerSort[1]=sortareDescr;

for(i=0;i<2;i++)

{ (*pointerSort[i])(z,n);

afisareV (z,n);

printf("\n");

}
}

Exemplu 2
S se creeze un vector de pointeri la funcii care
calculeaz i afieaz rezultatul operaiilor de:
- adunare;
- scdere;
- nmulire;
- mprire
a dou numere reale.

Se va scrie i un exemplu de utilizare a vectorului


de pointeri la funcii.
17

5. Parametru tip pointer la funcie i utilizare


Funcie cu parametru procedural
void f(, tip_rezultat (*nume)(lista_parametri_formali), )

{tip_rezultat x; //.
x=(*nume)(lista_parametri_actuali); // }
Apel funcie cu parametru procedural
tip_rezultat nume_functie(lista_parametri_formali) {}
void main()
{
f(,nume_functie,);
}
18

Exemplu metoda bisectiei

n, eps
x1

19

x1

x2

Antet functie
float ecuatie(float x)
{ return x*x*x-3*x+14;}
int bisectie( float x1, float x2,

float eps, int n,

float (*f)(float),

float *x)
{}

20

Tema

Tema Metoda Tangentei

21

S-ar putea să vă placă și