Sunteți pe pagina 1din 10

Universitatea “Politehnica” din Bucureşti

Facultatea de Electronică, TelecomunicaŃii şi


Tehnologia InformaŃiei
Cuprins

Programarea Calculatoarelor 6.1. Lucrul cu tablouri


(limbajul C)
6.2. Lucrul cu şiruri de caractere

Curs 6 – Tipuri de date compuse 6.3. Lucrul cu structuri

Ş.l. Bogdan IONESCU


Prof. Dragoş BURILEANU
Prof. Claudius DAN

2
2010-2011 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 1/54

Tablouri de date
> Un tablou este o structură omogenă formată dintr-o
mulŃime finită de elemente de acelaşi tip, denumit şi tip
de bază.
informaŃia este stocată
6.1. Lucrul cu tablouri Exemplu: sub formă matriceală

3.4 3 1.5 sursa principală de


 2 2.2 1.9 informaŃie sunt cifrele,
  sursa secundară de
 3 2.4 8  informaŃie este dată de
relaŃiile de vecinătate.

2.2 are ca vecini la: N - 3, S – 2.4, V – 2 şi E – 1.9.

3
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 2/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 3/54

Tablouri de date (continuare) Tablouri de date (continuare)


> InformaŃia de vecinătate este esenŃială şi constituie motivul Exemplu: dispunem de 14 valori de 0, 26 valori de 1 şi
folosirii tablourilor şi nu a unei liste de valori. 9 valori de 0.5 (continuare)
Exemplu: dispunem de 14 valori de 0, 26 valori de 1 şi • valori cu vecinătate pe două direcŃii
9 valori de 0.5. datele încep să capete
1 1 1 1 1 1 1 sens datorită informaŃiilor
• valori independente în memorie 1 0 0 0 0 1 1 suplimentare.
1 0 1 1 0 0 0 0 1 1 imagine cu două obiecte
0 0
0 0
0.5 1 0 0 0 0 1 1
0 1 0 0.5 1 etc.
0.5 1 0 0.5 0.5 0.5 1 1
• valori cu vecinătate pe o direcŃie 1 0 0.5 0.5 0.5 1 1
1 1 0.5 0.5 0.5 1 1
1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 etc.

Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 4/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 5/54
Tablouri de date (continuare) Tablouri de date (continuare)

În continuare vom discuta despre următoarele tipuri de • Vectori


tablouri de date:
> Un vector reprezintă o colecŃie de date de acelaşi tip
- vectori de date reprezentate sub forma unei linii sau coloane.

1111 3333 9999 7777


1111
3333
9999
7777
- matrice bidimensionale Exemplu: [ ] sau 0  
- matrice n-dimensionale (n>2)
0 1 2 3
1
 
> Datele sunt identificate prin poziŃia acestora
 
- şiruri de caractere în vector ce este dată de indice.
2  
 
ObservaŃie: însăşi modul de reprezentare al datelor în memorie > În limbajul C vom folosi primul tip de
3
 
este unul matriceal, astfel că lucrul cu tablouri de date reprezentare a vectorilor şi anume sub forma unei linii.
(definire, manevrare) este eficient şi totodată favorizat. AtenŃie: indicele primului element este întotdeauna 0.
7 8
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 6/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 7/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Vectori (continuare) • Vectori (continuare)

> Modul de definire a unui vector în limbajul C: > Modul de alocare al memoriei unui vector:
 această modalitate de alocare a memoriei
<tip date> <nume_vector>[<număr elem.>]; int x[4]; este de tip static, sistemul de calcul alocând în
memorie numărul specificat de valori, indiferent
tipul datelor numele variabilei numărul maxim dacă acestea vor fi folosite sau nu.
conŃinute de vector: de tip vector de elemente > Astfel, se alocă 4 locaŃii de memorie consecutive de tip int,
ex.: int, char, float (identificator) ale vectorului ce vor corespunde valorilor vectorului x:
Exemple: 32 biŃi 32 biŃi 32 biŃi 32 biŃi
-variabila x este un vector cu 100
de valori întregi, adr. N adr. N+1 adr. N+2 adr. N+3
int x[100];
float y[50]; -variabila y este un vector cu 50 > Fiecare locaŃie este identificată prin adresa sa în memorie
de valori reale. (adresele sunt consecutive).
9 10
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 8/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 9/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Vectori (continuare) • Vectori (continuare)
> Modul de accesare al valorilor vectorului din memorie: > Exemplu citire vector: AtenŃie: în scanf se menŃiona
adresa la care va fi stocată
indici: 0 1 2 3 int v[10], i;
valoarea citită, în acest caz &v[i].
123 324 456 100 for (i=0; i<3; i++)
adr. N adr. N+1 adr. N+2 adr. N+3 { ExecuŃie:
printf(“v[%d]=”,i); >v[0]=12 (enter)
x stochează adresa din memorie a scanf(“%d”,&v[i]); >v[1]=45 (enter)
printf(“%d”,x); primului element din vector (N), } >v[2]=14 (enter)
x[2] reprezintă valoarea din a treia > ObservaŃie: nu este obligatoriu să folosesc toate valorile
printf(“%d”,x[2]); locaŃie de memorie a vectorului x (456),
alocate, în acest caz 10, pot folosi un număr mai mic, dar nu
operatorul & returnează adresa din un număr mai mare  eroare.
printf(“%d”,&x[3]); memorie a variabilei ce il succede (N+3)
Rezultat: v[0]=12, v[1]=45, v[2]=14, v[3]=?, …, v[9]=?, v[10] …
11 12
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 10/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 11/54
Tablouri de date (continuare) Tablouri de date (continuare)
• Vectori (continuare) • Vectori (continuare)
Exemplu: EnunŃ: să se calculeze suma a doi vectori de
Ce face acest program ???
int v[200], dim, i, max;
P numere reale. Vectorii au acelaşi număr de elemente
printf(“dimensiune vector=”); alocă un vector de maxim (<100). Suma=v1[0]+v2[0]+ … + v1[N]+v2[N]
scanf(“%d”,&dim); 200 de valori int, şi citeşte
for (i=0; i<dim; i++) dimensiunea dorită (<200).
{ Variabile de intrare/lucru: Structură program:
printf(“v[%d]=”,i); citeşte elementele vectorului. float v1[100], v2[100]; - se citeşte dimensiunea dim,
scanf(“%d”,&v[i]);
int dim;
} maxim este primul element. - se citesc valorile vectorilor v1
max=v[0]; int i;
şi v2,
for (i=1; i<dim; i++) parcurge vectorul începând Variabile de ieşire: - se parcurg vectorii şi se
if (v[i]>max) cu al doilea element şi float suma;
max=v[i]; calculează suma valorilor.
determină dacă acesta este
printf(“max=%d”,max);
maxim.
13 14
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 12/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 13/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Vectori (continuare) • Vectori (continuare)
float v1[100], v2[100], suma; EnunŃ: să se concateneze doi vectori de numere
int i, dim; P întregi de dimensiuni N şi respectiv M. Vectorul obŃinut
printf(“dim=”);
scanf(“%d”, &dim);
va fi stocat separat (N,M<100).

for (i=0; i<dim; i++) // citim ambii vectori într-un singur for Structură program:
{ Variabile de intrare/lucru: - se citesc dimensiunile N şi M,
printf(“v1[%d], v2[%d]:”, i, i);
int v1[100], v2[100];
scanf(“%f %f”, &v1[i],&v2[i]); - se citesc valorile vectorilor v1
} int N,M;
şi v2,
suma=v1[0]+v2[0]; // iniŃializăm suma cu primele elemente int i;
- se parcurge vectorul v1
for (i=1; i<dim; i++) Variabile de ieşire:
suma+=v1[i]+v2[i];
 stocăm valori în v
int v[200];
- se parcurge vectorul v2
printf(“suma este:%.2f”, suma);  stocăm valori în v.
15 16
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 14/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 15/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Vectori (continuare)
• Matrice 2D
int v1[100], v2[100], v[200];
int N, M, i; > O matrice 2D reprezintă o colecŃie de date de acelaşi tip
printf(“Introduceti N si M:”);
scanf(“%d %d”, &N, &M);
ce este structurată pe linii şi coloane (sub formă de tablou)
9999 7777
1111

for (i=0; i<N; i++) // citim v1 şi profităm de for şi stocăm valori în v 0 1 2 linie
Exemplu: 0
 
1111

{
coloană

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


v[i]=v1[i]; 1
 
3333

}  
2
for (i=0; i<M; i++) // citim v2 şi profităm de for şi stocăm valori în v
{
 
printf(“v2[%d]=”, i); scanf(“%d”, &v2[i]); > Datele sunt identificate prin indicele liniei şi respectiv
v[N+i]=v2[i];
indicele coloanei.
}
for (i=0; i<(N+M); i++) ObservaŃie: vectorul este un caz particular de matrice cu o
printf(“%d”, v[i]);
singură linie.
17 18
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 16/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 17/54
Tablouri de date (continuare) Tablouri de date (continuare)
• Matrice 2D (continuare) • Matrice 2D (continuare)
> Modul de alocare al memoriei unei matrice:
> Modul de definire a unei matrice în limbajul C:
 alocarea este tot de tip static, sistemul de
<tip date> <nume_matrice>[<nr.linii>][<nr.coloane>]; int m[2][4]; calcul alocând în memorie numărul specificat de
valori.
tipul datelor numele variabilei numărul maxim > Astfel, se alocă 2x4 locaŃii de memorie consecutive de tip int,
conŃinute de matrice de tip matrice de linii şi coloane ce vor corespunde liniilor şi coloanelor matricei m:
ex.: int, char, float (identificator) ale matricei
32 biŃi 32 biŃi 32 biŃi 32 biŃi
Exemple: adr. N adr. N+1 adr. N+2 adr. N+3
- variabila x este o matrice ce conŃine 100
int x[10][10]; de valori întregi, pe 10 linii şi 10 coloane 32 biŃi 32 biŃi 32 biŃi 32 biŃi
float y[5][10]; - variabila y este o matrice ce conŃine 50 adr. N+4 adr. N+5 adr. N+6 adr. N+7
de valori reale, pe 5 linii şi 10 coloane. > ObservaŃie: adresele sunt de regulă consecutive.
19 20
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 18/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 19/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Matrice 2D (continuare) • Matrice 2D (continuare)
> Modul de accesare al valorilor matricei din memorie: > Modul de accesare al valorilor matricei din memorie (cont.):
indici: 0 1 2 3
indici: 0 1 2 3
0 123 324 456 100
0 123 324 456 100
adr. N adr. N+1 adr. N+2 adr. N+3
adr. N adr. N+1 adr. N+2 adr. N+3
1 34 5 258 199
1 34 5 258 199
adr. N+4 adr. N+5 adr. N+6 adr. N+7 adr. N+4 adr. N+5 adr. N+6 adr. N+7
ObservaŃie: practic o matrice este o colecŃie de vectori linie, în
m stochează adresa din memorie a
cazul de faŃă avem doi vectori de adrese N şi N+4.
printf(“%d”,m); primului element din matricea m (N),
m[1][3] reprezintă valoarea de pe
m[1] reprezintă adresa liniei de indice printf(“%d”,m[1][3]); linia de indice 1, şi coloana de indice
printf(“%d”,m[1]); 1, şi anume a primului element al 3, a matricei m (199),
acesteia (N+4),
21 22
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 20/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 21/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Matrice 2D (continuare) • Matrice 2D (continuare)
> Modul de accesare al valorilor matricei din memorie (cont.): AtenŃie: în scanf se menŃiona
> Exemplu citire matrice:
indici: 0 1 2 3 adresa la care va fi stocată
int m[10][10], i, j;
0 123 324 456 100 valoarea citită, deci &m[i][j].
for (i=0; i<2; i++)
adr. N adr. N+1 adr. N+2 adr. N+3 for (j=0; j<2; j++) ExecuŃie:
1 {
34 5 258 199 >v[0][0]=12 (enter)
printf(“v[%d][%d]=”, i, j);
adr. N+4 adr. N+5 adr. N+6 adr. N+7 >v[0][1]=45 (enter)
scanf(“%d”,&m[i][j]);
} >v[1][0]=14 (enter)
>v[1][1]=42 (enter)
&m[1][3] reprezintă adresa de
printf(“%d”,&m[1][3]); memorie a elementului de pe linia > ObservaŃie: ca şi în cazul vectorilor, nu este obligatoriu să
de indice 1 şi coloana de indice 3 folosesc toate locaŃiile alocate, pot folosi un număr mai mic de
linii sau coloane, dar nu mai mare  eroare.
23 24
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 22/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 23/54
Tablouri de date (continuare) Tablouri de date (continuare)
• Matrice 2D (continuare) • Matrice 2D (continuare)
Exemplu: EnunŃ: să parcurgă elementele de sub diagonala
Ce face acest program ???
int m[5][10], Nl, Nc;
P principală (inclusiv) ale unei matrice pătratice de

9999 7777
1111
int i, j, prod=1; alocă o matrice de maxim numere reale (<20x20).  

1111
printf(“Nl si Nc:”); 5x10 de valori int, şi citeşte  

3333
scanf(“%d %d”,&Nl, &Nc); nr. linii (<5) şi nr. coloane  
 
for (i=0; i<Nc; i++) (<10). Variabile de intrare/lucru:
for (j=0; j<Nl; j++) Structură program:
citeşte elementele matricei. float m[20][20];
{ - se citeşte dimensiunea N,
int N;
printf(“m[%d][%d]=”, i, j);
scanf(“%d”,&m[i][j]);
calculează produsul int i, j; - se citesc valorile matricei m,
prod*=m[i][j]; elementelor matricei v. Variabile de ieşire: - se parcurg elementele de sub
} valori matrice,
Este o greşeală importantă în diagonala principală (i=j)
printf(“Prod=%d”,prod); program!
25 26
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 24/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 25/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Matrice 2D (continuare) • Matrice 2D (continuare)
9999 7777
1111

float m[20][20]; EnunŃ: să se realizeze produsul a două matrice


  P
1111

int i, j, N;
i=0,…,2
printf(“N=”); scanf(“%d”, &N);   de numere întregi de dimensiuni diferite, MxN şi
3333

for (i=0; i<N; i++) // citim matricea   NxL.


for (j=0; j<N; j++)  
{ Variabile de intrare/lucru: Problemă:
printf(“m[%d][%d]:”, i, j); j=0,…,i
scanf(“%f”, &m[i][j]); int A[50][50], B[50][50]; trebuie determinat modul general
} int M, N, L; de calcul al unui element din
for (i=0; i<N; i++) // parcurgem elementele de sub diagonală int i, x, y;
{ matricea rezultantă,
for (j=0; j<=i; j++) Variabile de ieşire:
printf(“%.2f ”, m[i][j]); int C[50][50],
printf(“\n”);
}

27 28
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 26/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 27/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Matrice 2D (continuare) • Matrice 2D (continuare)
> Produsul a două matrice:
int A[50][50], B[50][50], C[50][50], i, x, y, M, N, L;
A x B = C printf("A: M si N="); scanf("%d %d", &M, &N); // citire dimensiuni
9999 7777
1111

N L L printf("B: L="); scanf("%d", &L);


M   N  M
 _ 0,0 _0,1

1111

0,0 0,1 0,2 0,0 0,1


 ×   = _ _  for (x=0; x<M; x++)
for (y=0; y<N; y++)
//citire matrice A (MxN elemente)
3333

1111

 1,0 1,1 
1,2  1,0 
1,1  1,0 1,1  {
 2,0 2,1 
2,2  2,0

2,1
 _ 2,0 _2,1
 printf("A[%d][%d]=",x,y); scanf("%d", &A[x][y]);
}

C[1][0]= A[1][0]*B[0][0] + A[1][1]*B[1][0] + A[1][2]*B[2][0] for (x=0; x<N; x++) //citire matrice B (NxL elemente)
for (y=0; y<L; y++)
>Formula magică este: {
N −1 printf("B[%d][%d]=",x,y); scanf("%d", &B[x][y]);
C[ x ][ y ] = ∑ A[ x][i] ∗ B[i ][ y ], x = 0,..., M − 1; y = 0,..., L − 1 }
i =0
29 30
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 28/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 29/54
Tablouri de date (continuare) Tablouri de date (continuare)
• Matrice 2D (continuare)
• Matrice n-dimensionale
for (x=0; x<M; x++) //iniŃializare matrice produs
for (y=0; y<L; y++) > Am vorbit până acum de matrice uni-dimensionale (vectori)
C[x][y]=0; şi matrice bi-dimensionale (tablouri). În realitate, în limbajul C
for (x=0; x<M; x++) //calcul produs, parcurgere matrice C este posibil să definim matrice n-dimensionale, cu n>2.
{ // (MxL elemente) şi afişare
for (y=0; y<L; y++)
> łinând cont că practic nu putem reprezenta grafic date
{ n-dimensionale, cu n>4, nu toate matricele sunt
for (i=0; i<N; i++)
semnificative şi îşi au rostul.
C[x][y]+=A[x][i]*B[i][y];

printf("%d ", C[x][y]);


• vectori: 9

8 Exemplu: evoluŃia
7

} 6

5
temporală a unei
printf("\n"); int x[10]; 4

3
mărimi (n=1)
} 2

0
1 2 3 4 5 6 7 8 9 10 11 12 13

31 32
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 30/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 31/54

Tablouri de date (continuare) Tablouri de date (continuare)


• Matrice n-dimensionale (continuare) • Matrice n-dimensionale (continuare)

• matrice 2D: 8
Exemplu: o anumită • matrice 4D: Exemplu: evoluŃia temporală a
7

6
suprafaŃă în funcŃie imaginilor unui film color (n=4)
5
int x[640][480][3][1500];
int x[10][10]; 4

3
de coordonatele
2

1 spaŃiale XoY (n=2) eroare: out of memory


0
1 2 3 4 5
timp
6 7 8 9 S1
10 11 12 13

> În practică este ineficientă reprezentarea statică a matricelor


• matrice 3D: Exemplu: evoluŃia temporală a imaginilor cu dimensiuni mai mari de n=3, datorită necesarului de
unui film alb-negru (n=3) memorie deloc neglijabil.
int x[10][10][100];
 ex. anterior: 640x480x32x1500 biŃi =
1.716 GB (~1 minut de film)
timp
33 34
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 32/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 33/54

Şiruri de caractere
> Limbajul C nu pune la dispoziŃia utilizatorului un tip individual
de date care să permită stocarea şirurilor de caractere
(exemplu din alte limbaje: String, AnsiString, etc.)

6.2. Lucrul cu şiruri de caractere un şir de caractere = o mulŃime ordonată de caractere


alfanumerice (string).

Exemplu: “exemplu şir”={‘e’,‘x’,’e’,’m’,’p’,’l’,’u’,’ ‘,’ş’,’i’,’r’}

ObservaŃie: constantele şir ObservaŃie: constantele de


de caracter sunt marcate tip caracter sunt marcate
cu ghilimele “ ” cu apostrof ‘ ’

> Limbajul C permite totuşi lucrul cu şiruri de caractere, dar


acestea sunt reprezentate ca vectori de caractere.
35 36
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 34/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 35/54
Şiruri de caractere (continuare) Şiruri de caractere (continuare)
> Modul de citire al şirurilor de caractere
> Modul de alocare al unui şir de caractere:
• o modalitate de citire constă în citirea şirului de caractere
 variabila x reprezintă un şir de caractere ca un vector:
char x[100];
ce poate conŃine maxim 99 de caractere.
 s este introdus caracter cu caracter
char s[5]; int i;
> Principiul alocării memoriei este identic cu cel folosit la prin intermediul funcŃiei getche(), la
for (i=0;i<4;i++)
vectori, şirul de caractere fiind un vector de tip char. s[i]=getche(); sfârşit se adaugă caracterul NULL.
s[i]=NULL; ineficient !
8 biŃi ... 8 biŃi \0 operatorul & ???
adr. N adr. N+98 adr. N+99 • modalitatea de citire cea mai uzuală constă în folosirea
> AtenŃie: un şir de caractere se încheie întotdeauna cu funcŃiei scanf():
caracterul special ‘\0’ sau NULL (sfârşit de string)  funcŃia scanf permite citirea şirurilor
char s[50]; prin opŃiunea %s. Caracterul NULL este
 dimensiunea vectorului = nr.caractere+1 scanf(“%s”,s);
adăugat automat la sfârşit.
37 38
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 36/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 37/54

Şiruri de caractere (continuare) Şiruri de caractere (continuare)


> Lucrul cu şirurile de caractere: > Exemplu: concatenarea a două şiruri.
• bineînŃeles că toate operaŃiile ce pot fi efectuate cu vectori,
char s1[100], s2[100], s3[200]; citire şiruri s1 şi s2.
sunt valabile şi la lucrul cu şirurile de caractere,
int i, pos;
• AtenŃie: şirurile de caractere sunt vectori, astfel: se parcurge primul şir şi
printf(“Introduceti doua siruri:”); caracterele sunt adăugate
scanf(“%s %s”,s1, s2); progresiv noului şir s3.
char s[100];  eroare, nu se pot face atribuiri directe
s=“proba”; for (i=0; i<strlen(s1); i++)
şi nici calcule cu şiruri. se memorează poziŃia
s3[i]=s1[i];
ultimului caracter.
• limbajul C pune totuşi la dispoziŃia utilizatorului o bibliotecă pos=i;
de funcŃii de lucru cu şiruri de caractere, string.h : for (i=0; i<strlen(s2); i++) se parcurge al doilea şir
s3[pos+i]=s2[i]; şi se adaugă caracterele
- strcpy : copiază un şir în altul,
s3[pos+i]=NULL; în continuarea lui s3.
- strcmp : compară două şiruri,
printf(“\n%s”,s3); sfârşit de string.
- strlen : determină dimensiune string, etc.
39 40
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 38/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 39/54

Tipuri de date compuse

> La punctele anterioare am vorbit despre tablouri de date:


vectori de date, matrice bidimensionale, matrice n-dimensionale
şi şiruri de caractere.
6.3. Lucrul cu structuri > Pe lângă reprezentarea datelor sub formă matriceală (date
omogene), limbajul de programare C mai permite şi lucrul cu
structuri de date: grupuri de date neomogene (tipuri diferite).

> În acest sens, există tipurile următoare:


- tipul struct,

- tipul union,

41 42
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 40/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 41/54
Tipul struct Tipul struct (continuare)

Să se realizeze un program care să permită stocarea > SoluŃia există de mult timp în domeniul bazelor de date, unde
P şi manipularea datelor personale a N persoane. astfel de colecŃii erau reprezentate pe baza înregistrărilor:
Exemplu bază de date:
Exemplu de persoană: Last Name First Name Title Title Of Courtesy Birth Date Hire Date Address

nume – şir de caractere (char []), x1000 ~ Davolio Nancy Sales Representative Ms. 08-Dec-1968 01-May-1992 507 - 20th Ave. E. Apt. 2A
Fuller Andrew Vice President, Sales Dr. 19-Feb-1952 14-Aug-1992 908 W. Capital Way
prenume – şir de caractere (char []), 5000 de Leverling Janet Sales Representative Ms. 30-Aug-1963 01-Apr-1992 722 Moss Bay Blvd.

vârstă – număr întreg (int), Peacock Margaret Sales Representative Mrs. 19-Sep-1958 03-May-1993 4110 Old Redmond Rd.

înălŃime – număr real (float),


variabile Buchanan Steven Sales Manager Mr. 04-Mar-1955 17-Oct-1993 14 Garrett Hill
Suyama Michael Sales Representative Mr. 02-Jul-1963 17-Oct-1993 Coventry House Miner Rd.
ocupaŃie – şir de caractere (char []). indep. ! King Robert Sales Representative Mr. 29-May-1960 02-Jan-1994 Edgeham Hollow Winchester Way
Callahan Laura Inside Sales Coordinator Ms. 09-Jan-1958 05-Mar-1994 4726 - 11th Ave. N.E.
Dodsworth Anne Sales Representative Ms. 02-Jul-1969 15-Nov-1994 7 Houndstooth Rd.

> Problema este simplă dacă ar fi vorba de o singură persoană,


se definesc o serie de tipuri de ceea ce se schimbă sunt
ce facem dacă trebuie să introducem aceste date pentru 1000 date (variabile) valorile pentru fiecare persoană
de persoane ?  definite o singură dată  înregistrări
43 44
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 42/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 43/54

Tipul struct (continuare) Tipul struct (continuare)

> Limbajul C permite manipularea acestor tipuri de date prin Exemplu:


folosirea structurilor, struct Persoana -am definit tipul de date
{ structura numit: Persoana
structură de date= o colecŃie de variabile, de regulă, de char nume[100];
tipuri diferite, ce se reunesc într-o singură variabilă “container”. char prenume[100]; -acesta va permite stocarea a
int varsta; două şiruri de caractere, a unui
Sintaxă: - am definit un nou tip
float inaltime; int şi a unui număr real.
de date (structură) };
struct <NumeTipNou> numit:<NumeTipNou>
{
<TipDeDateA> <NumeVariabilă1>; - acesta conŃine o > Deocamdată am definit doar tipul de date, nu şi o variabilă
... serie de alte tipuri de care să stocheze aceste date, pentru aceasta:
<TipDeDateX> <NumeVariabilăN>; date, TipA … TipX. variabila
}; struct Persoana OPersoanaAnume; OPersoanaAnume
“;” se încheie definiŃia. este de tip Persoana.
45 46
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 44/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 45/54

Tipul struct (continuare) Tipul struct (continuare)


> Declararea variabilelor struct (continuare): > Citirea şi manipularea variabilelor unei structuri:
variabila struct Patrat - variabilele de tip structură pot fi
struct Persoana OPersoanaAnume; OPersoanaAnume { definite şi direct după specificarea
este de tip Persoana. int latura; tipului.
float arie; - elementele sunt adresate prin:
> Efect: în memorie se va aloca spaŃiu pentru stocarea a } P1, P2; P1.latura şi P1.arie, acestea
100+100 de caractere (200x8biŃi), a unui int (32 biŃi) şi a unui fiind practic ele însele nişte
printf(“Patrat 1:”);
float (32 biŃi). scanf(“%d”, &P1.latura); variabile (fac parte din P1).
> Aceste locaŃii de memorie vor fi adresate prin intermediul P1.arie=P1.latura*P1.latura;
- calculele se realizează
variabilei OPersoanaAnume: printf(“\nPatrat 2:”);
folosind variabilele, ca şi cum ar
.nume[100] scanf(“%d”, &P2.latura); fi independente.
.prenume[100] P2.arie=P2.latura*P2.latura;
OPersoanaAnume .varsta printf(“Suma arii este: %f”, P1.arie+P2.arie);
.inaltime
47 48
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 46/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 47/54
Tipul struct (continuare) Tipul struct (continuare)
Exemplu: Exemplu: -structura SPunct permite
-am definit un vector de variabile struct SPunct
stocarea a două valori întregi, şi
struct Patrat anume coordonatele x şi y ale
{ de tip Patrat (structura), ce va fi {
stocat în variabila MultePatrate. int x,y; unui punct.
int latura;
float arie; }; -structura Triunghi permite
}; -astfel avem 100 de variabile int i; stocarea coordonatelor celor trei
de tip Patrat: struct Triunghi puncte ce definesc un triunghi prin
struct Patrat MultePatrate[100]; MultePatrate[0], {
int i; intermediul vectorului: puncte[3].
MultePatrate[1], … , struct SPunct puncte[3];
for (i=0;i<100; i++) } Triunghi1;
MultePatrate[99]. din variabila Triunghi1, accesăm
{
for (i=0; i<3; i++) elementul puncte[i] (structura) şi
scanf(“%d”, &MultePatrate[i].latura);
{ mai departe x şi y
MultePatrate[i].arie=MultePatrate[i].latura*MultePatrate[i].latura;
} printf(“punct %d ”,i+1);
scanf(“%d %d”, &Triunghi1.puncte[i].x, &Triunghi1.puncte[i].y);
printf(“Patratul 10 are aria: %f”, MultePatrate[9].arie); }
49 50
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 48/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 49/54

Tipul union Tipul union (continuare)

> Pe lângă structurile de date, în limbajul C mai există un tip Exemplu: -am definit tipul de date uniune
de date similar, şi anume uniunile sau union. union VarHibrida numit: VarHibrida
{
> Din punct de vedere al sintaxei şi al modului de declarare al int Ix; -lista datelor ce pot fi conŃinute
variabilelor, acesta este identic cu tipul struct, astfel: float Fx; de acesta,
double Dx;
Sintaxă: - am definit un nou tip -variabila proba este de acest tip,
char Cx[8];
de date (uniune) } proba; şi anume VarHibrida.
union <NumeTipNou> numit:<NumeTipNou>
{
<TipDeDateA> <NumeVariabilă1>; - acesta conŃine o > Efect: în memorie se va aloca spaŃiu pentru a putea stoca
... serie de alte tipuri de valoarea variabilei, din lista de variabile a uniunii, ce necesită
<TipDeDateX> <NumeVariabilăN>; date, TipA … TipX. spaŃiul de memorie cel mai mare:
};
“;” se încheie definiŃia. int = 32 biŃi, float = 32 biŃi, double = 64 biŃi, char [8] = 64 biŃi
51
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 50/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 51/54

Tipul union (continuare) union VarHibrida Tipul union (continuare)


{ Exemplu:
> Nu se alocă spaŃiu pentru toate int Ix; ce se afişează pe ecran?
variabilele, ci doar suficient spaŃiu pentru float Fx; union Utest
20 20 20
double Dx; {
a putea stoca oricare dintre valorile variab. int x, y, z;
char Cx[8]; x, y şi z sunt stocate la aceeaşi
} proba; } Var; locaŃie de memorie.
coduri ASCII: 648biŃi
biŃi 8biŃi ...
10.5
8biŃi
10 Var.y=3; Var.z=20;
adr. N printf(“%d %d %d”, Var.x, Var.y, Var.z);
> Astfel, la un moment dat, variabila proba nu va putea avea
decât una dintre valorile enumerate: int, float, double sau char. Exemplu: ce se afişează pe ecran?
union Utest 20 0.00000 20 de ce???
Exemplu: {
> Fiind disponibilă doar o locaŃie de int x, z; float y; memorie Var
proba.lx=10; memorie, valorile sunt suprapuse } Var;
33x10 -1=100001
20=00000 101001
proba.Fx=10.5; Var.y=3.3; Var.z=20;
progresiv pe măsură ce sunt
scanf(“%s”,proba.Cx); printf(“%d %f %d”, Var.x, Var.y, Var.z);
schimbate. int float int

Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 52/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 53/54
Sfârşitul Cursului 6

55
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 54/54

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