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

x
1
x
2
n, eps
x

f(x)
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
Necesarul de memorie
apelator
fact(3)
t1
2 * fact(1)
t2
fact(1)
t3
1 * fact(0) t4
t5
fact(0)
fact(3)
3*fact(2)
fact(2)
1
1*1=1
t6 2*1=2
t7 3*2=6
t8 6
Stiva
Adresa de revenire
3
f
t1
t2
t3
t4 t5
t6
t7
t8
Adresa de revenire
2
f
Adresa de revenire
1
f
Adresa de revenire
0
f
Recursivitate, subprograme recursive
fib(n) = fib(n-1) + fib(n-2), fib(1) = fib(0) = 1
fib( 4 )
fib( 3 )
fib( 0 )
fib( 1 )
fib( 2 )
6
3
2
1
1
fib( 1 )
1
fib( 2 )
1
1
fib( 1 )
fib( 0 )
2
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 n ! k
! n
C
k
n

1 k
1 n
k
1 n
k
n
C C C


1
0

n
C
1
k
k
C
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

Metoda biseciei

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;
}


int bisectie( float x1, float x2, float eps, int n, float
(*f)(float), float *x)
{ int cod;
if ( n == 0 )
cod = 0;
else
{ *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--;
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 );
else cod = bisectie( *x, x2, eps, n-1, f, x );
Recursivitate, subprograme recursive
Teme:
Numrul de elemente negative dintr-un vector
Produs scalar ntre doi vectori
Algoritmul lui Euclid
Calculul c.m.m.d.c.
Metoda tangentei
Problema turnurilor din Hanoi
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: .lib
Linux: .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

Editare de legturi
Fiiere cod
surs
(.c, .cpp, .h)
Fiiere cod
obiect
(.obj)
Biblioteci
cod obiect
(.lib)
Fiiere cod
surs
(.c, .cpp, .h)
Cod binar
executabil
(.exe)
Compilare
Manager
biblioteci
Biblioteci
cod obiect
(.lib)
Fiiere cod
obiect
(.obj)
Compilare
Biblioteci de subprograme: statice
Fiiere surs
antet matrice.h
implementare matrice.cpp
test test.cpp
//alocare dinamica matrice
// I - nr. linii, nr. coloane
// E - adresa matricei
double **aloca_matrice(int m, int n);

//dezalocare matrice dinamica
// I - adresa matricei, nr. linii
// E - adresa matricei (NULL)
double** dezalocare_matrice(double **a, int m);

//produs matrice patrate de dimensiuni egale, prealocate
// I - a, b, n
// E - c
void produs_mpn(double** a, double **b, int n, double** c);

//copiaza matrice prealocate
// I - a, m, n
// E - b
void copiaza(double** a, int m, int n, double** b);

//citire matrice patrata cu alocare
// I -
// E - adresa matrice, dimensiune
double** citire_matrice(int *m);

//afisare matrice patrata
// I - adresa matrice, dimensiune
// E -
void afisare_matrice(double** a, int m);
#include <stdio.h>
#include <malloc.h>
#include "matrice.h"

//citire matrice patrata cu alocare
// I -
// E - adresa matrice, dimensiune
double** citire_matrice(int *m)
{ int i,j;
double** a;
printf_s("\n\nDimensiune: ");
scanf_s("%d",m);
a=new double*[*m];
for(i=0;i<*m;i++)
a[i]=new double[*m];
for(i=0;i<*m;i++)
for(j=0;j<*m;j++)
{ printf_s("a[%d,%d]= ",i,j);
scanf_s("%lf",&a[i][j]);
}
return a;
}

//afisare matrice patrata
// I - adresa matrice, dimensiune
// E -
void afisare_matrice(double** a, int m)
{ int i,j;
//cout<<"\nMatricea este: \n";
for(i=0;i<m;i++)
{ for(j=0;j<m;j++)
printf_s("%10.6lf ",a[i][j]);
printf_s("\n");
}
printf_s("\n");
}
#include <stdio.h>
#include <conio.h>
#include "matrice.h"

void main()
{ double** a;
int m,n;

a=citire_matrice(&m);
afisare_matrice(a,m);

_getch();
}
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: .dll
Linux: .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

Editare de legturi
Fiiere cod
surs
(.c, .cpp, .h)
Fiiere cod
obiect (.obj)
Tabela de
import (.lib)
Biblioteci
dinamice
(.dll)
Fiiere cod
surs
(.c, .cpp, .h)
Cod binar
executabil
(.exe)
Compilare
Editare de
legturi
Biblioteci
cod obiect
(.lib)
Fiiere cod
obiect
(.obj)
Compilare
Cod binar
executabil
(.exe)
Biblioteci
dinamice
(.dll)
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 !









Cnd folosim biblioteci?

Cnd folosim biblioteci statice / dinamice?
Static (.lib) Dinamic (.dll)
L.C. IDE L.C. IDE
matrice.h
? ? ? ?
matrice.lib
? ? ? ?
matrice.dll
- - ? ?
test.exe
? ? ? ?
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

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