Sunteți pe pagina 1din 28

Curs 7

Programarea Calculatoarelor si Limbaje de


Programare
- limbajul C -

Conf. Dr. Ioana FIRASTRAU


Sef lucr. Dr. Dana GHITA
Drd. Cristian MUSUROI
Curs 7

Tipuri de date compuse


(structurate)

 Tablouri
 Siruri de caractere
 Structuri

2
Introducere
Memoria interna a calculatorului e organizata ca un ansamblu de celule separate,
care au adrese consecutive.
Memoria externa este un ansamblu de locatii de memorare, numite sectoare, care
au adrese consecutive.
Cea mai mica unitate de memorie care are o adresa este byte-ul.

Datele care se memoreaza pot fi organizate in structuri de date.

O structura de date este o colectie de date sau o metoda de aranjare a datelor,


care sunt dependente unele de altele in cadrul unei aplicatii. Ea este o colectie
de elemente pentru care s-a precizat:
- tipul elementelor
- proprietatile de organizare a elementelor
- regulile de acces la elemente

Componentele unei structuri de date pot fi:


- date elementare
- structuri de date

Componentele unei structuri de date pot fi identificate prin:


- identificatorul (numele) componentei
- pozitia pe care o ocupa componenta in cadrul structurii.
3
Tablouri de date
 Un tablou este o structură omogenă formată dintr-o multime finită de elemente
de acelasi tip, denumit si tip de bază.
informatia este stocată
sub formă matriceală
3.4 3 1.5
sursa principală de
2 2.2 1.9 informatie sunt cifrele
sursa secundară de
3.4 3 2.4 informatie este dată de
relatiile de vecinătate.

Dpdv logic, tabloul e o structura de date omogena si liniara, cu elemente de acelasi


tip. Fiecare element (cu exceptia primului) are un succesor unic, localizarea unui
element din sir se face cu un sistem de indici.
Dpdv fizic, tabloului I se aloca o zona contiguă de memorie (adresele elementelor
tabloului sunt succesive), de dimensiune fixa, care e impartita in locatii de aceeasi
dimensiune.

Adresa de memorie a tabloului = adresa de memorie a primului element al tabloului.


Localizarea unui element al tabloului se face prin calcularea adresei elementului fata de
un element de referinta, adica adresa primului element al tabloului. 4
Tablouri de date

Tipuri de tablouri de date:


- vectori
- matrice bidimensionale
- siruri de caractere
- tablouri n dimensionale

Observatie: însusi modul de reprezentare al datelor în memorie este unul


matriceal, astfel că lucrul cu tablouri de date (definire, manevrare) este eficient si
totodată favorizat.

5
Vectori
Un vector reprezintă o colectie de date de acelasi tip reprezentate sub forma unei
linii sau coloane.

Exemplu [1 3 9 7] 0 1
0 1 2 3 1 3
Datele sunt identificate prin pozitia acestora
2 9
în vector, ce este dată de indice. 3
7

În limbajul C vom folosi primul tip de reprezentare a vectorilor


si anume sub forma unei linii.

Atentie: indicele primului element este întotdeauna 0.

6
Declararea (definirea) unui vector :

tip_date nume_vector[număr elem.];

tipul datelor numele variabilei numărul maxim


continute de vector: de tip vector de elemente
ex.: int, char, float (identificator) ale vectorului

Exemplu:

int x[100]; -variabila x este un vector cu 100


de valori întregi,
float y[50];
-variabila y este un vector cu 50
de valori reale.

Adresa vectorului este data de adresa primului element al vectorului.

7
Modul de alocare a memoriei unui vector:

int x[4]; Aceasta modalitate de alocare a memoriei este de tip static,


sistemul de calcul alocând în memorie numărul specificat de
valori, indiferent dacă acestea vor fi folosite sau nu.
Astfel, se alocă 4 locatii de memorie consecutive de tip int, ce vor corespunde
valorilor vectorului x:

16biti 16biti 16biti 16biti

adr. N adr. N + 1 adr. N + 2 adr. N + 3

Fiecare locatie de memorie este identificata prin adresa sa de memorie.


Pp. ca o data de tip int necesita 2 bytes de memorie. Reamintim, ptr. a afla
dimensiunea in bytes folosim operatorul sizeof(). Aici sizeof(int)=2.

Observatie:
adr. N + 1 semnifica adresa N (primul element al vectorului) + 1*sizeof(int).
De exemplu, daca adr. N = 1000, atunci adr. N + 1 = 1000+1*sizeof(int)= 1000+2=1002.
8
Atribuirea de valori unui vector:

 Accesarea valorilor vectorului

nume_vector[indice]

Ex. int x[4];

x[0], x[1], x[2], x[3] ! 0<=indice<nr. elem.


Indici: 0 1 2 3

123 324 456 100

adr. N adr. N+1 adr. N+2 adr. N+3

 Atribuirea de valori elementelor unui vector se face folosind operatorul de


atribuire “=“, ca la variabile.
x[0]=123;
x[1]=324;
x[2]=456;
x[3]=100;

9
Vector, indice, adresa de memorie, valoare…..

Indici: 0 1 2 3
123 324 456 100
adr. N adr. N+1 adr. N+2 adr. N+3

Fiecare locatie de memorie este identificata prin adresa sa de memorie.

int x[4];
x stochează adresa din memorie a
printf(“%p”, x); primului element din vector (adr. N)

x[2] reprezintă valoarea din a treia


printf(“%d”, x[2]); locatie de memorie a vectorului x  456

operatorul & returnează adresa din


printf(“%p”, &x[3]); memorie a variabilei ce ii corespunde lui x[3], (adr. N+3)

10
Atribuirea de valori unui vector:

tip_date nume_vector[număr elem.] = { lista_valori };

Ex. int a[5]={10, 5, 30, 40, 50}; 10 5 30 40 50


Indici 0 1 2 3 4
int a[ ]={10, 5, 30, 40, 50};

int a[5]={10,20}; 10 5 0 0 0
Indici 0 1 2 3 4

char c[4]={‘a’, ‘b’, ‘c’}; a b c

! 0<=indice<nr. elem. Indici 0 1 2

11
Citirea elementelor unui vector:

Executie:.
int v[10], i;
> v[0]=
for (i=0; i<3; i++) > v[1]=
{ > v[2]=
printf(“v[%d]=”, i);
scanf(“%d”, &v[i]);
}

Observatii: nu este obligatoriu să folosesc toate valorile alocate, în acest caz 10,
pot folosi un număr mai mic, dar nu un număr mai mare  eroare.

Rezultat: v[0]=12, v[1]=45, v[2]=14, v[3]=?, …, v[9]=?, v[10] …

12
Aplicatia 1: Sa se determine maximul elementelor unui vector.

int v[200], i, max, dim; 200 – lungime fizica

printf(“dimensiune vector=”);
scanf(“%d”, &dim); dim – lungime logica

for (i=0; i<dim; i++)


{
printf(“v[%d]=”,i);
scanf(“%d”, &v[i]);
}

max=v[0];
for (i=1; i<dim; i++)
if (v[i]>max)
max=v[i];
printf(“max=%d”,max);

13
Parcurgerea elementelor vectorului

Parcurgerea se face secvential, in ordinea indicilor.

crescator descrescator

int a[10], i, dim; int a[10], i, n;

printf(“dim="); scanf("%d",&dim); printf("n="); scanf(“%d",&n);

for(i=0; i<dim; i++) for(i=n-1; i>=0; i--)


{ {
printf("a[%d]=", i); printf("a[%d]=", i);
scanf("%d",&a[i]); scanf(“%d",&a[i]);
} }

for(i=0; i<dim; i++) for(i=0; i<n; i++)


//alte prelucrari //alte prelucrari

14
Aplicatie: să se calculeze suma a doi vectori de numere reale. Vectorii au acelasi
număr de elemente n(<100). Suma=v1[0]+v2[0]+ … + v1[N]+v2[N]

Variabile de intrare/lucru:
float v1[100], v2[100];

Variabile de iesire:
float suma;

Structura program:
- se citeste dimensiunea dim,
- se citesc valorile vectorilor v1 si v2,
- se parcurg vectorii si se calculează suma valorilor.

15
Aplicatia 2: să se calculeze suma a doi vectori de numere reale. Vectorii au acelasi
număr de elemente n(<100). Suma=v1[0]+v2[0]+ … + v1[N]+v2[N]

float v1[100], v2[100], suma;


int i, dim;

printf(“dim=”);
scanf(“%d”, &dim);

// citim ambii vectori într-un singur for


for (i=0; i<dim; i++)
{
printf(“v1[%d], v2[%d]:”, i, i);
scanf(“%f %f”, &v1[i], &v2[i]);
}

suma=v1[0]+v2[0]; // initializăm suma cu primele elemente


for (i=1; i<dim; i++)
suma+=v1[i]+v2[i];

printf(“suma este:%.2f”, suma);

16
Aplicatia 3: să se concateneze doi vectori de numere întregi de dimensiuni N si
respectiv M. Vectorul obtinut va fi stocat separat (N,M<100).

Variabile de intrare/lucru:
int v1[100], v2[100];
int N,M;
int i;

Variabile de iesire:
int v[200];

Structura program:
- se citesc dimensiunile N si M,
- se citesc valorile vectorilor v1 si v2,
- se parcurge vectorul v1 stocăm valori în v
- se parcurge vectorul v2 stocăm valori în v.

17
Aplicatia 3: să se concateneze doi vectori de numere întregi de dimensiuni N si
respectiv M. Vectorul obtinut va fi stocat separat (N,M<=100).

int v1[100], v2[100], v[200];


int N, M, i;

printf(“Introduceti N si M:”);
scanf(“%d %d”, &N, &M);

for (i=0; i<N; i++) // citim v1 si profitam de for si stocam valori în v


{
printf(“v1[%d]=”, i); scanf(“%d”, &v1[i]);
v[i]=v1[i];
}

for (i=0; i<M; i++) // citim v2 si profitam de for si stocam valori în v


{
printf(“v2[%d]=”, i); scanf(“%d”, &v2[i]);
v[N+i]=v2[i];
}

for (i=0; i<(N+M); i++)


printf(“%d”, v[i]); 18
Matrici (tablou cu 2 dimensiuni)
O matrice 2D reprezintă o colectie de date de acelasi tip, ce este structurată pe linii
si coloane (sub formă de tablou)

Exemplu: 0 1 2 3 j
i
0 1 2 0 0
1 3 1 56 0
2 9 1 1 1
3 7 0 1 0
Datele sunt identificate prin indicele liniei (i) si respectiv indicele coloanei (j).

Observatie: vectorul este un caz particular de matrice cu o singură linie.

19
Declararea (definirea) unei matrici :

tip date nume_matrice[nr. linii] [nr. coloane];

tipul datelor numele variabilei numărul maxim numărul maxim


continute de matrice: de tip tablou de linii de coloane
ex.: int, char, float (identificator) ale matricei ale matricei

Exemplu:

int m[10][20]; -variabila m este o matrice cu 10 linii si 20 coloane de


valori întregi,
float y[100][100]; -variabila y este o matrice cu 100 si 100 de coloane
de valori reale.

20
Modul de alocare al memoriei unei matrici:

int m[2][4]; Alocare a memoriei este de tip static, sistemul de calcul


alocând în memorie numărul specificat de valori, indiferent
dacă acestea vor fi folosite sau nu.

Astfel, se alocă 2x4 locatii de memorie consecutive de tip int, ce vor corespunde
liniilor si coloanelor matricei m:

16biti 16biti 16biti 16biti


adr. N adr. N+1 adr. N+2 adr. N+3

16biti 16biti 16biti 16biti


adr. N+4 adr. N+5 adr. N+6 adr. N+7

! Adresele sunt de regula consecutive

21
Citirea elementelor unei matrici
int m[2][4], i, j;
Executie:.
for (i=0; i<2; i++) > m[0][0]=12 (enter)
for (j=0; j<4; j++) > m[0][1]=45 (enter)
{ > m[0][2]=14 (enter)
printf(“m[%d] [%d] = ”, i, j ); > m[0][3]=42 (enter)
scanf(“%d”, &m[i][j]); > m[1][0]=5 (enter) samd
}
Observatie: 2 si 4 dau dimensiunile fizice ale matricei: 2 –nr. de linii, 4-nr. de cloane

int m[10][10], i, j, l, c;
printf("l="); scanf("%d", &l); l – nr. de linii
printf("c="); scanf("%d", &c); c – nr. de coloane
for (i=0; i<l; i++)
Observatie:
for (j=0; j<c; j++) l si c dau dimensiunile logice ale
{ matricei
printf(“m[%d] [%d] =”, i ,j );
scanf(“%d”, &m[i][j]);
}
22
Observatii:

1. lucrul cu elementele unei matrici se face folosind 2 cicluri for

2. ca si în cazul vectorilor, nu este obligatoriu să se foloseasca toate locatiile alocate,


pot folosi un număr mai mic de linii sau coloane, dar nu mai mare  eroare.

3. 0 <= l < nr. linii, 0 <= c < nr. coloane

4. memorarea elementelor unei matrici se face intr-o zona contigua de memorie, in


care se memoreaza datele matricei linie cu linie.
Numarul de ordine p al elementului din linia i si coloana j dintr-un tablou cu c coloane
este p= ic + j

16biti 16biti 16biti 16biti


adr. N adr. N+1 adr. N+2 adr. N+3

16biti 16biti 16biti 16biti


adr. N+4 adr. N+5 adr. N+6 adr. N+7
23
Modul de accesare din memorie al valorilor matricei:

Indici: 0 1 2 3
0 123 324 456 100
adr. N adr. N+1 adr. N+2 adr. N+3

1 34 5 258 199
adr. N+4 adr. N+5 adr. N+6 adr. N+7

m stochează adresa din memorie a


printf(“%p”, m ); primului element din matricea m (adr.N)

printf(“%p”, m[1] ); m[1] reprezintă adresa liniei de


indice 1, si anume a primului
element al acesteia (adr.N+4)

printf(“%d”, m[1][3] ); m[1][3] reprezintă valoarea pe linia de indice 1, si


coloana de indice 3, adica valoarea 199

24
Modul de accesare din memorie al valorilor matricei:

Indici: 0 1 2 3
0 123 324 456 100
adr. N adr. N+1 adr. N+2 adr. N+3

1 34 5 258 199
adr. N+4 adr. N+5 adr. N+6 adr. N+7

m[1][3] reprezintă valoarea pe linia de indice 1, si


printf(“%d”, m[1] [3] );
coloana de indice 3, adica valoarea 199

printf(“%p”, &m[1] [3] ); &m[1][3] reprezintă adresa de memorie a elementului


de pe linia de indice 1 si coloana de indice 3

25
Aplicatie: să parcurgă elementele de sub diagonala principală (inclusiv) ale unei
matrice pătratice de numere reale (<=20x20). Apoi sa se calculeze suma lor.

Variabile de intrare/lucru: Variabile de iesire:


float m[20][20]; float suma;
int N;
int i,j; i j 0 1 2 3

0 1 2 0 0
1 3 1 56 0
2 9 1 1 1
3 7 0 1 0
Structura program:
- se citeste dimensiunea N
- se citesc valorile matricei m
- se parcurg elementele de sub diagonala principala (i=j).

26
Aplicatia 4: să parcurgă elementele de sub diagonala principală (inclusiv) ale unei
matrice pătratice de numere reale (<20x20).

float m[20][20];
int i, j, N;

printf(“N=”); scanf(“%d”, &N);

for (i=0; i<N; i++) // citim matricea


for (j=0; j<N; j++)
{
printf(“m[%d][%d]:”, i, j);
scanf(“%f”, &m[i][j]);
}

for (i=0; i<N; i++) // parcurgem elementele de sub diagonala principala,


{ // diagonala principal inclusiv
for (j=0; j<=i; j++)
printf(“%f ”, m[i][j]);
TEMǍ: De implementat algoritmul
printf(“\n”); pentru calculul sumei.
}
27
TEMA
Implementati si testati aplicatiile din curs (1, 2, 3 si 4).

28

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