-
FUNKCIJE
�Složeniji problemi se rešavaju dekompozicijomu veći broj manjih
problema. Potprogramipredstavljaju mehanizamkoji direktno
podržavafunkcionalnu dekompoziciju kao jednu odosnovnih metoda
strukturnog programiranja.
�Definicija potprograma:
�Potprogrami su sastavni segmentiprogramskog koda koji se
pozivaju radiobavljanja konkretno specificiranog zadatka.
-
FUNKCIJE
�Potprogrami u razvoju programa se najčešće koriste iz tri
razloga:
1.Segmenti programa se mogu više puta pojavljivati uokviru istog
ili u okviru različitih programa.
2. Programi predstavljaju logičke jedinicedekomponovanih
programa
3. Potprogrami predstavljaju i fizičku jedinicu
programskedekompozicije, koji se posmatra kao jedinični kod
upostupku prevođenja. Programski jezik C koristi module
-
FUNKCIJE
�Potprogrami
�procesna apstrakcija
�U programskomjeziku C sve su samo funkcije(nema procedura),
�obavezna bar jedna funkcija main()
� • funkcija - n-arni operator
�najvišeg prioriteta
� • vraća rezultat (preko imena) +
�bočni efekti, oboje opciono
-
ZAŠTO SE KORISTE FUNCIJE
�Višestruko korišćenje (u istom ilirazličitim programima)
�Kod kraći, čitljiviji, lakši za testiranje idebagovanje)
�Korišćenje i bez programiranja
�Modularnost – dobar, ponekad jedininačin rešavanja zadatih
problemaproblema
-
ZAŠTO SE KORISTE FUNCIJE
�Funkcija je jedna od osnovnih elemenataprograma pisanog u
programkomjeziku C
�Funkcija je potprogram unutar glavnogprograma koja obavlja
specifičan zadatak,
�Vec smo radili funkcije printf(), scanf(), main()
�Naravno u okviru predmeta pisaćete i sami svojefunkcije
�Funkcije poseduju argumente (promenljive) ikao povratnu
vrednost imaju argument.
-
ZAŠTO SE KORISTE FUNCIJE
�Možete je napisati jednoma pozivati više puta
�Moguće je kreirati biblioteke funkcija.
� Jednostavnije rešavanje programskog zadatka
� Jednostavnije pisanje i održavanje programa
�Veći nivo abstrakcije i razumevanja samogprograma
�Često se kaže da programbez funkcija nijekvalitetan program
-
FUNKCIJE
� U većini programskih jezika se jasno razlikujupotprogrami koji
vraćaju vrednost (funkcije), od onihkoji to ne čine (procedure).
Programski jezik C poznajesamo funkcije kao tip potprograma, ali se
u okviruovakvog pristupa procedure formalno zamenjujufunkcijama
koje ne vraćaju nikakvu vrednost.
� Sa pojmomfunkcija srećemo se u matematici gde se naosnovu
argumenta funkcije (nezavisna promenljiva x)dobija vrednost
rezultata funkcije (zavisna promenljivay).
-
FUNKCIJE
� Definicija funkcije:
�
� Funkcije su potprogrami koji na osnovu izvesnog broja
argumenata daju jedan rezultat koji se naziva vrednost
funkcije.
�
� Osobine funkcija:
�
� Vrednost funkcije može da se koristi ugrađivanjem poziva
funkcije u izraze.
� Poziv funkcije se, u stvari, smatra operatorom kao i svi
ostali operatori.
� Funkcije kontrolišu pristup do važnih podataka i čuvaju ih od
neovlašćenih promena.
� Funkcija skriva detalje načina obavljanja određenog zadatka.
Ovaj princip se zasniva na ideji da onoga ko poziva funkciju ne
mora interesovati kako određena funkcija rešava odabrani problem
koji je rezultat funkcionalne dekompozicije.
-
DEFINISANJE FUNKCIJE
�
�
�
�Definisanje funkcije�Funkcija se definiše naredbom za
definisanje funkcije:
�
� tip naziv_funkcije(lista _argumenata)� {� telo_ funkcije�
}�
-
DEFINISANJE FUNKCIJE
� tip - predstavlja osnovni tip vrednosti funkcije (svi
standardni prosti tipovi). Vrednost funkcije može da bude samo
jedan podatak.
� naziv_funkcije - sastoji se od indentifikatora funkcije, koji
je istovetan sa bilo kojom vrstom indentifikatora.
� lista_argumenata - predstavljaju argumente funkcije pomoću
kojih se vrši unošenje početnih vrednosti funkcije. Vrednost
funkcije se izračunava na osnovu tih početnih podataka. Argumenti
se u listi argumenata razdvajaju sa zarezom.
� void – funkcija ne vraća vrednost
-
FUNKCIJE
� telo_funkcije - predstavlja sadržaj funkcije koja se definiše.
Ona je po formi blok (nalazi se između vitičastih zagrada), što
znači da može da sadrži deklarativne i izvršne naredbe. Ako
funkcija kao rezultat svog rada vraća neku vrednost u okviru tela
funkcije mora se nalaziti naredba return.
� Opšti oblik naredbe return je:
� return izraz;
� ili return;
-
FUNKCIJE� Izraz mora da se po tipu slaže sa predviđenim tipom
vrednosti
funkcije.Naredba return se koristi kada je potrebno izvršiti
povratak u glavni program (u okviru funkcije na više mesta se može
nalaziti naredba return).
� telo funkcije
� • blok: deklaracije + naredbe
� (oboje opciono)
� • promenljive lokalne za funkciju
� • oblast važenja -
� od mesta definicije do kraja funkcije
� • inicijalizacija –
� izrazi koji, osim konstanti,mogu da sadrže i formalne
argumente
FUNKCIJE
-
FUNKCIJE
� Vrednost funkcije formira se ("vraća se") naredbom
� return izraz
� efekat naredbe returnjeste formiranje vrednostii završetak
funkcije
� Funkcije koje imaju vrednost mogu imati proizvoljan broj
naredbi return, a najmanje jednu
-
FUNKCIJE
� Funkcija koja ima vrednost,a kada to ima smisla,može biti
pozvana i prostom naredbom, umesto uključivanja u izraz
� takva funkcija je scanf koja, inače, ima vrednost jednaku
broju uspešno učitanih promenljivih; kada je pozovemo prostom
naredbom
� scanf("%d%d",&a,&b);
� Vrednost funkcije(jednaka 2 ako su oba učitavanja uspešna) se
ne korist
-
FUNKCIJE
� Primer 1:
� Definisati C funkciju hipotenuza koja na osnovu kateta a i
bizračunava hipotenuzu pravouglog trougla.
� prvi način:
�
� float hipotenuza(float a, float b)
� {
� return sqrt(a*a+b*b);
� }
-
FUNKCIJE
� drugi način:
�
� float hipotenuza(float a, float b)
� {
� float c; /* Deklarativna naredba */
�
� sqrt(a*a+b*b);
�
� return c;
� }
�
-
FUNKCIJE
�Naredbe funkcija
�Naredbe deklaracije – na početku funkcije
� Izvršne naredbe – posle naredbi deklaracije
�Naredbe povratka – obavezno bar jedna akofunkcija vraća
vrednost
-
Pozivanje Funkcija
� funkcija(izraz1, izraz2, izraz3,...,izrazn)
�
� funkcija - označava funkciju čije se izvršavanje traži. Ona je
u većini slučajeva indentifikator funkcije koja se poziva, ali može
da bude i adresni izraz čija je vrednost adresa željene
funkcije.
�
� izrazi - predstavljaju stvarne argumente funkcije čije
vrednosti služe za inicijalizaciju formalnih argumenata funkcije
pre obrade tela funkcije. Stvarni argumenti mogu biti: promenljive,
konstante ili izrazi i moraju imati u potpunosti definisanu
vrednost u momentu prosleđivanja (predaje) funkciji Izrazi koji
predstavljaju stvarne argumente funkcije izračunavaju se po
proizvoljnom redosledu, neposredno pre pozivanja funkcije.
-
Pozivanje Funkcija
� Izraz za pozivanje funkcije može se koristiti kao operand
usloženijem izrazu, tada se vrednost funkcije koristi u
izračunavanjutog izraza. Kako je operator poziva funkcije ()
visokog prioriteta, toobezbeđuje da se izračunavanje vrednosti
funkcije (pozivanjefunkcije) izvrši pre bilo kog susednog operatora
u izrazu.
� Ukoliko funkcija nema svoju vrednost (tip void) može da se
koristisamo kao drugi operand operatora zarez ili kao drugi ili
trećioperand trinarnog operatora. Funkcija koja nema svoju
vrednostnajčešće se koristi kao operand izraza u prostoj naredbi
fun(...)
-
Pozivanje Funkcija
ime( lista stvarnih argumenata);
Poziv funkcije je operator u C jeziku
Pojedini argumenti odvajaju se zarezom“,”.
�Ako funkcija nema argumenata, piše se samo ( )� .
-
Pozivanje Funkcija
� Pogledati zadatke
� 54 i 55 koji su dati u pdf
-
Gde se pišu FUNKCIJE unutarprograma
� Nije pravilo ali jeste, mesto nije toliko važno,
� Pravilo je da main() bude prva funkcija u programskom kodu
(ili poslednja)
� Funkcije moraju biti međusobno razdvojene,
� Prototipovi se moraju navesti pre tela funkcije,
� Uobičajeni redosled: Prototipovi, pa slede
� main slede
� druge funkcije.
� Prototipovi mogu biti u zaglavljima (.h
-
Definisanje FUNKCIJA
� tip funkcije
� • ako stoji * ispred imena – vrednost
� funkcije je pokazivač na objekat
� navedenog tipa
� • može i generički pokazivač (void *),
� pokazivač na pokazivač, ...
� • vrednost mora da bude samo jedan objekat
� (zato tip ne može biti niz), ali može biti pokazivač
-
PREDAJA PARAMETARA
� Prenos argumenata u potprogram
� Prenos argumenata u potprogram
� •važi za sve programske jezike, procedurne i objektne
� •prenos argumenata u potprogram i vraćanje vrednostiiz njega,
obavlja se posredstvom posebne memorijske zone koju poseduje svaki
program i koja se zove stek(stack)
� •postoje dve vrste prenosa
� –prenos po vrednosti
� –prenos po adresi
-
PREDAJA PARAMETARA
� Prilikom pozivanja funkcije tipične su sledeće akcije:
� Prosleđivanje stvarnih argumenata,
� Alokacija i inicijalizacija lokalnih promenljivih
funkcije,
� Prenos kontrole na funkciju, ali tek kada se na neki način
zapamti adresa, to jest pozivajuću celinu koja se nalazi odmah iza
mesta poziva funkcije.
-
� Pri povratku iz funkcije redosled akcija je obrnut. Prvo se
restaurira pozivajuća adresa u pozivajuću rutinu, oslobađa se
prostor za lokalne promenljive i vrši bezuslovni skok na povratnu
adresu. Formalni argumenti, lokalne promenljive i povratna adresa
predstavljaju jednu celinu oblika strukture pod nazivom
aktivizacioni zapis, koji se zapisuje na stek-u prilikom pozivanja
funkcije. Prilikom završetka funkcije aktivizacioni zapis se
uklanja sa steka.
-
� Jedna bitna akcija prilikom pozivanja funkcije je
prosleđivanje vrednosti stvarnih argumenata formalnim argumentima
funkcije, ili predaja parametara.
� Vrednosti stvarnih argumenata funkcije služe za
inicijalizaciju formalnih argumenata funkcije pre obrade tela
funkcije.
� Predaja parametara može biti: predaja parametara po vrednost i
predaja parametara po referenci.
� Prilikom predaje parametara po vrednosti kopija vrednosti
promenljive se prosleđuje funkciji, odnosno formalnim parametrima
funkcije.
-
PRENOS PO VREDNOSTI
� u C-u, svi argumenti osim nizova prenose se po vrednosti
� double f(double x) {
� return 3*++x; //kopijax se povecava za 1
� / / original se ne menja
� }
� a = 11.2;
� b = 3*f(a); //a zadrzava vrednosti 11.2
-
PRENOS PO ADRESI
� prenos po adresi vrši se tako što je parametar pokazivač
� int g(int *a) {
� *a)++; //original se povecava za 1
� return 10*a;
� }
� p = 1;
� m = 2*g(&p); // m=20; p=2;
� bm= 2*g(&p); // m=20; p=2;
-
� na steku se čuvaju:
� vrednosti svih parametara
� vrednosti svih lokalnih promenljivih (promenljivih koje su
definisane unutar funkcije)
� vrednost funkcije (ako funkcija ima vrednost)
� podaci potrebni za nastavak programa po završetku funkcije
(tzv. povratna adresa)
� po završetku funkcije, deo steka sa njenim podacima se
eliminiše
-
PROTOTIPOVI FUNKCIJA
� Prototip funkcije pretstavlja deklaraciju funkcije i nastaje
navođenjem prazne naredbe umesto tela funkcije.
�
� tip naziv_funkcije(lista _argumenata);
�
� Prototipovi funkcija mogu da se pišu u datotečkom ili
blokovskom dosegu, što određuje deo programa u kojem je prototip u
važnosti. Prototipovi se najčešće pišu u datotečkom dosegu. U
glavnom programu nalazi se iznad main funkcije. Uloga prototipa je
samo da prevodiocu ukaže na namenu njihovih argumenata.
� Na primer:
� int zbir(int n, int p);
-
PROTOTIPOVI FUNKCIJA
� Ovaj prototip ukazuje prevodiocu da će se kasnije koristiti
funkcija zbir koja vraća podatak tipa int i da funkcija zbir ima
dva argumenta tipa int. Njega uopšte ne zanimaju promenljive n i p.
Iz tih razloga dozvoljeno je pisanje prototipa funkcije i u
sledećem obliku.
� int zbir( int, int );
� Korišćenjem prototipova funkcija ne moramo voditi računa o
rasporedu definicija funkcija, a definisanje funkcija se izvode u
proizvoljnom poretku ispod tela main funkcije.
-
PROTOTIPOVI FUNKCIJA, VRSTE
� postoje dve vrste i tri varijante prototipa,
� potpuni prototip, varijanta 1: zaglavlje sa
dodatimterminatorom
� potpuni prototip, varijanta 2: varijanta 1 u kojoj sunavedeni
samo tipovi parametara (bez imena)
� nepotpuni prototip: zaglavlje sa terminatorom;beznavođenja
parametara
-
Pozivanje funkcija
� • ime funkcije (stvarni argumenti)
� • može i adresni izraz
� čija je vrednost adresa funkcije
� (preko pokazivača)
� • operator najvišeg prioriteta
-
Pozivanje funkcija
� •poziv se vrši
� • u okviru izraza
� • ako funkcija ne vraća vrednost ili ona
� nije potrebna =>
� poziv može i kao posebna naredba
� • još može i u nizu izraza, kao i u
� ternarnom izrazu kao izraz2 ili izraz3
-
Pozivanje funkcija
� stvarni argumenti pri pozivu
� izrazi proizvoljne složenosti i tipa čija vrednost
inicijalizuje
formalne argumente
� • izračunavaju se proizvoljnim redosledom pre pozivanja
funkcije
-
Pozivanje funkcija
� stvarni argumenti pri pozivu
� treba da se slažu po broju, tipu i poretku sa formalnim
� po potrebi se konvertuju u tip fomalnih
� mogu biti i adresni izrazi (npr. ime niza i adresa)
-
Pozivanje funkcija
Stvarni argumenti pri pozivu
� ako je stvarni argument niz izraza, mora se staviti u zagrade
(zbog zareza)
� na primer f(a,b,c) i f(a,(b,c))
-
Niz kao rezultat funkcije
� ko je rezultat funkcije niz, on se prosleđuje preko liste
parametara, prenosom po adresi
� primer: računanje zbira cnizova ai b
-
REKURZIVNE FUNKCIJE
� REKURZIVNE FUNKCIJE
�
� Algoritamske strukture u opštem slučaju mogu biti rekurzivne
ili iterativne. Programski jezik C podržava rešavanje oba tipa
algoritama koristeći iterativne i rekurzivne funkcije.
� Osnovna ideja rekurzije uključuje dva aspekta:
� Da se poznati problem redukuje na jednostavnije.
� Da se u rešavanju problema svakim rekurzivnim korakom
približavamo željenom rešenju izmenom parametara prvobitnog
problema.
�
-
REKURZIVNE FUNKCIJE
� Definicija rekurzivne funkcije:
� Rekurzivne funkcije su funkcije koje neposredno ili posredno
pozivaju same sebe.
� Rekurzivna rešenja su po pravilu manje efikasna od iterativnih
rešenja istih problema. Dešava se da rekurzivna rešenja traju
neprihvatljivo dugo, ili se traži dosta operativne memorije na
steku za čuvanje međustanja između rekurzija.
�
�
-
REKURZIVNE FUNKCIJE
�pogodno za inherentno rekurzivne algoritme (npr.
faktorijel,
�Fibonaccijevi brojevi, ...)
�manje efikasna od iterativnih (po utrošku vremena ili
memorije)
�otkrivanje grešaka
� teže nego kod iterativnih
-
REKURZIVNE FUNKCIJE
� Rekurzivno izračunavanje faktorijela
� int fakt(int n) {
� return (n>0) ? (n*fakt(n-1)):1;}
� N+1 puta se
1. poziva funkcija
2. inicijalizuje formalni argument
3. ispituje vrednost argumenta,
4. oduzima i množi, uključući čuvanje i obnavljanje steka
-
REKURZIVNE FUNKCIJE
� Iterativno izračunavanje faktorijela
� int fakt (int n) {
� int i, f;
� for (i=f=1; i
-
Lokalne i globalne promenljive
� korišćenje globalne promenljive
� u funkciji gde nije automatski vidljiva
� • ako je izvan funkcije važi do kraja datoteke
� • redundantne deklaracije dozvoljene (na početkudatoteke i u
funkciji)
-
Lokalne i globalne promenljive
� promenljive koje su definisane izvan funkcija nose naziv
globalnepromenljive
� •obično se zaključavaju i koriste kao globalne
imenovanekonstante
� •domet: od definicije do kraja izvorne datoteke
� •domet se može proširiti deklarisanjem
� Modifikatori
� –extern:deklaracija (širenje dometa)
� –static: zabrana širenja dometa
-
Memorijskeklasepromenljivih
� Globalne :Definišu se izvan svih funkcija
� Staticke : Definišu se korišcenjem kljucne reci static
� static tip ime = vrednost
� Automatske : definišu korišcenjem kljucne reci auto
� auto tip ime = vrednost
� Registarske: definišu se korišcenjem kljucne reci register
� register tip ime = vrednost
-
Pretprocesor
Pretprocesor je deo kompajlerskog sistema koji vrši preliminarnu
leksičku obradu izvornog koda
•rezultat obrade nije preveden program, nego prerađen izvorni
kod
•izvorni kod se prerađuje u skladu sa zahtevima programa
izraženim preko tzv. pretprocesorskih direktiva
•direktive počinju znakom #•
po završetku obrade, direktive se uklanjaju
-
Pretprocesor
za definiciju makroa
� iza identifikatora u zagradama može da bude niz argumenata
odvojenih zarezima
� kao formalni argumenti koji se javljaju u nizu iza zagrada
� stvarni argumenti u daljem tekstu - proizvoljni nizovi
simbola