Sunteți pe pagina 1din 8

Algoritmică şi programare

Tablouri bidimensionale(matrici)
Problema 1. Să se elaboreze un program care citeşte de la tastatură două
matrici cu componente întregi şi realizează produsul lor. Să se verifice, de
asemenea, dacă este satisfăcută condiţia ca să se poată realiza produsul
acelor matrici.

#include<iostream>
using namespace std;
void main(void){
int a[10][10],b[10][10],c[10][10],i,j,k,m,n1,n2,p;
cout<<"Introduceti dimensiunile celor doua matrici si elementele
lor"<<endl;
cout<<"Matricea A : "<<endl;
cout<<"numarul de linii : ";cin>>m;
cout<<"numarul de coloane : ";cin>>n1;
for(i=0;i<m;i++)
for(j=0;j<n1;j++){
cout<<"a["<<i+1<<","<<j+1<<"]=";
cin>>a[i][j];
}
cout<<"Matricea B : "<<endl;
do{
cout<<"numarul de linii : ";
cin>>n2;
} while(n2!=n1);
cout<<"numarul de coloane : ";cin>>p;
for(i=0;i<n2;i++)
for(j=0;j<p;j++){
cout<<"b["<<i+1<<","<<j+1<<"]=";
cin>>b[i][j];
}
for(i=0;i<m;i++)
for(j=0;j<p;j++)
c[i][j]=0;
for(i=0;i<m;i++)
for(j=0;j<p;j++)
for(k=0;k<n1;k++)
c[i][j]+=a[i][k]*b[k][j];
cout<<"Matricea produs este :"<<endl;
for(i=0;i<m;i++){
for(j=0;j<p;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}

Problema 2. Să se scrie un program care calculează minimul şi maximul


dintr-o matrice cu m linii şi n coloane, ale cărei elemente sunt citite de
la tastatură.
1
#include <iostream>
using namespace std;
void main(void){
int n,m,min,i,j,max,a[30][30];
cout<<"Dati dimensiunile matricii"<<endl;
cout<<"Dati numarul de linii : ";cin>>n;
cout<<"Dati numarul de coloane : ";cin>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cout<<"a["<<i+1<<","<<j+1<<"]= ";
cin>>a[i][j];
}
min=a[0][0];max=a[0][0];
for(j=0;j<m;j++){
if(a[0][j]<min) min=a[0][j];
if(a[0][j]>max) max=a[0][j];
}
for(i=1;i<n;i++)
for(j=0;j<m;j++){
if(a[i][j]<min) min=a[i][j];
if(a[i][j]>max) max=a[i][j];
}
cout<<"Elementul minim din matrice este "<<min<<endl;
cout<<"Elementul maxim din matrice este "<<max<<endl;
}

Problema 3. Să se scrie un program prin care se citeşte de la tastatură o


matrice cu componentele numere întregi şi afişeaza transpusa sa.

#include <iostream>
using namespace std;
void main(void){
int n,m,i,j,a[30][30];
cout<<"Dati dimensiunile matricii "<<endl;
cout<<"Dati numarul de linii : ";cin>>n;
cout<<"Dati numarul de coloane : ";cin>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cout<<"a["<<i+1<<","<<j+1<<"]= ";
cin>>a[i][j];}
cout<<"----------------------"<<endl;
cout<<"Elementele matricii A sunt: "<<endl;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"----------------------"<<endl;
cout<<"Elementele matricii transpuse sunt: "<<endl;
for(j=0;j<m;j++){
for(i=0;i<n;i++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}

2
Problema 4. Se consideră o matrice A de tip n*n, cu componentele numere
întregi. Să se calculeze:
- suma elementelor de pe diagonala principală;
- produsul elmentelor de pe diagonala secundară;
- minimul elementelor aflate deasupra, respectiv sub diagonala principală;
- maximul elementelor aflate deasupra, respectiv sub diagonala secundară.

#include <iostream>
using namespace std;
void main(void){
int n,i,j,a[30][30],min1,min2,max1,max2,suma,produs;
cout<<"Dati dimensiunile matricii "<<endl;
cout<<"Dati numarul de linii si de coloane n = ";cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
cout<<"a["<<i+1<<","<<j+1<<"]= ";
cin>>a[i][j];
}
cout<<"----------------------"<<endl;
cout<<"Elementele matricii A sunt: "<<endl;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"----------------------"<<endl;
// suma elementelor de pe diagonala pricipala
suma=0;
for(i=0;i<n;i++)
suma+=a[i][i];
cout<<"Suma elementelor de pe diagonala principala este "<<suma<<endl;
// produsul elementelor de pe diagonala secundara
produs=1;
for(i=0;i<n;i++)
produs*=a[i][n-i-1];
cout<<"Produsul elementelor de pe diagonala secundara este
"<<produs<<endl;
// minimul elementelor de deasupra diagonalei principale
min1=32768;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if((i<j) && (a[i][j]<min1))
min1=a[i][j];
cout<<"Minimul de deasupra diag. principale este "<<min1<<endl;
// minimul elementelor de sub diagonala principala
min2=32768;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if((i>j) && (a[i][j]<min2))
min2=a[i][j];
cout<<"Minimul de sub diag. principala este "<<min2<<endl;
// maximul elementelor de deasupra diagonalei principale
max1=-32768;
for(i=0;i<n;i++)
for(j=0;j<n;j++)

3
if((i<j) && (a[i][j]>max1))
max1=a[i][j];
cout<<"Maximul de deasupra diag. principale este "<<max1<<endl;
// maximul elementelor de sub diagonala principala
max2=-32768;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if((i>j) && (max2<a[i][j]))
max2=a[i][j];
cout<<"Maximul de sub diag. principala este "<<max2<<endl;
}

Problema 5. Se consideră o matrice de tip n*m, cu componentele numere


întregi. Să se determine linia (liniile) din matrice care conţine cele mai
multe elemente nenule.

#include <iostream>
using namespace std;
void main(void){
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=0;i<n;i++)
for(j=0;j<m;j++){
cout<<"a["<<i+1<<","<<j+1<<"]=";
cin>>a[i][j];
}
cout<<"----------------------"<<endl;
cout<<"Matricea A este"<<endl;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"----------------------"<<endl;
max=0;
for(i=0;i<n;i++){
nr=0;
for(j=0;j<m;j++)
if(a[i][j]!=0) nr++;
if(max<nr) max=nr;
}
for(i=0;i<n;i++){
nr=0;
for(j=0;j<m;j++)
if(a[i][j]!=0) nr++;
if(max==nr)
cout<<"Linia "<<i+1<<" are "<<max<<" elemente
nenule"<<endl;
}
}

Problema 6. Se consideră o matrice de tip n*m, cu componentele numere


întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.

4
#include <iostream>
using namespace std;
void main(void){
int a[30][30],n,m,i,j,suma=0;
cout<<"Dati numarul de linii n = ";cin>>n;
cout<<"Dati numarul de coloane m = ";cin>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cout<<"a["<<i+1<<","<<j+1<<"]=";
cin>>a[i][j];
}
cout<<"----------------------"<<endl;
cout<<"Matricea A este"<<endl;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"----------------------"<<endl;
for(i=0;i<m;i++){
suma+=a[0][i];
suma+=a[n-1][i];
}
for(i=1;i<n-1;i++){
suma+=a[i][0];
suma+=a[i][n-1];
}
cout<<"Suma elementelor de pe marginea matricii este : "<<suma<<endl;
}

Problema 7. Se consideră o matrice tip n*m, cu componentele numere întregi.


Să se determine maximul fiecărei coloane şi minimul fiecărei linii.

#include<iostream>
using namespace std;
void main(){
int a[30][30],min,max,n,m,i,j;
cout<<"Dati numarul de linii n = ";cin>>n;
cout<<"Dati numarul de coloane m = ";cin>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cout<<"a["<<i+1<<","<<j+1<<"]=";
cin>>a[i][j];
}
cout<<"----------------------"<<endl;
cout<<"Matricea A este"<<endl;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"----------------------"<<endl;
cout<<"Minimurile pe linie sunt : ";
for(i=0;i<n;i++){
min=a[i][0];

5
for(j=1;j<m;j++)
if(a[i][j]<min)
min=a[i][j];
cout<<min<<" ";
}
cout<<endl;
cout<<"Maximurile pe coloane sunt : ";
for(j=0;j<m;j++){
max=a[0][j];
for(i=1;i<n;i++)
if(a[i][j]>max)
max=a[i][j];
cout<<max<<" ";
}
cout<<endl;
}

Problema 8. (Temă) Pentru o matrice A de tip n*m se numeşte punct şa un


element

a(i0,j0)=min{a(i0,j)| j=0,…,m-1}= max{a(i,j0)| i=0,…,n-1}.

Să se determine dacă pentru o matrice citită de la tastatură există punct şa


sau nu, iar în caz afirmativ să se menţioneze coordonatele şi valoarea sa.

Indicaţie: Se foloseşte problema 7.

Problema 9. Se introduce o matrice pătratică de ordin n; să se verifice dacă


este triunghiulară (toate elementele de sub diagonala principală sunt 0) şi
dacă da, să se calculeze determinantul (dacă matricea e triunghiulară atunci
determinantul este egal cu produsul elementelor de pe diagonala principală).

#include<iostream>
using namespace std;
void main() {
int A[50][50],n,i,j,diag=1,p=1;
while(cout<<"n=",cin>>n,n<=0 || n>50);
for(i=0;i<n;i++)
for(j=0;j<n;j++) {
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
cout<<"Se da matricea: "<<endl;
for(i=0;i<n;i++) {
for(j=0;j<n;j++)
cout<<A[i][j]<<" ";
cout<<endl;
}
for(i=0;i<n&&diag;i++)
for(j=0;j<i&&diag;j++)
if(A[i][j])
diag=0;
if(diag) {
for(i=0;i<n;i++)

6
p*=A[i][i];
cout<<"Matricea este triunghiulara. Determinantul este :
"<<p<<endl;
}
else
cout<<"Matricea nu este triunghiulara."<<endl;
}

Problema 10. Să se construiască o matrice cu n linii şi m coloane ce se


completează cu termenii şirului lui Fibonacci. Completarea se va face pe
linii.

#include<iostream>
using namespace std;
int matrice[10][10],m,n,i,j;
void fibonacci(int x, int y) {
int i,j,a=0,b=0,c=1;
for(i=0;i<x;i++)
for(j=0;j<y;j++) {
matrice[i][j]=c;
a=b;
b=c;
c=a+b;
}
}
int main() {
cout<<"Introduceti dimensiunile matricii"<<endl;
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
fibonacci(n,m);
for(i=0;i<n;i++) {
for(j=0;j<m;j++)
cout<<matrice[i][j]<<" ";
cout<<endl;
}
}

Problema 11. Folosind următorul program, care calculează combinări de n luate


câte k (n şi k fiind numere naturale ce satisfac k≤n), să se elaboreze un
algoritm care generează o matrice A cu m linii şi p coloane pentru care,
pentru orice i şi j, elementul A(i,j) ia valoarea combinări de max{i,j} luate
câte min{i,j}.

#include<iostream>
using namespace std;
void main() {
int a,b,c,n,k,Cnk,i;
cout<<"Introduceti n : ";cin>>n;
cout<<"Introduceti k : ";cin>>k;
if(n<k)
cout<<"Calculul nu poate fi efectuat"<<endl;
else {
a=1;
for(i=2;i<=n;i++)
a*=i;

7
b=1;
for(i=2;i<=k;i++)
b*=i;
c=1;
i=2;
while(i<=(n-k)) {
c*=i;
i++;
}
Cnk=a/(b*c);
cout<<"Combinari de "<<n<<" luate cate "<<k<<" : "<<Cnk<<endl;
}
}