polja u programskom jeziku c
TRANSCRIPT
Polja u programskom jeziku C
Cestar, Toni
Undergraduate thesis / Završni rad
2018
Degree Grantor / Ustanova koja je dodijelila akademski / stručni stupanj: Josip Juraj Strossmayer University of Osijek, Faculty of Electrical Engineering, Computer Science and Information Technology Osijek / Sveučilište Josipa Jurja Strossmayera u Osijeku, Fakultet elektrotehnike, računarstva i informacijskih tehnologija Osijek
Permanent link / Trajna poveznica: https://urn.nsk.hr/urn:nbn:hr:200:928882
Rights / Prava: In copyright
Download date / Datum preuzimanja: 2021-10-22
Repository / Repozitorij:
Faculty of Electrical Engineering, Computer Science and Information Technology Osijek
SVEUČILIŠTE JOSIPA JURJA STROSSMAYERA U OSIJEKU
ELEKTROTEHNIČKI FAKULTET
Stručni studij
POLJA U PROGRAMSKOM JEZIKU C
Završni rad
Toni Cestar
Osijek, 2018.
SADRŽAJ:
1. UVOD ......................................................................................................................................... 1
1.1. Zadatak završnog rada .......................................................................................................... 1
2. POLJA U PROGRAMSKOM JEZIKU C .................................................................................. 2
2.1. Deklaracija i inicijalizacija polja .......................................................................................... 2
2.2. Memorija u programskom jeziku C ...................................................................................... 3
2.2.1. Statička alokacija memorije ........................................................................................... 3
2.2.2. Dinamička alokacija memorije ...................................................................................... 4
3. JEDNODIMENZIONALNA POLJA ......................................................................................... 6
3.1. Vektori .................................................................................................................................. 6
3.2. Polje znakova (engl. string) .................................................................................................. 9
3.3. Polje pokazivača ................................................................................................................. 12
4. VIŠEDIMENZIONALNA POLJA ........................................................................................... 14
4.1. Dvodimenzionalna polja ................................................................................................. 14
4.2. Višedimenzionalna polja ................................................................................................. 20
5. ZAKLJUČAK ........................................................................................................................... 21
6. LITERATURA .......................................................................................................................... 22
1
1. UVOD
U programerskoj praksi često se zahtijeva rad s grupom elemenata istoga tipa poput imena
osoba, vrijednosti očitanja pojedinih instrumenata, matematičkih modela raznih nizova i slično.
Navedeni podaci se mogu jednostavno prikazati kao elementi unutar polja. Polje u programskom
jeziku C se može definirati kao skup memorijskih lokacija u koje se mogu spremati podaci istog
tipa i kojima se može pristupiti preko istog imena varijable. Ti elementi mogu biti cjelobrojni (engl.
integer) ili realni brojevi jednostruke preciznosti (engl. float) koji pohranjuju brojeve ili nizovi
znakovnih elemenata (engl. char), polja pokazivača te polja struktura (engl. struct). Inače, polje
koje se sastoji od znakovnih elemenata se naziva string. Svi elementi unutar polja moraju biti
istoga tipa podatka. Još jedan razlog za korištenje polja nasuprot korištenja više odvojenih varijabli
je učinkovitiji im pristup i njihovo procesiranje. Završni rad će obraditi temu polja u programskom
jeziku C uključujući karakteristike polja, načine zapisa polja u računalnu memoriju, načine njihove
deklaracije, inicijalizacije, ispisa, te će se obraditi jednodimenzionalna i višedimenzionalna polja.
Također će biti objašnjene i ostale osnovne funkcije za rad s poljima u programskom jeziku C.
Nakon uvodnog poglavlja, poglavlje 2 opisuje zadatak završnog rada te daje općenit uvid u polja
u programskom jeziku C uz tehnike upravljanja računalnom memorijom pri radu s poljima.
Sljedeće poglavlje opisuje jednodimenzionalna polja koja se fokusiraju na vektore i polja znakova
(engl. string), dok naredno poglavlje – višedimenzionalna polja – opisuje trodimenzionalna i polja
s više od tri dimenzije. Zaključak daje osvrt na ciljeve postavljene u zadatku završnog rada i
postignute rezultate.
1.1. Zadatak završnog rada
Zadatak završnog rada je objasniti polja u programskom jeziku C, njihove vrste, načine na
koje se zapisuju u memoriju računala, kreiranje polja te osnovne funkcija za rad s poljima podataka.
2
2. POLJA U PROGRAMSKOM JEZIKU C
Programski jezik C daje strukturu podataka, polja, koja pohranjuju sekvencijalnu zbirku
elemenata istog tipa fiksne veličine. Polja se koriste za pohranjivanje skupine podataka, ali je često
korisnije razmišljati o polju kao zbirci varijabli istog tipa. Polja mogu sadržavati cijele brojeve,
decimalne brojeve ili znakove, ovisno o tipu polja. Umjesto deklaracija pojedinih varijabli, kao
što broj0, broj1, ..., i broj99, deklarira se jedno polje varijabli kao što su brojevi[100] i koriste se
brojevi[0], brojevi[1]... brojevi[99] kao pojedine varijable. Specifičnom elementu u polju pristupa
se preko njegovog indeksa poput brojevi[5] koji pristupa šestom elementu unutar polja budući da
je indeks prvog elementa polja brojevi[0], a zadnjeg elementa polja brojevi[n-1] kao što se vidi na
slici 2.1. Indeks ujedno označava i broj dimenzija polja, ako polje ima više dimenzija isto tako ima
i više indeksa preko kojih se pristupa određenom elementu polja.
Prvi element Zadnji element
Sl. 2.1. Redoslijed elemenata u polju, prema [7].
2.1. Deklaracija i inicijalizacija polja
Za deklaraciju polja u programskom jeziku C programer mora specificirati tip elementa,
ime polja i broj elemenata koji će biti zapisani u polje. Računalna memorija se zauzima tijekom
deklaracije polja, a veličina memorije ovisi o tipu elemenata polja i o broju elemenata polja. Oblik
zapisa deklaracije polja je: tip nazivPolja [ veličinaNiza ];. primjer zapisa jednodimenzionalnog
polja. veličinaNiza mora biti cjelobrojna konstanta veća od 0 i ona predstavlja broj elemenata koji
se mogu zapisati u polje. tip mora biti tip podatka kojeg programski jezik C podržava poput int.
int predstavlja cjelobrojni tip podatka i omogućuje spremanje jedino cijelih brojeva u polje.
nazivPolja predstavlja ime polja i može sadržavati slova, brojeve i podvlaku ( _ ). Prvi znak imena
varijable mora biti slovo ili podvlaka, no preporučuje se koristiti slovo kao prvi znak da ne dolazi
do sukoba sa standardnim sustavnim varijablama. Primjer deklaracije jednodimenzionalnog polja
tipa int, imena polje i broj elemenata polja 10: int polje [10];. Kod inicijalizacije polja može se
unijeti vrijednost svakog elementa polja odjednom: int polje [3] = {5, 10, 15};. Broj vrijednosti
unutar vitičastih zagrada {} ne može biti veći od broja elemenata deklariranih u uglatim
3
zagradama []. U slučaju da je broj elemenata polja prazan (veličinaNiza), dobije se polje dovoljno
veliko da sadrži sve inicijalizirane elemente: int polje [] = {5, 10, 15};. Za pridjeljivanje vrijednosti
zadanom elementu unutar polja koristi se: polje [1] = 10;. Ovaj dio koda postavlja drugi element
u polju na vrijednost 10. Ime polja je konstantan pokazivač na adresu prvog elementa u tome polju.
Na primjer, u deklaraciji: int a [10]; a je pokazivač na &a[0], što je ujedno i adresa prvog
elementa polja a. Ime polja se može koristiti kao konstantan pokazivač. Na primjer, * ( a + 4 ) je
način pristupa podatku na lokaciji a [4].
2.2. Memorija u programskom jeziku C
U računalnoj memoriji, elementi polja su spremljeni u sekvenci susjednih memorijskih
blokova što omogućuje programu brži pristup vrijednostima unutar polja. Koriste se dva načina
sekvencijalnog spremanja, row-major redoslijed i column-major redoslijed. Razlika između ovih
redoslijeda je u redoslijedu spremanja elemenata polja u memoriju. Kod row-major redoslijeda
uzastopni elementi reda se nalaze jedan pored drugoga, dok kod column-major redoslijeda
uzastopni elementi stupca se nalaze jedan pored drugoga u memoriji računala kao što je prikazano
na slici 2.2. Programski jezici C i C++ koriste row-major redoslijed za uzastopno spremanje
elemenata reda u memoriju. Budući da su svi elementi unutar polja istog tipa podatka, memorijski
blokovi su svi iste veličine. Svaki element polja okupira jedan memorijski blok. Veličina
memorijskog bloka alocirana za spremanje elementa polja ovisi o tipu podatka polja budući da
svaki tip podatka zauzima različitu količinu memorije što znači da ukupna veličina polja ovisi o
tipu podatka polja i dimenzijama polja.
Sl. 2.2. Row-major redoslijed i Colum-major redoslijed metode spremanja višedimenzionalnih
polja, prema [8].
2.2.1. Statička alokacija memorije
Programski jezik C ima tri različita tipa memorije, statičku, stog i hrpu (engl. heap).
Statička memorija ustraje kroz cijeli program i uglavnom se koristi za spremanje globalnih
4
varijabli ili varijabli koje su navedene kao statičke. Na primjer: int varijabla može biti deklarirana
izvan funkcije, što ju čini globalnom varijablom, što znači da joj se može pristupiti unutar cijelog
programa. Globalne varijable su statične i postoji samo jedna istoimena varijabla unutar cijelog
programa. Unutar funkcija varijable su dodijeljene na stog. Moguće je postaviti varijablu kao
statičku ako ju navedemo kao takvu tako na primjer varijabla static int varijabla; koja se nalazi
unutar funkcije se sprema u statičku memoriju iako se nalazi unutar funkcije čije se varijable
spremaju na stog. Dakle, memorija stoga se koristi za spremanje varijabli koje se nalaze unutar
funkcija, uključujući glavnu (engl. main()) funkciju. Struktura stog memorije je posljednji unutra,
prvi izvan (engl. Last-In, First-Out). Svaki puta kada funkcija deklarira novu varijablu ona se
sprema na stog i završetkom funkcije sve varijable deklarirane unutar te funkcije se brišu sa stoga
i njihova memorija se oslobađa. Stog je posebno mjesto u memoriji kojom središnja procesorska
jedinica (engl. Central Processing Unit, CPU) automatski upravlja te nema potrebe za ručnim
alociranjem i oslobađanjem memorije. Svaki stog ima određenu količinu memorije čija veličina
ovisi u operacijskom sustavu. Ako program pokuša staviti previše podataka na stog dolazi do
prelijevanja stoga. Prelijevanje stoga se dogodi kada je sva dopuštena memorija stoga alocirana i
novo alocirani podatci se izlijevaju u druge odjele memorije. Varijable zapisane u statičku
memoriju se brišu po izlasku iz programa i memorija se oslobađa.
2.2.2. Dinamička alokacija memorije
Hrpa je dio memorije kojeg je potrebno unaprijed rezervirati u programskom kodu i u koji
se sprema dinamički alocirana memorija. Memorija hrpe se alocira tijekom pokretanja programa
te je pristup memoriji hrpe malo sporiji, no veličina memorije hrpe ograničena je samo veličinom
virtualne memorije računala. Za razliku od ostalih memorija, memorijom hrpe računalo ne upravlja
automatski već taj zadatak pada na korisnika, od alokacije memorije sve do oslobođenja. Za
alociranje memorije na hrpu, koriste se funkcije malloc() i calloc(). Alocirana memorija na hrpu
ostaje alocirana sve dok se ne oslobodi preko funkcije free(). U slučaju da se memorija ne oslobodi,
program će imati gubitak memorije (engl. memory leak) što znači da ostali procesi neće moći
koristiti dio memorije koji nije oslobođen. Većina današnjih operacijskih sustava ima sistem koji
služi za oslobađanje memorije po završetku programa te time zaštićuju sustav od negativnih
posljedica. Programski jezik C sam po sebi nema mogućnosti za dinamičku alokaciju memoriju,
no unutar zaglavlja <stdlib.h> postoje četiri funkcije za dinamičku alokaciju memorije. Funkcija
malloc() koja rezervira blok memorije određene veličine i vraća pokazivač podatkovnog tipa
praznina (engl. void). Funkcija calloc() rezervira blok memorije specifične veličine i postavlja
5
alociranu memoriju na nulu. U slučaju da dinamički alocirana memorija preko funkcija malloc()
ili calloc() nije dovoljna ili je ima previše ona se može promijeniti pomoću funkcije realloc().
Budući da se dinamički alocirana memorija preko funkcija malloc() i calloc() ne oslobađa sama
od sebe koristimo funkciju free() da oslobodimo taj dio memorijskog prostora. Funkcija free() se
koristi jednodimenzionalnih i višedimenzionalnih polja. Kod jednodimenzionalnih polja
dinamički alocirana varijabla se oslobađa unošenjem imena varijable unutar zagrada free funkcije.
Kod višedimenzionalnih polja dinamički alocirane varijable se oslobađaju korištenjem free
funkcije unutar petlje tako da se svaki element polja pojedinačno oslobodi. Oslobađanje memorije
dvodimenzionalnog i trodimenzionalnog polja prikazano je na slici 2.3.
Oslobađanje memorije dvodimenzionalnog i trodimenzionalnog polja
Sl. 2.3. Prikaz oslobađanja memorije dvodimenzionalnog i trodimenzionalnog polja
6
3. JEDNODIMENZIONALNA POLJA
Jednodimenzionalna polja su polja podataka istoga tipa koji imaju samo jednu dimenziju,
red ili stupac. Svaki element polja se označava cjelobrojnim indeksom koji odgovara njegovoj
udaljenosti od prvog člana, koji ima indeks 0, dok zadnji član ima indeks za jedan manji od duljine
polja. Elementima unutar polja se pristupa preko jednog indeksa. Jednodimenzionalna polja mogu
biti polja brojeva, vektori, ili polja znakova poznatija kao string.
3.1. Vektori
Jednodimenzionalna polja podataka u koja se spremaju brojevi istoga tipa se nazivaju
vektori. Spremljeni brojevi unutar vektora mogu biti cijeli brojevi, ako je tip polja na primjer int,
ili decimalni brojevi, u slučaju da je tip podataka polja float. Najosnovnije operacije nad poljem
podataka brojeva su deklaracija zadanog polja, učitavanje elemenata polja preko korisničkog
unosa i ispis polja na ekran, kao što je prikazano na slici 3.1.
Primjer 1: Deklaracija, učitavanje i ispis vektora
Sl. 3.1. Programski kod za deklaraciju, učitavanje i ispis vektora i njegov ispis u komandnom
sučelju
U 4. liniji koda sa slike 3.1. deklarira polje tipa int, ime polja je a i broj elemenata unutar polja je
10. 8. do 11. linija koda omogućuje korisniku unos cijelih brojeva u polje a sve dok se izvodi for
petlja, što je u ovom slučaju deset puta. 14. do 17. linija koda ispisuje sve elemente polja na ekran
u slijedu u kojem su zapisani u polju.
7
Kod ovakve deklaracije polje se zapisuje u memoriju stoga i memorija za polje se zauzima
prilikom kompajliranja programa. U slučaju da nije poznata potrebna veličina polja podataka
memorija se može dinamički alocirati preko funkcije malloc(). Funkcija malloc() omogućuje
korisniku dinamičko zauzimanje potrebnog prostora memorije tijekom izvođenja programa, no ta
se memorija mora i osloboditi preko funkcije free() kao što je prikazano na slici 3.2.
Primjer 2: Dinamička alokacija polja
Sl. 3.2. Programski kod za dinamičku alokaciju polja i njegov ispis u komandnom sučelju
U 11. liniji koda sa slike 3.2. program sprema potrebnu memoriju za zapis korisnički unesenog
polja u varijablu b, nakon kojeg kod 12. linije zatraži dio memorije računala koji je jednak veličini
varijable b za spremanje polja a.
Jednodimenzionalna polja brojeva se koriste za jednostavniji način spremanja podataka, no isto
tako ona nam omogućuju lakšu obradu podataka zapisanih u polje. Često korištene operacije nad
jednodimenzionalnim poljem podataka su pronalaženje najvećeg ili najmanjeg broja unutar polja
koje je prikazano na slici 3.3 ili ispis svih parnih ili neparnih elemenata polja kao što se vidi na
slici 3.4.
8
Primjer 3: Traženje najvećeg i najmanjeg broja u vektoru
Sl. 3.3. Programski kod za najveći i najmanji broj u vektoru i njegov ispis u komandnom sučelju
18. do 22. linija koda sa slike 3.3 prolazi kroz cijelo polje i uspoređuje da li je svaki element polja
veći od prethodnog i ako je to slučaj zapisuje ga u varijablu temp u kojoj je nakon izvođenja for
petlja zapisan najveći broj polja.
Primjer 4: Ispis neparnih i parnih brojeva u vektoru:
Sl. 3.4. Programski kod za ispis neparnih u parnih brojeva u vektoru i njegov ispis u komandnom
sučelju
9
U 42. liniji koda sa slike 3.4. program provjerava ostatak dijeljenja elementa polja s brojem dva.
U slučaju da je ostatak jedan to znači da je element polja neparni broj te ga ispisuje. Buduću da je
unutar for petlje tu operaciju obavlja nad svakim elementom polja.
Unutar jednodimenzionalnog polja poredak elemenata nije zaključan te se može mijenjati po
potrebi korisnika. Primjer algoritma sortiranja je bubble sortiranje. Bubble sortiranje je
jednostavan algoritam svrstavanja koji više puta prolazi kroz polje podataka i uspoređuje svaki par
elemenata te ako su u krivom redoslijedu zamjenjuje im poredak. Bubble sortiranje može sortirati
elemente polje od najvećeg prema najmanjem ili od najmanjeg prema najvećem, kao što je
prikazano na slici 3.5.
Primjer 5: Algoritam bubble sortiranja:
Sl. 3.5. Programski kod bubble sortiranja i njegov ispis u komandnom sučelju
U 68. liniji koda sa slike 3.5. program uspoređuje da li je prethodni element polja veći od sljedećeg.
U slučaju da je, budući da sortira od najmanjeg elementa polja prema najvećemu, preko 69. do 75.
linije koda program im zamjenjuje poredak. Algoritam prolazi kroz polje podataka sve dok ne
poreda sve elemente polja.
3.2. Polje znakova (engl. string)
Polje znakova ili string je jednodimenzionalno polje znakova koje je završava
„null“ znakom „\0“ ( null predstavlja prazan unos ). Programer ne stavlja null znak na kraju
konstante polja znakova. C kompajler automatski stavlja „\0“ na kraj varijable polja znakova
10
tijekom inicijalizacije polja. Budući da na kraju polja kompajler stavlja null znak, tijekom
deklaracije polja moramo postaviti veličinu polja za jedan više od broja znakova koje želimo
spremiti u polje. Na primjer deklaracija polja znakova hello izgleda: char hello[6] = {„H“, „e“,
„l“, „l“, „o“, „\0“}; ili char hello [ ] = „Hello“;.
Indeks:
Varijable:
Adresa:
Sl. 3.6. Redoslijed elemenata u polju znakova
Osnovne operacije nad jednodimenzionalnim poljem znakova su deklaracija zadanog polja,
inicijalizacija elemenata polja i ispis polja na ekran. Kod za te operacije je prikazan na slici 3.7.
Primjer 6: Deklaracija, inicijalizacija i ispis polja znakova:
Sl. 3.7. Programski kod za deklarirati, inicijalizirati i ispisati polje znakova i njegov ispis u
komandnom sučelju
U 6. liniji koda sa slike 3.7. program deklarira jednodimenzionalno polje znakova imena str i
duljine deset znakova, s tim da je zadnji znak null. Inicijalizacija je obavljena tijekom deklaracije
u ovom slučaju i u polje su zapisani Hello. Kod 8. linije koda program ispisuje polje str na ekran.
11
U nekim slučajima potrebna duljina jednodimenzionalnog polja znakova nije poznata sve do unosa
korisnika. U tom slučaju može se dinamički alocirati memorija potrebna za polje znakova.
Funkcije koje obavljaju dinamičku alokaciju polja znakova su malloc() i realloc() i njihovo
korištenje je prikazano na slici 3.8.
Primjer 7: Dinamička alokacija memorije i ispis duljine polja znakova:
Sl. 3.8. Programski kod za dinamičku alokaciju polja podataka i njegovu duljinu i njegov
ispis u komandnom sučelju
U 17. liniji koda sa slike 3.8. program dinamički zauzima memoriju za varijablu str veličine char.
14. linija koda je petlja koja se ponavlja sve dok ne dobije unos s tipkovnice koji predstavlja novi
red što ujedno znači i kraj string-a. 15. linija koda uzima po jedan znak iz unosa i upisuje ga 19.
linije koda u polje znakova na lokaciju i. 17. linija koda uzima polje znakova str i poveća njegovu
12
memoriju svakim prolaskom kroz petlju. 29. linija koda uzima duljinu polja znakova str i zapisuje
ga u varijablu len preko funkcije strlen. Uz funkciju strlen koja mjeri duljinu polja znakova, često
se koriste još dvije funkcije za obradu polja znakova: funkcija strcpy i funkcija strcat. Funkcija
strcpy obavlja operaciju kopiranja polja znakova dok funkcija strcat spaja dva polja znakova u
jedno te je rad tih funkcija prikazan na slici 3.9.
Primjer 8: Funkcije polja znakova strcpy, strcat, strlen:
Sl. 3.9. Programski kod koji koristi funkcije strcpy, strcat, strlen i njegov ispis u komandnom
sučelju
Funkcija strcpy(s1, s2) kopira polje znakova s1 u polje znakova s2, funkcija strcat(s1, s2) dodaje
polje znakova s2 na kraj polja znakova s1, funkcija strlen(s1) vraća duljinu polja znakova s1. U
11. liniji koda sa slike 3.9. program kopira polje znakova str1 u polje znakova str3. 14. linija koda
ulanča polje znakova str2 na kraj polje znakova str1. 17. linija koda postavlja vrijednost varijable
length na duljinu polja znakova str1.
3.3. Polje pokazivača
U situaciji gdje se želi zadržati niz koji može pohraniti pokazivače na int ili bilo koji drugi
tip podatka koriste se polja pokazivača. Opći način zapisa deklaracije polja pokazivača izgleda:
13
tip *naziv[veličinaNiza];. Unutar polja pokazivača svaki element je pokazivač koji pokazuje na
vrijednost deklariranog tipa.
Primjer 9: Polje pokazivača:
Sl. 3.10. Programski kod za korištenje polje pokazivača i njegov ispis u komandnom sučelju
U 8. liniji koda deklariramo polje pokazivača int *ptr[MAX] gdje je MAX jednak tri. Unutar polja
pokazivača *ptr nalaze se tri pokazivača koji pokazuju na vrijednost tipa int. 10. do 11. linija koda
pridjeljuje svakom pokazivaču polja *ptr adresu elementa polja var te 14. do 15. linija koda
ispisuju vrijednosti polja var preko polja pokazivača *ptr.
14
4. VIŠEDIMENZIONALNA POLJA
Programski jezik C nam omogućuje izradu polja sa dvije ili više dimenzije. Više dimenzija
u polju omogućuje zapis više podataka u jednu varijablu. Višedimenzionalna polja se deklariraju
preko sljedeće sintakse: tip ime_polja[d1][d2][d3]…[dn];. tip predstavlja tip podataka zapisanih
u polju. ime_polja je ime dodijeljeno polju koje deklariramo. [d1][d2][d3] su dimenzije našega
polja sve do dimenzije [dn] koja predstavlja ukupan broj dimenzija i broj indeksa preko kojih se
pristupa elementu polja.
Sl. 4.1. Prikaz dimenzija
4.1. Dvodimenzionalna polja
Dvodimenzionalna polja su najjednostavnija višedimenzionalna polja podataka koja su
sastavljena od dvije dimenzije, reda i stupca, i njenim elementima se pristupa preko dva indeksa.
Dvodimenzionalna polja brojeva se nazivaju matrice. Prvi indeks određuje redak matrice, a drugi
indeks određuje stupac matrice. Prvi član dvodimenzionalnog polja ( prvi redak, prvi stupac )
označen je indeksom [0][0], dok je posljednji član (posljednji redak, posljednji stupac ) označen
indeksom [n-1][m-1] gdje je n broj redaka i m broj stupaca matrice. Osnovne operaciju nad
matricama su deklaracija matrice, unos elemenata u matricu i ispis matrice na ekran te kod za njih
je prikazan na slici 4.2.
15
Primjer 9: Deklaracija, unos i ispis matrice:
Sl. 4.2. Programski kod za deklaraciju, unos i ispis matrice i njegov ispis u komandnom sučelju
U 5. liniji koda sa slike 4.2. program deklarira matricu tipa podatka int, imena iMatrica i veličine
3*3 što znači da matrica ima tri retka i tri stupca što je ukupno devet elemenata. 12. linija koda
zatraži od korisnika unos elemenata matrice, budući da je unutar for petlje unos se ponavlja za
svaki element matrice. 18. linija koda ispisuje svaki element matrice na ekran budući da je unutar
for petlje te linija koda printf („\n“); koji se nalazi između dvije for petlje omogućuje ispis matrice
u matričnom obliku.
Isto kao i kod jednodimenzionalnih polja podataka, dvodimenzionalna polja podataka imaju
statičku memoriju, stog memoriju i memoriju hrpe. U slučaju da nam je potrebna dinamički
alocirana memorija kod višedimenzionalnih polja podataka ona se može zatražiti od računala
preko funkcije malloc(). Sintaksa i primjer te funkcije je prikazan na slici 4.3.
16
Primjer 10: Dinamička alokacija memorije za matricu:
Sl. 4.3. Programski kod za dinamičku alokaciju memorije kod matrice i njegov ispis u
komandnom sučelju
U 11. liniji koda sa slike 4.3. program zatraži od računala memoriju veličine a*b*sizeof(int) te
deklarira matricu pod nazivom matrica te veličine. Varijabla a predstavlja broj redaka matrice,
varijabla b predstavlja broj stupaca matrice i sizeof(int) je veličina tipa podatka int koji je konstanta.
Često korištene operacije nad matricama uključuju pronalaženje najvećeg ili najmanjeg elementa
matrice te ispis parnih i neparnih brojeva unutar matrice. Primjeri takvih operacija su prikazani na
slikama 4.4. i 4.5.
Primjer 11: Najveći broj u matrici:
Sl. 4.4. Programski kod za najveći broj u matrici i njegov ispis u komandnom sučelju
23. i 24. linija koda prolazi kroz svaki element matrice te provjerava da li je veći od varijable
maximum i ako je postavlja varijablu na vrijednost tog elementa. Jednim prolaskom kroz matricu
17
varijabla maximum ima vrijednost najvećeg elementa u matrici. U slučaju da nam je potreban
najmanji broj unutar matrice znak veći od ( > ) se zamijeni sa znakom manji od ( < ).
Primjer 12: Parni i neparni brojevi matrice:
Sl. 4.5. Programski kod za parne i neparne brojeve matrice i njegov ispis u komandnom sučelju
U 20. linija koda sa slike 4.5. program provjerava da li je ostatak dijeljenja elementa matrice sa
brojem dva jednak nuli, što ga čini parnim brojem te se kasnije ispisuje, dok 31. linija provjerava
da li je ostatak dijeljenja elementa matrice sa brojem dva jednak jedan, što ga čini neparnim brojem
te ga kasnije ispisuje.
Elemente matrice, kao elemente dvodimenzionalnog polja, je moguće poredati po veličini. Primjer
takve funkcije je funkcija qsort koja sortira matricu od najmanjeg elementa prema najvećem.
Primjer rada funkcije qsort je prikazan na slici 4.6.
18
Primjer 13: Sortiranje od najmanjeg elementa matrice:
Sl. 4.6. Programski kod za sortiranje elemenata matrice od najmanjeg i njegov ispis u
komandnom sučelju
Funkcija qsort() sortira elemente matrice od najmanjeg do najvećeg. Ova se funkcija nalazi unutar
<stdlib.h> biblioteke.
Matrica može biti kvadratna, u slučaju da su broj redaka matrice i broj stupaca matrice jednaki.
Kod kvadratne matrice mogu se koristiti dijagonale, ravne linije koje povezuju suprotne kutove
kvadra. Kod kvadratne matrice postoje dvije vrste dijagonala, glavna i sporedna. Glavna
dijagonala prolazi kroz elemente kojima su indeksi reda i stupca jednaki, dok sporedna dijagonala
prolazi elementima kojima je zbroj indeksa za jedan manji od broja redaka ili broja stupaca matrice.
Kod za korištenje glavne i sporedne dijagonale i njihov zbroj se nalazi na slici 4.7.
Primjer 14: Zbroj glavne i sporedne dijagonale kvadrate matrice:
Sl. 4.7. Programski kod za zbroj glavne i sporedne dijagonale kvadratne matrice i njegov ispis u
komandnom sučelju
19
Linija koda if (i==j) d+=Matrica[i][j] sa slike 4.7. gleda da li su varijable i i j jednake što znači
se taj element matrice nalazi na glavnoj dijagonali te ako jesu dodaje ih u varijablu d. Element se
nalazi na sporednoj dijagonali u slučaju if (i+j==i-1) s+=Matrica[i][j]; te ako je izjava točna
dodaje vrijednost elementa u varijablu s. Na kraju programa varijable d i s se zbrajaju i njihov
rezultat se ispisuje na ekran.
Matrica se može ispuniti preko unosa s tipkovnice ili se može ispuniti nasumičnim brojevima.
Funkcija za generiranje nasumičnih brojeva je rand(). Funkcija rand() se koristi uz zaglavlje
<time.h> koje sadrži funkcije vremena i datuma te daje pristup manipulaciji istih. Popunjavanje
matrice nasumičnim brojevima prikazano je na slici 4.8.
Primjer 15: Matrica nasumičnih brojeva:
Sl. 4.8. Programski kod za izradu matrice nasumičnih brojeva i njegov ispis u komandnom
sučelju
Linija koda #include <time.h> uključuje zaglavlje <time.h> potrebno za funkciju rand(). 14. linija
koda kreira varijablu r koja ima vrijednost između 0 i 99. Preko 15. linije koda element matrice
dobiva vrijednost nasumične varijable r te budući da for petlja prolazi cijelom matricom svaki
element dobiva novu nasumičnu vrijednost varijable r.
20
4.2. Višedimenzionalna polja
Višedimenzionalna polja poput trodimenzionalnih polja ili polja s više dimenzija se koriste
kada zapisujemo objekte sa više karakteristika. Na primjer može se koristiti trodimenzionalno
polje za spremanje visine, duljine i širine svake sobe na svakom katu ili polje sa četiri dimenzije
za zapis vremenske prognoze te spremamo dan, temperaturu, vlagu i pritisak zraka. Broj for
funkcija za unos i ispis polja ovisi o broju indeksa polja, za svaki indeks ili dimenziju polja
potrebna je jedna for funkcija, tako da se kod unosa i ispisa trodimenzionalnog polja koriste tri for
funkcije za unos i ispis elemenata iz polja kao što se vidi na slici 4.9.
Primjer 16: Unos i ispis 3D polja:
Sl. 4.9. Programski kod za unos i ispis 3D polja i njegov ispis u komandnom sučelju
U 4. liniji koda sa slike 4.9. program deklarira trodimenzionalno polje s veličinom dimenzija 2, 3
i 2. Polje ukupno sadrži 12 elemenata. 11. linija koda zatraži unos elemenata od korisnika za svaki
element polja te 21. linija ispisuje svaki element polja na ekran.
21
5. ZAKLJUČAK
Polja u programskom jeziku C dio su programskog jezika C koja služe kao alat za
jednostavniju pohranu podataka istoga tipa u susjedne memorijske lokacije te za jednostavnije
izvođenje operacija nad njima. Obično se koriste za zapis digitalne fotografije, zapise tablica, zapis
crvena-zelena-plava (engl. Red Greed Blue, RGB) aditivnog modela boje. Postoje tri različita tipa
memorije u programskom jeziku C za pohranu polja, to su statička memorija, memorija stoga i
memorija hrpe. Način na koji programski jezik C sprema podatke u navedena tri tipa memorije
ovisi o tome kako i gdje je polje deklarirano i omogućuje korisniku učinkovito korištenje
memorijskih blokova za spremanje polja. U statičku memoriju se zapisuju globalne varijable, na
stog se spremaju sve varijable deklarirane unutar funkcija, uključujući glavnu funkciju, dok je
potrebnu memoriju hrpe, u koju se sprema dinamički alocirana memorija, potrebno unaprijed
rezervirati te tom memorijom računalo ne upravlja automatski već taj zadatak pada na korisnika,
od alokacije memorije sve do oslobođenja. Jednodimenzionalna polja brojeva, vektori, koriste se
za spremanje brojeva u niz nad kojim se vrše potrebne matematičke funkcije. U slučajevima gdje
model podataka zahtjeva organizaciju istih u dvodimenzionalno polje koriste se dvodimenzionalni
zapisi, često zvani matrice, koji pohranjuju podatke u retke i stupce. Manipulacija poljima
podataka često je zahtjevna i u tu svrhu su u ovom radu prikazane osnovne funkcije za rad nad
njima. U ovom radu prikazane su funkcije za deklaraciju, učitavanje i ispis jednodimenzionalnih i
višedimenzionalnih polja te za pronalaženje parnih i neparnih brojeva, najvećih i najmanjih
brojeva, unošenje nasumičnih brojeva, zbroj dijagonala dvodimenzionalnog polja i funkcija za
sortiranje čitavih polja. Prethodno navedene funkcije su prikazane iz razloga što se one koriste za
rješavanje najčešćih problema kod polja podataka. Za polje znakova dodatno su navedene funkcije
strcpy, strcat i strlen koje obavljaju operacije kopiranja, dodavanja i mjerenja duljine polja
znakova. Navedeni programski kod omogućuje unos dvodimenzionalnih polja te obavlja funkcije
za ispis, najveći broj u retku, najveći broj u stupcu te množenje odabranih dvodimenzionalnih polja
u slučaju da im dimenzija odgovaraju pravilu.
22
6. LITERATURA
[1] Skupina autora, C Programming Tutorial: C – Arrays [online], TutorialsPoint, Hyderabad,
India, 2018., dostupno na
https://www.tutorialspoint.com/cprogramming/c_arrays.htm [4.4.2018.]
[2] Michael Wirth, Memory in C – The stack, the heap, and static [online], The Craft of Coding,
Guelph, Ontario, Canada, 2013., dostupno na
https://craftofcoding.wordpress.com/2015/12/07/memory-in-c-the-stack-the-heap-and-
static/ [4.4.2018.]
[3] Prof. dr. sc. Ivo Ipšić, Programiranje [online], Sveučilište u Rijeci, TEHNIČKI
FAKULTET, Rijeka, Hrvatska, 2018., dostupno na
http://www.riteh.uniri.hr/zav_katd_sluz/zr/nastava/racprog/download/audit/polja.pdf
[4.4.2018.]
[4] Skupina autora, Bubble sort [online], Wikipedia, San Francisco, California, 2003.,
dostupno na
https://en.wikipedia.org/wiki/Bubble_sort [4.4.2018.]
[5] Skupina autora, C Programming Tutorial: C – Arrays [online], TutorialsPoint, Hyderabad,
India, 2018., dostupno na
https://www.tutorialspoint.com/cprogramming/c_strings.htm [4.4.2018.]
[6] Skupina autora, C Programming Tutorial: C – Arrays [online], TutorialsPoint, Hyderabad,
India, 2018., dostupno na
https://www.tutorialspoint.com/cprogramming/c_strings.htm [4.4.2018.]
[7] Skupina autora, C Programming Tutorial: C – Arrays [online], TutorialsPoint, Hyderabad,
India, 2018., dostupno na
https://www.tutorialspoint.com/cprogramming/images/arrays.jpg [23.4.2018.]
[8] Skupina autora, Row- and column-major order [online], Wikipedia, San Francisco,
California, 2003., dostupno na
https://en.wikipedia.org/wiki/File:Row_and_column_major_order.svg [23.4.2018.]
23
SAŽETAK
Polja u programskom jeziku C se koriste kao jednostavniji zapis grupe podataka istog tipa
i nad njima je lakše izvoditi matematičke operacije i funkcije. Iz tog razloga česti programerski
izazov je učinkovit rad s poljima u programskom jeziku C. U ovom radu implementirane su
funkcije za neke od najčešćih operacija s poljima, a to su inicijalizacija, učitavanje, ispis,
pronalaženje parnih i neparnih brojeva te najvećih i najmanjih brojeva među njima, umnožak
matrica itd. Programski jezik C ima tri različita tipa memorije, koji se implementiraju u statičku i
dinamičku memoriju te memoriju hrpe. U statičku memoriju se zapisuju globalne varijable, na
stog se spremaju varijable koje se nalaze unutar funkcija, dok je hrpa dio memorije kojeg je
potrebno unaprijed rezervirati u programskom kodu i kojom računalo ne upravlja automatski već
taj zadatak pada na programera. Polja u programskom jeziku C mogu biti jednodimenzionalna, što
su vektori i polja podataka ili višedimenzionalna, poput matrica.
Ključne riječi: polje, memorija, vektor, polje podataka, matrica.
ARRAYS IN PROGRAMMING LANGUAGE C
ABSTRACT
Arrays in programming language C are used as a simplified mechanism to store a group of
data of the same type making easier to perform mathematical operations and functions over them.
For this reason, a frequent programming challenge is the effective work with arrays in the
programming language C. In this paper, functions for some of the most common array operations
are implemented, such as initialization, loading, printing, finding odd and even numbers, the
largest and smallest numbers among them, multiplication of matrices, etc. The programming
language C has three different types of memory, which are implemented as the static, dynamic
memory and the heap memory. Global variables are stored in the static memory, the variables
contained in functions are stored on stack, while the heap memory is a part of the memory that
needs to be reserved in advance in the program code and it is not managed by the computer
automatically, instead this task falls on the programmer. Arrays in the programming language C
can be one-dimensional, which are vectors and strings or are multi-dimensional, such as matrices.
Keywords: array, memory, vector, string, matrix.
24
ŽIVOTOPIS
Toni Cestar rođen je u Koprivnici 3. 8. 1993. godine. Trenutno živi u Đurđevcu. Osnovno
obrazovanje je stekao u Osnovnoj školi Grgura Karlovčana u Đurđevcu, nakon kojega je pohađao
Gimnaziju Dr. Ivana Kranjčeva u Đurđevcu. Nakon gimnazije upisuje Fakultet elektrotehnike,
računarstva i informacijskih tehnologija u Osijeku. Trenutno studira na Preddiplomskom stručnom
studiju Elektrotehnike, smjer informatika.
Potpis: