You are on page 1of 10

VIŠEDIMENZIONALNI NIZOVI

3.1. VIŠEDIMENZIONALNI NIZOVI

Definicija višedimenzionalnog niza:


Višedimenzionalni nizovi su nizovi čiji su elementi takođe nizovi.

Definicija matrice:
Dvodimenzionalni niz ili matrica sastoji se od vrsta, pri čemu je svaka vrrsta jedan vektor
(jednodimenzionalni niz), tj matrica je niz vektora. Po analogiji je trodimenzionalni niz je niz
matrica, itd.

Deklaracija višedimenzionalnog niza:


Deklaracija višedimanzionalnog niza je slična sa deklaracijom vektora, s tom razlikom što
višedimenzionalni niz ima više dimenzija.

tip imeniza[MAX][MAX][MAX][MAX]…[MAX];

Svaka zagrada predstavlja novu dimenziju niza, a podatak u zagradi predstavlja


maksimalni broj elemenata koji poseduje data dimenzija. Elementi predstavljaju nizovi
manje dimenzije.

Na primer:
int matrica[3][4], trodniz[3][6][4];

Svi elementi višedimenzionalnih nizova su celi brojevi. Matrica je dvodimenzionalni niz i prva
dimenzija ima maksimalno 3 vektora pri čemu se svaki vektor sastoji od maksimalno 4
elementa. Trodimenzionalni niz ima tri dimenzije pri čemu je prva dimenzija sa maksimalno 3
matrice, a svaka matrica se sastoji od maksimalno 6 vektora, pri čemu svaki vektor ima 4
elementa koji su celi brojevi.

Višedimenzionalne nizove treba koristiti kada je potrebno opisati složeni podatak koji
je opisan sa više podataka, pri čemu i indeksi koji opisuju višedimenzionalni niz predstavljaju
podatak neophodan za opis elementa.

Na primer ako posmatramo igricu minsko polje. Tada se svako polje može opisati sa x
koordinatom, y koordinatom i brojem koji opisuje šta se nalazi na toj koordinati. Koristili bi
matricu gde bi prvi indeks opisivao horizontalnu poziciju, drugi vertikalnu poziciju, a vrednost
elementamatrice bi opisivalo šta se na toj poziciji nalazi: 1 – postoji mina ili 2 – mina se nenalazi
na toj poziciji.

Sa pojmom matrica susrećete se i u matematici prilikom rešavanja sistema jednačina.


Opisana je sa dve dimenzije pri čemu se prva uvek odnosi na vrstu, a druga na kolonu.
Na primer:
 2 4 0 1
A = 4 6 7 3
 2 1 3 5  3 x 4

Matrica A ima tri vrste i četiri kolone. Deklaracija matrice A i ujedno njena inicijalizacija s tim
da matrica ima ovakav izgled je:

unsigned a[3][4]={{2, 4, 0, 1},{4, 6, 7, 3},{2, 1, 3, 5}};

Za slučaj da smo hteli inicijalizovati matricu a da pri tome ne napišemo sve elemente, ne
obuhvaćenim elementima automatski bi se dodelila vrednost nula. Za slučaj da smo deklarisali
i inicijalizovali sa:

unsigned a[3][4]={{2, 4},{4, 6, 7, 3},{2, 1, 3}};

matrica a bi imala sledeći izgled:

 2 4 0 0
A =  4 6 7 3
 2 1 3 0  3 x 4

Smeštanje višedimenzionalnih nizova u memoriju:


Operativna ili RAM memorija je po prirodi linearno organizovana (predstavlja
jednodimenzionalni niz), sa rastućim adresama, vektor se u memoriju smešta na prirodan
način, gde su logički i fizički redosled elemenata u memoriji isti. Prilikom smeštanja
matrice u memoriji mora se izvršiti njena linearizacija. Linearizacija se u programskom
jeziku C vrši po vrstama. Od početne adrese matrice prvo se smešta prva vrsta, pa druga
vrsta, i tako redom do poslednje vrste. Vrsta se tretira kao zapis koji ima onoliko
elemenata koliko ima kolona.

Na primer:
int a[3][4];

A00 A01 A02 A03 A10 A11 A12 A13 A20 A21 A22 A23

Iz primera se lako vidi kako je izvršena linearizacija matrice u memoriji.

Kao i kod jednodimenzionalnog niza ili vektora tako i kod višedimenzionalnih nizova
postoji prisna veza između pokazivača i niza.
Pristup odgovarajućem podatku matrice može se vršiti pomoću indeksa ili pokazivača
Kod matrice ima dva indeksa (prvi je indeks vrste, a drugi je indeks kolone). Indeksi moraju
biti prirodni brojevi ili promenljive koje su celobrojnog tipa. Kao i kod vektora u indeksu može
mostojati i celobrojni izraz.

Na primer:
unsigned s, i, j, a[3][4]={{2, 4, 0, 1},{4, 6, 7, 3},{2, 1, 3, 5}};
Pristup pomoću operatora indeksiranja:

Prvi način:
s=a[2][1]; - nakon ove naredbe dodele promenljiva s ima vrednost 1.

Drugi način:
int i=1, j=0;
s=a[i][j]; - nakon ove naredbe dodele s je 4.

Pristup pomoću pokazivača:


Indentifikator a nije pokazivač na podatke tipa unsigned, već pokazivač na nizove (ima
ih tri, jer ima tri vrste) koji su tipa unsigned. Zbog toga a+1 nije adresa elementa matrice a[0][1]
već početna adresa podniza a[1], a to je druga vrsta matrice čiji je prvi element a[1][0]. Zbog
toga se primenom cast operatora u pokazivačkoj aritmetici mora indentifikator niza a pretvoriti
u pokazivač na celobrojne podatke tipa unsigned.

unsigned s, i, j, k,a[MAXV][MAXK], b[P][Q][R];

a[i][j] *((unsigned *)a +MAXK*I +j)


b[i][j][k] *((unsigned *)b +Q*R*i + R*j +k)

Na sličan način se može pristupiti i proizvoljnom elementi bilo koje višedimenzionalne


matrice.

Važno je uočiti da se u formulama za izračunavanje adrese datog elementa


višedimenzionalnog niza nikada ne pojavljjuje dužina po prvoj dimenziji niza.
Ova sobina se koristi kod funkcija kada se prosleđuje matrica, jer se ne mora prosleđivati
prva dimenzija dok su ostale dimenzije neophodne.

Na primer:
int a[MAXV][MAXK];

Prototip funkcija koja koristi matricu a kao parametar imala bi sledeći izgled:

int zbir(int a[][MAXK], int n);

3.2. PROLASCI KROZ VIŠEDIMENZIONALNI NIZ

Od višedimenzionalnih niziva najviše se koriste dvodimenzionalni nizovi ili matrice.


Matrice imaju dve dimenzije, prva dimenzija odnosi se na vrste (redove) a druga dimenzija se
odnosi na kolone. Kroz matricu se može izvršiti jedna od sledećih vrsta prolazaka:
• Prolazak kroz matricu vrsta po vrsta,
• Prolazak kroz matricu kolona po kolona,
• Prolazak kroz matricu preko dijagonala (paralelnih glavnoj dijagonali pri čemu
glavnu dijagonalu čine elementi koji imaju istu vrednost indeksa vrste i kolone), i
• Spiralni prolasci kroz matricu.

Zadatak 1 - 1

Zadata je kvadratna matrica A = a ij n≤10. Napisati C program za sabiranje svih elemenata matrice A.
nxn

Rešenje:

/***************************************************************************
Opis: Demonstrira kako se formira i ispisuje matrica u C-u.
Koristi module: -
Autori: Branko Markoski, Dejan Lacmanovic, Predrag Pecev
Datum poslednje promene:
***************************************************************************/

#include <stdio.h>
#include <stdlib.h>

#define MAX_DIM 10

int main(void)
{
/* Definicija promenljivih. */
int n,i,j,s,a[MAX_DIM][MAX_DIM];

/* Inicijalizacija matrice. */
for(i=0;i<MAX_DIM;i++)
{
for(j=0;j<MAX_DIM;j++) a[i][j]=0;
}

do{

printf("\n Unesite dimenziju matrice (N<=10): ");


printf("\n\tN = ");
scanf("%d",&n);
}while(n<1||n>MAX_DIM);

/* Matrica se formira koriscenjem dvostrukog for ciklusa, i elementi se unose


"vrsta po vrsta". Spoljni ciklus odredjuje o kojoj je vrsti rec, dok
unutrasnji ciklus formira elemente te vrste. */

for(i=0;i<n;i++)
{
for(j=0;j<n;j++) a[i][j]=rand()%8+1;
}

printf("\n Matrica A je:\n");


for(i=0;i<n;i++)
{
printf("\n\t");
for(j=0;j<n;j++) printf(" %d",a[i][j]);
}
/* Ispis matrice se vrsi pomocu dvostrukog ciklusa. U ovom slucaju su to for ciklusi. */

for(s=0,i=0;i<n;i++)
{
for(j=0;j<n;j++) s+=a[i][j];
}
printf("\n\n\n Broj %d je zbir svih elemenata matrice A.",s);
return 0;
}
Zadatak 2-2

Napisati C program koji na osnovu prirodnog broja N (N<10) formira i štampa matricu A sledećeg izgleda.
 NNNNNNN 
N • • • • • N 
 
 N • 222 • N 
 
A =  N • 212 • N 
 N • 222 • N 
 
N • • • • • N 
 NNNNNNN 
 

Rešenje:

/***************************************************************************
Opis: Demonstrira kako se formira i ispisuje matrica u C-u.
Koristi module: -
Autori: Branko Markoski, Dejan Lacmanovic, Predrag Pecev
Datum poslednje promene:
***************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#define MAX_DIM 20

int main(void)
{
/* Definicija promenljivih. */
int n,i,j,k1,k2,a[MAX_DIM][MAX_DIM];

/* Inicijalizacija matrice. */
for(i=0;i<MAX_DIM;i++)
{
for(j=0;j<MAX_DIM;j++) a[i][j]=0;
}

do{

printf("\n\t\t Unesite dimenziju matrice (N<10): ");


printf("\n\t\t\t N = ");
scanf("%d",&n);
}while(n<3||n>9);
/* Matrica A bice kvadratna dimenzije 2*n-1, sto je prvo trebalo
zakljuciti kako bi se mogli koristiti for ciklusi. Matrica se formira
"kvadrat po kvadrat", pri cemu brojac 'i' govori o kom kvadratu
je rec. Ovakav nacin formiranja je uzet jer svi elementi matrice koji
obrazuju stranice kvadrata imaju istu vrednost. */

k2=2*n-1;
k1=n;
for(i=0;i<k2;i++)
{
for(j=i;j<k2;j++)
{
/* Formira se gornji ugaonik. */
a[i][j]=k1;
a[j][i]=k1;
/* Formira se donji ugaonik. */
a[2*n-i-2][2*n-j-2]=k1;
a[2*n-j-2][2*n-i-2]=k1;
}
k1--;
k2--;
}
a[n-1][n-1]=1; /* Element u sredini matrice ima uvek vrednost jedan. */

/* Stampanje elemenata matrice. */


printf("\n\t Matrica A je:\n\t");
for(i=0;i<2*n-1;i++)
{
printf("\n\t");
for(j=0;j<2*n-1;j++) printf(" %d",a[i][j]);
}
return 0;
}
Zadatak 3- 3

Zadata je matrica A = a ij pri čemu je n paran prirodan broj i n<10. Broj timova prvenstva je n, a tablica
nxn
fudbalskog prvenstva je matrica A, čiji elementi zadovoljavaju sledeće svojstvo:

0; ako je ekipa i izgubila od ekipe j



aij = 1; nerešen rezultat i
3; ako je ekipa i pobedila ekipu j

pri čemu je i ≠ j i i ∈ N , j ∈ N , i ≤ n i j ≤ n. Sadržaj na glavnoj dijagonali zanemariti. Napisati C program koji


utvrđuje koliko je ekipa bilo bez poraza.

Rešenje:

/***************************************************************************
Opis: Demonstrira primenu matrice u resavanju nekog konkretnog problema.
Koristi module: -
Autori: Branko Markoski, Dejan Lacmanovic, Predrag Pecev
Datum poslednje promene:
***************************************************************************/

#include <stdio.h>
#include <stdlib.h>

#define MAX 9

int main(void)
{
enum bool{FALSE,TRUE};

/* Definicija promenljivih. */
int n,i,j,pom,broj,k,tabla[MAX][MAX];

/* Inicijalizacija matrice fudbalskog prvenstva. */


for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++) tabla[i][j]=0;
}

do{

printf("\n Program za fudbalsko prvenstvo: ");


printf("\n Unesite broj timova prvenstva (N<10):\n");
printf("\tN = ");
scanf("%d",&n);
}while(n<1||n>MAX||n%2!=0);

/* Moraju se preskociti slucajevi kada je indeks vrste jednak indeksu kolone jer
ne moze ekipa igrati sama sa sobom. */

/* Unos tablice fudbalskog prvenstva. */


printf("Unesite tablicu fudbalskog prvenstva:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
{
do{
scanf("%d",&pom);
}while(pom!=0&&pom!=1&&pom!=3);
tabla[i][j]=pom;
}else tabla[i][j]=0;
}
}

/* Stampanje tablice fudbalskog prvenstva. */

printf("Unesite tablicu fudbalskog prvenstva:\n");


printf("\n\t N = %d",n);

printf("\n\n Tablica prvenstva:\n");


for(i=0;i<n;i++)
{
printf("\n\t");
for(j=0;j<n;j++)
{
if(i!=j) printf(" %d",tabla[i][j]);
else printf(" X");
}
}

/* Utvrdjivanje koliko je ekipa bilo u prvenstvu bez poraza.


Osnovna ideja je da 'i' kao indeks vrste predstavlja odgovarajucu
ekipu, a vrednosti elemenata iz te vrste kroz koju se prolazi sa
indeksom 'j', predstavljaju rezultate koje je ekipa imala u prvenstvu.
Promenljivu 'k' postavljamo na vrednost TRUE kao da smo pretpostavili
da je ekipa bila bez poraza. Sa for ciklusom prolazimo kroz 'i'-tu vrstu i
ako su svi elementi iz vrste razliciti od nule znaci da je ekipa bila bez poraza. */

broj=0;
for(i=0;i<n;i++)
{
k=TRUE;
for(j=0;j<n;j++)
{
if(i!=j&&tabla[i][j]==0) k=FALSE;
}
if(k) broj++;
}
if(broj<5&&broj>1)
printf("\n\n\n\nU prvenstvu je ukupno %d ekipe bilo bez poraza!",broj);
else printf("\n\n\n\nU prvenstvu je ukupno %d ekipa bilo bez poraza!",broj);

return 0;
}

You might also like