Documente Academic
Documente Profesional
Documente Cultură
TABLOURI
Numim tablou o colecie (grup, mulime ordonat) de date, de acelai tip, situate ntr-o zon de memorie
continu (elementele tabloului se afl la adrese succesive). Tablourile sunt variabile compuse (structurate),
deoarece grupeaz mai multe elemente. Variabilele tablou au nume, iar tipul tabloului este dat de tipul
elementelor sale. Elementele tabloului pot fi referite prin numele tabloului i indicii (numere ntregi) care
reprezint poziia elementului n cadrul tabloului.
n funcie de numrul indicilor utilizai pentru a referi elementele tabloului, putem ntlni tablouri
unidimensionale (vectorii) sau multidimensionale (matricile sunt tablouri bidimensionale).
Tablourile unidimensionale sunt tablouri cu un singur indice (vectori). Dac tabloul conine dim_1 elemente,
indicii elementelor au valori ntregi din intervalul [0, dim_1-1].
La ntlnirea declaraiei unei variabile tablou, compilatorul aloc o zon de memorie continu (dat de
produsul dintre dimensiunea maxim i numrul de octei corespunztor tipului tabloului) pentru pstrarea
valorilor elementelor sale. Numele tabloului poate fi utilizat n diferite expresii i valoarea lui este chiar
adresa de nceput a zonei de memorie care i-a fost alocat. Un element al unui tablou poate fi utilizat ca orice
alt variabil (n exemplul urmtor, atribuirea de valori elementelor tabloului vector). Se pot efectua
operaii asupra fiecrui element al tabloului, nu asupra ntregului tablou.
55
CAPITOLUL 4 Tablouri
Exemplu:
// Declararea tabloului vector
int vector[6];
Exemplu:
double alpha[5], beta[5], gama[5];
int i=2;
alpha[2*i-1] = 5.78;
alpha[0]=2*beta[i]+3.5;
gama[i]=aplha[i]+beta[i]; //permis
gama=alpha+beta; //nepermis
[0] [5]
//2
double x=9.8;
double a[5]={1.2, 3.5, x, x-1, 7.5};
La declararea unui vector cu iniializarea elementelor sale, numrul maxim de elemente ale tabloului poate fi
omis, caz n care compilatorul determin automat mrimea tabloului, n funcie de numrul elementelor
iniializate.
Exemplu:
char tab[]={ A, C, D, C};
[0] [3]
[0] [4]
Adresa elementului de indice i dintr-un tablou unidimensional poate fi calculat astfel:
adresa_elementului_i = adresa_de_baz + i lungime_element
Exerciii:
//1 Citirea elementelor unui vector:
double a[5];
int i;
for (i=0; i<5; i++)
{ cout<<a["<<i<<]=; //afiarea unui mesaj prealabil citirii fiecrui element
cin>>a[i]; //citirea valorii elementului de indice i
}
55
CAPITOLUL 4 Tablouri
//Sau:
double a[20]; int i, n;
cout<<Dim. Max. =; cin>>n;
for (i=0; i<n; i++)
{ cout<<a[<<i<<]=;
cin>>a[i];
}
//2 Afiarea elementelor unui vector:
cout<<Vectorul introdus este:\n;
for (i=0; i<n i++)
cout<<a[i]<< ;
//3 Afiarea elementelor unui vector n ordine invers:
cout<<Elementele vectorului n ordine invers:\n;
for (i=n-1; i>=0 i++)
cout<<a[i]<< ;
//3 Vectorul sum (c) a vectorilor a i b, cu acelai numr de elemente:
for (i=0; i<n i++)
c[i]=a[i]+b[i];
//4 Vectorul diferen (c) a vectorilor a i b, cu acelai numr de elemente:
for (i=0; i<n i++)
c[i]=a[i] - b[i];
//5 Produsul scalar (p) a vectorilor a i b, cu acelai numr de elemente:
n 1
a b i i
p= i 0 double p=0;
for (i=0; i<n i++)
p += a[i] b[i];
Din punct de vedere conceptual, elementele unui tablou bidimensional sunt plasate n spaiu pe dou direcii.
Matricea reprezint o aplicaie natural a tablourilor bidimensionale.
n matematic:
q 11 q 12 q 13 ... q 1n
q 21 q 22 q 23 ... q 2n
Q= .......................... Q m n
q m1 q m2 q m3 ... q mn
Exemplu:
double q[3][2]; // declararea matricii q, cu maxim3 linii i 2 coloane, tip double
55
CAPITOLUL 4 Tablouri
Dac se dorete iniializarea elementelor unei matrici n momentul declarrii acesteia, se poate proceda
astfel:
int mat[4][3] = {
{10, -50, 3},
{32, 20, 1},
{-1, 1, -2},
{7, -8, 19} };
Prin aceast construcie, elementele matricii mat se iniializeaz n modul urmtor:
mat[0][0]=10, mat[0][1]=-50, mat[0][2]=3
mat[1][0]=32, mat[1][1]=20, mat[1][2]=1
mat[2][0]=-1, mat[2][1]=1, mat[2][2]=-2
mat[3][0]=7, mat[3][1]=-8, mat[3][2]=19
La declararea unei matrici i iniializarea elementelor sale, se poate omite numrul maxim de linii, n schimb,
datorit modului de memorare, trebuie specificat numrul maxim de coloane:
int mat[][3] = {
{10, -5, 3},
{32, 20, 1},
{-1, 1, -2},
{7, -8, 9} };
Construcia are acelai efect ca precedenta.
int mat[][3] = {
{1, 1},
{ -1},
{3, 2, 1}};
mat reprezint o matrice 3 3, ale crei elemente se iniializeaz astfel:
mat[0][0]=1, mat[0][1]=1, mat[1][0]=-1, mat[2][0]=3, mat[2][1]=2, mat[2][2]=1
Elementele mat[0][2], mat[1][1], mat[1][2] nu sunt initalizate. Ele au valoarea zero dac tabloul este global
i valori iniiale nedefinite dac tabloul este automatic.
55
CAPITOLUL 4 Tablouri
irurile de caractere sunt tablouri de caractere, care au ca ultim element un terminator de ir, caracterul null
(zero ASCII), \0.
Exemplu:
char tc[5] = {a, b, c, d, e}; // tablou de caractere
char sc[5] = {a, b, c, d, \0}; // irul de caractere cu elementele abcd
Limbajul C/C++ permite iniializarea unui tablou de caractere printr-o constant ir (ir ntre ghilimele), care
include automat caracterul null. Deci ultima iniializare este echivalent cu:
char sc[5] = abcd; //sau cu
char sc[] = abcd;
Exemplu:
char tc[5] = {a, b, c, d, e};
char sc[5] = {a, b, c, d, \0};
char sc1[5] = abcd;
char s[10];
cout<<sc<<\n; //afieaz abcd
cout<<tc<<\n;
//eroare: tabloul de caractere nu conine terminatorul de ir, deci nu poate fi afiat ca ir
cout<<s<<\n; // eroare: tablou neiniializat
cout<<sc1[2]; // afieaz al treilea element din irul sc1
sc1[1]=K; // elementului din ir de indice 1 i se atribuie valoarea K;
strlen (nume_ir)
Returneaz un numr ntreg ce reprezint lungimea unui ir de caractere, fr a numra terminatorul de ir.
Exemplu:
#include <iostream.h>
#include <string.h>
void main()
{
char sir1[] = abcd, sir2[] = abcde, sir3 = "abcdef, sir4 = "de;
cout<<strcmp(sir1, sir2)<<\n; // afiare: -101
// e = 101, a = 97, d = 100
//0 - e = -101
cout<<strcmp(sir2, sir1)<<\n; //afiare: 101
55
CAPITOLUL 4 Tablouri
cout<<strcmp(sir1, "")<< '; //compararea variabilei sir1 cu constanta ir vid
char str1[20]=hello;
char str2[20]=goodbye;
char str3[20];
int difer, lungime;
cout<<str1=<<str1<< str2=<<str2<<\n;
difer=strcmp(str1, str2);
if (difer == 0)
cout<<Siruri echivalente!\n;
else if (difer>0)
cout<<str1<< mai mare (lexicografic) dect <<str2<<\n;
else
cout<<str1<< mai mic (lexicografic) dect <<str2<<\n;
cout<<str1=<<str1<<\n; cout<<str3=<<str3<<\n;
strcpy (str3, str1); cout<<str1=<<str1<<\n;
cout<<str3=<<str3<<\n;
strcat (str3, str1);
cout<<str1=<<str1<<\n;
cout<<str3=<<str3<<\n;
}
ALGORITM Bubble_Sort
INCEPUT
gata false
CIT TIMP not gata REPETA
INCEPUT
gata = true
PENTRU i=0 LA n-2 REPETA
INCEPUT
DACA vect[i] > vect[i+1] ATUNCI
` INCEPUT
aux=vect[i]
vect[i]=vect[i+1]
vect[i+1]=aux
gata=fals
55
CAPITOLUL 4 Tablouri
SFARSIT
SFARSIT
SFARSIT
SFARSIT
Exemplu: S se citeasc elementele matricilor A(M XN), B(NXP) i C(MXN), unde M<=10, N<=10 i P<=10.
S se interschimbe liniile matricii A n modul urmtor: prima cu ultima, a doua cu penultima, etc. S se
T
calculeze i s se afieze matricile: AT=A , SUM=A+C, PROD=AXB. Implementarea citirilor i afirilor se
va completa conform exemplului dat n capitolul 4.2.
#include <iostream.h>
void main()
{
double a[10][10], b[10][10], c[10][10];
int m,n,p,j;
cout<<"m="; cin>>m; cout<<"n="; cin>>n; cout<<"p="; cin>>p;
// de completat secvena de citire a elementelor matricii a, cu m linii i n coloane
// de completat secvena de citire a elementelor matricii b, cu n linii i p coloane
// de completat secvena de afiare a matricii a
//interschimbarea liniilor matricii A:
for (i=0; i<m/2; i++)
for (j=0; j<n; j++){
double aux=a[i][j];a[i][j]=a[m-1-i][j];a[m-1-i][j]=aux;
}
cout<<"Matricea A cu liniile interschimbate:\n";
// de completat secvena de afiare a matricii a
T
// calculul matricii AT =A
double at[10][10]; // at este matricea transpusa
for (i=0; i<n; i++)
for (j=0; j<m; j++)
at[i][j]=a[j][i];
cout<<"A transpus=\n";
// de completat secvena de afiare a matricii at, cu n linii si m coloane
// de completat secvena de citire a elementelor matricii c, cu m linii i n coloane
// calculul matricii SUM=A+C, SUM(MxN):
double sum[10][10]; // sum este matricea suma dintre a si c
for (i=0; i<m; i++)
for (j=0; j<n; j++)
sum[i][j]=a[i][j]+ c[i][j];
cout<<"Matricea SUM=A+C este:\n";
// de completat secvena de afiare a matricii sum
double prod[10][10]; // prod este matricea produs dintre a si b
for (i=0; i<m; i++)
for (j=0; j<p; j++){
prod[i][j]=0;
for (k=0; k<n; k++)
prod[i][j]+=a[i][k]*b[k][j];
}
55
CAPITOLUL 4 Tablouri
cout<<"Matricea produs dintre A si B este:\n";
// de completat secvena de afiare a matricii prod, cu m linii si p coloane
}
Se observ c fiecare element din matricea produs PROD=A XB ( A(MXN), B(NXP) ), PROD(MXP) este de
n 1
a i ,k * bk , j
forma: prod i, j = k 0 , unde i= 0, m 1 i j= 0, n 1 .
NTREBRI I EXERCIII
Chestiuni teoretice
Chestiuni aplicative
55
CAPITOLUL 4 Tablouri
h) S se calculeze i s se afieze sumele i produsele elementelor matricii A, aflate n triunghiurile
haurate:
55