Sunteți pe pagina 1din 51

Tablouri

Programarea calculatoarelor i
limbaje de programare I

Capitolul 8
Introducere
Tablourile (arrays) reprezint un tip important de structur
de date
Sunt colecii de obiecte de acelai tip reunite sub un singur
nume
Uneori este necesar s referim anumite variabile ca un
singur grup pentru c este dificil s definim i s folosim
individual fiecare variabil
Exemplu
Dac dorim s tiprim un set de date n ordine invers
celei n care au fost introduse, trebuie s le citim i s
le salvm pe toate nainte de a putea face prima tiprire
Dac avem de a face cu 1000 de valori, trebuie s
declarm 1000 de variabile ca s le stocm, s scriem
1000 de instruciuni de citire i 1000 de instruciuni de
tiprire
Tabloul este un tip de dat care ne permite s programm
mai uor operaii asupra grupurilor de valori de acelai tip

Programarea calculatoarelor i 2
limbaje de programare I
Sumar
1. Tipuri de dat simple i tipuri de dat
structurate
2. Tablouri unidimensionale
3. Transmiterea tablourilor ca parametri
de funcii
4. Tablouri multidimensionale

Programarea calculatoarelor i 3
limbaje de programare I
Tipuri de dat simple i tipuri de
dat structurate
O valoare creia i este asociat un tip
simplu de dat este un element singular
care nu poate fi mprit mai departe n
pri componente
Exemplu
O valoare de tip int este un numr ntreg i nu
mai poate fi descompus
n contrast cu acesta, o valoare avnd un
tip de dat structurat este o colecie de
elemente
ntreaga colecie este referit printr-un singur
nume i fiecare component poate fi accesat
individual

Programarea calculatoarelor i 4
limbaje de programare I
Tipuri de dat simple i tipuri de
dat structurate
Un tip de dat structurat este ifstream
folosit pentru citirea valorilor dintr-un fiier
Atunci cnd declarm inFile de tip ifstream,
inFile nu reprezint o singur valoare
El reprezint ntreaga colecie de date din fiier
Fiecare coomponent poate fi accesat
individual printr-o operaie de intrare
Tipurile simple de date sunt elemente
componente pentru tipurile structurate
Un tip de dat structurat pune mpreun
mulimea de valori componente i impune
un aranjament specific asupra valorilor

Programarea calculatoarelor i 5
limbaje de programare I
Tipuri de dat simple i tipuri de
dat structurate
C++ ofer mai multe tipuri de dat
structurate:
tablou (array)
struct
union
class

Programarea calculatoarelor i 6
limbaje de programare I
1. Tipuri de dat simple i tipuri de dat
structurate
2. Tablouri unidimensionale
3. Transmiterea tablourilor ca parametri
de funcii
4. Tablouri multidimensionale

Programarea calculatoarelor i 7
limbaje de programare I
Tablouri unidimensionale
Citirea i afiarea n ordine invers a 1000 de valori se
poate implementa astfel:
int val0;
int val1;
...
int val999;

cin >> val0;


cin >> val1;
...
cin >> val999;

cout << val999 << endl;


...
cout << val1 << endl;
cout << val0 << endl;
Programarea calculatoarelor i 8
limbaje de programare I
Tablouri unidimensionale
Programul are peste 3000 de linii i
folosete 1000 de variabile cu nume
asemntoare
Ar fi mult mai comod dac numrul
din componena numelor variabilelor
ar fi, de fapt, un contor pe care s l
putem folosi pentru a citi i scrie
bucle while n care contorul s ia
valori ntre 0 i 999

Programarea calculatoarelor i 9
limbaje de programare I
Tablouri unidimensionale
#include <iostream>
using namespace std;
int main()
{
int val[1000]; //declararea tabloului
int contor = 0;
while(contor < 1000)
{
cin >> val[contor];
contor++;
}
contor = 999;
while(contor >= 0)
{
cout << val[contor] << endl;
contor--;
}
return 0;
}

Programarea calculatoarelor i 10
limbaje de programare I
Tablouri unidimensionale
n acest program am declarat val ca
fiind un tablou unidimensional
Tabloul este o colecie de variabile,
toate de acelai tip, n care
prima parte a numelui variabilelor este
acelai
ultima parte este un indice cuprins ntre
Valoarea stocat n contor se
numete indice

Programarea calculatoarelor i 11
limbaje de programare I
Tablouri unidimensionale
Declararea tabloului este similar cu
declaraia unei variabile simple, cu o
singur excepie:
trebuie declarat i dimensiunea tabloului
Numrul de componente se declar ntre []
Declaraia
int val[1000];
creeaz un tablou cu 1000 de componente,
toate de tip int
Prima are indicele 0, a doua are indicele 1, iar
ultima are indicele 999

Programarea calculatoarelor i 12
limbaje de programare I
Tablouri unidimensionale
Declararea tablourilor
Un tablou unidimensional este o
colecie structurat de componente
(elemente)
Ele pot fi accesate individual specificnd
poziia componentei printr-un indice care
este o constant ntreag
ablonul sintactic al unei declaraii de
tablou unidimensional este urmtorul:
TipDat NumeTablou[ExpresieConstInt];

Programarea calculatoarelor i 13
limbaje de programare I
Tablouri unidimensionale
Declararea tablourilor
Componentele unui tablou pot avea
aproape orice tip de dat
Expresia dintre [] este o constant
ntreag
Poate fi un literal sau o constant simbolic
Ea trebuie s fie strict mai mare dect 0 i
definete numrul de componente ale tabloului
Dac valoarea este n, domeniul indicilor va
fi ntre 0 i n-1, nu ntre 1 i n

Programarea calculatoarelor i 14
limbaje de programare I
Tablouri unidimensionale
Declararea tablourilor
Exemplu
Prin declaraia
int val[4];
compilatorul rezerv ntr-o zon compact de
memorie 4 locaii de tip int

val
val[0]
val[1]
val[2]
val[3]

Programarea calculatoarelor i 15
limbaje de programare I
Tablouri unidimensionale
Componentele individuale
Pentru a folosi componentele individuale
scriem numele tabloului urmat de o
expresie indice ntre []
Expresia specific numrul componentei
accesate i poate fi att constant ct i
variabil ori o expresie mai complicat
Oricare ar fi, ns, forma indicelui, acesta
trebuie s fie o valoare ntreag
Cea mai simpl form a expresiei indice
este o constant

Programarea calculatoarelor i 16
limbaje de programare I
Tablouri unidimensionale
Componentele individuale
Exemplu
val
int val[4]; val[0] -2
val[0] = -2;
val[1] 4
val[1] = 4;
val[2] = 18; val[2] 18
val[3] = -199; val[3] -199

Spre deosebire de declaraii, expresiile


indice pot fi i variabile sau expresii ntregi

Programarea calculatoarelor i 17
limbaje de programare I
Tablouri unidimensionale
Componentele individuale
int i, n[10]; //declararea tabloului
i = 0;
while(i < 10)
{
n[i] = 0; //initializarea elementelor taboului
i++;
}

cout << "Element" << setw(13) << "Valoare" << endl;


i = 0;
while(i < 10)
{
cout << setw(7) << i << setw(13)
<< n[i] << endl;
i++;
}

Programarea calculatoarelor i 18
limbaje de programare I
Tablouri unidimensionale
Componentele individuale
Fiecare component a unui tablou
poate fi tratat exact ca o variabil
simpl
Exemplu
int val[4];
val[0] = -2;
cin >> val[2];
cout << val[1];
double x = sqrt(val[2]);
double y = 6.8 * val[2] + 7.5;

Programarea calculatoarelor i 19
limbaje de programare I
Tablouri unidimensionale
Indicii din afara limitelor
Considerm declaraia
double alfa[100];
pentru care domeniul valid al indicilor este
0 99
Dac executm instruciunea
alfa[i] = 62.4;
cnd i < 0 sau i > 99 se acceseaz locaii
de memorie din afara tabloului
C++ nu verific ncadrarea indicilor ntre
limite i aceasta este rspunderea
programatorului

Programarea calculatoarelor i 20
limbaje de programare I
Tablouri unidimensionale
Indicii din afara limitelor
Algoritmii de procesare a tablourilor
folosesc adeseori bucle pentru a
parcurge elementele
Exemplu
int i = 0;
while(i < 10)
{
alfa[i] = 0.0;
i++;
}

Programarea calculatoarelor i 21
limbaje de programare I
Tablouri unidimensionale
Indicii din afara limitelor
Aceeai bucl se poate scrie i ntr-o a doua variant
n care variabila de control se compar cu limita
superioar a domeniului indicilor
Exemplu
int i = 0;
while(i <= 9)
{
alfa[i] = 0.0;
i++;
}
Prima variant este preferat pentru c valoarea cu
care se compar variabila de control este aceeai cu
dimensiunea tabloului, fiind mai sugestiv

Programarea calculatoarelor i 22
limbaje de programare I
Tablouri unidimensionale
Iniializarea tablourilor
Elementele unui tablou pot fi iniializate n instruciunea
de declarare prin adugarea unei liste de valori separate
prin virgul, plasate ntre acolade
Exemplu
int n[10] = {32, 2, 64, 18, 95, 14, 90, 70, -60, 37};
O facilitate a limbajului C++ este aceea prin care se
permite omiterea dimensiunii tabloului atunci cnd
declaraia i iniializarea se fac n aceeai instruciune
Exemplu
int n[] = {32, 2, 64, 18, 95, 14, 90, 70, -60, 37};
Compilatorul stabilete dimensiunea tabloului la numrul
de elemente dintre acolade

Programarea calculatoarelor i 23
limbaje de programare I
Tablouri unidimensionale
Iniializarea tablourilor
Pentru declararea dimensiunii unui
tablou se pot folosi i constante
simbolice
Programul din exemplul urmtor va
citi numerele dintr-un tablou de valori
ntregi i va afia sub form grafic
segmente ale cror lungimi sunt
proporionale cu aceste valori
Acest grafic se numete histogram

Programarea calculatoarelor i 24
limbaje de programare I
Tablouri unidimensionale
Iniializarea tablourilor
const int dim = 5;
int val[dim] = {19, 3, 15, 7, 11};

cout << "Element" << setw(13) << "Valoare"


<< setw(17) << "Histograma" << endl;

int i = 0;
while(i < dim)
{
cout << setw(7) << i << setw(13) << val[i]
<< setw(9);
int j = 0;
while(j < val[i])
{
cout << '*';
j++;
}
cout << endl;
i++;
}
Programarea calculatoarelor i 25
limbaje de programare I
Tablouri unidimensionale
Tabourile cu valori tip char
Tablourile pot avea orice tip de dat
Vom discuta acum despre stocarea irurilor
de caractere (string-uri) n tablouri de tip
char
Pentru a afia un string pe ecran putem
folosi o instruciune de tiprire prin care
textul este inserat n stream-ul de ieire
Exemplu
cout << caractere;
Un string precum caractere este, de fapt,
un tablou de valori de tip char

Programarea calculatoarelor i 26
limbaje de programare I
Tablouri unidimensionale
Tabourile cu valori tip char
Un tablou de caractere poate fi iniializat printr-un
string literal
Exemplu
char clasament[] = primul;
Elementele tabloului clasament sunt iniializate cu
valorile caracterelor individuale din stringul literal
primul
Dimensiunea tabloului clasament este determinata de
compilator prin lungimea sirului la care se adaug
automat un caracter special numit caracterul null care
se numete terminator de ir
Astfel, tabloul clasament va avea ase elemente

Programarea calculatoarelor i 27
limbaje de programare I
Tablouri unidimensionale
Tabourile cu valori tip char
Caracterul null are codul ASCII 0 iar
reprezentarea sa ca i constant literal
este \0
Toate string-urile se termin cu acest
caracter
Un tablou de caractere care reprezint un
string trebuie declarat ntotdeauna suficient
de mare ca s cuprind caracterele irului i
terminatorul de ir

Programarea calculatoarelor i 28
limbaje de programare I
Tablouri unidimensionale
Tabourile cu valori tip char
Tablourile de caractere pot fi iniializate i prin
constante individuale printr-o list de
iniializare.
Exemplu
char clasament[] = {p,r,i,m,u,l,\0};
Putem accesa componentele individuale ale
unui tablou de caractere prin folosirea indicilor
n felul acesta, clasament[0] este caracterul
p, clasament[1] este caracterul r etc.

Programarea calculatoarelor i 29
limbaje de programare I
Tablouri unidimensionale
Tabourile cu valori tip char
Putem introduce valori de la tastatur direct ntr-un
tablou de tip char folosind cin i >>
Exemplu
char sir[20];
cin >> sir;
Tabloul sir este declarat ca un ir de caractere
care poate s stocheze 19 caractere i
terminatorul de ir
A doua instruciune citete un string de la
tastatur adugndu-i automat caracterul null
Este rspunderea programatorului s stabileasc
dimensiunea tabloului n care se vor pstra aceste
caractere

Programarea calculatoarelor i 30
limbaje de programare I
Tablouri unidimensionale
Tabourile cu valori tip char
Manipulatorul setw poate fi folosit n
acest caz pentru a ne asigura c
numrul de caractere citite din
stream-ul cin nu va depi
dimensiunea tabloului n care sunt
transferate acestea
Exemplu
Vor fi citite 19 caractere de la tastatur dup
care se adaug automat caracterul null
cin >> setw(20) >> sir;

Programarea calculatoarelor i 31
limbaje de programare I
Sumar
1. Tipuri de dat simple i tipuri de dat
structurate
2. Tablouri unidimensionale
3. Transmiterea tablourilor ca parametri
de funcii
4. Tablouri multidimensionale

Programarea calculatoarelor i 32
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Dac dorim s transmitem o variabil ca
parametru unei funcii i dorim ca funcia
s nu poat s i modifice valoarea atunci
variabila trebuie transmis prin valoare i
nu prin referin
De la aceast regul fac excepie
stream-urile
tablourile pentru c n C++
Acestea sunt transmise ntotdeauna prin
referin
Programarea calculatoarelor i 33
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Pentru ca o variabil simpl sau un obiect
s fie transmis prin referin trebuie ataat
semnul & tipului de dat din lista de
parametri formali
Fiind transmise ntotdeauna prin referin,
pentru declararea tablourilor nu se folosete &
Cnd un tablou este transmis ca parametru,
i se transmite de fapt adresa de baz care
este adresa de memorie a primului su
element
n acest fel funcia l va putea localiza n
memoria calculatorului i i va putea accesa
elementele

Programarea calculatoarelor i 34
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Exemplu
void ModificaTablou(int b[], int dimensiune)
{
int j = 0;
while(j < dimensiune)
{
b[j] *= 2;
j++;
}
}

Programarea calculatoarelor i 35
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
n C++ se pot folosi urmtorii operatori
aritmetici de asignare:
Operator Exemplu Explicaie
+= a += 7 a = a + 7
-= b -= 6 b = b 6
*= c *= 5 c = c * 5
/= d /= 4 d = d / 4
%= e %= 3 e = e % 3

Operatorul %= se poate aplica doar


variabilelor ntregi
Programarea calculatoarelor i 36
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
n lista parametrilor formali, declararea unui
tablou nu include i dimensiunea sa ntre []
Dac se include dimensiunea, compilatorul o
ignor
Compilatorului i este necesar doar
informaia referitoare la natura parametrului,
adic faptul c este vorba despre un tablou,
i la tipul componentelor sale
Acesta este motivul pentru care trebuie
adugat un al doilea parametru al funciei
prin care se precizeaz numrul de
componente

Programarea calculatoarelor i 37
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
n prototipul unei funcii care are
parametri de tip tablou nu este
necesar prezena numelor
parametrilor formali
Aceast regul este valabil pentru
orice funcie, indiferent de tipul
parametrilor si
Exemplu
void ModificaTablou(int [], int);
Programarea calculatoarelor i 38
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Programul urmtor ilustreaz
diferena ntre trimiterea unui tablou
i a unui element al unui tablou ca
parametri de funcii

const int dimTablou = 5;


int i, a[dimTablou] = {0, 1, 2, 3, 4};

//Tablou transmis prin referinta
ModificaTablou(a, dimTablou);

Programarea calculatoarelor i 39
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
ModificaElement(a[3]);
cout << "Valoarea lui a[3] este "
<< a[3] << endl;
...
void ModificaElement(int e)
{
cout << "Valoarea in functia
ModificaElement este "
<< (e *= 2) << endl;
}

Programarea calculatoarelor i 40
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Programul tiprete pe ecran urmtoarele
rezultate
Efectele transmiterii unui tablou prin
referinta:
Valorile tabloului original:
0 1 2 3 4
Valorile modificate sunt:
0 2 4 6 8
Efectele transmiterii unui element al
tabloului prin valoare:
Valoarea lui a[3] este 6
Valoarea in functia ModificaElement este 12
Valoarea lui a[3] este 6

Programarea calculatoarelor i 41
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Atunci cnd se apeleaz funcia
ModificaTablou, i se transmite funciei o
copie a adresei de memorie a tabloului a,
iar modificrile asupra tabloului b vor fi de
fapt modificri ale tabloului a
Funcia ModificaElement are un parametru
de tip valoare, o modificare asupra lui e
neavnd niciun efect asupra parametrului
actual a[3]

Programarea calculatoarelor i 42
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
Pot aprea situaii n programele noastre
cnd o funcie nu trebuie s poat modifica
elemente ale unui tablou care i este transmis
ca parametru
Limbajul C++ ofer mecanismul implementat
prin cuvntul cheie const care se poate folosi
pentru a mpiedica modificarea valorilor
elementelor unui tablou printr-o funcie
Dac parametrul tablou al unei funcii este de tip
const, elementele sale devin constante n interiorul
funciei i orice intenie de modificare a valorilor lor
este interpretat de compilator ca o eroare de sintax

Programarea calculatoarelor i 43
limbaje de programare I
Transmiterea tablourilor ca
parametri de funcii
#include <iostream>
using namespace std;
void IncearcaSaModificeTablou(const int []);
int main()
{
int a[] = {10, 20, 30};
IncearcaSaModificeTablou(a);
cout << a[0] << ' ' << a[1] << ' ' << a[2] << endl;
return 0;
}
void IncearcaSaModificeTablou(const int b[])
{
b[0] /= 2; //eroare
b[1] /= 2; //eroare
b[2] /= 2; //eroare
}
Compilatorul semnaleaz eroare pentru c b[0], b[1] i b[2] sunt
nemodificabile

Programarea calculatoarelor i 44
limbaje de programare I
Sumar
1. Tipuri de dat simple i tipuri de dat
structurate
2. Tablouri unidimensionale
3. Transmiterea tablourilor ca parametri
de funcii
4. Tablouri multidimensionale

Programarea calculatoarelor i 45
limbaje de programare I
Tablouri multidimensionale
Tabourile n C++ pot avea mai multe
dimensiuni
O modalitate comun de a le folosi este
prin matrici cu linii i coloane, fiind vorba n
acest caz despre tablouri cu dou
dimensiuni
Pentru a identifica un element al unei astfel
de matrici trebuie s specificm doi indici:
primul reprezint linia
al doilea reprezint coloana
Tablourile multidimensionale pot avea i
mai mult de dou dimensiuni.
Programarea calculatoarelor i 46
limbaje de programare I
Tablouri multidimensionale
Tablourile multidimensionale pot fi iniializate odat cu
declararea lor n mod asemntor cu iniializarea
tablourilor unidimensionale
Exemplu
Un tablou bidimensional b[2][2] poate fi declarat i
iniializat prin instruciunea
int b[2][2] = { {1,2}, {3,4} };
Valorile sunt grupate pe linii, ntre acolade
1 i 2 sunt valorile iniiale pentru b[0][0] i b[0][1]
3 i 4 sunt valorile iniiale pentru b[1][0] i b[1][1]

Programarea calculatoarelor i 47
limbaje de programare I
Tablouri multidimensionale
Dac nu sunt suficiente valori pentru o
linie, elementele care rmn sunt
iniializate cu valoarea 0
Declaraia
int b[2][2] = { {1}, {3,4} };
iniializeaz
b[0][0] cu 1
b[0][1] cu 0
b[1][0] cu 3
b[1][1] cu 4

Programarea calculatoarelor i 48
limbaje de programare I
Tablouri multidimensionale
int main()
{
int array2[2][3] = {1,2,3,4,5};
...
TiparesteTablou(array2);
...
}
void TiparesteTablou(int a[][3])
{
int i = 0;
while(i < 2)
{
int j = 0;
while(j < 3)
{
cout << a[i][j] << ' ';
j++;
}
cout << endl;
i++;
}
}

Programarea calculatoarelor i 49
limbaje de programare I
Tablouri multidimensionale
Programul apeleaz funcia TiparesteTablou
pentru a tipri coninutul fiecruia dintre cele
trei tablouri multidimensionale
Atunci cnd se transmit tablouri
unidimensionale ca parametri de funcii,
indicele nu trebuie precizat
n cazul tablourilor multidimensionale, se
ignor doar valoarea primului indice,
urmtorii trebuind s aib valori
Compilatorul folosete aceste dimensiuni
pentru a determina poziia n memorie a
elementelor tabloului multidimensional
Programarea calculatoarelor i 50
limbaje de programare I
Tablouri multidimensionale
Toate elementele unui astfel de tablou sunt
aezate fizic n locaii consecutive, mai nti
cele de pe primul rnd urmate imediat de
elementele de pe al doilea rnd etc.
Aceast poziionare n memorie este
ilustrat i de modul n care sunt iniializate
componentele tabloului array2 din
exemplul anterior
Valorile sunt asignate elementelor de pe
primul rnd, apoi celor de pe al doilea rnd,
iar array2[1][2] primete valoarea 0
Programarea calculatoarelor i 51
limbaje de programare I

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