Friday, December 16, 2016

Funkcije

Funkcije u programiranju su liče na funkcije u matematici (preslikavaju date vrednosti u rezultat) ali su dosta opštije. Funkcije u programiranju predstavljaju programske celine koje obavljaju odredjeni deo posla. Ideja je da se jednom opiše nešto što je često potrebno (npr. izračunavanje faktorijela, izračunavanje površine trougla, kvadrata, kruga, ...) pa da se koristi kada god zatreba. Dakle imamo dva važna mesta:

  • Definicija funkcije (opis šta treba da uradi)
  • Poziv funkcije (korišćenje)
DEFINICIJA funkcije se sastoji od naslova i tela

Naslov funkcije opisuje ime funkcije, tipove i imena podataka koje preuzima (ulazni parametri) i tip podatka koji vraća (rezultat).

Primer: 
long faktorijel(int n)
je naslov funkcije koja preuzima jedan ceo broj (n), zove se faktorijel i vraća ceo broj kao rezultat.

Telo funkcije opisuje komande koje treba izvršiti nad ulaznim podacima da bi se dobio rezultat. Rezultat se vraća komandom
return izraz;
gde je vrednost izraza rešenje (izlazni podatak funkcije).

Dozvoljeno je i da funkcija nema nikakav rezultat. U tom slučaju tip rezultata je void

Primer:
void ispisi(int x, float y)
Ova funkcija preuzima dva podataka - ceo broj x i decimalni broj y i ne vraća nikakav rezultat. Naziv funkcije je ispisi.

POZIV funkcije: funkcija se poziva navodjenjem imena i promenljivih ili izraza čije se vrednosti koriste.

Primeri: 
a = faktorijel(7);
Poziva funkciju sa imenom faktorijel i argumentom 7 (vrednost za n). Rezultat funkcije se upisuje u promenljivu a.

ispisi(243, -87.51);
Poziva funkciju sa imenom ispisi i argumentima 243 (vrednost za x) i -87.51 (vrednost za y). Funkcija nema rezultat.

U telu funkcije dozovoljene su sve komande koje su inače dozvoljene u programu ali ima i nekih novih mogućnosti. Funkcija može pozivati samu sebe (sa izmenjenim ulaznim parametrima) i to se u programiranju zove rekurzija a takva funkcija - rekurzivna funkcija.

QUICK sort je primer rekurzivne funkcije. 

Treba imati na umu da rekurzivne funkcije traže više memorijskog prostora računara (svaki rekurzivni poziv zahteva od računara čuvanje trenutnih vrednosti promenljivih i vraćanje tih vrednosti po završetku rekurzivnog poziva) pa ih ne možemo uvek koristiti na takmičenju - zbog ograničenja.

PRIMER 
Napisati funkciju koja za dati prirodan broj određuje zbir cifara.
a) nerekurzivno (iterativno)
b) rekurzivno
Rešenje
a) iterativno
int zbirCifara(int broj)
{
    int zbir=0;
    while(broj!=0)
    {
        zbir += (broj%10);
        broj /= 10;
    }
    return zbir;
}

b) rekurzivno
int zbirCifara(int broj)
{
    if(broj==0)
        return 0;
    else
        return broj%10 + zbirCifara(broj/10);

}

Korišćenje (poziv) funkcije
int main()
{
    int broj, zbir;
    scanf("%d", &broj);
    zbir = zbirCifara(broj);
    printf("Zbir cifara broja %d je %d",broj, zbir);
    return 0;
}

No comments:

Post a Comment