Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
-Tablouri Bidimensionale-
Operatii cu matrice
Cuprins
Notiuni teoretice……………………………………………………………2
Matricea patratica..............................................................5
Operatii cu matrice………………………………………………………….7
Aplicatii (tablouri bidimensionale)………………………………….11
Aplicatie C# Inmultirea a doua matrice…………………………20
Concluzii…………………………………………………………………………30
Bibliografie……………………………………………………………………..31
1
Notiuni Teoretice
Definiţie
2
Declararea matricei
Sintaxa generala:
tip_nume [marime1][marime2], ( în C++ matricea fiind de fapt un vector de
vectori ) , unde:
- tip – tipul de bază al componentelor matricei;
- nume – numele matricei;
- marime 1 – numărul de linii al matricei;
- marime 2 – numărul de coloane al matricei;
3
Citirea matricei
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 matricelor
impune folosirea a două secvenţe ciclice suprapuse. Acestea corespund indicelor
liniei ( i ) , respectiv coloanei ( j ).
Citirea matricei se face având urmatoarea sintaxă generală:
cout<< ‘ ‘ n= ‘ ‘;
cin>>n;
for ( i=1; i<=n; i++)
for ( j=1; j<=n; j++)
{ cout<< “mat [ “ <<i<< ’ , ‘<<j<< ”] = “ ;
cin>>mat[i][j]; }
Afişarea matricei
4
Matricea Patratica
O matrice cu proprietatea că numărul de linii este egal cu numărul de coloane se numeşte matrice
pătratică.
Fie matricea a cu n linii şi n coloane în care primul element are coordonatele (1,1) de mai jos:
Diagonala principală
Diagonala principală este formată din elementele care îndeplinesc relația i=j – numărul liniei este egal cu
numărul coloanei pe care se află.
Diagonala secundară
Diagonala secundară conţine elementele a1n, a2 n-1 , a3 n-2,...,an1 caracterizate de relaţia i+j=n+1.
Elementele de deasupra diagonalei principale sunt a12, a13, a14,...,a1n, a23, a24, a25,...,a2n, ...., an-1 n-
1, an-1 n. Relaţia dintre coordonate comună tuturor elementelor din această zonă este i<j.
Elementele a21, a31, a32,...,a41, a42, a43, .....,an1, an2, an n-1 se află sub diagonala principală şi au
între coordonate relaţia i>j.
În practică prelucrarea elementelor se poate face exclusiv pe diagonale respectiv pe zonele identificate
5
mai sus(ex:ordonarea diagonalelor respectiv verificarea simetriei sau a triunghiularităţii) sau se poate
opta pentru o parcurgere a tuturor elementelor matricei şi prelucrarea diferenţiată a elementelor în
funcţie de relaţia dintre coordonate(ex: completarea elementelor cu anumite valori, calculul simultan al
mai multor rezultate obţinute pentru fiecare zonă în parte).
Diagonala principala:
for (i=1;i<=n;i++)
<prelucrează a[i][i]>
Diagonala secundara:
for (i=1;i<=n;i++)
<prelucrează a[i][n-i+1]>
6
OPERAŢII CU MATRICE
Pentru a copia elementele unei matrici a într-o matrice b, se parcurge matricea a pe linii si coloane şi se
copiază pe rând fiecare element în matricea b.
întreg i, j, m, n, a[20][20], b[20][20];
#include <iostream>
int a[10][10],b[10][10],i,j,m,n;
using namespace std;
int main()
{
cout<<"nr de linii =";
cin>>m;
cout<<"nr de coloane=";
cin>>n;
cout<<"matricea a =";
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
7
cin>>a[i][j];
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
b[i][j]=a[i][j];
cout<<"matricea obtinuta "<<endl;
for(i=1;i<=m;i++)
{ for(j=1;j<=n;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
return 0;
}
Pentru a calcula suma elementelor unei matricii parcurgem matricea şi într-o variabilă s adunăm pe rând
fiecare element
#include <iostream>
int a[100][100],i,j,n,m,s=0;
using namespace std;
int main()
{
cout<<"Dati numarul de linii !";
cin>>n;
cout<<"Dati numarul de coloane !";
cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
s=s+a[i][j];
return 0;
}
Algoritmul se bazează pe algoritmul de calcul a sumei elementelor unei matrici, doar că la sfârşit vom
împărţi suma la numărul de elemente a matricii.
#include <iostream>
#include <conio.h>
int a[10][10],b[10][10],i,j,m,n,s=0,nr=0;
8
float med;
using namespace std;
int main()
{
cout<<"nr de linii =";
cin>>m;
cout<<"nr de coloane=";
cin>>n;
cout<<"matricea a =";
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{ s=s+a[i][j];
nr++; }
med=s/nr;
cout<<"media aritmetica= "<<(float)med;
return 0;
}
#include <iostream>
#include <conio.h>
int a[10][10], i,j,m,n,x,nr=0;
using namespace std;
int main(){
cout<<"nr de linii =";
cin>>m;
cout<<"nr de coloane=";
cin>>n;
cout<<"matricea a =";
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cout<<"x= ";
cin>>x;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(x==a[i][j])
9
nr++;
if(nr==0)
cout<<"NU EXISTA ";
else
cout<<"EXISTA";
return 0;
}
10
APLICAŢII-Tablouri bidimensionale
1. Fie o matrice a cu m linii şi n coloane şi elemente numere întregi. Numim “matrice perfect oglindită”,
matricea obţinută din a prin aplicarea urmatoarelor operaţii:
-se inversează liniile între ele ( se scriu de sus în jos liniile citite de jos în sus);
-se inversează elementele fiecărei linii între ele (se scriu de la stânga la dreapta elementele liniei citite
de la dreapta la stânga);
-fiecărui element i se inversează cifrele (elementele sunt înlocuite cu oglinditele lor);
Numim “matrice perfect oglindită” o matrice a cărei “oglindă” este identică cu matricea. Realizaţi un
program care, pentru o matrice dată a ,verifică dacă este “perfect oglindită” , afişând un mesaj
corespunzător.
#include <iostream>
#include <conio.h>
int main()
{
int n,m,a[30][30],i,j,k,nr1=0,nr2=0,nr=0,ok=0;
cout<<"nr de linii =";
cin>>m;
cout<<"nr de coloane =";
cin>>n;
cout<<"matricea a =";
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{ cin>>a[i][j];
nr++;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
11
if(oglindit(a[i][j])==a[i][j])
ok++;
k=1;
while(k<=m)
{ for(i=1;i<=n/2;i++)
for(j=n;j>=n/2+1;j--)
if(a[k][i]==a[k][j])
nr1++;
k++;}
k=1;
while(k<=m/2)
{ for(i=1;i<=n;i++)
if(a[k][i]==a[m+1-k][i])
nr2++;
k++;}
if(n%2!=0 && m%2!=0)
if((2*nr1==(n*m)-m) && (2*nr2==(n*m)-n) && ok==nr)
cout<<"matrice perfect oglindita";
else
cout<<"nu";
else
if(n%2==0 && m%2==0)
if((2*nr1==m*n ) && (2*nr2==n*m) && ok==nr)
cout<<"matrice perfect oglindita";
else
cout<<"nu";
if(n%2!=0 && m%2==0)
if((2*nr1==(n*m)-m)&&(2*nr2==n*m) && ok==nr)
cout<<"matrice perfect oglindita";
else
cout<<"nu";
if(n%2==0 && m%2!=0)
if((2*nr1==m*n ) && (2*nr2==(n*m)-n) && ok==nr)
cout<<" matrice perfect oglindita";
else
cout<<" matricea nu este oglindita ";
return 0;
}
#include <iostream>
#include <conio.h>
12
using namespace std;
int main()
{
int n, a[100][100],i,j,x,y,z;
cout<<"n=";
do
{ cin>>n;
}
while(!(n>=1&&n<=6));
x=y=1;
z=x+y;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ a[i][j]=x;
x=y;
y=z;
z=x+y;
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
3.Pentru o matrice dată a cu m linii şi n coloane şi elemente întregi, să se elimine liniile şi coloanele la
intersecţia cărora se află valoarea 0, fără a folosi altă matrice . Programul va tipări matricea rezultată
după eliminări, specificând şi noile dimensiuni ale acesteia.
#include <iostream>
#include <conio.h>
13
cout<<endl<<endl;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0)
{ for(k=1;k<=m;k++)
for(l=j+1;l<=n;l++)
a[k][l-1]=a[k][l];
n--;
for(k=i+1;k<=m;k++)
for(l=1;l<=n;l++)
a[k-1][l]=a[k][l];
m--;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0)
{ for(k=1;k<=m;k++)
for(l=j+1;l<=n;l++)
a[k][l-1]=a[k][l];
n--;
for(k=i+1;k<=m;k++)
for(l=1;l<=n;l++)
a[k-1][l]=a[k][l];
m--;
}
cout<<"matrice obtinuta :";
cout<<endl;
if(n==0||m==0)
{cout<<"matrice nula"<<endl;
n=m=0;}
for(i=1;i<=m;i++)
{ for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"dimensiunile matricei sunt : "<<m<<"*"<<n;
return 0;
}
4.Fiind dată o matrice a cu m linii si n coloane si elemente numere întregi , scrieţi un program care
construieşte transpusa acesteia . Programul va afişa matricea transpusă dar si dimensiunile ei.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int a[10][10],b[10][10],i,j,m,n;
14
cout<<"nr de linii =";
cin>>m;
cout<<"nr de coloane=";
cin>>n;
cout<<"matricea a =";
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cout<<endl<<endl;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
b[j][i]=a[i][j];
cout<<"matricea transpusa este : ";
cout<<endl;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
cout<<"cu dimensiunile : "<<n<<"*"<<m;
return 0;
}
5.Se citeşte de la tastatura un numar natural n, si apoi o matrice a cu n linii si n coloane si elmente
numere intregi. Scrieţi un program care realizeaza interschimbari de linii sau coloane necesare , astfel
încât elementele de pe diagonala principala , citite de sus in jos, să fie sortate crescător.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int i,j,n,a[15][15],ok,aux;
cout<<"dimensiune matrice =";
cin>>n;
cout<<"matricea a=";
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cout<<"Matricea noastra : ";
15
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";}
cout<<endl<<endl;
do
{ok=1;
for(i=1;i<n;i++)
if(a[i][i]>a[i+1][i+1])
{ for(j=1;j<=n;j++)
{ aux=a[i][j];
a[i][j]=a[i+1][j];
a[i+1][j]=aux;
}
for(j=1;j<=n;j++)
{ aux =a[j][i];
a[j][i]=a[j][i+1];
a[j][i+1]=aux;
}
ok=0;
} }
while(!ok);
cout<<"matricea obtinuta : ";
cout<<endl;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
return 0;
}
6.Se dă o matrice a cu m linii si n coloane ale carui elemente sunt cifre . Să se calculeze suma numerelor
corespunzătoare fiecarei linii.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int a[10][10],i,j,m,n,x,s=0;
cout<<"nr de linii =";
cin>>m;
cout<<"nr de coloane =";
cin>>n;
16
cout<<"matricea a =";
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cout<<"Matricea noastra : ";
for(i=1;i<=m;i++){
cout<<endl;
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";}
for(i=1;i<=m;i++)
{ x=0;
for(j=1;j<=n;j++)
x=x*10+a[i][j];
s=s+x;
}
cout<<endl;
cout<<"s= "<<s;
return 0;
}
7.Se citeste de la tastatura o matrice a cu m linii si n coloane si elemente numere întregi . Să se afişeze
numărul liniilor matricii , care au elementele în ordine strict crescătoare (citite de la stânga la dreapta ).
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int a[20][20],n,m,i,j,ok,nr=0;
cout<<"nr de linii =";
cin>>n;
cout<<"nr de coloane =";
cin>>m;
cout<<"matricea a este =";
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
cout<<"Matricea noastra : ";
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";}
cout<<endl;
for(i=1;i<=n;i++)
{ ok=1;
for(j=1;j<=m-1;j++)
if(a[i][j]>a[i][j+1])
ok=0;
if(ok==1)
17
nr++;
}
cout<<"nr de linii ordonate este "<<nr<<" ";
return 0;
}
8.Se consideră un tablou bidimensional (nxn) cu elemente întregi. Să se creeze un program care
ordonează descrescător elementele situate pe liniile cu număr de ordine impar (prima linie, linia a treia,
s.a.m.d.).
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int n,a[30][30],m,i,j,aux;
cout<<"nr de linii =";
cin>>n;
cout<<"nr de coloane =";
cin>>m;
cout<<"matricea a =";
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
cout<<"Matricea noastra : ";
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=m;j++)
cout<<a[i][j]<<" "; }
cout<<endl;
for(i=1;i<=n;i=i+2)
{ aux=0;
for(j=1;j<=m-1;j++)
if(a[i][j]<a[i][j+1])
{ aux=a[i][j];
a[i][j]=a[i][j+1];
a[i][j+1]=aux;
}
}
cout<<"matricea obtinuta :";
cout<<endl;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
18
}
9.O matrice patratică cu n linii si m coloane se numeşte triunghiulară superior dacă toate elementele
aflate deasupra diagonalei principale sunt nule. Se citeşte de la tastatura o matrice A cu n linii si n
coloane . Realizaţi un program care verifică dacă matricea este triunghiulară superior, tipărind un mesaj.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int n,i,j,a[20][20],nr1=0,nr2=0;
cout<<"nr de linii si de coloane =";
cin>>n;
cout<<"matricea a =";
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
}
cout<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i<j)
nr1++;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i<j && a[i][j]==0)
nr2++;
if(nr1==nr2)
cout<<"MATRICEA ESTE TRIUNGHIULARA SUPERIOR";
else
cout<<"MATRICEA NU ESTE TRIUNGHIULARA
SUPERIOR";
return 0;
}
19
Aplicatie C# Matrice
20
Form1(proprietati)
ForeColor red
Font...
Panel1
Label3(proprietati)
Text Matricea1
Label2(proprietati)
Label4(proprietati)
TextBox1(proprietati)
TextBox1(metode)
21
textBox2.Focus();
TextBox2(proprietati)
TextBox2(metode)
if(textBox2.Text!=””)
m = Convert.ToInt32(textBox2.Text);
m = int.Parse(textBox1.Text);
textBox3.Text = ceva;
textBox3.Enabled = false;
textBox4.Focus();
Panel2
Label5(proprietati)
Text Matricea2
Label6(proprietati)
Label7(proprietati)
TextBox3(proprietati)
TextBox4(proprietati)
Button1(proprietati)
22
Text citeste
Button2(metode)
panel3.Visible = true ;
panel4.Visible = true;
button2.Visible = true;
m = Convert.ToInt32(textBox2.Text);
m = int.Parse(textBox1.Text);
textBox3.Text = ceva;
n = Convert.ToInt32(textBox1.Text);
n = int.Parse(textBox1.Text);
p = Convert.ToInt32(textBox4.Text);
p = int.Parse(textBox4.Text);
label3.Visible = true;
//citirea matricelor
23
//Console.WriteLine(name);
//Console.ReadLine();
txt1[i, j] = newTextBox();
panel3.Controls.Add(txt1[i, j]);
// Console.WriteLine(name);
//Console.ReadLine();
txt2[i, j] = newTextBox();
panel4.Controls.Add(txt2[i, j]);
24
}
Panel3(proprietati)
Visible=false
Label8(proprietati)
Panel4(proprietati)
Visible=false
Label9(proprietati)
Button2(proprietati)
Text citeste
Visible=false
Button2(metode)
int s;
25
{
txt1[i, j].Dispose();
txt2[i, j].Dispose();
s = 0;
prod[i, j] = s;
//afisarea
26
panel3.Visible = false;
panel4.Visible = false;
button2.Visible = false;
panel5.Visible = true;
txt3[i, j] = newTextBox();
panel5.Controls.Add(txt3[i, j]);
Console.WriteLine();
27
}
Panel5(proprietati)
BackColor
Visible=false
Label10(proprietati)
Button3(proprietati)
Text OK
Visible=false
Button3(metode)
panel5.Visible = false;
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
textBox4.Text = "";
textBox1.Focus();
txt3[i, j].Dispose();
28
Mai trebuiesc declarate variabilele globale
publicstaticint n, m, p;
int[,] a=newint[10,10];
int[,] b=newint[10,10];
29
Concluzii
Bibliografie
http://matrici.wikispaces.com/
30
http://matrici.wikispaces.com/+No%C5%A3iuni+teoretice
http://matrici.wikispaces.com/Matricea+p%C4%83tratic%C4%83
http://matrici.wikispaces.com/Opera%C5%A3ii+matrici
http://matrici.wikispaces.com/Aplica%C5%A3ii+-+Matrici
31