среда, 24 априла, 2024
Како да...?

Увод у програмски језик C (5. део)

Аутор: Вељко Симић

У прошлом броју, причали смо о низовима и матрицама, и сада имамо једно питање: Шта радити уколико желимо да испишемо пет различитих низова? Код би изгледао овако:

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

Тај код бисмо искуцали пет пута. Мана овога је то што код постаје знатно непрегледнији. Ако бисмо хтели на пет места у коду да испишемо пет низова, имали бисмо 50 линија кода и прилично би било лако да се изгубимо у том коду. Ово је један прост пример где бисмо могли да применимо функције. Функција која исписује низ изгледала би овако:

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

Објаснимо сада ред по ред ове функције: void ispisiNiz(int niz], int n) – Ово је заглавље функције, void означава тип функције. То је тип који враћа функција. Питате се сада који је то тип и зашто га нисмо споменули када смо причали о типовима података. То је непостојећи тип, дакле функција не враћа никакву вредност. После типа функције следи њено име, па заграда у којој се наводе аргументи функције. Функција може, а и не мора да има аргументе. Аргументе функције наводимо тако што наведемо прво тип аргумента, па име. После тога, у витичастим заградама се налази тело функције. Ту се налази све што функција треба да одради. Последња наредба која се извршава јесте повратна вредност функције нпр. return 0. Када напишемо функцију, све што је потребно јесте да је позовемо у функцији main и проследимо јој параметре и она ће бити извршена.

Разлика између параметра и аргумента. Ова два термина се веома често мешају. Параметри функције су оне вредности које се прослеђују при позиву функције, док су аргументи функције они који се наводе при дефиницији функције, нпр. када смо малопре навели за испис низа „niz“ и „n“, то су били аргументи те функције, док су „“%d”,nizi]“ параметри функције printf.

Можда нисте приметили, али до сада смо и писали и користили функције. Функцију main сваки програм мора да има. То је главна функција од које почиње рад нашег програма. На крају те функције, писали смо return 0;. Функција main враћа вредност 0 уколико је све добро извршено. Користили смо функције printf и scanf. Оне се налазе у стандардној библиотеци stdio.h у којој се налазе улазно/излазне функције.

Рекурзивне функције

Рекурзивне функције су оне функције које у свом телу позивају саму себе. Рекурзивне функције се састоје из два дела: тривијалног случаја и рекурзивног позива. Појаснићемо на примеру:

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

Тривијалан случај ове функције је провера да ли је n (тј. број за који израчунавамо факторијел) мањи од један, или је једнак један. Тада се рекурзивна функција завршава. Рекурзиван позив је у else грани. Да бисте лакше схватили како се рекурзивна функција извршава, функцију ћемо изменити да нам испише када улази, а када излази из функције. Тако да ћемо else грану написати другачије:

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;
	}
}

Када бисмо позвали ову функцију у функцији main са параметром 4 и покренули програм као излаз, добили бисмо ово:

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

Као што видите, при сваком позиву покрене се нова функција. Као да умотавамо и одмотавамо папир. У општем случају, када унутар једне функције позивамо другу, прва наставља да се извршава тек када се заврши друга функција.

Наредни део овог серијала можете прочитати овде.

Претходни део овог серијала можете прочитати овде.