You are on page 1of 49

Srpski, kolski C tutrial

Autor: Nemanja Todi

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.

1.$ Brojevni sistemi


!ostoji nekoliko brojevni9 sistema a ;naj oznatiji<suE decimalni5 oktalni5 binarni i 9ekasadekadni. Ono sto vi treba da znate je kako se iz jedno: brojevno: sistema konvertuje broj u dru:i brojevni sistem. 1.1 ,ecima"ni brojevni sistem Decimalni B, je sku koji ima 1C ci7ara i to su sledece E C51525354555.5>5?5F. !ravljenjem razliciti9 kombinacija mozete dobiti brojeve kao sto su ->?F5 C 5 15 4F5 32>5> idr. +vo rimera kako se na dru:aciji nacn moze redstaviti broj n r 3?5E 3 G 1C2 2 ? G 1C1 2 5 G 1CC H 3 G 1CC 2 ? G 1C 2 5G1 H 3CC 2 ?C 2 5 H 3?5 . !rovezbajte sa jos ar brojeva. 1.2 Okta"ni brojevni sistem Oktalni B, je sku koji ima ? ci7ara i to su E C51525354555.5>. Bitno je znati kako da brojeve ovo: sistema revedete u decimalne brojeve. +vo rimeraE oktalno 142 je decimalno F? E I142I? H 1 G ?2 2 4 G ?1 2 2 G ?C H 1G.4 2 4G? 2 2G1 H .4 2 32 2 2 H IF?I1C.
!o rilicno jednostavan sistem. 1.3 Binarni brojevni sistem

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.

2.$ Jezicki tipovi podataka


!ostoji nekoliko ;u:radjeni9< ti ova odataka u jeziku 0 medjutim ostavljena je mo:ucnost da se na vise nacina na rave novi ti ovi odataka5 nji9 konstruise ro:ramer. #zvedeni ti ovi su krajnje korisni ali isto tako i malo kom leksniji za osmisljavanje a ce mo se za sada zadrzati na nekim osnovnim ti ovima odataka. 2.1 %romen"jive i konstante &ecimo da zelite da na isete ro:ram koji ce da sabere dva broja koje ce korisnik uneti. !roces rada ro:rama bi isao ovakoE korisnik unosi rvi broj5 ro:ram taj broj sacuva5 zatim korisnik unosi dru:i broj i ro:ram taj broj takodje sacuva. !ostavlja se itanje :de taj broj sacuvatiL Od:ovor je u &andom )ccess @emorM1 &)@3 odakle cemo broj o otrebi iscitavati. Ovo se realizuje tako sto cemo ;na raviti< romenljivu1 takodje se nazivaju i variable3 koja ce zauzeti od:ovarajuce arce memorije5 a velicina to: arceta zavisi od ti a romenljive. Oko ti ova odataka i nji9ovim karakteristikama1 a jedna od nji9 je i kolicina zauzete memorije3 cemo se ozabaviti kasnije. Bitno je da uvidite da se u romenljivu mo:u u isivati i iscitavati odaci sve dok ta romenljiva ostoji u memoriji. Jratimo se zadatku5 dakle ucitali smo dva broja koja valja sabrati. ,ledece5 treba nam mesto u memoriji racunara u kojem ce mo snimiti rezultat sabiranja5 dakle treba nam jos jedna romenljiva. $joj cemo dodeliti vrednost zbira rve dve romenljive koje smo ucitali. %o je to. %rebalo bi da vam je jasno sta su romenljive i cemu sluze. ,ada cemo objasniti i kako se koriste. Dve su bitne stvari kod kreiranja1 ravilnije receno ;instancovanja<3 romenljivi9E nji9ova deklaracija i inicijalizacija. &ecimo da zelimo da na ravimo romenljivu u koju cemo smestiti rvi broj iz :ore navedeno: zadatka5 to cemo uraditi ovakoE int a; Ovim smo deklarisali romenljivu koja ima ti ;int< 1sto ce reci da moze cuvati samo cele brojeve5 ovim cemo se kasnije ozabaviti3 i na:lasili da se ona zove ;a<. !o:ledajmo sledeci rimerE int a = 157; dodali smo ; H 15> <. %o je inicijalizacija iliti dodavanje vrednosti romenljivoj u isto vreme kada je i deklarisemo1 na ravimo3. *koliko neinicializujemo romenljivu ona dobija neku bezveznu vrednost5 no u svim dru:im o:ledima onasanje inicijalizovane i neinicijalizovane

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

4.$ Naredbe. Struktura programa.


Od ovo: o:lavlja ce mo isati ro:rame koji se mo:u izvrsavati na racunaru. Jerovatno se neko za itao :de je standardni ;Hello4orldD< ro:ram5 uz malo kasnjenja stize i on. Jeci deo ret9odno: te=ta je bio vise-manje teoriski dok ce se od sada veci deo osla svoditi na rakticno isanje ro:rama. 4.1 -e""o <or"d= Osnovne stvari vezane za jezik 7 $a isacemo jedan ro:ram koji trebate da ko irate u te=t editor vase: kom ajlera5 on je vrlo jednostavan i ne radi nista korisno ali ce nam veoma dobro osluziti da u oznate osnovne ;kom onente< jezika. (' P./0.A1 2344/56/.47 '( 8inc!ude 9stdio.:; <oid main,= (( >ri?a$i >oru?u >rint ,@7a nije o<e >oru?e e?ran bi bio >ra$anABn@-; C )nalizirajmo red o red. 4.2 .omentari !rva linija koda1 KG !&O-&)@ H+((ON4O&(D GK 3 ne radi nista tacnije kom ajler je i:norise. !rimeticete da se te=t nalazi izmedju znakova KG i GK5 sto znaci da je u itanju komentar. 0emu on sluziL !omocu komentara ro:ram ostaje citljiviji za coveka5 revodiocu1kom ajleru3 je ot uno sve jedno dali ostoji sto 9iljada linija komentara ili ni jedna jedina. !ret ostavite da ste na isali ro:ram koji ima oko 1CCC linija koda i osle dva meseca 9ocete da otkolnite neke :reske u ro:ramu ili da :a una redite1 rosirite3. )ko ste redovno isali komentare koji su o isivali sta koja :ru a naredbi radi5 osao bi vam bio olaksan jer ne biste morali da ;desi7rujete< kod vec samo da rocitate komentar. Bos jedan je nacin za isanje komentara- omocu dve kose crte1KK - vidi rimer3. &azlika je u tome sto ce se komentarom smatrati sve izmedju KG ... GK odnosno ako koristite ove simbole mozete isati komentare u vise redova5 dok se omocu simbola KK komentarom smatra sve od to: simbola do kraja tekuce: reda. 4.3 Naredba >inc"ude. -eader 'aj"ovi. Standardna bib"ioteka. !ostoje naredbe koje se izvrsavaju u toku rada ro:rama i one koje se izvrsavaju samo jednom5 u toku revodjenja1kom ajliranja3 ro:rama- re rocesorske naredbe. &ecimo da isete neki ro:ram sa svojim kole:om ili u eki i od vece: broja ljudi. ,vaki od ro:ramera ce isati svoj deo ro:rama u osebnim 7ajlovima. Kada svi zavrse svoj deo osla imacete nekoliko 7ajlova u kojima se nalazi kod za ro:ram. #mate dve mo:ucnosti5 da tekstove s ojite u jedan 7ajl1sto nije dobra raksa3 ili da i9 ovezete omocu naredbe 6include 1sto je dobra raksa3. * dru:om slucaju5 standardizovano je da ekstenzija 7ajlova koji se ovezuju bude .H 19eader 7ajlovi3. $a taj nacin imacete vise mali9 7ajlova a ce vam sam kod biti re:ledniji. /asto smo izmedju W S uneli ;stdio.9<L stdio.9 je samo jedan od :omile 9eader 7ajlova koji sadrze veoma korisne kodove koje cete u otrebljavati u svojim ro:ramima. )utori ovi9 7ajlova su ro:rameri koji su radili na izradi ro:ramsko: jezika 0. ,vi 9eader 7ajlovi koji standardno dolaze uz svaki valjan 0 kom ajler se zajedno nazivaju ;0 ,tandard (ibrarM<1 ,tandardna Biblioteka jezika 03. O jednom delu 7unkcija1 ovaj ojam cemo uskoro objasniti3 ,( ce mo se u oznati u ovom tutrialu medjutim dosta to:a cemo zaobici. Konkretno5 9eader ;stdio.9< smo ukljucili jer cemo koristiti 7unkciju rint7 koja je de7inisana u ovom za:lavlju. * sustini5 mozemo ukljuciti i sve 9eader 7ajlove ,( ali ce to bes otrebno

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.

!. Osnove prikup"janja podataka


Objasnicemo neke od 7unkcija stadardne biblioteke5 revas9odno one omocu koji9 ce te riku ljati odatke od korisnika i rikazivati rezultate rada vasi9 ro:rama. Ono sto ste do sada ucili bilo je vezano iskljucivo za mani ulaciju odacima tj. koriscenje naredbi i nji9ova or:anizacija da bi ste obavili odredjeno racunanje ili sta vec. !osle ovo: o:lavlja znacete kako da uzimate odatke -S mani ulisete njima -S rikazujete rezultate5 te ce te jedan vrlo sirok kru: zatvoriti i s oznati o rilican deo sintakse jezika 0. !.1 Napomena o raz"ici izmedju teCta i znaka * 0 jeziku svaki te=t se tretira kao ;niz znakova< a sta je to objasnicemo u o:lavlju o okazivacima5 za sada treba da znate da svaki ;slobodan< te=t treba da stavite od navodnike jer ako to ne uradite kom ajler ce smatrati da je taj te=t neka naredba ili ime romenljive idr. @no:i jezici imaju ti romenljive ;strin:< koji sluzi za smestanje te=ta. Kod 0 jezika ne ostoji ti strin: ali u 0-u se isti e7ekat moze ostici koristeci se ti om c9ar. 09ar znaci znak i u romenljivu ti a c9ar ne mozete staviti te=t vec samo jedan znak5 na rimer takva romenljiva moze da cuva vrednosti \%\ ili \L\ ali ne i ;nekiNte=t<. ,ve ce ovo biti detaljno objasnjeno u odeljku o okazivacima i nizovima ali vec sad treba da uvidite razliku izmedju znaka1 tacnije simbola3 i te=ta. ,av se tekst stavlja od navodnike " ;te=t<5 a simboli od znacima ;:ornje: zareza< n r. \a\ 5 \e\5 \2\ ... !.2. unkcija print'8: ,a ovom smo se 7unkcijom ranije sreli ali nismo objasnili kako ona radi. !rint713 7unkcija sluzi za rikazivanje te=ta i vrednosti na monitor1tacnije na konzolu3. Ova je 7unkcija

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&para"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&para"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.

#.$ %okazivaci i Nizovi


!okazivaci su jedna od :lavni9 rednosti jezika 0. Oni sluze za direktan ristu memoriji racunara. Jec smo rekli da kada deklarisemo neku romenljivu5 ma koji bio njen ti 5 sistem mora da rezervise otrebnu kolicinu memorije u koju ce smestati odredjene vrednosti. Da bi davali vrednost romenljivoj ili da bi smo njenu vrednost ;citali< koristimo ime te romenljive. )ko ak deklarisemo okazivac on ce ; okazivati< na lokaciju neke romenljive unutar memorije i dakle sadrzace adresu romenljive na koju okazuje5 a ne vrednost koja se nalazi na toj adresi. @ozda vam ovo nije jasno za sada5 mozda vam iz:leda bes otrebno ali sledi objasnjenje kroz jedan rimer. #.1 .ako rade pokazivaci i adrese. ,vaka romenljiva ima adresu na kojoj se nalazi u memoriji. !osto je i okazivac vrsta romenljive i on ima svoju adresu u memoriji. !ostavlja se itanje kako vi u ro:ramu mozete da saznate na kojoj se adresi nalazi neka romenljiva. Od:ovor je- omocu o eratora U 1;am ersend< ili o erator ;adresa-od<3. +vo kako to iz:leda na deluE int M./U; M./U = 45; >rint ,@Vrednost >romen!ji<e je )d Bn@E M./U-; >rint ,@Adresa >romen!ji<e je )dBn@E HM./U-; !rvo deklarisemo romenljivu koja ima ti #$% a ime joj je B&OB. %o znaci da je sistem na nekoj lokaciji u memoriji rezervisao dovoljno mesta da stane svaka vrednost koju odrzava ti #$%1 dakle za svaki celi broj3. /atim naredbom M./U = 45 vrsimo dodelu vrednosti romenljivoj B&OB. Dakle menja se vrednost romenljive ali njena adresa je ista. )drese

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

&. Neke od 'unkcija standardne bib"ioteke


* ret9odnom o:lavlju smo ominjali 7unkciju strc M13 koja je de7inisana u strin:.9. * ovom o:lavlju cemo objasniti kako se koriste i cemu sluze neke od 7unkcija1ne sve3 koje su de7inisane u sledecim 9eader 7ajlovima standardne bibliotekeE strin:.95 ctM e.95 mat9.95 stdlib.9. ,vi ovi 9eader 7ajlovi se is oru_uju uz svaki valjan 0 kom ajler tako da sa te strane nemate o cemu da brinete.

&.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@-;

e!se C >rint ,@.eci su >ot>uno isteA@-;

'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<.

&.4 Jos 'unkcija za komuniciranje sa korisnikom


!ored rint7135 tekst mozete rikazivati na ekran1konzolu3 i omocu sledeci9 7unkcija1 sve su de7inisane u stdio.93E int >utc:ar, int-; !omocu ove 7unkcije mozete rikazati samo jedan simbol na ekran5 ali ne i niz znakova. $a rimer na isite >utc:ar,ZBaZ-; i _u^ete ;bee < zvuk na vasem racunaru. int >uts, const c:ar'-; ,luzi za rikazivanje teksta na ekran. $esto slicno o ut rint713 uz razliku sto nemoze da rikazuje vrednosti romenljivi9 vec iskljucivo tekst. &ekli smo ranije da je scan713 vrlo ; i ava< 7unkcija u tom o:ledu sto za9teva da odaci budu uneseni korektno a korisnik ro:rama moze slucajno1ili namerno3 da unese o:resan odatak5 tada ceo ro:ram ada u vodu.$a rimer umesto da otkuca 2 korisnik ritisne +.... Da bi se ovaj rizik izbe:ao koriste se neke dru:e 7unkcije za uzimanje odataka jedna od nji9 jeE c:ar' Iets, c:ar'-; koja sluzi za uzimanje reda teksta od korisnika. $aime5 mozda ste rimetili da koristeci scan713 ne mozete ucitati ceo red teksta vec najvise samo jednu rec1 sve do rvo: znaka razmaka3. /a razliku od nje5 :ets13 uzima ceo tekst koji je unesen nebitno dali on sadrzi brojeve5 slova5 razmake ili neke dru:e znake. $a isacemo ro:ram koji od korisnika trazi ime i rezime a zatim menja velicinu slovima imena i rezimena5 koristeci ritom neke od 7unkcija omenuti9 u ovom o:lavlju.

(' 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

&.5 unkcije za dinamicko uprav"janje memorijom


,ve 7unkcije koje cemo s ominjati u ovom odeljku se nalaze u 9eader 7ajlu ,%D(#B.H. Do sada ste naucili sta su okazivaci i rekli smo da oni mo:u okazivati na neku dru:u romenljivu5 tacnije na mestu u memoriji koje je odvojeno1rezervisano3 za tu dru:u romenljivu. @edjutim5 koristeci 7unkciju malloc13 iz stdlib.9 mi mozemo da rezervisemo odredjeno ; arce< memorije- memorija ce biti zauzeta ali je ni jedna romenljiva nece koristiti. !a ste ce nam ondaL $aime5 omenuta 7unkcija malloc13 kao ovratnu vrednost daje adresu memorije koja je u ravo zauzeta5 a koji ti odatka jedini moze cuvati adreseL $aravno5 okazivaci. !omocu ovo: me9anizma u mo:ucnosti smo dinamicki5 u toku izvrsavanja ro:rama5 da alociramo1zauzimamo3 odredjene kolicine memorije i na nji9 ce okazivaci okazivati a cemo moci da u tu memoriju skladistimo odatke. ,ledi rimer za dinamicku alokaciju memorije. (' P./0.A1 131/.KUA51 '( 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@-; ((>ri?a$i <rednost >rint ,@T3*T&; )sBn@E te"t-; C ,ve sem naredbe u kojoj ozivamo malloc13 treba da vam je jasno. 'unkciji malloc13 smo kao ar:ument redali jednu omalo cudno vrednostEE si$eo ,c:ar- ' 50 sizeo7 je o erator 0 jezika1 kao sto su i recimo 2 ili K o eratori3 a nje:ova ulo:a je da odredi koliko memorije zauzima neki ti odatka. * ovom slucaju trazili smo koliko bajtova zauzima ti odatka c9ar i tu vrednost omnozili sa 5C. %ime cemo dobiti broj bajtova koji je otreban

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....

&.! 5enerisanje random broja


$aci cete se u situaciji da vam zatreba nasumicni1 random3 broj a u ovom odeljku cemo vam reci sve sto treba da znate o tome. ,ledi najjednostavniji rimer :enerisanja random brojaE ('ProIram .AN71'( 8inc!ude 9stdio.:; 8inc!ude 9std!ib.:; <oid main,<oid= int broj;

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.

broj = rand,-; >rint ,@7obijeni broj je )dBn@E broj-;

(. 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;

(' itd... '(

&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.

1$. )ad sa 'aj"ovima


* ovom o:lavlju cete nauciti da smestate odatke u 7ajl kao i da iz nje:a iscitavate odatke. ,koro svi ro:rami barataju sa 7ajlovima u vecoj ili manjoj meri5 a je s\to:a veoma bitno da usvojite sve sto bude receno. 1$.1 Standardni tokovi i pojam Ba'era * dosadasnjem delu tutriala koristili smo dva od tri standardna toka- jedan za is isivanje odataka na konzolu1ekran3 i jedan za uzimanje odataka sa konzole. %ok za uzimanje odataka se naziva ; stdin < a tok za is is odataka se na konzolu se naziva ; stdout <. %ok ; stdin < je ovezan sa konzolom i to onasanje ne mozemo romeniti5 isto vazi i za tok ; stdout <. !osledica ovo:a je da ce ; stdout < uvek rikazivati tekst na konzolu a nece :a na rimer sacuvati u neki 7ajl5 slicno tome ; stdin < ce kao unesene odatke uzeti samo ono sto je korisnik uneto u konzolu. Da bi ojasnili sta je to tok uzecemo u razmatranje 7unkciju rint713. Kada joj redamo neki te=t5 na rimer ;Ovo je orukaD< ona ce taj te=t ; roslediti< na tok ; stdout < a ce samim tim te=t biti is isan na konzoli. Bos jedna je bitna stvar- rikazivanje te=t na konzolu je veoma s or roces a se5 da bi se rikazivanje ubrzalo5 te=t ne rikazuje cim bude ; rosledjen< vec se ba7eruje u redove tj. tekst se cuva u ba7eru1 ba7er je naziv za niz romenljivi9 ti a c9ar5 dakle za strin:3 sve dok se ne dodje do znaka za kraj red- \Yn\ ili za kraj strin:a- \YC\. %ad se te=t rikazuje a ba7er se ; razni< da bi oslobodio rostor za sledece ;skladistenje< rosledjeno: te=ta. Do sada smo naveli nekoliko 7unkcija za uzimanje odataka od korisnika ali 7unkciju :etc9ar13 smo namerno reskocili jer niste bili u uceni u to kako radi ba7er. Ova 7unkcija sluzi za uzimanje jedno: znaka od korisnika5 tacnije iz ba7er ali ojasnicemo na sledecem rimeruE (' >roIram Ma er1 '( 8inc!ude 9stdio.:; <oid main,<oid= c:ar $n; Ietc:ar,-; $n = Ietc:ar,-; >rint ,@&;)c@E$n-; C * 7unkciji main13 smo ozvali :etc9ar13 da bi zatrazili od korisnika da unese jedan znak i ret ostavimo da je korisnik uneo bas samo jedan znak. /atim smo omocu rint713 na ekran istam ali ;-S< a takodje i vrednost toju sadrzi romenljiva /$. @ozda ocekujete da ce ro:ram od vas traziti da dva uta unesete neki znak ali to se nece do:oditi. $aime5 kada smo rvi ut ozvali :etc9ar135 ta 7unkcija je okusala da uzme znak iz ba7era a ne od korisnika. )li osto je ba7er u tom trenutku bio razan5 ro:ram je morao da od korisnika zatrazi odatke koje ce smestiti u ba7er a zatim ce5 dakle kada korisnik unese odatke5 7unkcija :etc9ar13 okusati onovo da iscita rvi znak iz ba7era1 a to je lo:icno rvi znak koji je korisnik uneo3 " ovo:a uta to izcitavanje ce biti us esno. /nak koji 7unkcija :etc9ar13 bude nasla u ba7eru ce biti vracen kao rezultat. * main13 7unkciji smo zatim jos jednom ozvali :etc9ar13 i evo sta se sada do:adjaE :etc9ar13 o et okusava da uzme znak iz ba7era5 ovo:a uta naravno nece okusati da uzme rvi znak koji se nalazi u ba7eru vec dru:i. %acnije5 ostoji okazivac na elemente ba7era i taj se okazivac inkrementira kod svako: oziva ove 7unkcije5 a ce on uvek okazivati na sledeci

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!

You might also like