FUNKCIJE U C/C++ PROGRAMSKOM JEZIKU
Programi u programskom jeziku c/c++ mogu da imaju veliki broj naredbi i ako bi one bile napisane jedna za drugom u jednom fajlu, programeri bi se teško snalazili u takvom kodu, tj. bilo bi ga teško održavati. S druge strane često se dešava da se jedan algoritam, deo naredbi koje rešavaju jedan mali ili veliki problem unutar aplikacije ponavlja više puta. Može se zaključiti da bi bilo mnogo bolje taj skup naredbi(deo programa) izdvojiti kao jednu celinu samo jednom kao podprogram ili funkcija i onda se po potrebi ta funkcija pozivala svaki put kada je potrebno. Potprogrami su mehanizam razbijanja složenih problema na potprobleme.
Programski jezik C poznaje samo jednu vrstu potprograma koje se nazivaju funkcijama.
Primere iz funkcija možete naći na sledećoj web strani: Funkcije u C/C++ jeziku -primeri
Programski jezik C poznaje samo jednu vrstu potprograma koje se nazivaju funkcijama.
Primere iz funkcija možete naći na sledećoj web strani: Funkcije u C/C++ jeziku -primeri
Treba razlikovati dve stvari vezano za funkcije:
- Definisanje funkcija
- Pozivanje funkcija
Definisanje funkcija
Defisanje znači da mi te naredbe koje čine funkciju i koje treba da odrede specifičan zadatak u nekoj aplikaciji(programu) napišemo na nekom mestu u programu, da ih na neki način grupišemo, damo neki naziv i odredimo koji podaci treba da se dostave funkciji kao ulazni parametri i kakav podatak funkcija vraća nazad kao povratnu vrednost. Dakle definisanje funkcije treba da obuhvati:
- Naredbe funkcije
- zaglavlje funkcije
- telo funkcije
U zaglavlju metode se nalaze dve reči.
Prva, u ovom slučaju int, predstavlja tip podatka povratne vrednosti. Ova metoda koja računa veći broj između dva cela broja, vraća taj broj čiji je tip int. To je tip povratne vrednosti.
Druga, predstavlja naziv metode, koji programer bira sam i koji treba da sugeriše svrhu metode.
Telo metode se predstavlja vitičastim zagradama. U telu se nalaze naredbe funkcije.
U zaglavlju funkcije(metode) se, posle naziva, unutar običnih zagrada pišu parametri(argumenti) funkcije. To su podaci koje treba dostaviti funkciji da bi ona mogla da završi postavljen zadatak. U prethodnom primeru zadatak koji funkcija treba da izvrši je određivanje maksimuma između dva cela broja, a podaci koje funkciji preko parametra treba dostaviti su ta dva broja, u ovom slučaju označena kao a i b. Na sledećoj slici je prikazana detaljnije ova metoda.
Prva, u ovom slučaju int, predstavlja tip podatka povratne vrednosti. Ova metoda koja računa veći broj između dva cela broja, vraća taj broj čiji je tip int. To je tip povratne vrednosti.
Druga, predstavlja naziv metode, koji programer bira sam i koji treba da sugeriše svrhu metode.
Telo metode se predstavlja vitičastim zagradama. U telu se nalaze naredbe funkcije.
U zaglavlju funkcije(metode) se, posle naziva, unutar običnih zagrada pišu parametri(argumenti) funkcije. To su podaci koje treba dostaviti funkciji da bi ona mogla da završi postavljen zadatak. U prethodnom primeru zadatak koji funkcija treba da izvrši je određivanje maksimuma između dva cela broja, a podaci koje funkciji preko parametra treba dostaviti su ta dva broja, u ovom slučaju označena kao a i b. Na sledećoj slici je prikazana detaljnije ova metoda.
Parametra funkcije može biti nijedan jedan ili više. Ako funkciji nisu potrebni ulazni podaci onda će zagrada u zaglavlju funkcije ostati prazna.
Ukoliko metoda ne vraća vrednost, neće imati u telu naredbu return podatak, ali može imati samo return. kao tip povratne vrednosti se u tom slučaju piše reč void.
U programu mora postojati najmanje jedna funkcija i to je funkcija main(glavna). Primer main funkcije iz prethodnog primera prikazana je na slici ispod.
Ukoliko metoda ne vraća vrednost, neće imati u telu naredbu return podatak, ali može imati samo return. kao tip povratne vrednosti se u tom slučaju piše reč void.
U programu mora postojati najmanje jedna funkcija i to je funkcija main(glavna). Primer main funkcije iz prethodnog primera prikazana je na slici ispod.
Unutar glavne funkcije prvo se učitaju dva cela broja, a zatim se određuje maksimum. Naredbe kojima se određuje maksimum nalaze se izdvojene kao posebna metoda pod nazivom max(vidi sliku 2). U main funkciji pomoću naredbe cout treba ispisati ovu vrednost. Na mestu gde se očekuje podatak za ispisivanje nalazi se poziv funkcije max. Njoj se kao parametri prosleđuju podaci A i B, zapravo kopije ovih vrednosti. Funkcija max određuje veću vrednost i vraća je nazad kao povratnu vrednost. Ova povrtna vrednost štampaće se zajedno sa tekstom "Veći broj je" na izlazu. Posle pokretanja i zadavanja vrednosti npr 5 i 10 za A i B, na izlazu će se prikazati:
Pozivanje funkcija
Jedina funkcija koja se automatski pozove, prilikom startovanja aplikacije je main funkcija. Naredbe u main se izvršavaju redom odozdo na dole i kada se završi poslednja naredba program se završava. Ako u projektu imamo definisano još funkcija one se neće izvršiti same od sebe. Da bi program iz main nastavio izvršenje u nekoj drugoj funkciji, jedna od naredbi u main mora biti poziv neke druge.
U primeru na slici 3 poziva se funkcija max:
cout<<"Veći broj je "<<max(A,B);
Deklaracija poziva metode, u opštem slučaju izgleda:
naziv_funkcije(parametar1,parametar2,....);
Parametri koji se prosleđuju funkciji, se kopiraju redom u parametre definisane u definisanoj metodi(vidi sliku 2). U definiciji metode se ispred naziva parametra stavlja tip podatka.
int max(int a, int b)
Ovde se zapravo rezerviše nova memorija označena sa a i b koja prima kopije vrednosti parametara iz poziva funkcije:
max(A , B);
U pozivu se ispred parametra ne stavlja tip podatka.
Kopiranje parametra je prikazano na slici 5.
U primeru na slici 3 poziva se funkcija max:
cout<<"Veći broj je "<<max(A,B);
Deklaracija poziva metode, u opštem slučaju izgleda:
naziv_funkcije(parametar1,parametar2,....);
Parametri koji se prosleđuju funkciji, se kopiraju redom u parametre definisane u definisanoj metodi(vidi sliku 2). U definiciji metode se ispred naziva parametra stavlja tip podatka.
int max(int a, int b)
Ovde se zapravo rezerviše nova memorija označena sa a i b koja prima kopije vrednosti parametara iz poziva funkcije:
max(A , B);
U pozivu se ispred parametra ne stavlja tip podatka.
Kopiranje parametra je prikazano na slici 5.
Primer: Odeđivanje maksimuma dva broja-rešenje u jeziku c
Zadatak: Napraviti funkciju koja određuje maksimum dva cela broja koji su prosleđeni kao parametri funkcije.
Učitati dva cela broja i odrediti njihov maksimum koristeći prethodno definisanu funkciju.
Učitati dva cela broja i odrediti njihov maksimum koristeći prethodno definisanu funkciju.
Prosleđivanje parametra po vrednosti i po referenci
U prethodnom primeru prikazano je prosleđivanje parametra po vrednosti. Pošto parametri u drugoj funkciji predstavljaju novu memoriju koja samo iz memorije parametara glavne funkcije dobijaju kopije vrednosti, svaka eventualna promena vrednosti unutar druge funkcije neće se odraziti na podatke definisane u prvoj.
Ovo možemo ilustrovati kroz sledeći primer:
Ovo možemo ilustrovati kroz sledeći primer:
Primer 2: Zamena vrednosti podatku
Zadati celobrojnom podatku vrednost 20, a zatim napraviti metodu koja ovu vrednost menja na 100.
Napravimo funkciju koja će promeniti vrednost poslatom podatku:
Napravimo funkciju koja će promeniti vrednost poslatom podatku:
Kad pokrenemo ovaj program na izlazu dobijamo
Vidimo da u glavnoj funkciji ova vrednost nije promenjena i ako na prvi pogled izgleda da je u kodu sve ispravno.
Ova vrednost se jeste promenila unutar funkcije promeni_vr, ali se ova promena ne odražava na podatke u glavnoj funkciji.
Da bi ovo bilo ispravno, parametri se moraju preneti po referenci.
Ova vrednost se jeste promenila unutar funkcije promeni_vr, ali se ova promena ne odražava na podatke u glavnoj funkciji.
Da bi ovo bilo ispravno, parametri se moraju preneti po referenci.
Prenos parametara funkcije po referenci(Samo C++)
Za razliku od prenosa po vrednosti, kod prenošenja po referenci, ne pravi se nova memorija za parametre u drugoj funkciji "promeni_ref", nego su ti parametri zapravo reference(drugi naziv) za istu memoriju koju zauzimaju podaci parametri u glavnoj funkciji. To će prouzrokovati da se promene vrednosti parametara u drugoj funkciji odrazi i na prvu.
Izmenimo prethodni primer zamenom funkcije koja sada prosleđuje parametre po referenci. Parametri sada zapravo nisu podaci nego pokazivači na te podatke.
Više o pokazivačima vidi u lekciji Pokazivači u C/C++.
Prethodni primer sada izgleda kao na slici 9:
Izmenimo prethodni primer zamenom funkcije koja sada prosleđuje parametre po referenci. Parametri sada zapravo nisu podaci nego pokazivači na te podatke.
Više o pokazivačima vidi u lekciji Pokazivači u C/C++.
Prethodni primer sada izgleda kao na slici 9:
Parametri sada nisu podaci nego reference podataka. Prethodni primer sada izgleda kao na slici 9
Posle pokretanja:
Prenos parametara funkcije po pokazivaču
Umesto referenci, mogu se koristiti i pokazivači na podatke. Efekat je sličan prosleđivanju po referenci, što znači da će se promene nastale unutar te funkcije nad podacima, kojima se pristupa preko pokazivača, odraziti na originalne podatke definisane u glavnoj funkciji. To je zbog toga što pokazivači pokazuju originalni podatak, a ne na neki novi, koji samo ima istu vrednost kao originalni.
Više o pokazivačima vidi u lekciji Pokazivači u jeziku C.
Prethodni primer sada izgleda kao na slici 10:
Više o pokazivačima vidi u lekciji Pokazivači u jeziku C.
Prethodni primer sada izgleda kao na slici 10:
Slika 10.1 prikazuje varijantu zadatka u C programskom jeziku:
Isti zadatak u programskom jeziku C++ je prikazan na slici 11.2
Posle pokretanja posle izmene na izlazu dobijamo:
Deklaracija funkcija
Pod deklaracijom podatka ili funkcije u programiranju naziva se određivanje identifikatora i opisivanje osobina podataka ili funkcije, bez dodeljivanja memorijskog prostora za smeštanje podataka ili funkcije. U slučaju funkcije određuje se tip vrednosti funkcije i broj i tipovi argumenata. U opštem slučaju deklaracija izgleda:
oznaka_tipa naziv_funkcije(niz_argumenata);
Deklaracija funkcije još se naziva i prototip funkcije, kao i potpis funkcije.
Ako se funkcija nalazi u fajlu iznad main funkcije, kao u prethodnim primerima onda nije potrebno posebno navesti deklaraciju. U suprotnom deklaracije je potrebno napisati iznad main funkcije. Npr. prototip funkcije max bi bio:
int max(int a,int b); ili samo
int max(int ,int);
Prototip funkcije promeni_ref izgleda:
void promeni_ref(int * );
oznaka_tipa naziv_funkcije(niz_argumenata);
Deklaracija funkcije još se naziva i prototip funkcije, kao i potpis funkcije.
Ako se funkcija nalazi u fajlu iznad main funkcije, kao u prethodnim primerima onda nije potrebno posebno navesti deklaraciju. U suprotnom deklaracije je potrebno napisati iznad main funkcije. Npr. prototip funkcije max bi bio:
int max(int a,int b); ili samo
int max(int ,int);
Prototip funkcije promeni_ref izgleda:
void promeni_ref(int * );