Uvod u programski jezik C (5. deo)

Autor: Veljko Simić

U prošlom broju, pričali smo o nizovima i matricama, i sada imamo jedno pitanje: Šta raditi ukoliko želimo da ispišemo pet različitih nizova? Kod bi izgledao ovako:

for (int i=0; i<n; i++)
    printf ("%d ",niz[i]);

Taj kod bismo iskucali pet puta. Mana ovoga je to što kod postaje znatno nepregledniji. Ako bismo hteli na pet mesta u kodu da ispišemo pet nizova, imali bismo 50 linija koda i prilično bi bilo lako da se izgubimo u tom kodu. Ovo je jedan prost primer gde bismo mogli da primenimo funkcije. Funkcija koja ispisuje niz izgledala bi ovako:

void ispisiNiz (int niz[], int n){
    for (int i=0; i<n; i++)
        printf ("%d ",niz[i]);
}

Objasnimo sada red po red ove funkcije: void ispisiNiz(int niz], int n) – Ovo je zaglavlje funkcije, void označava tip funkcije. To je tip koji vraća funkcija. Pitate se sada koji je to tip i zašto ga nismo spomenuli kada smo pričali o tipovima podataka. To je nepostojeći tip, dakle funkcija ne vraća nikakvu vrednost. Posle tipa funkcije sledi njeno ime, pa zagrada u kojoj se navode argumenti funkcije. Funkcija može, a i ne mora da ima argumente. Argumente funkcije navodimo tako što navedemo prvo tip argumenta, pa ime. Posle toga, u vitičastim zagradama se nalazi telo funkcije. Tu se nalazi sve što funkcija treba da odradi. Poslednja naredba koja se izvršava jeste povratna vrednost funkcije npr. return 0. Kada napišemo funkciju, sve što je potrebno jeste da je pozovemo u funkciji main i prosledimo joj parametre i ona će biti izvršena.

Razlika između parametra i argumenta. Ova dva termina se veoma često mešaju. Parametri funkcije su one vrednosti koje se prosleđuju pri pozivu funkcije, dok su argumenti funkcije oni koji se navode pri definiciji funkcije, npr. kada smo malopre naveli za ispis niza „niz“ i „n“, to su bili argumenti te funkcije, dok su „“%d”,nizi]“ parametri funkcije printf.

Možda niste primetili, ali do sada smo i pisali i koristili funkcije. Funkciju main svaki program mora da ima. To je glavna funkcija od koje počinje rad našeg programa. Na kraju te funkcije, pisali smo return 0;. Funkcija main vraća vrednost 0 ukoliko je sve dobro izvršeno. Koristili smo funkcije printf i scanf. One se nalaze u standardnoj biblioteci stdio.h u kojoj se nalaze ulazno/izlazne funkcije.

Rekurzivne funkcije

Rekurzivne funkcije su one funkcije koje u svom telu pozivaju samu sebe. Rekurzivne funkcije se sastoje iz dva dela: trivijalnog slučaja i rekurzivnog poziva. Pojasnićemo na primeru:

int fakt (int n){
    if (n<=1)
        return 1;
    else
        return n*fakt(n-1);
}

Trivijalan slučaj ove funkcije je provera da li je n (tj. broj za koji izračunavamo faktorijel) manji od jedan, ili je jednak jedan. Tada se rekurzivna funkcija završava. Rekurzivan poziv je u else grani. Da biste lakše shvatili kako se rekurzivna funkcija izvršava, funkciju ćemo izmeniti da nam ispiše kada ulazi, a kada izlazi iz funkcije. Tako da ćemo else granu napisati drugačije:

int fakt(int n){
        if (n<=1){
                printf ("Izvrsava se trivijalan slucaj");
                return 1;
        }else{
    		printf ("Ulaz u %d funkciju \n",n);
   		int a =fakt(n-1);
    		printf ("Izlaz iz %d funkcije \n",n);
   		return a*n;
	}
}

Kada bismo pozvali ovu funkciju u funkciji main sa parametrom 4 i pokrenuli program kao izlaz, dobili bismo ovo:

Ulaz u 4 funkciju
Ulaz u 3 funkciju
Ulaz u 2 funkciju
Izvrsava se trivijalan slucaj
Izlaz iz 2 funkcije
Izlaz iz 3 funkcije
Izlaz iz 4 funkcije

Kao što vidite, pri svakom pozivu pokrene se nova funkcija. Kao da umotavamo i odmotavamo papir. U opštem slučaju, kada unutar jedne funkcije pozivamo drugu, prva nastavlja da se izvršava tek kada se završi druga funkcija.

Naredni deo ovog serijala možete pročitati ovde.

Prethodni deo ovog serijala možete pročitati ovde.

Ostavite odgovor

Vaša adresa e-pošte neće biti objavljena. Neophodna polja su označena *

Time limit is exhausted. Please reload CAPTCHA.