Појам дводимензионог низа

До сада смо имали прилике да се упознамо са једнодимензионим низовима чији су елементи скаларне величине (цели бројеви, реални бројеви, знакови,..). Овакви низови се могу шематски приказати као хоризонтална или вертикална листа података, што можемо видети на следећим сликама.


Слика 10.13. Колона
Слика 10.14. Врста
Међутим, у великом броју реалних проблема је погодније податке представити у табеларној форми.


Слика 10.15. Низ низова

Слика 10.16. Матрица

Табела на слици 10.15, висине 10 и ширине 3 садржи 10 врста и 3 колоне.

Произвољна табела висине m и ширине n, може се представити као низ дужине m чији су елементи низови дужине n, у ствари имамо m врста и n колона. Зато дводимензионе низове најчешће називамо матрице (слика 8.4).


Слика 10.17. Табелице

Погледајмо како би изгледале декларације и дефиниције неких матрица. Могуће је приликом дефинисања придружити и почетне вредности.


//Deklaracije proizvoljnih matrica
int [ , ] aMatrica;
float [ , ] bMatrica;
  
//Matrica od 10 celobrojnih nizova duzine 3
int [ , ] аMatrica = new int[10,3]; 
//Matrica od 8 nizova tipa float duzine 2   
float [ , ] bMatrica = new float[8,2];
  
//Matrica dimenzija 3 x 4 (3 redа, 4 kolone)
int[ , ] intMatrica =
{
    //Vrednosti nultog reda  
    {1, 2, 3, 4},  
    //Vrednosti prvog reda   
    {5, 6, 7, 8},    
    //Vrednosti drugog reda 
    {9, 10, 11, 12}, 
};

Сада се можда питате како би могли да приступимо одређеном елементу матрице?!
Појединачнoј врсти се може приступити коришћењем записа аMatrica[ i ],
где је i редни број врсте.
Елементу у i-тој врсти и j-тој колони се може приступити коришћењем записа аMatrica[ i ,j ].

У случају да наша матрица има велики број елемената најбоље је унети вредности са тастатуре у једној for петљи.

 
//Definisemo matricu intMatrica dimenzija 3×4 
int [ , ] intMatrica = new int[3, 4];
int i,j;
 
 
Console.WriteLine("Unesi clanove matrice:");
 
/*Spoljasnja for petlja prolazi po vrstama. Svaka vrsta po i predstavlja jedan niz, 
ciji se elementi unose po j.*/
for (i = 0; i < 3; i++)
{
    /*Unutrasnja for petlja prolazi po kolonama. Kada je jedna vrsta fiksirana, npr. za i=0,
    unose se elementi po promenljivoj j, npr. intMatrica[0,j]*/ 
    for (j = 0; j < 4; j++)
    {
        /*Sledeca naredba ispisuje naziv svakog elementa pojedinacno,pre ispisa vrednosti 
        intMatrica[i,j]*/
        Console.Write("clan[",i,j,"] = ");
        intMatrica[ i, j] = int.Parse(Console.ReadLine());
    }
}
   
//Ispisujemo unete clanove po vrstama i kolonama
for(i = 0; i < 3; i++)
{
    for (j = 0; j < 4 ; j++)
    {
        //Navodnici ostavljaju prazan prostor posle svakog unetog elementa
        Console.Write(" " + intMatrica[i ,j]);
    }
    //Kada se ispise jedna vrsta, prelazi se u sledecu i tako se formira matricni oblik
    Console.WriteLine();
}     
 

Стартовањем овог програма и уносом вредности чланова добија се конзолни екран приказан на следећој слици:

Слика 10.18. Конзола


Напомена: Метод GetLength има увек повратну вредност типа int и враћа број елемената некога низа. У нашој итерацији учествује при провери услова да се бројачи увек крећу по индексима редова и врста матрице.


Пример 1. Написати програм који учитава матрицу целих бројева а димензије m × n и рачуна суму свих елемената матрице.


Решење:





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace suma_elemenata_matrice
{
    class  Program
    {
        static void Main(string[] args)
        {
            //Rezervisemo proizvoljan broj vrsta i kolona u memoriji
            int[,] a = new int[ 30,40 ];
            int i, j;
            //m i n kao dimenzije matrice
            int m, n;
            int s = 0;

            //Unosimo dimenzije matrice            
            Console.WriteLine("Unesite broj vrsta:");
            m = int.Parse(Console.ReadLine());
            
            Console.WriteLine("Unesite broj kolona:");
            n = int.Parse(Console.ReadLine());

            //Unosimo elemente matrice po vrstama        
            Console.WriteLine("Unesi clanove matrice:");
            
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < n; j++)
                {
                    Console.Write("clan[",i,j,"] = ");
                    a [i, j] = int.Parse(Console.ReadLine());
                }
            }
            //Racunamo sumu svih elemenata matrice
            for (i = 0; i < m; i++)
            {
                for (j = 0; j < n; j++)
                {
                    //Iteracijom po promenljivoj j kroz svaku i-tu vrstu dodajemo elemente u zbir s 
                    s = s + a[i, j];
                }
            }
			
            Console.WriteLine("Suma elemenata matrice je:" + s);  
        }
    }
}	
		
  
Пример 2. Написати програм који учитава квадратну матрицу a целих бројева димензије n × n и израчунава највећи и најмањи елемент у матрици, као и збир елемената на главној дијагонали.


Напомена: Главну дијагоналу матрице чине елементи на дијагонали, која спаја горњи леви и доњи десни угао матрице.
Решење:

using System;
using System.Collections.Generic;
using System.Text;

namespace max_min_matrice
{
    class  Program
    {
	//Funkcija koja racuna min i max matrice
        static void min_max(int[,] a,  int n)
        {

            int i, j;
            //Postavljamo promenljive max i min na pocetne vrednosti
            //Element a[0,0] se nalazi u gornjem levom uglu date matrice a
            int max = a[0, 0];
            int min = a[0, 0];
            //Spoljasnjom for petljom prolazimo kroz matricu a po vrstama
            for (i = 0; i < n; i++)
            {
                //Unutrasnjom for petljom prolazimo kroz matricu a po kolonama
                for (j = 0; j < n; j++)
                {
                    //Proveravamo da li je a[i,j] manji od tekuceg minimuma
                    if (a[i, j] < min)
                    {
                        //Ako je manji, onda njegovu vrednost dodeljujemo promenljivoj min
                        min = a[i, j];
                    }
					
                    /*U slucaju da je a[i,j] veci od tekuceg maksimuma, njegovu vrednost dodeljujemo
                    promenljivoj max*/ 
                    if (a[i, j] > max)
                    {
                        max = a[i, j];
                    }
                }
            }
            Console.WriteLine("Najveci  element matrice je:", max,"a najmanji je:", min);
        }
		
        //Funkcija dijagonala izracunava zbir elemenata matrice na dijagonali
        static void dijagonala(int[,] a, int n)
        {
            int i, suma = 0;
            //Kako je i=j dovoljna nam je jedna for petlja po vrstama i kolonama matrice a
            for (i = 0; i < n; i++)
            {
                //Clanovi na dijagonali su oblika a[i,i]
                suma += a[i, i];
            }
            Console.WriteLine("Suma  elemenata na glavnoj dijagonali je {0}", suma);
        }
  
        static void Main(string[] args)
        {
            int[,] aMatrica = new int[10, 10];
            int i, j, max, min, dim;
			
            Console.WriteLine("Unesite dimenziju matrice");
            dim = int.Parse(Console.ReadLine());
			
            Console.WriteLine("Unesite elemente matrice");
            for (i = 0; i < dim; i++)
            {
                for (j = 0; j < dim; j++)
                {
                    Console.Write("clan[",i,j,"] = ");
                    aMatrica[i, j] = int.Parse(Console.ReadLine());
                }
            }
			
            //Standardno ispisujemo elemente unete matrice iteracijom po vrstama i kolonama
            for (i = 0; i < dim; i++)
            {
                for (j = 0; j < dim; j++)
                {
                    Console.Write(aMatrica[i, j]);
                }
                Console.Write('\n');
            }
            //Pozivamo funckiju koja racuna min i max matrice aMatrica
            min_max(aMatrica, dim);
            //Pozivamo funckiju koja racuna zbir elemenata na dijagonali matrice aMatrica
            //Ispis rezultata se vrsi pri pozivu funkcija
            dijagonala(aMatrica, dim);
			
        }
    }
}
		
  


Пример 3. Написати програм којим се за задату квадратну матрицу A димензије n × n, израчунава квадрат те матрице (A × A).


Решење:


using System;
using System.Collections.Generic;
using System.Text;

namespace kvadrat_matrice
{
    class  Program
    {
        //Funkcija kvadriraj izracunava vrednost matrice  A*A
        static void kvadriraj(int[,] A, int n)
        {
            /*Definisemo kvadratnu matricu B dimenzija n, koja ce predstavljati
            rezultat kvadriranja matrice A*/
            int[,] B = new int[n, n];  
            int i, j, k;

            //Matricu B dobijamo tako sto mnozimo odgovarajuce vrste i kolone matrice A 
            for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                {
                    /*Pocetnu vrednost elementa matrice B na preseku i-te vrste i j-te kolone 
                    postavljamo na 0, kako tekuci element dobijamo sabiranjem n proizvoda 
                    elemenata matrice A*/
                    B[i, j] = 0;
                    /*Pomocna for petlja po promenljivoj k omogucava da se istovremeno pomnoze 
                    elementi u i-toj vrsti i j-toj koloni matrice A*/
                    for (k = 0; k < n; k++)
                    {
                        /*Proizvoljni element B[i,j] dobijamo tako sto medjusobno pomnozimo elemente
                        i-te vrste i j-te kolone matrice A*/
                        B[i, j] += A[i, k] * A[k, j];
                    }
                }
            //Ispisujemo elemente rezultujuce matrice B
            Console.WriteLine("Matrica B = A*A:");
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    Console.Write(" " + B[i, j]);
                }
                Console.WriteLine();
            }
        }
  
        static void Main(string[] args)
        {
            //Definisemo matricu A proizvoljno izabrane dimenzije
            int[,] A = new int [20,20];
            int dim, i, j;
			
            Console.WriteLine("Unesite dimenziju kvadratne matrice");
            dim = int.Parse(Console.ReadLine());
            
            //Unosimo elemente matrice A
            for (i = 0; i < dim; i++)
            {
                for (j = 0; j < dim; j++)
                {
                    Console.Write("clan[",i,j,"] = ");
                    A[i, j] = int.Parse(Console.ReadLine());
                }
            }
            //Pozivamo funkciju kvadriraj  koja ce ispisati dobijenu kvadriranu matricu A*A
            kvadriraj(A,dim);
        }    
    }
}


Пример 4. Учитати природан број n и квадратну матрицу A реда n. Формирати транспоновану матрицу дате матрице A.

Напомена: Транспонована матрица се добија када одговарајуће врсте и колоне замене места.
Решење:

using System;
using System.Collections.Generic;
using System.Text;

namespace transponovana_matrica
{
    class  Program
    {
	//Funkcija transponuj formira transponovanu matricu date matrice A dimenzije n
        static void transponuj(int[,] A, int n)
        {       
            int i, j, pom;
			
            /*Prolazimo for petljom kroz elemente matrice A i vrsimo zamenu odgovarajucih vrsta 
            i kolona, npr. prva kolona postaje prva vrsta itd.*/
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < i; j++)
                {
                    //Vrsimo zamenu elemenata na poziciji A[i,j] elementima na poziciji A[j,i]
                    pom = A[i, j];
                    A[i,j] = A[j, i];
                    A[j, i] = pom;
                }
            }
			
            //Ispisujemo matricu u transponovanom obliku
            Console.WriteLine("Transponovana matrica ");
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    Console.Write( " "  + a[i, j]);
                }
                Console.WriteLine();
            }        
        }
		
        //Glavna funkcija Main u kojoj unosimo proizvoljnu matricu poziva funkciju transponuj
        static void Main(string[] args)
        {
            int[,] aMatrica = new int[15,15];
            int i, j, dim;

            Console.WriteLine("Unesite dimenziju kvadratne matrice");
            dim = int.Parse(Console.ReadLine());
         
            Console.WriteLine("Unesi elemente matrice:");

            for (i = 0; i < dim; i++)
            {
                for (j = 0; j < dim; j++)
                {
                    //clan[i,j]= vrednost aMatrica[i,j]
                    Console.Write("clan[",i,j,"] = ");
                    aMatrica[i, j] = int.Parse(Console.ReadLine());
                }
            }
            //Pozivamo funkciju koja vrsi transponovanje unete matrice aMatrica
            transponuj(aMatrica,dim);
                         
        }
    }
}
		
  


Пример 5. Учитати матрицу димензија n × m. Сортирати елементе по врстама и колонама унете матрице, а затим исписати тако формирану матрицу.


Решење:

using System;
using System.Collections.Generic;
using System.Text;

namespace sortiranje_elemenata
{
    class  Program
    {
        static void sortiranje_kolona(int[,] matrica,  int n,  int m)
        {
            int i, j;
            int pom, t;
            for (j = 0; j < m; j++)
            {
                //Sortiramo kolone uz pomoc insertion sort algoritma koji nam je poznat od ranije
                for (i = 0; i < n; i++) 
                {
                    t = i;
                    while (t > 0 && matrica[t, j] < matrica[t-1, j])
                    {
                        pom = matrica[t, j];
                        matrica[t, j] = matrica[t - 1, j];
                        matrica[t - 1, j] = pom;
                        t--;
                    }                   
                }
            }
			
            //Ispisujemo matricu ciji su elementi u svakoj koloni sortirani
            Console.WriteLine("Matrica cije su kolone sortirane");
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    Console.Write(matrica[i, j]);
                }
                Console.WriteLine('\n');
            }
        }
		
        static void sortiranje_vrsta(int[,] matrica,int n,int m) 
        {
            int i, j, t;
            int pom;
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++) 
                {
                    t = j;
                    while(t > 0 && matrica[i, t]< matrica[i, t-1])
                    { 
                        //Clan na poziciji [i,t] menja mesto sa clanom na poziciji [i,t-1]    
                        pom = matrica[i, t];
                        matrica[i,t] = matrica[i, t-1];
                        matrica[i, t-1] = pom;
                        t--;
                    }
                }                          
            }
			
            //Ispisujemo matricu kod koje su elementi u svakoj vrsti sortirani
            Console.WriteLine("Matrica cije su vrste sortirane");
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    Console.Write(matrica[i, j]);
                }
                Console.WriteLine('\n');
            }   
        }
        static void Main(string[] args)
        {
            int[,] A = new int[50, 50];
            int i, j, m, n;
            Console.WriteLine("Unesite broj vrsta matrice");
            n = int.Parse(Console.ReadLine());
            Console.WriteLine("Unesite broj kolona matrice");
            m = int.Parse(Console.ReadLine());
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    Console.Write("clan[{0},{1}] = ", i, j);
                    A[i, j] = int.Parse(Console.ReadLine());
                }
            }
           sortiranje_vrsta(A, n, m);
           sortiranje_kolona(A, n, m);            
        }
    }
}