Jezik
Istorijat
C++
Kompajler
Razvojni ciklus
Hello.c
Greške
Komentari
Varijable
Printf i scanf
Include i main
Zbir.c
Konstante
Naredbe i izrazi
Operatori I
Zadaci I nivo
Operatori II
If/else
Zadaci II nivo
For
Zadaci III nivo
While
Zadaci IV nivo
Funkcije
Zadaci V nivo
Nizovi
Zadaci VI nivo
Zadaci
Rječnik
Literatura
abc C
|
|
Funkcije se dijele na ugrađene i korisničke funkcije, te main funkciju.
Ugrađene funkcije
O funkcijama je već bilo riječi. Definisao sam ih kao naredbe koje izvršavaju
neku specifičnu radnju. Kao takve sam naveo printf i scanf funkcije. Ove dvije
funkcije imaju sledeći oblik:
ime_funkcije(argument(i));
Ove funkcije se još nazivaju i ugrađene funkcije (eng. Built-In Function). One
postoje kao takve u C sintaksi. Da bi se one mogle izvršiti potrebno je uključiti
datoteke zaglavlja, nesamostalne su. Pored printf i scanf funkcije u C-u postoji
147 funkcija namjenjenih izvršavanju raznih zadataka. Naravno, one su van domena
ovog rada.
Korisničke funkcije
Korisničke funkcije (eng. User-Defined Function) su imenovani i samostalni
dijelovi koda koji izršavaju neki zadatak.
Funkcija je imenovana. To znači da funkcija ima vlastito i jedinstveno ime.
Imena ugrađenih funkcija su određena i ne mogu se mijenjati. Imena korisničkim
funkcijama daje korisnik. Čemu služe imena funkcijama? Ljudima, naprimjer, imena
služe da bi ih mogli pozvati. Tako i funkcijama.
Funkcije su samostalne. To znači da mogu da se izvrše bez interakcije sa ostatkom
koda. Argumenti nisu dio takve interakcije.
Korisničke funkcije izvršavaju neki zadatak. Kakav će one zadatak izvršavati
zavisi od korisnika. To je najvažniji razlog, zašto se tako zovu. Dakle, korisnik
stvara od već postojećih dijelova koda zadatak koji će ona izvršavati. Pored
zadatka, korisnik određuje i ostale parametre funkcije.
Kod ugrađenih funkcija smo vidjeli da primaju argumente. Isto mogu da čine i
korisničke. One često obrađuju vrijednosti koje dobiju putem argumenata i vraćaju
ih nazad funkcijama koje su ih pozvale.
Pogledajmo sada primjer:
#include <stdio.h>
long a, stranica, povrsina;
long kvadrat(long stranica);
main()
{
printf("Unesite duzinu stranice kvadrata ");
scanf("%ld", &a);
povrsina = kvadrat(a);
printf("Povrsina kvadrata je %ld.\n", povrsina);
return 0;
}
/* Funkcija za izracunavanje povrsine. */
long kvadrat(long stranica)
{
return stranica * stranica;
}
Unesite duzinu stranice kvadrata 5
Povrsina kvadrata je 25.
Gledajući kod, vidjećete tri novine. Prva je:
long kvadrat(long stranica);
Ova naredba se zove prototip funkcije. On informiše kompajler o modelu korisničke
funkcije, koja će biti upotrebljena, i sadrži informacije o tipu varijable, koja
će biti vraćena, o imenu korisničke funkcije i koje argumente ista koristi, što
podrazumjeva ime i tip varijable (imena i tipove varijabli). Naš prototip
informiše da će biti vraćena varijabla dugog cijelobrojnog tipa (long), da se
korisnička funkcija zove kvadrat i da ima samo jedan argument stranica, takodje
dugog cijelobrojnog tipa (long).
Sledeća novina je:
povrsina = kvadrat(a);
Dio koda desno od zagrade preusmjerava izvršavanje aplikacije na funkciju, tj.
poziva funkciju. Prethodno je u toku izvršavanja pridružena vrijednost varijabli
a. Pošto je varijabla a unutar zagrada, ona je argument. Pri prenošenju
izvršavanja prenosi se samo vrijednost argumenta.
Treća novina je ustvari korisnička funkcija i na nju se prenosi izvršavanje.
long kvadrat(long stranica)
{
return stranica * stranica;
}
Ona zahtjeva argument, preuzima ga, tj. uzima vrijednost od varijable a i
pridružuje je svojoj varijabli stranica. Sada cijeli proces ulazi u tijelo
korisničke funkcije. Tijelo funkcije je ustvari blok. Prva i jedina naredba je:
return stranica * stranica;
Vrijednost varijable stranica se množi sama sa sobom. Predhodna naredba postaje:
return 25;
Funkcija sada vraća vrijednost 25 i dio koda koji je pozvao funkciju postaje
broj koji iznosi onoliko koliko je vraćeno, tj. 25. Naredba sada poprima sledeći
oblik:
povrsina = 25;
što je obično pridruživanje vrijednosti varijabli.
Kada se sve sagleda funkcija je zamjena za jedan cio postupak. Prethodni primjer
je mogao normalno da radi i da smo napisali:
#include <stdio.h>
long a, povrsina;
main()
{
printf("Unesite duzinu stranice kvadrata ");
scanf("%d", &a);
povrsina = a * a;
printf("Povrsina kvadrata je %d.\n", povrsina);
return 0;
}
Unesite duzinu stranice kvadrata 5
Povrsina kvadrata je 25.
Upotreba funkcija
Neke aplikacije su takve da zahtjevaju da se jedna cijela radnja u toku samo jednog
izvršavanja ponovi nekoliko puta (ovdje ne mislim na petlje). Takve radnje
nerijetko imaju nekoliko desetina redova, pa i više. Odjednom vi odlučite da
promjenite nešto. To trebate da uradite onoliko puta koliko se kod istog zadatka
ponavlja. U toku prepravljanja vam se desi da nešto preskočite i ne prepravite,
što prouzrokuje ne možete naći grešku. Zamislite takav haos. Tu u pomoć priskaču
funkcije. Na jednom mjestu u kodu napišete funkciju, sa svojim varijablama, a
na ostala mjesta svavite naredbe za pozivanje iste. Ako trebate nešto promjeniti,
to ćete uraditi samo na jednom mjestu i za mnogo manje vremena.
Već smo pomenuli da je C strukturalan jezik. Bit njegove strukture su funkcije.
Sve se svodi na njih, na njihovo definisanje i pozivanje. Svaka radnja je neka
funkcija.
Zaglavlje
Korisnička funkcija se sastoji iz zaglavlja i tijela (bloka) i ima sledeći oblik:
tip_povratne_vrijednosti ime(tip1 var1, tip2 var2...)
{
/* Naredba(e). */
}
Poslije zaglavlja nikad ne dolazi tačka-zarez.
Zaglavlje funkcije se sastoji iz tipa povratne vrijednosti, imena funkcije i
argumenata, tipovi i imena varijabli.
Funkcija može da vraća vrijednost, a ne mora. Tip povratne vrijednosti može biti
bilokoji tip varijabli (int, char, long, double, unsigned short...). Kada ne
vraća onda je se stavlja void (eng. prazan).
void ispis(void);
Za imena funkcija važe ista pravila kao i za varijable. Preporučuje se da imena
budu opisna, da govore šta funkcija radi. Imena funkcija i imena varijabli se
ne smiju poklapati.
long kvadrat;
long kvadrat(long stranica);
Funkcija obično prima argumente, ali ponekad ne.
void ispis(void);
Određivanje argumenata je kao definisanje varijabli. Mora biti tip i ime varijable,
odnosno tipovi i imena odvojeni zarezima.
long povrsina(int a, int b)
long zapremina(int a, int b, int c)
double polovina (double djeljenik)
Tijelo
Tijelo funkcije je ustvari blok. Za razliku od if/else naredbe i petlji, koje
su mogle stajati bez bloka, funkcija ne može.
long kvadrat(long stranica)
return stranica * stranica; /* Nikako ne valja! */
Naredba return je zadužena za vraćanje vrijednosti funkciji koja je pozvala.
Ako funkcija ne vraća vrijednost, onda je naredba return nepotrebna, a funkcija
se poziva ovako:
ime_funkcije(argumenti)
A ako nema argumenata:
ime_funkcije()
Sledeći primjer ima funkciju koja ne prima argumente, ne vraća vrijednost i poziva
se više puta.
#include <stdio.h>
int broj;
void ispis(void);
main()
{
printf("\n===========================\n\n");
printf("Ovo je igra pogadjanja broja!\n");
ispis();
for(; broj != 13;)
{
printf("\nNije tacno! :ppp\n");
ispis();
}
printf("\nCestitam, pogodili ste! :(\n");
return 0;
}
void ispis(void)
{
printf("\n===========================\n\n");
printf("Ubodi broj od 0 do 20!\n");
printf("Sigurno neces pogoditi! :p\n\n");
scanf("%d", &broj);
}
Kompajlirajte, pa se igrajte.
Prototip
Prototip je ustvari zaglavlje funkcije sa tačka-zarezom na kraju.
tip_povratne_vrijednosti ime(tip1 var1, tip2 var2...);
Prototipove je najbolje zajedno staviti neposredno prije početka main funkcije.
Main funkcija
O main funkciji je već bilo riječi. Ona je glavna funkcija u kojoj se nalaze
sve naredbe. Ima dosta karakteristika sličnih korisničkim funkcijama. Ima tijelo
i vraća vrijednost. Pošto vraća broj i ne prima argumente, onde se može pisati:
int main(void)
ali se ne mora. Napominjem da main ipak može da prima argumente, ali to je domen
naprednog C-a. Ime joj se ne može mijenjati, kao ugrađenim funkcijama.
Preporuka: Ovdje možete pronaći pripremljene
zadatke za vježbanje funkcija.
Zadaci IV nivo - Zadaci V nivo
|