polja u programskom jeziku c

27
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

Upload: others

Post on 23-Oct-2021

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Polja u programskom jeziku C

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

Page 2: Polja u programskom jeziku C

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.

Page 3: Polja u programskom jeziku C

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

Page 4: Polja u programskom jeziku C

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.

Page 5: Polja u programskom jeziku C

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

Page 6: Polja u programskom jeziku C

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

Page 7: Polja u programskom jeziku C

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

Page 8: Polja u programskom jeziku C

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

Page 9: Polja u programskom jeziku C

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.

Page 10: Polja u programskom jeziku C

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.

Page 11: Polja u programskom jeziku C

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

Page 12: Polja u programskom jeziku C

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

Page 13: Polja u programskom jeziku C

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.

Page 14: Polja u programskom jeziku C

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

Page 15: Polja u programskom jeziku C

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:

Page 16: Polja u programskom jeziku C

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.

Page 17: Polja u programskom jeziku C

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.

Page 18: Polja u programskom jeziku C

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.

Page 19: Polja u programskom jeziku C

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

Page 20: Polja u programskom jeziku C

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.

Page 21: Polja u programskom jeziku C

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

Page 22: Polja u programskom jeziku C

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.

Page 23: Polja u programskom jeziku C

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.

Page 24: Polja u programskom jeziku C

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.

Page 25: Polja u programskom jeziku C

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.]

Page 26: Polja u programskom jeziku C

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.

Page 27: Polja u programskom jeziku C

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: