Matrici

Matrice

O matrice este o structura de date care are elementele de acelasi fel dispuse pe linii si pe coloane. Matricea are m linii si n coloane. O matrice poate arata astfel:

 

 

 

 

matrice             matrice2  matrice3

 

 

 

 

Matricile prezentate mai sus sunt MATRICI PATRATICE (numarul de linii este egal cu numarul de coloane), iar in C++ are anumite proprietati ajutatoare.

Matricea se declara folosind comanda: tip [numar max. de linii] [numar max. de coloane];. Exemplu: int x[10][5]. Am declarat o matrice de tip int cu maxim 10 linii si 5 coloane. Ca si la vectori, matricea declarata este …goala. Trebuie sa ii atribuim elemente fiecarui spatiu liber. Atribuirea se face aproximativ ca la vectori, doar ca aici vom avea doua repetitii, deoarece fiecarei linii ii corespunde n-1 coloane, etc, si vom avea nevoie de o variabila i, ce va reprezenta linia, si una j, ce va reprezenta coloana. Vom mai folosi inca 2 variabile, n si m, care vor reprezenta numarul actual de linii, respectiv coloane

 

Iata cum facem atribuirea in C++: for (i=0; i<n; i++)

for (j=0; j<m; j++)

cin>>x[i][j];         In aceasta mica aplicatie, vom citi de la tastatura o matrice, si o vom afisa pe ecran. Iata cum facem:

 

#include <iostream.h>

void main ()

{

int x[10][10], n, m, i, j;//m=matricea, n, m= nr actual de linii/coloane, i, j=linia, respectiv coloana

cout<<”Dati numarul de linii: “; cin>>n;//citim nr de linii

cout<<”Dati numarul de coloane: “; cin>>m; //citim nr. de coloane

cout<<”Introduceti elementele matricei: “<<endl;

for (i=0; i<n; i++)

for (j=0; j<m; j++)

{

cout<<”x[„<<i<<„][„<<j<<„]=”;

cin>>x[i][j]; //citim elementele matricei

}

cout<<”Afisam matricea: “<<endl;

for (i=0; i<n; i++)

for (j=0; j<m; j++)

{cout<<x[i][j]<<” “;  //si afisam fiecare linie, respectiv coloana, dar cu un mic spatiu intre elemente

cout<<endl; //dupa fiecare linie terminata, trebuie sa trecem la alt rand

}

Probleme rezolvate:

1.) Afisarea elementelor unei matrici

 

Se citeste o matrice patratica.Sa se afiseze elementele de pe diagonala secundara,elementele de pe diagonala principala,elementele de sub/desupra diagonalei secundare/principala.

#include<iostream.h>

 

 

main()

{

int i,j,n,a[20][20];

cin>>n;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>a[i][j];

cout<<„diagonala principala”<<endl;

for(i=0;i<n;i++)

cout<<a[i][i]<<” „;

 

cout<<endl<<„diagonala secundara”<<endl;

for(i=0;i<n;i++)

cout<<a[i][n-1-i]<<” „;

 

cout<<endl<<„elementele de deasupra diagonalei principale”<<endl;

for(i=0;i<=n-2;i++)

for(j=i+1;j<=n-1;j++)

cout<<a[i][j]<<” „;

 

cout<<endl<<„elementele de sub diagonala principala”<<endl;

for(i=1;i<=n-1;i++)

for(j=0;j<=i-1;j++)

cout<<a[i][j]<<” „;

 

cout<<endl<<„elementele de deasupra diagonalei secundare”<<endl;

for(i=0;i<=n-2;i++)

for(j=0;j<=n-i-2;j++)

cout<<a[i][j]<<” „;

 

cout<<endl<<„elementele de sub diagonala secundara”<<endl;

for(i=1;i<=n-1;i++)

for(j=n-i;j<=n-1;j++)

cout<<a[i][j]<<” „;

}

2.) afisare matrici instructiunea for

Se citeste n. Sa se afiseze urmatoarele forme. In exemplu n=4:

 

1)

 

1 2 3 4

1 2 3

1 2

1

 

#include<iostream.h>

main()

{

int i,j,n;

cout<<„n=”;cin>>n;

for(i=1;i<=n;i++)

{

for(j=1;j<=n-i+1;j++)

cout<<j<<” „;

cout<<endl;

}

}

 

2)

 

1 1 1 1

2 2 2

3 3

4

 

#include<iostream.h>

main()

{

int i,j,n;

cout<<„n=”;cin>>n;

for(i=1;i<=n;i++)

{

for(j=1;j<=n-i+1;j++)

cout<<i<<” „;

cout<<endl;

}

}

 

4)

 

4 3 2 1

4 3 2

4 3

4

 

#include<iostream.h>

main()

{

int i,j,n;

cout<<„n=”;cin>>n;

for(i=1;i<=n;i++)

{

for(j=1;j<=n-i+1;j++)

cout<<n-j+1<<” „;

cout<<endl;

}

}

3.) Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤n≤100)şi apoi elementele unui tablou bidimensional cu n linii şi n coloane, care memorează numere naturale cu cel mult 9 cifre fiecare; programul afişează pe ecran acele valori din tablou care sunt strict mai mici decât toate elementele cu care se învecinează direct (aflate pe aceeaşi linie dar pe o coloană alăturată sau pe aceeaşi coloană dar pe o linie alăturată).Numerele afişate vor fi separate prin câte un spaţiu.

 

 

 

#include<iostream.h>

 

 

 

 

long a[101][101];

 

int n,i,j;

 

int verifica(int i,int j)

 

{

 

long x=a[i][j];

 

if((i+1<=n)&&

 

(x>=a[i+1][j]))return 0;

 

if((i-1>=1)&& (x>=a[i-1][j]))return 0;

 

if((j-1>=1)&& (x>=a[i][j-1]))return 0;

 

if((j+1<=n)&&(x>=a[i][j+1]))return 0;

 

return 1;

 

}

main()

 

{ do{cin>>n;}while(n<=1 ||n>=100);

 

for(int i=1;i<=n;i++)

 

for(int j=1;j<=n;j++)

 

cin>>a[i][j];

 

for(i=1;i<=n;i++)

 

for(j=1;j<=n;j++)

 

if (verifica(i,j)==1)

 

cout<<a[i][j]<<” „;

 

}

4.) Se considera o matrice An*m cu elemente numere intregi. Sa se determine linia (liniile) din matrice care contine cele mai multe elemente nenule.

 

#include<iostream.h>

main( )

{

int a[30][30],n,m,i,j,max,nr;

cout<<„Dati numarul de linii n = „;cin>>n;

cout<<„Dati numarul de coloane m = „;cin>>m;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

cout<<„a[„<<i<<„,”<<j<<„]= „;

cin>>a[i][j];

}

cout<<endl<<„Matricea A are elementele:”<<endl;

for(i=1;i<=n;i++)

{

for(j=1;j<=m;j++) cout<<a[i][j]<<” „;

cout<<endl;

}

max=0;

for(i=1;i<=n;i++)

{

nr=0;

for(j=1;j<=m;j++)

if(a[i][j]!=0) nr++;

if(max<nr) max=nr;

}

for(i=1;i<=n;i++)

{

nr=0;

for(j=1;j<=m;j++)

if(a[i][j]!=0) nr++;

if(max==nr) cout<<„Linia „<<i<<” are „<<max<<” elemente

nenule”<<endl;

}

}

5.) Sa se scrie un program care calculeaza transpusa unei matrici An*m

 

#include <iostream.h>

main( )

{

int n,m,i,j,a[30][30],b[30][30];

cout<<„Dati dimensiunile matricei „<<endl;

cout<<„Dati numarul de linii n = „;cin>>n;

cout<<„Dati numarul de coloane m = „;cin>>m;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

cout<<„a[„<<i<<„,”<<j<<„]= „;

cin>>a[i][j];

}

cout<<„Elementele matricei A sunt: „<<endl;

for(i=1;i<=n;i++)

{

for(j=1;j<=m;j++)

cout<<a[i][j]<<” „;

cout<<endl;

}

for(i=1;i<=n;i++)

for(j=1;i<=m;i++)

b[j][i]=a[i][j];

cout<<„Matricea transpusa este „<<endl;

for(i=1;i<=n;i++)

{

for(j=1;j<=m;j++)

cout<<b[i][j]<<” „;

cout<<endl;

}

}

6.) Sa se scrie un program care calculeaza produsul a doua matrici bidimensionale A si B.

 

#include <iostream.h>

main()

{

int n,m,p,i,j,k,a[10][10],b[10][10],c[10][10];

cout<<„Dati numarul de linii n = „;cin>>n;

cout<<„Dati numarul de coloane m = „;cin>>m;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

cout<<„a[„<<i<<„,”<<j<<„]= „;

cin>>a[i][j];

}

cout<<„Elementele matricei A sunt: „<<endl;

for(i=1;i<=n;i++)

{

for(j=1;j<=m;j++)

cout<<a[i][j]<<” „;

cout<<endl;

}

cout<<„Dati numarul de linii m = „;cin>>m;

cout<<„Dati numarul de coloane p = „;cin>>p;

for(i=1;i<=m;i++)

for(j=1;j<=p;j++)

{

cout<<„b[„<<i<<„,”<<j<<„]= „;

cin>>b[i][j];

}

cout<<„Elementele matricei B sunt: „<<endl;

for(i=1;i<=m;i++)

{

for(j=1;j<=p;j++)

cout<<b[i][j]<<” „;

cout<<endl;

}

for(i=1;i<=n;i++)

for(j=1;j<=p;j++)

for(k=1;k<=m;k++)

c[i][j]+=a[i][k]*b[k][j];

cout<<„Elementele matricei produs „<<endl;

for(i=1;i<=n;i++)

{

for(j=1;j<=p;j++)

cout<<c[i][j]<<” „;

cout<<endl;

}

}

7.) Scrieti un program care construieste in memorie un tablou t cu n linii si n coloane, cu elemente numere intregi, astfel incat pe diagonala principala sa existe numai elemente egale cu 1, elementele de pe cele doua semidiagonale paralele cu diagonala principala si alaturate diagonalei principale sa fie tot egale cu 2, elementele de pe urmatoarele doua semidiagonale sa fie egale cu 3 etc.Valoarea lui n se citeste de la tastatura.

 

#include<iostream.h>

int a[20][20],nr[30],i,j,n,k,m,max=0;

main()

{

cout<<„n=”;cin>>n;

for(i=0;i<=n-1;i++)

for(j=0;j<=n-1;j++)

if(i==j) a[i][j]=1;

for(i=0;i<=n-2;i++)

{k=2;

for(j=i+1;j<=n-1;j++)

{a[i][j]=k;k=k+1;}

}

for(i=0;i<=n-1;i++)

for(j=0;j<=n-1;j++)

a[j][i]=a[i][j];

for(i=0;i<=n-1;i++)

{

for(j=0;j<=n-1;j++)

cout<<a[i][j]<<” „;

cout<<endl;

}

}

8.) Se da o matrice cu m lini * n coloane, ale carei elemente sunt cifre de 0 si 1. Sa se afiseze indicii liniei (liniilor) pe care se afla cele mai multe valori de 1.

 

#include<iostream.h>

int a[20][20],nr[30],i,j,n,m,max=0;

main()

{

cout<<„n=”;cin>>n;

cout<<„m=”;cin>>m;

for(i=0;i<=m-1;i++)

for(j=0;j<=n-1;j++)

{

cout<<„a[„<<i<<„][„<<j<<„]=”;

cin>>a[i][j];

}

for(i=0;i<=m-1;i++)

nr[i]=0;

for(i=0;i<=m-1;i++)

{

for(j=0;j<=n-1;j++)

nr[i]=nr[i]+a[i][j];

if(max<nr[i]) max=nr[i];

}

for(i=0;i<=m-1;i++)

if(nr[i]==max) cout<<i<<” „;

}

9.) Se da o matrice cu m lini * n coloane.Sa se memoreze intr-un vector b sumele elementelor de pe fiecare lini a matricii ( b[i] va reprezenta suma elementelor de pe linia i in matrice)

 

#include<iostream.h>

int a[20][20],b[30],i,j,n,m;

main()

{

cout<<„n=”;cin>>n;

cout<<„m=”;cin>>m;

for(i=0;i<=m-1;i++)

for(j=0;j<=n-1;j++)

{

cout<<„a[„<<i<<„][„<<j<<„]=”;

cin>>a[i][j];

}

for(i=0;i<=m-1;i++)

b[i]=0;

for(i=0;i<=m-1;i++)

for(j=0;j<=n-1;j++)

b[i]=b[i]+a[i][j];

for(i=0;i<=m-1;i++)

cout<<b[i]<<” „;

}

10.) O matrice patratica cu n linii *  n coloane se numeste triunghiulara superior daca toate elementele aflate sub diagonala principala sunt nule. Realizati un program care verifica daca matricea este triunghiulara superior.

 

#include<iostream.h>

int a[20][20],i,j,n,g;

main()

{

cout<<„n=”;cin>>n;

for(i=0;i<=n-1;i++)

for(j=0;j<=n-1;j++)

{

cout<<„a[„<<i<<„][„<<j<<„]=”;

cin>>a[i][j];

}

g=1;

for(i=1;i<=n-1;i++)

 

for(j=0;j<=i-1;j++)

if(a[i][j]) g=0;

if(g==0)

cout<<„nu este triunghiulara superior”;

else cout<<„este triunghiulara”;

}

Probleme propuse:

 

1.)  Se citesc elementele unei matrici cu m linii si n coloane.  Sa se calculeze produsul elementelor impare din matrice.

2.)  Se citeste o matrice. Cate componente prime are matricea?

3.)  Se citeste o matrice. Sa se calculeze media aritmetica a elementelor pare

4.)  Se da o matrice cu m linii si n coloane. Sa se calculeze suma elementelor de pe fiecare linie a matricei.

5.)  Se da o matrice cu m limii si n coloane. Sa se calculeze suna elementelor de pe marginea matricei.