Funkcije

Sjedište: CARNET - Arhiva 2021 Loomen
E-kolegij: Algoritmi i programiranje 2. razred
Knjiga: Funkcije
Otisnuo/la: Gost (anonimni korisnik)
Datum: subota, 21. ožujka 2026., 00:58

Opis

Funkcije su izdvojeni nizovi naredbi koje čine logičke cjeline, a obavljaju točno utvrđene zadatke.

Omogućavaju raščlanjivanje problema na jednostavnije - manje cjeline, čime doprinose boljoj preglednosti izvornog koda i jednostavnijem rješenju.
Svaki C++ program ima najmanje jednu funkciju – main(). Kada pokrenete vaš program, main() se poziva automatski.
Od nje svaki program kreće tj. prvo se  izvršava ono što se nalazi unutar nje.
Glavna funkcija može pozivati i druge funkcije koje opet mogu pozivati druge funkcije.
Tada zasebno rješavamo te manje zadatke , a onda samo njihova rješenja pozovemo u glavnu funkciju.




1. Funkcije

Gotove funkcije smo koristili i do sada pozivajući ih iz biblioteka uporabom naredbe include

Npr. za unos i ispis podataka koristili smo se funkcijama cin i cout iz biblioteke iostream, dok smo za uporabu matematičkih funkcija pozivali biblioteku cmath.

Korisnički definirane funkcije (potprogrami) su izdvojene programske cjeline koje rješavaju pojedinačne zadatke, a omogućavaju pozivanje više puta s različitim vrijednostima varijabli (argumenata ili parametara).

Omogućavaju raščlanjivanje problema na jednostavnije - manje cjeline, čime doprinose boljoj preglednosti izvornog koda i jednostavnijem rješenju.
Svaki C++ program ima najmanje jednu funkciju – main(). Kada pokrenete vaš program, main() se poziva automatski.
Od nje svaki program kreće tj. prvo se  izvršava ono što se nalazi unutar nje.
Glavna funkcija može pozivati i druge funkcije koje opet mogu pozivati druge funkcije.
Tada zasebno rješavamo te manje zadatke , a onda samo njihova rješenja pozovemo u glavnu funkciju.
Uvođenjem funkcija uvodimo strukturno programiranje, odnosno zadržavamo linearnu strukturu glavnog programa, iz kojega po potrebi pozivamo pojedine funkcije da bi izvršile pojedinačne izračune i vratile rezultate tih izračuna koje ćemo dalje koristiti u glavnom dijelu programa.




2. Primjer raščlanjivanja problema na pojedinačne zadatke

Za koordinate tri točke u ravnini koje unosi korisnik provjeravamo leže li na istom pravcu, te ako ne leže računamo opseg i površinu trokuta kojega one čine.


3. Globalne i lokalne varijable

Varijable koje smo do sada koristili bile su lokalne i vrijedile su samo u funkciji main(). 


Globalne varijable najavljuju se izvan svih funkcija i mogu se koristiti u cijelom programu, dok su lokalne dostupne samo unutar funkcije u kojoj su najavljene.


Ukoliko želimo iz funkcije vratiti više vrijednosti to ne možemo učiniti naredbama return jer funkcija završava izvršavanje nakon izvršavanja naredbe return, no možemo pohranom u globalne varijable.


Doseg globalne varijable može se suziti na datoteku u kojoj je definirana uporabom oznake static, npr.

static double x;


Varijabla tipa static ima doseg globalne, a trajanje lokalne varijable, tj. vrijednost statičke lokalne varijable ostaje sačuvana do ponovnog poziva funkcije.


4. Definiranje i deklaracija funkcije

Funkciju treba deklarirati prije prvog poziva.

Tada joj dodjeljujemo ime - naziv (zadaje se poštujući pravila tvorbe simboličkih imena (identifikatora), dobro je da on bude sugestivan kako bismo poslije znali koju funkciju pozivamo ukoliko ih ima više).




Ukoliko pozivamo funkciju koja ime više parametara, svi oni se odvajaju zarezom, te ispred svakog parametra navodimo njegov tip.


Pišemo li funkciju ispod funkcije main() onda funkciju treba prototipirati, odnosno navesti koju ćemo funkciju koristiti u retku prije funkcije main().





5. Primjeri uporabe varijable tipa static

1. primjer: nastavnica unese broj učenika pa u petlji unosi ocjene koje su postigli učenici na ispitu, u ovisnosti je li ocjena prolazna poziva se fja nedovoljnih() ili prolaznih() koje broje koliko je kojih. Varijable brojača su tipa static. Aplikacija ispisuje broj nedovoljnih i broj prolaznih kao i postotak prolaznosti.



2. primjer: Nastavnica unese broj učenika pa u petlji unosi ocjene koje su postigli učenici na ispitu, u ovisnosti je li ocjena prolazna poziva se fja nedovoljnih() ili sumaProlaznih(). Prva broji koliko je nedovoljnih i ukoliko prijeđe više od pola učenika razreda ispisuje „Ispit će trebati ponoviti!!!”, te pomoću funkcije exit(0) zaustavlja izvođenje programa. Druga sumira prolazne ocjene. Varijable brojača su tipa static. Aplikacija ispisuje broj nedovoljnih i srednju ocjenu ispita, ukoliko je više od pola prolaznih ocjena.



3. primjer:  Korisnik ima na raspolaganju za trošenje bon od 500 kn, on unosi cijenu svakoj pojedinog artikla koji unosi u košaricu, a aplikacija mu ispisuje koliki mu je iznos preostao za trošenje. Kad nema dovoljno novca za zadnji željeni artikl aplikacija mu ispisuje „Za ovaj artikl više nemate novca!” i završava izvođenje programa pomoću naredne exit. Cijene artikala unose se u petlji koja svaki puta poziva funkciju koja oduzima novac od raspoloživog. Neka raspoloživi iznos bude varijabla funkcije tipa static. 


6. Primjer


7. Primjer


8. Primjer tri točke u ravnini

Za koordinate tri točke u ravnini koje unosi korisnik provjeravamo leže li na istom pravcu, te ako ne leže računamo opseg i površinu trokuta kojega one čine. Podsjetimo se za točke 𝑇1(𝑥1, 𝑦1 ), 𝑇2(𝑥2, 𝑦2 ) i 𝑇3(𝑥3, 𝑦3 ) ako leže na istom pravcu vrijedi: 

(𝑥2 − 𝑥1)/( 𝑥3 − 𝑥1) = (𝑦2 − 𝑦1)/( 𝑦3 − 𝑦1

Napiši programski kod u C++ - u kojemu ćeš izdvojiti funkciju za unos koordinata točaka, koordinate deklariraj kao globalne varijable, zatim funkciju za provjeru leže li točke na istom pravcu koja će u main vratiti 1 ako leže i 0 ako ne leže. Ako točke ne leže na istom pravcu pozovi funkciju za izračun duljina stranica koja će vrijednosti duljina stranica također pohraniti kao globalne varijable. Nakon toga pozovi funkciju opseg koja će u main vratiti duljinu opsega. Ispiši tu duljinu iz maina. Posljednju pozovi funkciju koja će izračunati površinu trokuta kojeg čine te točke. Prisjeti se Heronove formule: 

𝑃=√(𝑠 ∗ (𝑠 − 𝑎) ∗ (𝑠 − 𝑏) ∗ (𝑠 − 𝑐) )

gdje je:

 𝑠 = (𝑎 + 𝑏 + 𝑐) /2






9. Poziv funkcije

Nakon što je funkcija deklarirana, možemo ju pozvati iz bilo kojeg dijela programa navođenjem naziva funkcije te ako funkcija prima argumente sa odgovarajućom listom argumenata.

Pravila za poziv funkcije:

  1.  broj argumenata u pozivu funkcije mora biti jednak broju argumenata u definiciji funkcije
  2.  tipovi stvarnih argumenata moraju se podudarati sa tipovima odgovarajućih formalnih argumenata 
  3.  imena formalnih argumenata ne moraju biti jednaka imenima stvarnih argumenata

Rezultat izvođenja funkcije možemo koristiti u aritmetičkom izrazu s desne strane operatora pridruživanja (ako funkcija nije tipa void). Npr. 
V=obujam_kvadra(a,b,c);
Funkcija također može biti argument poziva funkcije (druge ili iste).  
Funkciju koja poziva samu sebe zovemo rekurzija.



10. Prijenos argumenata

Argument je vrijednost koja se prosljeđuje funkciji. Funkciji je moguće proslijediti jedan ili više argumenata
Parametri funkcije su varijable koje prihvaćaju vrijednosti (stvarne argumente).



Ako funkciju pozivamo više puta u programu koristimo formalne parametre (argumente) koji ne moraju imati isto ime kao parametri (argumenti) u listi parametara u definiciji funkcije. 


Nakon što odradi svoj zadatak funkcija rezultat vraća u glavnu funkciju pomoću naredbe return.
Program prestaje s izvršavanjem kada stigne do naredbe return u funkciji  main(  ).
Prilikom izvršenja ostalih funkcija program ne završava nego se vraća u prvu liniju nakon poziva te funkcije.

Ponekad je potrebno da se program završi izvan funkcije main. Funkcija exit (  )  prekida izvršavanje programa bez obzira na to što se trenutno izvršava. Uz nju je nužno koristiti i biblioteku cstdlib.


Moguće je prilikom deklaracije funkcije postaviti predefinirane vrijednosti jednog ili više argumenta tako da se u slučaju da prilikom poziva funkcije neki od njih nedostaje koristi se ta unaprijed zadana vrijednost, odnosno vrijednosti.



11. Primjer prijenosa argumenata & uporabe lokalne varijable tipa static


12. Prijenos polja kao argumenta funkciji

Ponekad imamo potrebu funkciji prenijeti elemente polja. To možemo učiniti kao u primjeru.

Primjer: Službeni vozač unosi potrošnju goriva u litrama i prijeđeni put u kilometrima za svaki radni dan u tjednu (pon-pet). Podaci se pohranjuju u dva polja. Zatim se iz maina pozivaju funkcije koje sumiraju gorivo i kilometre te na kraju u mainu računa i ispisuje prosječna potrošnja u l/100 km. 


13. Tipovi funkcija

Do sada smo već spominjali dva glavna tipa funcija:

  - funkciju koja ne vraća vrijednost

  void ()

  - funkcije koje vraćaju vrijednost npr.:

float volumen_kvadra (  float a, float b, float c  )

  gdje tip može biti int, float, bool, char...

Za bolje razumijevanje prijenosa argumenata u funkcijama funkcije dijelimo na:

  1. Funkcije bez argumenata i bez vraćanja vrijednosti
  2. Funkcije bez argumenata ali s vraćanjem vrijednosti
  3. Funkcije s argumentima ali bez  vraćanja vrijednosti
  4. Funkcije s argumentima i  vraćanjem vrijednosti

14. Tipovi funkcija - primjeri zadataka

Sve tipove prikazati ćemo na jednostavnom zadatku provjere je li broj prost.


1. Funkcije bez argumenata i bez vraćanja vrijednosti



2.  Funkcije bez argumenata ali s vraćanjem vrijednosti



3. Funkcije s argumentima ali bez  vraćanja vrijednosti



4. Funkcije s argumentima i  vraćanjem vrijednosti



15. Funkcija rekurzija

Rekurzivna funkcija je funkcija koja poziva samu sebe. Pozivom rekurzivne funkcije u njoj se formiraju lokalne varijable koje su nedohvatljive izvan nje.

Uvjeti:

·         mora imati  uvjet zaustavljanja

·         u svakom pozivu mora se približavati uvjetu zaustavljanja


STOG: prvi unutra – zadnji van!


16. Primjer: funkcija faktorijela

Funkcija faktorijela - primjer rekurzivne funkcije


Faktorijela je matematička funkcija  kojom se izračunava produkt prirodnih brojeva  od 1 do nekog određenog prirodnog broja n, označeno kao n!



Uvjet zaustavljanja je 1!=1


Primjer: Napisati rekurzivnu funkciju za izračun faktorijela do broja kojega je zadao korisnik.






17. Primjer: Izračun potencije pomoću rekurzivne funkcije

Primjer: Napisati rekurzivnu funkciju koja izračunava be gdje korisnik zadaje bazu b i eksponent e (bez upotrebe funkcije pow)


18. Primjer: Riječ unatrag

Primjer: Napisati funkciju koja riječ koju korisnik unese u mainu, proslijedimo kao argument funkciji koja ju okrene unatraške i vrati u main gdje ju ispišemo.