Sunteți pe pagina 1din 32

Algoritmi i tehnici de programare

Cursul 1

Cuprins

Introducere Evaluare Prezentare curs Bibliografie Alocarea dinamica a memoriei Pointeri la funcii

Evaluare
Din oficiu 10 puncte Examen 50 de puncte Proba practic pe calculator 30 puncte Teme rezolvate la seminar 10 puncte

Prezentare curs
1.

Curs introductiv. Cunoatere, prezentarea obiectivelor i competenelor urmrite, a metodelor de lucru, surselor de documentare i a cerinelor de evaluare. Pointeri la funcii. Iterativitate i recursivitate. Subprograme recursive. Metoda Divide et Impera. Cutare secvenial i binar. Interclasare. Sortare prin interclasare. Fiiere de date. Organizarea extern a datelor n fiiere . Algoritmi de prelucrare cu fiier conductor. Fiiere n C. Prelucrarea masivelor memorate n fiiere binare. Fiiere de date. Algoritmi de prelucrare a fiierelor binare organizate secvenial Fiiere de date. Algoritmi de prelucrare a fiierelor binare organizate relativ. Algoritmi de prelucrare a fiierelor binare organizate indexat

2.

3. 4.

5.

6.

7.

Prezentare curs
8. 9. 10. 11. 12.

Grafuri. Definiii, reprezentri i parcurgeri.

Conectivitate. Drumuri n graf.


Grafuri ponderate. Drumuri de cost minim. Sortare rapid. Sortare Heap. Sortarea prin numrare. Grafuri arbore. Metoda Greedy. Exemplificare pentru calculul arborelui parial de cost minim.

13.

Metoda Backtracking. Exemplificare n cazul problemei generrii tuturor permutrilor unei mulimi, respectiv a problemei celor 8 regine.
Recapitularea temelor abordate.

14.

Bibliografie
1.

I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, Programarea calculatoarelor. Algoritmi n programare, Editura ASE Bucureti, 2007 C. Uscatu, M. Popa, L. Btgan, C. Silvestru, Programarea calculatoarelor. Aplicaii, Editura ASE Bucureti 2012 Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest, Introducere n algoritmi, Computer Libris Agora, 2000 D. Knuth, Arta programrii calculatoarelor, vol. 1-3, Ed. Teora, 1999, 2000, 2001

2. 3. 4.

Elementele ale limbajului C


Tipuri de date
unsigned char [signed] char unsigned [int] [signed] [int] unsigned long [signed] long [int] float double long double

Elementele ale limbajului C

Dup modul de alocare a memoriei


Statice Dinamice

Dup numrul de valori memorate


Simple Structurate

Tipuri existente ntregi Reale Caracter Masiv Articol Fiier Pointer Referin

Elementele ale limbajului C

Instruciuni :
instruciunea vid, instruciunea expresie if switch while do-while for

Elementele ale limbajului C


Operator + -++ + * / / % Semnificaie operaie Schimbare semn Pstrare semn (nici un efect, nu este folosit) Decrementare (post sau pre) Incrementare (post sau pre) Adunare Scdere nmulire mprire mprire ntreag (ctul) mprire ntreag (restul)

Elementele ale limbajului C


Operator ! && || > >= < <= == != Semnificaie operaie
Negare i logic Sau logic Mai mare Mai mare sau egal

Mai mic Mai mic sau egal Egal Diferit

Elementele ale limbajului C


Operatori specifici pointerilor

Nume Operator de refereniere Operator de refereniere Operator de derefereniere

Simbol * & *

Rol

Utilizare int* int** &a *p

Definirea de tipuri de dat tip * pointer float* Extrage adresa unei variabile Acceseaz zona de memorie indicat de un pointer

Pointeri
Un pointer este o variabila care are ca valori adrese. Pointerii se folosesc pentru a face referire la datele cunoscute prin adresele lor.

int* p, x; x = 4; p = &x; *p = x; p are ca valoare adresa lui x *p reprezinta chiar valoarea lui x

Pointeri

Noiunea de pointer joac un rol important n: subprograme transmiterea parametrilor; alocarea dinamica a memoriei; lucrul cu masive.

Subprograme

Forma general subprogram:


tip_rez nume ([lista parametrilor formali]) { declaraii; instructiuni ; //corp suprogram }

Un subprogram poate fi apela folosind o construcie de forma:


nume ([lista parametrilor actuali]);

Transmiterea parametrilor
Prin variabile globale Prin parametri

prin valoare prin adres

Alocarea dinamica a memoriei

Se include fiierul antet:


malloc.h

Funcii importante:
malloc() tip *p; p = (tip*) malloc(dimensiune); free free(p);

Alocarea dinamica a memoriei


Legtura dintre vectori i pointeri


int *p; *(p+5) p[5]

Legtura dintre matrice i pointeri


int **a; *( *(a+2)+3) a[2][3]

Alocarea dinamica a memoriei


Vector alocat dinamic Declarare

Matrice alocate dinamic Declarare

tip* p; Alocare p = (tip*) malloc( n * sizeof(tip)); Utilizare *(p+i) Eliberare (dezalocare) free(p);

tip* *a; Alocare


a = (tip**) malloc(m*sizeof(tip*)); for(i=0;i<m;i++) *(a+i)=(tip*) malloc(n*sizeof(tip)); Utilizare *(*(a+i)+j) Eliberare (dezalocare) for(i=0;i<m;i++) free(a[i]); free(a);

Alocarea dinamica a memoriei


float * med(float **a, int m, int n, int *k) { int i, j; float *v; float s; *k=0; for(i=0;i<m; i++) { s=0; for(j=0;j<n; j++) s=s+*(*(a+i)+j); s=s/n; if (s>500) (*k)++; } v=(float *) malloc((*k)*sizeof(float *)); int l=0; for(i=0;i<m;i++) { s=0; for(j=0;j<n;j++) s=s+*(*(a+i)+j); if (s/n>500) {v[l]=s/m;l++;} } return v; }

Alocarea dinamica a memoriei


int ** produs(int **a, int**b, int m, int p, int n) {int i, j,k; int **c; c=(int **) malloc (m*sizeof(int*)); for(i=0;i<m;i++) c[i]=(int *) malloc(p*sizeof(int)); for(i=0;i<m;i++) for(j=0;j<p;j++) c[i][j]=0; for(i=0;i<m;i++) for(j=0;j<p;j++) { for(k=0;k<n;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } return c; } void main() { . int **d; . d=produs(a,b,m,p,n); . }

Alocarea dinamica a memoriei


void produs(int **a, int**b, int m, int p, int n,int ***c) {int i, j,k; *c=(int **) malloc (m*sizeof(int*)); for(i=0;i<m;i++) (*c)[i]=(int *) malloc(p*sizeof(int)); for(i=0;i<m;i++) for(j=0;j<p;j++) {(*c)[i][j]=0; for(k=0;k<n;k++) (*c)[i][j]=(*c)[i][j]+a[i][k]*b[k][j] ; } } void main() { . int **d; . produs(a,b,m,p,n,&d); . }

Pointeri la funcii

Pointerii la funcii se utilizeaz pentru transmiterea funciilor ca parametri ai altor funcii. Exemplu :
Dac dorim ca funcia f s apeleze funcia g sub forma f(g), funcia g avnd antetul:
float g(int x)

atunci antetul funciei f trebuie s fie de forma:


double f (float (*) (int))

Pointeri la funcii
Numele unei funcii poate fi folosit ca pointer constant (asemntor masivelor) Semnificaia: adresa din memorie unde se afl codul executabil al subprogramului respectiv Tipul: Pointer ctre un subprogram care primete o list de parametri i ntoarce un anumit tip de rezultat Utilizare: Transmiterea subprogramelor ca parametri pentru alte subprograme

Pointeri la funcii

Funcia care sorteaz elementele unui vector Tipul sortrii se stabilete printr-o funcie care este trimis ca parametru funciei de sortare
void sorteaza(float v[], int n, int (*dir)(int, int));

Pointeri la funcii
int asc(int a, int b) { if (a > b) return 1; else return 0; } int desc(int a, int b) { if (a < b) return 1; else return 0; }
void schimba(int *a, int *b) { int aux = *a; *a = *b; *b = aux; }

Pointeri la funcii
void sorteaza(int v[], int n, int (*dir)(int, int)) { for (int i=0; i < n -1; i++) { for (int j = i; j < n; j++) { if ((*dir)(v[i], v[j])==1) { schimba(&v[i], &v[j]); } } } }

Pointeri la funcii

Apel void main() {


int x[10], n;

...
sorteaza(x, n, asc);

sau
sorteaza(x, n, desc);

Pointeri la funcii

Metoda biseciei pentru rezolvarea unei ecuaii transcendenete

sol

Pointeri la funcii
float fct(float x) {

return x*x-4*x+3;
}

Pointeri la funcii
void bisectie(float a, float b, long n, float eps, float (*f)(float), int * cod, float *sol) { *cod = 0; if ((*f)(a)*(*f)(b)<=0) while ((n) && (*cod==0)) { *sol=(a+b)/2; if ((*f)(*sol)==0) *cod=1; if (fabs(a-b)<=eps) *cod=2; else if((*f)(*sol)*(*f)(a)<0) b=*sol; else a=*sol; n--; } }

Pointeri la funcii
void main() { float a,b,eps,x; int cod; long n; printf("captele intervalului:"); scanf("%f %f",&a, &b); printf("eroarea admisa:"); scanf("%f",&eps); printf("numarul maxim de iteratii:"); scanf("%li",&n); bisectie(a, b, n, eps, fct, &cod, &x); if (cod==0) printf("nu se poate calcula solutia aproximativa"); else printf("solutia aproximativa este:%5.2f",x); }