Professional Documents
Culture Documents
1 Uvod
Spremanje veće količine srodnih podataka, kao što su primjerice ocjene grupe studenata
iz nekog kolegija, zahtjevalo bi isto toliko velik broj varijabli koje bi bile istog tipa po-
datka. Što na koncu predstavlja značajno opterećenje u pogledu imenovanja i rukovanja
varijablama. Upravo polja omogućuju pohranu i rukovanje velikim brojem srodnih po-
dataka na prikladan i zgodan način. Stoga, ona predstavljaju vrlo bitnu značajku gotovo
svakog programskog jezika.
2 Jednodimenzionalna polja
Polja (engl. arrays) se sastoje od slijeda elemenata istoga tipa podataka (Sl. 1). Ona
se još nekada nazivaju nizovima ili čak vektorima. Polja mogu biti jednodimenzionalna,
dvodimenzionalna ili više-dimenzionalna, pri čemu polja više od dvije dimenzije rijetko
imaju primjenu. Ovdje će biti razmatrana samo jednodimenzionalna (1-D) polja. Treba
napomenuti kako polje samo po sebi nije varijabla, nego se to može reći samo za njegove
elemente.
Slika 1: Primjeri jednodimenzionalnih (1-D) polja. Prvo predstavlja polje od 4 elementa, gdje
je svaki tipa podatka int. Drugo predstavlja polje od 20 elemenata, gdje je svaki tipa podatka
float.
1
Programiranje 1 FERIT Osijek
1
Treba napomenuti kako se pod vrijendosti poznatom prije prevodenja ne smatraju deklaracije kons-
tanti preko ključne riječi const (kao primjerice, const int VEL = 50;).
2
Programiranje 1 FERIT Osijek
3 Riješeni primjeri
U nastavku je navedeno nekoliko primjera u kojima je potrebno koristiti jednodimenzi-
onalna polja za njihovo rješavanje. U primjerima gdje nije posebno navedeno, veličina
polja i tip podatka elemenata odabrani su proizvoljno. [Potsjetnik] Korištene su i pret-
procesorske direktive (naredbe) za definiranje simboličnih konstanti (engl. symbolic cons-
tants): #define makro tijelo, gdje se svako pojavljivanje makroa u tekstu programa zamje-
njuje s tijelom. Imenovanje makroa podliježe istim pravilima kao imenovanje varijabli
te se tradicionalno koriste velika slova. Nadalje, tijelo može biti brojčana, znakovna ili
string konstanta. Prednost uporabe simboličnih konstanti je što kada je potrebno zami-
jeniti njenu vrijednost, dovoljno je promjenu načiniti na jednom mjestu, a ne svugdje
gdje se konstanta koristi u programu.
3
Programiranje 1 FERIT Osijek
Primjer 1. Deklarirati tri različita polja, različitih veličina i tipova podataka. Popuniti sva
polja.
int main(void)
{
int i;
int ip [10]; // deklaracija polja cijelih brojeva velicine 10
float fp [15]; // deklaracija polja realnih brojeva velicine 15
char cp [26]; // deklaracija polja znakova velicine 26
return 0;
}
Kratko obrazloženje [Primjer 1]: Uobičajeno se koriste petlje za slijedni pristup ele-
mentima polja. Tako se naredba for nameće kao najprirodniji izbor, jer objedinjuje
postavljanje, provjeru i promjenu vrijednosti cjelobrojne varijable koju se koristi kao
indeks polja. Jasno, moguće je koristiti i ostale petlje kako bi se isto postiglo.
Primjer 2. Deklarirati i inicijalizirati dva različita polja, različitih veličina i tipova podataka
te ih ispisati na ekran.
# include <stdio .h>
int main(void)
{
int i;
// inicijalizacija polja - navedene su sve vrijednosti elem. polja
int ip[N] = {2, 4, 6, 8, 10};
return 0;
}
Kratko obrazloženje [Primjer 2]: Ispis elemenata polja treba obaviti element po ele-
ment. Kao sto je slučaj s varijablama osnovnih tipova podataka treba voditi računa koji
se specifikator pretvaranja (engl. conversion specifier) koristi u funkciji printf() (primje-
rice, %d ili %i ako su elementi tipa podatka int, ili %f ako su elementi tipa podatka float
ili double).
4
Programiranje 1 FERIT Osijek
int main(void)
{
int i;
float fp [20] , min;
return 0;
}
Kratko obrazloženje [Primjer 3]: Kod traženja najmanje vrijednosti elemenata polja,
postavlja se prva za trenutno najmanju, te se potom redom provjerava postoji li još manja
vrijednost. Ukoliko se pronade manja vrijednost, ona se postavlja za trenutno najmanju
i nastavlja se prolazak kroz elemente polja. Svaki puta kada se pronade vrijednost manja
od trenutno najmanje ona se postavlja za trenutno najmanju.
Primjer 4. Omogućiti korisniku unos n (0 < n ≤ 50) vrijednosti elemenata u polje realnih
brojeva. Pronaći i ispisati na ekran najveću vrijednost.
# include <stdio .h>
# define VEL_POLJA 50
int main(void)
{
int i, n;
float max , fp[ VEL_POLJA ]; // zauzima se mem. za najveci dozvoljeni broj elem.
5
Programiranje 1 FERIT Osijek
# define VEL 20
int main(void)
{
float a[VEL], priv;
int i, j;
return 0;
}
6
Programiranje 1 FERIT Osijek
# define VEL 10
int main(void)
{
float a[VEL] = {1.2 , 2.3 , 0.36 , -5.543 , -2.76 , -3.14 , 3.1415 , -2.718 , 5.025 , 10.2};
float priv;
int i, j, f;
// mjehuricasto sortiranje
do {
f = 0; // ukljanja se signalizacija prije svakog prolaza
for (i = 0; i < VEL - 1; i++)
if (a[i] < a[i + 1]) {
priv = a[i];
a[i] = a[i + 1];
a[i + 1] = priv;
return 0;
}
Primjer 7. Omogućiti korisniku unos vrijednosti elemenata u polje od 25 realnih brojeva. Po-
tom, omogućiti korisniku unos broja kojeg će se tražiti. Sekvencijalnim/slijednim pretraživanjem
provjeriti postoji li traženi broj u polju te ispisati broj izvršenih provjera.
# include <stdio .h>
# define N 25
int main(void)
{
int a[N], t, p, f, i;
7
Programiranje 1 FERIT Osijek
if (a[i] == t) {
f = 1; // ako je trazeni broj pronaden
break; // zavrsava se pretraga
}
}
if (f == 1)
printf (" Trazeni broj , %d, je pronaden nakon %d provjera .\n", t, p);
else
printf (" Trazeni broj nije pronaden .\n");
return 0;
}
Kratko obrazloženje [Primjer 7]: Kod slijednog pretraživanja (engl. sequential search)
prolazi se redom kroz elemente polja. Svaki puta se provjera odgovara li vrijednost
trenutnog elementa traženoj, te ako je tako pretraga se završava, a u suprotnom nastavlja.
Složenost ovog algoritma pretraživanja je O(n).
# define VEL 30
int main(void)
{
float a[VEL], priv , t;
int i, j, dg , gg , s, f, p;
// selekcijsko sortiranje
for (i = 0; i < VEL - 1; i++)
for (j = i + 1; j < VEL; j++)
if (a[i] > a[j]) {
priv = a[i];
a[i] = a[j];
a[j] = priv;
}
f = p = 0;
dg = 0; gg = VEL; // postavljanje granica prostora pretrage
while (dg <= gg) {
p++; // broje se provjere
s = (dg + gg) / 2;
if (a[s] == t) {
f = 1; // ako je trazeni broj pronaden
break; // zavrsava se pretraga
}
else if (a[s] < t) // podesavanje granica prostora pretrage
dg = s + 1; // promjena donje granice , ako je vrijed . srednjeg elem. manja od trazene
else gg = s - 1; // promjena gornje granice , ako je vrijed . srednjeg elem. veca od trazene
8
Programiranje 1 FERIT Osijek
if (f == 1)
printf (" Trazeni broj , %d, je pronaden nakon %d provjera .\n", t, p);
else
printf (" Trazeni broj nije pronaden .\n");
return 0;
}
Kratko obrazloženje [Primjer 8]: Binarno pretraživanje (engl. binary search) zahtjeva
da su vrijednosti elemenata polja sortirana (u pravilu od najmanjeg prema najvećem).
U svakom koraku prostor pretrage se dijeli na dva i pomiče prema manjim ili većima
vrijednostima u polju, ovisno je li vrijednost srednjeg elementa prostora pretrage manja
ili veća od tražene. Pretraživanje se prekida ukoliko je pronadena tražena vrijednost.
Složenost ovog algoritma pretraživanja je O(log2 n).
# define N 20
int main(void)
{
double a[N];
int i, n;
9
Programiranje 1 FERIT Osijek
return 0;
}
Primjer 10. Omogućiti korisniku unos vrijednosti elemenata u polje od 20 realnih brojeva.
Nakon toga izračunati medijan unesenih vrijednosti. Medijan je vrijednost koja dijeli popis
brojeva na gornju i donju polovicu. Podrazumijeva se kako su brojevi sortirani uzlazno (od
najmanjeg prema najvećem). Ako je neparan broj brojeva medijan je središnji član, a u slučaju
parnog broja medijan je srednja vrijednost dva središnja člana. Primjerice, medijan popisa
1, 2, 5, 6, 9 je 5, dok je medijan popisa 3, 5, 7, 9, 12, 15 jednak (7 + 9)/2 = 8.
# include <stdio .h>
# define N 20
int main(void)
{
double a[N];
int i, n, f;
double med;
Kratko obrazloženje [Primjer 10]: S obzirom da nije za očekivati kako je korisnik unio
brojeve ulaznim redoslijedom, nužno je elemente polja prvo sortirati što je napravljeno
mjehuričastim sortiranjem. Nakon toga, jednostavno je odrediti, prema navedenom
opisu, medijan tih brojeva. Važno je samo voditi računa je li broj elemenata polja paran
ili neparan.
10