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

binar.

Interclasare.

Sortare

prin

+
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
alocare a memoriei

Tipuri

ntregi

existente

Statice

Reale

Dinamice

Caracter

Masiv

Articol

Fiier

Dup

numrul de
valori memorate

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
refereniere

Operator de
refereniere

&

Extrage adresa unei


variabile

&a

Operator de
derefereniere

Acceseaz zona de
memorie indicat de un
pointer

*p

Definirea de tipuri de dat int*


pointer
float*

int**

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

argument formal
int sum (int a, int b)
{
}

int s;
s=a+b;
return s;

void main()
{
int a, b, s1;
printf("a=");
scanf_s("%d",&a);
argument actual
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)
{
variablila locala
int s;

s=a+b;
return s;

+
Subprograme
#include <stdio.h>
int x;

void f1 ()
{
x++;
}
void f2 ()
{
x=x+5;
}

variablila globala

void main()
{
printf("x=%d
x=7;
printf("x=%d
f1();
printf("x=%d
f2();
printf("x=%d
}

\n",x);

\n",x);
\n",x);
\n",x);

+
Transmiterea parametrilor

Prin parametri

prin valoare

prin adres

Prin variabile globale

+
Transmiterea parametrilor
#include <stdio.h>
int sum(int a, int b)
{
int s;
s=a+b;
return s;

}
void main ()
{

int x=10,y=15, s;
s=sum(x,y);
printf("x=%d y=%d \n",x,y);
printf("sum=%d",s);

#include <stdio.h>
void sum(int a, int b, int *s)
{
*s=a+b;
}
void main ()
{
int x=10,y=15, s;
sum(x,y,&s);
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* *a;
Alocare

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

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 dinamic a memoriei
// funcia care determin vnzrile medii
pentru m firme de panificaie (n
produse)
void med1(float **a, float **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:
float *v;
med1(vanz,&v,m,n);

Afisare i eliberare memorie:


for(i=0;i<m;i++)
printf("v[%d]=%f\n",i,v[i]);
free(v);
for(i=0;i<m;i++)
free(vanz[i]);
free(vanz);

+
Alocarea dinamic a memoriei
float *med2(float **a, int m,int n)
{
int i, j,k;
float *v;
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;
}
return v;
}

Apel:

float *v;
v=med2(vanz,m,n);

Afisare i eliberare memorie:

for(i=0;i<m;i++)
printf("v[%d]=%f\n",i,v[i]);
free(v);
for(i=0;i<m;i++)
free(vanz[i]);
free(vanz);

+
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

int ** produs1(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=produs1(a,b,m,p,n);
.
}

+
Alocarea dinamic a memoriei
void produs2(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;
.
produs2(a,b,m,p,n,&d);
.
}

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