Uvod u C   Autor: Milan Miščević
 
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