Post on 07-Oct-2015
description
OSNOVOSNOVI I PROGRAMIRANJAPROGRAMIRANJA( VII )( VII )
FUNKCIJEFUNKCIJE
mr Draen BraninElektrotehniki fakultet Banja Luka
2007.
277..11.. PotprogramiPotprogrami
POTPROGRAMI ?POTPROGRAMI ?
PotprogramiPotprogramiPrilikom razvoja algoritma mogu da se uoPrilikom razvoja algoritma mogu da se uoe logie logike cjeline koje se ke cjeline koje se esto esto puta ponavljaju, najputa ponavljaju, najeee nad razlie nad razliitim skupom podataka. Takve cjeline itim skupom podataka. Takve cjeline treba izdvojiti u zasebne programske cjeline treba izdvojiti u zasebne programske cjeline potprograme.potprograme.KoriKoritenjem potprograma:tenjem potprograma:
povepoveava se preglednost programa,ava se preglednost programa,smanjuje se velismanjuje se veliina programa,ina programa,postipostie se univerzalnost koda,e se univerzalnost koda,omoguomoguava se lakava se lake otklanjanje gree otklanjanje greaka.aka.
U programskim jezicima obiU programskim jezicima obino se implementiraju:no se implementiraju:proceduralni potprogrami (proceduralni potprogrami (procedureprocedure))funkcijski potprogrami (funkcijski potprogrami (funkcijefunkcije))
Programski jezik C ima implementirane samo funkcijske potprogramProgramski jezik C ima implementirane samo funkcijske potprograme.e.
377..22.. FunkcijskiFunkcijski potprogramipotprogrami
FUNKCIJE ?FUNKCIJE ?
FunkcijeFunkcijeFunkcija se obiFunkcija se obino definino definie kao potprogram koji na osnovu odreenog broja e kao potprogram koji na osnovu odreenog broja argumenata argumenata daje jedan rezultatdaje jedan rezultat..Podatak koji funkcija vraPodatak koji funkcija vraa glavnom programu naziva se a glavnom programu naziva se vrijednost funkcijevrijednost funkcije..Pod Pod tipom funkcijetipom funkcije podrazumijeva se tip podatka koji vrapodrazumijeva se tip podatka koji vraa funkcija.a funkcija.
Proceduralni potprogrami (u drugim programskim jezicima) mogu daProceduralni potprogrami (u drugim programskim jezicima) mogu da vravraaju aju vivie podataka. Zbog toga, funkcije u Ce podataka. Zbog toga, funkcije u C--u imaju implementiranu moguu imaju implementiranu mogunost da nost da osim rezultata osim rezultata vrijednost funcije, vrate vivrijednost funcije, vrate vie podataka kroz razmjenu e podataka kroz razmjenu argumenata. argumenata. Efekat kad funkcija kroz argumente vraEfekat kad funkcija kroz argumente vraa rezultate naziva sea rezultate naziva seboboni efekatni efekat..Funkcija moFunkcija moe u potunosti da se ponae u potunosti da se ponaa kao procedura, tj. moa kao procedura, tj. moe da daje samo e da daje samo bobone efekte.ne efekte.
477..33.. FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Definicija funkcijeDefinicija funkcijeOpOpti oblik definicije funkcije:ti oblik definicije funkcije:
tip ime (arg1, arg2, ... , argN)tip ime (arg1, arg2, ... , argN)definicija_formalnih_argumenata;definicija_formalnih_argumenata;{{
definicija_lokalnih_promjenljivih; definicija_lokalnih_promjenljivih; programski_iskazi;programski_iskazi;return (izraz); return (izraz);
}}
tip funkcijeAko se ne navede
podrazumijeva se intAko funkcija ne vraa podatak, tip je void
lista formalnih argumenataparametri kroz koje funkcija
prima podatke (vrijednosti ili adrese)
definicija tipova argumenata
ime funkcijeidentifikator u skladu sa sintaksom jezika
definicija lokalnih promjenljivih
promjenljive koje se koriste u funkciji, nisu vidljive izvan
funkcije
izlaz iz funkcije i vraanje vrijednosti datog tipa
U tijelu funkcije moe biti biti vie return iskaza
Ako funkcija ne vraa nita, return moe da se izostavi.
577..33.. FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
Definicija funkcijeDefinicija funkcijeAlternativni oblik definicije funkcije:Alternativni oblik definicije funkcije:
tip ime ( tip ime ( tip1 arg1, tip2 arg2, ... , tipN argN tip1 arg1, tip2 arg2, ... , tipN argN )){{
definicija_lokalnih_promjenljivih; definicija_lokalnih_promjenljivih; programski_iskazi;programski_iskazi;return (izraz); return (izraz);
}}definicija tipova
argumenata sadrana je u listi argumenata
Poziv funkcijePoziv funkcijeOpOpti oblik poziva funkcije:ti oblik poziva funkcije:
ime ( sarg1, sarg2, ... , sargN )ime ( sarg1, sarg2, ... , sargN )lista stvarnih argumenata
parametri koji se alju u funkciju(vrijednosti ili adrese)
Zovu se stvarni zato to su to stvarni, realni podaci
677..33.. FunkcijeFunkcije
PROTOTIP ?PROTOTIP ?
Deklaracija funkcije (prototip)Deklaracija funkcije (prototip)Prototip ili deklaracija funkcije predstavlja njen Prototip ili deklaracija funkcije predstavlja njen opis za spoljaopis za spoljanji svijetnji svijetIz prototipa se vidi kako se komunicira s datom funkcijom, jer sIz prototipa se vidi kako se komunicira s datom funkcijom, jer sadradri:i:
tip funkcije,tip funkcije,ime funkcije,ime funkcije,tipove (a motipove (a moe i imena) argumenata.e i imena) argumenata.
OpOpti oblik prototipa:ti oblik prototipa:tip ime ( tip1, tip2, ... , tipN );tip ime ( tip1, tip2, ... , tipN );
PrimjerPrimjer::int zbir( int a, int b )int zbir( int a, int b )
{{ return (a+b); return (a+b); }}int zbir( int, int );int zbir( int, int );
void poruka ()void poruka (){{ printf(printf(Zdravo!Zdravo!); ); }}
void poruka ();void poruka ();
777..33.. FunkcijeFunkcijeSTRUKTURA STRUKTURA PROGRAMA ?PROGRAMA ?
Struktura C programaStruktura C programaUobiUobiajena je sljedeajena je sljedea struktura:a struktura:
pretprocesorske direktivepretprocesorske direktiveprototip funkcijaprototip funkcijamainmaindefinicija funkcijadefinicija funkcija
Alternativno je moguAlternativno je mogue i:e i:
pretprocesorske direktivepretprocesorske direktivedefinicija funkcijadefinicija funkcijamainmain
Pogodno kad imamo malen broj funkcijaAko funkcija zove neku drugu
funkciju, funkcija koja se poziva mora biti prethodno definisana
PrimjerPrimjer::#include #include void poruka ();void poruka ();main()main(){{
poruka();poruka();}}void poruka ()void poruka (){{
printf(printf(Zdravo!Zdravo!); ); }}
877..33.. FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
PrimjerPrimjer:: Program Program koji ukoji uitava duitava duine stranica pravougaonika, a zatim ispisujeine stranica pravougaonika, a zatim ispisujenjegov obim i povrnjegov obim i povrinu. Obim treba da se rainu. Obim treba da se rauna u funkciji obim, auna u funkciji obim, apovrpovrina u funkciji povrs.ina u funkciji povrs.
#include #include float obim(float, float);float obim(float, float);float povrs(floatfloat povrs(float s1s1, float, float s2s2););main()main(){{ float float a,b, o,p;a,b, o,p;
printfprintf((Stranica aStranica a: : ); ); scanf(scanf(%d%d, &, &aa); ); printfprintf((Stranica bStranica b: : ); ); scanf(scanf(%d%d, &, &bb); ); o = obim(a,b);o = obim(a,b);p = povrs(a,b);p = povrs(a,b);printfprintf((Obim Obim : : %7.3f%7.3f\\nn, o);, o);printf(printf(PovrsinaPovrsina : : %7.3f%7.3f\\nn, p);, p);
} } float float obimobim (float x, float y)(float x, float y)
{ return ( 2*x + 2*y ); }{ return ( 2*x + 2*y ); }float float povrspovrs (float c, float d)(float c, float d)
{ return ( c*d ); }{ return ( c*d ); }
Prototip funkcije obimNavedeni samo tipovi argumenata
Prototip funkcije povrsNavedeni tipovi i imena argumenata
Poziv funkcije obimPoziv funkcije povrs
alju se stvarni podaci a i b
Definicija funkcije obimFunkcija prihvata proslijeene
vrijednosti (a i b) kroz formalne argumente x i y
Funkcija izraunava obim 2*x+2*y i to vraa u glavni program
977..33.. FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
PrimjerPrimjer:: Funkcija koja ne vraFunkcija koja ne vraa vrijednosta vrijednost
#include #include void kvadrat ( int );void kvadrat ( int );main()main(){{
intint i,n;i,n;do do { { printfprintf((n =n = ); ); scanf(scanf(%d%d, &n); }, &n); }while (n
10
77..33.. FunkcijeFunkcije
FUNKCIJE ?FUNKCIJE ?
PrimjerPrimjer:: Program koji ispisuje prvih n prostih brojeva. Program koji ispisuje prvih n prostih brojeva. Provjera da li je broj prost vrProvjera da li je broj prost vri se u funkciji prost.i se u funkciji prost.
#include #include #include #include int prost (int);int prost (int);main()main(){{
int i=1, broj=1, n;int i=1, broj=1, n;do do { { printfprintf((n =n = ); ); scanf(scanf(%d%d, &n); }, &n); }while (n
11
77..44.. PrenosPrenos parametaraparametaraprenos putem prenos putem
VRIJEDNOSTI ?VRIJEDNOSTI ?
Prenos parametara u funkciju putem VRIJEDNOSTIPrenos parametara u funkciju putem VRIJEDNOSTIU prethodnim primjerima koriU prethodnim primjerima koriten je prenos parametara putem VRIJEDNOSTI:ten je prenos parametara putem VRIJEDNOSTI:
1. prilikom poziva funkcije 1. prilikom poziva funkcije alje se vrijednost alje se vrijednost kao stvarni argument kao stvarni argument momoe da se navede: e da se navede:
ime promjenljiveime promjenljive, neka , neka konstantakonstanta ili ili izrazizraz izraizraunava se vrijednost izraza i ta vrijednost unava se vrijednost izraza i ta vrijednost alje u funkcijualje u funkciju
2. funkcija prihvata vrijednosti u formalne argumente2. funkcija prihvata vrijednosti u formalne argumente formalni i stvarni argumenti formalni i stvarni argumenti moraju da se slamoraju da se slau u:u u:
brojubroju, , redoslijeduredoslijedu i i tiputipu formalni argumenti (promjenljive) automatski nastaju prilikomformalni argumenti (promjenljive) automatski nastaju prilikom
ulaska u funkciju i preuzimaju proslije ulaska u funkciju i preuzimaju proslijeene vrijednostiene vrijednosti3. po izlasku iz funkcije formalni argumenti automatski n3. po izlasku iz funkcije formalni argumenti automatski nestajuestaju
automatski nastaju i nestaju pa se nazivaju automatski nastaju i nestaju pa se nazivaju automatske promjenljive automatske promjenljive
U funkciji se kreira slika stvarnih argumenata i koriste te slike, a ne stvarne promjenljive iz glavnog programa, zato nakon izlaska iz funkcije promjenljive u
glavnom programu ostaju nepromijenjene!!!
12
77..44.. PrenosPrenos parametaraparametaraprenos putem prenos putem
VRIJEDNOSTI ?VRIJEDNOSTI ?
PrimjerPrimjer:: Ilustracija prenosa parametara putem vrijednosti. Ilustracija prenosa parametara putem vrijednosti.
#include #include void f (int);void f (int);main()main(){{
int i=10;int i=10;printf(printf(main: %dmain: %d\\nn,i,i););f(i);f(i);printf(printf(main: %dmain: %d\\nn,i,i););
}}void f (int k)void f (int k){{
printf(printf(f: %f: %dd\\nn,,kk););kk=20;=20;printf(printf(f: %f: %dd\\nn,,kk););
}}
main: 10
MEMORIJA
ii1010
kk10102020
f: 10f: 20main: 10
13
77..44.. PrenosPrenos parametaraparametaraprenos VEKTORA u prenos VEKTORA u
funkciju ?funkciju ?
VEKTOR (polje) kao argument funkcijeVEKTOR (polje) kao argument funkcijePrenos vektora (polja) vrPrenos vektora (polja) vri se putem adresei se putem adrese
1. prilikom poziva funkcije 1. prilikom poziva funkcije alje se adresa niza (vektora) alje se adresa niza (vektora) kao stvarni argument kao stvarni argument navodi se ime niza navodi se ime niza
(ime niza je po(ime niza je poetna adresa niza) etna adresa niza) 2. funkcija prihvata adresu niza2. funkcija prihvata adresu niza
formalni argument u definicji funkcije mora da sadrformalni argument u definicji funkcije mora da sadri i [ ][ ]brojbroj elemenataelemenata nizaniza nene moramora dada se se navodinavodi
ne stvara se kopija niza nego se manipuline stvara se kopija niza nego se manipulie stvarnim podacimae stvarnim podacima
U funkciji se manipulie stvarnim podacima, a ne kopijom niza. Zato funkcija moe da promijeni niz,
pa po povratku iz funkcije nemamo originalni nego modifikovani niz !!!
14
77..44.. PrenosPrenos parametaraparametaraprenos VEKTORA u prenos VEKTORA u
funkciju ?funkciju ?
PrimjerPrimjer:: Program Program kojikoji pronalapronalazi najvezi najvei element u nizu.i element u nizu.
#include #include int max ( int nizint max ( int niz[], [], intint nn););main()main(){{int int a[] = { 2,15,5,0,8 }a[] = { 2,15,5,0,8 };;intint n = 5;n = 5;printf(printf(NajveciNajveci: %d: %d\\nn,, max( max( a,na,n ) );) );
}}intint maxmax ( int ( int nizniz[], [], intint nn )){{intint i, m=niz[0];i, m=niz[0];for (i=1; im) m=niz[iniz[i];];return (m);return (m);
}}
Najveci: 15
Formalni argumentdeklaracija niza bez dimenzije
moglo je i int niz[5]
Poziv funkcijealje se adresa niza
15
77..44.. PrenosPrenos parametaraparametaraprenos VEKTORA u prenos VEKTORA u
funkciju ?funkciju ?
PrimjerPrimjer:: Program Program kojikoji sortirasortira i i ispisujeispisuje nizniz korikorienjem funkcija.enjem funkcija.
#include #include void sort ( int nizvoid sort ( int niz[], [], intint nn););void pisi ( int nizvoid pisi ( int niz[], [], intint nn););main()main(){{
int int a[] = { 2,15,5,0,8 }a[] = { 2,15,5,0,8 };;intint n=5;n=5;printf(printf(Prije:Prije:); pisi(); pisi( a,na,n ););sort( a,n );sort( a,n );printf(printf(Poslije:Poslije:); pisi(); pisi( a,na,n ););
}}void pisi ( int void pisi ( int nizniz[], [], intint nn )){{
intint ii;;for (i=for (i=00; i
16
77..44.. PrenosPrenos parametaraparametaraprenos prenos MATRICEMATRICE u u
funkciju ?funkciju ?
VIVIEDIMENEDIMENZZIONALNO IONALNO poljepolje kao argument funkcijekao argument funkcijePrenos viPrenos viedimenzionalnog polja vredimenzionalnog polja vri se putem adresei se putem adreseU deklaraciji formalnih parametara:U deklaraciji formalnih parametara:
pprva dimenzija ne mora da se navede (morva dimenzija ne mora da se navede (moe samo e samo [ ] )[ ] ) ostaleostale dimenzijedimenzije morajumoraju dada se se navedunavedu
PrimjerPrimjer::intint funkcijafunkcija ((intint a[][10][10], a[][10][10], intint p, p, intint q)q)
iliiliintint funkcijafunkcija ((intint a[10][10][10], a[10][10][10], intint p, p, intint q)q)
U funkciji se manipulie stvarnim podacima, a ne kopijom polja. Zato po povratku iz funkcije nemamo
originalno nego modifikovano polje !!!
17
77..44.. PrenosPrenos parametaraparametaraprenos prenos MATRICEMATRICE u u
funkciju ?funkciju ?
PrimjerPrimjer:: Program Program kojikoji transponujetransponuje kvadratnukvadratnu matricumatricu..#include #include void void trantran ( int ( int m[m[1010][10], ][10], intint nn););void pisi ( int void pisi ( int m[10][10], m[10][10], intint nn););main()main(){{
int int a[a[1010][][1010] = { {1,2},{3,4} }] = { {1,2},{3,4} };;printf(printf(Prije:Prije:\\nn); pisi(); pisi(a,2);a,2);trantran( a,( a,22 ););printf(printf(Poslije:Poslije:\\nn); pisi(); pisi(a,2);a,2);
}}void pisi (int void pisi (int m[10][10], m[10][10], intint nn)){{
intint i,ji,j;;for (i=for (i=00; i
18
77..44.. PrenosPrenos parametaraparametaraprenos prenos STRUKTURESTRUKTURE
u funkciju ?u funkciju ?
STRUKTURA STRUKTURA kao argument funkcijekao argument funkcijeStrukuraStrukura momoe biti argument funkcijee biti argument funkcije
PrimjerPrimjer::voidvoid funkcijafunkcija (( struct tacka a struct tacka a ))
Ako funkcija vraAko funkcija vraa strukturu treba definisati tip, a zatim u definiciji/deklaa strukturu treba definisati tip, a zatim u definiciji/deklarraciji aciji funkcije navesti da je funkcija toga tipafunkcije navesti da je funkcija toga tipa
PrimjerPrimjer::typedef struct typedef struct {{intint i,ji,j} TACKA;} TACKA;TACKA TACKA funkcijafunkcija (( TACKATACKA aa, TACKA b, TACKA b ););
19
77..44.. PrenosPrenos parametaraparametaraprenos prenos STRUKTURESTRUKTURE
u funkciju ?u funkciju ?
PrimjerPrimjer:: Program Program kojikoji manipulimanipulie kompleksnim brojevima.e kompleksnim brojevima.#include #include typedef struct typedef struct { float { float re,imre,im; } COMPLEX;; } COMPLEX;COMPLEXCOMPLEX dodjeladodjela ( ( float a, float b float a, float b ))
{ { COMPLEX x;COMPLEX x;x.rex.re=a; =a; x.imx.im=b;=b;return(xreturn(x););
} } COMPLEXCOMPLEX zbirzbir ( ( COMPLEX x, COMPLEX y COMPLEX x, COMPLEX y ))
{ { COMPLEX z;COMPLEX z;z.rez.re==x.re+y.rex.re+y.re; ; z.imz.im==x.im+y.imx.im+y.im;;return(zreturn(z););
} } main()main(){{
COMPLEX COMPLEX x,y,zx,y,z;;x=dodjela(1,2); y=dodjela(3,4);x=dodjela(1,2); y=dodjela(3,4);z=z=zbir(x,yzbir(x,y););printf(printf((%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)(%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)\\nn,,
x.re,x.im,y.re,y.im,z.re,z.imx.re,x.im,y.re,y.im,z.re,z.im););}}
20
77..55.. RekurzivneRekurzivne funkcijefunkcije
REKURZIJAREKURZIJA ??
RekurzivneRekurzivne funkcijefunkcije (REKURZIJE)(REKURZIJE)RekurzivnaRekurzivna funkcijafunkcija jeje funkcijafunkcija kojakoja samasama sebesebe pozivapoziva!!!!!!
PrimjerPrimjer::faktorijelfaktorijel:: n! = n * (nn! = n * (n--1)!, n>1)!, n>00; 0!=1 ; 0!=1 stepenovanjestepenovanje:: xxnn = x * x= x * xnn--11, n>0; x, n>0; x00=1 =1 FibonaFibonaijevijev nizniz:: ffnn = = ffnn--11 * * ffnn--22, n>, n>11; ; ff00==0, f0, f11==11
OpOpte karakteristike rekurzivnih (rekurentnih) rjete karakteristike rekurzivnih (rekurentnih) rjeenja:enja: problem se svodi na rjeproblem se svodi na rjeavanje istog problema, ali jednostavnijegavanje istog problema, ali jednostavnijeg funkcija poziva samu sebe sve dok se problem ne pojednostavi do funkcija poziva samu sebe sve dok se problem ne pojednostavi do trivijalnogtrivijalnog rekurzivna rjerekurzivna rjeenja su manje efikasna (veenja su manje efikasna (vei zahtjev za memorijom)i zahtjev za memorijom) treba ih izbjegavati, ali postoje problemi koji su po prirodi retreba ih izbjegavati, ali postoje problemi koji su po prirodi rekurzivni i koje jekurzivni i koje je
gotovo nemogugotovo nemogue rijee rijeiti bez rekurzijeiti bez rekurzije
21
77..55.. RekurzivneRekurzivne funkcijefunkcije
REKURZIJAREKURZIJA ??
Matematski opis rekurzije:Matematski opis rekurzije:n! = n * (nn! = n * (n--1)!, n>0; 0!=1 1)!, n>0; 0!=1
PrimjerPrimjer:: Rekurzivno izraRekurzivno izraunavanje faktorijela.unavanje faktorijela.
3! = 3 * 2!3! = 3 * 2!
2! = 2 * 1!2! = 2 * 1!
1! = 1 * 0!1! = 1 * 0!
0! = 10! = 1
1*1 = 11*1 = 1
2*1 = 22*1 = 2
3*2 = 63*2 = 6
int fakt (int n)int fakt (int n){ { if (n == 0) if (n == 0) return (1);return (1);
elseelsereturn (n * fakt(nreturn (n * fakt(n--1));1));
}}
int fakt (int n)int fakt (int n){ { return (n==0 ? 1 : n*fakt(nreturn (n==0 ? 1 : n*fakt(n--1));1));
}}
22
77..55.. RekurzivneRekurzivne funkcijefunkcije
REKURZIJAREKURZIJA ??
PrimjerPrimjer:: RekurzivnRekurzivna a funkcijafunkcija zaza konverzijukonverziju dekadskogdekadskog u u binarnibinarni brojnibrojni sistemsistem..
14141010 = ?= ?22 voidvoid konkon (int (int bb)){ { intint cifcif;;cifcif = b % 2;= b % 2;b /= 2;b /= 2;if (b>0) if (b>0) konkon (b);(b);printf(printf(%d%d,cif,cif); );
}}
19 : 219 : 2
99 1144 1122 0011 0000 11
14141010 = 10011= 1001122
1919cifcif=1=1b=9b=9kon(9) => kon(9) => cifcif=1=1
b=4b=4kon(4) => kon(4) => cifcif=0=0
b=2 b=2 kon(2) => kon(2) => cifcif=0=0
b=1b=1kon(1) => kon(1) => cifcif=1=1
b=0b=011
00
23
77..66.. DomeniDomeni i i memorijskememorijske klaseklase
DomenDomen identifikatoraidentifikatora??
DomenDomen identifikatoraidentifikatoraDomenDomen (oblast definisanosti) identifikatora (promjenljive) je podru(oblast definisanosti) identifikatora (promjenljive) je podruje je programa u kojem je taj identifikator dostupan (vidljiv)programa u kojem je taj identifikator dostupan (vidljiv)Osnovno pravilo:Osnovno pravilo: Identifikator je dostupan u bloku u
kojem je definisan, kao i u svim ugnjeenim blokovima, osim ako u
njima nije maskiran drugim identifikatorom sa istim imenom!PrimjerPrimjer::
#include #include main()main(){{
int x=1;int x=1;printf(printf(Prije bloka: %dPrije bloka: %d\\nn,x,x););{{
intint x=0;x=0;printf(printf(UU blokubloku: %: %dd\\nn,x,x););
}}printf(printf(PoslijePoslije bloka: %dbloka: %d\\nn,x,x););
}}
Prije bloka: 1U bloku: 0Poslije bloka: 1
U ugnjeenom blokuje definisana
promjenljiva saistim imenom, ime
je maskirana promjenljiva x iz funkcije main()
24
77..66.. DomeniDomeni i i memorijskememorijske klaseklase
Memorijske klaseMemorijske klase??
Memorijske klase promjenljivihMemorijske klase promjenljivihU programskom jeziku C razlikujemo 4 memorijske klase promjenljiU programskom jeziku C razlikujemo 4 memorijske klase promjenljivih:vih:
globalneglobalnedefinidefiniu se izvan svih funkcijau se izvan svih funkcija
statistatikekedefinidefiniu se koriu se korienjem kljuenjem kljune rijene rijei i staticstatic
static tip ime=vrijednoststatic tip ime=vrijednost automatskeautomatske
definidefiniu se koriu se korienjem kljuenjem kljune rijene rijei i autoautoauto tip ime=vrijednostauto tip ime=vrijednost
podrazumijeva se da je promjenljiva automatska, ako se podrazumijeva se da je promjenljiva automatska, ako se drugadrugaije ne navedeije ne navede
registarskeregistarskedefinidefiniu se koriu se korienjem kljuenjem kljune rijene rijei i registerregister
register tip ime=vrijednostregister tip ime=vrijednost
25
77..6.6. DomeniDomeni i i memorijskememorijske klaseklaseAutomatskeAutomatske
promjenljive?promjenljive?
AutomatskeAutomatske promjenljivepromjenljiveAutomatskeAutomatske promjenljivepromjenljive definidefiniu seu se na pona poetku tijela funkcije (glavnog programa etku tijela funkcije (glavnog programa ili potprograma). ili potprograma). esto se koristi i termin esto se koristi i termin lokalna promjenljivalokalna promjenljiva..PoPoetna vrijednost im se ne podrazumijeva!!! (To znaetna vrijednost im se ne podrazumijeva!!! (To znai da nije nula!!!)i da nije nula!!!)Mogu da se koriste samo u funkciji u kojoj su definisane. To znaMogu da se koriste samo u funkciji u kojoj su definisane. To znai da isto ime i da isto ime momoemo da koristimo nezavisno u viemo da koristimo nezavisno u vie razlie razliitih funkcija. itih funkcija. ak te promjenljive ak te promjenljive mogu da budu i razlimogu da budu i razliitih tipova.itih tipova.Automatski nastaju prilikom ulaska u funkciju, a automatski nestAutomatski nastaju prilikom ulaska u funkciju, a automatski nestaju nakon aju nakon izlaska iz funkcije.izlaska iz funkcije.Podrazumijeva se da je promjenljiva automatska ako se drugaPodrazumijeva se da je promjenljiva automatska ako se drugaije ne navedeije ne navedeNe mora se eksplicitno navoditi da se radi o automatskoj promjenNe mora se eksplicitno navoditi da se radi o automatskoj promjenljivoj, ali moljivoj, ali moe e pomopomou kljuu kljune rijene rijei autoi auto
auto tip ime=vrijednost;auto tip ime=vrijednost;
26
7.67.6.. DomeniDomeni i i memorijskememorijske klaseklaseAutomatske Automatske
promjenljive?promjenljive?
PrimjerPrimjer:: Maniulacija automatskim promjenljivima.Maniulacija automatskim promjenljivima.#include #include void f1 ()void f1 ()
{{ int i=1;int i=1;printf(printf(f1: %df1: %d\\nn, i);, i);
}}void f2 ()void f2 ()
{{ int i=2;int i=2;printf(printf(f2: %df2: %d\\nn, i);, i);i=10;i=10;
}}main()main(){{
int i=0; int i=0; printf(printf(main: %dmain: %d\\nn, i);, i);f1();f1();printf(printf(main: %dmain: %d\\nn, i);, i);i=5;i=5;f2();f2();printf(printf(main: %dmain: %d\\nn, i);, i);
}}
main: 0 f1: 1main: 0 f2: 2main: 5
27
7.67.6.. DomeniDomeni i i memorijskememorijske klaseklase
StatiStatike promjenljive?ke promjenljive?
StatiStatike promjenljiveke promjenljiveDefiniDefiniu se navoenjem kljuu se navoenjem kljune rijene rijei i staticstatic
static tip ime=vrijednoststatic tip ime=vrijednostVrijednost im se odreuje prije poVrijednost im se odreuje prije poetka izvretka izvravanja programaavanja programa
uzima se eksplicitna vrijednost kojom je inicijalizovana promjeruzima se eksplicitna vrijednost kojom je inicijalizovana promjernljivanljivapodrazumijeva se popodrazumijeva se poetna vrijednost nula ako se ne navedeetna vrijednost nula ako se ne navede
Imaju trajan karakterImaju trajan karakterpostoje od popostoje od poetka do kraja izvretka do kraja izvravanja programaavanja programavrijednost ostaje savrijednost ostaje sauvana do sljedeuvana do sljedeeg poziva date funkcijeeg poziva date funkcije
28
7.67.6.. DomeniDomeni i i memorijskememorijske klaseklase
StatiStatike promjenljive?ke promjenljive?
PrimjerPrimjer:: Maniulacija statiManiulacija statikom promjenljivom.kom promjenljivom.
#include #include void f ()void f (){{
static int brs=1;static int brs=1;auto int bra=1;auto int bra=1;printf(printf(static brs=%d auto bra=%dstatic brs=%d auto bra=%d\\nn, brs, bra);, brs, bra);brs++;brs++;bra++;bra++;
}}main()main(){{
int i; int i; for (i=1; i
29
7.67.6.. DomeniDomeni i i memorijskememorijske klaseklase
Globalne promjenljive?Globalne promjenljive?
Globalne promjenljiveGlobalne promjenljiveGlobalne promjenljive definiGlobalne promjenljive definiu se izvan svih funkcija. u se izvan svih funkcija. Ako se u definiciji ne navede Ako se u definiciji ne navede popoetna vrijednost podrazumijeva se nula!!!etna vrijednost podrazumijeva se nula!!!Globalna promjenljiva dostupna je u svim funkcijama koje su defiGlobalna promjenljiva dostupna je u svim funkcijama koje su definisane nakon nisane nakon definicije date promjenljive.definicije date promjenljive.Globalne promjenljive omoguGlobalne promjenljive omoguavaju da viavaju da vie funkcija manipulie funkcija manipulie istim skupom e istim skupom podataka, pa omogupodataka, pa omoguavaju efikasnu razmjenu podataka izmeu funkcija avaju efikasnu razmjenu podataka izmeu funkcija (jer sve (jer sve funkcije pristupaju istim memrijskim lokacijama).funkcije pristupaju istim memrijskim lokacijama).Treba ih izbjegavati jer se gubi univerzalnost funkcije i fleksiTreba ih izbjegavati jer se gubi univerzalnost funkcije i fleksibilnost primjene na bilnost primjene na razlirazliite setove podataka.ite setove podataka.Ako se u nekoj funkciji definiAko se u nekoj funkciji definie promjenljiva sa istim imenom kao i neka globalna, e promjenljiva sa istim imenom kao i neka globalna, tada ta lokalna promjenljiva maskira globalnu i globalnoj ne motada ta lokalna promjenljiva maskira globalnu i globalnoj ne moe da se pristupi.e da se pristupi.Ako se u nekoj funkciji koristi neka globalna promjenljiva to moAko se u nekoj funkciji koristi neka globalna promjenljiva to moe da se e da se eksplicitno naglasi deklaracijom korieksplicitno naglasi deklaracijom korienjem kljuenjem kljune rijene rijei extern, iako ne postoji i extern, iako ne postoji obaveza da se globalne promjenljive deklariobaveza da se globalne promjenljive deklariu u funkcijiu u funkciji
extern tip promjenljiva;extern tip promjenljiva;
30
7.67.6.. DomeniDomeni i i memorijskememorijske klaseklase
Globalne promjenljive?Globalne promjenljive?
PrimjerPrimjer:: Maniulacija globalnom promjenljivom.Maniulacija globalnom promjenljivom.#include #include void f1 ()void f1 ()
{{ int i=1;int i=1;printf(printf(f1: %df1: %d\\nn, i);, i);
}}int i;int i;void f2 ()void f2 ()
{{ extern int i;extern int i;printf(printf(f2: %df2: %d\\nn, i);, i);i=10;i=10;
}}main()main(){{
printf(printf(main: %dmain: %d\\nn, i);, i);f1();f1();printf(printf(main: %dmain: %d\\nn, i);, i);i=5;i=5;f2();f2();printf(printf(main: %dmain: %d\\nn, i);, i);
}}
main: 0 f1: 1main: 0 f2: 5main: 10
globalna promjenljiva
i=0
Globalna promjenljiva i nije vidljiva u funkciji f1() jer je
definisana nakon funkcije.U funkciji f1() raspoloiva je
lokalna promjenljiva i.
U funkciji f2() koristi se globalna promjenljiva i.
Deklaracija extern int i mogla je da se izostavi
31
7.67.6.. DomeniDomeni i i memorijskememorijske klaseklaseRegistarske Registarske
promjenljive?promjenljive?
Registarske promjenljiveRegistarske promjenljiveRegistarske promjenljive su automatske promjenljive za koje je iRegistarske promjenljive su automatske promjenljive za koje je izrazraena ena elja da elja da se drse dre u registrima procesora, a ne u memoriji, kako bi se dobilo na e u registrima procesora, a ne u memoriji, kako bi se dobilo na brzini.brzini.PoPoeljno je korieljno je korienje registarskih promjenljivih kod promjenljivih koje se enje registarskih promjenljivih kod promjenljivih koje se esto esto koriste (npr. brojakoriste (npr. broja))Ne garantuje se da Ne garantuje se da e promjenljiva stvarno i biti registarska. To zavisi i od e promjenljiva stvarno i biti registarska. To zavisi i od konkretnog prevodioca, procesora , ukupnog broja registarskih prkonkretnog prevodioca, procesora , ukupnog broja registarskih promjenljivih do omjenljivih do trenutka deklaracije date promjenljive...trenutka deklaracije date promjenljive...Broj registarskih promjenljivih je ograniBroj registarskih promjenljivih je ogranien i malen.en i malen.Registarske promjenljive definiRegistarske promjenljive definiu se uz pomou se uz pomo kljukljune rijene rijei i registerregister
register tip ime=vrijednostregister tip ime=vrijednostPrimjer:Primjer:
register int i=10;register int i=10;register register intint j;j;
OSNOVI PROGRAMIRANJA( VII )FUNKCIJE7.1. Potprogrami7.2. Funkcijski potprogrami7.3. Funkcije7.3. Funkcije7.3. Funkcije7.3. Funkcije7.3. Funkcije7.3. Funkcije7.3. Funkcije7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.4. Prenos parametara7.5. Rekurzivne funkcije7.5. Rekurzivne funkcije7.5. Rekurzivne funkcije7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase7.6. Domeni i memorijske klase