Dvodimenzionalni nizovi u programskom jeziku S
Dvodimenzionalni nizovi u programskom jeziku S
Niz
[uredi | uredi izvor]Nizovi (arrays) podataka predstavljaju najjednostavnije i najčešće korišćene složene (strukturirane) tipove. Oni služe za predstavljanje iz matematike dobro poznatih vektora, matrica i višedimenzionalnih nizova.[1]
Niz je ograničen, uređen skup promenljivih istog tipa.[2] Promenljive u nizu su komponente ili elementi. Tip elemenata niza je bazni tip. Elementima niza se pristupa preko rednog broja unutar niza koji se naziva indeks elemenata niza. U programskom jeziku S prvi element niza ima indeks 0, drugi indeks 1 i tako dalje. Ako su elementi niza skalarni onda je dati niz jednodimenzionalan. Dvodimenzionalan niz je niz koji ima elemente koji su nizovi skalarnih podataka. Dvodimenzionalan niz se još naziva i matrica. Po ovoj logici, niz koji ima dimenziju k je niz čiji su elementi nizovi dimenzije k-1.
Deklaracija dvodimenzionalnog niza-matrice
[uredi | uredi izvor]Deklaracija matrice se izvodi tako što se navede ime osnovnog tipa podataka[3] koji će se čuvati u matrici a potom ime promenljive iza koga slede dva para uglastih zagrada . Na primer:
int M[10][5];
float T[3][4];
Ovako su deklarisana dva niza-matrice M i T. M je matrica koja ima 10 vrsta i 5 kolona a predviđena je za smeštanje celobrojnih vrednosti. T je matrica koja ima 3 vrste i 4 kolone a čuvaće realne brojeve jednostruke tačnosti.
Opšti oblik deklaracije matrice je:
tip_elementa ime_niza[BrojVrsta][BrojKolona]
U memoriji se elementi niza smeštaju redom po vrstama. Prvo redom elementi iz prve vrste. Odmah za njima redom elementi iz druge vrste, i tako, vrsta po vrsta.
Pristup članovima niza
[uredi | uredi izvor]Elementima niza se pristupa preko rednog broja unutar niza – preko indeksa niza.
Na mestu indeksa se može pojaviti proizvoljan aritmetički izraz, s tim da vrednost izraza mora biti celobrojna.
PR: Ako je deklarisan niz int ocene[V][K];
V i K su očekivani broj vrsta i kolona za obradu
Pristup elementima niza je sledeći: ocene[i][j]
ocene[i][j] daje vrednost ocene u redu i a koloni j pri čemu mora da bude ispunjeno:
0<= i<V i 0<= j<K Dakle, prvi red je na indeksu 0, kao i prva kolona. Promenom indeksa i se pomeramo vertikalno duž kolone, dok se promenom indeksa j pomeramo duž vrste.
Na primer ako je niz deklarisan kao int ocene[30][12], imamo sledeću tabelu indeksa i,j
0 ,0 | 0, 1 | ... | 0 ,11 |
1, 0 | 1, 1 | ... | 1 ,11 |
... | ... | ... | ... |
29,0 | 29,1 | ... | 29,11 |
Inicijalizacija niza
[uredi | uredi izvor]Dodela početnih vrednosti podacima pri deklaraciji je inicijalizacija. Ako u programskom jeziku S nema inicijalizacije promenljivih, njihove vrenosti su nedefinisane. Jedino se statičke i spoljašnje promenljive automatski inicijalizuju nulama ako su brojčane promenljive. Ako želimo eksplicitno da dodelimo početne vrednosti elementima niza, moramo to uraditi ili u samoj deklaraciji niza, ili programski. Niz se može inicijalizovati navođenjem liste inicijalizatora u vitičastim zagradama, pa kako su elementi opet nizovi, oni se mogu navesti opet u vitičastim zagradama. Unutrašnje vitičaste zagrade se mogu i izostaviti. Dodela vrednosti se uvek obavlja po rastućem redosledu indeksa, kako su elementi i smešteni u memoriji. Broj inicijalizatora mora biti manji ili jednak broju elemenata niza. U slučaju da imamo manje inicijalnih vrednosti od broja elemenata u nizu, date vrednosti se dodeljuju elementima sa početka niza a preostali elementi dobijaju nulte početne vrednosti.
Sledeće inicijalizacije formiraju matrice istog sadržaja.
int a[3][4]= {{1,2,3,0},{5,6,0,0},{9,0,0,0}};
int a[3][4]= {1,2,3,0,5,6,0,0,9,0,0,0};
int a[3][4]= {1,2,3,0,5,6,0,0,9};
int a[3][4]= {{1,2,3},{5,6},{9}};
int a[][4]= {1,2,3,0,5,6,0,0,9,0,0,0};
1 | 2 | 3 | 0 |
5 | 6 | 0 | 0 |
9 | 0 | 0 | 0 |
U poslednjem primeru je niz deklarisan kao int a[][4], što može biti zbunjujuće. Ovakav vid deklaracije je dozvoljen samo ako je navedena inicijalizacija. Dakle, moguće je izostaviti prvi indeks, tj. broj vrsta, jer se on može odrediti u fazi kompilacije na osnovu broja inicijalizatora. (Uopšte, deklaracija višedimenzionalnih nizova mora imati granicu za sve dimenzije osim prve, koja može biti izostavljena ako niz ima inicijalizaciju, pošto se može izračunati u fazi kompilacije na osnovu broja inicijalizatora i raspoloživih drugih dimenzija).
int a[][4]={1,2,3,4,5,6,7,8,9}; definiše istu matricu kao i int a[3][4]={{1,2,3,4},{5,6,7,8},{9}}
Primer pristupa preko indeksa: elementu sa vrednošću 6 se pristupa sa a[1][1].
I još neki primeri: int a[3][4]={{1,2},{3,4}}; definiše sledeći niz(matricu) a
1 | 2 | 0 | 0 |
3 | 4 | 0 | 0 |
0 | 0 | 0 | 0 |
int a[3][4]={0}; definiše niz a i popunjava sve elemente nulama
Kvadratna matrica
[uredi | uredi izvor]Ako je broj vrsta matrice jednak broju kolona, radi se o kvadratnoj matrici. Za kvadratnu matricu su moguće dodatne obrade vezane za glavnu i sporednu dijagonalu. Pripadnost glavnoj dijagonali se određuje tako što su indeks vrste i kolone međusobno jednaki.
Literatura
[uredi | uredi izvor]- C Osnovi programiranja, Milan Čabarkapa, Krug , Beograd , (1996). rr. 163-165
- Programski jezik C sa rešenim zadacinma, Laslo Kraus, Akademska misao, Beograd . (2014). rr. 97-101
- Programiranje 1, Filip Marić, Predrag Janičić, Matematički fakultet Beograde, Beograd , (2015). rr. 137-138