You are on page 1of 21

Tehničar računarstva – 3.

razred

Programiranje
MODUL 4. DVODIMENZIONALNI NIZOVI

Igor Prša, Bsc. ing. ele. Školska 2018/2019. godina


„ O D U V I J E K S A M Ž E L I O D A M O J K O M PJ U T E R B U D E J E D N O S TAV A N
ZA UPOTREBU KAO MOJ TELEFON. MOJA ŽELJA SE OBISTINILA.
S A D A V I Š E N E Z N A M D A K O R I S T I M S V O J T E L E F O N .”

BJARNE STROUSTRUP

Nizovi podataka (ponavljanje)

2
Polje (niz)
Polje je niz varijabli istog tipa (sa zajedničkim imenom) numeriranih cjelobrojnim
indeksom.
Indeks uvijek počinje od nule.
Radi efikasnosti pristupa, elementi polja smještaju se u uzastopne memorijske
lokacije (redom po indeksu).

Primjer:
double x[3]; /* polje x tipa double */
/* s 3 clana ili elementa */
x[0] = 0.2;
x[1] = 0.7;
x[2] = 5.5;
/* x[3] = 4.4; - greska, nije definirano */

3
Definicija polja
Jednodimenzionalno polje definira se na sljedeći način:
mem_klasa tip ime[izraz];
gdje je:
◦ mem_klasa memorijska klasa cijelog polja,
◦ tip tip podatka svakog elementa polja,
◦ ime ime polja (zajednički dio imena svih elemenata),
◦ a izraz konstantan, cjelobrojni, pozitivan izraz koji zadaje broj elemenata.

Ovaj izraz je najčešće pozitivna konstanta ili simbolička konstanta.

4
Definicija polja
Elementi jednodimenzionalnog polja su:
ime[0], . . . , ime[izraz - 1].
Svaki element je varijabla tipa tip.
Deklaracija memorijske klase nije obavezna.
Polje deklarirano bez memorijske klase:
◦ unutar funkcije je automatska varijabla (rezervacija memorije na “run–time
stacku”, ulaskom u funkciju),
◦ a izvan svih funkcija je statička varijabla.

Unutar funkcije polje se može učiniti statičkim pomoću identifikatora


memorijske klase static.

5
Inicijalizacija polja
Polja se mogu inicijalizirati (element po element), navođenjem popisa
vrijednosti elemenata unutar vitičastih zagrada.
U tom popisu, pojedine vrijednosti odvojene su zarezom (koji nije
operator).
Sintaksa:
mem_klasa tip ime[izraz] = {v_1, ..., v_n};
što daje
ime[0] = v_1, . . . , ime[n - 1] = v_n.

6
Inicijalizacija polja
Primjer:
double v[3] = {1.17, 2.43, 6.11};
je ekvivalentno s
double v[3];
v[0] = 1.17;
v[1] = 2.43;
v[2] = 6.11;

7
Inicijalizacija polja
Ako je broj inicijalizacijskih vrijednosti n
◦ veći od dimenzije polja — javlja se greška,
◦ manji od dimenzije polja, onda će preostale vrijednosti biti inicijalizirane
nulom.
Prilikom inicijalizacije dimenzija polja ne mora biti zadana.
Tada se dimenzija polja računa automatski, iz broja inicijalizacijskih
vrijednosti.
Primjer:
Možemo pisati
double v[] = {1.17, 2.43, 6.11};
što kreira polje v dimenzije 3 i inicijalizira ga.

8
Vježba
Pročitati s tipkovnice 10 cijelih brojeva i uz svaki od učitanih brojeva ispisati: broj
je >= od prosjeka ili broj je < od prosjeka.

9
„ LO Š I P R O G R A M E R I S E B R I N U O P R O G R A M S KO M
KO D U . D O B R I P R O G R A M E R I S E B R I N U O
S T R U K T U R A M A P O D ATA K A I N J I H O V I M O D N O S I M A .”

L I N U S TO R VA L D S

Uvod u dvodimenzionalne nizove

10
Dvodimenzionalni nizovi
Niz podataka nekog tipa odgovara jednodimenzionalnom polju podataka
tog tipa u C-u.
Do sada smo koristili samo nizove sastavljene iz podataka jednostavnog
tipa (standardni tipovi u C-u).
U C-u možemo koristiti i višedimenzionalna polja. Na primjer,
matematičkom pojmu matrice odgovara dvodimenzionalno polje u C-u.
Kako se dvodimenzionalna polja realiziraju i interpretiraju u C-u?

11
Dvodimenzionalni nizovi
Primjer. Polje m deklarirano s

static double m[2][3];

predstavlja matricu s dva retka i tri stupca.


Njezine elemente možemo “prostorno” zamisliti u obliku:

m[0][0] m[0][1] m[0][2]


m[1][0] m[1][1] m[1][2]

Ovi elementi pamte se u memoriji računala jedan za drugim, tj. kao jedno
jednodimenzionalno polje. Kojim redom?

12
Dvodimenzionalni nizovi
Za matrice (dvodimenzionalna polja) elementi su poredani po recima, tj.
prvi redak, drugi redak, (onako kako “čitamo” matricu), jer se brže mijenja
zadnji indeks — indeks stupca.
Poredak elemenata matrice m u memoriji je:
m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2].

Stvarno “linearno” indeksiranje elemenata, onako kako su spremljeni —


indeksima od 0 do 5, radi se na sljedeći način.

Element m[i][j] spremljen je u memoriji na mjestu


i ∗ MAX_j + j
gdje je MAX_j = 3 broj stupaca matrice (iz deklaracije polja m).

13
Dvodimenzionalni nizovi
Prva dimenzija polja (MAX_i = 2), tj. broj redaka matrice, ne treba za
indeksiranje, već samo za rezervaciju memorije.
Primjer. Dvodimenzionalno polje m iz prethodnih primjera možemo
inicijalizirati na sljedeći način:
static double m[2][3] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
Inicijalne vrijednosti bit će pridružene elementima matrice onim redom
kojim su elementi smješteni u memoriji (tj. po recima):
m[0][0] = 1.0, m[0][1] = 2.0, m[0][2] = 3.0,
m[1][0] = 4.0, m[1][1] = 5.0, m[1][2] = 6.0.

14
Dvodimenzionalni nizovi
Prethodni način inicijalizacije je nepregledan. Zato se inicijalne
vrijednosti mogu vitičastim zagradama grupirati u grupe, koje se
pridružuju pojedinim recima.
Ekvivalentna inicijalizacija:

static double m[2][3] = { {1.0, 2.0, 3.0},


{4.0, 5.0, 6.0}
};
Grupiranje odgovara dimenzijama.
Ako je neka grupa „kraća” od odgovarajuće dimenzije, preostali
elementi se inicijaliziraju nulama (i to bez obzira na static).

15
Pristup članovima niza
Elementima dvodimenzionalnog niza pristupa se preko dvostruke for
petlje sa različitim imenima indeksa. npr.

16
Zadaća
Prepraviti program tako da od korisnika traži unos svakog pojedinog
elementa niza i nakon toga računa sumu i proizvod elemenata matrice i
ispisuje ih.

17
Polje kao argument funkcije
Kada je višedimenzionalno polje argument funkcije ono se može
deklarirati sa svim svojim dimenzijama ili sa svim dimenzijama osim
prve. Na primjer, funkcija koja čita matricu s MAX_X redaka i MAX_Y
stupaca može biti deklarirana kao
void readinput(int m[MAX_X][MAX_Y], int n, int m)
gdje su n i m stvarni brojevi redaka i stupaca koje treba učitati. Ta ista
funkcija može biti deklarirana na sljedeći način:
void readinput(int m[][MAX_Y], int n, int m)
Naime, broj redaka nije bitan za adresiranje elemenata matrice. Sve što
funkcija mora znati je da se element m[i][j] nalazi na I-tom mjestu,
gdje je I=i*MAX_Y+j. Stoga je samo MAX_Y nužan pri pozivu funkcije.

18
Primjer
Napišite program koji učitava cijele brojeve i, j < 10, te kreira i
ispisuje tablicu m 10×10 znakova koja na svim mjestima ima točkice,
osim na horizontalnoj i vertikalnoj liniji koje prolaze elementom m
[i,j] (na te linije treba staviti zvjezdice).
Na primjer, za i = 1, j = 2, tablica treba izgledati ovako:

. . * . . . . . . .
* * * * * * * * * *
. . * . . . . . . .
. . * . . . . . . .
. . * . . . . . . .
. . * . . . . . . .
. . * . . . . . . .
. . * . . . . . . .
. . * . . . . . . .
. . * . . . . . . .

19
Primjer

20
Zadaci
1. Napisati program koji učitava i ispisuje matricu dimenzije NxM.

2. Napisati program koji ispisuje kvadratnu matricu tako da je 1 na glavnoj


dijagonali, 2 iznad glavne dijagonale a 3 ispod glavne dijagonale. Korisnik unosi
veličinu matrice.

3. Napisati funkciju transp koja formira transponovanu matricu i glavni program


koji je testira za unesenu matricu.

4. Za danu kvadratnu matricu anm, napisati program koji pomoću odgovarajućih


funkcija računa:
a) zbir elemenata na glavnoj dijagonali,
b) zbir elemenata na sporednoj dijagonali,
c) zbir elemenata iznad glavne dijagonale,
d) zbir elemenata ispod sporedne dijagonale.

21

You might also like