Sunteți pe pagina 1din 12

ATP

Seminar: 30% - un test – sapt. 7 (4-10 aprilie)


Examen: 70%

Mihaela.gheorghe@ie.ase.ro
Pointeri la funcții
Void functie(…){
V[5]=34;
}
void suma(int v[100], int n, int *s){
*s=0;
For(int i=0;i<n;i++)
*s += v[i];
V[3]=1000;
}
Void main() {
Int v[100],n,s;
//citirea v, n
Suma(v,n,&s);
Functie()…
//afisare vector v -> v[3]=1000; v[5]=34;
}
1.Pointeri spre subprograme
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
Exemple:
void sortare (float v[], int n);
sortare  pointer către o funcţie care primeşte ca
parametri un vector cu elemente float şi un întreg
şi are rezultat de tip void
void insertie (float v[], int n){}
void selectie (float v[], int n){}
void interschimbare (float v[], int n){}

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


float minim(float v[], int n, int poz[], int* nr);
minim  pointer către o funcţie care primeşte ca
parametri un vector cu elemente float, un întreg,
un vector cu elemente întregi şi un pointer către
întreg şi are rezultat de tip float
Declarare variabilă tip pointer la
funcţie şi utilizare
Exemplul 1:
void sortare1(float v[], int n);
void sortare2(float v[], int n);
float maxim(float v[], int n, int poz[], int* nr);
float minim(float v[], int n, int poz[], int* nr);

void main()
{ int n; float v[100];
void (*pf)(float, int); // variabila pointer la functie
float (*q)(float v[], int n, int poz[], int* nr);

pf = sortare1;
q = maxim;
sortare1(v,n); //  (*pf)(v, n);

}
Exemplul 2:
float f(float x, float y){ return x+y;}
void main(){
float a;
float (*pf)(float, float);
pf=f;
a=(*pf)(1,2);
printf(“Rezultatul este %f”, a);
}
Declarare parametru tip pointer
la funcţie şi utilizare
 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,…);}
2. Exemple:
E1.
Fie o funcţie care realizarea sortarea elementelor unui
vector, dupa un anumit criteriu de sortare. Criteriul este
dat de un pointer la o funcţie de comparare, care descrie
relaţia de ordine dintre două elemente.
Să se scrie programul care realizează sortarea elementelor
vectorului după criteriul dat (crescător sau descrescător).
#include <stdio.h>
void sortare (float x[100], int n, int (*sens)(float, float))
{int i,j; float aux;
for(i=0;i<n-1;i++)
for(j=i+1; j<n;j++)
if(!(*sens)(x[i], x[j])){
aux=x[i]; x[i]=x[j];x[j]=aux;}
}
int asc(float a, float b){return (a<b)?1:0;}
int desc(float a, float b){return (a>b)?1:0;}
void afisare(float x[], int n){ int i; for (i=0;i<n;i++) printf("%3.2f,",x[i]);}
//program principal
void main()
{ float x[100]; int n,i;
printf ("n="); scanf("%d", &n);
for(i=0;i<n;i++)
{printf("x[%d]=",i); scanf("%f", &x[i]);}
printf("sortare in sens crescator\n");
sortare(x,n,asc);
afisare(x,n);
printf("\nsortare in sens descrescator\n");
sortare(x,n, desc);
afisare(x,n);}
2. Exemple:
E2
Metoda bisecţiei pentru rezolvarea unei ecuaţii
transcendente

n, eps
x1 x1 x2
#define _CRT_SECURE_NO_WARNINGS //în cazul în care apar avertismente legate de securitate

#include <stdio.h>

float ecuatie(float x)
{ return x*x - 7*x + 12;
}

int bisectie( float x1, float x2, float eps, int n, float (*f)(float), float *x)
{ int cod = 0;
while ((n > 0) && (cod == 0))
{ *x = (x1 + x2) / 2;
if((*f)(*x) == 0) cod = 1;
else if((x2-x1) < eps) cod = 2;
else if((*f)(x1)*(*f)(*x)<0)
x2 = *x;
else x1 = *x;
n--;
}
return cod;
}
void main()
{ float a, b, sol, prec;
int nr, cod;
printf("\n a=");scanf("%f",&a);
printf("\n b=");scanf("%f",&b);
printf("\n precizia=");
scanf("%f",&prec);
printf("\n nr=");scanf("%d",&nr);

cod = bisectie(a,b,prec,nr,ecuatie,&sol);

switch(cod)
{ case 0: printf("\nFara solutie");
break;
case 1: printf("\nSolutia exacta este %7.3f", sol);
break;
case 2: printf("\nSolutia aproximativa este %7.3f", sol);
}
}

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