Sunteți pe pagina 1din 37

?? ?

Pointeri la funcii (subprograme)

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

adresa din memorie unde se afl codul executabil al

subprogramului respectiv

Tip
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

Pointeri la funcii (subprograme)

Exemplu
void sortare(float v[], int n);
sortare pointer ctre o funcie care primete ca parametri un vector cu elemente float i un ntreg i are rezultat de tip void

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


minim pointer ctre o funcie care primete ca parametri un vector cu elemente float, un ntreg, un vector cu elemente ntregi i un pointer ctre ntreg i are rezultat de tip float

Pointeri la funcii (subprograme)

Declarare variabil/parametru tip pointer la funcie i utilizare


void sortare(float v[], int n); float minim(float v[], int n, int poz[], int* nr);
void main() { int dim; float a[100]; int unde[100], cite; void (*p)(float v[], int n); float (*q)(float v[], int n, int poz[], int* nr); p = sortare; q = minim; sortare(a,dim); // (*p)(a, dim); p(a, dim); minim(a,dim,unde,&cite); // (*q)(a,dim,unde,&cite); }

Pointeri la funcii (subprograme)

Exemplu
Metoda biseciei pentru rezolvarea unei ecuaii

f(x)

n, eps x1 x x2

Pointeri la funcii (subprograme)


#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("\na="); scanf("%f",&a); printf("\nb="); scanf("%f",&b); printf("\nprecizia="); scanf("%f",&prec); printf("\nnr="); 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); }

Recursivitate

Algoritmi iterativi Algoritmi recursivi


Recursivitate simpl (algoritm unirecursiv) Recursivitate multipl (algoritm multirecursiv)

Formul de start (una sau mai multe) Formul recursiv

Exemple

Numrarea valorilor care ndeplinesc o condiie Suma elementelor unui vector Algoritmul lui Euclid irul lui Fibonacci

Recursivitate, subprograme recursive

Un algoritm fie iterativ sau recursiv poate fi implementat printr-un subprogram fie iterativ, fie recursiv Subprogram recursiv: genereaz (cel puin) un apel ctre el nsui
Recursivitate direct Simpl Multipl Recursivitate mutual

Implicaii
Mod de construire a subprogramelor
Necesar de memorie

Recursivitate, subprograme recursive

Construcia subprogramelor recursive


S asigure respectarea caracterului finit al algoritmului: ieirea dup un

numr finit de pai

Condiie de oprire a generrii de noi apeluri Aplicarea formulei de start dac e ndeplinit condiia Aplicarea formulei recursive n caz contrar

long factorial( unsigned n ) { long f; if ( !n ) f = 1; else f = n*factorial( n-1); return f; }

Recursivitate, subprograme recursive


apelator

Necesarul de memorie

fact(3)

t1 fact(3) 3*fact(2) t2 fact(2)

t1

t2

t3

t4

Stiva Adresa de revenire 3 f Adresa de revenire 2 f Adresa de revenire 1 f Adresa de revenire 0 f

2 * fact(1)
t8

t3 fact(1) 1 * fact(0) t4 fact(0) 1

t7

t6

1*1=1
t5

t5

2*1=2 3*2=6 6 t8 t7

t6

Recursivitate, subprograme recursive

fib(n) = fib(n-1) + fib(n-2), fib(1) = fib(0) = 1 fib( 4 ) fib( 3 ) fib( 2 ) fib( 1 ) 1 fib( 0 ) 1 2 fib( 1 ) 1 3 fib( 2 ) fib( 1 ) 1 fib( 0 ) 1

2 6

Recursivitate, subprograme recursive

Cnd alegem subprograme iterative / recursive?


Avantaje i dezavantaje Consum memorie Timp de execuie Uurin n proiectare / implementare
Lungime cod surs

Recursivitate, subprograme recursive

Consideraii generale

Fiecare apel recursiv trebuie aplicat unei probleme mai simple dect n pasul anterior Rezult o metod simpl de oprire a generrii de noi apeluri

Cum se transform un subprogram iterativ n unul recursiv?


1. instruciunea iterativ dispare 2. condiia de la instruciunea iterativ devine (eventual modificat)

condiie de oprire a generrii de noi autoapeluri 3. Repetarea este asigurat prin autoapel Exemplu: metoda biseciei

Recursivitate, subprograme recursive

Calculul combinrilor de n luate cte k


k Cn

n! k ! n k !

k k k 1 Cn Cn 1 C n 1

0 Cn 1

Ckk 1

long comb(unsigned n, unsigned k) { long c; if (k>n) c = 0; else if ((k==0)||(k==n)) c = 1; else c = comb(n-1,k) + comb(n-1,k-1); return c; }

Recursivitate, subprograme recursive

Suma elementelor unui vector S(n) = x[n-1] + S(n-1),

S(0) = 0

double suma(double v[], int n) { double s; if( n == 0) s = 0; else s = v[n-1] + suma(v, n-1); return s; }

Produsul elementelor unui vector

Recursivitate, subprograme recursive

Cutarea binar int cauta(float v[], int p, int u, float k) { int m; if (p > u) m = -1; else { m = (p + u) / 2; if(k < v[m]) m = cauta(v, p, m-1, k); else if(k > v[m]) m = cauta(v, m+1, u, k); } return m; }

Recursivitate, subprograme recursive


int bisectie( float x1, float x2, float eps, int n, float Metoda biseciei (*f)(float), float *x) { int int cod; bisectie( float x1, float x2, float eps, int n, if ( n == 0 ) float (*f)(float), float *x) 0; = 0; { cod int =cod else while ((n > 0) && (cod == 0)) { *x = (x1 + x2) / 2; { *x = (x1 == + x2) if((*f)(*x) 0) / 2; if((*f)(*x) == 0) cod = 1; else cod = 1; else if((x2-x1) < eps) if((x2-x1) < eps) cod cod = 2; = 2; else else { if( if((*f)(x1)*(*f)(*x)<0) (*f)(x1) * (*f)(*x) < 0 ) x2 = *x; x2 = *x; else else x1 = *x; x1 = *x; n--; n--; } cod = bisectie( x1, x2, eps, n, f, x ); return cod; if((*f)(x1)*(*f)(*x)<0) } } cod = bisectie( x1, *x, eps, n-1, f, x ); return cod; else cod = bisectie( *x, x2, eps, n-1, f, x ); }

Recursivitate, subprograme recursive

Teme:
Numrul Produs

de elemente negative dintr-un vector

scalar ntre doi vectori lui Euclid

Algoritmul

Calculul
Metoda

c.m.m.d.c.
tangentei turnurilor din Hanoi

Problema

Sortarea

unui vector

Biblioteci de subprograme

Bibliotec: colecie de subprograme, grupate ntr-un singur fiier (compilat) Scop


Reutilizarea codului n mai multe aplicaii

Distribuirea ctre ali utilizatori

Tipuri
cod surs, cod binar

statice, dinamice

Biblioteci de subprograme

Variante de lucru
n mod comand cl.exe - compilator lib.exe - manager de biblioteci link.exe - editor de legturi n mediul de programare (IDE) Visual Studio n aceeai soluie (mai multe proiecte) n soluie independent

Biblioteci de subprograme: statice

Codul subprogramelor utilizate este inclus n executabil Extensie


Windows: Linux:

.lib .a

Avantaje
Un singur fiier executabil Din bibliotec se extrage doar codul subprogramelor apelate

Dezavantaje
Dimensiune (mai) mare a fiierului executabil Fiecare executabil va include propria copie a subprogramelor din

bibliotec

Biblioteci de subprograme: statice

Fiiere cod surs (.c, .cpp, .h)

Compilare

Fiiere cod obiect (.obj)

Manager biblioteci

Biblioteci cod obiect (.lib)

Fiiere cod surs (.c, .cpp, .h)

Compilare

Fiiere cod obiect (.obj)


Editare de legturi

Cod binar executabil (.exe)

Biblioteci cod obiect (.lib)

Biblioteci de subprograme: statice


#include <stdio.h> #include <malloc.h> //alocare dinamica matrice #include "matrice.h"

// I - nr. linii, nr. coloane

// E - adresa //citire matricematricei patrata cu alocare // I - **aloca_matrice(int m, int n); double // E - adresa matrice, dimensiune double** citire_matrice(int *m) //dezalocare matrice dinamica { int i,j; // I - adresa matricei, nr. linii double** a; // E - adresa matricei (NULL) printf_s("\n\nDimensiune: "); #include double** <stdio.h> dezalocare_matrice(double **a, int m); scanf_s("%d",m); #include <conio.h> a=new double*[*m]; #include //produs "matrice.h" matrice patrate de dimensiuni egale, prealocate for(i=0;i<*m;i++) // I - a, b, n a[i]=new double[*m]; void main() // E - c for(i=0;i<*m;i++) { double** a; for(j=0;j<*m;j++) void produs_mpn(double** a, double **b, int n, double** c); int m,n; { printf_s("a[%d,%d]= ",i,j); scanf_s("%lf",&a[i][j]); //copiaza matrice prealocate a=citire_matrice(&m); // I - a, m, }n afisare_matrice(a,m); return a; // E - b } _getch(); void copiaza(double** a, int m, int n, double** b); } //afisare matrice patrata //citire matrice patrata cu alocare // I - adresa matrice, dimensiune // EI -// // E afisare_matrice(double** - adresa matrice, dimensiune void a, int m) { int i,j; citire_matrice(int *m); double** //cout<<"\nMatricea este: \n"; for(i=0;i<m;i++) //afisare matrice patrata { I for(j=0;j<m;j++) // - adresa matrice, dimensiune printf_s("%10.6lf ",a[i][j]); // E printf_s("\n"); void afisare_matrice(double** a, int m); } printf_s("\n"); }

Fiiere surs
antet test

implementare

matrice.h matrice.cpp test.cpp

Biblioteci de subprograme: statice

n mod comand
Se creeaz un director nou pentru proiect n care se salveaz cele 3

fiiere
Se execut vcvars32.bat, aflat in subdirectorul bin al Visual Studio
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin

cl -c matrice.cpp matrice.obj lib matrice.obj /out:matrice.lib matrice.lib cl test.cpp matrice.lib test.exe

Biblioteci de subprograme: statice

n IDE creare bibliotec binar


Se creeaz un proiect nou de tip Win32 Console Application

numele soluiei: BSIDE, al proiectului: matrice


n fereastra Application settings se alege

Application type: Static library Additional options: Empty project, fr Precompiled headers
Se adaug la proiect fiierele surs (antet i implementare) Se compileaz soluia (Build) n directorul BSIDE\Debug se va genera biblioteca binar

numele bibliotecii: matrice.lib

Biblioteci de subprograme: statice

n IDE utilizare bibliotec binar n aceeai soluie


Se creeaz un proiect nou de tip Win32 Console Application

numele proiectului: Test, se adaug la soluia matrice n fereastra Application settings se alege Application type: Console Application Additional options: Empty project, fr Precompiled headers Se adaug la proiect fiierul surs (cu funcia main) Project > Properties > Common Properties > Framework and References > Add New Reference > matrice Project > Properties > Configuration Properties > C/C++ > General > Additional Include Directories > calea ctre matrice.h Project > Set As StartUp Project Se compileaz soluia (Build) Se lanseaz n execuie din IDE sau separat Test.exe se afl n BSIDE\Debug

Biblioteci de subprograme: statice

n IDE utilizare bibliotec binar n alt soluie


Se creeaz un proiect nou de tip Win32 Console Application

numele soluiei (i al proiectului): TestS n fereastra Application settings se alege Application type: Console Application Additional options: Empty project, fr Precompiled headers Se adaug la proiect fiierul surs (cu funcia main) Se copiaz n directorul proiectului fiierele matrice.h i matrice.lib Project > Properties > Configuration Properties > Linker > Input > Additional Dependencies > se adaug matrice.lib Se compileaz soluia (Build) Se lanseaz n execuie

Biblioteci de subprograme: dinamice

Codul subprogramelor utilizate este separat de executabil Extensie


Windows: Linux:

.dll .so

Avantaje
Dimensiune (mai) mic a executabilului Biblioteca este utilizat n paralel de mai multe aplicaii

Dezavantaje
Mai multe fiiere (executabil + biblioteci dinamice)
Timp suplimentar la execuie Asigurarea accesului la bibliotec (calea curent, PATH)

Biblioteci de subprograme: dinamice

Fiiere cod surs (.c, .cpp, .h) Fiiere cod surs (.c, .cpp, .h)

Compilare

Fiiere cod obiect (.obj) Tabela de import (.lib) Fiiere cod obiect (.obj)

Editare de legturi

Biblioteci dinamice (.dll)

Compilare

Editare de legturi

Biblioteci dinamice (.dll)

Cod binar executabil (.exe)

Biblioteci cod obiect (.lib)

Cod binar executabil (.exe)

Biblioteci de subprograme: dinamice

Crearea i utilizarea este asemntoare cu a bibliotecilor statice Diferene


Antetul funciilor trebuie s conin (doar n .h) __declspec(dllexport) La execuie, fiierul .dll trebuie s poat fi gsit (cale cunoscut)

Biblioteci de subprograme: dinamice

n mod comand
Se creeaz un director nou pentru proiect n care se salveaz cele 3

fiiere Se execut vcvars32.bat, aflat in subdirectorul bin al Visual Studio


C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin

cl matrice.cpp /LD matrice.dll, matrice.lib cl test.cpp matrice.lib test.exe

Pentru execuie snt necesare:


text.exe i matrice.dll

Biblioteci de subprograme: dinamice

n IDE creare bibliotec binar


Se creeaz un proiect nou de tip Win32 Console Application

numele soluiei: BDIDE, al proiectului: matrice


n fereastra Application settings se alege

Application type: DLL Additional options: Empty project


Se adaug la proiect fiierele surs (antet i implementare) Se compileaz soluia (Build) n directorul matrice\matrice\Debug se va genera biblioteca binar

fiiere: matrice.dll, matrice.lib

Biblioteci de subprograme: dinamice

n IDE utilizare bibliotec binar n aceeai soluie


Se creeaz un proiect nou de tip Win32 Console Application

numele proiectului: Test, se adaug la soluia matrice n fereastra Application settings se alege Application type: Console Application Additional options: Empty project, fr Precompiled headers Se adaug la proiect fiierul surs (cu funcia main) Project > Properties > Common Properties > Framework and References > Add New Reference > matrice Project > Properties > Configuration Properties > C/C++ > General > Additional Include Directories > calea ctre matrice.h Project > Set As StartUp Project Se compileaz soluia (Build) Se lanseaz n execuie

Biblioteci de subprograme: dinamice

n IDE utilizare bibliotec binar n alt soluie


Se creeaz un proiect nou de tip Win32 Console Application

numele soluiei (i al proiectului): TestD Se copiaz n directorul proiectului fiierele matrice.h i matrice.lib n fereastra Application settings se alege Application type: Console Application Additional options: Empty project, fr Precompiled headers Se adaug la proiect fiierul surs (cu funcia main) Project > Properties > Configuration Properties > Linker > Input > Additional Dependencies > se adaug matrice.lib Project > Properties > Configuration Properties > Debugging > Environment > se adaug calea ctre matrice.dll Se compileaz soluia (Build) Se lanseaz n execuie

Biblioteci de subprograme: dinamice

Comparaie dimensiuni: T E M !
Static (.lib) L.C.
matrice.h matrice.lib matrice.dll test.exe

Dinamic (.dll) IDE ? ? ? L.C. ? ? ? ? IDE ? ? ? ?

? ? ?

Cnd folosim biblioteci? Cnd folosim biblioteci statice / dinamice?

Biblioteci de subprograme: dinamice

Tem
Creai i testai o bibliotec format din funciile necesare

prelucrrii vectorilor
Bibliotec static
Lucrai n mod comand Lucrai n IDE

Bibliotec dinamic
Lucrai n mod comand Lucrai n IDE