Sunteți pe pagina 1din 5

Tablouri bidimensionale Prelucrri asupra tablourilor bideminsionale (matricelor)

a ) Definiie Tablou bidimensional = succesiune de locaii de memorie recunoscute prin acelai identificator i prin poziia fiecreia n cadrul irului. Poziia este dat printr-o suit d ou numere pozitive (indeci), care reprezint cele dou dimensiuni (linie i coloan). Valorile atribuite elementelor tabloului trebuie s fie de acelai 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) avnd elemente ntre gi este de forma: int x[6][8];

Exemplu de instruciune de atribuire x[0][0] = 23; x[0][5] = 67; b) Citirea tablourilor bidimensionale

Citirea elementelor unui tablou nu este posibil dect prin citirea fiecrui element. De aceea, la fel ca i n cazul vectorilor operaia de citire a matricilor impune folo sirea a dou secvene ciclice suprapuse. Acestea corespund indicelor liniei (i), res pectiv 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 ateapt scanf(%d,&tab[i][j]); //introducerea valorii care se atribuie } //variabilei tab[i][j] Obs: 1. Dimensiunile efective ale tabloului introdus de ctre utilizator (m si n) nu trebuie s depeasc dimensiunile cu care a fost declarat tabloul bidimensional. 2. Identificarea zonei de memorie unde va fi reinut tabloul se face cu ajuto rul numelui tabloului. Acesta are ca valoare adresa primului element din tablou, tab[i][j]), ceea ce l deosebete de identificatorul folosit pentru variabilele sim ple care nu reprezint o adres. &tab tab &tab[0][0]; 3. Instruciunea printf( .......) din interiorul secvenei ciclice cu contoriza re va afia numai numele variabilei care se citete. 4. Instruciunea scanf(.......) va prelua valoarea citit de la tastatur i o va m emora (nscrie) n poziia respectiv (tab[i][j]). 5. Un exemplu frecvent ntlnit 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 nti instruciunea de afiare. De exemplu pt i=0 i j=0 rezultatul i nterpretrii acesteia este afiarea: tab[0][0] = -30731. n continuare se va executa i nstruciunea de citire care va ateapta introducerea valorii care se va memora n locai a tab[0][0].Valoarea afiat 30731 provine din faptul c n momentul afirii variabila tab[ ][0] nu este iniializat i de aceea se va interpreta coninutul acestei locaii ca o var iabil ntreag i apoi este afiat. Variabila tab a fost declarat anterior ca avnd elemen tregi. c) Afiarea matricelor Ex. S se afieze matricea sub form de tablou rectangular(ca o matrice). Aceasta a fo st iniializat anterior direct n cadrul instruciunii 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) Prelucrri asupra matricelor Ex. Pentru o matrice dat s se calculeze suma elementelor care aparin unui interval dat (xinf<=tab[i][j] && xsup>=tab[i][j]). Prezentarea algoritmului : se citesc capetele intervalului n care trebuie s se ncadreze elementele cau tate 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 citete tab[i][j]; sfrit pentru sfrit pentru - suma = 0; se parcurge matricea element cu element. Se testeaz dac elementul curent s e ncadreaz n intervalul dorit i n caz afirmativ elementul curent se adun la suma calcu lat 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]; sfrit dac sfrit pentru sfrit pentru - afieaz 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> void main() { int tab[10][10],max_lin[10]; int i,j,m,n,max; clrscr(); printf("\n Introduceti dimensiunile matricei "); scanf("%d %d",&m,&n); printf("\n Introduceti elementele matricei\n"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { printf("tab[%d][%d]=",i,j); scanf("%d",&tab[i][j]); } } printf("\n Matricea citita de la tastatura este: \n"); for(i=0;i<m;i++) { printf("\t"); for(j=0;j<n;j++) printf(" %4d",tab[i][j]); printf("\n"); } for(i=0;i<m;i++) { max=matr[i][0]; for(j=0;j<n;j++) { if(max < tab[i][j]) max=tab[i][j]; } max_lin[i]=max; } printf("\n elementele vectorului de maxime sunt"); for(i=0;i<m;i++) printf(" %5d",max_lin[i]); getch(); }

Obs. Vectorul max_lin conine elementele maxime de pe fiecare linii. Evident acest a are dimensiunea egal cu numrul liniilor matrucii tab. e) Operaii 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 iniiale pentru i=0,m-1 execut pentru j=0,n-1 execut citete matr_A[i][j]; sfrit pentru sfrit pentru ecou se parcurge matricea iniial 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] sfrit pentru sfrit pentru se afieaz elementele matricei finale (matricea transpus) pentru i=0,n-1 execut pentru j=0,m-1 execut afieaz matr_B[i][j]; sfrit pentru sfrit pentru Ex. S se determine matricea produs rezultat n urma nmulirii 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 operaia de nmulire.

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

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

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