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 zais
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 Oeratori u jeziku 0
3.3 -ubitak reciznosti
3.4 Oeratori inkrementiranja1223 i dekrementiranja1--3
3.5 $aomena
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 Oeratori 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 Osezi vaznosti
5.4 !reoterecivanje 7unkcija
!. Osnove prikup"janja podataka
..1 $aomena 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 tia c9ar
>.4 $iz romenljivi9 tia c9ar
&. Neke od 'unkcija standardne bib"ioteke
?.1 ,%&#$-.H
?.1.2 'unkcije za koiranje strin:ova
?.1.3 'unkcije nadovezivanja
?.1.4 7unkcije oredjenja
?.2 @)%H.H
?.2.1 %ri:onometrijske 7unkcije
?.2.2 ,teenovanje vrednosti
?.2.3 /aokruzivanje na celobrojnu vrednost
?.3 0%A!+.H
?.3.1 !riadnost simbola :rui
?.3.2 Odredjivanje i menjanje velicine slova
?.4 Bos 7unkcija za komuniciranje sa korisnikom
?.5 'unkcije za dinamicko uravljanje 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 naraviti ;rozolike< alikacije5 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 tiova odataka. Ovaj
sistem je zastareo i jezici nove :eneracije su objektno orijentisani1OO!3 no i takvim jezicima
strukture nisu neoznate. $e ocekujem da ako ste ocetnik ovo sada s9vatite5 s9vaticete
olako kako budete naredovali....
%reba da znate da je svaki ocetak suvoaran 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 ;najoznatiji<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 nr 3?5E
3 G 1C
2
2 ? G 1C
1
2 5 G 1C
C
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.
!orilicno 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
zaisu bitiE
I1C11CCI2 H 1G2
5
2 CG2
4
2 1G2
3
2 1G2
2
2 CG2
1
2 CG2
C
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 zaisuE
) 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 komlikovanije 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 zais. &esenjeE
I44I1C H 44K2 22K2 11K2 5K2 2K2 1K2
C C 1 1 C 1
/adati broj 44 delimo sa dva5 ostatak zaisujemo isod 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 odozadiE
1C11CC. Dosli smo do resenjaD !okusajete kao roveru da uradite konvertovanje ovo:
binarno: broja u decimalni.
2.$ Jezicki tipovi podataka
!ostoji nekoliko ;u:radjeni9< tiova odataka u jeziku 0 medjutim ostavljena je mo:ucnost
da se na vise nacina narave novi tiovi odataka5 nji9 konstruise ro:ramer. #zvedeni tiovi
su krajnje korisni ali isto tako i malo komleksniji za osmisljavanje a ce mo se za sada
zadrzati na nekim osnovnim tiovima odataka.
2.1 %romen"jive i konstante
&ecimo da zelite da naisete 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 ;naraviti< romenljivu1 takodje se nazivaju i
variable3 koja ce zauzeti od:ovarajuce arce memorije5 a velicina to: arceta zavisi od tia
romenljive. Oko tiova 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 uisivati 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 naravimo 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 naravimo3. *koliko neinicializujemo romenljivu ona dobija neku
bezveznu vrednost5 no u svim dru:im o:ledima onasanje inicijalizovane i neinicijalizovane
romeljive je otuno 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 surotnom nema svr9e koristiti i9.
2.2 %ravi"a za dode"jivanja imena prome"jivima
!romenljiva moze sadrzati roizvoljno ime ali ono treba da oisuje 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 tia 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 tia 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 tia 7loat ili 5ako je broj enormno veliki5 tia 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 oisane tiove odataka. )ko
deklarisemo romenljivu O kao ;s9ort int< ona ce sadrzati 1u 32bit-nom3 sistemu 2 bajta5
dakle dulo manje od re:ularno: int-a. @edjutim ona moze sadrzati brojeve ciji su ostezi
takodje dulo manji. Kljucna rec lon: omo:ucava da romenljiva ima veci ose: od ono: koji
bi ta romenljiva imala bez ove kljucne reci.
2.! 6nak / 7-3)
-ore omenuti tiovi su cuvali brojeve a romenljive koje su tia c9ar cuvaju simbole. ,vaka
romenljiva tia c9ar zauzima sve:a jedan bajt i moze da cuva samo jedan simbol. ,imbola
ima ukuno 255 i tu sadaju komletna en:leska abeceda5 brojevi i razni dru:i simboli i
znakovi. O ovom tiu odatka cemo detaljnije ricati kasnije.
3.$Operatori
Jerovatno vam je oznat termin ;oerator<5 dakle to je nr. 25 -5 K itd... Bezik 0 ima o:roman
sku oeratora ali to :a uoste ne cini kon7uznim5 kao sto ce te i videti. !ostoji ar bitni9
stvari E rvenstvo oeratora5 asocijativnost5 znacenje itd...
Oeratore 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 oeranada i oeratora. * navedenom rimeru
imamo 3 oeranda1rez5 a5 b3 i dva oeratora1 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 ;tacka-
zarez<1 P 3.
3.2 Operatori u jeziku 7
Jazan 7aktor je svakako rvenstvo oeratora5 sto znaci da ako naisete 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 oerator mnozenja ima najvece rvenstvo5 zatim
oerator oduzimanja i da najmanje rvenstvo ima oerator dodele vrednosti. ,ledi tabela
rvenstva oeratora.
--------------------------------------------------------------------
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 Komlemant nad bitovima I
G I !osredan ristu I
U I )dresa-od I
sizeo7 I Jelicina objekta I
1tMe cast3 I +kslicitna 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 oeratori dodele I
KH I vrednosti I
VH I G I
UH I G I
sizeo7 I G I
1tMe cast3 I G I
--------------------------------------------------------------------
, (zarez) | Redosle |
--------------------------------------------------------------------
)ko u navedenom izrazu zelite da rvo odradite sabiranje morate uotrebiti za:radeE
rez = (a + b) * 2;
#li mozete da naisete 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< naisacemo izrazE
re$ '= 2;
sto ce imati isti e7ekat. * tabeli mozete videti :omili oeratora koju se zasnivaju na ovom
rinciu.
@ozda niste uoznati sa znacenjem oeratora 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 oerator moduoE
re$ = 10 ) 2;
rez ce imati vrednost C.
3.3 5ubitak preciznosti
* o:lavlju 2 receno je koji tiovi romenljivi9 mo:u cuvati koje odatke. )ko imamo
romenljivu O tia int i romenljivu A tia 7loat te naisemo sledeceE
int *;
!oat + = 3.14;
* = +;
vrednost koju cuva O nece biti 3.14 jer je O tia 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 odacuje 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
zaitati koje: je tia ta romenljiva. &adi otimizacije iskoriscenja memorije5 sistem ce
kreirati romenljivu ono: tia u koji ce mocu da stane rezultat deljenja1sabiranja5mnozenja...3
dru:im recima ako su oba oeranda tia int1sto je ovde slucaj3 sistem ravi romenljivu tia
int i dodeljuje joj od:ovarajucu vrednost5 a osto int ne moze cuvati brojeve iza decimalno
zareza1 bez obzira sto je A tia 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 tia int 11C5 43 i
jedna tia 7loat1 1.C 3. !omocna romenljiva koju je za sebe kreirao sistem ce samim tim biti
tia 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 oerator ekslicitne konverzije1:ore omenuta je bila
inlicitna3 takodje zvano: ;cast oerator<. 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 tiove 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 naisati O22 ne:o O H O 2 15 zar neL @edjutim
oerator 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 nr. 3.14 od esencijalne je vaznosti da :reskom ne uotrebite
oerator zareza1 5 3 umesto oeratora tacka1 . 3. * sintaksi jezika 0 ovi oeratori imaju
otuno 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 zaitao :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
$aisacemo jedan ro:ram koji trebate da koirate u te=t editor vase: komajlera5 on je vrlo
jednostavan i ne radi nista korisno ali ce nam veoma dobro osluziti da uoznate osnovne
;komonente< 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 komajler 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
revodiocu1komajleru3 je otuno sve jedno dali ostoji sto 9iljada linija komentara ili ni
jedna jedina. !retostavite da ste naisali ro:ram koji ima oko 1CCC linija koda i osle dva
meseca 9ocete da otkolnite neke :reske u ro:ramu ili da :a unaredite1rosirite3. )ko ste
redovno isali komentare koji su oisivali sta koja :rua 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 revodjenja1komajliranja3 ro:rama- rerocesorske naredbe. &ecimo da
isete neki ro:ram sa svojim kole:om ili u ekii 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
sojite 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 uotrebljavati 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 komajler se zajedno nazivaju ;0 ,tandard
(ibrarM<1 ,tandardna Biblioteka jezika 03. O jednom delu 7unkcija1 ovaj ojam cemo uskoro
objasniti3 ,( ce mo se uoznati 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 besotrebno
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 naisati 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 tiova odataka a 7unkcija i ne uzima nijedan arametar.
$emojte mno:o luati :lavu oko ovo: tia odataka.
-KK rikazi oruku. Komentar.
-rint71;...<3. Ovo je jos jedna 7unkcija. %o je 7unkcija standardne biblioteke i sluzi za
isisivanje 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 naisao1de7inisao3 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 naravili vrlo jednostavnu alikaciju. ,ada cemo je malo
zakomlikovati. /elimo da se oruka isise 2CC uta. %o bi znacilo da treba 2CC uta naisati
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 isunjen 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 roust i ro:ram se ne bi valjano izvrsavao.
Jrlo je bitno roveriti da li je etlja valjano naisana5 dakle da ne bude beskonacna.
4.4.2 Operatori poredjenja
!rvo treba da s9vatite kako 7unkcionisu oeratori 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 naisali 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 oeratora
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 naisati ;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 neisunjavanje 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 zaaziti razliku izmedju oeratora dodele vrednost H i oeratora 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 isunjen. )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 naisane zbo: bolje re:lednosti inace rvenstvo oeratora DH je vece od oeratora
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 naisimo 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 uotreba viticasti9
za:rada nije ne o9odna5 no ne skodi. %reba naomenuti 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 isravna ali dru:i je bolji jer je kraci i re:ledniji. Demonstrirana je uotreba
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 ;uslovNetlje< retstavlja bas
to dakle dok je :od rezultat naredbe koju naisete 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/.4752005or '(
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 uravljati 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 isunjen 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 isunjen ro:ram izvrsi blok naredbi1 telo3 koji
sledi neosredno 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 ociona i
ubacuje se ako ima otrebe za tim kao sto je to bio slucaj u ovom rimeru. %akodje5 else
mora stojati neosredno 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 naisali 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 isunjen te ce etlja biti beskonacna. @edjutim
u njenom telu ostoji i7 naredba kojom roveravamo da li je romenljiva ;i< jednaka broju 2CC.
)ko nije isisuje se oruka ali ako jeste5 na scenu stua komanda ;break< kojom se ;iskace<
iz tela etlje i relazi se na deo koda koji sledi iza tela etlje.
-Da bi objasnili continue naisacemo 7or etlju kojoj ce mo isisati 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 isisati neku razlicitu oruku. Ovo se moze uraditi reko ;i7< naredbe ali ce
iz:ledati nez:rano5 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?;
deau!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< nr.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
;roadanje<. $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 uisujete roizvoljno ime i simbol
dvotacke1 E 3.
4.5.3 *s"ovni izraz
Ovo je jedini ternarni oerator 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
isunjen1dakle 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. * surotnom
vrednost koju ce dobiti @)O bice ona koja se nalazi levo od znaka dve tacke.
5. unkcije
'unkcije su orilicno lako ;svarljive< medjutim i nezaobilazne i jako korisne sto:a je dosta
bitno znati i9.
5.1 unkcije
Do sada su svi naisani 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 naisan 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 israviti.
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_funkije( lista_parametara)
{
!!!! telo_funkije("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 uisati ;void<.
- %me_funkije je dakle ime sto znaci da ako zelite da ozovete ovu 7unkciju da bi ona
odradila odredjeni zadatak uisacete 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_funkije 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:
$aisacemo ro:ram koji ce ored 7unkcije main13 imati i js 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
((deinicija 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.
!redostavimo da deklaraciju nismo naisali. !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 uotrebimo. Da bi se ovo izbe:lo
ribe:ava se isanju rototiova 7unkcije. !rototiovi 7unkcija sadrze ovratni ti 7unkcije5
ime 7unkcije i listu ar:umenata. %elo se ise kasnije i taj se ;roces< naziva de7inisanje
7unkcije. !rototiovi 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 naisete 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 tia 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
:luavo 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 oklaati odnosno da u ovom
slucaju romenljiva ret mora biti tia 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 tia 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 ti5 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 ose:
vaznosti romenljive1objasnicemo u sledecem odo:lavlju3 ali valja naomenuti. 'unkcija
Obim13 ne moze da ristui romnljivim koje ste deklarisali unutar 7unkcije main135 i uoste
unutar neke dru:e 7unkcije1zbo: ose: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 oet zbo: ose:a vaznosti5 a sledi i objasnjenje sta je to.
5.3 Opsezi vaznosti
!ostoje 3 ose:a vaznostiE lokalni5 :lobalni i eksterni. /adnji je retko koriscen a :a necemo
izeti u razmatranje.
Ose: vaznosti1 en:. ;scoe<3 je svojstvo svake romenljive. !romenljive sa lokalnim
ose: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 ristuite 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 komajlirati. !o:ledajmo liniju kod isod 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 :rananjaKetlji...
!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 dostune 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- un?cije
<oid /bim, <oid-;
((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 un?ciju /bim da bi: i$acunao obim te!a $adani:
dimen$ija
/bim,-;
((>ri?a$i re$u!tat
>rint,@/bim >ra<ouIaoni?a stranica A i M je ).2!A Bn@E re$-;
C
((deinicija 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 naomenimo da iak 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 otuno isto ime5 ali onda im se mora razlikovati lista
ar:umenata. %akve 7unkcije su reoterecene. Bedina 7unkcija koja nemoze biti
reoterecena je 7unkcija main13.
,vr9a reotereceni9 7unkcija je da u zavisnosti od tiova ar:umenata izvrsavaju razlicite
naredbe. &ecimo da imate dve 7unkcije koje treba razlicito da rade u zavisnosti od tia
ar:umenta koji joj rosledite. !ostoje dva resenjaE ili da 7unkcije imaju razlicito ime ili da budu
reoterecene 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
rikuljati odatke od korisnika i rikazivati rezultate rada vasi9 ro:rama. Ono sto ste do
sada ucili bilo je vezano iskljucivo za maniulaciju 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 maniulisete njima -S rikazujete rezultate5 te ce te jedan vrlo
sirok kru: zatvoriti i soznati orilican 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 komajler 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 tiom c9ar. 09ar znaci znak
i u romenljivu tia 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< nr. \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
komlikovanija ali sve ostaje lako i ;rirodno< uz malo vezbe. +vo kako se omocu ove
7unkcije isisuje neki te=t na ekranE
printf("vo !e pri"er");
'unkciji smo kao ar:ument redali te=t i on ce biti isisan 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
-------------------------------------------------------------------
I K . , I O!#, I
-------------------------------------------------------------------
I Yn I $e8 line 1relazak u novi red3 I
-------------------------------------------------------------------
I Yt I Horizontalna tabulacija1 H%3 I
-------------------------------------------------------------------
I Yv I Jertikalna tabulacija1 J%3 I
-------------------------------------------------------------------
I K . , I O!#, I
-------------------------------------------------------------------
I Yb I Backsace1 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 YOktal noI !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 odstamali 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 komajliranja.
>rint,Oo<o OneceO raditi...O-;
!o:ledajte rosledjeni ar:ument. On zaravo 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 #sravna 7orma
ovo:a ce iz:ledati ovakoE
>rint,Oo<o BOneceBO raditi...O-;
Ovim ce mo i mi i komajler biti zadovoljni. !rovezbajte ove naredbe a krenite dalje sa
ucenjem.
Ovo rikazivanje te=t na ekran je jednostavno uraditi ali stvari ostaju komlikovanije 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 >rint1 '(
8inc!ude 9stdio.:;
<oid main,<oid-
=
int A = 10;
!oat M = &7QW.4R12;
>rint,@Vrednost A je )dE do? je <rednost M ) Bn@E AE M-;
C
Jidljivo je da smo sada 7unkciji redali vise ar:umenata5 ukuno 3. *nutar uravljacno: niza
se nalaze izmedju ostalo: i uravljacki 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 uravljacki znaci su slicni komandnim sekvencama s tom razlikom
sto komandne sekvence sluze za 7ormatiranje te=ta a uravljacki znaci za rikazivanje
vrednosti romenljivi9.
Jerovatno ste se zaitali zasto smo za rikazivanje vrednosti romenljive ) koristili
uravljacki znak Vd5 a za za rikazivanje vrednosti romenljive B V7. &azlo: je taj sto se ove
romenljive razlikuju u tiu1 ) je tia int dok je B 7loat3 a za svaki ti romenljive ostoje
razliciti uravljacki znaci5 kao sto je slucaj i sa komandnim sekvencama. +vo tabeleE
------------------------------------------------------------------------------
I *. / I Ois 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 eksonencionalnom obliku I
------------------------------------------------------------------------------
*ravljacki znaci se ravilnije zovu ;seci7ikatori konverzije celi9 brojeva<. &ekli smo
jos ri ocetku da ostoji ekslicitna i imlicitna konverzija jedno: tia romenljive u
dru:i. +vo kako moze doci do inlicitne konverzije1malo izmenjen kod ret9odno:
rimera3E

(' P./0.A1 >rint2 '(
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 uravljackom
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 otuno 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 ) Bn@E AE M-;
C
0eo kod bi trebalo da vam je jasan sem naredbe u kojoj ozivamo 7unkciju scan713.
'unkciji smo rosledili uravljacki niz @)d )@ sto ce reci da korisnik treba da unese
vrednost tia #$% 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 amersend1 U 3 koji u
stvari redstavlja oerator ;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
uise vrednost koju uzme od korisnika u romenljive ) i B. Kako5 sta5 zastoL Kada smo
:ovorili o 7unkcijama rekli smo da se lokalnim romenljivim moze ristuati 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 ristuati ovim romenljivim i
menjati nji9ovu vrednost. $o5 7unkcija scan713 mora da uise vrednost u romenljive koje smo
joj redali kao ar:umente a se mora nekako zaobici :ore navedeno onasanje. %o se
ostvaruje omocu oeratora U jer mi kada koristio ovaj oerator5 u stvari ne rosledjujemo
7unkciji romenljivu vec njenu adresu u memoriji racunara a ce se u tu adresu uisivati
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 zaamtiti da kod
7unkcije scan713 morate koristiti oerator 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 ;iava< 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 tia 0H)& ili strin:5 razlo: je sto je
rvo otrebno da ovladate okazivacima i nizovima.
!ostoje jos mno:e 7unkcije za uis i isis 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 ti5 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 besotrebno 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
oeratora U 1;amersend< ili oerator ;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 isred imena B&OB stavili oerator 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 tiom 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 tia
'(O)%. +vo rimera deklaracije okazivacaE
int 'P/T;
ovo je okazivac. !rimecujete oerator G1 oerator osredno: ristua3 on :ovori da zelimo
da deklarisemo okazivac na ti #$%. Da nema oeratora G mi bi deklarisali klasicnu
romenljivu tia #$%. + 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/T-
rve dve linije su jasne. %recom linijom smo okazivacu !OK dodelili adresu B&OB-a5 te sad
reko okazivaca !OK mozemo iscitavati i uisivati neke vrednosti direktno u to mesto na
memoriji. 0etvrtom linijom smo iscitavali vrednost. !rimecujete da smo stavili 'P/T 5 dakle
oet smo koristili oerator G kao i kod deklaracije okazivaca. @edjutim znacenja ovo:
oeratora je dvojako5 u zavisnosti u kom se kontekstu uotrebljava. &azmotrimo na sledeci
nacim.
)ko naisemo 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 ristuamo. !a ako 9ocemo da dobijemo
vrednost na toj adresi na koju okazivac okazuje stavicemo oerator G isred imena
okazivacaE 'P/T . %o je uravo 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 naisacete 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 osredno1reko 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 uotrebe romenljve ) mi njenu vrednost
romenili tako sto smo uisali 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 oeratori 22 i " kada se koriste nad okazivacima.
!a onasaju se otuno isto. ,\ tim sto oeratori 22 i " imaju vece rvenstvo od oeratora G.
,to ce reci da ako imate komandu 'P%%;vi ce te inkrementirati1ovecati za jedan3 adresu
na koju okazuje okazivac !5 dok ako naisete ,'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 nr. 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 isisati N3 je 7QWE . je 45R O sto znaci da smo iz 7unkcije test13 useli
da romenimo vrednosti romenljivim koje su de7inisane unutar 7unkcije main13. %o smo
useli 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 rinciu 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 uise u te romenljive koje smo joj rosledili.
#.2. Nizovi
$izovi su niz romenljivi9 isto: tia koje su kontinualno naravljene u memoriji. )ko 9ocemo
da naravimo jednu romenljivu tia #$% isemoE
int broj;
) sta ako 9ocemo da naravimo 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 neotrebno du:5
medjutim stvari ostaju vidno lakse sa koriscenjem nizova. +vo kako se moze deklarisati niz
od 1C romenljivi9 tia #$%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 naravili 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 naisemo samo broj dakle bez ikakvo: inde=a to ce imati isti
e7ekat kao da smo naisali brojX0YE dakle ristuamo 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 )! Bn@E re$-;
C
#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 tia 7loat i ona je niz od
ukuno 5 elemenata1rvi 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 oeranada 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 zakomlikovane. $aime romenljivoj
;i< dodeljena je vrednost 45 dok je u rvoj etlji dobila vrednost C. Oba su nacina isravna ali
o:ledajmo sledecu naredbu5 naredbu uslova. * njoj stoji samo ; i 2 1 <. !odsetimo se da je
vrednost nula znaci da uslov etlje nije isunjen a da svaka dru:a vrednost znaci isunjenost
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 isisujemo rezultat koristeci 7unkciju rint713.
#.3 %romen"jive tipa c@ar
1naomenaE 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 tia 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 simboli1ukuno 255 nji93 i svaki
simbol ima svoj redni broj. @i mozemo roslediti decimalni broj1 a on se nalazi u rasonu 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 tia int. ,ledi
ro:ram koji ce na ekran1tacnije na konzolu3 isisati 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-;
C

Obratimo aznju na red koji sadrzi 7unkciju ront713. !rvo se rikazuje decimalna vrednost
romenljive simb5 i tu je sve jasno. /atim smo koristeci uravljacko: znaka Vc rekli da na
tom mestu treba da se isise neki znak. %o :ovori 7unkciji da umesto decimalne vrednosti
koju bude dobila treba da isise od:ovarajuci simbol iz tabele. Kao treci ar:ument smo
naveli ,c:ar-simb .Ovde smo izvrsili ekslicitnu konverziju1 objasnjeno u odeljku 3.33 ali
to nam i nije bilo otrebno jer ce 7unkcija rint713 sama izvrsiti konverziju1inlicitnu3 iz razlo:a
sto ona kao treci ar:ument ocekuje romenljivu tia c9ar a ne tia 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 isod nje:a je razan red.
&azlo: ovome je taj sto se od rednim brojem 1C nalazi uravo 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 naisemoE 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 naisacemo ovu
naredbuE
>rint,O)s OE T3JT-;
Koristili smo uravljacki 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 naisacemo dva mala ro:ramaE
(' P./0.A1 V3FMA51 '(
8inc!ude 9stdio.:;
<oid unc,int a-
=
a = 123;
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-;
C
%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 unc,c:ar aXY-
=
strc>#,aE @no<a5<rednost@-;
C
<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 strcM13 " ona sluzi za dodeljivanje jedno: strin:a dru:om.
!a]^e vam na amet da smo mo:li da nai]emoE
a = Ono<a5<rednostO;
@edjutim to nije omo:uceno a se za dodavanje nove vrednosti strin:u koristi 7unkcija
strcM13. O ovim 7unkcijama cemo :ovoriti u narednim o:lavljima.
/a kraj cemo jos jednom naomenuti da je veoma vazno da za niz c9ar-ova izdvojite
dovoljno mesta u memoriji5 dakle o:romna je :reska naisatiE
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 strcM13 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 ctMe.95 mat9.95
stdlib.9. ,vi ovi 9eader 7ajlovi se isoru_uju uz svaki valjan 0 komajler 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
strcM13E
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 tiu odataka c9ar i strin:1niz c9ar-ova35 zadrzacemo se malo vise
na ovoj 7unkciji- naisacemo kako iz:leda njena de7inicija i zatim je roanalizirati.
#zvedba 7unkcije strcM13E
(' 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 urostili 7unkciju strcM13 stavili smo da njen ovratni ti bude
void a ne c9arG. $asu 7unkciju za koiranje smo nazvali koiraj13 a arametri su ostali isti kao
i kod strcM13.
@ozda neuvidjate razlo: zasto je dru:i ar:ument constantan. Od:ovor lezi u tome cemu je
7unkcija namenjena- koiranju 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 koiranje. %akodje
smo koristili oerator 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 koiramo a samim tim uslov 'i$< A= ZB0Z
nece biti isunjen 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 koira onoliko znakova dru:o: ar:umenta koliko je
navedeno trecim ar:umentom. Dru:im recima strncM13 koira 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 naisali rec2XQY = [B0[; razlo: je taj sto 7unkcija strncM135 za
razliku od strcM135 ne dodaje znak za kraj strin:a a :a moramo izricito dodati.
Bedna naomena5 treci ar:ument ove 7unkcije je tia sizeNt. Ovaj ti odatka ne moze cuvati
ne:ativne brojeve samo ozitivne1 isto onasanje isoljava 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 sojite 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 strncM135 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
>rint,@.eci su >ot>uno isteA@-;
C
'unkcijom strncm13 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 isisati 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 tia double.
&.2.2 Stepenovanje vrednosti
/a steenovanje 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 steenovati a dru:i
ar:ument je eksonent tj.broj kojim se steenuje. )ko naisemo o811C533 kao ovratnu
vrednost dobicemo 1CCC.
/a dobijanje kvadratno: korena neko: broja koristi se s`rt13. Ona vraca vrednost tia 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 asolutne vrednosti broja1 dakle vraca uvek
ozitivnu vrednost3
doub!e mod,doub!eE doub!e-; Oerator 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 otuno isto kao i ceil13 s\tom razlikom sto rosledjeni
ar:ument zaokruzuje na najblizu manju vrednosti. %ako da ako naiseteE
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
!reorucujem 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 zaisani 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 isisana je da \r\ jeste slovo. # to je lo:icno ali sta bi bilo
isisano da umesto c:ar a = ZrZ; stoji c:ar a = 144; S )ko ste omislili da ce se
isisati 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 ristua. @i bi smo dakle romenljivoj )
dodelili vrednost 144 sto znaci da ce ) sadrzati taj broj. * o:lavlju >.3 smo naisali ro:ram
koji nam isisuje 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 otuno isto kao i isal9a13 s\ tom razlikom sto
roverava dali je rosledjeni ar:ument broj ili ne. )ko jeste broj 7unkcija vraca vrednost 15 u
surotnom vraca C.
int isa!num, int-; *koliko je rosledjeni ar:ument slovo ili broj5 7unkcija vraca
vrednost 1 a u surotnom C.
int iss>ace, int-; !omocu issace13 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 surotnom
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 :luavo 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 naisite >utc:ar,ZBaZ-; i _u^ete ;bee< zvuk na
vasem racunaru.
int >uts, const c:ar'-; ,luzi za rikazivanje teksta na ekran. $esto slicno out
rint713 uz razliku sto nemoze da rikazuje vrednosti romenljivi9 vec iskljucivo tekst.
&ekli smo ranije da je scan713 vrlo ;iava< 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.
$aisacemo 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
((deinicija &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 rouste isravite 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 uisani i eventualni
razmaci1ako i9 je korisnik uneo3. $aisite 7unkciju koja ce se ozivati u sledecoj liniji koda da
israviti ovaj roust ;brisuci< neotrebne znake razmaka. ,recnoD
&.5 unkcije za dinamicko uprav"janje memorijom
,ve 7unkcije koje cemo sominjati 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 uravo 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 oerator 0 jezika1 kao sto su i recimo 2 ili K oeratori3 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 nr. 1C romenljivi9 tia #$%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 naisemoE
si$eo,int- ' 10
Dakle ovo :ovori revodiocu1komajleru3 ;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
uisujemo vrednosti u alociranu memoriju omocu 7unkcije strcM135 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 uoste 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- komaktnije iskoriscenje memorije.
#macemo jedan rimer sa ovakvim ristuom ali re to:a morate da znate jos 1samo3 sta je
realokacija i ;curenje memorije<.
0urnje memorije je jedina losa stvar kod dinamicko: uravljanja 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-;
$aasalis 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 uoste nije bitno3 i adresu to: bloka dodelili oet 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 ristuiti. %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 oasno 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 rasolozivu 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 isravljena 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.
!redostavimo 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 besotrebna5 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--;
C
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 otuno 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 surotnom rvo izvrsilo mnozenje a tek onda sabiranje.
'unkcija realoc135 out malloc135 vraca adresu realocirane memorije5 a smo mi tu adresu
dodelili okazivacu %+O%.
$a kraju5 omocu rint713 rikazujemo novu5 ;otimizovanu< 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;
broj = rand,-;
>rint,@7obijeni broj je )dBn@E broj-;
C
!rvo smo deklarisali romenljivu B&OB koja je tia #$%. /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 naomenaE 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 oterecivati. $aomenimo ovde znacenje reci $*((- to je sinonim1 tacnije-
makro3 za okazivac na ti void1 dakleE void G3. ,a ovim se 1oet3 ne morate oterecivati5
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
ose: 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: neoznato: nema a zeljeni ose: 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 naisite ro:ram koji ce :enerisati
2C random brojeva1omocu etlje3 u ose:u od C do 15 i koji ce izbrojati koliko se uta
ojavljuje C a koliko uta 1.
(. Strukture
,vi do sada uotrebljavani tiovi odataka u ovom tutrialu bili su osnovni1 rosti3 tiovi. %o su
na rimer #$%5 '(O)%P 0H)&... $asurot njima5 ostoje i izvedeni1slozeni3 tiovi 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; (' itd... '(
C;
&ec struct :ovori da je u itanju struktura. ,ledi ime strukture i zatim blok naredbi1 telo
strukture3 a kao sto znate5 blok naredbi je oivicen sa Z i [. *nutar tela strukture de7inisani su
clanovi te strukture5 nji9ov broj je neo:ranicen a mozete naraviti strukturu koja nema ni
jedan clan1mada je ta struktura vise ne:o beskorisna3. * ovom rimeru5 clanovi strukture su
rosti tiovi odataka.
Kada i zasto koristiti struktureL &ecimo da 9ocemo naraviti 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 uisivao
svoje odatke ce morati da uise ime 5rezime i :odiste. %o nam :ovori da bi bilo z:odno da
naravimo novi ti odatka1 strukturu3 koji ce se zvati nr ;Osoba< i koji ce u sebi sadrzati
odatke o imenu5 rezimenu i :odistu korisnika. $aisimo tu strukturuE
struct /soba5st =
int Iod;
c:ar imeX25Y;
c:ar >re$imeX25Y;
C;
Ovim smo naravili ovi ti odatka koji se zove OsobaNst. %o znaci da cemo moci da
naravimo1deklarisemo3 romenljive ovo: tia5 isto kao sto deklarisemo romenljive tia #$%5
na rimer. +vo kako bi to iz:ledaloE
struct /soba5st ?orisni?;
$a ovaj nacin smo deklarisali romenljivu koja se zove ;korisnik< koja je tia OsobaNst. Da
nema ono: ;struct< isred OsobaNst5 deklaracija bi bila otuno ista kao i za ti odatka nr.
#$% ili '(O)%. @edjuim to ;struct< moramo isati da bi komajler1revodilac3 znao da se radi
o izvedenom tiu odatka. $aisimo ro:rama koji koristi ovu strukturuE
(' >roIram JT.GTTG.31 '(
8inc!ude 9stdio.:;
8inc!ude 9std!ib.:;
8inc!ude 9strinI.:;
((na>ra<i,deinisi- no<i ti> >odat?a, stru?turu-
struct /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;
C
De7inicija strukture OsobaNst treba da vam je jasna. * 7unkciji main13smo naravili
romenljivu ;korisnik< koja je tia OsobaNst. /atim deklarisemo omocnu romenljivu1mada
smo mo:li kod naisati 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 ristuamo clanu ;:od< i
dodeljujemo mu vrednost koju ima romenljiva ;om<. %o ristuanje je izvedeno omocu
oeratora tacka1 . 3 Dakle struktura je ;sku< vise romenljivi9 razliciti9 tiova5 a mi reko
oeratora ;tacka< mozemo da ristuamo tim romenljivim i menjamo im vrednosti. Kao
vezbu zavrsite ro:ram tako da u ;korisnik< takodje uise ime i rezime. $e zaboravite da se
za koiranje strin:ova koristi 7unkcija strcM135 koja je objasnjena u ret9odnom o:lavlju.
%akodje mozete raviti i nizove izvedeni9 tiova odataka a nji9ova uotreba je otuno ista
kao i kod rosti9 tiovaE
struct /soba5st b$<X100Y;
!ristuanje 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 uisujete 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 naravili clan ;:od< onda ce rva
vrednost koju naisete izmedju viticasti9 za:rada biti dodeljena uravo 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 isisivanje
odataka na konzolu1ekran3 i jedan za uzimanje odataka sa konzole. %ok za uzimanje
odataka se naziva ; stdin < a tok za isis 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 isisan na konzoli.
Bos jedna je bitna stvar- rikazivanje te=t na konzolu je veoma sor 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 tia 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 uuceni u to kako radi ba7er. Ova 7unkcija sluzi
za uzimanje jedno: znaka od korisnika5 tacnije iz ba7er ali ojasnicemo na sledecem
rimeruE
(' >roIram Maer1 '(
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
retostavimo da je korisnik uneo bas samo jedan znak. /atim smo omocu rint713 na ekran
istamali ;-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 usesno. /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
oet 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
isravan 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 surotnom od korisnika se trazi da onovo
unese odatke.
# sta mislite dali ce korisnik morati onovo da unesete odatke1 ako retostavimo da je rvi
ut uneo samo jedan znak3L $ece moratiD &azlo: je jednostavan- kao sto smo rekli
ba7erovanje se vrsi u redove1 i za isis i za citanje3 to znaci da mi u ba7er nismo uisali 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 Maer1 '(
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 uisivali
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: tia
odatka i kako on radi nije neo9odno da znate1vec samo da :a koristite3 a vas sa tim
necemo oterecivati.
Kada smo naravili 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 otunu kontrolu nad odredjenim 7ajlom tako da mozemo
uisivati i citati odatke iz nje:a. Otvaranje toka se vrsi omocu 7unkcije 7oen13 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,>-;
C
!rvo stvaramo okazivac na '#(+5 zatim omocu 7oen13 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 uisivanje1 sledi tabela
svi9 znakova koje mozete koristiti kao i nji9ovo znacenje3.
/atim smo koristili 7unkciju 7rint713 koja ima slicnu sintaksu kao i rint713 s\ tom razlikom sto
ne mora da isisuje odatke u stdout vec i9 moze uisivati i u tok ka nekom 7ajlu1 a u koji tok
se odaci uisuju 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 uis I
----------------------------------------------------------------------------------------
I a I Otvaranje ili kreiranje te=tualno: 7ajla za doisivanje I
----------------------------------------------------------------------------------------
I rb I Otvaranje binarno: 7ajla za citanje I
----------------------------------------------------------------------------------------
I 8b I /amenjivanje ili kreiranje binarno: 7ajla za uis I
----------------------------------------------------------------------------------------
I ab I Otvaranje ili kreiranje binarno: 7ajla za doisivanje 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 uisani u 7ajl na koji taj okazivac
okazuje a ne na ; stdout<.
int fcanf(FILE *, upravljacki niz, parametar1,parametar2,...);
(,licnosti i razlike izmedju scan713 i 7scan713 su kao i kod rint713 i 7rint713. 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 uisivanje jedno: znaka1rvi ar:ument3 u 7ajl koji je naveden dru:im ar:umentom)
!rimeticete da je rvi ar:ument tia #$% tako da mozete roslediti i romenljivu tia 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 *);
(!out :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#nt c"ar *, FILE *);
(!onasa se otuno isto kao i 7:es13 ali uisuje odatke u 7ajl. !rimeticete da nema
ar:umenta duzine znakovno niza osto je on 7unkciji oznat.
$esto narednije #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
neismenoscu3 moj e-mail je to=iasezamro.com.
May the Source be with you!

You might also like