You are on page 1of 51

Srpski,kolskiC

tutrial
Autor:NemanjaTodi

Sadraj

Uvod

1.Brojevnisistemi
1.1Decimalnibrojevnisistem
1.2Oktalnibrojevnisistem
1.3Binarnibrojevnisistem
1.4Hekasadekadnibrojevnisistem
1.5Konverzijaizdecimalnoubinarnizapis
2.Jezickitipovipodataka
2.1Promenljiveikonstante
2.2Pravilazadodeljivanjaimenapromeljivima
2.3DecimalnitipINT
2.4RealnitipFLOATIDOUBLE
2.5KljucnereciSHORTiLONG
2.6ZnakCHAR
3.Operatori
3.1 Izraziinaredbe
3.2OperatoriujezikuC
3.3Gubitakpreciznosti
3.4Operatoriinkrementiranja(++)idekrementiranja()
3.5 Napomena
4.Naredbe.Strukturaprograma
4.1 HelloWorld,OsnovnestvarivezanezajezikC
4.2Komentari
4.3 Naredba#include.Headerfajlovi.Standardnabiblioteka.
4.4Osnovnestvarivezanezafunkcije.Bloknaredbi.
4.4.1Petljawhile
4.4.2Operatoriporedjenja
4.4.3Petljadowhile
4.4.4Forpetlja
4.5Naredbegrananja
4.5.1Naredbagrananjaif
4.5.2Naredbagrananjaswitch
4.5.3Uslovniizraz
5.Funkcije
5.1Funkcije
5.2FunkcijaObim()
5.3Opsezivaznosti
5.4Preopterecivanjefunkcija
6.Osnoveprikupljanjapodataka
6.1Napomenaorazliciizmedjutextaiznaka
6.2.Funkcijaprintf()
6.3Funkcijascanf()
6.4Zakljucak
7.0PokazivaciiNizovi
7.1Kakoradepokazivaciiadrese.
7.1.2Pokazivaciifunkcije
7.2.Nizovi
7.3Promenljivetipachar
7.4Nizpromenljivihtipachar

8.Nekeodfunkcijastandardnebiblioteke
8.1STRING.H
8.1.2Funkcijezakopiranjestringova
8.1.3Funkcijenadovezivanja
8.1.4funkcijeporedjenja
8.2 MATH.H
8.2.1Trigonometrijskefunkcije
8.2.2Stepenovanjevrednosti
8.2.3Zaokruzivanjenacelobrojnuvrednost
8.3CTYPE.H
8.3.1Pripadnostsimbolagrupi
8.3.2Odredjivanjeimenjanjevelicineslova
8.4 Josfunkcijazakomuniciranjesakorisnikom
8.5Funkcijezadinamickoupravljanjememorijom
8.6 Generisanjerandombroja
9.Strukture
10.Radsafajlovima
10.1StandardnitokoviipojamBafera
10.2StrukturaFILEifunkcijezaotvaranjenovihtokova
10.3Funkcijezabaratanjesafajlovima

UVOD
ProgramskijezikCjekonzolnistocerecidaprekonjeganemozete(bezkoriscenjanekih
dodataka)napravitiprozolikeaplikacije,noovonetrebadavasrazocaraudogledno
vremesemozeteitimepozabaviti.
Cjeistrukturnijezikdaklekorististrukturekaoprimaranvidizvedenihtipovapodataka.Ovaj
sistemjezastareoijezicinovegeneracijesuobjektnoorijentisani(OOP)noitakvimjezicima
strukturenisunepoznate.Neocekujemdaakostepocetnikovosadashvatite,shvaticete
polakokakobudetenapredovali....
Trebadaznatedajesvakipocetaksuvoparanidajezaucenjebilokogprogramskogjezika
potrebnodostavremenatrudaipomalopameti.Nedajteseobeshrabrii!
Padapocnemo.

1.0 Brojevnisistemi
Postoji nekoliko brojevnih sistema a najpoznatijisu: decimalni, oktalni, binarni i
hekasadekadni.Onostovitrebadaznatejekakoseizjednogbrojevnogsistemakonvertuje
brojudrugibrojevnisistem.
1.1 Decimalnibrojevnisistem
DecimalniBSjeskupkojiima10cifaraitosusledece:0,1,2,3,4,5,6,7,8,9.Pravljenjem
razlicitihkombinacijamozetedobitibrojevekaostosu789,0,1,49,32757idr.Evoprimera
kakosenadrugacijinacnmozepredstavitibrojnpr385:
3*102+8*101+5*100=3*100+8*10+5*1=300+80+5=385.
Provezbajtesajosparbrojeva.
1.2 Oktalnibrojevnisistem
OktalniBSjeskupkojiima8cifaraitosu:0,1,2,3,4,5,6,7.Bitnojeznatikakodabrojeve
ovogsistemaprevedeteudecimalnebrojeve.Evoprimera:oktalno142jedecimalno98:
|142|8=1*82+4*81+2*80=1*64+4*8+2*1=64+32+2=|98|10.
Poprilicnojednostavansistem.
1.3 Binarnibrojevnisistem

BinarniBSjeskupkojiima2cifreitosu:0,1,tecebinarnibroj101100udecimalnom
zapisubiti:
|101100|2=1*25+0*24+1*23+1*22+0*21+0*20=|44|10
Vrloslicnoprethodnimprimerima.
1.4 Hekasadekadnibrojevnisistem

Imacak16simbola:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.Bicevampotrebnodaznatekoje
vrednostiimajunavedenaslovaudecimalnomzapisu:
A=10
B=11
C=12
D=13
E=14
F=15
Primer:
|A2F|16=10*162+2*161+15*160=2560+32+15=|2607|10
Ovojemalokomplikovanijealibitnojeuvidetidaseslovazamenjujuodgovarajucim
vrednostima.
1.5 Konverzijaizdecimalnoubinarnizapis
Biceteuprilicidavrsiteovakvukonverziju.Obajsnicunasledecemprimeru:Broj44prevesti
ubinarnizapis.Resenje:
|44|10=

44/2 22/2
11/2
5/2
2/2
1/2
001101

Zadatibroj44delimosadva,ostatakzapisujemoispodarezultatdeljenapisemolevoitaj
rezultatdelimosadvaitakodaljedokgodsenedobijenulakaokolicnik(nekaoostatak).
Sadaobratitepaznjunadobijeniodostatakaiprocitajtegaodpozadi:
101100.Doslismodoresenja!Pokusajetekaoproverudauraditekonvertovanjeovog
binarnogbrojaudecimalni.

2.0Jezickitipovipodataka
PostojinekolikougradjenihtipovapodatakaujezikuCmedjutimostavljenajemogucnost
dasenavisenacinanapravenovitipovipodataka,njihkonstruiseprogramer.Izvedenitipovi
sukrajnjekorisnialiistotakoimalokompleksnijizaosmisljavanjepacemosezasada
zadrzatinanekimosnovnimtipovimapodataka.
2.1Promenljiveikonstante
Recimodazelitedanapiseteprogramkojicedasaberedvabrojakojecekorisnikuneti.
Procesradaprogramabiisaoovako:korisnikunosiprvibroj,programtajbrojsacuva,zatim
korisnikunosidrugibrojiprogramtajbrojtakodjesacuva.Postavljasepitanjegdetajbroj
sacuvati?OdgovorjeuRandomAccessMemory(RAM)odaklecemobrojpopotrebi
iscitavati.Ovoserealizujetakostocemonapravitipromenljivu(takodjesenazivajui
variable)kojacezauzetiodgovarajuceparcememorije,avelicinatogparcetazavisiodtipa
promenljive.Okotipovapodatakainjihovimkarakteristikama(ajednaodnjihjeikolicina
zauzetememorije)cemosepozabavitikasnije.
Bitnojedauviditedaseupromenljivumoguupisivatiiiscitavatipodacisvedokta
promenljivapostojiumemoriji.Vratimosezadatku,dakleucitalismodvabrojakojavalja
sabrati.Sledece,trebanammestoumemorijiracunaraukojemcemosnimitirezultat

sabiranja,dakletrebanamjosjednapromenljiva.Njojcemododelitivrednostzbiraprvedve
promenljivekojesmoucitali.Tojeto.Trebalobidavamjejasnostasupromenljiveicemu
sluze.Sadacemoobjasnitiikakosekoriste.
Dvesubitnestvarikodkreiranja(pravilnijerecenoinstancovanja)promenljivih:njihova
deklaracijaiinicijalizacija.Recimodazelimodanapravimopromenljivuukojucemosmestiti
prvibrojizgorenavedenogzadatka,tocemouraditiovako:
inta;
Ovimsmodeklarisalipromenljivukojaimatipint(stocerecidamozecuvatisamocele
brojeve,ovimcemosekasnijepozabaviti)inaglasilidaseonazovea.Pogledajmosledeci
primer:
inta=157;
dodalismo=157.Tojeinicijalizacijailitidodavanjevrednostipromenljivojuistovreme
kadajeideklarisemo(napravimo).Ukolikoneinicializujemopromenljivuonadobijaneku
bezveznuvrednost,nousvimdrugimpogledimaponasanjeinicijalizovaneineinicijalizovane
promeljivejepotpunoisto.Postojeiglobalnepromeljivekojimasedeklaracijomautomatski
dodeljujevrednost0,nootompotom.
Konstantesutakodjevidpromenljivihalisenjimamozevrednostdodelitisamojednom,
prilikominicijalizacije.Udaljemtokuprogramanjihovavrednostsesamomozeiscitavati.
Delujebeskorisno?Painijebas,recimodauprogramukoristitebrojPi,onimakonstantnu
vrednost3.14tecemopromeljivuPidefinisatitakodasenjenavrednostnemozemenjati.
Ovako:
constintPi=3.14;
Bitnojeuvidetidakonstantemorajubitiinicijalizovane,usuprotnomnemasvrhekoristitiih.
2.2Pravilazadodeljivanjaimenapromeljivima
Promenljivamozesadrzatiproizvoljnoimealionotrebadaopisujenamenupromenljive,
dakleakotrebadacuvazbirnekihbrojevaverovatnocetejenazvatizbirilirezultat.
Imenapromenljivihsmejudasadrzeslova,brojeveiznakdonjecrte(_).Napocetkuimena
semoranaciilislovoilidonjacrta,brojnesme!
2.3DecimalnitipINT
Ovajtipjenajkoriscenijitippodatka.Promenljivekojesutipaint(skracenicaodinteger)u
32bitnomsistemuzauzimaju4bajtaiutakvimpromenljivimmozetecuvatidecimalnecele
brojevekaostosu0,789,4000,1,4569isl.Primerdeklaracijeovakvepromenljive:
intbroj1;
intbroj2=150;
2.4RealnitipFLOATIDOUBLE
Nedostataktipaintjeutomestonemozecuvativrednostikojeimajudecimalnutacku
odnosnozarez(daklerealnebrojeve)vecINTsvecifreizazarezaodbacuje.Dabicuvala
ovakvebrojevepromenljivamorabititipafloatili,akojebrojenormnoveliki,tipadouble.
Primerdeklaracijeovakvihpromenljivih:
floatx;
doubley;
2.5KljucnereciSHORTiLONG
Ovekljucnerecimoguseprimenitisamonadosadaopisanetipovepodataka.Ako
deklarisemopromenljivuXkaoshortintonacesadrzati(u32bitnom)sistemu2bajta,
dakleduplomanjeodregularnoginta.Medjutimonamozesadrzatibrojevecijisuopstezi
takodjeduplomanji.Kljucnareclongomogucavadapromenljivaimaveciopsegodonogkoji
bitapromenljivaimalabezovekljucnereci.

2.6ZnakCHAR
Gorepomenutitipovisucuvalibrojeveapromenljivekojesutipacharcuvajusimbole.Svaka
promenljivatipacharzauzimasvegajedanbajtimozedacuvasamojedansimbol.Simbola
imaukupno255ituspadajukompletnaengleskaabeceda,brojeviiraznidrugisimbolii
znakovi.Oovomtipupodatkacemodetaljnijepricatikasnije.

3.0 Operatori
Verovatnovamjepoznatterminoperator,dakletojenpr.+,,/itd...JezikCimaogroman
skupoperatoraalitogauopstenecinikonfuznim,kaostoceteivideti.Postojiparbitnih
stvari:prvenstvooperatora,asocijativnost,znacenjeitd...
Operatoreporedjenjaovdenecemoobjasnjavati,tocemouraditikasnije,priliko
objasnjavanjagrananjakoda.
3.1 Izraziinaredbe
Ranijesmonaveliprimerukojemsmosabiralidvabroja:a+b.Rezultatsmosmestaliu
promenljivurez,akoodovihpodatakaformiramoizrazujezikuCdobijaovo:
rez=a+b;
Izvedimokonstatacijudajeizrazkombinacijaoperanadaioperatora.Unavedenomprimeru
imamo3operanda(rez,a,b)idvaoperatora(=,+).Takodjepostojeidvaizraza,prvije
sabiranjepromenljiveaib,drugijedodeljivanjetevrednostipromenljivojrez.Sveovo
zajednocinijednunaredbu.Naredbajedakleskupizraza(cijibrojmozebitineograniceno
velikialitakodjemozebitii0praznanaredba)kojiseobaveznookoncavaznakomtacka
zarez(;).
3.2OperatoriujezikuC
Vazanfaktorjesvakakoprvenstvooperatora,stoznacidaakonapisetenaredbu:
rez=ab*2
prvoceseizvrsitiizrazb*2paceseodaoduzetirezultatmnozenjainakrajusetarazlika
dodeljujepromenljivojrez.Uvidjamodaoperatormnozenjaimanajveceprvenstvo,zatim
operatoroduzimanjaidanajmanjeprvenstvoimaoperatordodelevrednosti.Sleditabela
prvenstvaoperatora.

OPERATOR
|
OPIS
|

()
|Pozivfunkcije
|
[]
|Indexniza
|
>
|Pokazivacnastrukturu
|
.
|Clanstrukture
|

|Unarniminus
|
+
|Unarniplus
|
++
|Inkrementiranje
|

|Dekrementiranje
|
!
|Logickanegacija
|

~
|Komplemantnadbitovima |
*
|Posredanpristup
|
&
|Adresaod
|
sizeof
|Velicinaobjekta
|
(typecast)
|Eksplicitnakonverzija
|

*
|Mnozenje
|
/
|Deljenja
|
%
|Ostatak(moduo)
|

+
|Sabiranje
|

|Oduzimanje
|

<<
|Pomeranjebitovaulevo
|
>>
|Pomeranjebitovaudesno |

<
|Manjeod
|
<=
|Manjeilijednako
|
>
|Veceod
|

OPERATOR
|
OPIS
|

>=
|Veceilijedanko
|

==
|Jednako
|
!=
|Razlicito
|

=
|
*
|
+=
|
*
|
=
|
razni
|
*=
|
operatoridodele
|
/=
|
vrednosti
|
%=
|
*
|
&=
|
*
|
sizeof
|
*
|
(typecast)
|
*
|

,(zarez)

|Redosle

Akounavedenomizrazuzelitedaprvoodraditesabiranjemorateupotrebitizagrade:
rez=(a+b)*2;
Ilimozetedanapiseteuvisenaredbi:
rez=a+b;
rez=rez*2;
ovojeprostoijasno.Medjutimpostojiskracenicakojumozemoprimenitinaizrazrez=rez
*2,umestodadvaputapisemoreznapisacemoizraz:
rez*=2;
stoceimatiistiefekat.Utabelimozetevidetigomilioperatorakojusezasnivajunaovom
principu.

Mozdanisteupoznatisaznacenjemoperatoraostatka(moduo)%.Ukolikobiimaliizraz:
rez=10/2;
rezultatbibio5itajbrojbisedodeliopromenljivojrez.Ostatkaprideljenju10sa2nemapa
jeonnula.No,akozelimodarezsadrziostatakod10/2koristicemooperatormoduo:
rez=10%2;
rezceimativrednost0.
3.3Gubitakpreciznosti
Upoglavlju2recenojekojitipovipromenljivihmogucuvatikojepodatke.Akoimamo
promenljivuXtipaintipromenljivuYtipafloattenapisemosledece:
intX;
floatY=3.14;
X=Y;
vrednostkojucuvaXnecebiti3.14jerjeXtipaintatajtipnemozedacuvabrojevesa
decimalnomtackom(realnebrojeve).Xceimativrednostod3,dakledeoposledecimalne
tackeseodpacujeidolazidogubitkapreciznosti.
Postojiveomabitnastvarkojamozebitivrlonezgodna.Pogledajmoprimer:;
floatY;
Y=10/4;
ocekivanojevrednostY2.5alinije!VrednostYjeustvari2!Zasto?Analizirajmonaredbu
Y=10/4.Prvoseobavljadeljenjepatekondadodeljivanjevrednosti.Kadasedeljenjeobavlja
sistemujepotrebnamemorijaukojuceprivremenosmestitivrednostdeljenjaprenegostotu
vrednostidodelipromenljivojY,daklesistemcekreiratiprivremenupromenljivu.Trebase
zapitatikojegjetipatapromenljiva.Radioptimizacijeiskoriscenjamemorije,sistemce
kreiratipromenljivuonogtipaukojicemocudastanerezultatdeljenja(sabiranja,mnozenja...)
drugimrecimaakosuobaoperandatipaint(stojeovdeslucaj)sistempravipromenljivutipa
intidodeljujejojodgovarajucuvrednost,apostointnemozecuvatibrojeveizadecimalno
zareza(bezobzirastojeYtipafloatjersenjemuvrednosttekkasnijedodeljuje)dolazido
gubitkapreciznosti.
Dvasunacinazaizbegavanjeovakvogponasanja.Prvi,mozemouraditiovo:
Y=10/4*1.0;
dodalismo*1.0izrazuitimesmopostiglidapostojedvepromenljivetipaint(10,4)i
jednatipafloat(1.0).Pomocnapromenljivakojujezasebekreiraosistemcesamimtimbiti
tipafloatpanecebitigubitkapreciznosti.Svepomocnepromenljivesistemautomatskibrise
pozavrsetkunaredbeitakovracazauzetumemoriju.
Druginacinjeelegantniji,koristicemooperatoreksplicitnekonverzije(gorepomenutajebila
inplicitna)takodjezvanogcastoperator.Koristeciovajnacindobicemonaredbu:
Y=(float)10/4;
Uzpomoc(float)smopromenilitipbroja10izintufloat.Unutarzagradamozetestavljati
razlicitetipoveinatajnacindolazitidorazlicitihkonverzija.
Sveovecetemocidaprobatenadelu,kadabudemopocelidapisemoprogrameatocebiti
odsledecihpoglavlja.
3.4 Operatoriinkrementiranja(++)idekrementiranja()
ImamopromenljivuXkojojsmododelilivrednost15.
intX=15;
Zelimodajojpovecamovrednostza1(mozdadelujesumanutoaliveomacestocetese
sretatisaovakvompotrebom).Tomozemouraditinanekolikonacina:
X=X+1;
X+=1;
X++;

Prvadvaizrazasuvampoznataalitreciizrazjenovi,tojetakozvanainkrementacija.Ona
znacidacesevrednostipromenljiveXpovecatiza1,dastojiXvrednostbisesmanjila
za1.Uvedenajejerjemnogolakse/brzenapisatiX++negoX=X+1,zarne?Medjutim
operator++mozestojatiikakopretakoiposleimenapromenljive,ovako:
Y=10+X++;
Y=10+++X;
Razlikanijezanemarljiva.UzmimodajeX=15.UprvomslucajuvrednostYcebiti10+15.
UdrugomYcebiti10+16.RazlikajeutomestoseuprvomslucajuvrednostX
inkrementiratekpozavrsetkunaredbe(takozvanapostfiksnanotacija)doksevrednostXu
drugomslucajuprvoizvrsavainkrementacijapromenljiveXpasetekondaodradjuje
sabiranje,pautomtrenutkupromenljivaXimavrednost16.Ovosenazivaprefiksna
notacija.
3.5 Napomena
Kodpisanjarealnihbrojevanpr.3.14odesencijalnejevaznostidagreskomneupotrebite
operatorzareza(,)umestooperatoratacka(.).UsintaksijezikaCovioperatoriimaju
potpunorazlicitoznacenje!

4.0Naredbe.Strukturaprograma.
Odovogpoglavljacemopisatiprogramekojisemoguizvrsavatinaracunaru.Verovatnose
nekozapitaogdejestandardniHelloWorld!program,uzmalokasnjenjastizeion.Veci
deoprethodnogtextajebiovisemanjeteoriskidokceseodsadavecideoposlasvoditina
prakticnopisanjeprograma.
4.1 HelloWorld,OsnovnestvarivezanezajezikC
Napisacemojedanprogramkojitrebatedakopirateutexteditorvasegkompajlera,onjevrlo
jednostavanineradinistakorisnoalicenamveomadobroposluzitidaupoznateosnovne
komponentejezika.
/*PROGRAMHELLO_WORLD*/
#include<stdio.h>
voidmain()
{
//prikaziporuku
printf("Danijeoveporukeekranbibioprazan!\n");
}
Analizirajmoredpored.
4.2Komentari

Prvalinijakoda(/*PROGRAMHELLO_WORLD*/)neradinistatacnijekompajlerje
ignorise.Primeticetedasetextnalaziizmedjuznakova/*i*/,stoznacidajeupitanju
komentar.Cemuonsluzi?Pomocukomentaraprogrampostajecitljivijizacoveka,
prevodiocu(kompajleru)jepotpunosvejednodalipostojistohiljadalinijakomentarailini
jednajedina.Pretpostavitedastenapisaliprogramkojiimaoko1000linijakodaiposledva
mesecahocetedaotkolnitenekegreskeuprogramuilidagaunapredite(prosirite).Akoste
redovnopisalikomentarekojisuopisivalistakojagrupanaredbiradi,posaobivambio
olaksanjernebistemoralidadesifrujetekodvecsamodaprocitatekomentar.
Josjedanjenacinzapisanjekomentarapomocudvekosecrte(//vidiprimer).Razlikajeu
tomestocesekomentaromsmatratisveizmedju/*...*/odnosnoakokoristiteovesimbole
mozetepisatikomentareuviseredova,doksepomocusimbola//komentaromsmatrasve
odtogsimboladokrajatekucegreda.
4.3 Naredba#include.Headerfajlovi.Standardnabiblioteka.
Postojenaredbekojeseizvrsavajuutokuradaprogramaionekojeseizvrsavajusamo
jednom,utokuprevodjenja(kompajliranja)programapreprocesorskenaredbe.Recimoda
pisetenekiprogramsasvojimkolegomiliuekipiodvecegbrojaljudi.Svakiodprogramera
cepisatisvojdeoprogramauposebnimfajlovima.Kadasvizavrsesvojdeoposlaimacete
nekolikofajlovaukojimasenalazikodzaprogram.Imatedvemogucnosti,datekstove
spojiteujedanfajl(stonijedobrapraksa)ilidaihpovezetepomocunaredbe#include(stoje
dobrapraksa).Udrugomslucaju,standardizovanojedaekstenzijafajlovakojisepovezuju
bude.H(headerfajlovi).Natajnacinimacetevisemalihfajlovapacevamsamkodbiti
pregledniji.
Zastosmoizmedju<>unelistdio.h?stdio.hjesamojedanodgomileheaderfajlovakoji
sadrzeveomakorisnekodovekojeceteupotrebljavatiusvojimprogramima.Autoriovih
fajlovasuprogramerikojisuradilinaizradiprogramskogjezikaC.Sviheaderfajlovikoji
standardnodolazeuzsvakivaljanCkompajlersezajednonazivajuCStandard
Library(StandardnaBibliotekajezikaC).Ojednomdelufunkcija(ovajpojamcemouskoro
objasniti)SLcemoseupoznatiuovomtutrialumedjutimdostatogacemozaobici.
Konkretno,headerstdio.hsmoukljucilijercemokoristitifunkcijuprintfkojajedefinisanau
ovomzaglavlju.Usustini,mozemoukljucitiisveheaderfajloveSLalicetobespotrebno
povecatikolicinumemorijenaHDkojuzauzimaprogram.Dakle,ukljucujemosamoone
headerfajlovekojisadrzefunkcijekojesunampotrebne,ostalecemoizostaviti.

4.4 Osnovnestvarivezanezafunkcije.Bloknaredbi.
Svakiprogramjedinostozaistamoradaimajebarjednafunkcija,itaosnovnafunkcijase
morazvatimain.Sveostalemoguimatiproizvoljnaimena.Naime,kadaseizvrsava
program,naredbetogprogramaseizvrsavajuonimredomkojimsmoihpisali.Medjutimprvo
trebaodreditipocetnutackusvakogprograma,mestoodkojegacesepocetisa
izvrsavanjemnaredbi.Tomestojefunkcijamain.
Svakafunkcijaimanekolikoelemenata:tippodatkakojicevratiti,ime,argumente,telo.
Pogledajmofjumainizgornjegprimera:
intmain()
{
//prikaziporuku
printf("Danijeoveporukeekranbibioprazan!\n");

}
voidjetippromenljivekojucefunkcijavratiti.Naovommestumozestajatibilokojitip
podatka.Primetitedasenezadajeimepromenljivekojasevracakaorezultatfje,ovoje
logicnoautoceteseisamiuveriti.
mainjeimefunkcije.
(),listaparametarafunkcije.Onajepraznazatostopolaznojfunkcijiprogramamainne
prosledjujemonijednupromenljivu(parametar).Takodjeunutarzagradamozemonapisatii
void,ovojeuniverzalnitippodatkakojimozedazamenibilokojitipmedjutimtakodjekazei
daustvarionnijenijedanodtipovapodatakapafunkcijaineuzimanijedanparametar.
Nemojtemnogolupatiglavuokoovogtipapodataka.
//prikaziporuku.Komentar.
printf(...).Ovojejosjednafunkcija.Tojefunkcijastandardnebibliotekeisluziza
ispisivanjetextaivrednostipromenljivihnaekran.Mismoovomnaredbompozvalifunkciju
printf()ikaoparametarjojprosledilinizznakova"Danijeoveporukeekranbibioprazan!\n".
Tokakoceovafunkcijaiuzpomoccegaprikazatitextnaekrannasneinteresujejermije
samokoristimo,nekodrugijujevecnapisao(definisao)zanas.Mismougornjemprimeru
definisalisamofunkcijumain().
{}.Otvorenaizatvorenaviticastazagrada,oznacavajujedanbloknaredbi.Ujednouovom
slucajuonepredstavljajupocetakikrajtelafunkcijemain().Dakle,kadapozovetefunkciju
main()svenaredbekojesenalazeunutartelafunkcijecebitiizvrsene.
4.4.1Petljawhile
ProgramomHelloWorldsmonapravilivrlojednostavnuaplikaciju.Sadacemojemalo
zakomplikovati.Zelimodaseporukaispise200puta.Tobiznacilodatreba200putanapisati
printf()fju,nasrecupostojidalekoelegantnijeresenjekoriscenjepetljiodnosnonaredbi
ponavljanja.Ovimnaredbamasepostizedaseodredjenibloknaredbi(ilisamojedna
naredba)ponavljajunekolikoputa.Trisunaredbeponavljanja:while,dowhileifor.Svesu
torezervisanekljucnerecipasenemogukoristitikaoimenapromenljivih.Idemoredom.
Evokakobiizgledaloresenjeproblemaakogauradimoprekopetljewhile.
/*PROGRAMHELLO_WORLD_200*/
#include<stdio.h>
voidmain(void)
{
inti=200;

//petljawhile
while(i>0)
{
printf("Danijeoveporukeekranbibioprazan!\n");
i;
}//krajpetljewhile

Izakljucnereciwhile,unutarzagradestojiuslovi>0.Ovoznacidacesetelopetlje
izvrsavatidoklegodjeispunjenuslovdajeiveceodnule.Telopetljejesveonostose
nalaziizmedjuviticastihzagrada,slicnokaokodtelafunkcija.Unutartelafjaizvrsavajuse
dvenaredbefjaprintf()idekrementacijapromenljivei(i).Ukolikonebibilodrugogizraza

vrednostpromenljiveibibilastalnovecaodnule(tj.200)stobiznacilodacesepetlja
izvrsavatiunedogled.Tobibioveomaozbiljanpropustiprogramsenebivaljanoizvrsavao.
Vrlojebitnoproveritidalijepetljavaljanonapisana,dakledanebudebeskonacna.
4.4.2Operatoriporedjenja
Prvotrebadashvatitekakofunkcionisuoperatoriporedjenja.Akozelitedaproveritedalije1
veceod2izrazbiizgledaoovako:X=1>2.Ovonijetacnopajerezultatkojicebiti
smestenupromenljivuXjednaknuli.MedjutimdasmonapisaliX=5>2,uslovbibio
tacanivrednostupromenljivojXbibilajedan.Dakleakojeiskazporedjenjatacandobijase
brojjedan,akojerezultatporedjenjanetacandobijasebrojnula.Evolisteoperatora
poredjenja:

OPERATOR|Znacenje
|

<
|Manjeod
|
<=
|Manjeilijednako
|
>
|Veceod
|
>=
|Veceilijednako
|
!=
|Razlicito
|
==
|Jednakost
|

Uodeljku4.4.1smokoristilinaredbuwhile(i>0)...,moglismotakodjenapisatiwhile(i)
jercesepetljaizvrsavatisvedokjerezultatizrazakojisenalaziizmedjuzagradarazlicitod
nule.Razlogovomjestosesanulompredstavljaneispunjavanjenekoguslovaasa
jednicom(ilibilokojimbrojemkojijerazlicitodnule)tacnost.Prematomepetljawhile,kaoi
svedrugepetljeinaredbegrananja,ceseizvrsavatikadagodjerezultatuslovakojismo
zadalirazlicitodnule.
Trebazapazitirazlikuizmedjuoperatoradodelevrednost=ioperatorajednakosti==.Ako
imamoovakvusituaciju:
intX,Y,Z;
X=10;
Y=23;
Z=(Y==X);
VrednostuZcebiti0,jerYnijejednakoXpauslovnijeispunjen.Akobiumestoposlednje
naredbestojalaova:
Z=(Y!=X);
vrednostuZcebiti1jerjeYzaistarazlicitoodXpajesamimtimuslovzadovoljen.Ovdesu
zagradenapisanezbogboljepreglednostiinaceprvenstvooperatora!=jeveceodoperatora
jednako(=)painemapotrebezazagradamaalidakleneskodistavitiih.
4.4.3Petljadowhile
Ovajepetljaveomaslicnapetljiwhilestimstojekodwhilepetljemogucedasetelopetljene
izvrsinijednomjerseprvoproveravauslovpaakojeuslovtacanteloseizvrsavaitakou
krug,dokkoddowhilepetljeprvoseizvrsavateloazatimseproveravauslovitakoukrug
dokjegodrezultatuslovatacan.Primer,napisimoprogramkojiceodkorisnikatrazitida
unesebrojveciod500akokorisnikunesemanjibrojprogramcemutrazitidaponovounese
broj.Evokakobiizgledaoprimerakokoristimowhilepetlju.
/*PROGRAMbroj_veci_od_500_while_nacin*/

#include<stdio.h>
voidmain(void)
{
//deklaracijapromenljive
intn;
//uzmibrojodkorisnika
printf("Unesitebrojveciod500>");
scanf("%d",&n);
//dokjegodvrednostNamanjaod500trazinovibroj
while(n<=500)
scanf("%d",&n);
//prikaziporukuouspehu
printf("Unelisteispravanbroj!Svakacast.\n");

}
Svebitrebalodavamjejasnosemfunkcijescanf().Onasluzidaseodkorisnikauzmeneki
brojilitekst.Kakoonaradizasadanijebitno,objasnicemojekasnije.
Josjedinotrebaprimetitidakodpetljewhilenemaviticastihzagradakojeoznacavajutelo
petlje.Razlogtomejestotelopetljesacinjavasamojednanaredbapaupotrebaviticastih
zagradanijeneophodna,noneskodi.Trebanapomenutidatelofunkcijamorasadrzatipar
viticastihzagradabezobziranabrojnaredbiunutarnjih.
Evokaobiresenjeistogzadatkaizgledaloakokoristimopetljudowhile:
/*PROGRAMbroj_veci_od_500_do_while_nacin*/
#include<stdio.h>
voidmain(void)
{
//deklaracijapromenljive
intn;
//uzmibrojodkorisnikaprekodowhilepetlje
printf("Unesitebrojveciod500>");
do{
scanf("%d",&n);
}while(n<=500);
//prikaziporukuouspehu
printf("Unelisteispravanbroj!Svakacast.\n");

}
Obanacinasuispravnaalidrugijeboljijerjekraciipregledniji.Demonstriranajeupotreba
dowhilepetlje.Dakleprvosepisekljucnarecdozatimidetelopetlje(uovomslucaju
viticastezagradesmomoglidaizostavimojerseizvrsavasamojednanaredba)inakrajuse
proveravauslovunutarzagrada.
4.4.4Forpetlja
Sintaksaforpetljejetakodjejednostavnaikrajnjefunkcionalnaiakodelujemaloslozenije.
Onaizgledaovako:
for(izraz1;uslov_petlje;izraz2){telopetlje}

Umestoizraz1iizraz2mozetekucatibilokojunaredbu,dokuslov_petljepretstavljabas
todakledokjegodrezultatnaredbekojunapiseteturazlicitodnuletelopetljecese
izvrsavati.EvokakobiizgledaoprogramHelloWorld_200koriscenjemfornaredbe:
/*PROGRAMHELLO_WORLD_200_for*/
#include<stdio.h>
voidmain(void)
{
inti;
for(i=200;i>0;i++)
printf("Danijeoveporukeekranbibioprazan!\n");
}
Dakle,naredbai=200;ceseizvrsitisamojednomaproverauslovainaredbai++sasvakim
ponavljanjempetlje...
Ostalojesvejasno.
4.5Naredbegrananja
Pomocuovihnaredbimozemoupravljatitokomizvrsavanjakoda.Zadatak,odkorisnikauzeti
dvacelabrojaiodvecegoduzetimanji.Logicnoprvotrebauzetibrojeve,zatimproveritikoji
jeodnjihveciinakrajuizracunatirazlikuteprikazatirezultat.Jedinostozasadaneznateda
uraditejekakoodreditikojijebrojveci.Toodredjujemoprekonaredbegrananja.Uradicemo
ovajzadatakkoristecinekolikorazlicitihnacinagrananjakoda.
4.5.1Naredbagrananjaif
Resenjezadatkapomocuifa:
/*PROGRAMIF_NAREDBA*/
#include<stdio.h>
voidmain(void)
{
//deklaracijapromenljivih
intx,y,rez;
//uzimanjepodataka
printf("Unesiteprvipadrugibroj>");
scanf("%d%d",&x,&y);
//proverikojijebrojmanjiiracunaj
if(x>y){
rez=xy;}
else{
rez=yx;}

//prikazirezultat
printf("Rezlutatje=%d\n",rez);

Evoizgledasintakseifnaredbe:
if(uslov){telo}
Ifjekljucnarec,uslovmoradatirezultatrazlicitodnuledabisetelonaredbeifizvrsilo.
Ukolikouslovnijeispunjensvenaredbekojesenalazeutelunaredbeifbicepreskocene.
Vrlojednostavno.Udaljemkoduprimecujemokljucnurecelseizakojesleditelote

naredbe.Njomkazemodaakouslovifanijeispunjenprogramizvrsibloknaredbi(telo)koji
sledineposrednoizaovekljucnereci.Ukolikojeuslovifpetljetacanbloknaredbiizaelsece
bitipreskocen.Elsenemoraobaveznodastojiuzsvakuifkomandu,onajeopcionai
ubacujeseakoimapotrebezatimkaostojetobioslucajuovomprimeru.Takodje,else
morastojatineposrednopozavrsetkublokanaredbiifa.
Jedinostojostrebadaznatejeznacenjakeywordabreakicontinue.
Breaksluzidaseizadjeizpetlje.Recimodastenapisaliovakopetlju:
inti=0;
while(1)
{
if(i++==200)break;
elseprintf(recenica\n);
}
primecujemodaceuslovpetljewhilebitiuvekispunjentecepetljabitibeskonacna.Medjutim
unjenomtelupostojiifnaredbakojomproveravamodalijepromenljivaijednakabroju200.
Akonijeispisujeseporukaaliakojeste,nascenustupakomandabreakkojomseiskace
iztelapetljeiprelazisenadeokodakojislediizatelapetlje.
Dabiobjasnilicontinuenapisacemoforpetljukojojcemoispisatisvakidrugibrojizintervala
od0do200.
inti;
for(i=0;i<200;i++){
if((i%2)!=0)continue;
printf(%d\n,i);
}
Prvedvelinijetrebadasuvamvecjasne.Utrecojlinijiproveravamodalijeostatakpri
deljenjupromenljiveisa2razlicitodnule.Akonijeondajebrojparaniprikazujemogana
ekranakopakjestetoznacidabrojnijeparantenaredbomcontinuekazemodasepocne
sanovimprolazenjemkroztelopetlje.
4.5.2Naredbagrananjaswitch
Uzpomocovenaredbegrananjamozeseposticidase,uzavisnostiodvrednostineke
promenljive,izvrsavaodredjenibloknaredbi.Zadatak:uzetiodkorisnikabroj1,2,3,4ili5i
zasvakibrojispisatinekurazlicituporuku.Ovosemozeuraditiprekoifnaredbealice
izgledatinezgrapno,nokaovezbupokusajtedaovouraditenatajnacin.Evokakobiresenje
izgledaloakokoristimoswitchnaredbu.
/*PROGRAMSWITCH_NAREDBA*/
#include<stdio.h>
voidmain(void)
{
intbroj;
printf("Unesitebroj1234ili5>");
scanf("%d",&broj);
switch(broj){
case1:
printf("Unelistebrojjedan!\n");
break;
case2:
printf("Brojdva\n");
break;

case3:
printf("Ovajmisebrojnedopada!\n");
break;
case4:
printf("Broj4");
break;
case5:
printf("...bip...bip...bip..\n");
break;
default:
printf("Nistelepounelibroj!\n");
}

Izanaredbeswitch,unutarzagradatrebaunetiimenekepromenljivekojunaosnovucije
vrednosticesepozivatiodredjenbloknaredbi.case1:oznacavadaakojevrednost
promenljvebroj1dacesepocetisaizvrsavanjemsledecihlinijakodadoksegodnenaidje
nanaredbubreakilinakrajtelaswitchnaredbe.Toznacidaakojevrednostpromenljive
brojnpr.5izvrsicesesamonaredbaprintf("...bip...bip...bip..\n");i
break;Svenaredbeprenjihbicepreskocene.Danemanaredbebreakizvrsavanjenaredbi
biislosvedoksenedodjedokrajatelapetlje,ovoponasanjesenazivadropdownili
propadanje.Naredbekojesledeizakljucnerecidefaultbiceizvrseneukolikovrednost
kojuimapromenljivabrojnijeni1ni2ni3ni4ni5vecnekadruga,nepredvidjenavrednost
tj.akozavrednostpromenljivebrojnepostojinijedanodgovarajucicase.
Postojijosinaredbabezuslovnogskoka,goto:.Ovomnaredbommozeteseprebacititj.
skocitisabilokojegmestaufunkcijinabilokojedrugomestoutojfunkciji.Medjutimlogicno
jedalokacijunakojuzelitedaizvrsavanjekodaskocitrebadaoznacitenekako.Toseradi
takostonapocetkuredakojipredstavljadestinacijuskokaupisujeteproizvoljnoimeisimbol
dvotacke(:).
4.5.3Uslovniizraz
OvojejediniternarnioperatoruCjezikukojiobezbadjujedvosmernogrananje.Naprimer:
intx=13,y=786,max;
max=x>y?x:y;
VrlojeprostoporedimodalijevrednostpromenljiveXvecaodvrednostiY.Ukolikojeuslov
ispunjen(dakleXjesteveceodY),vrednostkojucedobitipromenljivaMAXjeonakojase
nalazilevoodznakadvetacke(uovomslucajutojevrednostkojuimaX).Usuprotnom
vrednostkojucedobitiMAXbiceonakojasenalazilevoodznakadvetacke.

5.Funkcije
Funkcijesupoprilicnolakosvarljivemedjutiminezaobilazneijakokorisnestogajedosta
bitnoznatiih.
5.1Funkcije
Dosadasusvinapisaniprogramiuovomtutrialukoristilisamojednufunkcijumain().
Programnemaogranicenjauvidubrojafunkcijakojesadrzialisvakiprogramnapisanna

jezikuCmoraimatinajmanjejednutakozvanupolaznufunkciju,daklemestoodkojeg
izvrsavanjeprogramapocinje.Tasefunkcijamorazvatimain().
Pozeljnojedasvojkodpiseteorganizujucigaufunkcije.Razlozisumnogobrojniasamo
jedanodnjihjeitajstoprogrampostajemnogocitljiviji,funkcionalniji,preglednijiilakseje
lociratieventualnegresketeisteispraviti.
Daklefunkcijepredstavljajubloknaredbikojeceodraditinekoizracunavanjeidatirezultat
togsvograda.
Svakafunkcijaimaparosnovnihelemenataaevokakotosematskiizgleda:
povratni_tipime_funkcije(lista_parametara)
{
....telo_funkcije(blok_naredbi)....
}
Povratnitipjetippromenljivekojucefunkcijavratiti.Naprimer,akofunkcijavracaceobroj
ovdecestojatiint.Akopakfunkcijanevracanikakvuvrednostovdetrebaupisativoid.
Ime_funkcijejedakleimestoznacidaakozelitedapozoveteovufunkcijudabiona
odradilaodredjenizadatakupisacetenjenoime.Stogaimefunkcijetrebalobidavamda
nekuslikuotomestatafunkcijaradi.
lista_parametarapredstavljalistupromenljivihkojesupotrebnefunkcijidaodradiodredjeni
posao.Recimodaimatefunkcijukojasabiradvabrojakojajojprosledite.Logicnojeda
funkcijanecemocidaodradisvojzadatakakojojvinepredatedvabrojakojaceonaonda
dasabereivrativamnjihovzbir.
telo_funkcijejebloknaredbikojeceizvrsitizadataktefunkcije.Samimtimtelofunkcijecini
njenusrzinajbitnijideo.Kaoisvakidrugibloknaredbiiovajmorastojatiizmedjuviticastih
zagradakojepretstavljajupocetakikrajbloka.
Akovamnijebasjasnogorenavedenoslediprimersadetaljnijimobjasnjenjem.
5.2FunkcijaObim()
Napisacemoprogramkojiceporedfunkcijemain()imatiijpsjednufunkciju.Tucemo
funkcijunazvatiObim()ionaceimatizadatakdaizracunaobimpravougaonikacijestranice
jojprosledimo.Ovajprogramcebitidostamenjaninadogradjivankrozdaljitoktutrijala.
/*PROGRAMObim*/
#include<stdio.h>
//prototip(ilideklaracija)funkcije
doubleObim(doublea,doubleb);
//funkcijamain
voidmain(void)
{
//deklaracijapromenljivih
doublex,y,rez;
//uzmipodatke
printf("UnesiteduzinustraniceAiB>");
scanf("%lf%lf",&x,&y);
//pozovifunkcijuObimdabihizacunaoobimtelazadanih
//dimenzija
rez=Obim(x,y);

//prikazirezultat
printf("ObimpravougaonikastranicaAiBje%.2lf!\n",rez);
}
//definicijafunkcijeObim()
doubleObim(doublea,doubleb)
{
doubleret;
ret=a*b;
}

returnret;

Pomocunaredbe#include<stdio.h>smoukljucilifajlstdio.h.Onnamjepotrebanjersuu
njemudefinisanefunkcijekojecemokoristitiuprogramu.
ZatimsledideklaracijafunkcijeObim().Verovatnovamnijejasnozastoseovoradi.
Predpostavimodadeklaracijunismonapisali.Pokusacemodaprevedemoprogramidobiti
greskuukojojsekazedanijenadjenafunkcijaObim()iakojeonadefinisanaposlefunkcije
main.Razlogovomejetajstoseunutarmain()funkcijenalazinaredbakojomsepoziva
funkcijaObim():
rez=Obim(x,y);
Medjutimprevodiocprogramprevodilinijupolinijukodapapostomuranijenismoreklida
postojifunkcijaObim()oncesebunitiiobavestitinasotome.DaklefunkcijaObim()jeste
definisanakasnijeuprogramumedjutimprevodilactogajosuveknijesvestanjerjosnije
stigaodaprevedetufunkcijuamismopokusalidajeupotrebimo.Dabiseovoizbeglo
pribegavasepisanjuprototipovafunkcije.Prototipovifunkcijasadrzepovratnitipfunkcije,
imefunkcijeilistuargumenata.Telosepisekasnijeitajseprocesnazivadefinisanje
funkcije.Prototipovitrebajudastojepripocetkukodaprogramajersenatajnacin
blagovremenoobavestavaprevodiocdapostojiodredjenafunkcijaidaceonakasnijebitii
definisana.
Alternativaovomepostojalijeonalosijeresenje.Naimevimozetedeklarisatiidefinisati
funkciju,uovomslucajuObim(),prenegostonapisetenekunaredbukojacejepozivati,u
ovomslucajujetonaredbaufunkcijimain().Ovoradialijelosapraksajerkodpostajene
pregledanplusstoovajmetodnije100%pouzdan.
Sledidefinicijafunkcijemain()iposlenjeparjasnihnaredbiukojimadeklarisemo
promenljiveipozivajucifunkcijeprintf()iscanf()(kojesudefinisaneuzaglavljustdio.h,
detaljnijecemokasnijereci)vrsimokomunikacijusakorisnikomidobavljamopotrebne
podatke.NakontogaracunamoobimpozivajucifunkcijuObim()ismestajucirezultatu
promenljivurez.Funkcijaobimzahtevadajojseproslededvaargumentatj.promenljivekoje
sutipadouble.
Ovdetrebarazjasnitistajeargumentastaparametar.Kadadefinisetefunkcijuvidefinisitei
kojeceparametre(daklepromenljive)tafunkcijadazahtevaodpozivaocafunkcije.Kadapak
pozivatetufunkciju,promenljivekojejojseprosledjujusenazivajuargumenti.Malocudnoi
glupavoali...
DolazimododefinicijefunkcijeObim().Uglavnomjesvejasnosemzadnjenaredbe:
returnret;
Telofunkcijesemozezavrsitinadvanacina:kadasedodjedokrajatelafunkcijetj.do
viticastezagrade(})ilikadasedodjedonaredbereturn.

Izanaredbereturnsledipromenljivakojacebitivracenakaorezultatfunkcije.Jasnojedase
tippromenljiveitipvrednostikojucefunkcijavratitimorajupoklapatiodnosnodauovom
slucajupromenljivaretmorabititipadouble.
Vrlojebitnouvidetidaakoimateslucaj:
intx=5;
returnx;
x=10;
promenljivojxsenikadanecedodelitivrednost10jerseizvrsavanjetelaovefunkcijeprekida
naredbomreturn.Akofunkcijanevracavrednost(void)ondasereturnpisebezikakve
promenljiveposlenjega.
Pogledajmojosjednomlistuparametara.Unjojsmodefinisalidafunkcijimorajubiti
prosledjenedvepromenljivetipadouble.Njimasmododeliliimenaaib.Daklebezobzirana
sve,kadamiprosledimonekojfunkcijipromenljivu,funkcijanecebitiustanjudamenja
vrednostprosledjenepromenljive.Naime,kadasepromenljivaprosledinekojfunkciji,na
posebnommestuumemorijistekuformirasejosjednaporomenljivasa
karakteristikama(tip,ime)kojesmojojzadaliprilikomdefinicijetefunkcijekojupozivamoi
dodeljujejojsevrednostpromenljivekojusmoprosledili.Daklezasvakiprosledjenu
promenljivusenastekupravinovapromenljivaiinicijalizujesevrednoscuprosledjene
promenljive.Dapojasnimonagornjemprimeru.NaredbomObim(x,y)smopozvalifunkciju
Obim()iprosledilijojdvaargumentaxiy.Ovodajedirektivuprogramudatrebadaskoci
namestonakomejedefinisanafunkcijaObim()idaodatlenastavisaizvrsavanjemkoda.
KadasetelofunkcijeObim()zavrsi,programnastavljasaizvrsavanjemodmestasakojegje
Obim()biopozvan,uovomslucajutojenaredba:rez=Obim(x,y);kojasenalaziu
main().VrednostkojucefunkcijaObim()vratiti(pomocunaredbereturn)bicedodeljena
promenljivojrez...
Dolazimododelakojisadanecetemozdarazumetijertrebadaznatestajetoopseg
vaznostipromenljive(objasnicemousledecempodpoglavlju)alivaljanapomenuti.Funkcija
Obim()nemozedapristupipromnljivimkojestedeklarisaliunutarfunkcijemain(),iuopste
unutarnekedrugefunkcije(zbogopsegavaznosti),pazatosemorajukreiratidvenove
promenljiveunutarfunkcijeObim()ukojimacemocuvativrednostiprosledjenihargumenata.
ImenatihpromenljivihkojesmodefinisaliulistiparametarafunkcijeObim()mogudaimaju
istaimenakaoipromenljivekojesmodefinisaliutelufunkcijemain()alinaravnomogubitii
razlicita.Ovojeopetzbogopsegavaznosti,aslediiobjasnjenjestajeto.
5.3Opsezivaznosti
Postoje3opsegavaznosti:lokalni,globalniieksterni.Zadnjijeretkokoriscenpaganecemo
izetiurazmatranje.
Opsegvaznosti(eng.scope)jesvojstvosvakepromenljive.Promenljivesalokalnim
opsegomvaznosti(kracerecenolokalnepromenljive)suvidljivesamounutarjednog
blokanaredbi(telofunkcije,telopetlje)ukojemsudefinisane.Upredhodnomprimeru
promenljiveaibsubiledefinisaneutelufunkcijemain()panjimanemozetedapristupiteiz
telafunkcijeObim(),zbogtogastosuonevidljivesamounutartelaukojemsudefinisaneu
ovomslucajutojetelofunkcijemain().Pogledajmosledeciprimer:
intmain(void)
{
//deklaracijalokalnepromenljiveS
intS;
S=10;

if(1){
//deklaracijapromenljiveUunutartelanaredbeif
intU=20;
//dodelavrednostipromenljivojS
S=20;
}//krajtelaifnaredbe
//greska
U=13;
return0;

Ovajsekodnemozekompajlirati.Pogledajmolinijukodispodkomentara//greska.
PromenljivaUjedefinisanaunutarblokanaredbiifa.Akopazljivoproanalizirateovajkod
shvaticetedaje,kaostojegoreobjasnjeno,promenljivaUvidljivasamounutarblokukojem
jedefinisanatj.unutarblokanaredbiifa.VaznojeuvidetiidajepromenljivaSvidljiva
unutarifbloka...Josjednarazlikaizmedjutelafunkcijaitelanaredbigrananja/petlji...
Postojeiglobalnepromenljive.Tosusvepromenljivekojesedefinisuvantelafunkcija.Ove
promenljivesuvidljiveusvimdelovimadelovimaprogramadakledostupnesusvim
funkcijama.Prednostovihpromenljivihaujednoivelikamana(zbogcegaihtrebazaobilaziti
usirokomluku)jetostonjihovevrednostimogumenjatisvideloviprograma,svefunkcije.
Ovodelujenaprvipogleddobroalistaakoimatenekiveciprogramodnekolikostotinaili
hiljadalinijakodaikadagabudetetestiralivirecimonaidjetenagreskudanekaglobalna
promenljivaimaneodgovarajucuvrednost.Kakocetelociratistapraviproblem?Nekavam
jebogupomoci.Nodastedefinisalitupromenljivukaolokalnuipopotrebijepredavalikao
argumentnekojfunkcijiimalibistemnogo(alibasmnogo)manjeposla.
Primerprogramakojiracunaobimkoristeciglobalnepromenljiveceizgledatiovako:
/*PROGRAMObim_Glob*/
#include<stdio.h>
//prototip(ilideklaracija)funkcije
voidObim(void);
//DEKLARACIJAGLOBALNEPROMENLJIVE
doublex,y,rez;
//funkcijamain
voidmain(void)
{
//uzmipodatke
printf("UnesiteduzinustraniceAiB>");
scanf("%lf%lf",&x,&y);
//pozovifunkcijuObimdabihizacunaoobimtelazadanih
dimenzija
Obim();
//prikazirezultat
printf("ObimpravougaonikastranicaAiBje%.2lf!\n",rez);
}

//definicijafunkcijeObim()
voidObim(void)
{
rez=x*y;
}
Uporeditedetaljnorazlikuizmedjuovadvanacinaizvodjenjaovogprograma,bicevamto
dobravezba.
Programjeskracenaliistotakopretstavljaveomalosuprogramerskupraksu.Zatodrzitese
lokalnihpromenljivih!Sadabitrebalodavamjejasnokakoradefunkcije.Trebadaseucite
dasveorganizujetepofunkcijama,prednosticetesamiuvideti.
Zakrajnapomenimodaipakpostojimogucnostdajednafunkcijamenjavrenostilokalnih
promenljivihdeklarisanihunutardrugefunkcije,pomocupokazivacaalicemonjihobjasniti
nestokasnijedabivamprvopredstavilikakomozetedakomuniciratesakorisnikomvaseg
programa,stoceucinitidavamprogramiranjepostanemnogozanimljivije.
5.4Preopterecivanjefunkcija
Svakafunkcijaimadveosobinekojejecinejedinstvenom:imeilistuargumenata.Iakodeluje
nelogicnovisefunkcijamozeimatipotpunoistoime,aliondaimsemorarazlikovatilista
argumenata.Takvefunkcijesupreopterecene.Jedinafunkcijakojanemozebiti
preopterecenajefunkcijamain().
Svrhapreopterecenihfunkcijajedauzavisnostiodtipovaargumenataizvrsavajurazlicite
naredbe.Recimodaimatedvefunkcijekojetrebarazlicitodaradeuzavisnostiodtipa
argumentakojijojprosledite.Postojedvaresenja:ilidafunkcijeimajurazlicitoimeilidabudu
preopterecenetedaimtipparametrakojiuzimajubuderazlicit.Drugoresenjejeobicno
bolje.

6.Osnoveprikupljanjapodataka
Objasnicemonekeodfunkcijastadardnebiblioteke,prevashodnoonepomocukojihcete
prikupljatipodatkeodkorisnikaiprikazivatirezultateradavasihprograma.Onostostedo
sadaucilibilojevezanoiskljucivozamanipulacijupodacimatj.koriscenjenaredbiinjihova
organizacijadabisteobaviliodredjenoracunanjeilistavec.Posleovogpoglavljaznacete
kakodauzimatepodatke>manipulisetenjima>prikazujeterezultate,tecetejedanvrlo
sirokkrugzatvoritiispoznatipoprilicandeosintaksejezikaC.
6.1Napomenaorazliciizmedjutextaiznaka
UCjezikusvakitextsetretirakaonizznakovaastajetoobjasnicemoupoglavljuo
pokazivacima,zasadatrebadaznatedasvakislobodantexttrebadastavitepod
navodnikejerakotoneuraditekompajlercesmatratidajetajtextnekanaredbailiime
promenljiveidr.
Mnogijeziciimajutippromenljivestringkojisluzizasmestanjetexta.KodCjezikane
postojitipstringaliuCuseistiefekatmozeposticikoristecisetipomchar.Charznaciznak
iupromenljivutipacharnemozetestavititextvecsamojedanznak,naprimertakva
promenljivamozedacuvavrednostiTili?alineineki_text.Sveceovobitidetaljno
objasnjenouodeljkuopokazivacimainizovimaalivecsadtrebadauviditerazlikuizmedju

znaka(tacnijesimbola)itexta.Savsetekststavljapodnavodniketext,asimbolipod
znacimagornjegzarezanpr.a,e,+...
6.2.Funkcijaprintf()
Saovomsmosefunkcijomranijesrelialinismoobjasnilikakoonaradi.Printf()funkcijasluzi
zaprikazivanjetextaivrednostinamonitor(tacnijenakonzolu).Ovajefunkcija
komplikovanijaalisvepostajelakoiprirodnouzmalovezbe.Evokakosepomocuove
funkcijeispisujenekitextnaekran:
printf("Ovojeprimer");
Funkcijismokaoargumentpredalitextioncebitiispisannaekran.
Medjutimprintf()sluzizaformatiranprikaztextanaekran,stoznacidakoristeciovufunkciju
mozetevrsititabulaciju(horizontalnuiverikalnu),prelazitiunoviredidr.Sveseovopostize
koriscenjemkomandnihsekvanci.
Svakakomandnasekvencajeustvarisimboliakosesastojioddvaznaka,pabiporecenom
upredhodnomodeljkutrebalodasetretirakaotextalitonijeslucaj(shvaticetekasnije
zasto).Komandnasekvencasesastojiodznakabeksle(\)ijosnekogdodatnogznaka,
evotabele:

|K.S|
OPIS
|

|\n |Newline(prelazakunovired)
|

|\t
|Horizontalnatabulacija(HT)
|

|\v |Vertikalnatabulacija(VT)
|

|K.S|
OPIS
|

|\b |Backspace(vracajednomestonazad |

|\r
|Vracanapocetakreda
|

|\a |Alarm(beepzvuk)
|

|\
|Prikazujenaekransimbol
|

|\|Prikazujenaekransimbol
|

|\? |Prikazujenaekransimbol?
|

|\\
|Prikazujenaekransimbol\
|

|\Oktalno|Prikazivanjeceobrojoktalno
|

|\Xheksa|Prikazivanjeceobrojheksadecimalno|

Objasnimonajkorisnijesekvence.Akozelitedapredjeteunoviredkucacetesekvencu\n
unutartextakojisepredajekaoparametarfunkcijiprintf(),ovako:
printf(Prvired\nDrugired\n\n\nSestired...);
Mozeteizvrsitinaslicannacinitabulaciju:
printf(Pocetak\tparazmak\nPanovired...\n);
Razlog sto morate kucati beksle da bi ste odstampali navodnike i gornji zarez a i sam
beksleceteisamiuvidetiakomalorazmislite.Recimoakohocetedaprikazetenekitext
podnavodnicima naekran a akone koristite beksle naodredjenom mestu dobili biste
greskuprilikomkompajliranja.
printf(ovoneceraditi...);
Pogledajteprosledjeniargument.Onzapravonijestring(text)vecsesastojiodstringaovo,
nedefinisanerecinece,ijosjednogstringaraditi....Dalismotohteli?Ispravnaforma
ovogaceizgledatiovako:
printf(ovo\nece\raditi...);
Ovimcemoimiikompajlerbitizadovoljni.Provezbajteovenaredbepakrenitedaljesa
ucenjem.

Ovoprikazivanjetextnaekranjejednostavnouraditialistvaripostajukomplikovanijeako
hocemodaprikazemoivrednostinekihpromenljivih.
Sintaksafunkcijeprintfjesledeca:
printf(upravljacki_niz_znakova,parametar1,prarametar2,parametarN)
Objasnicemonasledecemprimeru:
/*PROGRAMprintf1*/
#include<stdio.h>
voidmain(void)
{
intA=10;
floatB=789.4612;
printf("VrednostAje%d,dokjevrednostB%f\n",A,B);
}
Vidljivojedasmosadafunkcijipredaliviseargumenata,ukupno3.Unutarupravljacnogniza
senalazeizmedjuostalogiupravljackiznaci,%di%f.
Oviznacigovorefunkcijidananjihovommestutrebadasenadjevrednostneke
promenljive,akojajetopromenljivanavodimokaododatniargument,uovomslucajutosu
promenljiveAiB.Dakleupravljackiznacisuslicnikomandnimsekvencamastomrazlikom
stokomandnesekvencesluzezaformatiranjetextaaupravljackiznacizaprikazivanje
vrednostipromenljivih.
VerovatnostesezapitalizastosmozaprikazivanjevrednostipromenljiveAkoristili
upravljackiznak%d,azazaprikazivanjevrednostipromenljiveB%f.Razlogjetajstoseove
promenljiverazlikujuutipu(AjetipaintdokjeBfloat)azasvakitippromenljivepostoje
razlicitiupravljackiznaci,kaostojeslucajisakomandnimsekvencama.Evotabele:


|U.Z|
Opis

|%c |ZatippodatkaCHAR
|

|%d,%i|ZatippodatkaINT
|

|%f |ZatippodatkaFLOAT
|

|%lf |ZatippodatkaDOUBLE
|

|%e |Prikazujebrojueksponencionalnomobliku
|

Upravljackiznacisepravilnijezovuspecifikatorikonverzijecelihbrojeva.Reklismo
jospripocetkudapostojieksplicitnaiimplicitnakonverzijajednogtipapromenljiveu
drugi.Evokakomozedocidoinplicitnekonverzije(maloizmenjenkodprethodnog
primera):

/*PROGRAMprintf2*/
#include<stdio.h>
voidmain(void)
{
intA=10;
floatB=789.4612;
printf("VrednostAje%d,dokjevrednostB%d\n",A,B);
}
Promenajeizvrsenanadsamojednimznakom,umesto%fsadastoji%duupravljackom
nizukojismopredaliprintf()u.OvimsmonavelidajetipdrugepromenljiveINTaonjeu
stvariFLOATpacedocidogubitkapreciznosti.Azbogcegacesetodogoditivecsmorekli
upoglavlju3.3.
Itojecelanaukavezanazafunkcijuprintf(),odesencijalnejevaznostidaovosavladate
kakotrebajerjeovoveomakoriscenafunkcijaaikasnijecevambitimnogolakseda
nauciteifunkcijezauzimanjepodataka(scanf())odkorisnikaprograma.

6.3Funkcijascanf()
Akosteshvatilikakoizastofunkcioniseprintf(),funkcijuzaformatiranouzimanje
podatakaceteshvatitibezinajmanjepoteskoca.Sintaksaovefunkcijeje:
scanf(upravljacki_niz_znakova,parametar1,prarametar2,parametarN)
Daklesintaksajepotpunoistakaoikodprintf(),takodajesvestotrebarecivecreceno.Ipak
postojijednamalarazlika,evoprimera:
/*PROGRAMscanf()1*/
#include<stdio.h>
voidmain(void)
{

intA;
floatB;
//uzmipodatke
printf("UnesitevrednostAazatimipromenljiveB:");
scanf("%d%f",&A,&B);
//prikazirezultat
printf("VrednostAje%d,dokjevrednostB%f\n",A,B);
}

Ceokodbitrebalodavamjejasansemnaredbeukojojpozivamofunkcijuscanf().
Funkcijismoproslediliupravljackiniz"%d%f"stocerecidakorisniktrebadaunese

vrednosttipaINTazatimivrednostkojaimatipFLOAT.Unetevrednosticebitidodeljene
promenljivimAiB.Primeticetedaporedimenapromenljivestojiznakampersend(&)kojiu
stvaripredstavljaoperatoradresaod.Deteljnijecemogaobjasnitiupoglavljuo
pokazivacima,zasadatrebadaznatedasmogastavilitudabiomoguclifunkcijiscanf()da
upisevrednostkojuuzmeodkorisnikaupromenljiveAiB.Kako,sta,zasto?Kadasmo
govoriliofunkcijamareklismodaselokalnimpromenljivimmozepristupatisamounutar
blokanaredbiukojemsuistedeklarisanenaprimersamoufunkcijiukojojsutepromenljive
deklarisaneitojeuradjenobaszatodadrugefunkcijenemogupristupatiovimpromenljivimi
menjatinjihovuvrednost.No,funkcijascanf()moradaupisevrednostupromenljivekojesmo
jojpredalikaoargumentepasemoranekakozaobicigorenavedenoponasanje.Tose
ostvarujepomocuoperatora&jermikadakoristioovajoperator,ustvarineprosledjujemo
funkcijipromenljivuvecnjenuadresuumemorijiracunarapaceseutuadresuupisivati
podaciisamimtipmenjativrednostprosledjenogargumenta.Akonisterazumeliocemuje
recnemarijercebitivisereciupoglavljuopokazivacima,zasadamoratezapamtitidakod
funkcijescanf()moratekoristitioperator&(uzsvakoimeargumenata,naravno).

6.4Zakljucak
Sadaznatekakodaodkorisnikauzimateikakodakorisnikuprikazujetepodatkekoristeci
printf()iscanf().Drugafunkcijajejakopipavatj.uslucajudavrednostikojekorisnikunosi
nisuonakvekakvemiocekujemodesicesevrloneprijatnestvari.Zatosescanf()koristiza
ucitavanjepazljivosortiranihpodataka,recimoiznekogfajla.Primeticetedanismoniu
jednomprimerunituzimalinitprikazivalivrednostikojesutipaCHARilistring,razlogjestoje
prvopotrebnodaovladatepokazivacimainizovima.
Postojejosmnogefunkcijezaupisiispisalicemonjihrazmotrititekposlesledeceg
poglavlja.

7.0PokazivaciiNizovi
PokazivacisujednaodglavnihprednostijezikaC.Onisluzezadirektanpristupmemoriji
racunara.Vecsmoreklidakadadeklarisemonekupromenljivu,makojibionjentip,sistem
moradarezervisepotrebnukolicinumemorijeukojucesmestatiodredjenevrednosti.Dabi
davalivrednostpromenljivojilidabismonjenuvrednostcitalikoristimoimetepromenljive.
Akopakdeklarisemopokazivaconcepokazivatinalokacijunekepromenljiveunutar

memorijeidaklesadrzaceadresupromenljivenakojupokazuje,anevrednostkojasenalazi
natojadresi.Mozdavamovonijejasnozasada,mozdavamizgledabespotrebnoalisledi
objasnjenjekrozjedanprimer.
7.1Kakoradepokazivaciiadrese.
Svakapromenljivaimaadresunakojojsenalaziumemoriji.Postojeipokazivacvrsta
promenljiveionimasvojuadresuumemoriji.Postavljasepitanjekakoviuprogramu
mozetedasaznatenakojojseadresinalazinekapromenljiva.Odgovorjepomocu
operatora&(ampersendilioperatoradresaod).Evokakotoizgledanadelu:
intBROJ;
BROJ=45;
printf("Vrednostpromenljiveje%d\n",BROJ);
printf("Adresapromenljiveje%d\n",&BROJ);
PrvodeklarisemopromenljivukojaimatipINTaimejojjeBROJ.Toznacidajesistemna
nekojlokacijiumemorijirezervisaodovoljnomestadastanesvakavrednostkojupodrzava
tipINT(daklezasvakicelibroj).ZatimnaredbomBROJ=45vrsimododeluvrednosti
promenljivojBROJ.Daklemenjasevrednostpromenljivealinjenaadresajeista.Adrese
svihpromenljivihsustaticneinemogusemenjati.Zatimpomocufunkcijeprintf()
prikazujemonaekranvrednostkojuimepromenljivaBROJ,uovomslucajujeto45.
Usledecemprintf()usmoispredimenaBROJstavilioperator&stoznacidanecemodobiti
vrednostpromenljiveBROJvecnjenuadresuumemoriji.Takodjeseizprimeramoze
zakljucitidasuadresecelibrojevi(INT).Ovajprimernijenarocitokoristaalijeposluzioda
objasnimokakosedobijajuadresepromenljivih,nadaljecemoobjasnitikakodaihkoristite
zanestopametno.
Kaostosmorekli,pokazivacnemozedasadrzivrednostvecmozesamodasadrziadresu
nekepromenljive.Itogaciniposebnimtipompodatakjernijedandrugitipnemozecuvati
adrese.Bitnojedauviditedazasvakitippromenljive(int,float,double...)postojiipokazivac
natajtip.DaklepokazivacnatipINTnemozesadrzatiadresupromenljivekojajetipa
FLOAT.Evoprimeradeklaracijepokazivaca:
int*POK;
ovojepokazivac.Primecujeteoperator*(operatorposrednogpristupa)ongovoridazelimo
dadeklarisemopokazivacnatipINT.Danemaoperatora*mibideklarisaliklasicnu
promenljivutipaINT.Esadimamopokazivac,evokakoseonmozekoristiti:
intBROJ;
int*POK;
POK=&BROJ;
printf("VrednostiBROJje:%d",*POK)
prvedvelinijesujasne.TrecomlinijomsmopokazivacuPOKdodeliliadresuBROJa,tesad
prekopokazivacaPOKmozemoiscitavatiiupisivatinekevrednostidirektnoutomestona
memoriji.Cetvrtomlinijomsmoiscitavalivrednost.Primecujetedasmostavili*POK,dakle
opetsmokoristilioperator*kaoikoddeklaracijepokazivaca.Medjutimznacenjaovog
operatorajedvojako,uzavisnostiukomsekontekstuupotrebljava.Razmotrimonasledeci
nacim.
Akonapisemosamoimepokazivaca(samoPOK),dobicemoadresunakojuonpokazuje.
AkohocemodapokazivacudodelimonekudruguadresupisacemoPOK=&necegaitobi
trebalodajejasnosada.E,kadasmopokazivacudodelilidapokazujenaadresuneke
promenljivemivrednostinatojadresimozemodapristupamo.Paakohocemodadobijemo
vrednostnatojadresinakojupokazivacpokazujestavicemooperator*ispredimena
pokazivaca:*POK.Tojeupravoonostosmouradiliuposlednjojlinijikodagornjeg

primera.Medjutimvrednostsemozeimenjatinesamocitatipomocupokazivaca,principje
slican.Dabistedodelilivrednostonomenastapokazivacpokazujenapisacete:
*POK=1989;
Akoidaljeneshvatateovoevojosjednogprimera:
/*PROGRAMPOKAZIVACI_1*/
#include<stdio.h>
voidmain(void)
{
//deklarisepromenljivutipaint
intA;
//deklarisepromenljivutipapokazivacnaint
int*P;
//dodeljujevrednostpromenljiviA
A=10;
//DodeljujepokazivacuPadresuodA
P=&A;
//neposrednomenjavrednostpromenljiveA
A=456;
//PosrednomenjavrednostpromenljiveA
*P=123;
//neposrednocitavrednostpromenljiveA
printf("Aje%d\n",A);
//posrednocitavrednostpromenljiveA
printf("Aje%d\n",*P);
}
Uovojliniji*P=123;smoposredno(prekopokazivaca)smestilivrednost123u
memorijunakojujepokazivaP.OvoznacidaceseivrednostkojuimaApromenitiu123iz
logicnograzloga,pomocupokazivacasmoibezupotrebepromenljveAminjenuvrednost
promenilitakostosmoupisalinovuvrednostuadresunamemorijikojukoristipromenljivaA.
Ovojebitnouvidetidabisterazumelikakofunkcionisupokazivaci.
Josjednabitnastvar,kakoseponasajuoperatori++ikadasekoristenadpokazivacima.
Paponasajusepotpunoisto.Stimstooperatori++iimajuveceprvenstvoodoperatora*.
Stocerecidaakoimatekomandu*P++;viceteinkrementirati(povecatizajedan)adresu
nakojupokazujepokazivacP,dokakonapisete(*P)++;vrednostumemorijinakoju
pokazujepokazivacPcebitiinkrementiranaaadresanakojupokazujePostajenaravno
ista.
7.1.2Pokazivaciifunkcije
Reklismodovoljnoodometupromenljivihiizvelizakljucaksupromenljivevidljivesamo
unutarblokanaredbiunutarkojihsudefinisanenpr.unutartelanekefunkcije.
Sadrugestraneimamoogranicenjeutomestofunkcijenemogudavrateviseodjedne
vrednostiatakodjeinemogudamenjajuvrednostipromenljivihkojesudeklarisaneunutar
drugihfunkcijajerihnevide.Ovosemozepromenitikoriscenjempokazivacazaparametre
funkcija.Evoprimerajednetakvefunkcije:
inttest(int*a,int*b)
{
*a=789;
*b=456;
}

Aevokakobiizgledalafunkcijakojapozivafunkcijutest:
voidmain(void)
{
inte=23,r=10;
test(&e,&r);
//prikazivrednost
printf(Eje%d,Rje%d\n,e,r);
}
NaekranceseispisatiEje789,Rje456stoznacidasmoizfunkcijetest()uspeli
dapromenimovrednostipromenljivimkojesudefinisaneunutarfunkcijemain().Tosmo
uspelijersmofunkcijitestprosledilikaoargumentnevrednostikojeimajueirvecnjihove
adrese.Zatimsmoutelufunkcijetest()pomocupokazivacapromenilivrednostkojasenalazi
udelumemorijekojukoristepromenljiveeir.Ovedvepromenljiveidaljenisuvidljive
unutarfunkcijetest()alismoobezbedilinjihoveadreseipomocunjihsmoumogucnostida
menjamonjihovevrednosti.
Poovomprincipuradiifunkcijascanf()takodasadaznatezastosmojojprosledjivaliadrese
promenljivihanesamepromenljivedakledabijojomogucilidapodatkekojeuzmeod
korisnikaupiseutepromenljivekojesmojojprosledili.
7.2.Nizovi
Nizovisunizpromenljivihistogtipakojesukontinualnonapravljeneumemoriji.Akohocemo
danapravimojednupromenljivutipaINTpisemo:
intbroj;
Astaakohocemodanapravimopetpromenljivih,daunjihsmestimoodredjenevrednostii
datevrednostimedjusobnosaberemo?Dosadasnjametodadeklarisanjapromenljvihbi
zahtevaladapromenljiveimajurazlicitaimenaikodbibiodostadosadaninepotrebnodug,
medjutimstvaripostajuvidnolaksesakoriscenjemnizova.Evokakosemozedeklarisatiniz
od10promenljivihtipaINT:
intbroj[10];
Uglastezagrade([])ukazujudaseradionizuaneosamojednojpromenljivoj.Takosada
imamopromenljivubroj[5],broj[2],broj[7]...daklebrojmoraimatiindex.Index
jebrojunutaruglastihzagrada.
Ipaknavedenomdeklaracijomnismonapravilipromenljivubrojsaindexom10(daklene
postojibroj[10]).Razlogovomejetajstoindexprvogbrojanije1,vec0(nula).Takodami
imamosadabroj[0]broj[1]broj[3]broj[4]....broj[9].Jossamojednu
stvartrebadaznate,akonapisemosamobrojdaklebezikakvogindexatoceimatiisti
efekatkaodasmonapisalibroj[0],daklepristupamoprvojpromenljivojniza.
Kaostomozetedainicijalizujetevrednostiobicnihpromenljivihtakomozeteinicializovatii
vrednostinizovskihpromenljivih.Razmotrimosledciprimer:
intbroj[4]={4679,1,3555,8};
Takoseinicializujunizovskepromenljive.broj[0]ceimativrednost4679,broj[2]cebiti
3555idt...Obaveznistedastaviteviticastezagrade({}).
Recimodaimatenizod10elemenataisvakielementzelitedainicijalizujetevrednoscu0.
Nemapotrebedanavoditedesetnulaunutarviticastihzagrada,ovajsistemjemnogo
elegantniji:
intbroj[10]={0};
Svielementinizabiceinicializovanivrednoscunula.
Slediprogramkojiresavaproblemkojismonavelinapocetkupoglavlja:

/*PROGRAMNIZOVI_1*/
#include<stdio.h>
voidmain(void)
{
//deklaracijaniza
floatbroj[5];
doublerez=0;
inti;//pomocnapromenljiva
//uzmipodatkeismestiihubroj
for(i=0;i<5;i++)
{
printf("Unesitebroj%d:",i+1);
scanf("%f",&broj[i]);
}
//saberi
for(i=4;i+1;i)
rez+=broj[i];
//prikazirezultat
printf("Zbirunesenihbrojevaje%lf\n",rez);
}
Iakobitrebalosvedajejasnoovajcemoprimerdetaljnoobjasniti.Noakovamjejasno
sledecideotextamozetepreskociti.
Prvalinijakodajekomentar.
Udrugojlinijismopomocudirektive#includeukljucilistdio.h,headerfajlstandardne
bibliotekejezikaC.Ovosmouradilijersuutomheaderudefinisanefunkcijescanf()iprintf()
kojesunampotrebezaizraduprograma.
Zatimsledifunkcijamain().Onapredstavljapolaznutackusvakogprograma,tejesvaki
programamoraimati.
Prvastvarkojuradimounutartelamain()ajedeklaracijapromenljivihkojecenamkasnije
trebati.Bitnojeuvidetidapromenljivemorajubitidefinisanenasamompocetkubloka
naredbi,dakleprebilokojihdrugihnaredbi.Promenljivabrojjetipafloationajenizod
ukupno5elemenata(prvielementsenalazinaindexu0aposledjinaindexu4).
Nailazimonapetljufor.Prvomnaredbom(i=0)postavljamovrednostpromenljiveinanulu.
Druganaredbapretstavljauslovdabisepetljaponavljala.Trecanaredbasekaoidruga,
izvrsavaprisvakomponavljanjutelapetljeinjominkrementiramoi.Utelupetljenalazese
dvenaredbe,prvomkazujemokorisnikustatrebadaunesedokdrugomprihvatamopodatke
kojecekorisnikuneti.Razmotrimoovunaredbu:
printf("Unesitebroj%d:",i+1);
Kaodrugiargumentsmopredalii+1.Mozdacetepomislitidasmonaovajnacin
povecalivrednostpromenljiveialiutomslucajuceteseprevariti.Sistemcekreiratipomocnu
promenljivuidodelitijojvrednostizbiraovihoperanadaazatimcetupromenljivupredati
funkciji,dokvrednostpromenljiveiostajeista(pogledajteodeljak3.3akovamovonije
jasno).
Sledijosjednapetljafor,ovogaputanjenaulogajedasaberesveelementenizabromenljive
broj.Naredbeunutarmalihzagradasunamernomalozakomplikovane.Naimepromenljivoj
idodeljenajevrednost4,dokjeuprvojpetljidobilavrednost0.Obasunacinaispravnaali
pogledajmosledecunaredbu,naredbuuslova.Unjojstojisamoi+1.Podsetimosedaje
vrednostnulaznacidauslovpetljenijeispunjenadasvakadrugavrednostznaciispunjenost
uslova.Samimtimovoceraditi.Medjutimono+1stojizatosto,daganemapetljabise
izvrsila4puta.Malojetezepratitiovakvestvarizatojeboljepridrzavatisestandardaiz

prveforpetlje.Uvidjatedadrugapetljafornemaviticastezagrade(telo).Nemaihjerjojnisu
potrebnepostocelotelopetljeimasamojednunaredbu.
Nakraju,ispisujemorezultatkoristecifunkcijuprintf().
7.3Promenljivetipachar
(napomena:uovomodeljkusustvariprikazivanemaloslikovitozboglaksegrazumevanja)
Charjetippromenljivekojimozedacuvasamojedansimbol(znak,slova,broj...).nje
simbol,preciznijeslovo.Nadrugojstraninjenizsimbola.Zasto?Uskorocetesaznati,za
sadajebitnodauviditedasesimbolstavljapodjednostrukenavodnike()aniz
simbola(string)podregularnenavodnike().
Razmotrimoinicializaciju:
charslovo=a;
Naprvipogled,slovocesadrzativrednosta.Nijebastako.Promenljivekojesutipachar
mogudacuvajusamobrojeve,kaoiint,alipostocharimasamojedanbajtnajvecavrednost
kojumozecuvatije255.Kakoondapromenljivojcharmozemododelitinekisimbolkada
unaustvaricuvabrojeve?Postojitabelaukojojsenalazesimboli(ukupno255njih)isvaki
simbolimasvojrednibroj.Mimozemoprosleditidecimalnibroj(aonsenalaziurasponuod
0do255)tabeliikaorezultatcemodobitisimbolkojijepodtimrednimbrojem.Primeraradi,
simbolaimavrednost97utojtabelipacepromenljivaslovoizgornjegprimeracuvati
vrednostod97anesamsimbol.Odavdesedazakljucitidajeslovomoglobitiitipaint.Sledi
programkojicenaekran(tacnijenakonzolu)ispisatisvesimboleinjihoverednebrojeve:
/*PROGRAMTABELA_SIMBOLA*/
#include<stdio.h>
voidmain(void)
{
intsimb;
for(simb=0;simb<255;simb++)
printf("%d%c\n",simb,(char)simb);
}

Obratimopaznjunaredkojisadrzifunkcijuprontf().Prvoseprikazujedecimalnavrednost
promenljivesimb,itujesvejasno.Zatimsmokoristeciupravljackogznaka%creklidana
tommestutrebadaseispisenekiznak.Togovorifunkcijidaumestodecimalnevrednosti
kojubudedobilatrebadaispiseodgovarajucisimboliztabele.Kaotreciargumentsmo
naveli(char)simb.Ovdesmoizvrsilieksplicitnukonverziju(objasnjenouodeljku3.3)ali
tonaminijebilopotrebnojercefunkcijaprintf()samaizvrsitikonverziju(inplicitnu)izrazloga
stoonakaotreciargumentocekujepromenljivutipacharanetipaint.
Malidetalj:Dosadastezaprelazakunoviredkoristili\n.Pokreniteponovogornjiprogrami
obratitepaznjunasimbolpodrednimbrojemdeset.Nemanista,aispodnjegajeprazanred.
Razlogovomejetajstosepodrednimbrojem10nalaziupravoznakzanovired\n.
7.4Nizpromenljivihtipachar
Pogledajmonacinenakojemozemodeklarisatiiinicializovatiovuvrstupromenljivih:
charTEST[]=toxi;
charTEST[]={t,o,x,i};
Bitnojeznatidasamoimenizovskepromenljivepretstavljakonstantnipokazivacnaprvi
elementtogniza.Stocerecidacemoakonapisemo:TEST;ili&test[0];dobitiistu
stvaradresuprvogelementaniza.

StamislitekolikoTEST,ugornjemprimeruimaelemenata?Akoihprebroitenaicicetena
broj4.Ipak,TESTima5elemenata.DabiprikazalivrednostTESTanapisacemoovu
naredbu:
printf(%s,TEST);
Koristilismoupravljackiznak%skojimsignaliziramodazelimoprikazatistring(nizcharova).
Funkcijiprintf()smopredaliadresuprvogelementaniza(jersmojospredali:TEST,stoje
adresaprvogelementatogniza).Printf()prikazujeelementpoelement...Kakoceznatikada
jekrajniza?Dabitoomogucili,nakrajsvakogstringasedodajejosjedanznak\0(kosa
crtaunazadinula)kojidaklesignalizirakrajstringa.Sadatrebadavamjejasnozastou
gornjemprimeruTESTima5ane4elementa.Itojeveomabitnastvar!
Dabiutvrdilinauceno,napisacemodvamalaprograma:
/*PROGRAMVEZBA_1*/
#include<stdio.h>
voidfunc(inta)
{
a=123;
}
voidmain(void)
{
intbroj=7;
printf("VrednostiBROJprepozivafunc()je%d\n",broj);
func(broj);
printf("VrednostiBROJposlepozivafunc()je%d\n",broj);
}
Trebalobidavamjejasnozastocevrednostpromenljivebrojostatiistaiposlepoziva
funkcijefunc().
Drugiprogramjeovaj:
/*PROGRAMVEZBA_2*/
#include<stdio.h>
#include<string.h>
voidfunc(chara[])
{
strcpy(a,"nova_vrednost");
}
voidmain(void)
{
charbroj[20]="todic";
printf("VrednostiBROJprepozivafunc()je%s\n",broj);
func(broj);
printf("VrednostiBROJposlepozivafunc()je%s\n",broj);
}
Vrednostjepromenjena,zatostosmofunkcijefunc()predalisamoimepromenljivebroj
dakleadresuprvogelementa.Samimtimfunc()jeumogucnostidamenjavrednostbroja
(zastojetotakovecsmogovorilitakodabitrebalodavamjetojasno).

Obratimopaznjunatodasmoukljucilijosjedanheaderfajlstring.h.Ovosmouradilijer
namjebilapotrebnafunkcijastrcpy()onasluzizadodeljivanjejednogstringadrugom.
Paevamnapametdasmomoglidanapiemo:
a=nova_vrednost;
Medjutimtonijeomogucenopasezadodavanjenovevrednostistringukoristifunkcija
strcpy().Oovimfunkcijamacemogovoritiunarednimpoglavljima.
Zakrajcemojosjednomnapomenutidajeveomavaznodazanizcharovaizdvojite
dovoljnomestaumemoriji,dakleogromnajegreskanapisati:
charime[5];
strcpy(ime,PeraDetlic);
Uvekobratitepaznjunaovo!

8.Nekeodfunkcijastandardnebiblioteke
Uprethodnompoglavljusmopominjalifunkcijustrcpy()kojajedefinisanaustring.h.Uovom
poglavljucemoobjasnitikakosekoristeicemusluzenekeodfunkcija(nesve)kojesu
definisaneusledecimheaderfajlovimastandardnebiblioteke:string.h,ctype.h,math.h,
stdlib.h.SvioviheaderfajloviseisporuujuuzsvakivaljanCkompajlertakodasatestrane
nemateocemudabrinete.
8.1STRING.H
Naredbom#include<string.h>uprogramukljucujemofajlstring.hukojemsu
definisaneraznefunkcijezanaratanjesastringovima.
8.1.2Funkcijezakopiranjestringova
strcpy():
char*strcpy(char*,constchar*);
Ovajefunkcijaranijepominjanaisluzizadodeljivanjejednogstringadrugom.Kaostoseiz
datedeklaracijevidi,onauzimadvaargumenta:pokazivacnatipchariconstantnipokazivac
natipchar.Povratnitipovefunkcijejetakodjepokazivacnatipchar.
Dabisteutvrdiliznanjeotipupodatakacharistring(nizcharova),zadrzacemosemalovise
naovojfunkcijinapisacemokakoizgledanjenadefinicijaizatimjeproanalizirati.
Izvedbafunkcijestrcpy():
/*PROGRAMSTRCPY()1*/
#include<stdio.h>
voidkopiraj(char*odr,constchar*izv)
{
while(*izv!='\0')
*(odr++)=*(izv++);

*odr='\0';
}

voidmain(void)
{
//deklaracijapromenljivih
charrec1[50],rec2[50];
//uzmistringodkorisnika
printf("Unesirecenicu>");
scanf("%s",rec1);
//kopiraj
kopiraj(rec2,rec1);
//prikazirezultatkopiranja
printf("Rec2imavrednost>%s.\n",rec2);
}
Prvo,dabismokolikotolikouprostilifunkcijustrcpy()stavilismodanjenpovratnitipbude
voidanechar*.Nasufunkcijuzakopiranjesmonazvalikopiraj()aparametrisuostaliistikao
ikodstrcpy().
Mozdaneuvidjaterazlogzastojedrugiargumentconstantan.Odgovorleziutomecemuje
funkcijanamenjenakopiranjudrugogargumenta,kojijojprosledimo,uprvi.Toznacidace
sevrednostprvogargumenta,kojismonazvaliODR,menjatidokvrednostdrugog
argumentatrebadaostaneista.Dabismoseobavezalidanecemomenjativrednosti
drugogargumentastavilismokljucnurecconstizbogtoganecemomocidamenjamo
vrednostdrugomargumentu(kojismougornjemprimerunazvaliIZV).
Prvanaredbautelufunkcijejepetljawhile.Onacesevrtetidokgodznaknakojipokazuje
pokazivacIZVnebude\0.Kaostosmoranijereklisimbol\0pretstavljasimbolzakraj
stringa.Telopetljesesastojiodsamojednenaredbe:*(odr++)=*(izv++);pasamim
timviticastezagradenijepotrebnostavljati,alinaravnoneskodistavitiih.
Staradinaredba*(odr++)=*(izv++);?Njomznak(elementniza)nakojipokazuje
IZVdodeljujemoonomelementunizanakojipokazujeODR,itakovrsimokopiranje.Takodje
smokoristilioperatorinkrementiranja(++)dabi,pozavrsetkunaredbe,podesilipokazivace
dapokazujunasledecielementniza.UjednomtrenutkuIZVcepokazivatina\0stoznaci
dasmodoslidokrajastringakojitrebadakopiramopasamimtimuslov*izv!=\0
necebitiispunjenipetljaseneceviseizvrsavati.Zatimnamostajesamodadodelimo\0
elementunakojipokazujeODRjeristinijebiododatutokuizvrsavanjapetlje,azastojeto
takotrebalobidavamjejasno.
strncpy()
char*strncpy(char*,constchar*,size_t)
Ulogaovefunkcijejedauprviargumentkopiraonolikoznakovadrugogargumentakolikoje
navedenotrecimargumentom.Drugimrecimastrncpy()kopirasamojedan,pocetnideo
stringa(znakovnogniza).Primerkoriscenjaovefunkcije:

/*PROGRAMSTRNCPY1*/
#include<stdio.h>
#include<string.h>
voidmain(void)
{
//deklaracijapromenljivih
charrec1[50],rec2[50];
//dodelivrednostpromenljivojrec1
strcpy(rec1,"trivijalnitekst");
//kopirajprvih8elemenatastringarec1ustringrec2
strncpy(rec2,rec1,8);
rec2[8]='\0';
printf("Rec2je>%s.\n",rec2);
}
Obratitepaznjudasmonapisalirec2[8]='\0';razlogjetajstofunkcijastrncpy(),za
razlikuodstrcpy(),nedodajeznakzakrajstringapagamoramoizricitododati.
Jednanapomena,treciargumentovefunkcijejetipasize_t.Ovajtippodatkanemozecuvati
negativnebrojevesamopozitivne(istoponasanjeispoljavaitipunsignedint).Tojeovdevrlo
logicnokoristitijerkakomozedabrojelemenatabudenegativan?Nemoze,naravno.
8.1.3Funkcijenadovezivanja
strcat()
char*strcat(char*,constchar*);
strncat()
char*strncat(char*,constchar*,size_t);
Prvafunkcijasluzizanadovezivanjejednogstringanadrugi.Recimodaimatejedanstring
todicijosjedanstringnemanja,akohocetedaihspojiteujedanstringkoristicetefunkciju
strcat().Slediprimerzakoriscenjeovefunkcije:
/*PROGRAMSTRCAT1*/
#include<stdio.h>
#include<string.h>
voidmain(void)
{
//deklaracijapromenljivih
charrec1[50];
//dodelivrednostpromenljivojrec1
strcpy(rec1,"trivijalnitekst.");
//dodajjostekstapromenljivojrec1
strncat(rec1,"Ijosjedan!");
printf("Rec1je>%s\n",rec1);
}
Ovdejesvejasno.

Koriscenjefunkcijestrncat()jeslicnokaokodstrncpy(),dakleprviargumentsepovecava
zajedan,pocetnideodrugogargumenta.Kolikijetajdrugideoodredjujesetrecim
argumentom.Takodjecetemoratisamidadodatesimbol\0prvomargumentu.
8.1.4funkcijeporedjenja
strcmp()
intstrcmp(constchar*,constchar*);
strncmp()
intstrncmp(constchar*,constchar*);
Pomocuovihfunkcijamozeteproveritidalisustringoviindenticni.Akostringovijesuisti
funkcijavracavrednostnulu,aakosurazlicitijedinicuilinekidrugibrojrazlicitodnule.
Primer:
/*PROGRAMSTRCMP1*/
#include<stdio.h>
#include<string.h>
voidmain(void)
{
//deklaracijapromenljivih
charrec1[50],rec2[50];
//dodelivrednostpromenljivim
printf("Unesitedvereci>");
scanf("%s%s",rec1,rec2);

//uporeditekst
if(strcmp(rec2,rec2))
printf("Recisurazlicite!");
else
printf("Recisupotpunoiste!");

Funkcijomstrncmp()mogucejeporeditisamoparelemenatasapocetkanizova.Koliko
elemenatacebitiporedjenoseodredjujetrecimargumentom.

Josjednufunkcijuizstring.hcemoobjasniti.Tojestrlen().Ovafunkcijavracaduzinu
znakovnognizakojijojprosledimo.Akoimamo:
charrec[50]=nekistring...;
printf(Duzinaovogstringaje%d.\n,strlen(rec));
Naekran(pravilnijerecenonakonzolu)ceseispisatikolikoelemenataimaovajstring.

8.2 MATH.H
Uovomheaderfajludefinisanesuraznefunkcijezaradsabrojevimakaostosu
korenovanje,dobijanjesinusa,kosinusaidr.Objasnicemosamoparnajosnovnijihjerzaista
matematikasmara.

8.2.1Trigonometrijskefunkcije
Zadobijanjesinusakoristitefunkcijusin().Zadobijanjekosinusacos()azadobijanje
takgensatan().Sveovefunkcijekaojediniargumentuzimajupromenljivetipadouble.
8.2.2Stepenovanjevrednosti
Zastepenovanjevrednostikoristitefunkcijudoublepow(double,double).Kaosto
sevidipow()uzimadvaargumentaodcegajeprvibrojkojitrebastepenovatiadrugi
argumentjeeksponenttj.brojkojimsestepenuje.Akonapisemopow(10,3)kaopovratnu
vrednostdobicemo1000.
Zadobijanjekvadratnogkorenanekogbrojakoristisesqrt().Onavracavrednosttipadouble
amanajojjestonemozevaditinaprimertreciilicetvrtikorenvecsamodrugi(kvadratni).
8.2.3Zaokruzivanjenacelobrojnuvrednost
Objasnicemo4funkcije:
doublefabs(double);Sluzizadobijanjeapsolutnevrednostibroja(daklevracauvek
pozitivnuvrednost)
doublefmod(double,double);Operatorostatka(%)nemozeseprimenjivatina
realnevecsamonacelebrojeve.Pomocuovefunkcijetoseogranicenjeprevazilazi.
doubleceil(double);Prosledjeniargumentovafunkcijazaokruzujenanajblizuvecu
celobrojnuvrednost.Naprimerakoprosleditebroj10.01funkcijiceil(),onacevamvratiti
broj11.
doublefloor(double);Radipotpunoistokaoiceil()stomrazlikomstoprosledjeni
argumentzaokruzujenanajblizumanjuvrednosti.Takodaakonapisete:
intx;
doubleY=4.764458;
x=floor(Y);
Xceimativrednost4.
Primecujesenedostatakfunkcijekojabizaokruzivalavrednostipromenljivihnanajblizu
celobrojnuvrednost.Dakleakoimate4.7ili4.5ili4.9,dabrojbudezaokruzenautomatskina
5aakoimamo4.2ili4.4999ili4.001,dabrojbudezaokruzenna4stimdauobaslucaja
pozivatejednufunkcijupostoneznatedalitrebapozvatifloor()iliceil()(recimodakorisnik
zadajebrojkojitrebazaokruzitikakoceteondaznatikojufunkcijudapozovete?).Saovim
problemomsamsesusreoprilikompisanjaprogramakojitrebadaodprosecneocenekoju
ucenikimaizvedezakljucnuocenu(kojadaklemorabitizaokruzenavrednost).Evokako
izgledainteresantnoresenje:
intCeo(doublex)
{
if((xfloor(x))<0.5)
return(int)floor(x);
return(int)ceil(x);
}
Preporucujemdaanaliziratekodishvatitekakoradi.Naravno,postojijosnacinadaseovaj
problemresi.

8.3 CTYPE.H
Uovomheaderfajlusufunkcijezabaratanjesasimbolima(charovima),zarazlikuod
string.hukomsenalazefunkcijezanizovecharova(stringova).Glavnaprimenaovih
funkcijajekodobradepodatakakojisuzapisaniufajlovimaaotomecekasnijebitireci.
8.3.1Pripadnostsimbolagrupi
Simbolmozebitibroj,slovo,znakrazmakailinekidrugiznak.Sledecefunkcijevracaju
vrednost1dabisignaliziraletacnostanuluzanetacnost:
intisalpha(int);Funkcijaproveravadalijeprosledjeniznakslovoiakojestevraca
vrednost1.Evojednogprimera:
#include<stdio.h>
#include<ctype.h>
voidmain(void)
{
chara=r;
if(isalpha(a))
printf("%cjeslovo!\n",a);
else
printf("%cnijeslovo!\n",a);
}
Uovomslucajuporukakojacebitiispisanajedarjesteslovo.Itojelogicnoalistabibilo
ispisanodaumestochara=r;stojichara=144;?Akostepomislilidacese
ispisatidanijeslovogrdnostesepresli.Setitesepoglavlja7.3ukojemsmoreklidaniti
jedantippodatkanemozesadrzatiznakovevecsamobrojaadapostojitabelaukojojsvaki
simbol(znak)imasvojrednibrojprekokogamusepristupa.MibismodaklepromenljivojA
dodelilivrednost144stoznacidaceAsadrzatitajbroj.Upoglavlju7.3smonapisaliprogram
kojinamispisujetabelusimbolaipodkojimserednimbrojemtisimbolinalaze,pogledajte
stajepodrednimbrojem144.Slovor!Akovamrazlogovomponasanjunijejasanprocitajte
poglavlje7.3josjednom.
intisdigit(int);Funkcijaradipotpunoistokaoiisalpha()stomrazlikomsto
proveravadalijeprosledjeniargumentbrojiline.Akojestebrojfunkcijavracavrednost1,u
suprotnomvraca0.
intisalnum(int);Ukolikojeprosledjeniargumentslovoilibroj,funkcijavraca
vrednost1ausuprotnom0.
intisspace(int);Pomocuisspace()vrsimoproveravanjedalijeprosledjeniargument
nekiodznakovarazmaka.Znakomrazmakasesmatraju:novired(\n),razmak()i
tabulacija(\t).Akoargumentjesteznakrazmakavracasevrednost1usuprotnom
dobicemonulu.
8.3.2Odredjivanjeimenjanjevelicineslova
Cetrisubitefunkcije:

intislower(int);Proveravadalijeprosledjeniargumentmaloslovo,akojestevraca
rezultat1akonijevracanulu.
intisupper(int);Proveravadalijeprosledjeniargumentvelikoslovo.Vracavrednost
1akojestei0akonije.
inttolower(int);Vrednostkojuvracaovafunkcijajesmanjenoslovo.Primer
koriscenja:
charslovo=T;
slovo=tolower(slovo);
sadacepromenljivaSLOVOsadrzatiznakt(pravilijebibiloreciSLOVOcesadrzatiredni
brojznakataliovozvuciglupavoiglomaznopaseinekoristi).
inttoupper(int);Istastvarkaoitolower()uzrazlikostoslovobivapovecano.

8.4 Josfunkcijazakomuniciranjesakorisnikom
Poredprintf(),tekstmozeteprikazivatinaekran(konzolu)ipomocusledecihfunkcija(svesu
definisaneustdio.h):
intputchar(int);Pomocuovefunkcijemozeteprikazatisamojedansimbolna
ekran,alineinizznakova.Naprimernapisiteputchar(\a);iuetebeepzvukna
vasemracunaru.
intputs(constchar*);Sluzizaprikazivanjetekstanaekran.Nestoslicnopoput
printf()uzrazlikustonemozedaprikazujevrednostipromenljivihveciskljucivotekst.
Reklismoranijedajescanf()vrlopipavafunkcijautompogledustozahtevadapodaci
buduunesenikorektnoakorisnikprogramamozeslucajno(ilinamerno)daunesepogresan
podatak,tadaceoprogrampadauvodu.Naprimerumestodaotkuca2korisnikpritisneE....
Dabiseovajrizikizbegaokoristesenekedrugefunkcijezauzimanjepodatakajednaodnjih
je:
char*gets(char*);kojasluzizauzimanjeredatekstaodkorisnika.Naime,mozdaste
primetilidakoristeciscanf()nemozeteucitaticeoredtekstavecnajvisesamojednurec(sve
doprvogznakarazmaka).Zarazlikuodnje,gets()uzimaceotekstkojijeunesennebitno
dalionsadrzibrojeve,slova,razmakeilinekedrugeznake.
Napisacemoprogramkojiodkorisnikatraziimeiprezimeazatimmenjavelicinuslovima
imenaiprezimena,koristecipritomnekeodfunkcijapomenutihuovompoglavlju.

/*PROGRAMIME_I_PREZIME*/
#include<stdio.h>
#include<ctype.h>
#include<string.h>
//prototipfunkcije
intMalaSlova(char*text);
voidmain(void)

{
//deklaracija
intduzina=0;
inti=0,n;
staticcharpom[50],ime[25],prezime[25];
//traziimeiprezimedokgodnebuduunesenamalimslovima
do{
printf("Unesitevaseimeiprezimemalimslovima>");
gets(pom);
}while(MalaSlova(pom));
/*PodeliPOMnaIMEiPREZIME*/
//preskocirazmakesapocetkaakoihima
while(isspace(pom[i]))++i;
//sadaPOM[i]pokazujenaprvoslovoimena,"uvecaj"slovo
pom[i]=toupper(pom[i]);
//trazikrajimena(doprvograzmaka)ikopirajvrednostuIME
while(!isspace(pom[i]))++i;
strncpy(ime,pom,i);ime[i]='\0';//propust1
//preskocisverazmakeizmedjuimenaiprezimena
while(isspace(pom[i]))i++;
//povecajprvoslovoprezimena
pom[i]=toupper(pom[i]);
//kopirajprezimeupromenljivuPREZIME
for(n=0;!isspace(pom[i])&&pom[i]!='\0';++i)
prezime[n++]=pom[i];
prezime[n]='\0';
//prikazirezultat
printf("Vaseimeje:%s,aprezime%s.\n",ime,prezime);
}
//definicijafjeMalaSlova()
intMalaSlova(char*text)
{
for(;*text!='\0';++text)
if(!islower(*text)&&!isspace(*text))return1;
return0;
}
Ovajkodnamernonecemokomentarisatiiobjasnjavati.Recicemosamodasvestotrebada
znatedabirazumeliovajprogramstevecimaliprilikudanauciteuovomtutrialu,ijosjednu
stvar:Kodjenamernoneusavrsen,navamajedaeventualnepropusteispraviteidaceo
kodpoboljsatekolikojetomoguce.Bicevamodlicnavezba.Pritomobratitepaznjunaliniju
kodaukojojstojikomentar//propust1,upromenljivuIMEbiceupisaniieventualni
razmaci(akoihjekorisnikuneo).Napisitefunkcijukojacesepozivatiusledecojlinijikodada
ispravitiovajpropustbrisucinepotrebneznakerazmaka.Srecno!

8.5Funkcijezadinamickoupravljanjememorijom
SvefunkcijekojecemospominjatiuovomodeljkusenalazeuheaderfajluSTDLIB.H.
Dosadastenaucilistasupokazivaciireklismodaonimogupokazivatinanekudrugu
promenljivu,tacnijenamestuumemorijikojejeodvojeno(rezervisano)zatudrugu
promenljivu.Medjutim,koristecifunkcijumalloc()izstdlib.hmimozemodarezervisemo
odredjenoparcememorijememorijacebitizauzetaalijenijednapromenljivanece
koristiti.Pastecenamonda?Naime,pomenutafunkcijamalloc()kaopovratnuvrednostdaje
adresumemorijekojajeupravozauzeta,akojitippodatkajedinimozecuvatiadrese?
Naravno,pokazivaci.Pomocuovogmehanizmaumogucnostismodinamicki,utoku
izvrsavanjaprograma,daalociramo(zauzimamo)odredjenekolicinememorijeinanjihce
pokazivacipokazivatipacemomocidautumemorijuskladistimopodatke.Slediprimerza
dinamickualokacijumemorije.
/*PROGRAMMEMORIJA_1*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
voidmain(void)
{
//deklaracija
char*text;
//alociranjememorije
text=malloc(sizeof(char)*50);
//upisinekuvrednostumemorijunakojupokazujeTEXT
strcpy(text,"josjednatrivijalnaporuka!");
//prikazivrednost
printf("TEXT>%s\n",text);
}
Svesemnaredbeukojojpozivamomalloc()trebadavamjejasno.
Funkcijimalloc()smokaoargumentpredalijednupomalocudnovrednost::
sizeof(char)*50
sizeofjeoperatorCjezika(kaostosuirecimo+ili/operatori)anjegovaulogajedaodredi
kolikomemorijezauzimanekitippodatka.Uovomslucajutrazilismokolikobajtovazauzima
tippodatkacharituvrednostpomnozilisa50.Timecemodobitibrojbajtovakojijepotreban
dabisesmestilo50charovaumemoriju.Drugimrecima,akozelimodarezervisemo
memorijuzanpr.10promenljivihtipaINT,nemozemofunkcijimalloc()predativrednost10.
Razlogjetajstobismonatajnacintraziliodfunkcijedarezervise10bajtovaane10puta
poonajbrojbajtovakojizauzimatipINT.Pazatomoramodanapisemo:
sizeof(int)*10
Dakleovogovoriprevodiocu(kompajleru)izracunajkolikobajtovazauzimatipINTazatimtaj
brojpomnozisa4itimecemodobitibrojbajtovakojinamjepotrebandabismestili10
INTovaumemorijuracunara.
Kadajepotrebnakolicinamemorijerezervisana(alocirana)funkcijamalloc()namvraca
adresutememorijeimijeugornjemprimerudodeljujemopokazivacuTEXT.Zatim
upisujemovrednostiualociranumemorijupomocufunkcijestrcpy(),dabinakrajuiiscutavali
vrednostiztememorije.Zakljucakjedasesadinamickizauzetommemorijommozebaratati

kaoisanormalnozauzetommemorijom(memorijakojajezauzetapravljenjemobicnih
promenljivih).
Sadbitrebalodavamjejasnozastoikakoovoradi.Ostajedasevidizastobiuopstekoristili
dinamickoalociranje.Razlogajeviseaakosebudeteposvetiliprogramiranjunestodubljei
samiceteihzakljuciti.Jacurecisamojedanodnjihkompaktnijeiskoriscenjememorije.
Imacemojedanprimersaovakvimpristupomalipretogamoratedaznatejos(samo)staje
realokacijaicurenjememorije.
Curnjememorijejejedinalosastvarkoddinamickogupravljanjamemorijom.Slediprimero
ovome.
/*PROGRAMMEMORIJA_2*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
voidmain(void)
{
//deklaracija
char*text;
//alociranjememorije
text=malloc(sizeof(char)*50);
//upisinekuvrednostumemorijunakojupokazujeTEXT
strcpy(text,"josjednatrivijalnaporuka!");
//sadcemosemalomnogoprevariti
text=malloc(sizeof(char)*20);
//prikazivrednost
printf("TEXT>%s\n",text);
}
Uodnosunaprosliprogram,ovajsmopovecalizasamodvelinijekoda,itoove:
//sadcemosemalomnogoprevariti
text=malloc(sizeof(char)*20);
Napasalissmonacurenjememorije!Evoizasto:prvosmopripocetkuprogramaalocirali
jedanblokmemorijeinatajblokmemorijejepokazivaosamopokazivacTEXT.Sadasmo
alociralijosjedanblokmemorije(kojijenestomanjiodprethodnogzauzimamestoza20
charova,alitouopstenijebitno)iadresutogblokadodeliliopetpokazivacuTEXT.Ovoradii
satestranejesveOK.Medjutim,naprviblokmemorijekojusmozauzelisadavisenijedan
pokazivacnepokazuje,takodajojvisenemozemopristupiti.Takvamemorijajeprocurela
memorijaionajestetnajerzauzimajedandeomemorijeracunaraanicemunesluzi.U
ovomprimerutoinijetakoopasnojerjetomalakolicinamemorijealistadajedocurenja
doslounekojfunkcijikojaseutokuradaprogramapozivanekolikohiljdaputa?Programbi
pojeosvuraspolozivumemorijuracunara!
Resenjeovogaproblemalezuupravovremenomoslobadjanjumemorijekojanamvisenece
bitipotrebna.Oslobadjanjememorijevrsisepomocufunkcijefree().Njenokoriscenjeje
krajnjejednostavnodovoljnojedajojpredatepokazivacnamemorijukojutreba
osloboditi(dealocirati).Slediispravljenaverzijapredjasnjegprograma.

/*PROGRAMMEMORIJA_3*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
voidmain(void)
{
//deklaracija
char*text;
//alociranjememorije
text=malloc(sizeof(char)*50);
//upisinekuvrednostumemorijunakojupokazujeTEXT
strcpy(text,"josjednatrivijalnaporuka!");
//dealociramomemorijukojusmozauzelipanemacurenjamemorije
free(text);
//sadjesasvimkorektnododelitinovuadresupokazivacuTEXT
text=malloc(sizeof(char)*20);
//uradinestoglupo
text[0]='T';
text[1]='\0';

//prikazivrednost
printf("TEXT>%s\n",text);

Prostoijednostavno.
Ostajejosdashvatitestajerealokacijazauzetememorije.
Predpostavimodasmodinamickizauzelijednupovecukolicinumemorije.Zatimsmoutu
memorijusmestilipodatkekojejenaprimeruneokorisnimprograma.Mimozemoizracunati
kolikonammemorijestvarnotrebazacuvanjedobijenihpodataka,aonuostalumemoriju
kojapretstavljavisak,pajesamimtimbespotrebna,mozemoosloboditi.Zatokoristimo
funkcijurealloc()izstdlib.h.Primerzarealokacijudinamickizauzetememorije:
/*PROGRAMMEMORIJA_4*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
voidmain(void)
{
//deklaracija
char*text;
//alociranjememorije
text=malloc(sizeof(char)*50);
//uzmiimeiprezimeodkorisnika
printf("Unesiimeiprezime>");
gets(text);

//prikazikolikomemorijesadazauzimatext(ubajtovima)
printf("Kolicinasadazauzetememorijeje%dbajtova.\n",
sizeof(char)*50);
//START.realocirajmemoriju
text=realloc(text,sizeof(char)*(strlen(text)+1));

//novakolicinamemorijeje
printf("Poslerealociranjamemorijeonazauzima%dbajtova!\n",
sizeof(char)*(strlen(text)+1));

KodiznadkomentarakojipocinjesaSTARTtrebadavamjejasan,pacemoobjasnitisamo
kodkojislediposlenjega.
Prvokoristecifunkcijireallocrealociramozauzetumemoriju.Ovafunkcijauzimadva
parametra:pokazivacidecimalnibroj.Kaoprviargumenttrebamodapredamopokazivacna
memorijukojojzelimodapromenimovelicinu(dajerealociramo).Uovomslucajusmo
predaliTEXTzatostozelimodapromenimobrojbajtova(velicinu)blokumemorijenakojion
pokazuje,konkretnoovdedatajbloksmanjimo.Naravno,pomocurealloc()mozesei
povecavatiismanjitizauzetiblokmemorije,dokzapotpunooslobadjanjezauzetogbloka
memorijemoramodakoristimofree()funkciju.Kaodrugiargumentsmopredali
sizeof(char)*(strlen(text)+1).Pomocufunkcijestrlen()cemodobiti
kolikoznakovaimauTEXTu,alipostosvakistringimaizavrsniznak\0(atajznakstrlen()
nebroji)moramododatiiono+1.(strlen()+1)smostaviliizmedjuzagradajerbi
seusuprotnomprvoizvrsilomnozenjeatekondasabiranje.
Funkcijarealoc(),poputmalloc(),vracaadresurealociranememorije,pasmomituadresu
dodelilipokazivacuTEXT.
Nakraju,pomocuprintf()prikazujemonovu,optimizovanukolicinuzauzetememorije.Na
ovajnacinsmoustedelimalomemorije.Kaostosmovecrekli,razlogazakoriscenje
dinamickogalociranjaimaviseaovojebiosamojedanodnjih....

8.6 Generisanjerandombroja
Naciceteseusituacijidavamzatrebanasumicni(random)brojauovomodeljkucemovam
recisvestotrebadaznateotome.Sledinajjednostavnijiprimergenerisanjarandombroja:
/*ProgramRAND1*/
#include<stdio.h>
#include<stdlib.h>
voidmain(void)
{
intbroj;
broj=rand();
printf("Dobijenibrojje%d\n",broj);
}
PrvosmodeklarisalipromenljivuBROJkojajetipaINT.Zatimsmojojdodelilivrednostkoju
vracafunkcijarand(),dabinakrajuprikazalikojismobrojdobili.Kaostosemozevideo
funkcijarand()sluzizagenerisanjerandombroja.Onajevrloprostazakoriscenjejerne
uzimanijedanparametaradefinisanajeuheaderfajlustdlib.h.Medjutimakopokrenete
programvidecetedaBROJstalnodobijaistuvrednostbezobzirakolikoviputapokrenuli
program.Tosemozeresitiovako:

/*ProgramRAND2*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
voidmain(void)
{
intbroj;
srand(time(NULL));
broj=rand();
printf("Dobijenibrojje%d\n",broj);
}
Dvesurazlike:dodalismo#include<time.h>isrand(time(NULL));.
Prvuizmenusmonacinilijerjeutime.hdefinisanafunkcijatime()kojusmokoristiliu
programu(napomena:funkcijeiztime.hnecemoobjasnjavati).
Funkcijasrand()definisanajeustdlib.hisluzi,slikovitoreceno,damaloprovrtibrojevekoje
cekoristitirand().Nijetobastakoalizaistanijepotrebnodaznatekakoovoradi,pavas
necemosatimopterecivati.NapomenimoovdeznacenjereciNULLtojesinonim(tacnije
makro)zapokazivacnatipvoid(dakle:void*).Saovimse(opet)nemorateopterecivati,
recicemosamodasteumestonjegamoglidastaviteinulujerjevrednostNULLustvaru
nula.
Epilogoveizmenejedacemodobijatistalnodrugacijebrojeve,stonamjeibiocilj.Ipak,
opsegukojemcedobijenirandombrojevibitinijeogranicen.Staakonamtrebarandombroj
kojijenulailijedan?Primer:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
voidmain(void)
{
intbroj;
srand(time(NULL));
broj=rand()%2;
printf("Dobijenibrojje%d\n",broj);
}
Ovdenicegnepoznatognemaazeljeniopsegrandombrojasmodobilitakostosmo,
promenljivojBROJdodeliliostatakprideljenjubrojakojivracarand()sabrojemdva.Logicno
ostatakdeljenjasadvajeuvek0ili1,zarne?Kaovezbu,napisiteprogramkojicegenerisati
20randombrojeva(pomocupetlje)uopseguod0do1,ikojiceizbrojatikolikoseputa
pojavljuje0akolikoputa1.

9.Strukture
Svidosadaupotrebljavanitipovipodatakauovomtutrialubilisuosnovni(prosti)tipovi.Tosu
naprimerINT,FLOAT;CHAR...Nasuprotnjima,postojeiizvedeni(slozeni)tipovipodatakaa
jedanvidtihpodatakasuistrukture.Deklaracijastruktureizgledaovako:

structime_strukture{
intclan1;
charclan2;
floatclan3[10];
intclanx=4579;/*itd...*/
};
Recstructgovoridajeupitanjustruktura.Slediimestruktureizatimbloknaredbi(telo
strukture)akaostoznate,bloknaredbijeoivicensa{i}.Unutartelastrukturedefinisanisu
clanovitestrukture,njihovbrojjeneogranicenamozetenapravitistrukturukojanemani
jedanclan(madajetastrukturavisenegobeskorisna).Uovomprimeru,clanovistrukturesu
prostitipovipodataka.
Kadaizastokoristitistrukture?Recimodahocemonapravitiprogramkojiuzimaneke
osnovnepodatkeokorisnicimakaostosuime,prezimeigodiste.Tomozemouraditiibez
strukturaalibikodbiodostalosijeorganizovan.Naime,svakikorisnikkojibudeupisivao
svojepodatkecemoratidaupiseime,prezimeigodiste.Tonamgovoridabibilozgodnoda
napravimonovitippodatka(strukturu)kojicesezvatinprOsobaikojiceusebisadrzati
podatkeoimenu,prezimenuigodistukorisnika.Napisimotustrukturu:
structOsoba_st{
intgod;
charime[25];
charprezime[25];
};
OvimsmonapraviliovitippodatkakojisezoveOsoba_st.Toznacidacemomocida
napravimo(deklarisemo)promenljiveovogtipa,istokaostodeklarisemopromenljivetipaINT,
naprimer.Evokakobitoizgledalo:
structOsoba_stkorisnik;
NaovajnacinsmodeklarisalipromenljivukojasezovekorisnikkojajetipaOsoba_st.Da
nemaonogstructispredOsoba_st,deklaracijabibilapotpunoistakaoizatippodatkanpr.
INTiliFLOAT.Medjuimtostructmoramopisatidabikompajler(prevodilac)znaodaseradi
oizvedenomtipupodatka.Napisimoprogramakojikoristiovustrukturu:
/*programSTRUKTURE1*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//napravi(definisi)novitippodatka(strukturu)
structOsoba_st{
intgod;
charime[25];
charprezime[25];
};
//polaznatackaprograma
voidmain(void)
{
//deklarisipromenljivutipaOsoba_st
structOsoba_stkorisnik;

//deklarisi"obicnu"promenljivutipaINT
intpom;
//uzmipodatkeismestiihupromenljivu"korisnik"
printf("Unesigodiste:");
scanf("%d",&pom);
korisnik.god=pom;
}
DefinicijastruktureOsoba_sttrebadavamjejasna.Ufunkcijimain()smonapravili
promenljivukorisnikkojajetipaOsoba_st.Zatimdeklarisemopomocnupromenljivu(mada
smomoglikodnapisatitakodanamonainetreba)pom.Posletogaodkorisnikatrazimoda
unesesvojegodiste(pozivajuciscanf())itajpodatakasmestamoupom.Sledecalinija
kodajeinteresantna:KadasmodefinisalitippodatkaOsoba_streklismodaonsadrzi
promenljivepodimenomgod,imeiprezime,auovojlinijikodapristupamoclanugodi
dodeljujemomuvrednostkojuimapromenljivapom.Topristupanjejeizvedenopomocu
operatoratacka(.)Daklestrukturajeskupvisepromenljivihrazlicitihtipova,amipreko
operatoratackamozemodapristupamotimpromenljivimimenjamoimvrednosti.Kao
vezbuzavrsiteprogramtakodaukorisniktakodjeupiseimeiprezime.Nezaboravitedase
zakopiranjestringovakoristifunkcijastrcpy(),kojajeobjasnjenauprethodnompoglavlju.
Takodjemozetepravitiinizoveizvedenihtipovapodatakaanjihovaupotrebajepotpunoista
kaoikodprostihtipova:
structOsoba_stbzv[100];
Pristupanjeclanovimastrukturejetakodjeprosto:
bzv[99].god=1989;
Inicijalizacijaclanovastrukturesemozeizvestinasledecinacin:
structOsoba_stkorisnik={10,"Nemanja","Todic"};
Dakleotvorenaviticastazagradaizatimupisujetevrednostikojimzelitedainicijalizujete
promenljive.Vrednostisurazdvojenezarezomimorajusenavoditiistimredomkojimsu
deklarisaneudefinicijistrukture.Tj.akosteustrukturiprvonapraviliclangodondaceprva
vrednostkojunapiseteizmedjuviticastihzagradabitidodeljenaupravoclanugodisve
takoredom.
Ostrukturamaimajosmnogo,mnogotogadasekazemedjutimpostoseovajtutrialbavi
samostvarimakojeseradeuskoli,zadrzacemosenadosadrecenom.Bitnojezasadada
usvojiteovoosnovnoshvatanjestrukturaidaihprimenjujetekadsegodzatoukaze
potreba.

10.Radsafajlovima

Uovompoglavljucetenaucitidasmestatepodatkeufajlkaoidaiznjegaiscitavatepodatke.
Skorosviprogramibaratajusafajlovimauvecojilimanjojmeri,pajestogaveomabitnoda
usvojitesvestobudereceno.
10.1StandardnitokoviipojamBafera
Udosadasnjemdelututrialakoristilismodvaodtristandardnatokajedanzaispisivanje
podatakanakonzolu(ekran)ijedanzauzimanjepodatakasakonzole.Tokzauzimanje
podatakasenazivastdinatokzaispispodatakasenakonzolusenazivastdout.Tok
stdinjepovezansakonzolomitoponasanjenemozemopromeniti,istovaziizatok
stdout.Posledicaovogajedacestdoutuvekprikazivatitekstnakonzoluanecegana
primersacuvatiunekifajl,slicnotomestdincekaounesenepodatkeuzetisamoonosto
jekorisnikunetoukonzolu.Dabipojasnilistajetotokuzecemourazmatranjefunkciju
printf().Kadajojpredamonekitext,naprimerOvojeporuka!onacetajtextprosleditina
tokstdoutpacesamimtimtextbitiispisannakonzoli.
Josjednajebitnastvarprikazivanjetextnakonzolujeveomasporprocespase,dabise
prikazivanjeubrzalo,textneprikazujecimbudeprosledjenvecsebaferujeuredovetj.
tekstsecuvaubaferu(baferjenazivzanizpromenljivihtipachar,daklezastring)svedok
senedodjedoznakazakrajred\nilizakrajstringa\0.Tadsetextprikazujeabaferse
praznidabioslobodioprostorzasledeceskladistenjeprosledjenogtexta.
Dosadasmonavelinekolikofunkcijazauzimanjepodatakaodkorisnikaalifunkciju
getchar()smonamernopreskocilijernistebiliupuceniutokakoradibafer.Ovafunkcijasluzi
zauzimanjejednogznakaodkorisnika,tacnijeizbaferalipojasnicemonasledecem
primeru:
/*programBafer1*/
#include<stdio.h>
voidmain(void)
{
charzn;
getchar();
zn=getchar();
printf(">%c",zn);
}
Ufunkcijimain()smopozvaligetchar()dabizatraziliodkorisnikadaunesejedanznaki
pretpostavimodajekorisnikuneobassamojedanznak.Zatimsmopomocuprintf()naekran
istampali>atakodjeivrednosttojusadrzipromenljivaZN.Mozdaocekujetedace
programodvastrazitidadvaputaunesetenekiznakalitosenecedogoditi.Naime,kada
smoprviputpozvaligetchar(),tafunkcijajepokusaladauzmeznakizbaferaaneod
korisnika.Alipostojebaferutomtrenutkubioprazan,programjemoraodaodkorisnika
zatrazipodatkekojecesmestitiubaferazatimce,daklekadakorisnikunesepodatke,
funkcijagetchar()pokusatiponovodaiscitaprviznakizbafera(atojelogicnoprviznakkoji
jekorisnikuneo)ovogaputatoizcitavanjecebitiuspesno.Znakkojifunkcijagetchar()
budenaslaubaferucebitivracenkaorezultat.
Umain()funkcijismozatimjosjednompozvaligetchar()ievostasesadadogadja:getchar()
opetpokusavadauzmeznakizbafera,ovogaputanaravnonecepokusatidauzmeprvi
znakkojisenalaziubaferuvecdrugi.Tacnije,postojipokazivacnaelementebaferaitajse
pokazivacinkrementirakodsvakogpozivaovefunkcije,paceonuvekpokazivatinasledeci
elementubaferugetchar()samoproveravadalijeznaknakojiovajpokazivacpokazuje
ispravantj.dalismodoslidokrajatextakojijesmestenubafer(kaostovectrebadaznate,

znakkojipredstavljakrajtextaje\0)paakonismodoslidokrajatextagetchar()kaorezultat
vracaelementnakojipokazujepokazivacausuprotnomodkorisnikasetrazidaponovo
unesepodatke.
Istamislitedalicekorisnikmoratiponovodaunesetepodatke(akopretpostavimodajeprvi
putuneosamojedanznak)?Necemorati!Razlogjejednostavankaostosmorekli
baferovanjesevrsiuredove(izaispisizacitanje)toznacidamiubafernismoupisalisamo
slovokojesmootkucalivecismozatimmoralidapritisnemoENTERaenterpretstavljaznak
zanovired,pajeitajznakunesenubafer.Daklepromenljivazncecuvatiznak\n.
Dabisteseuverilidasteovozaistashvatilirazmotritekakoizastoradisledeciprimer:
/*programBafer1*/
#include<stdio.h>
voidmain(void)
{
charzn;
while(zn=getchar())//unositetekstproizvoljneduzine...
printf("%c",zn);//moglismonapisatii"putchar(zn);"
}
Postojijosjedanstandardnitokpovezansakonzolomstandardnitokzagreskestderrali
njeganecemouzetiurazmatranje.
10.2StrukturaFILEifunkcijezaotvaranjenovihtokova
Kaostostemoglidazakljucitenepostojinijedanstandardnitokkojijepovezansafajlovima
naHardDisku(ilinekojdrugojjedinicizasmestanjepodataka)medjutimmozemoihotvoriti
usvojimprogramimaakozatoimamopotrebu(avecinaprogramaimapotrebuzaovim
vidomskladistenjapodataka).Sturorecenofajljenizbajtovaumemorijikojimjedatoime,on
imasvojuadresuumemorijiiznakzasvojkraj(slicnokaostoistringimaznal\0).Na
primerovajtutrialjefajl,pesmesufajloviitakodalje.Dabikomunicirali(citaliiliupisivali
podatkeufajl)potrebnanamjepokazivacnatipFILE.FILEjestruktura(dakleizvedenitip
podatka)kojajedefinisanauheaderfajlustdio.hionasadrzisvapotrebnasvojstvadabi
mogliprekonjedakomuniciramosanekimfajlom.Samukonstrukcijuovogizvedenogtipa
podatkaikakoonradinijeneophodnodaznate(vecsamodagakoristite)pavassatim
necemoopterecivati.
KadasmonapravilipokazivacnaFILEmitrebadagapovezemosanekimfajlomnaHDu,
tj.trebadanamestimopokazivacdapokazujenazeljenifajlatosezoveotvaranjetokaka
fajlu.Kadasmotouradiliimacemopotpunukontrolunadodredjenimfajlomtakodamozemo
upisivatiicitatipodatkeiznjega.Otvaranjetokasevrsipomocufunkcijefopen()kojavraca
adresunakojojsenalazifajlsakojimtrebadakomuniciramo.Demonstracijagore
recenog:
/*programFajl1*/
#include<stdio.h>
voidmain(void)
{
FILE*pf;
intbroj=13041989;
//povezisefajlom
pf=fopen("MojFajl.txt","w");

//upisinekepodatkeufajl
fprintf(pf,"Brojje%d...",broj);

//zatvoritok
fclose(pf);

PrvostvaramopokazivacnaFILE,zatimpomocufopen()otvaramofajlMojFajl.txt.Drugi
argumentpretstavljamodukomezelimodaotvorimofajl(zacitanje,pisanje,azuriranje
idr.),uovomslucajusmopredalijewstoznacidafajlotvaramozaupisivanje(sleditabela
svihznakovakojemozetekoristitikaoinjihovoznacenje).
Zatimsmokoristilifunkcijufprintf()kojaimaslicnusintaksukaoiprintf()stomrazlikomsto
nemoradaispisujepodatkeustdoutvecihmozeupisivatiiutokkanekomfajlu(aukojitok
sepodaciupisujusenavodiprvimargumentom,uovomslucajutojePF).Kasnijecemo
objasnitinekeodosnovnihfunkcijazabaratanjesafajlovima.
Nakrajuzatvaramootvorenitokpozivajucifunkcijufclose()kojakaoargumentuzimatokkoji
trebadazatvori.

|MOD|
OPIS

|r
|Otvaratextualnifaljzacitanje
|

|w |Zamenjivanjeilikreiranjetextualnigfajlazaupis
|

|a
|Otvaranjeilikreiranjetextualnogfajlazadopisivanje |

|rb |Otvaranjebinarnogfajlazacitanje
|

|wb |Zamenjivanjeilikreiranjebinarnogfajlazaupis
|

|ab |Otvaranjeilikreiranjebinarnogfajlazadopisivanje
|

10.3Funkcijezabaratanjesafajlovima
Objasnicemo6najcescekoriscenihfunkcija.

intfprintf(FILE*,upravljackiniz,parametar1,parametar2,...);
Nacinkoriscenjaovefunkcijejeveomaslicansafunkcijimprintf()satomrazlikomstose
kaoprviparametarunosipokazivacnaFILE.Podacicebitiupisaniufajlnakojitajpokazivac
pokazujeanenastdout.
intfscanf(FILE*,upravljackiniz,parametar1,parametar2,...);
Slicnostiirazlikeizmedjuscanf()ifscanf()sukaoikodprintf()ifprintf().Daklekaoprvi
argumentnavoditeimefajlaizkojegasepodaciiscitavajuasveostaloostajeisto.
intfputc(int,FILE*)
Sluzizaupisivanjejednogznaka(prviargument)ufajlkojijenavedendrugimargumentom.
PrimeticetedajeprviargumenttipaINTtakodamozeteprosleditiipromenljivutipaCHARa
nesamoINT.

intfgetc(FILE*);
Iscitavanjejednogznakaizfajla.Iscitaniznakfunkcijavracakaopovratnuvrednost.

char*fgets(char*,int,FILE*);
Poputgets(),funkcijafgets()sluzizaiscitavanjecelogredatextaalinesakonzoleveciz
fajla.Kaoprviargumenttrebapredatistringukojicebitismesteniscitanitext,doknamje
znacenjetrecegargumentapoznato.Drugiargumentizgledakaovisakmedjutimon
pretstavljavelicinunajveceocekivaneduzineredatexta.Akonaprimerunesetebroj10a
nekiredufajluima20znakovaimaceteproblemjernemadovoljnomestadasesviti
znakovisacuvaju.Uobicajenavrednostkojutrebapredatiovojfunkcijijeduzinastringakoji
stepredalikaoprviargument.Dakleovako:
charret[30];
FILE*pf;
pf=fopen(c:\\toxi.txt,r);
fgets(ret,30,pf);
Sistempokomovofunkcijonisebitrebalodavamjejasan.
intfputs(constchar*,FILE*);
Ponasasepotpunoistokaoifges()aliupisujepodatkeufajl.Primeticetedanema
argumentaduzineznakovnonizapostojeonfunkcijipoznat.
NestonaprednijeI/OufajljebinarniI/Omedjutimnjeganecemouzetiurazmatranje.
Kraj...
Mozdacuovajtutrialprosiritinovimpoglavljimaalisigurnneuskoro...Akovannestonije
jasnoiliimatekakveprimedbe(ilisestesenaslizatecenimojomgramatickom
nepismenoscu)mojemailjetoxi@sezampro.com.
MaytheSourcebewithyou!

You might also like