Динамичке матрице

Матрице (дводимензиони низови) су, у ствари, низови низова. За приступ елементима динамичке матрице не могу се користити (обични) показивачи, већ је неопходно користити сложеније показивачке типове. Ми ћемо користити показиваче на показиваче, зато што они обезбеђују најопштији механизам дефинисања динамичке матрице – када ниједна димензија није унапред позната!
Да бисмо реализовали динамичку матрицу потребно је низ показивача (који показују на почетни елеменат сваког реда у матрици) реализовати као динамички низ. Да бисмо резервисали меморијски простор за смештање динамичке матрице димензија mXn, при чему је m број редова, а n број колона користимо следеће наредбе:

int **a=new int *[m]; // a je definisano kao niz pokazivaca na cele brojeve
 for(i=0;i<m;i++) a[i]=new int[n];

Након дефинисања променљиве a која представља низ показивача на целе бројеве, име a можемо убудуће користити као да се ради о дводимензионом низу и писати a[i][j].

Смештање матрице у меморију

Оперативна меморија је по природи једнодимензиона структура, па је важно знати како се смештају вишедимензионе структуре као што је матрица. С обзиром на чињеницу да је матрица – низ низова, следи да се елементи матрице смештају ред по ред. На пример, матрица декларисана:

int a[3][5];

у меморији рачунара биће смештена на следећи начин:

smestanjeMatriceТреба водити рачуна о томе да је a показивач на низове. Због тога a+1 није адреса елемента a[0][1], већ почетна адреса подниза a[1], а то је други ред матрице чији је први елеменат a[1][0].

Ослобађање меморије

Приликом ослобађања меморије најпре се ослобађају сви редови, а затим низ показивача који показује на редове матрице:

for(i=0;i<m;i++)delete [] a[i];
 delete [] a;

Примери:

1. Написати програм који формира и исписује динамичку матрицу чији је сваки елеменат једнак: aij=100*i*j (водити рачуна у којим границама се крећу индекси код матрица у програмском језику C, како би се избегле колоне са свим елементима једнаким 0).

#include <iostream>
 #include<cstdlib>
 using namespace std;
 int main()
 {
      int m,n,i,j;
      cout<<"unesi dimenzije matrice";cin>>m>>n;
      int **a=new int *[m];
      for(i=0;i<m;i++)
      {
           a[i]=new int[n];
           for(j=0;j<n;j++) {a[i][j]=100*(i+1)*(j+1);cout<<a[i][j]<<'\t';}
           cout<<endl;
      }
      for(i=0;i<m;i++)delete [] a[i];
      delete [] a;
      return 0;
 }

2. Написати програм у програмском језику C++ у који уносимо динамичку матрицу димензија mXn, а након тога исписати унету матрицу.

#include <iostream>
 #include<cstdlib>
 using namespace std;
 int main()
 {
      int m,n,i,j;
      cout<<"unesi dimenzije matrice";cin>>m>>n;
      int **a=new int *[m];
      cout<<"unesi elemente matrice";
      for(i=0;i<m;i++)
      {
           a[i]=new int[n];
           for(j=0;j<n;j++) cin>>a[i][j];
      }
      cout<<"uneta matrica:"<<endl;
      for(i=0;i<m;i++)
      {
           for(j=0;j<n;j++) cout<<a[i][j]<<'\t';
           cout<<endl;
      }
      for(i=0;i<m;i++)delete [] a[i];
      delete [] a;
      return 0;
 }

3. Написати програм у програмском језику C++ у који уносимо динамичку матрицу димензија mXn, а он уређује матрицу по збировима колона. (најпре се формира низ дужине m (број редова), па се тај низ сортира по растућем редоследу, при чему приликом замене 2 елемента низа који нису у редоследу треба мењати и редослед елемената одговарајућих колона)

#include <iostream>
 #include<cstdlib>
 using namespace std;
 int main()
 {
      int m,n,i,j;
      cout<<"unesi dimenzije matrice";cin>>m>>n;
      int **a=new int *[m];
      cout<<"unesi elemente matrice";
      for(i=0;i<m;i++)
      {
           a[i]=new int[n];
           for(j=0;j<n;j++) cin>>a[i][j];
      }
      cout<<"pocetna matrica:"<<endl;
      for(i=0;i<m;i++)
      {
           for(j=0;j<n;j++) cout<<a[i][j]<<'\t';
           cout<<endl;
      }
      int *s=new int[m];
      for (j=0;j<n;j++)
           for(s[j]=i=0;i<m;i++)s[j]+=a[i][j];
      for (i=0;i<n-1;i++)
      {
           int min,p;
           for (min=i,j=i+1; j<n;j++)
                if (s[j]<s[min]) min=j;
           if (min != i)
           {
                p=s[i];s[i]=s[min];s[min]=p;
                for(j=0;j<m;j++){p=a[j][i];a[j][i]=a[j][min];a[j][min]=p;}
           }
      }
      cout<<"uredjena matrica:"<<endl;
      for(i=0;i<m;i++)
      {
           for(j=0;j<n;j++) cout<<a[i][j]<<'\t';
           cout<<endl;
      }
      for(i=0;i<m;i++)delete [] a[i];
      delete [] a;
      return 0;
 }

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s