Појам дводимензионог низа
До сада смо имали прилике да се упознамо са једнодимензионим низовима чији су елементи скаларне величине (цели бројеви, реални бројеви, знакови,..).
Овакви низови се могу шематски приказати као хоризонтална или вертикална листа података, што можемо видети на следећим сликама.
|
|
|
Слика 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);
}
}
}