Funkcije u C-u
| Sjedište: | CARNET Loomen LMS |
| E-kolegij: | III. gimnazija Osijek - Informatika 3 |
| Knjiga: | Funkcije u C-u |
| Otisnuo/la: | Gost (anonimni korisnik) |
| Datum: | petak, 9. siječnja 2026., 16:02 |
1. Uvod
Kao što je već spomenuto, svi programi u C-u sastoje se barem od jedne funkcije. Jedina obavezna funkcija je funkcija main() koja označuje početak izvršavanja glavnog dijela programa. Tijekom procesa programiranja često se neki dijelovi programa trebaju izvoditi više puta, ali s različitim vrijednostima varijabli.
Primjerice: Napišite program koji će korisniku omogućiti upis koordinata točaka A(x1, y1), B(x2, y2) i C(x3, y3) u pravokutnome koordinatnom sustavu. Program treba izračunati i ispisati opseg i površinu trokuta dobivenog spajanjem zadanih točaka.
Uputa: Pretpostavimo da će korisnik upisati koordinate triju točaka koje ne leže na istom pravcu.

1.1. Rješenje uvodnog zadatka
Rješenje zadatka izgledalo bi ovako:
#include<stdio.h>#include<math.h>
int main()
{
float x1,y1,x2,y2,x3,y3,a,b,c,s,p,o;
printf("Unesi koordinate tocke A ");
scanf("%f %f",&x1, &y1);
printf("Unesi koordinate tocke B ");
scanf("%f %f",&x2, &y2);
printf("Unesi koordinate tocke C ");
scanf("%f %f",&x3, &y3);
/*racunanje duljine stranica*/
a=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
b=sqrt(pow(x3-x2,2)+pow(y3-y2,2));
c=sqrt(pow(x3-x1,2)+pow(y3-y1,2));
/*racunanje povrsine i opsega*/
o=a+b+c;
s=o/2;
p=sqrt(s*(s-a)*(s-b)*(s-c));
printf ("%.2f, %.2f, %.2f", a,b,c);
printf ("\nPovrsina je %.2f, a opseg %.2f", p, o);
return 0;
}
2. Funkcije
Lako se može uočiti da se za računanje udaljenosti među točkama zapravo rabi ista formula, ali s različitim vrijednostima. Takve je dijelove programa praktično izdvojiti u zasebne cjeline, funkcije i pozivati ih prema potrebi. Naravno, neozbiljno je očekivati da sve formule koje bi nam mogle zatrebati budu sastavni dio programskog jezika. U programski su jezik uključene samo funkcije koje se često koriste (primjerice funkcija za potenciranje ili korjenovanje). Za slučajeve kao iz prethodnog primjera korisniku je dana mogućnost da sam osmisli i napiše funkciju koju će pozivati onoliko puta koliko bude potrebno. Takve funkcije nazivamo korisnički definirane funkcije. Rješavamo li problem na takav način, možemo reći da se bavimo strukturnim programiranjem.
Pojam strukturnog programiranja uveden je u trenutku kad
se pojavila potreba za standardizacijom pisanja programa. Programi su, zbog
nepostojanja općih pravila za njihovo pisanje, postajali sve veći i
nepregledniji. Promjene programa ili ispravljanja grešaka katkad su bile gotovo
nemoguće.
Glavna značajka strukturno napisanog programa je zadržavanje linearne strukture glavnog programa koja se postiže izdvajanjem problemskih zadataka u zasebne dijelove programskog koda (korisnički definirane funkcije).
U prethodnom primjeru možemo izdvojiti sljedeće problemske zadatke:

Funkcija je cjelovita skupina naredbi koja izvršavanjem ispunjava određene zahtjeve.
To znači da je funkcija u C-u isto što i funkcija, potprogram i procedura u ostalim višim programskim jezicima. One omogućuju rastavljanje problema na jednostavnije i manje cjeline, čime pridonose boljoj preglednost izvornog koda i jednostavnijem pronalaženju i otklanjanju grešaka. Također, uporabom funkcija znatno se štedi memorijski prostor.
Funkcije se ne moraju rabiti samo da bi se izbjeglo višestruko pisanje određenih dijelova programa nego su praktične i ako će se izvršiti samo jedanput. U tom slučaju olakšavaju razumijevanje programa, odnosno algoritma.
Jednom napisanu funkciju moguće je rabiti u više različitih programa.
Za raščlambu problema na
manje zadatke postoji i naziv top-down metoda rješavanja zadatka. Top-down je općenit postupak koji se ne
koristi samo u programiranju. Njime se problem raščlanjuje na manje zadatke –
module. Pojedini moduli tada se rješavaju ili, ako je potrebno, ponovo dijele
na nove module.
Da bi se napisala funkcija, potrebno je znati kako ju ispravno definirati i pozvati.
2.1. Definicija funkcije
Definicija funkcije je izvorni kôd kojim je određen način rada pojedine funkcije. Svaku funkciju treba definirati na točno propisan način. U C-u postoje dva načina definiranja funkcije.
Prvi način je noviji i preporučuje se standardom ANSI C:
tip_funkcije ime_funkcije(najava popisa_parametara){
najava lokalnih varijabli;
naredbe;
return izlazna_vrijednost;
}
gdje:
- tip_funkcije određuje tip vrijednosti koju pozvana funkcija vraća u nadređenu funkciju, a može biti bilo koji od osnovnih tipova podataka (int, char, float, double, void)
- ime_funkcije je identifikator preko kojeg se funkcija poziva
- popis_parametara je popis formalnih parametara s pripadajućim tipovima preko kojih se podatci iz nadređene funkcije prenosi u pozvanu funkciju
- return je naredba nakon koje se navodi vrijednost koju funkcija vraća u glavni program i mora biti istog tipa kao i tip funkcije. To je mjesto na kojem se prekida izvršavanje funkcije i kontrola vraća u glavni program.
Sljedeća funkcija ima takvu definiciju:

Drugi se način razlikuje od prvog po tome što se argumenti funkcije najavljuju izvan zagrade.
tip_funkcije ime_funkcije(popis_parametara)
najava popisa_parametara;
{
najava lokalnih varijabli;
naredbe;
return izlazna_vrijednost;
}
Prethodni primjer zapisan na takav način je ovaj:

Funkciju je dovoljno definirati samo jedanput. Nakon toga ju je moguće pozvati iz bilo kojeg dijela programa. Funkcije u C-u mogu vratiti u glavni program jednu ili nijednu vrijednost (što je određeno tipom funkcije). Za to se koristi spomenuta naredba return, koja prenosi izlaznu vrijednost u nadređeni program. Funkcija se prestaje izvršavati nailaskom na prvu naredbu return.
2.2. Primjeri
Primjer 1.
Ako je definirana funkcija na sljedeći način:
float broj(){
return(7.56);
return (2.0);
return(10.5);
}
koju će vrijednost vratiti u glavni program? Zašto?
S obzirom na to da se funkcija prestaje izvršavati nailaskom na prvu naredbu return, funkcija će u glavni program vratiti vrijednost 7.56.
Funkciji koja u glavni program ne vraća nijednu vrijednost dodjeljuje se tip podataka void. Takve funkcije služe za obavljanje niza radnji, primjerice za ispis, i ne sadržavaju naredbu return.
Primjer 2.
Funkcija proba() ne vraća nijednu vrijednost u glavni program nego samo ispisuje navedeni tekst.
void proba(){
printf("Ovo je funkcija");
}
Ova funkcija nema ulaznih parametara, zato je zagrada iza naziva funkcije prazna.
Primjer 3.
Funkcija pozitivan() ne vraća nijednu vrijednost u glavni program nego na zaslonu ispisuje je li upisani broj veći, manji ili jednak nuli.
void pozitivan(int a){
if (a>0)
printf("Upisani broj je veci od nule.");
else if (a<0)
printf("Upisani broj je manji od nule.");
else
printf("Upisali ste nulu.");
}
Ako u glavni program treba vratiti više vrijednosti, onda se to radi preko argumenta funkcije koji su najavljeni kao globalne varijable.
Primjer 4.
Sljedeća će funkcija u glavni program vratiti dvije vrijednosti.
#include <stdio.h>int a,b; /*najava globalnih varijabli*/
/*funkcija zamjene*/
void zamjena ()
{
int t; /*lokalna varijabla*/
t=a; /*zamjena uporabom globalnih varijabli*/
a=b;
b=t;
}
… dalje slijedi glavni program, o kojem će više riječi biti malo poslije.
Primjer 5.
Funkcija veci() će u nadređeni program vratiti veći od učitanih dvaju cijelih brojeva.
int veci(int a, int b){
int v;
if (a>b)
v=a;
else
v=b;
return v;
}
2.3. Formalni parametri funkcije
Prema samoj definiciji funkcija, njihova je namjena različita. Neke ne
zahtijevaju ulazne podatke pa popis_parametara može ostati i prazan (kao u spomenutim funkcijama proba i zamjena).
Ako ulazni podatci postoje, za svaki od njih navodi se tip podatka i
identifikator. Međusobno se odvajaju zarezom (kao u funkciji proba1).

U funkciji proba1 identifikator x je formalni parametar koji služi za rezerviranje memorijskog prostora. Tek pozivom funkcije na mjesto formalnog parametra učitava se u memoriju stvarna vrijednost navedena u pozivu.
2.4. Poziv funkcije
Funkcija se izvršava onog trenutka kad je pozvana iz glavnog programa ili neke druge funkcije.
Za poziv funkcije dovoljno je navesti njezino ime i popis stvarnih parametara onim redoslijedom kako su navedeni u najavi funkcije:
ime_funkcije (stvarni popis_parametara);
Popis_parametara može biti i prazan. Ako je popis prazan, onda funkcija upotrebljava globalne varijable (kao u primjeru funkcije zamjena). No obvezno je pisati zagrade (), jer one označuju da se kontrola tijeka programa prenosi iz nadređene funkcije u pozvanu funkciju.
Funkcije se mogu pozivati u izrazima, petljama, ili kao argumenti u pozivima drugih funkcija.
Vratimo se sada na primjere definicija funkcija koje smo dali u prethodnoj lekciji i pozovimo ih na izvršavanje u glavnom programu.
Primjer 1.
Napišite program koji će s pomoću funkcije pomnozi() iz prethodnog dijela izračunati umnožak dvaju cijelih brojeva.

Ako malo pomnije promotrite ovaj program, uvidjet će te da, iako imaju iste identifikatore varijable x i y u funkciji pomnozi() i varijable x i y, u glavnom dijelu programa nisu iste. Varijable x i y iz glavnog dijela programa (u programu osjenčane plavo) su lokalne varijable i postoje samo u glavnom dijelu programa. Varijable x i y najavljene u popisu parametara funkcije (osjenčane zelenom bojom) su formalni parametri koji služe za rezerviranje memorijskog prostora. Tek pozivom funkcije na njihovo mjesto učitavaju se vrijednosti stvarnih varijabli x i y iz glavnog programa.
Zato bilo bi najučinkovitije (da bi se izbjegle moguće greške) izabrati različite identifikatore za funkciju i glavni dio programa. Evo primjera:

U ovom smo zadatku funkciju pozvali unutar funkcije printf().
Primjer 2.
Napišite program koji će od korisnika tražiti upis triju brojeva x, y i z. Program treba, uporabom funkcije veci() (iz prethodnog dijela), ispisati najveći od upisanih brojeva.
Napomena: Za rješavanje tog zadatka potrebno je funkciju veci() pozvati dva puta. Prvi put s prva dva upisana broja (neka su to a i b), a zatim s većim od tih dvaju brojeva i trećim unesenim.

Formalni parametri a i b pozivom funkcije poprimaju vrijednosti varijabli navedenih u pozivu. Ako su vrijednosti varijabli x = 3, y = 5 i z = 4, tada će u prvom pozivu funkcije naredbom veci1=veci(x,y) parametar a poprimiti vrijednost 3, a parametar b vrijednost 5. U drugom pozivu funkcije naredbom veci2=veci(veci1,z), vrijednost parametra a bit će 5, a parametra b 4.
U ovom smo zadatku funkciju pozvali unutar naredbe pridruživanja. Pripazite: tip podatka varijabli veci1 i veci2 mora bit isti kao i tip podataka funkcije.
Formalne parametre shvatite kao formulu iz matematike i fizike. Stvarni parametri su oni kojima se koristite kada u formulu uvrštavate vrijednosti iz zadatka.
Primjer 3.
Napišite cijeli program koji će učitati dva cijela broja i s pomoću funkcije zamjena() zamijeniti vrijednosti tih dviju varijabli.

S obzirom na to da funkcija zamjena() ne vraća nikakvu vrijednost u glavni program, pozivamo ju samo navođenjem njezina imena. U spomenutom slučaju funkcija upotrebljava globalne varijable, koje se mogu upotrebljavati u cijelom programu, pa nema potrebe navoditi stvarne parametre.
2.5. Deklaracija funkcije
Svaka se funkcija prije poziva treba najaviti (deklarirati).
Najava omogućuje pravilnu pretvorbu različitih tipova podataka te provjeru tipova podataka u popisu parametara i podataka iz glavnog programa koji se prenose u funkciju.
Svi naši primjeri do sada su se bez problema preveli i izvršili, što znači da su naše funkcije bile najavljene. Kako?
U svim prethodnim primjerima funkcije smo pisali na početku, nakon predprocesorskih naredbi i najave globalnih varijabli, ali prije funkcije main(). U tim je slučajevima definicija funkcije ujedno njezina najava.
Međutim, postoji mogućnost pisanja funkcije na kraju glavnog programa. Tada ju je potrebno najaviti navođenjem tipa, imena i tipa podataka ulaznih parametara (prototip funkcije), kao što je to učinjeno u sljedećem primjeru funkcije za računanje udaljenosti između dviju točaka u pravokutnome koordinatnom sustavu.

Testni primjeri
Ulaz: 0 0
3 0
Izlaz: Udaljenost medju zadanim tockama je 3.00
Zadatak: Prepravite prethodni primjer tako da funkciju napišete prije funkcije main(). Rješenje potražite u digitalnim materijalima.
Osim navedenih načina, definicija funkcije može biti i u odvojenoj datoteci ili unutar neke druge funkcije. No takve se najave rjeđe koriste. U tim je slučajevima obvezno najaviti funkciju.
Funkcija se može pojaviti kao argument druge funkcije i broj ugniježđenih funkcija nije ograničen.
Promotrite ovaj program i razmislite što će se ispisati na zaslonu.
Nakon izvršavanja ovog programa na zaslonu će se ispisati redom:

Zapamtite, funkcija ne može biti pozvana ako prije poziva nije najavljena! Zato funkcija_3 mora biti najavljena prije nego je pozvana. S obzirom na to da se poziva u funkciji_2, mora biti najavljena prije nje. Isto tako funkcija_2 najavljena je prije funkcije_1 jer se u njoj poziva!
Pokušajmo sada, koristeći se prethodnom funkcijom za računanje udaljenosti između dviju točaka, riješiti zadatak s početka.
2.6. Zadatak
Zadatak s početka!
Napišite program koji će, uporabom funkcije za udaljenost dviju točaka, izračunati i ispisati opseg i površinu trokuta zadanog koordinatama svojih točaka A(x1, y1), B(x2, y2) i C(x3, y3) u pravokutnome koordinatnom sustavu. Program treba izračunati i ispisati opseg i površinu trokuta dobivenog spajanjem zadanih točaka.
Uputa: Pretpostavimo da će korisnik upisati koordinate triju točaka koje ne leže na istom pravcu.
Zamijetite da
smo varijablu o koja označuje opseg najavili globalno tako da je možemo
upotrebljavati u svim funkcijama našeg programa. Testni primjeri Ulaz: 0 0 3
0 0 4 Izlaz: Duljine stranica 3.00, 5.00, 4.00 Opseg
je 12.00 Povrsina
je 6.00
2.7. Zadaci za vježbu
1. Dodajmo u program i točku D s koordinatama (x4, y4) te napišimo program koji računa površinu četverokuta koji se dobije spajanjem točaka A, B, C i D.

Uputa: Podijelite četverokut na dva trokuta, za svaki od njih izračunajte površinu koristeći se funkcijama iz prethodnog programa te dobivene površine zbrojite.
2. Kolike će biti vrijednosti varijabli x i y nakon izvođenja sljedećeg programa?
#include <stdio.h>
int proba(x)
int x;
{
x=2*x;
return x;
}
int main()
{
int x=10,y;
y=2*proba(x);
printf("\nx=%d\ny=%d",x,y);
return 0;
}
3. Napišite program koji omogućuje učitavanje duljina stranica pravokutnika pa s pomoću funkcija za računanje površine i opsega računa i ispisuje površinu te opseg.
Testni primjeri
Ulaz: 3 0
Izlaz: Duljina stranica mora biti veca od 0
Ulaz: 5 7
Izlaz: Povrsina je 35.00
Opseg je 24.00
4. Napišite program koji će omogućiti upisivanje duljine bridova kocke. Program treba, koristeći se funkcijama, ovisno o želji korisnika izračunati i ispisati oplošje, volumen ili duljinu prostorne dijagonale zadane kocke.
Testni primjeri
Ulaz: 5
1
Izlaz: Oplosje je 150.00
Ulaz: 5
2
Izlaz: Volumen je 125.00
Ulaz: 5
3
Izlaz: Duljina prostorne dijagonale je 8.66
5. Napišite program koji će omogućiti učitavanje brojnika i nazivnika jednog razlomka. Program treba, uporabom funkcije za skraćivanje razlomka, potpuno skratiti učitani razlomak.
6. Napišite program koji će, koristeći se funkcijom,
za zadani prirodan broj provjeriti je li prost.
Testni primjeri
Ulaz: 256
Izlaz: Broj 256 NIJE prost broj
Ulaz: 17
Izlaz: Broj 17 JE prost broj
7. Napišite program koji će za upisani prirodan broj
ispisati sve njegove djelitelje.
Testni primjeri
Ulaz: 256
Izlaz: 2 4 8 16 32 64 128
Ulaz: 17
Izlaz: Broj nema djelitelja
2.8. I još malo zadataka za vas

Rješenja:
5. zadatak - suma razlomaka s faktorijelima i potencijom
5. a zadatak - suma razlomaka s faktorijelima i potencijom i promjenom predznaka