Documente Academic
Documente Profesional
Documente Cultură
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
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 2/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 3/54
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)
> 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
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
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ă
}
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
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
int i, j, N;
i=0,…,2
printf(“N=”); scanf(“%d”, &N); de numere întregi de dimensiuni diferite, MxN şi
3333
27 28
Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 26/54 Curs Programarea Calculatoarelor, Ş.l. Bogdan IONESCU, 2010-2011 27/54
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];
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
• 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
Ş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.)
- 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.
> 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
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