Documente Academic
Documente Profesional
Documente Cultură
Numele unei funcii poate fi folosit ca pointer constant (asemntor masivelor) Semnificaie
subprogramului respectiv
Tip
Pointer ctre un subprogram care primete o anumit
Utilizare
Transmiterea subprogramelor ca parametri pentru alte
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
Exemplu
Metoda biseciei pentru rezolvarea unei ecuaii
f(x)
n, eps x1 x x2
Recursivitate
Exemple
Numrarea valorilor care ndeplinesc o condiie Suma elementelor unui vector Algoritmul lui Euclid irul lui Fibonacci
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
Condiie de oprire a generrii de noi apeluri Aplicarea formulei de start dac e ndeplinit condiia Aplicarea formulei recursive n caz contrar
Necesarul de memorie
fact(3)
t1
t2
t3
t4
2 * fact(1)
t8
t7
t6
1*1=1
t5
t5
2*1=2 3*2=6 6 t8 t7
t6
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
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
condiie de oprire a generrii de noi autoapeluri 3. Repetarea este asigurat prin autoapel Exemplu: metoda biseciei
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; }
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; }
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; }
Teme:
Numrul Produs
Algoritmul
Calculul
Metoda
c.m.m.d.c.
tangentei turnurilor din Hanoi
Problema
Sortarea
unui vector
Biblioteci de subprograme
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
.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
Compilare
Manager biblioteci
Compilare
// 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
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
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 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
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
.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)
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
Compilare
Editare de legturi
n mod comand
Se creeaz un director nou pentru proiect n care se salveaz cele 3
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
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
Comparaie dimensiuni: T E M !
Static (.lib) L.C.
matrice.h matrice.lib matrice.dll test.exe
? ? ?
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