Cuvânt înainte.....

După o vară lungă şi frumoasă iată că ne apropiem de primele zile de şcoală. Pentru a vă uşura reacomodarea cu programarea, sau pur şi simplu pentru a vă delecta in compania problemelor de informatică am creat acest blog.

Tablouri bidimensionale


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];                                         



  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
ş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>

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 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
ş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>
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();