You are on page 1of 49

Složeniji problemi se rešavaju dekompozicijom

u veći broj manjih problema. Potprogrami


predstavljaju mehanizam koji direktno podržava
funkcionalnu dekompoziciju kao jednu od
osnovnih metoda strukturnog programiranja.
FUNKCIJE
Definicija potprograma:
Potprogrami su sastavni segmenti
programskog koda koji se pozivaju radi
obavljanja konkretno specificiranog zadatka.
Potprogrami u razvoju programa se najčešće
koriste iz tri razloga:
1.Segmenti programa se mogu više puta pojavljivati u
okviru istog ili u okviru različitih programa.
FUNKCIJE 2. Programi predstavljaju logičke jedinice
dekomponovanih programa
3. Potprogrami predstavljaju i fizičku jedinicu programske
dekompozicije, koji se posmatra kao jedinični kod u
postupku prevođenja. Programski jezik C koristi module
Potprogrami
procesna apstrakcija
U programskom jeziku C sve su samo funkcije
(nema procedura),
FUNKCIJE obavezna bar jedna funkcija main()
• funkcija - n-arni operator
najvišeg prioriteta
• vraća rezultat (preko imena) +
bočni efekti, oboje opciono
Višestruko korišćenje (u istom ili
različitim programima)
Kod kraći, čitljiviji, lakši za testiranje i
ZAŠTO SE debagovanje)
KORISTE
FUNCIJE Korišćenje i bez programiranja
Modularnost – dobar, ponekad jedini
način rešavanja zadatih problema
problema
Funkcija je jedna od osnovnih elemenata
programa pisanog u programkom jeziku C
Funkcija je potprogram unutar glavnog
ZAŠTO SE programa koja obavlja specifičan zadatak,
KORISTE Vec smo radili funkcije printf(), scanf(), main()
FUNCIJE Naravno u okviru predmeta pisaćete i sami svoje
funkcije
Funkcije poseduju argumente (promenljive) i
kao povratnu vrednost imaju argument.
Možete je napisati jednom a pozivati više puta
Moguće je kreirati biblioteke funkcija.
Jednostavnije rešavanje programskog zadatka
ZAŠTO SE Jednostavnije pisanje i održavanje programa
KORISTE Veći nivo abstrakcije i razumevanja samog
FUNCIJE programa
Često se kaže da program bez funkcija nije
kvalitetan program
U većini programskih jezika se jasno razlikuju
potprogrami koji vraćaju vrednost (funkcije), od onih
koji to ne čine (procedure). Programski jezik C poznaje
samo funkcije kao tip potprograma, ali se u okviru
ovakvog pristupa procedure formalno zamenjuju
funkcijama koje ne vraćaju nikakvu vrednost.
FUNKCIJE Sa pojmom funkcija srećemo se u matematici gde se na
osnovu argumenta funkcije (nezavisna promenljiva x)
dobija vrednost rezultata funkcije (zavisna promenljiva
y).
Definicija funkcije:

Funkcije su potprogrami koji na osnovu izvesnog broja argumenata


daju jedan rezultat koji se naziva vrednost funkcije.

Osobine funkcija:

FUNKCIJE 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
Funkcija se definiše naredbom za definisanje
funkcije:
DEFINISANJE
FUNKCIJE tip naziv_funkcije(lista _argumenata)
{
telo_ 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.
DEFINISANJE
lista_argumenata - predstavljaju argumente funkcije
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
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.
FUNKCIJE 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)
FUNKCIJE • 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
Vrednost funkcije formira se ("vraća se") naredbom
return izraz

FUNKCIJE efekat naredbe returnjeste formiranje vrednostii završetak


funkcije
Funkcije koje imaju vrednost mogu imati proizvoljan broj naredbi
return, a najmanje jednu
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
FUNKCIJE naredbom
scanf("%d%d",&a,&b);
Vrednost funkcije(jednaka 2 ako su oba učitavanja uspešna) se ne
korist
Primer 1:
Definisati C funkciju hipotenuza koja na osnovu kateta a i b
izračunava hipotenuzu pravouglog trougla.
prvi način:

FUNKCIJE float hipotenuza(float a, float b)


{
return sqrt(a*a+b*b);
}
drugi način:

float hipotenuza(float a, float b)


{
float c; /* Deklarativna naredba */

FUNKCIJE sqrt(a*a+b*b);

return c;
}
Naredbe funkcija
Naredbe deklaracije – na početku funkcije
Izvršne naredbe – posle naredbi deklaracije
FUNKCIJE Naredbe povratka – obavezno bar jedna ako
funkcija vraća vrednost
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.

Pozivanje
izrazi - predstavljaju stvarne argumente funkcije čije
Funkcija 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.
Izraz za pozivanje funkcije može se koristiti kao operand u
složenijem izrazu, tada se vrednost funkcije koristi u izračunavanju
tog izraza. Kako je operator poziva funkcije () visokog prioriteta, to
obezbeđuje da se izračunavanje vrednosti funkcije (pozivanje
Pozivanje funkcije) izvrši pre bilo kog susednog operatora u izrazu.

Funkcija
Ukoliko funkcija nema svoju vrednost (tip void) može da se koristi
samo kao drugi operand operatora zarez ili kao drugi ili treći
operand trinarnog operatora. Funkcija koja nema svoju vrednost
najčešće se koristi kao operand izraza u prostoj naredbi fun(...)
ime( lista stvarnih argumenata);
Poziv funkcije je operator u C jeziku
Pozivanje Pojedini argumenti odvajaju se zarezom “,”.
Funkcija Ako funkcija nema argumenata, piše se samo ( )
.
Pogledati zadatke
Pozivanje 54 i 55 koji su dati u pdf

Funkcija
Nije pravilo ali jeste, mesto nije toliko važno,
Pravilo je da main() bude prva funkcija u programskom kodu (ili
Gde se pišu poslednja)
FUNKCIJE Funkcije moraju biti međusobno razdvojene,

unutar Prototipovi se moraju navesti pre tela funkcije,


Uobičajeni redosled: Prototipovi, pa slede
programa main slede
druge funkcije.
Prototipovi mogu biti u zaglavljima (.h
tip funkcije
• ako stoji * ispred imena – vrednost
funkcije je pokazivač na objekat
Definisanje navedenog tipa
FUNKCIJA • 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č
Prenos argumenata u potprogram
Prenos argumenata u potprogram
•važi za sve programske jezike, procedurne i objektne

PREDAJA •prenos argumenata u potprogram i vraćanje vrednostiiz njega,


obavlja se posredstvom posebne memorijske zone koju poseduje
PARAMETARA svaki program i koja se zove stek(stack)
•postoje dve vrste prenosa
–prenos po vrednosti
–prenos po adresi
Prilikom pozivanja funkcije tipične su sledeće akcije:
Prosleđivanje stvarnih argumenata,
PREDAJA Alokacija i inicijalizacija lokalnih promenljivih funkcije,
PARAMETARA 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.
u C-u, svi argumenti osim nizova prenose se po vrednosti
double f(double x) {
PRENOS PO return 3*++x; //kopijax se povecava za 1
VREDNOSTI / / original se ne menja
}
a = 11.2;
b = 3*f(a); //a zadrzava vrednosti 11.2
prenos po adresi vrši se tako što je parametar pokazivač
int g(int *a) {
*a)++; //original se povecava za 1
PRENOS PO return 10*a;
ADRESI }
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
Prototip funkcije pretstavlja deklaraciju funkcije i nastaje
navođenjem prazne naredbe umesto tela funkcije.

tip naziv_funkcije(lista _argumenata);


PROTOTIPOVI
FUNKCIJA 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);
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
PROTOTIPOVI tih razloga dozvoljeno je pisanje prototipa funkcije i u sledećem
obliku.
FUNKCIJA 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.
postoje dve vrste i tri varijante prototipa,
PROTOTIPOVI potpuni prototip, varijanta 1: zaglavlje sa dodatim
FUNKCIJA, terminatorom
VRSTE potpuni prototip, varijanta 2: varijanta 1 u kojoj su
navedeni samo tipovi parametara (bez imena)
nepotpuni prototip: zaglavlje sa terminatorom ;bez
navođenja parametara
• ime funkcije (stvarni argumenti)
Pozivanje • može i adresni izraz
funkcija čija je vrednost adresa funkcije
(preko pokazivača)
• operator najvišeg prioriteta
•poziv se vrši
• u okviru izraza
Pozivanje • ako funkcija ne vraća vrednost ili ona
funkcija 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
stvarni argumenti pri pozivu
Pozivanje izrazi proizvoljne složenosti i tipa čija vrednost inicijalizuje
funkcija formalne argumente
• izračunavaju se proizvoljnim redosledom pre pozivanja funkcije
stvarni argumenti pri pozivu
Pozivanje treba da se slažu po broju, tipu i poretku sa formalnim
funkcija po potrebi se konvertuju u tip fomalnih
mogu biti i adresni izrazi (npr. ime niza i adresa)
Pozivanje Stvarni argumenti pri pozivu
ako je stvarni argument niz izraza, mora se staviti u zagrade (zbog
funkcija zareza)
na primer f(a,b,c) i f(a,(b,c))
Niz kao ko je rezultat funkcije niz, on se prosleđuje preko liste parametara,
rezultat prenosom po adresi
primer: računanje zbira cnizova ai b
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.
REKURZIVNE Osnovna ideja rekurzije uključuje dva aspekta:

FUNKCIJE 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.
Definicija rekurzivne funkcije:
Rekurzivne funkcije su funkcije koje neposredno ili posredno
pozivaju same sebe.
Rekurzivna rešenja su po pravilu manje efikasna od iterativnih
REKURZIVNE rešenja istih problema. Dešava se da rekurzivna rešenja traju
neprihvatljivo dugo, ili se traži dosta operativne memorije na
FUNKCIJE steku za čuvanje međustanja između rekurzija.
pogodno za inherentno rekurzivne algoritme
(npr. faktorijel,
Fibonaccijevi brojevi, ...)
REKURZIVNE manje efikasna od iterativnih (po utrošku
FUNKCIJE vremena ili memorije)
otkrivanje grešaka
teže nego kod iterativnih
Rekurzivno izračunavanje faktorijela
int fakt(int n) {
return (n>0) ? (n*fakt(n-1)):1;}
REKURZIVNE N+1 puta se
1. poziva funkcija
FUNKCIJE 2. inicijalizuje formalni argument
3. ispituje vrednost argumenta,
4. oduzima i množi, uključući čuvanje i obnavljanje steka
Iterativno izračunavanje faktorijela
int fakt (int n) {
int i, f;
REKURZIVNE
for (i=f=1; i<=n; f*=i++);
FUNKCIJE
return f;
}
mnogo efikasnije (nema poziva)
korišćenje globalne promenljive
Lokalne i
u funkciji gde nije automatski vidljiva
globalne
• ako je izvan funkcije važi do kraja datoteke
promenljive
• redundantne deklaracije dozvoljene (na početku
datoteke i u funkciji)
promenljive koje su definisane izvan funkcija nose naziv globalne
promenljive
•obično se zaključavaju i koriste kao globalne imenovane
Lokalne i konstante
globalne •domet: od definicije do kraja izvorne datoteke
promenljive •domet se može proširiti deklarisanjem
Modifikatori
–extern:deklaracija (širenje dometa)
–static: zabrana širenja dometa
Globalne :Definišu se izvan svih funkcija
Staticke : Definišu se korišcenjem kljucne reci static
static tip ime = vrednost
Memorijske Automatske : definišu korišcenjem kljucne reci auto
klase auto tip ime = vrednost
promenljivih Registarske: definišu se korišcenjem kljucne reci register
register tip ime = vrednost
Pretprocesor je deo kompajlerskog sistema koji vrši preliminarnu
leksičku obradu izvornog koda
•rezultat obrade nije preveden program, nego prerađen izvorni kod
Pretprocesor •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
za definiciju makroa
iza identifikatora u zagradama može da bude niz argumenata
odvojenih zarezima
Pretprocesor kao formalni argumenti koji se javljaju u nizu iza zagrada
stvarni argumenti u daljem tekstu - proizvoljni nizovi simbola

You might also like