Deo zbornika Uvod u programiranje kroz C
Funkcije u jeziku C
Funkcija osigurava prikladan način vršenja svakojakih izračuna, čije rezultate kasnije možemo upotrijebiti bilo gdje. Pravilno zadanim funkcijama, moguće je posao obaviti bez poznavanja unutarnje strukture funkcije; saznanje da je posao korektno obavljen je više nego dovoljno. C čini upotrebu funkcije lakom, prikladnom i efikasnom; često ćete se susretati s kratkim funkcijama definiranim i pozvanim samo jednom, tek radi pojašnjavanja dijelova koda.
Primjer: funkcija power
Dosad smo koristili samo ponuđene funkcije tipa printf
, getchar
i putchar
; došlo je vrijeme da sami napišemo nekoliko funkcija. Evo funkcije power
i glavnog programa za njeno testiranje, kako bi mogli razlučiti čitavu njenu strukturu:
#include <stdio.h>
int power(int m, int n);
/* test power funkcije */
int main()
{
int i;
for (i = 0; i < 10; ++i)
printf("%d %d %d\n", i, power(2, i), power(-3, i));
return 0;
}
/* power: podiže bazu na n-ti eksponent n>=0 */
int power(int base, int n)
{
int i, p;
p = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}
Evo i verzije funkcije power
, bez pomoćne varijable i
:
int power(int base, int n)
{
int p;
for (p = 1; n > 0; --n)
p = p * base;
return p;
}
Ovde se vrednost parametra n
smanjuje unutar funkcije. Međutim, što god uradili sa n
unutar funkcije, nema nikakvog uticaja na argument sa kojim je power
prvobitno pozvan (vidi Prenos argumenata).
Definicija funkcije
Definicija funkcije ima ovaj oblik:
tip_podatka ime_funkcije(tip_1 arg_1, ... ,tip_n arg_n)
{
tijelo funkcije
}
gdje je tip_podatka
tip podatka koji će funkcija vratiti kao rezultat svog izvršavanja. Unutar zagrada nalazi se deklaracija formalnih argumenata funkcije. Prvi argument arg_1
je varijabla tipa tip_1
itd. Deklaracije pojedinih argumenata međusobno se odvajaju zarezom. Unutar vitičastih zagrada pojavljuje se tijelo funkcije koje se sastoji od deklaracija varijabli i izvršnih naredbi.
Poziv funkcije
Funkcija power
se poziva u main
funkciji na sledeći način:
printf("%d %d %d\n", i, power(2, i), power(-3, i));
Svaki poziv predaje dva argumenta funkciji power
, koja nakon toga vraća cijeli broj za formatirani ispis. U jednom izrazu, power(2,i)
je cijeli broj kao što su to i 2
i i
.
Evo verzije funkcije power
(od ranije), bez pomoćne varijable i
, koja koristi ovu osobinu:
int power(int base, int n)
{
int p;
for (p = 1; n > 0; --n)
p = p * base;
return p;
}
Parametar n
se koristi kao privremena varijabla, a vrednost mu se smanjuje dok ne dođe do nule. Međutim, što god uradili sa n
unutar funkcije power
, nema nikakvog uticaja na argument sa kojim je power
prvobitno pozvan.
Tip i parametri funkcije
Prva linija funkcije power,
int power(int base, int n)
određuje tipove i imena parametara, te tip rezultata koji funkcija vraća. Imena koja koristi power
za svoje parametre su lokalna i nisu vidljiva za bilo koju drugu funkciju: druge funkcije bez ikakvog problema mogu se služiti istim imenima. To isto tako vrijedi i za varijable i
i p
: i u funkciji power
nema ništa s i u funkciji main.
Mi ćemo koristiti “parametar” za varijablu čije se ime nalazi na listi definicije funkcije uokvirene zagradama, a “argument” za vrijednost koja se koristi pri pozivu. Ponekad se koriste termini “formalni argument” i “aktualni argument” da se ovi pojmovi ne bi miješali.
Evo verzije funkcije power
(od ranije), bez pomoćne varijable i
, koja koristi ovu osobinu:
int power(int base, int n)
{
int p;
for (p = 1; n > 0; --n)
p = p * base;
return p;
}
Parametar n
se koristi kao privremena varijabla, a vrednost mu se smanjuje dok ne dođe do nule. Međutim, što god uradili sa n
unutar funkcije power
, nema nikakvog uticaja na argument sa kojim je power
prvobitno pozvan.
Vraćanje vrijednosti
Vrijednost koju power
izračuna vraća se u main
pomoću naredbe return
. Bilo koji izraz može biti naveden iza return
:
return izraz;
Funkcija ne mora vraćati vrijednost.
Mogli ste uočiti naredbu return
na kraju main
funkcije. Pošto je main
funkcija kao i svaka druga, njena se vrijednost može vratiti onome tko ju je pozvao, što je gotovo uvijek operativni sustav. Bilo kako bilo, vraćena vrijednost nule podrazumijeva uredan završetak; vraćena vrijednost različita od nule znak je da nešto nije bilo u redu. Da bi pojednostavnili, mi smo izostavljali naredbe return
iz main
funkcija, ali ćemo ih uključivati, jer programi trebaju vraćati status svome okruženju.
Evo verzije funkcije power
(od ranije), bez pomoćne varijable i
, koja koristi ovu osobinu:
int power(int base, int n)
{
int p;
for (p = 1; n > 0; --n)
p = p * base;
return p;
}
Parametar n
se koristi kao privremena varijabla, a vrednost mu se smanjuje dok ne dođe do nule. Međutim, što god uradili sa n
unutar funkcije power
, nema nikakvog uticaja na argument sa kojim je power
prvobitno pozvan.
Deklaracija ili prototip funkcije
Funkcija mora biti deklarirana prije mjesta na kome se poziva, kako bi prevodilac znao broj i tip argumenata funkcije i tip rezultata koji vraća. Stoga je prirodno definiciju funkcije staviti prije funkcije main
. Ako u programu imamo puno funkcija takav način pisanja može biti nepregledan. C nam stoga dozvoljava da definiciju funkcije stavimo iza mjesta na kome se poziva, ako prije postavimo prototip funkcije. Prototip se dobiva tako da se u definiciji funkcije ispusti čitavo tijelo funkcije. Prototip kao i sve druge naredbe završava s točka-zarezom. Općenito, prototip ima oblik
int power(int m, int n);
Kaže da power
funkcija treba dva cjelobrojna argumenta, a vraća jedan int
. Ova deklaracija, koja se naziva prototipom funkcije, mora se slagati s definicijom power
. Ako se definicija funkcije ili neki njezin poziv ne slaže s prototipom, primit ćemo dojavu o greški.
Imena parametara ne moraju se slagati. Zapravo, imena parametara u prototipu funkcije su proizvoljna, pa se dade napisati i
int power(int, int);
Uredno odabrana imena čine program dokumentiranim, pa ćemo ih radije koristiti.
Deklaracije funkcija se mogu pojavljivati po bilo kom redoslijedu, u jednoj ili više izvornih datoteka.
Evo verzije funkcije power
(od ranije), bez pomoćne varijable i
, koja koristi ovu osobinu:
int power(int base, int n)
{
int p;
for (p = 1; n > 0; --n)
p = p * base;
return p;
}
Parametar n
se koristi kao privremena varijabla, a vrednost mu se smanjuje dok ne dođe do nule. Međutim, što god uradili sa n
unutar funkcije power
, nema nikakvog uticaja na argument sa kojim je power
prvobitno pozvan.
Literatura
- Brian Kernighan i Dennis Ritchie, Programski jezik C
- M. Jurak, Programski jezik C, predavanja 2003/04.