Sunteți pe pagina 1din 10

Tablouri

Unitatea de învăţare nr. 11

TABLOURI

Cuprins Pagin
a

Obiectivele unităţii de învăţare nr. 11 2

11.1 Tablouri bidimensionale (matrici) 2

11.2 Operații cu matrici 2

11.3. Exemple de probleme cu matrici 4

Test de autoevaluare 8

Lucrare de verificare – unitatea de învăţare nr. 11 8

Răspunsuri şi comentarii la întrebările din testele de autoevaluare 9

Recapitulare 10

Bibliografie – unitatea de învăţare nr. 11 10

1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

OBIECTIVELE unităţii de învăţare nr. 11

Principalele obiective ale Unităţii de învăţare nr. 11 sunt:

 Înţelegerea organizării datelor în matrici


 Familiarizarea cu tablourile bidimensionale
 Modelarea datelor de prelucrat pe principiul utilizării
tablourilor bidimensionale
 Implementarea cu succes a problemelor care
utilizează matrici

11.1. TABLOURI BIDIMENSIONALE (matrici)

Din punct de vedere conceptual, elementele unui tablou bidimensional sunt


plasate în spaţiu pe două direcţii. Matricea reprezintă o aplicaţie 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

În limbajele C/C++ (indicii de linie şi de coloană pot să pornească de la 0):


q 00 q 01 q 02 ... q 0,n1
q 10 q 11 q 12 ... q 1,n1 Q m n
Q=
............................
q m1,0 q m1,1 q m1,2 . . . q m1,n 1

Exemplu:
double q[3][2]; // declararea matricii q, cu maxim3 linii şi 2 coloane, tip double

În memorie, elementele unei matrici sunt memorate pe linii:


q 00 q 01 q 10 q 11 q 20 q 21 ...
Dacă notăm cu k poziţia în memorie a unui element, valoarea lui k = i  m + j (unde m
este numărul maxim de linii, i este indicele de linie, j este indicele de coloană).

2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

q[0][0] q[0][1] q[0][2] . . . . . . . q[0][n-1] q[1][0] . . . . . . q[m-1][0] . . . q[m-1][n-1]

Dacă se doreşte iniţializarea elementelor unei matrici în momentul declarării acesteia,


se poate proceda astfel:
int mat[4][3] = {
{10, -50, 3},
{32, 20, 1},
{-1, 1, -2},
{7, -8, 19} };
Prin această construcţie, elementele matricii mat se iniţializează în modul următor:
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 iniţializarea elementelor sale, se poate omite numărul


maxim de linii, în schimb, datorită modului de memorare, trebuie specificat numărul
maxim de coloane:
int mat[][3] = {
{10, -5, 3},
{32, 20, 1},
{-1, 1, -2},
{7, -8, 9} };
Construcţia are acelaşi efect ca precedenta.
int mat[][3] = {
{1, 1},
{ -1},
{3, 2, 1}
};
mat reprezintă o matrice 3  3, ale cărei elemente se iniţializează 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 iniţiale nedefinite dacă tabloul este automatic.

Construcţiile utilizate la iniţializarea tablourilor bidimensionale se extind pentru tablouri


multidimensionale, cu mai mult de doi indici.
Exemplu:
int a[2][2][3]={
{ {10, 20}, {1, -1}, {3, 4}},
{ {20, 30}, {50, -40}, {11, 12}}
};

3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

11.2. OPERAȚII CU MATRICI

Să se citească de la tastatură elementele unei matrici de maxim 10 linii şi 10


coloane. Să se afişeze matricea citită.

#include <iostream.h>
void main(void)
{int a[10][10]; int lin, col; cout<<"Nr. linii:"; cin>>lin;
cout<<"Nr. coloane:"; cin>>col;int i, j;
//citirea elementelor unei matrici
for (i=0; i<lin; i++)
for (j=0; j<col; j++) {
cout<<"A["<<i<<","<<j<<"]="; //afişarea unui mesaj prealabil citirii
cin>>a[i][j]; }
//afişarea elementelor matricii
for (i=0; i<nr_lin; i++) {
for (j=0; j<nr_col; j++)
cout<<a[i][j]<<' ';
cout<<endl; // după afişarea elementelor unei linii, se trece pe linia următoare
}
}

11.3. EXEMPLE DE PROBLEME CU MATRICI

1. Se citesc de la tastatură elementele unei matrici pătratice, de dimensiune n,


preluată.
a) Să se afişeze elementele matricei
b) Să se afişeze elementele de pe diagonala principală matricei şi cele de pe
diagonala secundară.
#include <iostream.h>
#include <conio.h>
void main(){clrscr();
int n,i,j;
float a[10][10];
cout<<"Dimensiunea matricei:";cin>>n;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++) {
cout<<"Elementul["<<i<<","<<j<<"]=";
cin>> a[i][j];}
/*afisarea sub forma de matrice*/
for (i=1; i<=n;i++) {
for (j=1; j<=n;j++) cout <<a[i][j]<<" ";
cout<<endl;}
4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

cout<<”Diagonala principala:”<<endl;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++)
if (i==j) cout<<a[i][j]<<" "; cout<<endl;
cout<<”Diagonala secundara:”<<endl;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++)
if (j==n-i+1) cout<<a[i][j]<<" "; cout<<endl;
getch();}

2. Se dau două matrici, a şi b, având m linii şi n coloane. Să se calculeze


matricea sumă c, unde cij=aij+bij

#include <iostream.h>
#include <conio.h>
void main( ) {
int m,n,i,j, a[10][10], b[10][10],c[10][10];
cout<<"Nr. linii:";cin>>m;
cout<<"Nr. coloane:";cin>>n;
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) {
cout<<"a["<<i<<","<<j<<"]=";
cin>> a[i][j]; }
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) {
cout<<"b["<<i<<","<<j<<"]=";
cin>> b[i][j]; }
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) c[i][j]=a[i][j]+b[i][j];
for (i=1; i<=m;i++) {
for (j=1; j<=n;j++)cout <<c[i][j]<<" ";
cout<<endl;}
getch( ); }

3. Se dau două matrici, a şi b, a având m linii şi n coloane, iar b avand n linii si


p coloane. Să se calculeze matricea produs c.
#include <iostream.h>
#include <conio.h>
void main( ) { int a[10][10], b[10][10], c[10][10];
int i, j, k, m, n, p;
// Se citesc dimensiunile matricelor a si b
cout<<"Dimensiunile matricei a"<<endl;
cout<<"Nr. linii:"; cin>>m;

5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

cout<<"Nr. coloane:"; cin>>n;


cout<<"Dimensiunile matricei b"<<endl;
cout<<"Nr. linii:"<<n<<endl;
cout<<"Nr. coloane:"; cin>>p;
//Se citeste matricea A
for(i=1; i<=m; i++)
for(j=1; j<=n; j++) {
cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j]; }
//Se citeste matricea B
for(i=1; i<=n; i++)
for(j=1; j<=p; j++){
cout<<"b["<<i<<","<<j<<"]=";
cin>>b[i][j]; }
//Se calculeaza matricea C
for(i=1; i<=m; i++)
for(j=1; j<=p; j++)
{ c[i][j]=0;
for(k=1; k<=n; k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; }
//Se afiseaza matricea A
cout<<"Matricea A:"<<endl ;
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) cout<<a[i][j]; cout<<endl; }
//Se afiseaza matricea B
cout<<"Matricea B:"<<endl;
for(i=1; i<=n; i++) {
for(j=1; j<=p; j++) cout<<b[i][j];cout<<endl; }
//Se afiseaza matricea C
cout<<"Matricea produs C:" <<endl;
for(i=1; i<=m; i++) {
for(j=1; j<=p; j++) cout<<c[i][j]<<" ";cout<<endl; }
getch( ); }
4. Se introduc punctajele realizate de m concurenţi la n probe sub forma unei
matrici a, cu m linii şi n coloane. Afişaţi punctajul total realizat de fiecare
concurent.
Exemplu: Date de intrare: m=3 n=2
punctaj concurent 1: 7 9
punctaj concurent 2: 10 8
punctaj concurent 3: 9 9
Date de intrare:
Concurent 1 : 16
Concurent 2 : 18
Concurent 3 : 18
6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

#include <iostream.h>
#include <conio.h>
void main(){clrscr();
int m,n,i,j, a[10][10], s ;
cout<<"Nr. concurenti: (linii in matricea a )"; cin>>m;
cout<<"Nr. probe (coloane in matricea a):";cin>>n;
//se introduc punctajele fiecarui concurent i, pentru fiecare proba j, in elementul a[i][j]
for (i=1; i<=m;i++)
for (j=1; j<=n;j++) {
cout<<"Dati punctajul concurentului "<<i<<" proba "<<j<<":";
cin>> a[i][j];}
// se calculeaza punctajul total pentru fiecare concurent in variabila s
for (i=1; i<=m;i++) {s=0;
for (j=1; j<=n;j++) s=s+a[i][j];
cout<<"Concurent "<<i<<":"<<s<<endl; };
getch();}

5. Trebuie cumparate p produse din m magazine. Să se scrie un program care să


indice, pentru fiecare produs, magazinul în care acesta are preţul minim.
Cunoscând cantităţile ce trebuie cumpărate pentru fiecare produs, să se
determine suma ce urmează a fi cheltuită.
Exemplu: p=2 m=3
şi preţurile aşezate într-o matrice cu p linii şi m coloane: 50 48 49.5
11 11.5 11.5
se va afişa: produs 1 pret minim in magazin 2
produs 2 pret minim in magazin 1
cunoscând cantităţile 5 7, suma necesară va fi de 317 lei.
#include <iostream.h>
#include <conio.h>
void main( ){ int m,p,i,j,k;
long int a[10][10], s, min[10], c[10] ;
cout<<"Nr. produse: (linii in matricea a )"; cin>>p;
cout<<"Nr. magazine (coloane in matricea a):";cin>>m;
//se introduc preturile pentru produsul i, magazinul j, in elementul a[i][j]
for (i=1; i<=p;i++)
for (j=1; j<=m;j++) {
cout<<"Dati pretul produsului "<<i<<" magazinul "<<j<<":";
cin>> a[i][j];}
// se calculeaza in vectorul min, pretul minim pentru fiecare produs i, in cele m
magazine
// k reprezinta magazinul unde a fost identificat pretul minim, la un moment dat
for (i=1; i<=p;i++) {min[i]=a[i][1];k=1;
7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

for (j=2; j<=m;j++) if (min[i]>a[i][j]) {min[i]=a[i][j] ;k=j;} ;


cout<<"Produs "<<i<<" pret minim in magazin "<<k<<endl;}
/*se introduc cantitatile din produsul i, ce trebuie cumparate, in componenta c[i] a
vectorului c*/
for (i=1; i<=p;i++) {
cout<<"Dati cantitatea necesara din produsul "<<i<<":";
cin>> c[i];}
//se calculeaza suma totala necesara
s=0;
for (i=1; i<=p;i++) s=s+c[i]*min[i]; cout<<"Suma necesara: "<<s; getch();}

Test de autoevaluare 11
1. Se citesc de la tastatură elementele unei matrici pătratice, de
dimensiune n, preluată. Să se afişeze suma elementelor de
deasupra diagonalei principale.
2. Se citește o matrice a, având m linii și c coloane. Afișați
matricea transpusă lui a.

Lucrare de verificare la Unitatea de învăţare nr. 11


1. Să se afişeze elementele matricii a care sunt numere prime.
#include <iostream.h>
#include <conio.h>
void main(){clrscr();
int n,i,j, a[10][10],p, k;
cout<<"Nr. linii:"; cin>>m;
cout<<"Nr. coloane:"; cin>>n
for(i=1; i<=m; i++)
for(j=1; j<=n; j++) {
cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j]; }
for(i=1; i<=m; i++)
for(j=1; j<=n; j++) {
p=1;
for(k=1; k<=a[i][j]/2; k++)
if (a[i][j]%k==0) p=0;
if (p) cout<<a[i][j];}
getch( ); }

8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii

xy ( x(
2
xy x y) y ) 2
Tablouri

2. Să se calculeze şi să se afişeze sumele elementelor matricii


a, aflate în triunghiurile haşurate

#include <iostream.h>
#include <conio.h>
void main(){ int n,i,j;
float a[10][10], s1=0, s2=0;
cout<<"Dimensiunea matricei:";cin>>n;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++) {
cout<<"Elementul["<<i<<","<<j<<"]=";
cin>> a[i][j];}
for (i=1; i<=n;i++)
for (j=1; j<=n;j++) {
if (n-i+1<j) s1=s1+a[i][j];
if (i>j) s2=s2+a[i][j];}
cout<<”s1=”<<s1<<endl;
cout<<”s2=”<<s2<<endl;
getch();}

Răspunsuri şi comentarii la întrebările din testele de


autoevaluare
1. #include <iostream.h>
#include <conio.h>
void main(){ int n,i,j;
float a[10][10], s=0;
cout<<"Dimensiunea matricei:";cin>>n;
for (i=1; i<=n;i++)
for (j=1; j<=n;j++) {
cout<<"Elementul["<<i<<","<<j<<"]=";
cin>> a[i][j];}
for (i=1; i<=n;i++)
for (j=1; j<=n;j++)
if (i<j) s=s+a[i][j];
cout<<”Suma elementelor de deasupra diag. principale=”<<s<<endl;
getch();}

9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Tablouri

2. #include <iostream.h>
#include <conio.h>
void main(){clrscr();
int n,i,j;
float a[10][10];
cout<<"Nr. linii:"; cin>>m;
cout<<"Nr. coloane:"; cin>>n
for(i=1; i<=m; i++)
for(j=1; j<=n; j++) {
cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j]; }
for(j=1; j<=n; j++)
for(i=1; i<=m; i++) {
cout<<a[j][i]; cout<<endl; }

Recapitulare
Matricile sunt tablouribidimensionale, conținând informație de
același tip, organizată pe linii și coloane
Declararea unei variabile de tip matrice se face astflel:
tip nume[nrLinii, nrCol], unde tip=tipul de date al elementelor
nume=numele matricei
nrLinii =numărul maxim de linii
nrCol= numărul maxim de coloane
Identificarea unui element dintr-o matrice se face pe baza indicilor
acestuia, astfel:
nume[i,j] identifică în matricea nume elmentul din linia i și coloana j

Bibliografie

10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii

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