Sunteți pe pagina 1din 32

+

Algoritmi i tehnici de
programare

Cursul 1
+
Cuprins

Introducere
Evaluare
Prezentare curs
Bibliografie

Alocarea dinamic 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
Curs introductiv. Cunoatere, prezentarea obiectivelor i
competenelor urmrite, a metodelor de lucru, surselor de
documentare i a cerinelor de evaluare. Recapitulare: pointeri,
alocare dinamic. 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.
+
Prezentare curs
Algoritmi de prelucrare a fiierelor binare organizate indexat

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.

Metoda Backtracking. Exemplificare n cazul problemei generrii


tuturor permutrilor unei mulimi, respectiv a problemei celor 8
regine.

Recapitularea temelor abordate.


+
Bibliografie
1. C. Uscatu, C. Cocianu, M. Mircea, L. Pocatilu, Algoritmi si tehnici de
programare. Aplicaii, Editura ASE Bucureti 2015

2. . Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M.


Mircea, Programarea calculatoarelor. Algoritmi n programare,
Editura ASE Bucureti, 2007

3. C. Uscatu, M. Popa, L. Btgan, C. Silvestru, Programarea


calculatoarelor. Aplicaii, Editura ASE Bucureti 2012

4. Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest,


Introducere n algoritmi, Computer Libris Agora, 2000

5. D. Knuth, Arta programrii calculatoarelor, vol. 1-3, Ed. Teora,


1999, 2000, 2001
+
Elemente ale limbajului C

Tipuri de date
unsigned char
[signed] char
unsigned [int]
[signed] [int]
unsigned long
[signed] long [int]
float
double
long double
+
Elemente ale limbajului C

Dup modul de Tipuri existente


alocare a memoriei ntregi
Statice Reale
Dinamice Caracter
Masiv
Dup numrul de Articol
valori memorate Fiier
Simple Pointer
Structurate Referin
+
Elemente ale limbajului C

Instruciuni :
if
switch
while
do-while
for
+
Elemente 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)
+
Elemente 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
+
Pointeri
Variabile care au ca valori adrese

Rol important n:
subprograme transmiterea parametrilor;
alocarea dinamica a memoriei;
lucrul cu masive.
+
Pointeri

Operatori specifici pointerilor

Nume Simbol Rol Utilizare


Operator de * Definirea de tipuri de dat int*
refereniere pointer float* int**
Operator de & Extrage adresa unei &a
refereniere variabile
Operator de * Acceseaz zona de *p
derefereniere memorie indicat de un
pointer
+
Pointeri

int* p, x;

x = 4;

p = &x; p are ca valoare adresa lui x

*p = x; *p reprezint valoarea lui x


+
Pointeri

Exemplu:
p
int i=10, *p;
i
p = &i;
+
Subprograme

Forma general subprogram:

tip_rez nume ([lista parametrilor formali])


{
declaraii;
instructiuni ; //corp suprogram
}

Un subprogram poate fi apelat folosind o construcie de


forma:

tip_rez rezultat;
rezultat=nume ([lista parametrilor actuali]);
+
Subprograme

#include "stdio.h" void main()


argument formal
{
int sum (int a, int b) int a, b, s1;
{ printf("a=");
int s;
s=a+b; scanf_s("%d",&a); argument actual
return s; printf("b=");
}
scanf_s("%d",&b);
s1=sum(a,b);
printf("suma_1 este %d\n",s1);
printf("suma_2 este %d\n",sum(2,3));
printf("suma_3 este %d",sum(2*2,3*2+2));

}
+
Subprograme

int sum(int a, int b)


{
int s; variablila locala

s=a+b;
return s;
}
+
Subprograme

#include <stdio.h> void main()


{
int x; variablila globala printf("x=%d \n",x);
x=7;
void f1 () printf("x=%d \n",x);
{ f1();
x++; printf("x=%d \n",x);
} f2();
void f2 () printf("x=%d \n",x);
{ }
x=x+5;
}
+
Transmiterea parametrilor

Prin parametri
prin valoare
prin adres

Prin variabile globale


+
Transmiterea parametrilor

#include <stdio.h> #include <stdio.h>


int sum(int a, int b) void sum(int a, int b, int *s)
{
{
*s=a+b;
int s;
}
s=a+b;
void main ()
return s;
{
} int x=10,y=15, s;
void main () sum(x,y,&s);
{ printf("x=%d y=%d \n",x,y);
int x=10,y=15, s; printf("sum=%d",s);
s=sum(x,y); }
printf("x=%d y=%d \n",x,y);
printf("sum=%d",s);
}
+
Transmiterea parametrilor
prin valoare
#include <stdio.h>
void schimb(int a, int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void main ()
{
int x=10,y=15;
schimb(x,y);
printf("x=%d y=%d \n",x,y);
}
+
Transmiterea parametrilor
prin adresa
#include <stdio.h>
void schimb(int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void main ()
{
int x=10,y=15;
schimb(&x,&y);
printf("x=%d y=%d \n",x,y);
}
+
Alocarea dinamic a memoriei

Se include fiierul antet:


malloc.h

Funcii importante:
malloc()
tip *p;
p = (tip*) malloc(dimensiune);
free()
free(p);
+
Alocarea dinamic 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 dinamic a memoriei
Vector alocat dinamic Matrice alocat dinamic
Declarare Declarare
tip* p; tip* *a;
Alocare Alocare
p = (tip*) malloc( n * sizeof(tip)); a = (tip**) malloc(m*sizeof(tip*));
Utilizare for(i=0;i<m;i++)
*(p+i) *(a+i)=(tip*) malloc(n*sizeof(tip));
Eliberare (dezalocare) Utilizare
free(p); *(*(a+i)+j)
Eliberare (dezalocare)
for(i=0;i<m;i++)
free(a[i]);
free(a);
+
Alocarea dinamic a memoriei
// funcia care determin vnzrile medii Apel:
pentru m firme de panificaie (n
produse) float *v;

void med1(float **a, float **v, int m,int n) med1(vanz,&v,m,n);


{
int i, j,k; Afisare i eliberare memorie:
*v=(float *) malloc (m*sizeof(float *));
for(i=0;i<m;i++) for(i=0;i<m;i++)
{ printf("v[%d]=%f\n",i,v[i]);
(*v)[i]=0; free(v);
for(j=0;j<n;j++) for(i=0;i<m;i++)
(*v)[i]=(*v)[i]+*(*(a+i)+j); free(vanz[i]);
(*v)[i]=(*v)[i]/m; free(vanz);
}
}
+
Alocarea dinamic a memoriei
float *med2(float **a, int m,int n) Apel:
{ float *v;
int i, j,k; v=med2(vanz,m,n);
float *v;
v=(float *) malloc (m*sizeof(float *)); Afisare i eliberare memorie:
for(i=0;i<m;i++)
{ for(i=0;i<m;i++)
v[i]=0; printf("v[%d]=%f\n",i,v[i]);
for(j=0;j<n;j++) free(v);
v[i]=v[i]+*(*(a+i)+j); for(i=0;i<m;i++)
v[i]=v[i]/m; free(vanz[i]);
} free(vanz);
return v;
}
+
Alocarea dinamic a memoriei

typedef float *REZ;


void med3(float **a, REZ *v, int m,int n)
{
int i, j,k;
*v=(float *) malloc (m*sizeof(float *));
for(i=0;i<m;i++)
{
(*v)[i]=0;
for(j=0;j<n;j++)
(*v)[i]=(*v)[i]+*(*(a+i)+j);
(*v)[i]=(*v)[i]/m;
}
}
Apel:
REZ v;
med3(vanz,&v,m,n);
+
Alocarea dinamic a memoriei
//funcie care determin vnzrile medii mai mari de 500 RON
//pentru m firme de panificaie (n produse)
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 dinamic a memoriei
//produsul a doua masive bidimensionale void main()
int ** produs1(int **a, int**b, int m, int
{
p, int n)
{int i, j,k; .
int **c; int **d;
c=(int **) malloc (m*sizeof(int*)); .
for(i=0;i<m;i++)
c[i]=(int *) malloc(p*sizeof(int));
d=produs1(a,b,m,p,n);
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;
}
+
Alocarea dinamic a memoriei
void produs2(int **a, int**b, int m, int p, int n,int void main()
***c) {
{int i, j,k; .
*c=(int **) malloc (m*sizeof(int*)); int **d;
for(i=0;i<m;i++) .
(*c)[i]=(int *) malloc(p*sizeof(int));
for(i=0;i<m;i++) produs2(a,b,m,p,n,&d);
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];
}
}