8/15/2019 ATP - Curs 2-Pointeri La Functii
1/21
Algoritmi si tehnici
de programare- curs 2-
1
8/15/2019 ATP - Curs 2-Pointeri La Functii
2/21
Pointeri la funcții 1. Introducere
2. Declararea unui pointer la o functie
3. Pointeri la functii
4. Vectori de pointeri la funcţii
5. Parametru tip pointer la funcţie
2
8/15/2019 ATP - Curs 2-Pointeri La Functii
3/21
1. Introducere
3
Se pot declara pointeri către: orice tip de date (standard in C si pe care le definite de utilizator) f uncţii – pointerii pot fi folositi pentru a transmite functii ca parametri
pentru alte functii
Numele unei funcţii poate fi folosit ca pointer constant (asemănător masivelor)
Semnificaţia: adresa din memorie unde se află codul executabil al subprogramului
respectiv
Tipul:
Pointer către un subprogram care primeşte o anumită listă de parametri şi întoarce un anumit tip de rezultat
Utilizare: Transmiterea subprogramelor ca parametri pentru alte subprograme
8/15/2019 ATP - Curs 2-Pointeri La Functii
4/21
2. Declararea unui pointer la o functie
4
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 defunctie care returneaza un pointer la float.
8/15/2019 ATP - Curs 2-Pointeri La Functii
5/21
Etape
5
Pas: 1 Scrierea functiei spre care sa se pointeze
Pas: 2 Declararea unei variabile de tip procedural
(pointer spre funcţie)
Pas 3: Descrierea funcţiei care utilizează parametrii
procedurali
Pas 4: Apelul funcţiei cu parametri procedurali
8/15/2019 ATP - Curs 2-Pointeri La Functii
6/21
Rol nume functie
6
void Afisare(int nrAfisat){…}
Afisare pointer către o funcţie care primeşte ca parametr u un
întreg şi are rezultat de tip void
float Maxim (float v[], int n, int poz[], int* nr);
{…}Maxim pointer către o funcţie care primeşte ca parametri unvector cu elemente de tip float, un întreg, un vector cu elemente întregi şi un pointer către întreg şi are rezultat de tip float
8/15/2019 ATP - Curs 2-Pointeri La Functii
7/21
3.Pointeri la functii
7
Exemplu 1 – Hello world ! siNr.
void HelloWorld1 (char *mesaj){ printf("Hello %s !\n", mesaj); }
void HelloWorld2 (int nrAfisat)
{ printf("Afisare numar functie: %d\n", nrAfisat); }
void main(){ int t=10;
char *sir= "world";
//declararea pointer-ului void (*functionPointer1)(char *m); //atribuirea adresei functiei spre care pointeaza; functionPointer1= &HelloWorld1; //sau fara &
//apelul functiei prin intermediul pointer-ului
functionPointer1(sir); //variabila citita in main
functionPointer1("world"); // valoare data in apelul
functiei
//declararea pointer-uluivoid (*functionPointer2)(int m);
//atribuirea adresei functiei spre care pointeaza;functionPointer2= &HelloWorld2; //sau fara &
//apelul functiei prin intermediul pointer-ului
functionPointer2(23); //variabila citita in main
functionPointer2(t); // valoare data in apelul functiei
}
Ce va afisa programul
dupa rulare ?
8/15/2019 ATP - Curs 2-Pointeri La Functii
8/21
8
8/15/2019 ATP - Curs 2-Pointeri La Functii
9/21
Exemplu 2 – functie cu mai multi parametrii
9
//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);
}
8/15/2019 ATP - Curs 2-Pointeri La Functii
10/21
Rezultat
10
8/15/2019 ATP - Curs 2-Pointeri La Functii
11/21
Exemplu 3 – functie care returneaza un intreg
11
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);}
Este corect ?
Tipul pt. r si x trebuie sa fie float !
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();
}
8/15/2019 ATP - Curs 2-Pointeri La Functii
12/21
4.Vectori de pointeri la funcţii
12
Exemplu 4 – Sortare vector utilizand un pointer la functia desortare
Sa se sorteze elementele unui vector in ordine crescatoare.
Operatia se va realiza intr-un subprogam. Rezultatul va fiobtinut in functia main:
- prin apelul direct al functiei care sorteaza vectorul
- prin crearea unui pointer la funcţia care sorteaza
elementele vectorului.
8/15/2019 ATP - Curs 2-Pointeri La Functii
13/21
Exemplu 4 - Rezolvare
13
#include
#include
void sortareV (float v[], int n)
{ int i,j; float aux;
for(i=0;i
8/15/2019 ATP - Curs 2-Pointeri La Functii
14/21
Vector de pointeri la funcţii
14
Exemplu 1Să se creeze un vector de pointeri la funcţii care sorteaza
crescator si descrescator elementele unui vector şi
afişează rezultatul operaţiilor .
Se va scrie şi un exemplu de utilizare a vectorului de
pointeri la funcţii.
8/15/2019 ATP - Curs 2-Pointeri La Functii
15/21
Rezolvare (1)
15
#include
#include
void sortareCresc (float v[], int n)
{ int i,j; float aux;
for(i=0;i
8/15/2019 ATP - Curs 2-Pointeri La Functii
16/21
Rezolvare (2)
16
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");
• pointerSort[0]=sortareCresc;
•
pointerSort[1]=sortareDescr;
•
• for(i=0;i
8/15/2019 ATP - Curs 2-Pointeri La Functii
17/21
Exemplu 2
17
Să se creeze un vector de pointeri la funcţii carecalculează şi afişează rezultatul operaţiilor de:
- adunare;
- scădere;
- înmulţire;
- împărţire
a două numere reale.
Se va scrie şi un exemplu de utilizare a vectorului
de pointeri la funcţii.
8/15/2019 ATP - Curs 2-Pointeri La Functii
18/21
5. Parametru tip pointer la funcţie şi utilizare
18
Funcţie cu parametru procedural void f(…, tip_rezultat (*nume)(lista_parametri_formali), …)
{tip_rezultat x; //…. x=(*nume)(lista_parametri_actuali); //… }
Apel funcţie cu parametru procedural tip _rezultat nume_functie(lista_parametri_formali) {…}
void main()
{… f(…,nume_functie,…); …}
8/15/2019 ATP - Curs 2-Pointeri La Functii
19/21
Exemplu – metoda bisectiei
19
x1 x2x
n, eps
x1
8/15/2019 ATP - Curs 2-Pointeri La Functii
20/21
Antet functie
20
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)
{…}
8/15/2019 ATP - Curs 2-Pointeri La Functii
21/21
Tema
21
Tema – Metoda Tangentei