Professional Documents
Culture Documents
Sadraj
----------------------------------------------------------------------------------------------------------
Uvod
1. Brojevni sistemi 1.1 Decimalni brojevni sistem 1.2 Oktalni brojevni sistem 1.3 Binarni brojevni sistem 1.4 Hekasadekadni brojevni sistem 1.5 Konverzija iz decimalno u binarni za is 2. Jezicki tipovi podataka 2.1 !romenljive i konstante 2.2 !ravila za dodeljivanja imena romeljivima 2.3 Decimalni ti " #$% 2.4 &ealni ti " '(O)% # DO*B(+ 2.5 Kljucne reci ,HO&% i (O$2.. /nak " 0H)& 3. Operatori 3.1 #zrazi i naredbe 3.2 O eratori u jeziku 0 3.3 -ubitak reciznosti 3.4 O eratori inkrementiranja1223 i dekrementiranja1--3 3.5 $a omena 4. Naredbe. Struktura programa 4.1 Hello 4orld5 Osnovne stvari vezane za jezik 0 4.2 Komentari 4.3 $aredba 6include. Header 7ajlovi. ,tandardna biblioteka. 4.4 Osnovne stvari vezane za 7unkcije. Blok naredbi. 4.4.1 !etlja 89ile 4.4.2 O eratori oredjenja 4.4.3 !etlja do 89ile 4.4.4 'or etlja 4.5 $aredbe :rananja 4.5.1 $aredba :rananja " i7 4.5.2 $aredba :rananja ;s8itc9< 4.5.3 *slovni izraz 5. unkcije 5.1 'unkcije 5.2 'unkcija Obim13 5.3 O sezi vaznosti 5.4 !reo terecivanje 7unkcija !. Osnove prikup"janja podataka ..1 $a omena o razlici izmedju te=ta i znaka ..2. 'unkcija rint713 ..3 'unkcija scan713 ..4 /akljucak #.$ %okazivaci i Nizovi >.1 Kako rade okazivaci i adrese. >.1.2 !okazivaci i 7unkcije >.2. $izovi >.3 !romenljive ti a c9ar >.4 $iz romenljivi9 ti a c9ar
&. Neke od 'unkcija standardne bib"ioteke ?.1 ,%&#$-.H ?.1.2 'unkcije za ko iranje strin:ova ?.1.3 'unkcije nadovezivanja ?.1.4 7unkcije oredjenja ?.2 @)%H.H ?.2.1 %ri:onometrijske 7unkcije ?.2.2 ,te enovanje vrednosti ?.2.3 /aokruzivanje na celobrojnu vrednost ?.3 0%A!+.H ?.3.1 !ri adnost simbola :ru i ?.3.2 Odredjivanje i menjanje velicine slova ?.4 Bos 7unkcija za komuniciranje sa korisnikom ?.5 'unkcije za dinamicko u ravljanje memorijom ?.. -enerisanje random broja (. Strukture 1$. )ad sa 'aj"ovima 1C.1 ,tandardni tokovi i ojam Ba7era 1C.2 ,truktura '#(+ i 7unkcije za otvaranje novi9 tokova 1C.3 'unkcije za baratanje sa 7ajlovima
-----------------------------------------------------------------------------------------------------------
*+O,
!ro:ramski jezik 0 je konzolni sto ce reci da reko nje:a ne mozete1 bez koriscenja neki9 ;dodataka<3 na raviti ; rozolike< a likacije5 no ovo ne treba da vas razocara u do:ledno vreme se mozete i time ozabaviti. 0 je i strukturni jezik dakle koristi strukture kao rimaran vid izvedeni9 ti ova odataka. Ovaj sistem je zastareo i jezici nove :eneracije su objektno orijentisani1OO!3 no i takvim jezicima strukture nisu ne oznate. $e ocekujem da ako ste ocetnik ovo sada s9vatite5 s9vaticete olako kako budete na redovali.... %reba da znate da je svaki ocetak suvo aran i da je za ucenje bilo ko: ro:ramsko: jezika otrebno dosta vremena truda i omalo ameti. $e daj te se obes9rabriiD !a da ocnemo.
Binarni B, je sku koji ima 2 ci7re i to su E C5 1 5 te ce binarni broj 1C11CC u decimalnom za isu bitiE I1C11CCI2 H 1G25 2 CG24 2 1G23 2 1G22 2 CG21 2 CG2C H I44I1C Jrlo slicno ret9odnim rimerima. 1.4 -ekasadekadni brojevni sistem #ma cak 1. simbola E C51525354555.5>5?5F5)5B505D5+5'. Bice vam otrebno da znate koje vrednosti imaju navedena slova u decimalnom za isuE ) H 1C B H 11 0 H 12 D H 13 + H 14 ' H 15 !rimerE I)2'I1. H 1C G 1.2 2 2 G 1.1 2 15 G 1.C H 25.C 2 32 2 15 H I2.C>I1C
Ovo je malo kom likovanije ali bitno je uvideti da se slova zamenjuju od:ovarajucim vrednostima. 1.5 .onverzija iz decima"no u binarni zapis Bicete u rilici da vrsite ovakvu konverziju. Obajsnicu na sledecem rimeruE Broj 44 revesti u binarni za is. &esenjeE
I44I1C H 44K2 C 22K2 C 11K2 1 5K2 1 2K2 C 1K2 1
/adati broj 44 delimo sa dva5 ostatak za isujemo is od a rezultat deljena isemo levo i taj rezultat delimo sa dva i tako dalje dok :od se ne dobije nula kao kolicnik1ne kao ostatak3. ,ada obratite aznju na dobijeni od ostataka i rocitaj te :a od ozadiE 1C11CC. Dosli smo do resenjaD !okusajete kao roveru da uradite konvertovanje ovo: binarno: broja u decimalni.
romeljive je ot uno isto. !ostoje i :lobalne romeljive kojima se deklaracijom automatski dodeljuje vrednost C5 no otom otom. -Konstante su takodje vid romenljivi9 ali se njima moze vrednost dodeliti samo jednom5 rilikom inicijalizacije. * daljem toku ro:rama nji9ova vrednost se samo moze iscitavati. Deluje beskorisnoL !a i nije bas5 recimo da u ro:ramu koristite broj !i5 on ima konstantnu vrednost 3.14 te ce mo romeljivu !i de7inisati tako da se njena vrednost ne moze menjati. OvakoE const int Pi = 3.14; Bitno je uvideti da konstante moraju biti inicijalizovane5 u su rotnom nema svr9e koristiti i9. 2.2 %ravi"a za dode"jivanja imena prome"jivima !romenljiva moze sadrzati roizvoljno ime ali ono treba da o isuje namenu romenljive5 dakle ako treba da cuva zbir neki9 brojeva verovatno ce te je nazvati ;zbir< ili ;rezultat<. #mena romenljivi9 smeju da sadrze slova5 brojeve i znak donje crte1 N 3. $a ocetku imena se mora naci ili slovo ili donja crta5 broj ne smeD 2.3 ,ecima"ni tip / 0N1 Ovaj ti je najkorisceniji ti odatka. !romenljive koje su ti a int1 skracenica od inte:er3 u 32bit-nom sistemu zauzimaju 4 bajta i u takvim romenljivim mozete cuvati decimalne cele brojeve kao sto su C5 >?F5 4CCC5 -15 -45.F isl. !rimer deklaracije ovakve romenljive E int broj1; int broj2 = 150; 2.4 )ea"ni tip / 2O31 0 ,O*B24 $edostatak ti a int je u tome sto ne moze cuvati vrednosti koje imaju decimalnu tacku odnosno ;zarez<1dakle realne brojeve3 vec #$% sve ci7re ;iza zareza< odbacuje. Da bi cuvala ovakve brojeve romenljiva mora biti ti a 7loat ili 5ako je broj enormno veliki5 ti a double. !rimer deklaracije ovakvi9 romenljivi9E !oat "; doub!e #; 2.5 ."jucne reci S-O)1 i 2ON5 Ove kljucne reci mo:u se rimeniti samo na do sada o isane ti ove odataka. )ko deklarisemo romenljivu O kao ;s9ort int< ona ce sadrzati 1u 32bit-nom3 sistemu 2 bajta5 dakle du lo manje od re:ularno: int-a. @edjutim ona moze sadrzati brojeve ciji su o stezi takodje du lo manji. Kljucna rec lon: omo:ucava da romenljiva ima veci o se: od ono: koji bi ta romenljiva imala bez ove kljucne reci. 2.! 6nak / 7-3) -ore omenuti ti ovi su cuvali brojeve a romenljive koje su ti a c9ar cuvaju simbole. ,vaka romenljiva ti a c9ar zauzima sve:a jedan bajt i moze da cuva samo jedan simbol. ,imbola ima uku no 255 i tu s adaju kom letna en:leska abeceda5 brojevi i razni dru:i simboli i znakovi. O ovom ti u odatka cemo detaljnije ricati kasnije.
3.$ Operatori
Jerovatno vam je oznat termin ;o erator<5 dakle to je n r. 25 -5 K itd... Bezik 0 ima o:roman sku o eratora ali to :a uo ste ne cini kon7uznim5 kao sto ce te i videti. !ostoji ar bitni9 stvari E rvenstvo o eratora5 asocijativnost5 znacenje itd...
O eratore oredjenja ovde necemo objasnjavati5 to cemo uraditi kasnije5 riliko objasnjavanja ;:rananja koda<. 3.1 0zrazi i naredbe &anije smo naveli rimer u kojem smo sabirali dva broja E a 2 b. &ezultat smo smestali u romenljivu rez5 ako od ovi9 odataka 7ormiramo izraz u jeziku 0 dobija ovoE re$ = a % b; #zvedimo konstataciju da je izraz kombinacija o eranada i o eratora. * navedenom rimeru imamo 3 o eranda1rez5 a5 b3 i dva o eratora1 H5 23. %akodje ostoje i dva izraza5 rvi je sabiranje romenljive a i b5 dru:i je dodeljivanje te vrednosti romenljivoj rez. ,ve ovo zajedno cini jednu naredbu. $aredba je dakle sku izraza1 ciji broj moze biti ne o:raniceno veliki ali takodje moze biti i C- razna naredba3 koji se obavezno okoncava znakom ;tackazarez<1 P 3. 3.2 Operatori u jeziku 7 Jazan 7aktor je svakako rvenstvo o eratora5 sto znaci da ako na isete naredbu E re$ = a & b ' 2 rvo ce se izvrsiti izraz b G 2 a ce se od a oduzeti rezultat mnozenja i na kraju se ta razlika dodeljuje romenljivoj rez. *vidjamo da o erator mnozenja ima najvece rvenstvo5 zatim o erator oduzimanja i da najmanje rvenstvo ima o erator dodele vrednosti. ,ledi tabela rvenstva o eratora. -------------------------------------------------------------------O!+&)%O& I O!#, I -------------------------------------------------------------------13 I !oziv 7unkcije I QR I #nde= niza I -S I !okazivac na strukturu I . I 0lan strukture I -------------------------------------------------------------------I *narni minus I 2 I *narni lus I 22 I #nkrementiranje I -I Dekrementiranje I D I (o:icka ne:acija I T I Kom lemant nad bitovima I G I !osredan ristu I U I )dresa-od I sizeo7 I Jelicina objekta I 1tM e cast3 I +ks licitna konverzija I -------------------------------------------------------------------G I @nozenje I K I Deljenja I V I Ostatak1 moduo3 I -------------------------------------------------------------------2 I ,abiranje I I Oduzimanje I -------------------------------------------------------------------WW I !omeranje bitova ulevo I SS I !omeranje bitova udesno I -------------------------------------------------------------------W I @anje od I WH I @anje ili jednako I S I Jece od I
O!+&)%O& I O!#, I -------------------------------------------------------------------SH I Jece ili jedanko I -------------------------------------------------------------------HH I Bednako I DH I &azlicito I -------------------------------------------------------------------H I G I 2H I G I -H I razni I GH I o eratori dodele I KH I vrednosti I VH I G I UH I G I sizeo7 I G I 1tM e cast3 I G I --------------------------------------------------------------------
, (zarez)
| Redosle
-------------------------------------------------------------------)ko u navedenom izrazu zelite da rvo odradite sabiranje morate u otrebiti za:radeE rez = (a + b) * 2; #li mozete da na isete u vise naredbiE rez = a + b; rez = rez * 2; ovo je rosto i jasno. @edjutim ostoji ;skracenica< koju mozemo rimeniti na izraz rez H rez G 25 umesto da dva uta isemo ;rez< na isacemo izrazE re$ '= 2; sto ce imati isti e7ekat. * tabeli mozete videti :omili o eratora koju se zasnivaju na ovom rinci u. @ozda niste u oznati sa znacenjem o eratora ostatka1moduo3- V. *koliko bi imali izrazE re$ = 10 ( 2; rezultat bi bio 5 i taj broj bi se dodelio romenljivoj rez. Ostatka ri deljenju 1C sa 2 nema a je on nula. $o5 ako zelimo da rez sadrzi ostatak od 1C K 2 koristicemo o erator moduoE re$ = 10 ) 2; rez ce imati vrednost C. 3.3 5ubitak preciznosti * o:lavlju 2 receno je koji ti ovi romenljivi9 mo:u cuvati koje odatke. )ko imamo romenljivu O ti a int i romenljivu A ti a 7loat te na isemo sledeceE int *; !oat + = 3.14; * = +; vrednost koju cuva O nece biti 3.14 jer je O ti a int a taj ti ne moze da cuva brojeve sa decimalnom tackom1realne brojeve3. O ce imati vrednost od 35 dakle deo osle decimalne tacke se od acuje i dolazi do :ubitka reciznosti. !ostoji veoma bitna stvar koja moze biti vrlo ne z:odna. !o:ledajmo rimerE; float Y; Y = 10 / 4; ocekivano je vrednost A 2.5 ali nijeD Jrednost A je u stvari 2D /astoL )nalizirajmo naredbu AH1CK4. !rvo se obavlja deljenje a tek onda dodeljivanje vrednosti. Kada se deljenje obavlja sistemu je otrebna memorija u koju ce rivremeno smestiti vrednost deljenja re ne:o sto tu vrednosti dodeli romenljivoj A5 dakle sistem ce kreirati rivremenu romenljivu.%reba se za itati koje: je ti a ta romenljiva. &adi o timizacije iskoriscenja memorije5 sistem ce kreirati romenljivu ono: ti a u koji ce mocu da stane rezultat deljenja1sabiranja5mnozenja...3
dru:im recima ako su oba o eranda ti a int1sto je ovde slucaj3 sistem ravi romenljivu ti a int i dodeljuje joj od:ovarajucu vrednost5 a osto int ne moze cuvati brojeve iza decimalno zareza1 bez obzira sto je A ti a 7loat jer se njemu vrednost tek kasnije dodeljuje3 dolazi do :ubitka reciznosti. Dva su nacina za izbe:avanje ovakvo: onasanja. !rvi5 mozemo uraditi ovoE + = 10 ( 4 ' 1.0; dodali smo ; G 1.C < izrazu i time smo osti:li da ostoje dve romenljive ti a int 11C5 43 i jedna ti a 7loat1 1.C 3. !omocna romenljiva koju je za sebe kreirao sistem ce samim tim biti ti a 7loat a nece biti :ubitka reciznosti. ,ve omocne romenljive sistem automatski brise o zavrsetku naredbe i tako vraca zauzetu memoriju. Dru:i nacin je ele:antniji5 koristicemo o erator eks licitne konverzije1:ore omenuta je bila in licitna3 takodje zvano: ;cast o erator<. Koristeci ovaj nacin dobicemo naredbuE + = , !oat- 10 ( 4; *z omoc 17loat3 smo romenili ti broja 1C iz int u 7loat. *nutar za:rada mozete stavljati razlicite ti ove i na taj nacin dolaziti do razliciti9 konverzija. ,ve ove ce te moci da robate na delu5 kada budemo oceli da isemo ro:rame a to ce biti od sledeci9 o:lavlja. 3.4 Operatori inkrementiranja899: i dekrementiranja8;;: #mamo romenljivu O kojoj smo dodelili vrednost 15. int * = 15; /elimo da joj ovecamo vrednost za 11 mozda deluje sumanuto ali veoma cesto ce te se sretati sa ovakvom otrebom3. %o mozemo uraditi na nekoliko nacinaE * = * % 1; * %=1; *%%; !rva dva izraza su vam oznata ali treci izraz je novi5 to je takozvana inkrementacija. Ona znaci da ce se vrednosti romenljive O ovecati za 15 da stoji O-- vrednost bi se smanjila za 1. *vedena je jer je mno:o lakseKbrze na isati O22 ne:o O H O 2 15 zar neL @edjutim o erator 22 moze stojati i kako re tako i osle imena romenljive5 ovakoE + = 10 % *%%; + = 10 % %%*; &azlika nije zanemarljiva. *zmimo da je O H 15. * rvom slucaju vrednost A ce biti 1C 2 15. * dru:om A ce biti 1C 2 1.. &azlika je u tome sto se u rvom slucaju vrednost O inkrementira tek o zavrsetku naredbe1 takozvana ; ost7iksna notacija<3 dok se vrednost O u dru:om slucaju rvo izvrsava inkrementacija romenljive O a se tek onda odradjuje sabiranje5 a u tom trenutku romenljiva O ima vrednost 1.. Ovo se naziva ; re7iksna notacija<. 3.5 Napomena Kod isanja realni9 brojeva n r. 3.14 od esencijalne je vaznosti da :reskom ne u otrebite o erator zareza1 5 3 umesto o eratora tacka1 . 3. * sintaksi jezika 0 ovi o eratori imaju ot uno razlicito znacenjeD
ovecati kolicinu memorije na HD koju zauzima ro:ram. Dakle5 ukljucujemo samo one 9eader 7ajlove koji sadrze 7unkcije koje su nam otrebne5 ostale cemo izostaviti.
4.4 Osnovne stvari vezane za 'unkcije. B"ok naredbi. ,vaki ro:ram jedino sto zaista mora da ima je bar jedna 7unkcija5 i ta osnovna 7unkcija se mora zvati ;main<. ,ve ostale mo:u imati roizvoljna imena. $aime5 kada se izvrsava ro:ram5 naredbe to: ro:rama se izvrsavaju onim redom kojim smo i9 isali. @edjutim rvo treba odrediti ocetnu tacku svako: ro:rama5 mesto od koje:a ce se oceti sa izvrsavanjem naredbi. %o mesto je 7unkcija ;main<. ,vaka 7unkcija ima nekoliko elemenataE ti odatka koji ce vratiti5 ime5 ar:umente5 telo. !o:ledajmo 7-ju main iz :ornje: rimeraE int main,= (( >ri?a$i >oru?u >rint ,@7a nije o<e >oru?e e?ran bi bio >ra$anABn@-; C -void je ti romenljive koju ce 7unkcija vratiti. $a ovom mestu moze stajati bilo koji ti odatka. !rimetite da se ne zadaje ime romenljive koja se vraca kao rezultat 7-je5 ovo je lo:icno a u to ce te se i sami uveriti. -main je ime 7unkcije. -135 lista arametara 7unkcije. Ona je razna zato sto olaznoj 7unkciji ro:rama main ne rosledjujemo ni jednu romenljivu1 arametar3. %akodje unutar za:rada mozemo na isati i ;void<5 ovo je univerzalni ti odatka koji moze da zameni bilo koji ti medjutim takodje kaze i da u stvari on nije ni jedan od ti ova odataka a 7unkcija i ne uzima nijedan arametar. $emojte mno:o lu ati :lavu oko ovo: ti a odataka. -KK rikazi oruku. Komentar. - rint71;...<3. Ovo je jos jedna 7unkcija. %o je 7unkcija standardne biblioteke i sluzi za is isivanje te=ta i vrednosti romenljivi9 na ekran. @i smo ovom naredbom ozvali 7unkciju rint713 i kao arametar joj rosledili niz znakova XDa nije ove oruke ekran bi bio razanDYnX. %o kako ce ova 7unkcija i uz omoc ce:a rikazati te=t na ekran nas ne interesuje jer mi je samo koristimo5 neko dru:i ju je vec na isao1de7inisao3 za nas. @i smo u :ornjem rimeru de7inisali samo 7unkciju main13. -Z [. Otvorena i zatvorena viticasta za:rada5 oznacavaju jedan blok naredbi. *jedno u ovom slucaju one redstavljaju ocetak i kraj tela 7unkcije main13. Dakle5 kada ozovete 7unkciju main13 sve naredbe koje se nalaze unutar tela 7unkcije ce biti izvrsene. 4.4.1 %et"ja ?@i"e !ro:ramom Hello4orld smo na ravili vrlo jednostavnu a likaciju. ,ada cemo je malo zakom likovati. /elimo da se oruka is ise 2CC uta. %o bi znacilo da treba 2CC uta na isati rint713 7-ju5 na srecu ostoji daleko ele:antnije resenje- koriscenje etlji odnosno naredbi onavljanja. Ovim naredbama se ostize da se odredjeni blok naredbi1 ili samo jedna naredba3 onavljaju nekoliko uta. %ri su naredbe onavljanja E 89ile5 do 89ile i 7or. ,ve su to rezervisane kljucne reci a se ne mo:u koristiti kao imena romenljivi9. #demo redom. +vo kako bi iz:ledalo resenje roblema ako :a uradimo reko etlje 89ile. (' P./0.A1 2344/56/.475200 '( 8inc!ude 9stdio.:;
<oid main,<oid= int i=200; ((>et!ja D:i!e D:i!e, i ; 0 = >rint ,@7a nije o<e >oru?e e?ran bi bio >ra$anABn@-; &&i; C ((?raj >et!je D:i!e C #za kljucne reci 89ile5 unutar za:rade stoji uslov ;i S C<. Ovo znaci da ce se telo etlje izvrsavati dokle :od je is unjen uslov da je ;i< vece od nule. %elo etlje je sve ono sto se nalazi izmedju viticasti9 za:rada5 slicno kao kod tela 7unkcija. *nutar tela 7-ja izvrsavaju se dve naredbe 7-ja rint713 i dekrementacija romenljive i1 --i3. *koliko ne bi bilo dru:o: izraza vrednost romenljive ;i< bi bila stalno veca od nule1tj. 2CC3 sto bi znacilo da ce se etlja izvrsavati u ne do:led. %o bi bio veoma ozbiljan ro ust i ro:ram se ne bi valjano izvrsavao. Jrlo je bitno roveriti da li je etlja valjano na isana5 dakle da ne bude beskonacna. 4.4.2 Operatori poredjenja !rvo treba da s9vatite kako 7unkcionisu o eratori oredjenja. )ko zelite da roverite da li je 1 vece od 2 izraz bi iz:ledao ovako E O H 1 S 2 . Ovo nije tacno a je rezultat koji ce biti smesten u romenljivu O jednak nuli. @edjutim da smo na isali O H 5 S 2 5 uslov bi bio tacan i vrednost u romenljivoj O bi bila jedan. Dakle ako je iskaz oredjenja tacan dobija se broj jedan5 ako je rezultat oredjenja ne tacan dobija se broj nula. +vo liste o eratora oredjenja E ------------------------------------------------O!+&)%O& I /nacenje I ------------------------------------------------W I @anje od I WH I @anje ili jednako I S I Jece od I SH I Jece ili jednako I DH I &azlicito I HH I Bednakost I
--------------------------------------------* odeljku 4.4.1 smo koristili naredbu ;89ile1 i S C 3 ...< 5 mo:li smo takodje na isati ;89ile1 i 3< jer ce se etlja izvrsavati sve dok je rezultat izraza koji se nalazi izmedju za:rada razlicit od nule. &azlo: ovom je sto se sa nulom redstavlja neis unjavanje neko: uslova a sa jednicom1ili bilo kojim brojem koji je razlicit od nule3 tacnost.!rema tome etlja 89ile5 kao i sve dru:e etlje i naredbe :rananja5 ce se izvrsavati kada :od je rezultat uslova koji smo zadali razlicit od nule. %reba za aziti razliku izmedju o eratora dodele vrednost H i o eratora jednakosti HH. )ko imamo ovakvu situaciju E int *E +E F; * = 10; + = 23; F = ,+ == *-; Jrednost u / ce biti C5 jer A nije jednako O a uslov nije is unjen. )ko bi umesto oslednje naredbe stojala ovaE Z = ( Y != X );
vrednost u / ce biti 1 jer je A zaista razlicito od O a je samim tim uslov zadovoljen. Ovde su za:rade na isane zbo: bolje re:lednosti inace rvenstvo o eratora DH je vece od o eratora jednako1 H 3 a i nema otrebe za za:radama ali dakle ne skodi staviti i9. 4.4.3 %et"ja do ?@i"e Ova je etlja veoma slicna etlji 89ile stim sto je kod 89ile etlje mo:uce da se telo etlje ne izvrsi ni jednom jer se rvo roverava uslov a ako je uslov tacan telo se izvrsava i tako u kru:5 dok kod do 89ile etlje rvo se izvrsava telo a zatim se roverava uslov i tako u kru: dok je :od rezultat uslova tacan. !rimer5 na isimo ro:ram koji ce od korisnika traziti da unese broj veci od 5CC ako korisnik unese manji broj ro:ram ce mu traziti da onovo unese broj. +vo kako bi iz:ledao rimer ako koristimo 89ile etlju. (' P./0.A1 broj5<eci5od55005D:i!e5nacin '( 8inc!ude 9stdio.:; <oid main,<oid= ((de?!aracija >romen!ji<e int n; ((u$mi broj od ?orisni?a >rint ,@Gnesite broj <eci od 500 &; @-; scan ,@)d@E Hn-; ((do? je Iod <rednost N&a manja od 500 tra$i no<i broj D:i!e, n 9= 500 scan ,@)d@E Hn-; ((>ri?a$i >oru?u o us>e:u >rint ,@Gne!i ste is>ra<an brojA J<a?a cast.Bn@-;
C
,ve bi trebalo da vam je jasno sem 7unkcije scan713. Ona sluzi da se od korisnika uzme neki broj ili tekst. Kako ona radi za sada nije bitno5 objasnicemo je kasnije. Bos jedino treba rimetiti da kod etlje 89ile nema viticasti9 za:rada koje oznacavaju telo etlje. &azlo: tome je sto telo etlje sacinjava samo jedna naredba a u otreba viticasti9 za:rada nije ne o 9odna5 no ne skodi. %reba na omenuti da telo 7unkcija mora sadrzati ar viticasti9 za:rada bez obzira na broj naredbi unutar nji9. +vo kao bi resenje isto: zadatka iz:ledalo ako koristimo etlju do 89ileE (' P./0.A1 broj5<eci5od55005do5D:i!e5nacin '( 8inc!ude 9stdio.:; <oid main,<oid= ((de?!aracija >romen!ji<e int n; ((u$mi broj od ?orisni?a >re?o do D:i!e >et!je >rint ,@Gnesite broj <eci od 500 &; @-; do = scan ,@)d@E Hn-; C D:i!e, n 9= 500 -; ((>ri?a$i >oru?u o us>e:u
>rint ,@Gne!i ste is>ra<an brojA J<a?a cast.Bn@-; C Oba nacina su is ravna ali dru:i je bolji jer je kraci i re:ledniji. Demonstrirana je u otreba do 89ile etlje. Dakle rvo se ise kljucna rec ;do< zatim ide telo etlje1 u ovom slucaju viticaste za:rade smo mo:li da izostavimo jer se izvrsava samo jedna naredba3 i na kraju se roverava uslov unutar za:rada. 4.4.4 or pet"ja ,intaksa 7or etlje je takodje jednostavna i krajnje 7unkcionalna iako deluje malo slozenije. Ona iz:leda ovakoE 7or1 izraz1; uslov_petlje; izraz2 ) { telo petlje } *mesto ;izraz1< i ;izraz2< mozete kucati bilo koju naredbu5 dok ;uslovN etlje< retstavlja bas to dakle dok je :od rezultat naredbe koju na isete tu razlicit od nule telo etlje ce se izvrsavati. +vo kako bi iz:ledao ro:ram ;Hello4orldN2CC< koriscenjem 7or naredbeE (' P./0.A1 2344/56/.4752005 or '( 8inc!ude 9stdio.:; <oid main,<oid= int i; or, i=200; i ; 0; i%%>rint ,@7a nije o<e >oru?e e?ran bi bio >ra$anABn@-; C Dakle5 naredba i H 2CCP ce se izvrsiti samo jednom a rovera uslova i naredba i22 sa svakim onavljanjem etlje... Ostalo je sve jasno. 4.5 Naredbe grananja !omocu ovi9 naredbi mozemo u ravljati tokom izvrsavanja koda. /adatak5 od korisnika uzeti dva cela broja i od vece: oduzeti manji. (o:icno rvo treba uzeti brojeve5 zatim roveriti koji je od nji9 veci i na kraju izracunati razliku te rikazati rezultat. Bedino sto za sada ne znate da uradite je kako odrediti koji je broj veci. %o odredjujemo reko naredbe :rananja. *radicemo ovaj zadatak koristeci nekoliko razliciti9 nacina :rananja koda. 4.5.1 Naredba grananja / i' &esenje zadatka omocu i7-aE (' P./0.A1 KL5NA.37MA '( 8inc!ude 9stdio.:; <oid main,<oid= ((de?!aracija >romen!ji<i: int "E #E re$; ((u$imanje >odata?a >rint ,@Gnesite >r<i >a druIi broj &; @-; scan ,@)d)d@E H"E H#-; ((>ro<eri ?oji je broj manji i racunaj i , " ; # -= re$ = "&#; C
e!se = re$ = #&"; C ((>ri?a$i re$u!tat >rint ,@.e$!utat je = )dBn@E re$-; C +vo iz:leda sintakse i7 naredbeE if ( uslov ) { telo } #7 je kljucna rec5 uslov mora dati rezultat razlicit od nule da bi se telo naredbe i7 izvrsilo. *koliko uslov nije is unjen sve naredbe koje se nalaze u telu naredbe i7 bice reskocene. Jrlo jednostavno. * daljem kodu rimecujemo kljucnu rec ;else< iza koje sledi telo te naredbe. $jom kazemo da ako uslov i7-a nije is unjen ro:ram izvrsi blok naredbi1 telo3 koji sledi ne osredno iza ove kljucne reci. *koliko je uslov i7 etlje tacan blok naredbi iza else ce biti reskocen. +lse ne mora obavezno da stoji uz svaku i7 komandu5 ona je o ciona i ubacuje se ako ima otrebe za tim kao sto je to bio slucaj u ovom rimeru. %akodje5 else mora stojati ne osredno o zavrsetku bloka naredbi i7-a. Bedino sto jos treba da znate je znacenja keM8ord-a break i continue. -Break sluzi da se izadje iz etlje. &ecimo da ste na isali ovako etljuE int i = 0; D:i!e, 1 = i , i%% == 200- brea?; e!se >rint ,NrecenicaBnO-; C rimecujemo da ce uslov etlje 89ile biti uvek is unjen te ce etlja biti beskonacna. @edjutim u njenom telu ostoji i7 naredba kojom roveravamo da li je romenljiva ;i< jednaka broju 2CC. )ko nije is isuje se oruka ali ako jeste5 na scenu stu a komanda ;break< kojom se ;iskace< iz tela etlje i relazi se na deo koda koji sledi iza tela etlje. -Da bi objasnili continue na isacemo 7or etlju kojoj ce mo is isati svaki dru:i broj iz intervala od C do 2CC. int i; or, i = 0; i 9 200; i%% - = i , ,i ) 2- A= 0- continue; >rint , N)dBnOE i-; C !rve dve linije treba da su vam vec jasne. * trecoj liniji roveravamo da li je ostatak ri deljenju romenljive ;i< sa 2 razlicit od nule. )ko nije onda je broj aran i rikazujemo :a na ekran ako ak jeste to znaci da broj nije aran te naredbom ;continue< kazemo da se ocne sa novim rolazenjem kroz telo etlje. 4.5.2 Naredba grananja As?itc@B *z omoc ove naredbe :rananja moze se ostici da se5 u zavisnosti od vrednosti neke romenljive5 izvrsava odredjeni blok naredbi. /adatak E uzeti od korisnika broj 15 2535 4 ili 5 i za svaki broj is isati neku razlicitu oruku. Ovo se moze uraditi reko ;i7< naredbe ali ce iz:ledati nez:ra no5 no kao vezbu okusajte da ovo uradite na taj nacin. +vo kako bi resenje iz:ledalo ako koristimo s8itc9 naredbu. (' P./0.A1 J6KTP25NA.37MA '( 8inc!ude 9stdio.:; <oid main,<oid= int broj;
>rint ,@Gnesite broj 1 2 3 4 i!i 5 &; @-; scan ,@)d@E Hbroj-; sDitc:, broj - = case 1: >rint ,@Gne!i ste broj jedanABn@-; brea?; case 2: >rint ,@Mroj d<aBn@-; brea?; case 3: >rint ,@/<aj mi se broj ne do>adaABn@-; brea?; case 4: >rint ,@Mroj 4@-; brea?; case 5: >rint ,@...bi>...bi>...bi>..Bn@-; brea?; de au!t: >rint ,@Niste !e>o une!i brojABn@-; C C #za naredbe s8itc95 unutar za:rada treba uneti ime neke romenljive koju na osnovu cije vrednosti ce se ozivati odredjen blok naredbi. ;case 1E< oznacava da ako je vrednost romenljve ;broj< 1 da ce se oceti sa izvrsavanjem sledeci9 linija koda dok se :od ne naidje na naredbu break ili na kraj tela s8itc9 naredbe. %o znaci da ako je vrednost romenljive ;broj< n r.5 izvrsice se samo naredba >rint ,@...bi>...bi>...bi>..Bn@-; i brea?; ,ve naredbe re nji9 bice reskocene. Da nema naredbe break izvrsavanje naredbi bi islo sve dok se ne dodje do kraja tela etlje5 ovo onasanje se naziva ;dro -do8n< ili ; ro adanje<. $aredbe koje slede iza kljucne reci ;de7ault< bice izvrsene ukoliko vrednost koju ima romenljiva broj nije ni 1 ni 2 ni 3 ni 4 ni 5 vec neka dru:a5 ne redvidjena vrednost tj. ako za vrednost romenljive broj ne ostoji ni jedan od:ovarajuci ;case<. !ostoji jos i naredba bezuslovno: skoka5 :otoE . Ovom naredbom mozete se ; rebaciti< tj. skociti sa bilo koje: mesta u 7unkciji na bilo koje dru:o mesto u toj 7unkciji. @edjutim lo:icno je da lokaciju na koju zelite da izvrsavanje koda ;skoci< treba da oznacite nekako. %o se radi tako sto na ocetku reda koji redstavlja destinaciju skoka u isujete roizvoljno ime i simbol dvotacke1 E 3. 4.5.3 *s"ovni izraz Ovo je jedini ternarni o erator u 0 jeziku koji obezbadjuje dvosmerno :rananje. $a rimerE int " = 13E# = 7QRE ma"; ma" = " ; # S " : #; Jrlo je rosto- oredimo da li je vrednost romenljive O veca od vrednosti A. *koliko je uslov is unjen1dakle O jeste vece od A35 vrednost koju ce dobiti romenljiva @)O je ona koja se nalazi levo od znaka dve tacke1 u ovom slucaju to je vrednost koju ima O3. * su rotnom vrednost koju ce dobiti @)O bice ona koja se nalazi levo od znaka dve tacke.
5. unkcije
'unkcije su o rilicno lako ;svarljive< medjutim i nezaobilazne i jako korisne sto:a je dosta bitno znati i9. 5.1 unkcije Do sada su svi na isani ro:rami u ovom tutrialu koristili samo jednu 7unkciju " main13. !ro:ram nema o:ranicenja u vidu broja 7unkcija koje sadrzi ali svaki ro:ram na isan na jeziku 0 mora imati najmanje jednu takozvanu olaznu 7unkciju5 dakle mesto od koje: izvrsavanje ro:rama ocinje. %a se 7unkcija mora zvati main13. !ozeljno je da svoj kod isete or:anizujuci :a u 7unkcije. &azlozi su mno:obrojni a samo jedan od nji9 je i taj sto ro:ram ostaje mno:o citljiviji5 7unkcionalniji5 re:ledniji i lakse je locirati eventualne :reske te iste is raviti. Dakle 7unkcije redstavljaju blok naredbi koje ce odraditi neko izracunavanje i dati rezultat to: svo: rada. ,vaka 7unkcija ima ar osnovni9 elemenata a evo kako to sematski iz:ledaE povratni_tip ime_funk ije( lista_parametara) { !!!! telo_funk ije("lok_nare#"i)!!!! } - $ovratni tip je ti romenljive koju ce 7unkcija vratiti. $a rimer5 ako 7unkcija vraca ceo broj ovde ce stojati int. )ko ak 7unkcija ne vraca nikakvu vrednost ovde treba u isati ;void<. - %me_funk ije je dakle ime sto znaci da ako zelite da ozovete ovu 7unkciju da bi ona odradila odredjeni zadatak u isacete njeno ime. ,\to:a ime 7unkcije trebalo bi da vam da neku sliku o tome sta ta 7unkcija radi. - lista_parametara redstavlja listu romenljivi9 koje su otrebne 7unkciji da odradi odredjeni osao. &ecimo da imate 7unkciju koja sabira dva broja koja joj rosledite. (o:icno je da 7unkcija nece moci da odradi svoj zadatak ako joj vi ne redate dva broja koja ce ona onda da sabere i vrati vam nji9ov zbir. - telo_funk ije je blok naredbi koje ce izvrsiti zadatak te 7unkcije. ,amim tim telo 7unkcije cini njenu srz i najbitniji deo. Kao i svaki dru:i blok naredbi i ovaj mora stojati izmedju viticasti9 za:rada koje retstavljaju ocetak i kraj bloka. )ko vam nije bas jasno :ore navedeno sledi rimer sa detaljnijim objasnjenjem. 5.2 unkcija Obim8: $a isacemo ro:ram koji ce ored 7unkcije main13 imati i j s jednu 7unkciju. %u cemo 7unkciju nazvati Obim13 i ona ce imati zadatak da izracuna obim ravou:aonika cije stranice joj rosledimo. Ovaj ro:ram ce biti dosta menjan i nado:radjivan kroz dalji tok tutrijala. (' P./0.A1 /bim '( 8inc!ude 9stdio.:; ((>rototi>,i!i de?!aracija- un?cije doub!e /bim, doub!e aE doub!e b-; (( un?cija main <oid main,<oid= ((de?!aracija >romen!ji<i: doub!e "E#E re$; ((u$mi >odat?e >rint ,@Gnesite du$inu stranice A i M &; @-; scan ,@)! )! @E H"E H#-;
((>o$o<i un?ciju /bim da bi: i$acunao obim te!a $adani: ((dimen$ija re$ = /bim,"E #-; ((>ri?a$i re$u!tat >rint ,@/bim >ra<ouIaoni?a stranica A i M je ).2! A Bn@E re$-; C ((de inicija un?cije /bim,doub!e /bim, doub!e aE doub!e b= doub!e ret; ret = a ' b; return ret; C !omocu naredbe 6includeWstdio.9S smo ukljucili 7ajl stdio.9. On nam je otreban jer su u njemu de7inisane 7unkcije koje ce mo koristiti u ro:ramu. /atim sledi deklaracija 7unkcije Obim13. Jerovatno vam nije jasno zasto se ovo radi. !red ostavimo da deklaraciju nismo na isali. !okusacemo da revedemo ro:ram i dobiti :resku u kojoj se kaze da nije nadjena 7unkcija Obim13 iako je ona de7inisana osle 7unkcije main. &azlo: ovome je taj sto se unutar main13 7unkcije nalazi naredba kojom se oziva 7unkcija Obim13E re$ = /bim,"E #-; @edjutim revodioc ro:ram revodi liniju o liniju koda a osto mu ranije nismo rekli da ostoji 7unkcija Obim13 on ce se buniti i obavestiti nas o tome. Dakle 7unkcija Obim13 jeste de7inisana kasnije u ro:ramu medjutim revodilac to:a jos uvek nije svestan jer jos nije sti:ao da ; revede< tu 7unkciju a mi smo okusali da je u otrebimo. Da bi se ovo izbe:lo ribe:ava se isanju rototi ova 7unkcije. !rototi ovi 7unkcija sadrze ovratni ti 7unkcije5 ime 7unkcije i listu ar:umenata. %elo se ise kasnije i taj se ; roces< naziva de7inisanje 7unkcije. !rototi ovi trebaju da stoje ri ocetku koda ro:rama jer se na taj nacin bla:ovremeno obavestava revodioc da ostoji odredjena 7unkcija i da ce ona kasnije biti i de7inisana. )lternativa ovome ostoj ali je ona losije resenje. $aime vi mozete deklarisati i de7inisati 7unkciju5 u ovom slucaju Obim135 re ne:o sto na isete neku naredbu koja ce je ozivati5 u ovom slucaju je to naredba u 7unkciji main13. Ovo radi ali je losa raksa jer kod ostaje ne re:ledan lus sto ovaj metod nije 1CCV ouzdan. ,ledi de7inicija 7unkcije main13 i osle nje ar jasni9 naredbi u kojima deklarisemo romenljive i ozivajuci 7unkcije rint713 i scan7131 koje su de7inisane u za:lavlju stdio.95 detaljnije ce mo kasnije reci3 vrsimo komunikaciju sa korisnikom i dobavljamo otrebne odatke. $akon to:a racunamo obim ozivajuci 7unkciju Obim13 i smestajuci rezultat u romenljivu rez. 'unkcija obim za9teva da joj se roslede dva ar:umenta tj. romenljive koje su ti a double. Ovde treba razjasniti sta je ar:ument a sta arametar. Kada de7inisete 7unkciju vi de7inisite i koje ce arametre1dakle romenljive3 ta 7unkcija da za9teva od ozivaoca 7unkcije. Kada ak ozivate tu 7unkciju5 romenljive koje joj se rosledjuju se nazivaju ar:umenti. @alo cudno i :lu avo ali... Dolazimo do de7inicije 7unkcije Obim13. *:lavnom je sve jasno sem zadnje naredbeE
return ret; %elo 7unkcije se moze zavrsiti na dva nacinaE kada se dodje do kraja tela 7unkcije tj. do viticaste za:rade 1 [ 3 ili kada se dodje do naredbe return. #za naredbe return sledi romenljiva koja ce biti vracena kao rezultat 7unkcije. Basno je da se ti romenljive i ti vrednosti koju ce 7unkcija vratiti moraju okla ati odnosno da u ovom slucaju romenljiva ret mora biti ti a double. Jrlo je bitno uvideti da ako imate slucajE int " = 5; return "; " = 10; romenljivoj = se nikada nece dodeliti vrednost 1C jer se izvrsavanje tela ove 7unkcije rekida naredbom return. )ko 7unkcija ne vraca vrednost1void3 onda se return ise bez ikakve romenljive osle nje:a. !o:ledajmo jos jednom listu arametara. * njoj smo de7inisali da 7unkciji moraju biti rosledjene dve romenljive ti a double. $jima smo dodelili imena a i b. Dakle bez obzira na sve5 kada mi rosledimo nekoj 7unkciji romenljivu5 7unkcija nece biti u stanju da menja vrednost rosledjene romenljive. $aime5 kada se romenljiva rosledi nekoj 7unkciji5 na osebnom mestu u memoriji- steku 7ormira se jos jedna oromenljiva sa karakteristikama1 ti 5 ime3 koje smo joj zadali rilikom de7inicije te 7unkcije koju ozivamo i dodeljuje joj se vrednost romenljive koju smo rosledili. Dakle za svaki rosledjenu romenljivu se na steku ravi nova romenljiva i inicijalizuje se vrednoscu rosledjene romenljive. Da ojasnimo na :ornjem rimeru. $aredbom Obim1=5 M3 smo ozvali 7unkciju Obim13 i rosledili joj dva ar:umenta = i M. Ovo daje ;direktivu< ro:ramu da treba da ;skoci< na mesto na kome je de7inisana 7unkcija Obim13 i da odatle nastavi sa izvrsavanjem koda. Kada se telo 7unkcije Obim13 zavrsi5 ro:ram nastavlja sa izvrsavanjem od mesta sa koje: je Obim13 bio ozvan5 u ovom slucaju to je naredbaE re$ = /bim,"E #-; koja se nalazi u main13. Jrednost koju ce 7unkcija Obim13 vratiti1 omocu naredbe return3 bice dodeljena romenljivoj rez... Dolazimo do dela koji sada necete mozda razumeti jer treba da znate sta je to o se: vaznosti romenljive1objasnicemo u sledecem od o:lavlju3 ali valja na omenuti. 'unkcija Obim13 ne moze da ristu i romnljivim koje ste deklarisali unutar 7unkcije main135 i uo ste unutar neke dru:e 7unkcije1zbo: o se:a vaznosti35 a zato se moraju kreirati dve nove romenljive unutar 7unkcije Obim13 u kojima ce mo cuvati vrednosti rosledjeni9 ar:umenata. #mena ti9 romenljivi9 koje smo de7inisali u listi arametara 7unkcije Obim13 mo:u da imaju ista imena kao i romenljive koje smo de7inisali u telu 7unkcije main13 ali naravno mo:u biti i razlicita. Ovo je o et zbo: o se:a vaznosti5 a sledi i objasnjenje sta je to. 5.3 Opsezi vaznosti !ostoje 3 o se:a vaznostiE lokalni5 :lobalni i eksterni. /adnji je retko koriscen a :a necemo izeti u razmatranje. O se: vaznosti1 en:. ;sco e<3 je svojstvo svake romenljive. !romenljive sa lokalnim o se:om vaznosti1 krace receno ;lokalne romenljive<3 su ;vidljive< samo unutar jedno: bloka naredbi1 telo 7unkcije5 telo etlje3 u kojem su de7inisane. * red9odnom rimeru romenljive a i b su bile de7inisane u telu 7unkcije main13 a njima ne mozete da ristu ite iz tela 7unkcije Obim135 zbo: to:a sto su one ;vidljive< samo unutar tela u kojem su de7inisane u ovom slucaju to je telo 7unkcije main13. !o:ledajmo sledeci rimerE int main1void3 Z KKdeklaracija lokalne romenljive , int J; J = 10; i ,1- =
((de?!aracija >romen!ji<e G unutar te!a naredbe i int G = 20; ((dode!a <rednosti >romen!ji<oj J J = 20; C ((?raj te!a i naredbe ((Ires?a G = 13; return 0; C Ovaj se kod ne moze kom ajlirati. !o:ledajmo liniju kod is od komentara ;KK:reska<. !romenljiva * je de7inisana unutar bloka naredbi i7"a . )ko azljivo roanalizirate ovaj kod s9vaticete da je5 kao sto je :ore objasnjeno5 romenljiva * vidljiva samo unutar blok u kojem je de7inisana tj.unutar bloka naredbi i7-a. Jazno je uvideti i da je romenljiva , vidljiva unutar i7 bloka... Bos jedna razlika izmedju tela 7unkcija i tela naredbi :rananjaK etlji... !ostoje i :lobalne romenljive. %o su sve romenljive koje se de7inisu van tela 7unkcija. Ove romenljive su vidljive u svim delovima delovima ro:rama dakle dostu ne su svim 7unkcijama. !rednost ovi9 romenljivi9 a ujedno i velika mana1 zbo: ce:a i9 treba zaobilaziti u sirokom luku3 je to sto nji9ove vrednosti mo:u menjati svi delovi ro:rama5 sve 7unkcije. Ovo deluje na rvi o:led dobro ali sta ako imate neki veci ro:ram od nekoliko stotina ili 9iljada linija koda i kada :a budete testirali vi recimo naidjete na :resku da neka :lobalna romenljiva ima ne od:ovarajucu vrednost. Kako ce te locirati sta ravi roblemL $eka vam je bo: u omoci. $o da ste de7inisali tu romenljivu kao lokalnu i o otrebi je redavali kao ar:ument nekoj 7unkciji imali bi ste mno:o1ali bas mno:o3 manje osla. !rimer ro:rama koji racuna obim koristeci :lobalne romenljive ce iz:ledati ovakoE (' P./0.A1 /bim50!ob '( 8inc!ude 9stdio.:; ((>rototi>,i!i de?!aracija<oid /bim, <oid-; un?cije
((73T4A.APKUA 04/MA4N3 P./13N4UKV3 doub!e "E #E re$; (( un?cija main <oid main,<oid= ((u$mi >odat?e >rint ,@Gnesite du$inu stranice A i M &; @-; scan ,@)! )! @E H"E H#-; ((>o$o<i dimen$ija /bim,-; un?ciju /bim da bi: i$acunao obim te!a $adani:
((>ri?a$i re$u!tat >rint ,@/bim >ra<ouIaoni?a stranica A i M je ).2! A Bn@E re$-; C ((de inicija un?cije /bim,-
<oid /bim, <oid= re$ = " ' #; C * oredite detaljno razliku izmedju ova dva nacina izvodjenja ovo: ro:rama5 bice vam to dobra vezba. !ro:ram je skracen ali isto tako retstavlja veoma losu ro:ramersku raksu. /ato drzite se lokalni9 romenljivi9D ,ada bi trebalo da vam je jasno kako rade 7unkcije. %reba da se ucite da sve or:anizujete o 7unkcijama5 rednosti ce te sami uvideti. /a kraj na omenimo da i ak ostoji mo:ucnost da jedna 7unkcija menja vrenosti lokalni9 romenljivi9 deklarisani9 unutar dru:e 7unkcije5 omocu okazivaca ali cemo nji9 objasniti nesto kasnije da bi vam rvo redstavili kako mozete da ;komunicirate< sa korisnikom vase: ro:rama5 sto ce uciniti da vam ro:ramiranje ostane mno:o zanimljivije. 5.4 %reopterecivanje 'unkcija ,vaka 7unkcija ima dve osobine koje je cine jedinstvenomE ime i listu ar:umenata. #ako deluje nelo:icno vise 7unkcija moze imati ot uno isto ime5 ali onda im se mora razlikovati lista ar:umenata. %akve 7unkcije su reo terecene. Bedina 7unkcija koja nemoze biti reo terecena je 7unkcija main13. ,vr9a reo tereceni9 7unkcija je da u zavisnosti od ti ova ar:umenata izvrsavaju razlicite naredbe. &ecimo da imate dve 7unkcije koje treba razlicito da rade u zavisnosti od ti a ar:umenta koji joj rosledite. !ostoje dva resenjaE ili da 7unkcije imaju razlicito ime ili da budu reo terecene te da im ti arametra koji uzimaju bude razlicit. Dru:o resenje je obicno bolje.
kom likovanija ali sve ostaje lako i ; rirodno< uz malo vezbe. +vo kako se omocu ove 7unkcije is isuje neki te=t na ekranE printf(" vo !e pri"er"); 'unkciji smo kao ar:ument redali te=t i on ce biti is isan na ekran. @edjutim rint713 sluzi za 7ormatiran rikaz te=ta na ekran5 sto znaci da koristeci ovu 7unkciju mozete vrsiti tabulaciju1 9orizontalnu i verikalnu35 relaziti u novi red idr. ,ve se ovo ostize koriscenjem komandni9 sekvanci. ,vaka komandna sekvenca je u stvari simbol iako se sastoji od dva znaka5 a bi o recenom u red9odnom odeljku trebalo da se tretira kao te=t ali to nije slucaj1s9vati ce te kasnije zasto3. Komandna sekvenca se sastoji od znaka ;beksle]<1 Y 3 i jos neko: dodatno: znaka5 evo tabeleE ------------------------------------------------------------------IK., I O!#, I ------------------------------------------------------------------I Yn I $e8 line 1 relazak u novi red3 I ------------------------------------------------------------------I Yt I Horizontalna tabulacija1 H%3 I ------------------------------------------------------------------I Yv I Jertikalna tabulacija1 J%3 I ------------------------------------------------------------------IK., I O!#, I ------------------------------------------------------------------I Yb I Backs ace1 vraca jedno mesto nazad I ------------------------------------------------------------------I Yr I Jraca na ocetak reda I ------------------------------------------------------------------I Ya I )larm1 bee zvuk3 I ------------------------------------------------------------------I Y\ I !rikazuje na ekran simbol \ I ------------------------------------------------------------------I Y< I !rikazuje na ekran simbol < I ------------------------------------------------------------------I YL I !rikazuje na ekran simbol L I ------------------------------------------------------------------I YY I !rikazuje na ekran simbol Y I ------------------------------------------------------------------I YOktalnoI !rikazivanje ceo broj oktalno I ------------------------------------------------------------------I YO9eksa I !rikazivanje ceo broj 9eksadecimalno I ------------------------------------------------------------------Objasnimo najkorisnije sekvence. )ko zelite da redjete u novi red kuca ce te sekvencu Yn unutar te=ta koji se redaje kao arametar 7unkciji rint7135 ovakoE >rint ,OPr<i redBn7ruIi red BnBnBnJesti red...O-; @ozete izvrsiti na slican nacin i tabulacijuE >rint ,OPoceta?Bt>a ra$ma?Bn Pa no<i red...BnO-; &azlo: sto morate kucati beksle] da bi ste odstam ali navodnike i :ornji zarez a i sam beksle] ce te i sami uvideti ako malo razmislite. &ecimo ako 9ocete da rikazete neki te=t od navodnicima na ekran a ako ne koristite beksle] na odredjenom mestu dobili bi ste :resku rilikom kom ajliranja. >rint ,Oo<o OneceO raditi...O-;
!o:ledajte rosledjeni ar:ument. On za ravo nije strin:1te=t3 vec se sastoji od strin:a <ovo <5 ne de7inisane reci " nece5 i jos jedno: strin:a < raditi...<. Da li smo to 9teliL #s ravna 7orma ovo:a ce iz:ledati ovakoE >rint ,Oo<o BOneceBO raditi...O-; Ovim ce mo i mi i kom ajler biti zadovoljni. !rovezbajte ove naredbe a krenite dalje sa ucenjem.
Ovo rikazivanje te=t na ekran je jednostavno uraditi ali stvari ostaju kom likovanije ako 9ocemo da rikazemo i vrednosti neki9 romenljivi9. ,intaksa 7unkcije rint7 je sledecaE printf( upravl!a#$i%niz%zna$ova& para"etar1&prara"etar2¶"etar' ) Objasni ce mo na sledecem rimeruE (' P./0.A1 >rint 1 '( 8inc!ude 9stdio.:; <oid main,<oid= int A = 10; !oat M = &7QW.4R12; >rint ,@Vrednost A je )dE do? je <rednost M ) C Jidljivo je da smo sada 7unkciji redali vise ar:umenata5 uku no 3. *nutar u ravljacno: niza se nalaze izmedju ostalo: i u ravljacki znaci5 Vd i V7. Ovi znaci ;:ovore< 7unkciji da na nji9ovom mestu treba da se nadje vrednost neke romenljive5 a koja je to romenljiva navodimo kao dodatni ar:ument5 u ovom slucaju to su romenljive ) i B. Dakle u ravljacki znaci su slicni komandnim sekvencama s tom razlikom sto komandne sekvence sluze za 7ormatiranje te=ta a u ravljacki znaci za rikazivanje vrednosti romenljivi9. Jerovatno ste se za itali zasto smo za rikazivanje vrednosti romenljive ) koristili u ravljacki znak Vd5 a za za rikazivanje vrednosti romenljive B V7. &azlo: je taj sto se ove romenljive razlikuju u ti u1 ) je ti a int dok je B 7loat3 a za svaki ti romenljive ostoje razliciti u ravljacki znaci5 kao sto je slucaj i sa komandnim sekvencama. +vo tabeleE -----------------------------------------------------------------------------I *. / I O is I -----------------------------------------------------------------------------I Vc I /a ti odatka 0H)& I -----------------------------------------------------------------------------I Vd5 Vi I /a ti odatka #$% I -----------------------------------------------------------------------------I V7 I /a ti odatka '(O)% I -----------------------------------------------------------------------------I Vl7 I /a ti odatka DO*B(+ I -----------------------------------------------------------------------------I Ve I !rikazuje broj u eks onencionalnom obliku I -----------------------------------------------------------------------------Bn@E AE M-;
* ravljacki znaci se ravilnije zovu ;s eci7ikatori konverzije celi9 brojeva<. &ekli smo jos ri ocetku da ostoji eks licitna i im licitna konverzija jedno: ti a romenljive u dru:i. +vo kako moze doci do in licitne konverzije1malo izmenjen kod ret9odno: rimera3E
(' P./0.A1 >rint 2 '( 8inc!ude 9stdio.:; <oid main,<oid= int A = 10; !oat M = &7QW.4R12; >rint ,@Vrednost A je )dE do? je <rednost M )d Bn@E AE M-; C !romena je izvrsena nad samo jednim znakom5 umesto V7 sada stoji Vd u u ravljackom nizu koji smo redali rint713-u. Ovim smo naveli da je ti dru:e romenljive #$% a on je u stvari '(O)% a ce doci do :ubitka reciznosti. ) zbo: ce:a ce se to do:oditi vec smo rekli u o:lavlju 3.3. # to je cela nauka vezana za 7unkciju rint7135 od esencijalne je vaznosti da ovo savladate kako treba jer je ovo veoma koriscena 7unkcija a i kasnije ce vam biti mno:o lakse da naucite i 7unkcije za uzimanje odataka1 scan713 3 od korisnika ro:rama.
!.3 unkcija scan'8: )ko ste s9vatili kako i zasto 7unkcionise rint7135 7unkciju za 7ormatirano uzimanje odataka ce te s9vatiti bez i najmanje oteskoca. ,intaksa ove 7unkcije jeE
s#anf( upravl!a#$i%niz%zna$ova& para"etar1&prara"etar2¶"etar' ) Dakle sintaksa je ot uno ista kao i kod rint7135 tako da je sve sto treba reci vec receno. # ak ostoji jedna mala razlika5 evo rimeraE (' P./0.A1 scan ,-1 '( 8inc!ude 9stdio.:; <oid main,<oid= int A; !oat M; ((u$mi >odat?e >rint ,@Gnesite <rednost A a $atim i >romen!ji<e M: @-; scan ,@)d ) @E HAE HM-; ((>ri?a$i re$u!tat >rint ,@Vrednost A je )dE do? je <rednost M ) C Bn@E AE M-;
0eo kod bi trebalo da vam je jasan sem naredbe u kojoj ozivamo 7unkciju scan713. 'unkciji smo rosledili u ravljacki niz @)d ) @ sto ce reci da korisnik treba da unese
vrednost ti a #$% a zatim i vrednost koja ima ti '(O)%. *nete vrednosti ce biti dodeljene romenljivim ) i B. !rimeti ce te da ored imena romenljive stoji znak am ersend1 U 3 koji u
stvari redstavlja o erator ;adresa-od<. Deteljnije ce mo :a objasniti u o:lavlju o okazivacima5 za sada treba da znate da smo :a stavili tu da bi omo:ucli 7unkciji scan713 da u ise vrednost koju uzme od korisnika u romenljive ) i B. Kako5 sta5 zastoL Kada smo :ovorili o 7unkcijama rekli smo da se lokalnim romenljivim moze ristu ati samo unutar bloka naredbi u kojem su iste deklarisane na rimer samo u 7unkciji u kojoj su te romenljive deklarisane i to je uradjeno bas zato da dru:e 7unkcije ne mo:u ristu ati ovim romenljivim i menjati nji9ovu vrednost. $o5 7unkcija scan713 mora da u ise vrednost u romenljive koje smo joj redali kao ar:umente a se mora nekako zaobici :ore navedeno onasanje. %o se ostvaruje omocu o eratora U jer mi kada koristio ovaj o erator5 u stvari ne rosledjujemo 7unkciji romenljivu vec njenu adresu u memoriji racunara a ce se u tu adresu u isivati odaci i samim ti menjati vrednost rosledjeno: ar:umenta. )ko niste razumeli o cemu je rec ne mari jer ce biti vise reci u o:lavlju o okazivacima5 za sada morate za amtiti da kod 7unkcije scan713 morate koristiti o erator U1 uz svako ime ar:umenata5 naravno3.
!.4 6ak"jucak
,ada znate kako da od korisnika uzimate i kako da korisniku rikazujete odatke koristeci rint713 i scan713. Dru:a 7unkcija je jako ; i ava< tj.u slucaju da vrednosti koje korisnik unosi nisu onakve kakve mi ocekujemo desice se vrlo ne rijatne stvari. /ato se scan713 koristi za ucitavanje azljivo sortirani9 odataka5 recimo iz neko: 7ajla. !rimeticete da nismo ni u jednom rimeru nit uzimali nit rikazivali vrednosti koje su ti a 0H)& ili strin:5 razlo: je sto je rvo otrebno da ovladate okazivacima i nizovima. !ostoje jos mno:e 7unkcije za u is i is is ali ce mo nji9 razmotriti tek osle sledece: o:lavlja.
svi9 romenljivi9 su staticne i ne mo:u se menjati. /atim omocu 7unkcije rint713 rikazujemo na ekran vrednost koju ime romenljiva B&OB5 u ovom slucaju je to 45. * sledecem rint713-u smo is red imena B&OB stavili o erator U sto znaci da necemo dobiti vrednost romenljive B&OB vec njenu adresu u memoriji. %akodje se iz rimera moze zakljuciti da su adrese celi brojevi1 #$%3. Ovaj rimer nije narocito korista ali je osluzio da objasnimo kako se dobijaju adrese romenljivi95 na dalje ce mo objasniti kako da i9 koristite za nesto ametno. Kao sto smo rekli5 okazivac ne moze da sadrzi vrednost vec moze samo da sadrzi adresu neke romenljive. # to :a cini osebnim ti om odatak jer ni jedan dru:i ti nemoze cuvati adrese. Bitno je da uvidite da za svaki ti romenljive1int5 7loat5 double...3 ostoji i okazivac na taj ti . Dakle okazivac na ti #$% ne moze sadrzati adresu romenljive koja je ti a '(O)%. +vo rimera deklaracije okazivacaE int 'P/T; ovo je okazivac. !rimecujete o erator G1 o erator osredno: ristu a3 on :ovori da zelimo da deklarisemo okazivac na ti #$%. Da nema o eratora G mi bi deklarisali klasicnu romenljivu ti a #$%. + sad imamo okazivac5 evo kako se on moze koristitiE int M./U; int 'P/T; P/T = HM./U; >rint ,@Vrednosti M./U je: )d@E 'P/Trve dve linije su jasne. %recom linijom smo okazivacu !OK dodelili adresu B&OB-a5 te sad reko okazivaca !OK mozemo iscitavati i u isivati neke vrednosti direktno u to mesto na memoriji. 0etvrtom linijom smo iscitavali vrednost. !rimecujete da smo stavili 'P/T 5 dakle o et smo koristili o erator G kao i kod deklaracije okazivaca. @edjutim znacenja ovo: o eratora je dvojako5 u zavisnosti u kom se kontekstu u otrebljava. &azmotrimo na sledeci nacim. )ko na isemo samo ime okazivaca1samo " !OK3 5 dobicemo adresu na koju on okazuje. )ko 9ocemo da okazivacu dodelimo neku dru:u adresu isacemo P/T = HneceIa i to bi trebalo da je jasno sada. +5 kada smo okazivacu dodelili da okazuje na adresu neke romenljive mi vrednosti na toj adresi mozemo da ristu amo. !a ako 9ocemo da dobijemo vrednost na toj adresi na koju okazivac okazuje stavicemo o erator G is red imena okazivacaE 'P/T . %o je u ravo ono sto smo uradili u oslednjoj liniji koda :ornje: rimera. @edjutim vrednost se moze i menjati ne samo citati omocu okazivaca5 rinci je slican. Da bi ste dodelili vrednost onome na sta okazivac okazuje na isacete E 'P/T = 1WQW; )ko i dalje ne s9vatate ovo evo jos jedno: rimeraE (' P./0.A1 P/TAFKVAPK51 '( 8inc!ude 9stdio.:; <oid main,<oid= ((de?!arise >romen!ji<u ti>a int int A; ((de?!arise >romen!ji<u ti>a >o?a$i<ac na int int 'P; ((dode!juje <rednost >romen!ji<i A A = 10; ((7ode!juje >o?a$i<acu P adresu od A P = HA; ((ne>osredno menja <rednost >romen!ji<e A A = 45R; ((Posredno menja <rednost >romen!ji<e A
'P = 123; ((ne>osredno cita <rednost >romen!ji<e A >rint ,@A je )d Bn@E A-; ((>osredno cita <rednost >romen!ji<e A >rint ,@A je )d Bn@E 'P-; C * ovoj liniji 'P = 123; smo osredno1 reko okazivaca3 smestili vrednost 123 u memoriju na koju je okaziva !. Ovo znaci da ce se i vrednost koju ima ) romeniti u 123 iz lo:icno: razlo:a5 omocu okazivaca smo i bez u otrebe romenljve ) mi njenu vrednost romenili tako sto smo u isali novu vrednost u adresu na memoriji koju koristi romenljiva ). Ovo je bitno uvideti da bi ste razumeli kako 7unkcionisu okazivaci. Bos jedna bitna stvar5 kako se onasaju o eratori 22 i " kada se koriste nad okazivacima. !a onasaju se ot uno isto. ,\ tim sto o eratori 22 i " imaju vece rvenstvo od o eratora G. ,to ce reci da ako imate komandu 'P%%;vi ce te inkrementirati1 ovecati za jedan3 adresu na koju okazuje okazivac !5 dok ako na isete ,'P-%%; vrednost u memoriji na koju okazuje okazivac ! ce biti inkrementirana a adresa na koju okazuje ! ostaje naravno ista. #.1.2 %okazivaci i 'unkcije &ekli smo dovoljno o ;dometu< romenljivi9 i izveli zakljucak su romenljive vidljive samo unutar bloka naredbi unutar koji9 su de7inisane n r. unutar tela neke 7unkcije. ,a dru:e strane imamo o:ranicenje u tome sto 7unkcije ne mo:u da vrate vise od jedne vrednosti a takodje i ne mo:u da menjaju vrednosti romenljivi9 koje su deklarisane unutar dru:i9 7unkcija jer i9 ;ne vide<. Ovo se moze romeniti koriscenjem okazivaca za arametre 7unkcija. +vo rimera jedne takve 7unkcijeE int test, int 'aE int 'b = 'a = 7QW; 'b = 45R; C ) evo kako bi iz:ledala 7unkcija koja oziva 7unkciju test E <oid main,<oid= int e = 23Er = 10; test, HeE Hr-; ((>ri?a$i <rednost >rint ,O3 je )dE . je )d BnOE eEr-; C $a ekran ce se is isati N3 je 7QWE . je 45R O sto znaci da smo iz 7unkcije test13 us eli da romenimo vrednosti romenljivim koje su de7inisane unutar 7unkcije main13. %o smo us eli jer smo 7unkciji test rosledili kao ar:ument ne vrednosti koje imaju e i r vec nji9ove adrese. /atim smo u telu 7unkcije test13 omocu okazivaca romenili vrednost koja se nalazi u delu memorije koju koriste romenljive e i r . Ove dve romenljive i dalje nisu vidljive unutar 7unkcije test13 ali smo obezbedili nji9ove adrese i omocu nji9 smo u mo:ucnosti da menjamo nji9ove vrednosti. !o ovom rinci u radi i 7unkcija scan713 tako da sada znate zasto smo joj rosledjivali adrese romenljivi9 a ne same romenljive dakle da bi joj omo:ucili da odatke koje uzme od korisnika u ise u te romenljive koje smo joj rosledili.
#.2. Nizovi $izovi su niz romenljivi9 isto: ti a koje su kontinualno na ravljene u memoriji. )ko 9ocemo da na ravimo jednu romenljivu ti a #$% isemoE int broj; ) sta ako 9ocemo da na ravimo et romenljivi95 da u nji9 smestimo odredjene vrednosti i da te vrednosti medjusobno saberemoL Dosadasnja metoda deklarisanja romenljvi9 bi za9tevala da romenljive imaju razlicita imena i kod bi bio dosta dosadan i ne otrebno du:5 medjutim stvari ostaju vidno lakse sa koriscenjem nizova. +vo kako se moze deklarisati niz od 1C romenljivi9 ti a #$%E int brojX10Y; *:laste za:rade1 QR 3 ukazuju da se radi o nizu a ne o samo jednoj romenljivoj. %ako sada imamo romenljivu brojX5YE brojX2YE brojX7Y ... dakle broj mora imati inde=. #nde= je broj unutar u:lasti9 za:rada. # ak navedenom deklaracijom nismo na ravili romenljivu broj sa inde=om 1C 1 dakle ne ostoji brojQ1CR 3. &azlo: ovome je taj sto inde= rvo: broja nije 15 vec C1 nula3 . %ako da mi imamo sada brojX0Y brojX1Y brojX3Y brojX4Y .... brojXWY. Bos samo jednu stvar treba da znate5 ako na isemo samo broj dakle bez ikakvo: inde=a to ce imati isti e7ekat kao da smo na isali brojX0YE dakle ristu amo rvoj romenljivoj niza. Kao sto mozete da inicijalizujete vrednosti ;obicni9< romenljivi9 tako mozete inicializovati i vrednosti nizovski9 romenljivi9. &azmotrimo sledci rimerE int brojX4Y = = 4R7WE 1E &3555E &Q C; %ako se inicializuju nizovske romenljive. brojX0Y ce imati vrednost 4.>F5 brojX2Y ce biti -3555 idt... Obavezni ste da stavite viticaste za:rade1 Z[ 3. &ecimo da imate niz od 1C elemenata i svaki element zelite da inicijalizujete vrednoscu C. $ema otrebe da navodite deset nula unutar viticasti9 za:rada5 ovaj sistem je mno:o ele:antnijiE int brojX10Y = = 0 C; ,vi elementi niza bice inicializovani vrednoscu nula. ,ledi ro:ram koji resava roblem koji smo naveli na ocetku o:lavljaE (' P./0.A1 NKF/VK51 '( 8inc!ude 9stdio.:; <oid main,<oid= ((de?!aracija ni$a !oat brojX5Y; doub!e re$ = 0; int i; ((>omocna >romen!ji<a ((u$mi >odat?e i smesti i: u broj or,i=0; i 9 5; i%%= >rint ,@Gnesite broj )d : @E i%1-; scan ,@) @E HbrojXiY -; C ((saberi or,i = 4; i%1 ; i&&re$ %= brojXiY; ((>ri?a$i re$u!tat >rint ,@Fbir uneseni: broje<a je )! C Bn@E re$-;
#ako bi trebalo sve da je jasno ovaj cemo rimer detaljno objasniti. $o ako vam je jasno sledeci deo te=ta mozete reskociti. !rva linija koda je komentar. * dru:oj liniji smo omocu direktive 8inc!ude ukljucili stdio.: 5 9eader 7ajl standardne biblioteke jezika 0. Ovo smo uradili jer su u tom 9eaderu de7inisane 7unkcije scan713 i rint713 koje su nam otrebe za izradu ro:rama. /atim sledi 7unkcija main13. Ona redstavlja olaznu tacku svako: ro:rama5 te je svaki ro:rama mora imati. !rva stvar koju radimo unutar tela main13-a je deklaracija romenljivi9 koje ce nam kasnije trebati. Bitno je uvideti da romenljive moraju biti de7inisane na samom ocetku bloka naredbi5 dakle re bilo koji9 dru:i9 naredbi. !romenljiva broj je ti a 7loat i ona je niz od uku no 5 elemenata1 rvi element se nalazi na inde=u C a osledji na inde=u 43. $ailazimo na etlju 7or. !rvom naredbom1 i H C 3 ostavljamo vrednost romenljive i na nulu. Dru:a naredba retstavlja uslov da bi se etlja onavljala. %reca naredba se kao i dru:a5 izvrsava ri svakom onavljanju tela etlje i njom inkrementiramo ;i<. * telu etlje nalaze se dve naredbe5 rvom kazujemo korisniku sta treba da unese dok dru:om ri9vatamo odatke koje ce korisnik uneti. &azmotrimo ovu naredbuE >rint ,@Gnesite broj )d : @E i%1-; Kao dru:i ar:ument smo redali i % 1. @ozda cete omisliti da smo na ovaj nacin ovecali vrednost romenljive i ali u tom slucaju cete se revariti. ,istem ce kreirati omocnu romenljivu i dodeliti joj vrednosti zbira ovi9 o eranada a zatim ce tu romenljivu redati 7unkciji5 dok vrednost romenljive ;i< ostaje ista1 o:ledajte odeljak 3.3 ako vam ovo nije jasno3. ,ledi jos jedna etlja 7or5 ovo:a uta njena ulo:a je da sabere sve elemente niza bromenljive broj. $aredbe unutar mali9 za:rada su namerno malo zakom likovane. $aime romenljivoj ;i< dodeljena je vrednost 45 dok je u rvoj etlji dobila vrednost C. Oba su nacina is ravna ali o:ledajmo sledecu naredbu5 naredbu uslova. * njoj stoji samo ; i 2 1 <. !odsetimo se da je vrednost nula znaci da uslov etlje nije is unjen a da svaka dru:a vrednost znaci is unjenost uslova. ,amim tim ovo ce raditi. @edjutim ono ; 2 1< stoji zato sto 5da :a nema etlja bi se izvrsila 4 uta. @alo je teze ratiti ovakve stvari zato je bolje ridrzavati se ;standarda< iz rve 7or etlje. *vidjate da dru:a etlja 7or nema viticaste za:rade1telo3. $ema i9 jer joj nisu otrebne osto celo telo etlje ima samo jednu naredbu. $a kraju5 is isujemo rezultat koristeci 7unkciju rint713. #.3 %romen"jive tipa c@ar 1na omenaE u ovom odeljku su stvari rikazivane malo slikovito zbo: lakse: razumevanja 3 09ar je ti romenljive koji moze da cuva samo jedan simbol1znak5 slova5 broj...3. \n\ je simbol5 reciznije slovo. $a dru:oj strani ;n< je niz simbola. /astoL *skoro cete saznati5 za sada je bitno da uvidite da se simbol stavlja od jednostruke navodnike1 \ \ 3 a niz simbola1strin:3 od re:ularne navodnike1 < < 3. &azmotrimo inicializacijuE c:ar s!o<o = ZaZ; $a rvi o:led5 slovo ce sadrzati vrednost \a\. $ije bas tako. !romenljive koje su ti a c9ar mo:u da cuvaju samo brojeve5 kao i int5 ali osto c9ar ima samo jedan bajt najveca vrednost koju moze cuvati je 255. Kako onda romenljivoj c9ar mozemo dodeliti neki simbol kada unau stvari cuva brojeveL !ostoji ;tabela< u kojoj se nalaze simboli1uku no 255 nji93 i svaki simbol ima svoj redni broj. @i mozemo roslediti decimalni broj1 a on se nalazi u ras onu od C do 2553 tabeli i kao rezultat cemo dobiti simbol koji je od tim rednim brojem. !rimera radi5 simbol \a\ ima vrednost F> u toj tabeli a ce romenljiva slovo iz :ornje: rimera cuvati vrednost od F> a ne sam simbol. Odavde se da zakljuciti da je slovo mo:lo biti i ti a int. ,ledi ro:ram koji ce na ekran1tacnije na konzolu3 is isati sve simbole i nji9ove redne brojeveE (' P./0.A1 TAM34A5JK1M/4A '( 8inc!ude 9stdio.:;
<oid main,<oid= int simb; or,simb = 0; simb 9 255; simb%%>rint ,@)d )c Bn@E simbE ,c:ar-simb-;
Obratimo aznju na red koji sadrzi 7unkciju ront713. !rvo se rikazuje decimalna vrednost romenljive simb5 i tu je sve jasno. /atim smo koristeci u ravljacko: znaka Vc rekli da na tom mestu treba da se is ise neki znak. %o :ovori 7unkciji da umesto decimalne vrednosti koju bude dobila treba da is ise od:ovarajuci simbol iz tabele. Kao treci ar:ument smo naveli ,c:ar-simb .Ovde smo izvrsili eks licitnu konverziju1 objasnjeno u odeljku 3.33 ali to nam i nije bilo otrebno jer ce 7unkcija rint713 sama izvrsiti konverziju1in licitnu3 iz razlo:a sto ona kao treci ar:ument ocekuje romenljivu ti a c9ar a ne ti a int. @ali detaljE Do sada ste za relazak u novi red koristili \Yn\. !okrenite onovo :ornji ro:ram i obratite aznju na simbol od rednim brojem deset. $ema nista5 a is od nje:a je razan red. &azlo: ovome je taj sto se od rednim brojem 1C nalazi u ravo znak za novi red- \Yn\. #.4 Niz promen"jivi@ tipa c@ar !o:ledajmo nacine na koje mozemo deklarisati i inicializovati ovu vrstu romenljivi9E c:ar T3JTXY = Oto"iO; c:ar T3JTXY = = ZtZE ZoZE Z"ZE ZiZ C; Bitno je znati da samo ime nizovske romenljive retstavlja konstantni okazivac na rvi element to: niza. ,to ce reci da cemo ako na isemoE T3JT; ili UtestX0Y; dobiti istu stvar- adresu rvo: elementa niza. ,ta mislite koliko %+,%5 u :ornjem rimeru ima elemenataL )ko i9 rebroite naicice te na broj 4. # ak5 %+,% ima 5 elemenata. Da bi rikazali vrednost %+,%-a na isacemo ovu naredbuE >rint ,O)s OE T3JT-; Koristili smo u ravljacki znak Vs kojim si:naliziramo da zelimo rikazati strin:1niz c9ar-ova3. 'unkciji rint713 smo redali adresu rvo: elementa niza1 jer smo jos redaliE %+,% 5 sto je adresa rvo: elementa to: niza3. !rint713 rikazuje element o element... Kako ce znati kada je kraj nizaL Da bi to omo:ucili5 na kraj svako: strin:a se dodaje jos jedan znak " \YC\ 1 kosa crta unazad i nula3 koji dakle si:nalizira kraj strin:a. ,ada treba da vam je jasno zasto u :ornjem rimeru %+,% ima 5 a ne 4 elementa. # to je veoma bitna stvarD Da bi utvrdili nauceno5 na isacemo dva mala ro:ramaE (' P./0.A1 V3FMA51 '( 8inc!ude 9stdio.:; <oid = C <oid main,<oid= int broj = 7; >rint ,@Vrednosti M./U >re >o$i<a unc,- je )d Bn@E broj-; unc,broj-; >rint ,@Vrednosti M./U >os!e >o$i<a unc,- je )d Bn@E broj-; unc,int aa = 123;
%rebalo bi da vam je jasno zasto ce vrednost romenljive broj ostati ista i osle oziva 7unkcije 7unc13. Dru:i ro:ram je ovajE (' P./0.A1 V3FMA52 '( 8inc!ude 9stdio.:; 8inc!ude9strinI.:; <oid = C unc,c:ar aXYstrc>#,aE @no<a5<rednost@-;
<oid main,<oid= c:ar brojX20Y = @todic@; >rint ,@Vrednosti M./U >re >o$i<a unc,- je )s Bn@E broj-; unc,broj-; >rint ,@Vrednosti M./U >os!e >o$i<a unc,- je )s Bn@E broj-; C Jrednost je romenjena5 zato sto smo 7unkcije 7unc13 redali samo ime romenljive broj dakle adresu rvo: elementa. ,amim tim 7unc13 je u mo:ucnosti da menja vrednost broj-a 1zasto je to tako vec smo :ovorili tako da bi trebalo da vam je to jasno3. Obratimo aznju na to da smo ukljucili jos jedan 9eader 7ajl- strin:.9 . Ovo smo uradili jer nam je bila otrebna 7unkcija strc M13 " ona sluzi za dodeljivanje jedno: strin:a dru:om. !a]^e vam na amet da smo mo:li da na i]emoE a = Ono<a5<rednostO; @edjutim to nije omo:uceno a se za dodavanje nove vrednosti strin:u koristi 7unkcija strc M13. O ovim 7unkcijama cemo :ovoriti u narednim o:lavljima. /a kraj cemo jos jednom na omenuti da je veoma vazno da za niz c9ar-ova izdvojite dovoljno mesta u memoriji5 dakle o:romna je :reska na isatiE c:ar imeX5Y; strc>#,imeE OPera 7et!icO-; *vek obratite aznju na ovoD
&.1 S1)0N5.$aredbom 8inc!ude9strinI.:; u ro:ram ukljucujemo 7ajl strin:.9 u kojem su de7inisane razne 7unkcije za naratanje sa strin:ovima. &.1.2 unkcije za kopiranje stringova strc M13E c:ar' strc>#,c:ar 'E const c:ar '-; Ova je 7unkcija ranije ominjana i sluzi za dodeljivanje jedno: strin:a dru:om. Kao sto se iz date deklaracije vidi5 ona uzima dva ar:umentaE okazivac na ti c9ar i constantni okazivac na ti c9ar. !ovratni ti ove 7unkcije je takodje okazivac na ti c9ar. Da biste utvrdili znanje o ti u odataka c9ar i strin:1niz c9ar-ova35 zadrzacemo se malo vise na ovoj 7unkciji- na isacemo kako iz:leda njena de7inicija i zatim je roanalizirati. #zvedba 7unkcije strc M13E (' P./0.A1 JT.PP+,-1 '( 8inc!ude 9stdio.:; <oid ?o>iraj,c:ar 'odrE const c:ar 'i$<= D:i!e,'i$< A= [B0[ ',odr%%- = ',i$<%%-; 'odr = [B0[; C
<oid main,<oid= ((de?!aracija >romen!ji<i: c:ar rec1X50YE rec2X50Y; ((u$mi strinI od ?orisni?a >rint ,@Gnesi recenicu&; @-; scan ,@)s@E rec1-; ((?o>iraj ?o>iraj,rec2E rec1-; ((>ri?a$i re$u!tat ?o>iranja >rint ,@.ec2 ima <rednost&; )s.Bn@E rec2-; C !rvo5 da bi smo koliko-toliko u rostili 7unkciju strc M13 stavili smo da njen ovratni ti bude void a ne c9arG. $asu 7unkciju za ko iranje smo nazvali ko iraj13 a arametri su ostali isti kao i kod strc M13. @ozda neuvidjate razlo: zasto je dru:i ar:ument constantan. Od:ovor lezi u tome cemu je 7unkcija namenjena- ko iranju dru:o: ar:umenta 5koji joj rosledimo5 u rvi. %o znaci da ce se vrednost rvo: ar:umenta5 koji smo nazvali OD&5 menjati dok vrednost dru:o: ar:umenta treba da ostane ista. Da bi smo se ;obavezali< da necemo menjati vrednosti
dru:o: ar:umenta stavili smo kljucnu rec const i zbo: to:a necemo moci da menjamo vrednost dru:om ar:umentu1koji smo u :ornjem rimeru nazvali #/J3. !rva naredba u telu 7unkcije je etlja 89ile. Ona ce se ;vrteti< dok :od znak na koji okazuje okazivac #/J ne bude \YC\. Kao sto smo ranije rekli simbol \YC\ retstavlja simbol za kraj strin:a. %elo etlje se sastoji od samo jedne naredbeE ',odr%%- = ',i$<%%-; a samim tim viticaste za:rade nije otrebno stavljati5 ali naravno ne skodi staviti i9. ,ta radi naredba ',odr%%- = ',i$<%%-; S $jom znak1element niza3 na koji okazuje #/J dodeljujemo onom elementu niza na koji okazuje OD&5 i tako vrsimo ko iranje. %akodje smo koristili o erator inkrementiranja1223 da bi5 o zavrsetku naredbe5 odesili okazivace da okazuju na sledeci element niza. * jednom trenutku #/J ce okazivati na \YC\ sto znaci da smo dosli do kraja strin:a koji treba da ko iramo a samim tim uslov 'i$< A= ZB0Z nece biti is unjen i etlja se nece vise izvrsavati. /atim nam ostaje samo da dodelimo \YC\ elementu na koji okazuje OD& jer isti nije bio dodat u toku izvrsavanja etlje5 a zasto je to tako trebalo bi da vam je jasno. strnc>#,c:ar' strnc>#, c:ar'E const c:ar'E si$e5t *lo:a ove 7unkcije je da u rvi ar:ument ko ira onoliko znakova dru:o: ar:umenta koliko je navedeno trecim ar:umentom. Dru:im recima strnc M13 ko ira samo jedan5 ocetni deo strin:a1znakovno: niza3. !rimer koriscenja ove 7unkcijeE (' P./0.A1 JT.NPP+1 '( 8inc!ude 9stdio.:; 8inc!ude 9strinI.:; <oid main,<oid= ((de?!aracija >romen!ji<i: c:ar rec1X50YE rec2X50Y; ((dode!i <rednost >romen!ji<oj rec1 strc>#,rec1E @tri<ija!ni te?st@-; ((?o>iraj >r<i: Q e!emenata strinIa rec1 u strinI rec2 strnc>#,rec2E rec1E Q-; rec2XQY = [B0[; >rint ,@.ec2 je &; )s.Bn@E rec2-; C Obratite aznju da smo na isali rec2XQY = [B0[; razlo: je taj sto 7unkcija strnc M135 za razliku od strc M135 ne dodaje znak za kraj strin:a a :a moramo izricito dodati. Bedna na omena5 treci ar:ument ove 7unkcije je ti a sizeNt. Ovaj ti odatka ne moze cuvati ne:ativne brojeve samo ozitivne1 isto onasanje is oljava i ti unsi:ned int3. %o je ovde vrlo lo:icno koristiti jer kako moze da broj elemenata bude ne:ativanL $emoze5 naravno. &.1.3 unkcije nadovezivanja strcat,c:ar' strcat, c:ar'E const c:ar'-; strncat,c:ar' strncat, c:ar'E const c:ar'E si$e5t-;
!rva 7unkcija sluzi za nadovezivanje jedno: strin:a na dru:i. &ecimo da imate jedan strin: ;todic< i jos jedan strin: ; nemanja<5 ako 9ocete da i9 s ojite u jedan strin: koristicete 7unkciju strcat13. ,ledi rimer za koriscenje ove 7unkcijeE (' P./0.A1 JT.PAT1 '( 8inc!ude 9stdio.:; 8inc!ude 9strinI.:; <oid main,<oid= ((de?!aracija >romen!ji<i: c:ar rec1X50Y; ((dode!i <rednost >romen!ji<oj rec1 strc>#,rec1E @tri<ija!ni te?st.@-; ((dodaj jos te?sta >romen!ji<oj rec1 strncat,rec1E @ K jos jedanA@-; >rint ,@.ec1 je &; )sBn@E rec1-; C Ovde je sve jasno. Koriscenje 7unkcije strncat13 je slicno kao kod strnc M135 dakle rvi ar:ument se ; ovecava< za jedan5 ocetni deo dru:o: ar:umenta. Koliki je taj dru:i deo odredjuje se trecim ar:umentom. %akodje cete morati sami da dodate simbol \YC\ rvom ar:umentu. &.1.4 'unkcije poredjenja strcm>,int strcm>, const c:ar'E const c:ar'-; strncm>,int strncm>, const c:ar'E const c:ar'-; !omocu ovi9 7unkcija mozete roveriti da li su strin:ovi indenticni. )ko strin:ovi jesu isti 7unkcija vraca vrednost nulu5 a ako su razliciti jedinicu ili neki dru:i broj razlicit od nule. !rimerE (' P./0.A1 JT.P1P1 '( 8inc!ude 9stdio.:; 8inc!ude 9strinI.:; <oid main,<oid= ((de?!aracija >romen!ji<i: c:ar rec1X50YE rec2X50Y; ((dode!i <rednost >romen!ji<im >rint ,@Gnesite d<e reci&; @-; scan ,@)s )s@E rec1E rec2-; ((u>oredi te?st i , strcm>,rec2E rec2- >rint ,@.eci su ra$!iciteA@-;
'unkcijom strncm 13 mo:uce je orediti samo ar elemenata sa ocetka nizova. Koliko elemenata ce biti oredjeno se odredjuje trecim ar:umentom. Bos jednu 7unkciju iz strin:.9 cemo objasniti. %o je strlen13. Ova 7unkcija vraca duzinu znakovno: niza koji joj rosledimo. )ko imamoE c:ar recX50Y = One?i strinI...O; >rint , O7u$ina o<oI strinIa je )d. BnOE str!en, rec--;
$a ekran1 ravilnije receno na konzolu3 cese is isati koliko elemenata ima ovaj strin:.
&.2 D31-.* ovom 9eader 7ajlu de7inisane su razne 7unkcije za rad sa brojevima kao sto su korenovanje5 dobijanje sinusa5 kosinusa idr. Objasnicemo samo ar najosnovniji9 jer zaista matematika smara. &.2.1 1rigonometrijske 'unkcije /a dobijanje sinusa koristite 7unkciju sin13. /a dobijanje kosinusa cos13 a za dobijanje tak:ensa tan13. ,ve ove 7unkcije kao jedini ar:ument uzimaju romenljive ti a double. &.2.2 Stepenovanje vrednosti /a ste enovanje vrednosti koristite 7unkciju doub!e >oD, doub!eE doub!e-. Kao sto se vidi o813 uzima dva ar:umenta od ce:a je rvi broj koji treba ste enovati a dru:i ar:ument je eks onent tj.broj kojim se ste enuje. )ko na isemo o811C533 kao ovratnu vrednost dobicemo 1CCC. /a dobijanje kvadratno: korena neko: broja koristi se s`rt13. Ona vraca vrednost ti a double a mana joj je sto nemoze vaditi na rimer treci ili cetvrti koren vec samo dru:i1kvadratni3. &.2.3 6aokruzivanje na ce"obrojnu vrednost Objasnicemo 4 7unkcijeE doub!e abs, doub!e-; ,luzi za dobijanje a solutne vrednosti broja1 dakle vraca uvek ozitivnu vrednost3 doub!e mod,doub!eE doub!e-; O erator ostatka1 V 3 nemoze se rimenjivati na realne vec samo na cele brojeve. !omocu ove 7unkcije to se o:ranicenje revazilazi. doub!e cei!, doub!e-; !rosledjeni ar:ument ova 7unkcija zaokruzuje na najblizu vecu celobrojnu vrednost. $a rimer ako rosledite broj 1C.C1 7unkciji ceil135 ona ce vam vratiti broj 11. doub!e !oor, doub!e-; &adi ot uno isto kao i ceil13 s\tom razlikom sto rosledjeni ar:ument zaokruzuje na najblizu manju vrednosti. %ako da ako na iseteE int "; doub!e + = 4.7R445Q; " = !oor,+-; O ce imati vrednost 4.
!rimecuje se nedostatak 7unkcije koja bi zaokruzivala vrednosti romenljivi9 na najblizu celobrojnu vrednost. Dakle ako imate 4.> ili 4.5 ili 4.F5 da broj bude zaokruzen automatski na 5 a ako imamo 4.2 ili 4.4FFF ili 4.CC15 da broj bude zaokruzen na 4 stim da u oba slucaja ozivate jednu 7unkciju osto neznate dali treba ozvati 7loor13 ili ceil13 1 recimo da korisnik zadaje broj koji treba zaokruziti- kako ce te onda znati koju 7unkciju da ozoveteL3. ,a ovim roblemom sam se susreo rilikom isanja ro:rama koji treba da od rosecne ocene koju ucenik ima izvede zakljucnu ocenu1koja dakle mora biti zaokruzena vrednost3. +vo kako iz:leda ;interesantno< resenjeE int Peo,doub!e "= i , ," & !oor,"-- 9 0.5 return ,int- !oor,"-; return ,int-cei!,"-; C !re orucujem da analizirate kod i s9vatite kako radi. $aravno5 ostoji jos nacina da se ovaj roblem resi. &.3 71E%4.* ovom 9eader 7ajlu su 7unkcije za baratanje sa simbolima1 c9ar-ovima35 za razliku od strin:.9 u kom se nalaze 7unkcije za nizove c9ar-ova1strin:ova3. -lavna rimena ovi9 7unkcija je kod obrade odataka koji su za isani u 7ajlovima a o tome ce kasnije biti reci. &.3.1 %ripadnost simbo"a grupi ,imbol moze biti broj5 slovo5 znak razmaka ili neki dru:i znak. ,ledece 7unkcije vracaju vrednost 1 da bi si:nalizirale tacnost a nulu za netacnostE int isa!>:a, int-; 'unkcija roverava da li je rosledjeni znak slovo i ako jeste vraca vrednost 1. +vo jedno: rimeraE 8inc!ude 9stdio.:; 8inc!ude 9ct#>e.:; <oid main,<oid= c:ar a = ZrZ; i , isa!>:a,a- >rint ,@)c je s!o<oABn@E a-; e!se >rint ,@)c nije s!o<oABn@E a-; C * ovom slucaju oruka koja ce biti is isana je da \r\ jeste slovo. # to je lo:icno ali sta bi bilo is isano da umesto c:ar a = ZrZ; stoji c:ar a = 144; S )ko ste omislili da ce se is isati da ;nije slovo< :rdno ste se resli. ,etite se o:lavlja >.3 u kojem smo rekli da niti jedan ti odatka nemoze sadrzati znakove vec samo broja a da ostoji tabela u kojoj svaki simbol1znak3 ima svoj redni broj reko ko:a mu se ristu a. @i bi smo dakle romenljivoj ) dodelili vrednost 144 sto znaci da ce ) sadrzati taj broj. * o:lavlju >.3 smo na isali ro:ram koji nam is isuje tabelu simbola i od kojim se rednim brojem ti simboli nalaze5 o:ledajte sta je od rednim brojem 144. ,lovo \r\D )ko vam razlo: ovom onasanju nije jasan rocitajte o:lavlje >.3 jos jednom.
int isdiIit, int-; 'unkcija radi ot uno isto kao i isal 9a13 s\ tom razlikom sto roverava dali je rosledjeni ar:ument broj ili ne. )ko jeste broj 7unkcija vraca vrednost 15 u su rotnom vraca C. int isa!num, int-; *koliko je rosledjeni ar:ument slovo ili broj5 7unkcija vraca vrednost 1 a u su rotnom C. int iss>ace, int-; !omocu iss ace13 vrsimo roveravanje dali je rosledjeni ar:ument neki od znakova razmaka. /nakom razmaka se smatrajuE novi red1 \Yn\35 razmak1 \ \3 i tabulacija1 \Yt\3. )ko ar:ument jeste znak razmaka vraca se vrednost 1 u su rotnom dobicemo nulu. &.3.2 Odredjivanje i menjanje ve"icine s"ova 0etri su bite 7unkcijeE int is!oDer, int-; !roverava dali je rosledjeni ar:ument malo slovo5 ako jeste vraca rezultat 1 ako nije vraca nulu. int isu>>er, int-; !roverava dali je rosledjeni ar:ument veliko slovo. Jraca vrednost 1 ako jeste i C ako nije. int to!oDer, int-; Jrednost koju vraca ova 7unkcija je ;smanjeno< slovo. !rimer koriscenjaE c:ar s!o<o = ZTZ; s!o<o = to!oDer,s!o<o-; sada ce romenljiva ,(OJO sadrzati znak \t\1 ravilije bi bilo reci < ,(OJO ce sadrzati redni broj znaka \t\ < ali ovo zvuci :lu avo i :lomazno a se i ne koristi3. int tou>>er, int-; #sta stvar kao i tolo8er13 uz razliko sto slovo biva ; ovecano<.
(' P./0.A1 K135K5P.3FK13 '( 8inc!ude 9stdio.:; 8inc!ude 9ct#>e.:; 8inc!ude9strinI.:; ((>rototi> un?cije int 1a!aJ!o<a,c:ar 'te"t-; <oid main,<oid= ((de?!aracija int du$ina = 0; int i=0E n; static c:ar >omX50YEimeX25YE >re$imeX25Y; ((tra$i ime i >re$ime do? Iod nebudu unesena ma!im s!o<ima do = >rint ,@Gnesite <ase ime i >re$ime ma!im s!o<ima&; @-; Iets,>om-; CD:i!e,1a!aJ!o<a,>om--; (' Pode!i P/1 na K13 i P.3FK13 '( ((>res?oci ra$ma?e sa >ocet?a a?o i: ima D:i!e, iss>ace, >omXiY- - %%i; ((sada P/1XiY >o?a$uje na >r<o s!o<o imenaE @u<ecaj@ s!o<o >omXiY = tou>>er,>omXiY-; ((tra$i ?raj imena, do >r<oI ra$ma?a- i ?o>iraj <rednost u K13 D:i!e, Aiss>ace,>omXiY- - %%i; strnc>#,imeE >omE i-; imeXiY = [B0[; ((>ro>ust1 ((>res?oci s<e ra$ma?e i$medju imena i >re$imena D:i!e, iss>ace, >omXiY- - i%%; ((>o<ecaj >r<o s!o<o >re$imena >omXiY = tou>>er,>omXiY-; ((?o>iraj >re$ime u >romen!ji<u P.3FK13 or,n=0; Aiss>ace,>omXiY- HH >omXiY A= [B0[; %%i>re$imeXn%%Y = >omXiY; >re$imeXnY = [B0[; ((>ri?a$i re$u!tat >rint ,@Vase ime je: )sE a >re$ime )s.Bn@E imeE >re$ime-; C ((de inicija &je 1a!aJ!o<a,-
int 1a!aJ!o<a,c:ar 'te"t= or,; 'te"t A= [B0[; %%te"t i , Ais!oDer,'te"t- HH Aiss>ace,'te"t- - return 1; return 0; C Ovaj kod namerno necemo komentarisati i objasnjavati. &eci cemo samo da sve sto treba da znate da bi razumeli ovaj ro:ram ste vec imali riliku da naucite u ovom tutrialu5 i jos jednu stvarE Kod je namerno ;neusavrsen<5 na vama je da eventualne ro uste is ravite i da ceo kod oboljsate koliko je to mo:uce. Bice vam odlicna vezba. !ri tom obratite aznju na liniju koda u kojoj stoji komentar ;((>ro>ust1O 5 u romenljivu #@+ bice u isani i eventualni razmaci1ako i9 je korisnik uneo3. $a isite 7unkciju koja ce se ozivati u sledecoj liniji koda da is raviti ovaj ro ust ;brisuci< ne otrebne znake razmaka. ,recnoD
da bi se smestilo 5C c9ar-ova u memoriju. Dru:im recima5 ako zelimo da rezervisemo memoriju za n r. 1C romenljivi9 ti a #$%5 ne mozemo 7unkciji malloc13 redati vrednost 1C. &azlo: je taj sto bi smo na taj nacin trazili od 7unkcije da rezervise 1C bajtova a ne 1C uta o onaj broj bajtova koji zauzima ti #$%. !a zato moramo da na isemoE si$eo ,int- ' 10 Dakle ovo :ovori revodiocu1kom ajleru3 ;izracunaj koliko bajtova zauzima ti #$% a zatim taj broj omnozi sa 4< i time cemo dobiti broj bajtova koji nam je otreban da bi smestili 1C #$%ova u memoriju racunara. Kada je otrebna kolicina memorije rezervisana1 alocirana3 7unkcija malloc13 nam vraca adresu te memorije i mi je u :ornjem rimeru dodeljujemo okazivacu %+O%. /atim u isujemo vrednosti u alociranu memoriju omocu 7unkcije strc M135 da bi na kraju i iscutavali vrednost iz te memorije. /akljucak je da se sa dinamicki zauzetom memorijom moze baratati kao i sa ;normalno< zauzetom memorijom1 memorija koja je zauzeta ravljenjem obicni9 romenljivi93. ,ad bi trebalo da vam je jasno zasto i kako ovo radi. Ostaje da se vidi zasto bi uo ste koristili dinamicko alociranje. &azlo:a je vise a ako se budete osvetili ro:ramiranju nesto ;dublje< i sami cete i9 zakljuciti. Ba cu reci samo jedan od nji9- kom aktnije iskoriscenje memorije. #macemo jedan rimer sa ovakvim ristu om ali re to:a morate da znate jos 1samo3 sta je realokacija i ;curenje memorije<. 0urnje memorije je jedina losa stvar kod dinamicko: u ravljanja memorijom. ,ledi rimer o ovome. (' P./0.A1 131/.KUA52 '( 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; 8inc!ude 9strinI.:; <oid main,<oid= ((de?!aracija c:ar 'te"t; ((a!ociranje memorije te"t = ma!!oc, si$eo ,c:ar- ' 50-; ((u>isi ne?u <rednost u memoriju na ?oju >o?a$uje T3*T strc>#,te"tE @jos jedna tri<ija!na >oru?aA@-; ((sad cemo se ma!o&mnoIo >re<ariti te"t = ma!!oc, si$eo ,c:ar- ' 20-; ((>ri?a$i <rednost >rint ,@T3*T&; )sBn@E te"t-; C * odnosu na rosli ro:ram5 ovaj smo ovecali za samo dve linije koda5 i to oveE ((sad cemo se ma!o&mnoIo >re<ariti te"t = ma!!oc, si$eo ,c:ar- ' 20-; $a asalis smo na curenje memorijeD +vo i zastoE rvo smo ri ocetku ro:rama alocirali jedan blok memorije i na taj blok memorije je okazivao samo okazivac %+O%. ,ada smo alocirali jos jedan blok memorije1 koji je nesto manji od ret9odno: zauzima mesto za 2C c9ar-ova5 ali to uo ste nije bitno3 i adresu to: bloka dodelili o et okazivacu %+O%. Ovo radi i
sa te strane je sve OK. @edjutim5 na rvi blok memorije koju smo zauzeli sada vise ni jedan okazivac ne okazuje5 tako da joj vise nemozemo ristu iti. %akva memorija je ; rocurela< memorija i ona je stetna jer zauzima jedan deo memorije racunara a nicemu ne sluzi. * ovom rimeru to i nije tako o asno jer je to mala kolicina memorije ali sta da je do ;curenja< doslo u nekoj 7unkciji koja se u toku rada ro:rama oziva nekoliko 9iljda utaL !ro:ram bi ; ojeo< svu ras olozivu memoriju racunaraD &esenje ovo:a roblema lezu u ravovremenom oslobadjanju memorije koja nam vise nece biti otrebna. Oslobadjanje memorije vrsi se omocu 7unkcije 7ree13. $jeno koriscenje je krajnje jednostavno- dovoljno je da joj redate okazivac na memoriju koju treba osloboditi1dealocirati3. ,ledi is ravljena verzija redjasnje: ro:rama. (' P./0.A1 131/.KUA53 '( 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; 8inc!ude9strinI.:; <oid main,<oid= ((de?!aracija c:ar 'te"t; ((a!ociranje memorije te"t = ma!!oc, si$eo ,c:ar- ' 50-; ((u>isi ne?u <rednost u memoriju na ?oju >o?a$uje T3*T strc>#,te"tE @jos jedna tri<ija!na >oru?aA@-; ((dea!ociramo memoriju ?oju smo $au$e!i >a nema curenja memorije ree,te"t-; ((sad je sas<im ?ore?tno dode!iti no<u adresu >o?a$i<acu T3*T te"t = ma!!oc, si$eo ,c:ar- ' 20-; ((uradi nesto I!u>o te"tX0Y = [T[; te"tX1Y = [B0[; ((>ri?a$i <rednost >rint ,@T3*T&; )sBn@E te"t-; C !rosto i jednostavno. Ostaje jos da s9vatite sta je realokacija zauzete memorije. !red ostavimo da smo dinamicki zauzeli jednu ovecu kolicinu memorije. /atim smo u tu memoriju smestili odatke koje je na rimer uneo korisnim ro:rama. @i mozemo izracunati koliko nam memorije stvarno treba za cuvanje dobijeni9 odataka5a onu ostalu memoriju koja retstavlja visak5 a je samim tim bes otrebna5 mozemo osloboditi. /a to koristimo 7unkciju realloc13 iz stdlib.9. !rimer za realokaciju dinamicki zauzete memorijeE (' P./0.A1 131/.KUA54 '( 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; 8inc!ude 9strinI.:;
<oid main,<oid= ((de?!aracija c:ar 'te"t; ((a!ociranje memorije te"t = ma!!oc, si$eo ,c:ar- ' 50-; ((u$mi ime i >re$ime od ?orisni?a >rint ,@Gnesi ime i >re$ime&; @-; Iets,te"t-; ((>ri?a$i ?o!i?o memorije sada $au$ima te"t,u bajto<ima>rint ,@To!icina sada $au$ete memorije je )d bajto<a.Bn@E si$eo ,c:ar- ' 50-; ((OJTA.TO. rea!ociraj memoriju te"t = rea!!oc, te"tE si$eo ,c:ar- ' ,str!en,te"t- % 1--; ((no<a ?o!icina memorije je >rint ,@Pos!e rea!ociranja memorije ona $au$ima )d bajto<aABn@E si$eo ,c:ar- ' ,str!en,te"t-%1--;
Kod iznad komentara koji ocinje sa ;,%)&%< treba da vam je jasan5 a cemo objasniti samo kod koji sledi osle nje:a. !rvo koristeci 7unkciji realloc realociramo zauzetu memoriju. Ova 7unkcija uzima dva arametraE okazivac i decimalni broj. Kao rvi ar:ument trebamo da redamo okazivac na memoriju kojoj zelimo da romenimo velicinu1 da je realociramo3. * ovom slucaju smo redali %+O% zato sto zelimo da romenimo broj bajtova1velicinu3 bloku memorije na koji on okazuje5 konkretno ovde-da taj blok smanjimo. $aravno5 omocu realloc13 moze se i ovecavati i smanjiti zauzeti blok memorije5 dok za ot uno oslobadjanje zauzeto: bloka memorije moramo da koristimo 7ree13 7unkciju. Kao dru:i ar:ument smo redali N si$eo ,c:ar- ' ,str!en,te"t- % 1- O. !omocu 7unkcije strlen13 cemo dobiti koliko znakova ima u %+O%u5 ali osto svaki strin: ima i zavrsni znak \YC\1 a taj znak strlen13 ne broji3 moramo dodati i ono ; 21 < . ,str!en,- % 1- smo stavili izmedju za:rada jer bi se u su rotnom rvo izvrsilo mnozenje a tek onda sabiranje. 'unkcija realoc135 o ut malloc135 vraca adresu realocirane memorije5 a smo mi tu adresu dodelili okazivacu %+O%. $a kraju5 omocu rint713 rikazujemo novu5 ;o timizovanu< kolicinu zauzete memorije. $a ovaj nacin smo ustedeli malo memorije. Kao sto smo vec rekli5 razlo:a za koriscenje dinamicko: alociranja ima vise a ovo je bio samo jedan od nji9....
C !rvo smo deklarisali romenljivu B&OB koja je ti a #$%. /atim smo joj dodelili vrednost koju vraca 7unkcija rand135 da bi na kraju rikazali koji smo broj dobili. Kao sto se moze video 7unkcija rand13 sluzi za :enerisanje random broja. Ona je vrlo rosta za koriscenje jer ne uzima ni jedan arametar a de7inisana je u 9eader 7ajlu stdlib.9. @edjutim ako okrenete ro:ram videcete da B&OB stalno dobija istu vrednost bez obzira koliko vi uta okrenuli ro:ram. %o se moze resiti ovakoE ('ProIram .AN72'( 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; 8inc!ude 9time.:; <oid main,<oid= int broj; srand, time,NG44--; broj = rand,-; >rint ,@7obijeni broj je )dBn@E broj-; C Dve su razlikeE dodali smo N 8inc!ude9time.:; O i N srand, time,NG44--; O. !rvu izmenu smo nacinili jer je u time.9 de7inisana 7unkcija time13 koju smo koristili u ro:ramu1 na omenaE 7unkcije iz time.9 necemo objasnjavati3. 'unkcija srand13 de7inisana je u stdlib.9 i sluzi5 slikovito receno5 da malo ; rovrti< brojeve koje ce koristiti rand13. $ije to bas tako ali zaista nije otrebno da znate kako ovo radi5 a vas necemo sa tim o terecivati. $a omenimo ovde znacenje reci $*((- to je sinonim1 tacnijemakro3 za okazivac na ti void1 dakleE void G3. ,a ovim se 1o et3 ne morate o terecivati5 recicemo samo da ste umesto nje:a mo:li da stavite i nulu jer je vrednost $*(( u stvaru nula. + ilo: ove izmene je da cemo dobijati stalno dru:acije brojeve5 sto nam je i bio cilj. # ak5 o se: u kojem ce dobijeni random brojevi biti nije o:ranicen. ,ta ako nam treba random broj koji je nula ili jedanL !rimerE 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; 8inc!ude 9time.:; <oid main,<oid= int broj; srand, time,NG44--; broj = rand,- ) 2; >rint ,@7obijeni broj je )dBn@E broj-; C Ovde nice: ne oznato: nema a zeljeni o se: random broja smo dobili tako sto smo5 romenljivoj B&OB dodelili ostatak ri deljenju broja koji vraca rand13 sa brojem dva. (o:icno ostatak deljenja sa dva je uvek C ili 15 zar neL Kao vezbu5 na isite ro:ram koji ce :enerisati 2C random brojeva1 omocu etlje3 u o se:u od C do 15 i koji ce izbrojati koliko se uta ojavljuje C a koliko uta 1.
(. Strukture
,vi do sada u otrebljavani ti ovi odataka u ovom tutrialu bili su osnovni1 rosti3 ti ovi. %o su na rimer #$%5 '(O)%P 0H)&... $asu rot njima5 ostoje i izvedeni1slozeni3 ti ovi odataka a jedan vid ti9 odataka su i strukture.Deklaracija strukture iz:leda ovakoE struct ime5stru?ture = int c!an1; c:ar c!an2; !oat c!an3X10Y; int c!an" = 457W; C;
&ec struct :ovori da je u itanju struktura. ,ledi ime strukture i zatim blok naredbi1 telo strukture3 a kao sto znate5 blok naredbi je oivicen sa Z i [. *nutar tela strukture de7inisani su clanovi te strukture5 nji9ov broj je neo:ranicen a mozete na raviti strukturu koja nema ni jedan clan1mada je ta struktura vise ne:o beskorisna3. * ovom rimeru5 clanovi strukture su rosti ti ovi odataka. Kada i zasto koristiti struktureL &ecimo da 9ocemo na raviti ro:ram koji uzima neke osnovne odatke o korisnicima- kao sto su ime5 rezime i :odiste. %o mozemo uraditi i bez struktura ali bi kod bio dosta losije or:anizovan. $aime5 svaki korisnik koji bude u isivao svoje odatke ce morati da u ise ime 5 rezime i :odiste. %o nam :ovori da bi bilo z:odno da na ravimo novi ti odatka1 strukturu3 koji ce se zvati n r ;Osoba< i koji ce u sebi sadrzati odatke o imenu5 rezimenu i :odistu korisnika. $a isimo tu strukturuE struct /soba5st = int Iod; c:ar imeX25Y; c:ar >re$imeX25Y; C; Ovim smo na ravili ovi ti odatka koji se zove OsobaNst. %o znaci da cemo moci da na ravimo1deklarisemo3 romenljive ovo: ti a5 isto kao sto deklarisemo romenljive ti a #$%5 na rimer. +vo kako bi to iz:ledaloE struct /soba5st ?orisni?; $a ovaj nacin smo deklarisali romenljivu koja se zove ;korisnik< koja je ti a OsobaNst. Da nema ono: ;struct< is red OsobaNst5 deklaracija bi bila ot uno ista kao i za ti odatka n r. #$% ili '(O)%. @edjuim to ;struct< moramo isati da bi kom ajler1 revodilac3 znao da se radi o izvedenom ti u odatka. $a isimo ro:rama koji koristi ovu strukturuE (' >roIram JT.GTTG.31 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; 8inc!ude 9strinI.:; '(
((na>ra<i,de inisi- no<i ti> >odat?a, stru?turustruct /soba5st = int Iod; c:ar imeX25Y; c:ar >re$imeX25Y;
C; ((>o!a$na tac?a >roIrama <oid main,<oid= ((de?!arisi >romen!ji<u ti>a /soba5st struct /soba5st ?orisni?; ((de?!arisi @obicnu@ >romen!ji<u ti>a KNT int >om; ((u$mi >odat?e i smesti i: u >romen!ji<u @?orisni?@ >rint ,@Gnesi Iodiste: @-; scan ,@)d@E H>om-; ?orisni?.Iod = >om;
De7inicija strukture OsobaNst treba da vam je jasna. * 7unkciji main13smo na ravili romenljivu ;korisnik< koja je ti a OsobaNst. /atim deklarisemo omocnu romenljivu1mada smo mo:li kod na isati tako da nam ona i netreba3 ; om<. !osle to:a od korisnika trazimo da unese svoje :odiste1 ozivajuci scan713 3 i taj odataka smestamo u ; om<. ,ledeca linija koda je interesantnaE Kada smo de7inisali ti odatka ;OsobaNst<rekli smo da on sadrzi romenljive od imenom :od5 ime i rezime5 a u ovoj liniji koda ristu amo clanu ;:od< i dodeljujemo mu vrednost koju ima romenljiva ; om<. %o ristu anje je izvedeno omocu o eratora tacka1 . 3 Dakle struktura je ;sku < vise romenljivi9 razliciti9 ti ova5 a mi reko o eratora ;tacka< mozemo da ristu amo tim romenljivim i menjamo im vrednosti. Kao vezbu zavrsite ro:ram tako da u ;korisnik< takodje u ise ime i rezime. $e zaboravite da se za ko iranje strin:ova koristi 7unkcija strc M135 koja je objasnjena u ret9odnom o:lavlju. %akodje mozete raviti i nizove izvedeni9 ti ova odataka a nji9ova u otreba je ot uno ista kao i kod rosti9 ti ovaE struct /soba5st b$<X100Y; !ristu anje clanovima strukture je takodje rostoE b$<XWWY.Iod = 1WQW; #nicijalizacija clanova strukture se moze izvesti na sledeci nacinE struct /soba5st ?orisni? = = 10E @Nemanja@ E @Todic@ C; Dakle otvorena viticasta za:rada i zatim u isujete vrednosti kojim zelite da inicijalizujete romenljive. Jrednosti su razdvojene zarezom i moraju se navoditi istim redom kojim su deklarisane u de7iniciji strukture. %j.ako ste u strukturi rvo na ravili clan ;:od< onda ce rva vrednost koju na isete izmedju viticasti9 za:rada biti dodeljena u ravo clanu ;:od< i sve tako redom. O strukturama ima jos mno:o5mno:o to:a da se kaze medjutim osto se ovaj tutrial bavi samo stvarima koje se rade u skoli5 zadrzacemo se na do sad recenom. Bitno je za sada da usvojite ovo osnovno s9vatanje struktura i da i9 rimenjujete kad se :od za to ukaze otreba.
element u ba7eru- :etc9ar13 samo roverava dali je znak na koji ovaj okazivac okazuje is ravan tj. da li smo dosli do kraja te=ta koji je smesten u ba7er1 kao sto vec treba da znate5 znak koji redstavlja kraj te=ta je \YC\ 3 a ako nismo dosli do kraja te=ta :etc9ar13 kao rezultat vraca element na koji okazuje okazivac a u su rotnom od korisnika se trazi da onovo unese odatke. # sta mislite dali ce korisnik morati onovo da unesete odatke1 ako ret ostavimo da je rvi ut uneo samo jedan znak3L $ece moratiD &azlo: je jednostavan- kao sto smo rekli ba7erovanje se vrsi u redove1 i za is is i za citanje3 to znaci da mi u ba7er nismo u isali samo slovo koje smo otkucali vec i smo zatim morali da ritisnemo +$%+& a enter retstavlja znak za novi red5 a je i taj znak unesen u ba7er. Dakle romenljiva zn ce cuvati znak \Yn\. Da bi ste se uverili da ste ovo zaista s9vatili razmotrite kako i zasto radi sledeci rimerE (' >roIram Ma er1 '( 8inc!ude 9stdio.:; <oid main,<oid= c:ar $n; D:i!e, $n = Ietc:ar,- -((unosite te?st >roi$<o!jne du$ine... >rint ,@)c@E $n-; ((moI!i smo na>isati i @ >utc:ar,$n-; @ C !ostoji jos jedan standardni tok ovezan sa konzolom- standardni tok za :reske ; stderr< ali nje:a necemo uzeti u razmatranje. 1$.2 Struktura 024 i 'unkcije za otvaranje novi@ tokova Kao sto ste mo:li da zakljucite ne ostoji ni jedan standardni tok koji je ovezan sa 7ajlovima na Hard Disku1 ili nekoj dru:oj jedinici za smestanje odataka3 medjutim mozemo i9 ;otvoriti< u svojim ro:ramima ako za to imamo otrebu1 a vecina ro:rama ima otrebu za ovim vidom skladistenja odataka3. ,turo receno 7ajl je niz bajtova u memoriji kojim je dato ime5 on ima svoju adresu u memoriji i znak za svoj kraj1 slicno kao sto i strin: ima znal \YC\3. $a rimer ovaj tutrial je 7ajl5 esme su 7ajlovi i tako dalje. Da bi ;komunicirali<1 citali ili u isivali odatke u 7ajl3 otrebna nam je okazivac na ti '#(+. '#(+ je struktura1 dakle izvedeni ti odatka3 koja je de7inisana u 9eader 7ajlu ; stdio.9 < i ona sadrzi sva otrebna svojstva da bi mo:li reko nje da ;komuniciramo< sa nekim 7ajlom. ,amu konstrukciju ovo: izvedeno: ti a odatka i kako on radi nije neo 9odno da znate1vec samo da :a koristite3 a vas sa tim necemo o terecivati. Kada smo na ravili okazivac na '#(+ mi treba da :a ; ovezemo< sa nekim 7ajlom na HDu5 tj. treba da ;namestimo< okazivac da okazuje na zeljeni 7ajl a to se zove ;otvaranje toka ka 7ajlu<. Kada smo to uradili imacemo ot unu kontrolu nad odredjenim 7ajlom tako da mozemo u isivati i citati odatke iz nje:a. Otvaranje toka se vrsi omocu 7unkcije 7o en13 koja vraca adresu na kojoj se nalazi 7ajl sa kojim treba da ;komuniciramo<. Demonstracija :ore receno:E (' >roIram Laj!1 '( 8inc!ude 9stdio.:; <oid main,<oid= LK43 '> ; int broj = 13041WQW; ((>o<e$i se aj!om > = o>en,@1ojLaj!.t"t@E @D@-;
((u>isi ne?e >odat?e u aj! >rint , > E @Mroj je )d...@E broj-; (($at<ori to? c!ose,> -;
!rvo stvaramo okazivac na '#(+5 zatim omocu 7o en13 otvaramo 7ajl ;@oj'ajl.t=t<. Dru:i ar:ument retstavlja ;mod< u kome zelimo da otvorimo 7ajl1za citanje5 isanje5 azuriranje idr.35 u ovom slucaju smo redali je <8< sto znaci da 7ajl otvaramo za u isivanje1 sledi tabela svi9 znakova koje mozete koristiti kao i nji9ovo znacenje3. /atim smo koristili 7unkciju 7 rint713 koja ima slicnu sintaksu kao i rint713 s\ tom razlikom sto ne mora da is isuje odatke u stdout vec i9 moze u isivati i u tok ka nekom 7ajlu1 a u koji tok se odaci u isuju se navodi rvim ar:umentom5 u ovom slucaju to je !'3. Kasnije cemo objasniti neke od osnovni9 7unkcija za baratanje sa 7ajlovima. $a kraju zatvaramo otvoreni tok ozivajuci 7unkciju 7close13 koja kao ar:ument uzima tok koji treba da zatvori. ---------------------------------------------------------------------------------------I @OD I O!#, I ---------------------------------------------------------------------------------------I r I Otvara te=tualni 7alj za citanje I ---------------------------------------------------------------------------------------I 8 I /amenjivanje ili kreiranje te=tualni: 7ajla za u is I ---------------------------------------------------------------------------------------I a I Otvaranje ili kreiranje te=tualno: 7ajla za do isivanje I ---------------------------------------------------------------------------------------I rb I Otvaranje binarno: 7ajla za citanje I ---------------------------------------------------------------------------------------I 8b I /amenjivanje ili kreiranje binarno: 7ajla za u is I ---------------------------------------------------------------------------------------I ab I Otvaranje ili kreiranje binarno: 7ajla za do isivanje I ----------------------------------------------------------------------------------------
1$.3 unkcije za baratanje sa 'aj"ovima Objasnicemo . najcesce korisceni9 7unkcija. int fprintf(FILE *, upravljacki niz,parametar1,parametar2,... ); ($acin koriscenja ove 7unkcije je veoma slican sa 7unkcijim rint713 sa tom razlikom sto se kao rvi arametar unosi okazivac na '#(+. !odaci ce biti u isani u 7ajl na koji taj okazivac okazuje a ne na ; stdout<. int f canf(FILE *, upravljacki niz, parametar1,parametar2,...); (,licnosti i razlike izmedju scan713 i 7scan713 su kao i kod rint713 i 7 rint713. Dakle kao rvi ar:ument navodite ime 7ajla iz koje:a se odaci iscitavaju a sve ostalo ostaje isto. int fputc(int, FILE *) (,luzi za u isivanje jedno: znaka1 rvi ar:ument3 u 7ajl koji je naveden dru:im ar:umentom) !rimeticete da je rvi ar:ument ti a #$% tako da mozete roslediti i romenljivu ti a 0H)& a ne samo #$%. int f!etc(FILE *); (#scitavanje jedno: znaka iz 7ajla. #scitani znak 7unkcija vraca kao ovratnu vrednost.
c"ar * f!et (c"ar *, int, FILE *); (!o ut :ets135 7unkcija 7:ets13 sluzi za iscitavanje celo: reda te=ta ali ne sa konzole vec iz 7ajla. Kao rvi ar:ument treba redati strin: u koji ce biti smesten iscitani te=t5 dok nam je znacenje trece: ar:umenta oznato. Dru:i ar:ument iz:leda kao visak medjutim on retstavlja velicinu najvece ocekivane duzine reda te=ta. )ko na rimer unesete broj 1C a neki red u 7ajlu ima 2C znakova imacete roblem jer nema dovoljno mesta da se svi ti znakovi sacuvaju. *obicajena vrednost koju treba redati ovoj 7unkciji je duzina strin:a koji ste redali kao rvi ar:ument. Dakle ovakoE c:ar retX30Y; LK43 '> ; > = o>en,Nc:BBto"i.t"tOE NrO-; Iets,retE 30E > -; ,istem o kom ovo 7unkcijonise bi trebalo da vam je jasan. int fput (c#n t c"ar *, FILE *); (!onasa se ot uno isto kao i 7:es13 ali u isuje odatke u 7ajl. !rimeticete da nema ar:umenta duzine znakovno niza osto je on 7unkciji oznat. $esto na rednije #KO u 7ajl je binarni #KO medjutim nje:a necemo uzeti u razmatranje. .raj... @ozda cu ovaj tutrial rosiriti novim o:lavljima ali si:urn ne uskoro... )ko van nesto nije jasno ili imate kakve rimedbe1 ili se ste se nasli zateceni mojom :ramatickom ne ismenoscu3 moj e-mail je to=iasezam ro.com. May the Source be with you!