Дводимензионални низи

2D ARRAY 

 

Mатрици се дводимензионални низи и се користат за претставување на елементи (од ист тип) во табели со редици и колони. 

Исто како кај низите, секој елемент се наоѓа на некоја позиција. Разликата е во тоа што индексите се всушност парови. Па така за елементот што се наоѓа на позиција горе лево, во C++ индекс ќе му биде (0,0). Бидејќи зборуваме за дводимензионална низа имаме всушност „табела“ со редици, колони и главна дијагонала. Големината на матрицата би била број на редици x број на колони.

Дводимензионалните низи се декларираат со следнава наредба:
tip ime [R][C];

tip го означува податочниот тип на секој од елементите во дводимензионалната низа,

ime го означува името на променливата, 

R и C го означуваат бројот на редови и колони, соодветно. 

Индексите на елементите во дводимензионалните низи се движат од 0 до R-1 (за редовите) и од 0 до C-1 (за колоните) - слично како и кај еднодимензионалните низи. Пристапот до елементите се изведува преку наведување на името на променливата (со која е декларирана дводимензионалната низа) и индексот на редот и колоната, наведени едно по друго

(mat[0][0], mat[0][1], mat[0][2], ..., mat [1][0], mat [1][1], ..., mat [2][0], mat [2][1], итн).



 

Бидејќи повеќедимензионалните низи претставуваат низи од низи, тие можат да се иницијализираат преку наведување на вредностите за секоја од низите, посебно. На пример, следните две наредби може да се искористат за декларирање и иницијализација на матрица со 2 реда и 3 колони:

1
2
3
double m[2][3] = {{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}};
double m[][3] = {{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}};
double m[][] = {{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}}; //GRESHKA

Притоа, првата наредба експлицитно го наведува бројот на редови во матрицата, додека кај втората наредба тоа се прави автоматски (од страна на компајлерот). Важно е да се наведе дека, при ваквиот начин на иницијализација, може да го избегнеме експлицитното наведување на само една димензија (онаа првата - најзначајната). Оттаму, третата наредба е невалидна и ќе предизвика пријавување на грешка. Експлицитното наведување на димензиите овозможува, како и кај еднодимензионалните низи, доделување вредност 0 на одредена група на елементи:

int m[10][10] = {0};


Читање и печатење елементи на матрица    
Следниот код има излез A B C D E F G H
 
Транспонирана матрица 

Единечна матрица - квадратна матрица од ред nxn со 1 по дијагонала и 0 на другите полиња.


Дијагонална матрица -квадратна матрица од ред nxn каде сите елементи освен главната дијагонала се 0-ли. 

Операции со матрици 
Собирање 
 Одземање       

Множење 

 
Програма со која се внесуваат елементите на дводимензионална низа(матрица) и се печати матрицата (без употреба на потпрограми)

#include <iostream>
using namespace std;
int main()
{  
    float a[50][50];
    int m,n,i,j;
    //sekogas, prvo mora da se vnese brojot na redici i koloni
    cout<<"Kolku redici ima matricata?"<<endl;
    cout<<"m="; cin>>m;
    cout<<"Kolku koloni ima matricata?"<<endl;
    cout<<"n="; cin>>n;
    //elementite na matricata se vnesuvaat so dva for ciklusi
    cout << "Vnesete gi elementite na matricata: " << endl;
    for(i=0;i<m;i++)
      {
         for(j=0;j<n;j++)
         {
            cout<<"a["<<i<<","<<j<<"]=";
            cin>>a[i][j];
         }
         cout<<endl;
      }
    //za pecatenje na matricata povtorno se koristat dva for ciklusi
    cout<<"\nJa vnesovte matricata:"<<endl;
      for(i=0;i<m;i++)
      {
         for(j=0;j<n;j++)
            cout<<a[i][j]<<"\t";
         cout<<endl;
      }
cout<<endl;
return 0;
}

Програма со која се внесуваат елементите на дводимензионална низа(матрица) и се печати матрицата (со употреба на потпрограми)

#include <iostream>
using namespace std;
void vnesi_matrica(int m,int n,int A[50][50])
{
     int i,j;
     for(i=0;i<m;i++)
     {
       for (j=0;j<n;j++)
       {
          cout<<"A["<<i<<","<<j<<"]=";
          cin >> A[i][j];
       }
       cout<<endl;
     }
}
void pecati_matrica(int m,int n,int A[50][50])
{
     int i,j;
     for(i=0;i<m;i++)
    {
       for (j=0;j<n;j++)
          cout<<A[i][j]<<"\t";
       cout<<endl;
    }
}
     
int main()
{
    int matrica[50][50];
    int m,n;
    cout << "Vnesi go brojot na redici"<<endl;
    cout<<"m="; cin>>m;
    cout << "Vnesi go brojot na koloni"<<endl;
    cout<<"n="; cin>>n;
    cout << "Vnesete gi elementite na nizata: " << endl;
    vnesi_matrica(m,n,matrica);
    cout<<"Ja vnesovte matricata:"<<endl;
    pecati_matrica(m,n,matrica);
cout<<endl;
return 0;
}

Да се состави потпрограма со која ќе се пресмета збирот на елементите од главната дијагонала и збирот на елементите од споредната дијагонала на една квадратна матрица.

#include <iostream>
using namespace std;
void vnesi_matrica(int m,int n,int A[50][50])
{
     int i,j;
     for(i=0;i<m;i++)
     {
       for (j=0;j<n;j++)
       {
          cout<<"A["<<i<<","<<j<<"]=";
          cin >> A[i][j];
       }
       cout<<endl;
     }
}
void pecati_matrica(int m,int n,int A[50][50])
{
     int i,j;
     for(i=0;i<m;i++)
    {
       for (j=0;j<n;j++)
          cout<<A[i][j]<<"\t";
       cout<<endl;
    }
}
void Diagonali(int A[50][50], int m, int &Rdiag, int &Ldiag)
{
     int i;
     for(i=0,Rdiag=0;i<m;i++)
        Rdiag+=A[i][i];
     for(i=0,Ldiag=0;i<m;i++)
        Ldiag+=A[m-i-1][i];


int main()
{
    int A[50][50];
    int m,Glavna,Sporedna;
    cout << "Vnesi go brojot na redici i koloni na matricata A"<<endl;
    cout<<"m="; cin>>m;
    cout << "\nVnesete gi elementite na matricata A: " << endl;
    vnesi_matrica(m,m,A); 
    cout<<"\nJa vnesovte matricata A:"<<endl;
    pecati_matrica(m,m,A);
    Diagonali(A,m,Glavna,Sporedna);
    cout<<"\nZbirot na elementite od glavnata dijagonala e:"<<Glavna<<endl;
    cout<<"Zbirot na elementite od sporednata dijagonala e:"<<Sporedna<<endl;
cout<<endl;
return 0;
}

Прочитај и испечати дводимензионална низа - кадратна матрица nxn. Потоа испечати ги членовите на низата кои се наоѓаат под главната дијагонала (i>j)
#include <iostream>
using namespace std;
int main(void)
{
int n;
cout<<"Dimenziја na kvadratnа matricа --->"; 
cin>>n;
int iMatrica[n][n];
for(int i=0; i < n; i++)
{
 for(int j=0; j < n; j++)
 {
    cout<<"iMatrica ["<<i<<","<<j<<"] ---> ";
    cin>>iMatrica[i][j];
  }
}
cout<<endl;
for(int i=0; i < n; i++)
{
   for(int j=0; j < n; j++)
    {
            if(i>j)
              {
                      cout<<iMatrica[i][j]<<" "; 
                }
                    else
                        cout<<" ";
     }
            cout<<endl;
}
return 0; }

Да се состави потпрограма со која ќе се најде транспонираната матрица на матрицата А. Tранспонирана матрица се добива кога ќе се направи замена на редиците со колоните,односно транспонираната матрица B[i][j] = A[j][i]

#include <iostream>
using namespace std;
void vnesi_matrica(int m,int n,int A[50][50])
{
     int i,j;
     for(i=0;i<m;i++)
     {
       for (j=0;j<n;j++)
       {
          cout<<"A["<<i<<","<<j<<"]=";
          cin >> A[i][j];
       }
       cout<<endl;
     }
}
void pecati_matrica(int m,int n,int A[50][50])
{
     int i,j;
     for(i=0;i<m;i++)
    {
       for (j=0;j<n;j++)
          cout<<A[i][j]<<"\t";
       cout<<endl;
    }
}
void Transpose(int A[50][50], int B[50][50],int m, int n)
{
  for(int R=0;R<n;R++)
    for(int C=0;C<m;C++)
       B[R][C]=A[C][R];


int main()
{
    int A[50][50],B[50][50];
    int m,n;
    cout << "Vnesi go brojot na redici na matricata A"<<endl;
    cout<<"m="; cin>>m;
    cout << "Vnesi go brojot na koloni na matricata A"<<endl;
    cout<<"n="; cin>>n;
    cout << "\nVnesete gi elementite na matricata A: " << endl;
    vnesi_matrica(m,n,A);
    cout<<"\nJa vnesovte matricata A:"<<endl;
    pecati_matrica(m,n,A);
    Transpose(A,B,m,n);
    cout<<"Transponiranata matrica B e:"<<endl;
    pecati_matrica(n,m,B);
cout<<endl;
return 0;
}

Кој е излезот за следниот код 





No comments: