You are on page 1of 39

?? ?

Algoritmi i tehnici de
programare

Algoritmi i tehnici de programare

Fia disciplinei (programare.ase.ro, pagina ATP )


Coninut, cunotine anterioare necesare
Bibliografie manual, culegere de probleme
Evaluare
Seminar: 40%
Teme obligatorii (condiie de intrare la p.p.): 10%
Probe practice: 30%

Examen: 50%
Din oficiu: 10%

Diverse
prezen, recuperri, studiu individual, reguli, colaborare

Consultaii
2301, joi 13:30-14:50, vineri 9:00-10:20

Subprograme (continuare)

Pointeri

la funcii (subprograme)

Recursivitate
Biblioteci

de subprograme

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

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, iterativ sau recursiv, poate fi implementat


printr-un subprogram 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

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

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 )

2
6

fib( 1 )
1
fib( 0 )
1

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

Calculul combinrilor de n luate cte k


=>
,

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

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


int bisectie( float x1, float x2, float eps, int n, float (*f)
Metoda
bisec
(float),
float
*x) iei
{ int cod;
int( bisectie(
float x1, float x2, float eps, int n,
if
n == 0 )
float (*f)(float), float *x)
cod
=
0;
{ int cod = 0;
else
{ *x
= (x1((n
+ x2)
/ 2;
while
> 0)
&& (cod == 0))
if((*f)(*x)
==
0)
{ *x = (x1 + x2) / 2;
cod
if((*f)(*x)
= 1;
== 0)
else cod = 1;
else
if((x2-x1)
< eps)
if((x2-x1)
< eps)
cod = 2;
else cod = 2;
else
{ if( if((*f)(x1)*(*f)(*x)<0)
(*f)(x1) * (*f)(*x) < 0 )
x2 =x2*x;
= *x;
elseelse
x1 =x1*x;
= *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

Algoritmul

lui Euclid

Calculul

c.m.m.d.c.

Metoda

tangentei

Problema
Sortarea

turnurilor din Hanoi

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)

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

Compilare

Fiiere cod
obiect
(.obj)

Manager
biblioteci

Biblioteci
cod obiect
(.lib)

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

Fiiere

surs

// E - adresa
//citire
matricematricei
patrata cu alocare
//
I
double **aloca_matrice(int m, int n);
// 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++)
// Ia[i]=new
- a, b,double[*m];
n
void main()
//for(i=0;i<*m;i++)
E - c
{ double** a;
voidfor(j=0;j<*m;j++)
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)
{double**
int i,j; citire_matrice(int *m);
//cout<<"\nMatricea este: \n";
for(i=0;i<m;i++)
//afisare
matrice patrata
//{ Ifor(j=0;j<m;j++)
- adresa matrice, dimensiune
// E - printf_s("%10.6lf ",a[i][j]);
printf_s("\n");
void
afisare_matrice(double** a, int m);
}
printf_s("\n");
}

antet
matrice.h
implementare matrice.cpp
test

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 BSIDE


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)

Compilare

Fiiere cod
obiect
(.obj)

Editare de
legturi

Editare de legturi

Biblioteci
dinamice
(.dll)

Cod binar
executabil
(.exe)

Biblioteci
cod obiect
(.lib)

Biblioteci
dinamice
(.dll)

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 BDIDE\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 BDIDE


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)
matrice.h

Dinamic (.dll)

L.C.

IDE

L.C.

IDE

matrice.lib

matrice.dll

test.exe

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

Spor la nvat!

You might also like