Lekcija: Funkcije - definisanje i pozivanje funkcije
Zašto nam treba funkcija?
Funkcije razbijaju velike računske zadatke u manje delove i omogućavaju ljudima da iskoriste ono što su drugi uradili umesto da počunju od samog početka. Odgovarajuće funkcije mogu da sakrivaju detalje postupka od delova programa koji ne moraju da znaju o njima i tako ceo program čine jasnijim i jednostavnijim za menjanje.
-
Funkcija je deo programa izdvojen u posebnu celinu.
Programi koji se pišu i programskom jeziku C se generalno sastoje od mnogo malih funkcija, a ne od nekoliko velikih. Izdvajanjem manjih celina programa u potprograme olakšava se organizacija programa i omogućuje njihova ponovna upotreba u istom ili drugim programima. Ovo takođe omogućava podelu posla među programerima.
-
Funkcije izračunavaju rezultat i kao svoju vrednost vraćaju dobijeni rezultat ili izvršavaju neki zadatak.
Ako drugačije nije definisano u okruženju u kojem se radi, glavni deo svakog C programa je funkcija main.
Primeri funkcija su: printf, scanf, sqrt, abs,...
Prototip funkcije (deklaracija) i definicija funkcije
Pre nego što se funkcija prvi put pozove potrebno je ili navesti njenu deklaraciju ili je definisati. U originalu, deklaracija funkcije se naziva prototip funkcije. Prototip funkcije sadrži samo zaglavlje, dok definicija funkcije sadrži i zaglavlje i telo funkcije.
DA PONOVIMO: Funkcija mora biti deklarisana pre svoje upotrebe! To se radi da bi kompajler mogao da zna da postoji neka funkcija koja će da se koristi
*** Na sledeći način se piše prototip funkcije (deklaracija funkcije):
tip_rezultata ime_funkcije(tip_parametra1 parametar1, … , tip_parametraN parametarN);
Primeri:
void FunkcijaBezParametara();
void NekaDrugaFunkcija(int);
int KodSlova(char slovo);
double Razlika(double x1, double x2);
*** Na sledeči način se funkcija definiše :
tip_rezultata ime_funkcije(tip_parametra1 parametar1, … , tip_parametraN parametarN)
{
// Telo funkcije
}
Primer:
int KodSlova(char slovo){
return slovo; // <- telo funkcije koja vraća ASCII kod slova koje joj se pošalje kao parametar
}
U nastavku ćemo pokušati da objasnimo neka pravila koja smo koristili prilikom pisanja funkcije:
- Dobra praksa je da se prvo napiše komentar u kojem se opisuje šta će funkcija da radi, kao i osnovna ideja o načinu rada funkcije
- Sledeće se piše zaglavlje (onaj prvi red). Na koji način se piše zaglavlje funkcije:
- prvo se navodi tip rezultata (povratna vrednost) koji funkcija vraća. To može biti bilo koji od tipova podataka koje smo radili (char, int, double,...). Ako funkcija ne treba da vraća neku vrednost, onda se piše void. Ako se ne napiše tip koji se vraća, onda se podrazumeva da je int.
- nakon toga se piše Ime funkcije bi trebalo da može da sugeriše šta će funkcija da radi. Najčešće se koristi Upper Camel Case notacija (više reči spojenih zajedno da kao čine jednu složenu reč kao na primer: ImeFUnkcijeKojaJePrimer )
- Zatim se pišu zagrade () i u njima parametri koji joj se daju ako ih funkcija ima, a ako za rad funkcije nisu potrebni parametri, onda se ne postavljaju. Ono što se ne sme zaboraviti je da su zagrade OBAVEZNE da bi se videlo da se radi o funkciji. Ako su parametri potrebni onda se navode redom kojim će da se koriste. U slučaju kada se piše deklaracija funkcije ne moraju se navesti nazivi parametara (NekaDrugaFunkcija(int)). Kada se funkcija definiše potrebno je navesti i tipove parametara i njihove nazive da bi znali šta se i kako koristi unutar same funkcije (double Razlika(double x1, double x2) )
- Ako je u pitanju deklaracija funkcije, nakon navođenja svega navedenog stavlja se tačka-zarez; Međutim, ako je u pitanju definicija funkcije, onda se stavljaju vitičaste zagrade i u njima se nalazi telo funkcije. Nakon vitičastih zagrada se NE STAVLJA tačka-zarez!
Šta je to telo funkcije?
- Telo funkcije je blok naredbi koje se izvršavaju. Tu možemo da koristimo sve što smo do sada radili. Možemo da uvodimo nove promenljive i da ih koristimo, kao i promenljive koje se funkciji prosleđuju kao parametri.
- Ako funkcija treba da vraća neku povratnu vrednost onda mora da se završi naredbom return POvratnaVrednost;
- Funkcija će da se završi prvi put kada naiđe na naredbu return, a ako ne naiđe na tu naredbu, onda se završava izvršavanjem poslednje naredbe u svom telu. U okviru tela funkcije može da se nalazi i više naredbi return. Funkcija će da se završi kada naiđe na prvu od njih. Kada se funkcija završi, tada se nastavlja izvršavanje funkcije koja ju je pozvala odmah nakon mesta na kojem je ta funkcija pozvana.
Na koji način će da se vrši poziv funkcije?
- Poziv funkcije se vrši tako što se navede ime funkcije i nakon imena se stave zagrade. Ako funkciji trebaju parametri, oni se postavljaju u zagrade. Redosled parametara mora da bude kao u deklaraciji i u definiciji funkcije! Isto tako, tip parametara treba da se poklapa sa tipom koji je naveden u deklaraciji i u definiciji!
- Poziv funkcije može da bude deo nekog drugog izraza, može nekoj promenljivoj da se dodeli povratna vrednost koju funkcija vraća, a može i da se koristi poziv funkcije kao zasebna naredba.
- Kada se neka funkcija pozove, tada se izvršava telo te funkcije kao neki potprogram, a nakon završetka, program nastavlja sa radom tamo gde je prethodno stao. Ako se poziv funkcije koristi kao deo nekog drugog izraza, onda se poziv funkcije zamenjuje njenim rezultatom i dalje se nastavlja izračunavanje tog izraza.
Primer:
int main(void)
{
int redniBrojSlova = KodSlova('A');
printf("%d", redniBrojSlova);
return redniBrojSlova;
}
*** Zašto bismo prvo deklarisali funkciju, a ne da je odmah definišemo?
Ovo se ponegde zove metoda "odozgo na dole". Ako želimo da se uvek koncentrišemo na manje delove problema, pri pisanju programa, umesto nekih delova programa koji čine logičke celine upisujemo nazive funkcija, pa ih kasnije realizujemo (posle funkcije main). Na ovaj način se povećava čitljivost onoga što se radi, a i olakšavaju se buduće izmene.