funkcije - tfzr.uns.ac.rs · funkcije definicija funkcije: funkcije su potprogrami koji na osnovu...

49
FUNKCIJE 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. Definicija potprograma: Potprogrami su sastavni segmenti programskog koda koji se pozivaju radi obavljanja konkretno specificiranog zadatka.

Upload: others

Post on 22-Oct-2020

39 views

Category:

Documents


0 download

TRANSCRIPT

  • 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