Sunteți pe pagina 1din 6

Tablouri bidimensionale

Prelucrări asupra tablourilor bideminsionale (matricelor)

a ) Definiţie
Tablou bidimensional = succesiune de locaţii de memorie recunoscute prin
acelaşi
identificator şi prin poziţia fiecăreia în cadrul şirului. Poziţia este dată printr-o suită de
două numere pozitive (indecşi), care reprezintă cele două dimensiuni (linie şi coloană).

Valorile atribuite elementelor tabloului trebuie să fie de acelaşi tip.

Organizarea unui tablou bidimensional în memorie este de reprezentată în figura de mai


jos:

Ex. Introducerea unui tablou de 6 linii şi 8 coloane (6 x 8) având elemente întregi este
de forma:
int x[6][8];

X [0 ] [1 ] [2 ] [3 ] [4 ] [5 ] [6 ] [7 ]

[0 ] 23 67

[1 ]

[2 ]

[3 ]

[4 ]

[5 ]

Exemplu de instrucţiune de atribuire


x[0][0] = 23;
x[0][5] = 67;

b) Citirea tablourilor bidimensionale

Citirea elementelor unui tablou nu este posibilă decât prin citirea fiecărui element.
De aceea, la fel ca şi în cazul vectorilor operaţia de citire a matricilor impune
folosirea a două secvenţe ciclice suprapuse. Acestea corespund indicelor liniei (i),
respectiv coloanei (j).

Ex.

int tab[5][5];
int i,j;
printf(“\n Introduceti dimensiunile matricei (m si n) ”);
scanf(“%d %d”,&m,&n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
printf(“\n tab[%d][%d] = : ”,i,j); //se va afisa tab[i][j]= şi se aşteaptă
scanf(“%d”,&tab[i][j]); //introducerea valorii care se atribuie
} //variabilei tab[i][j]

Obs:
1. Dimensiunile efective ale tabloului introdus de către utilizator (m si n) nu
trebuie să depăşească dimensiunile cu care a fost declarat tabloul
bidimensional.
2. Identificarea zonei de memorie unde va fi reţinut tabloul se face cu ajutorul
numelui tabloului. Acesta are ca valoare adresa primului element din tablou,
tab[i][j]), ceea ce îl deosebeşte de identificatorul folosit pentru variabilele
simple care nu reprezintă o adresă.
&tab ≡ tab ≡ &tab[0][0];
3. Instrucţiunea printf( .......) din interiorul secvenţei ciclice cu contorizare va
afişa numai numele variabilei care se citeşte.
4. Instrucţiunea scanf(.......) va prelua valoarea citită de la tastatură şi o va
memora (înscrie) în poziţia respectivă (tab[i][j]).
5. Un exemplu frecvent întâlnit de citire eronată a unei matrici este de forma:
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
printf(“\n tab[%d][%d] = %d: ”,i,j, tab[i][j]);
scanf(“%d”,&tab[i][j]);
}
Se execută mai întâi instrucţiunea de afişare. De exemplu pt i=0 şi j=0 rezultatul
interpretării acesteia este afişarea: tab[0][0] = -30731. În continuare se va executa
instrucţiunea de citire care va aşteapta introducerea valorii care se va memora în locaţia
tab[0][0].Valoarea afişată –30731 provine din faptul că în momentul afişării variabila
tab[0][0] nu este iniţializată şi de aceea se va interpreta conţinutul acestei locaţii ca o
variabilă întreagă şi apoi este afişată. Variabila tab a fost declarată anterior ca având
elemente întregi.
c) Afişarea matricelor
Ex. Să se afişeze matricea sub formă de tablou rectangular(ca o matrice). Aceasta a fost
iniţializată anterior direct în cadrul instrucţiunii de declarare.

int tab[5][5]={{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,24}};
printf(“\n Elementele vectorului sunt: ”);
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
printf(“%4d”, tab[i][j]);
printf(“\n”);
}
d) Prelucrări asupra matricelor

Ex. Pentru o matrice dată să se calculeze suma elementelor care aparţin unui interval dat
(xinf<=tab[i][j] && xsup>=tab[i][j]).
Prezentarea algoritmului :
- se citesc capetele intervalului în care trebuie să se încadreze elementele cautate în
matrice
xinf şi xsup
- se citesc dimensiunile matricei
m şi n
- se citesc elementele matricei
pentru i=0,m-1 execută
pentru j=0,n-1 execută
citeşte tab[i][j];
sfârşit pentru
sfârşit pentru

- suma = 0;
- se parcurge matricea element cu element. Se testează dacă elementul curent se
încadrează în intervalul dorit şi în caz afirmativ elementul curent se adună la suma
calculată anterior
pentru i=0,m-1 execută
pentru j=0,n-1 execută
dacă tab[i][j] > xi şi tab[i][j] < xf atunci
suma = suma + tab[i][j];
sfârşit dacă
sfârşit pentru
sfârşit pentru
- afişează suma
Obs. Variabila suma reprezintă suma calculată.

Ex. 7 Să se determine elementul maxim de pe fiecare linie dintr-o matrice


#include <stdio.h> {
#include <conio.h> printf("\t");
for(j=0;j<n;j++)
void main() printf(" %4d",tab[i][j]);
{ printf("\n");
int tab[10][10],max_lin[10]; }
int i,j,m,n,max;
for(i=0;i<m;i++)
clrscr(); {
printf("\n Introduceti dimensiunile matricei "); max=matr[i][0];
scanf("%d %d",&m,&n); for(j=0;j<n;j++)
printf("\n Introduceti elementele matricei\n"); {
if(max < tab[i][j])
for(i=0;i<m;i++) max=tab[i][j];
{ }
for(j=0;j<n;j++) max_lin[i]=max;
{ }
printf("tab[%d][%d]=",i,j); printf("\n elementele vectorului de maxime
scanf("%d",&tab[i][j]); sunt");
} for(i=0;i<m;i++)
} printf(" %5d",max_lin[i]);
getch();
printf("\n Matricea citita de la tastatura este: \n"); }
for(i=0;i<m;i++)

Obs. Vectorul max_lin conţine elementele maxime de pe fiecare linii. Evident acesta are
dimensiunea egală cu numărul liniilor matrucii tab.

e) Operaţii din algebra matriceală

Ex. 8 Să se determine matricea transpusă a unei matrice citită de la tastatură


(matr_A)

Prezentarea algoritmului :

- se citesc dimensiunile matricelor


m şi n
- se citesc elementele matricei iniţiale
pentru i=0,m-1 execută
pentru j=0,n-1 execută
citeşte matr_A[i][j];
sfârşit pentru
sfârşit pentru
- ecou
- se parcurge matricea iniţială element cu element, elementul cu indicele [i][j]
devenind elementul cu indicele [j][i] în matricea finală
pentru i=0,m-1 execută
pentru j=0,n-1 execută
matr_B[i][j] = matr_A[j][i]
sfârşit pentru
sfârşit pentru

- se afişează elementele matricei finale (matricea transpusă)


pentru i=0,n-1 execută
pentru j=0,m-1 execută
afişează matr_B[i][j];
sfârşit pentru
sfârşit pentru

Ex. Să se determine matricea produs rezultată în urma înmulţirii a doua matrice:


matr_C(m,n) = matr_A(m,n) x matr_B(m,n)

Obs. Programul nu verifică corectitudinea dimensiunilor matricelor pentru a


efectua operaţia de înmulţire.
#include <stdio.h>
#include <conio.h> printf("matr_B[%d][%d]=",i,j);
void main() scanf("%d",&matr_B[i][j]);
{ }
int matr_A[10][10], matr_B[10][10];
int matr_C[10][10]; printf("\n Matricea citita de la tastatura este: \n");
int i,j,k,m,n,p; for(i=0;i<n;i++)
clrscr(); {
printf("\n Introduceti dimensiunile matricelor "); printf("\t");
scanf("%d %d %d",&m,&n,&p); for(j=0;j<p;j++)
printf("\n Introduceti elementele primei matrici \n"); printf(" %4d",matr_B[i][j]);
for(i=0;i<m;i++) printf("\n");
for(j=0;j<n;j++) }
{
printf("matr_A[%d][%d]=",i,j); for(i=0;i<m;i++)
scanf("%d",&matr_A[i][j]); for(j=0;j<p;j++)
} matr_C[j][i] = 0;

printf("\n Matricea citita de la tastatura este: \n"); for(i=0;i<m;i++)


for(i=0;i<m;i++) for(j=0;j<p;j++)
{ for(k=0;k<n;k++)
printf("\t"); matr_C[i][j] = matr_C[i][j]+matr_A[i][k]*matr_B[k][j];
for(j=0;j<n;j++)
printf(" %4d",matr_A[i][j]); printf("\n Matricea produs \n");
printf("\n"); for(i=0;i<m;i++)
} {
printf("\t");
printf("\n Introduceti elementele pentru matr B \n"); for(j=0;j<p;j++)
for(i=0;i<n;i++) printf(" %4d",matr_C[i][j]);
for(j=0;j<p;j++) printf("\n");
{ }
getch();

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