Urednik
B R A NI MIR A VALIĆ Recenzenti
Mr. ZLATA TRUPČ:EVIĆ DUŠAN TRBOJEVIĆ Grafički urednici Ž ELJKO PRODANOVIĆ
ŽE...
31 downloads
1341 Views
35MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Urednik
B R A NI MIR A VALIĆ Recenzenti
Mr. ZLATA TRUPČ:EVIĆ DUŠAN TRBOJEVIĆ Grafički urednici Ž ELJKO PRODANOVIĆ
ŽELJKA SAMBOLEK
Omot opremio
F E D O R LIČINA Lektor
MIROSLAV MALEZ
CIP - Katalogizacija
u
publikaciji
Nacionalna i sveučilišna biblioteka, Zagreb UDK 519.682 C ( 035 )
VULIN, Rajko Od sada programiramo II C-u: Turbo e
Vulin. - Zagreb: Školska knjiga, 1991. str. : ilustr. ; 24 cm. Kazalo.
ISBN 86-o3-00465-X
910725051
Slog i prijelom na r aču nal u
T & S - Zag re b
Tisak: "AUGUST ŠENOA"
-
Zagreb
-
/
Rajko
VIII, 336
Rajko
Vulin
OD SADA PROGRAMIRAMO U C-u Turbo C
ŠKOLSKA KNJIGA ZAGREB 1991
Predgovor
Knjiga Od sada }ll'ogramiramo II C-u nastala je \I težnji da se nadoknadi stalni ne dostata k knj i ga (na našem jezik u ) iz p o d r u čja programiranja i p r og ramsk ih jez i ka . K nji ga je konri p iran a tako da čitaora postupno uvodi u programsk i j ezik C. Kao p odl oga za učenje iskorišten je TURBO e Ver. 2.0. T U RB O C je inte gri ra n i pa ket ko j i sadrži p o t. punu i m plementa ci ju ANSI e s t. a nda rd a , omoguć uj e urectivanje, pre vo (le nj e i iz vrš a vanj e p r og rama II jedinstvenom radnom okruženju, što je vrlo p ogo dno u fazi u če nja . K nj i ga se sastoji od jed a n aes t p ogla v lja i jednog do d at ka. Na p o četk u s va ko g p ogla v lj a nalazi se u v o d, II koj emu je ukratko iznesena p rob l em atika poglavlja koje slijedi. Prvo
i p os ljednje p oglav lje , te
dod ata k odnose se na
p r ogra msk i p aket TURBO
C. Prema tome, ako čitalac ne upotreblj ava TURBO C nego neku drugu implemen tariju C-a, ta poglavlja može p reskoč iti . Drugo pog l a v lj e sadrži osnove e-a. Cilj tog p o gla vlj a je u p oz nava nje osnovnih jezika, počevši od gracte programa, deklaracije vari j abli , defi n ic.i je fu n krij a, p oziva fu n kr ija , pr i jenosa parametara, sintakse osnovnih naredbi i sl. U njemu se ne ulazi u p oje d i n osti pojedinih p ro b l ema , nego se nastoji u suženom opsegu prikazati moguć nost p rogr am skog j ez ika C, te ukazati na osnovne p roblem e koji će se z aseb n o obra(livati u narednim p oglav ljima. karakteristika
U os t a lim poglavljima (od tre ć ega do jedanaestoga) mnogo se detal jn ije ras p ra v lja o mogu ćnostima p rog r ams kog jezika C. U svim p ogl av ljima izraelena je nekolicina primje ra koji p otk re p lju ju opisanu problematiku. Primjeri su odabrani tako da se već i njih ovo m analizom može shvatiti bit p rob lema . U p o glav ljim a koja ob r a (luj u složeniju problematiku, na primj e r p ok azi v a či , složeniji tipovi po dataka i sl., postoje potpoglavlja koj a dodatno obra(luju najčešće grei;ke te uzroke i p os lj e d ice n asta n ka g re šaka.
Knjiga Od sada }ll'ogramil'amo u C-u n a m i j e n jena je i poslužit ć.e sv ima koji žele ste ći solidno z nan je o m ogućnostima p ro g ram s k og jezika C, odnosno pro gr amskog p a keta TURBO e Ver. 2.0. U knjizi se nast.ojalo u mjest o udomaćeni h eng lesk i h iskoristit.i što više naših odgovaraj u ćih riječi. Većini čit.alaca, k o j i se služe u gla v nom stranom literaturom, to će p oma lo i smetati. Me(lutim, ovim se na n eki način želi p otak nuti s t va ranj e standardnog informatič.kog rj e č ni ka . U prilog ovome
m ože se navesti primjer koje se do
prije
N adam
se
da je ovo prvo
rije
či računalo, koja se uveliko upotrebljava, a
nekoliko godina upotrebljavala isključivo
riječ
umjesto
kompjutor.
će knjiga naići na dobar prijem kod učenika i studenata. Buclllć.i izdanje, svi prijed lozi i sugest.ije II cilju daljnjeg poboljšanja knjige
da
dobro su došli. Zahvaljujem svima koji su mi pomogli
u
stvaranju ove knjige.
hvaljujem kolegama koji su mi svojim sugestijama ukloniti nejasnoće
u
tekstu te poduzeću
nesebično ustupilo računarsku opremu.
Zagreb,
u
srpnju
1991.
u
Posebno za
fazi pisanja knjige pomogli
Mraz Elcktronik
iz
Zagreba, koje mi je
Autor
Sadržaj
Uvod, 1.
1.1.
1 . 2. 1.3. 1.4.
1.5.
3.
1
OPERATORI I IZRAZI, 51
OSN OVNE KAR AKTERISTIKE TURBO C-a, 5
3.1.
Sadržaj programskog paketa TURBO e, 6 Instalacija, 6 Pokretanje TURBO e-a, 8 Osnovni izbor, 9 Prozor za urec1ivanje programa,
3.2.
15 1.6. 1.7.
1.8. 1.9. 1.10.
2.
Prozor za ispis poruka, Mogućnost korištenja dvostrukog zaslona, 16 Pomoć (Help), 16 Vruće tipke (Hot ke y s), l! rec1ivač teksta (TURBO e EDITOR),
15
2.6.
2.9.
Argumenti
funkcij e
-
- Call by Value, 43 2.10. 2.11. 2.12.
Polja, 44 Globalne varijable, Sažetak, 49
3.6.
KONTROLA TOKA PROGRAMA, 75
4.1.
Naredbe i blokovi naredbi, 76 Jednost.ruka uvjetna grananja, 76 Višestruka uvjetna grananja, 78 Naredba switeh-ease, 81 Programske petlje , 86 Naredba break, 94 Naretlba continue, 95 Naredba goto, 96
4.2.
4.3. 4.4. 4.5.
32
4.6. 4.7. 4.8 . 5.
5.1. 5.2. 5.:3. 5.4. 5.5.
5.6. 5.7.
47
logičk i operatori, 65 Operator pridruživanja vrijednosti i izrazi, 68 Pretvorba tipova podataka, 69 Najčešće greške, 72
4.
19
Funkcije, 41
2.5.
64 Relacijski i
:3.5.
17
2.8.
2 . 3.
2.4.
3.8.
3.4.
3.10.
2.7.
2.2.
3.7.
3.3.
3.9.
OSN OVE PROGRAMSKOG JEZIKA C, 29
Identifikatori, 52
Ključne ri j eči, 52 Osnovni tipovi podataka, 54 Deklaracija varijabli, 57 Konstante, 59 Aritmetički operatori, 63 Operatori inkrement i dekrement,
3.11.
Kako početi, 30 Struktura e programa, 31 Analiza TUR B O e programa, Prevo'(1enje i izvršavanje . TURBO e programa, 35 Pronalaženje i ispravljanje grešaka, 37 Programska petlja for, 39 Simboličke konstante, 40
2.1.
OSN OVNI TIPOVI P ODATAKA,
5.8. 5.9.
99 Poziv funkcije u e-u, 100 Defi ni c ija funkcije, 100 Na re db a return, 103 Tipovi funkcija, 105 A rgume nt i funkcije, 106 Lokalne varijable, 111 Memorijske klase, 112 FUNKCIJE,
Rekurzija, 122 Prototip funkcije, 128
5.lD. 5.11.
Preprocesorske naredbe, 130 Ostale preprocesorske naredbe,
9.2.
sizeof operator, 255
9. 3.
135
9.4.
Uvjetni? operator, Zarez operator, 257 Pregled i prioritet operatora e-a, 258
9. 5.
6.
POLJA, 137
6.1.
6.5.
Jednodimenzionalno p olje, 138 Niz znakova, 141 Višedimenzionalno polje, 142 Polje niza znakova, 144 Inicijalizacija polja, 146
7.
POKAZIVAČI, 149
7.1.
Pojam pokazivača, 150 Deklaracija i inicijalizacija pokazivača, 151 Pokazivači kao argumenti fu n kci ja , 155 Aritmetika pokazivača, 156 Polja i pokazivači, 159 Pokazivači i niz znakova, 164 Polja pokazivača, 166 Pokazivači na pokazivače, 171 Problemi s pokazivačima, 172 Pokazivač tipa void, 175 Pokazivači i funk c ij e, 176 Pokazivači na fun k cije , 177 Argumenti fun kcije main O, 182
6.2. 6.3. 6.4.
7.2. 7.3. 7 .4. 7.5. 7.6. 7.7. 7.8. 7.9. 7.10. 7.11. 7.12. 7.13. 8.
8.1. 8.2.
8.4.
SLOŽENI JI TI POVI PODATAKA, 187
Struk ture, 188
Dinamičke strukture podataka,
8.5. 8.6. 8.7.
9.
9.1.
Polja bitova, 234 Unije, 237 Enumerirani tipovi podataka, Definiranje vlastitih tipova podataka, 241 Pretvaranje tipova podataka (casting), 242
239
DODATNI SKUP OPERAT ORA, 249
Operatori orijentirani na rad s bitovima, 250
ULAZ I IZLAZ, 259
10.1. Pristup standardnoj
ulazno/izlaznoj biblioteci,
10. 2. Meclusp remnički sistem
260
datoteka, 260
216 8.3.
10.
256
TC i pritisnuti tipku ENTER. Nakon t og a će se na zaslonu p ojavi ti tzv. osn ovni zaslon
(main menu screen), slika
File
Edit
Run
Comp ile
1 .2.
Project
Options
Debug
Break/watch
�-------= Edit -----��----=---� Line 1
Col 1
Insert Indent Tab Fill Un indent * C:IOIAME.C
1------ Message -------1
Ft-Help
FS-Zoom
F6-Switch
Slika 1.2.
F7-Trace
F8 -St ep
F9-Make
FtO-Menu
Osnovni zaslon (main menu screen)
Osnov ni zaslon sas toji se od četiri dijela: osnovni izbor prozor za urectivanje teksta i st atus linija prozor za poruke prevodioca
lUK
1.4.
Osnovni izbor
- kratki pregled zn ačenja vrućih t i p k i
9
(hot keys).
Opcije osnovnog izbora aktiviraju se istovremenim pri t iskom n a tipku ALT i t i p ku p očetnog slova osnovnog izbora. Veličina prozora za ure(tivanje teksta i prozora z a poruke prevodioca mijenja se pritiskom n a funkcijsku tipk u F5. Za izl az iz objedinjenog radnog okruženja po t rebno je i s t ov r em e n o pri t i snu ti tipku ALT i t ipk u X (ALT-X).
1.4. Osnovni izbor
Osnovni zaslon koji se pojav i n akon p okretanj a TURBO e-a je potvrda da se n alazimo u obje dinj enom radnom okruženju. U tom okru ženju prak tički nema potrebe za funkcijama operati vn og sistema. Naime, sve što je n eophodno za pisanje, prevo(tenje, izvođenje i ispravke programa dostupno je iz samog okruženja. (�ak i ka da je potrebno izvršiti funkcije koje su dos tupn e j('dino iz op e ra t i v nog sist em a, n a pr i mje r formatiranje diskete ili sL, nije potrebno napu štati radno ok ruženj e . Dovoljno je pozvati komandni pro ce s o r , i zvrši t i želj enu akc ij u i nakon toga se, n aredbom exit, ponovno vratiti u rad n o okruženje. Odabir pojedinih akcija osn ovnog izbora može se učiniti na d va nači na. Prvi se sastoji od aktiviranj a osnovnog izhora funkcijskom tipkom FlO, a zatim se s t reli c ama lijevo - desilo lzabere željena opcija. Drugi način dobi vanja željene opcije je da se istovremeno pritisnu t ipka ALT i tipka prvog slova opcije izbora. Na primjer, istovremenim pritiskom na tipku ALT i tipku E, pok reće se program �a ure(ti vanj e teksta (EDITOR). Značenja po jedinih opcija osnovnog izb ora d an a su u tablici Ll. U n as t av k u će se u kratkim cr t am a opisati sve o pcije osnovnog i do datnih izbora. Budući je praksa pokaz al a da se svi dovoljno brzo u p ozn aju sa m ogu ćnostima i funkcijam a pojedinih izb ora, neće s e posvećivati mnogo prostora d a bi se objasni1e s ve m ogu ćnosti pojedinih izb ora.
Postavljanje optimalnog o kru že nj a, prema veliči ni i za1ltjevu programa, opisano je II dodatku A. Promje n a radnog okruženja, posebno dijelova koji se odnose na memorijs ke modele i sl. preporuča se sam o poznavaocima značenja pojed ini h opcija, odnosno poznavaocima paketa TURBO C. Za p očet ak je sasvim dovoljno stand ardno radno okru ženje.
10
Osnovne karakteristike TURBO G- a
Izbor
Značenje
File
Učitavanje i pohranjivanje datoteka, rukovanje direktoriji m a, pozivanje komandnog procesora i izl azak iz TURBO Cokruženja
Edit
Pozivanje programa za uređivanje programa (TURBO CEDITOR)
Run
P revo(tenje i izvršavanje program a iz radnog okru ženja Prevođenje programa koji se n alazi.u radnom okru ženju
Compile Project
Aktiviranje i . deaktiviranje programa čiji se izvorni kod n alazi u više datoteka
Make
Stvaranje izvršne verzije programa čiji je izvorni kod u više datoteka opCIJa
prevodioca
i
Options
Postavljanje različitih povezivača (LINK ER)
Dehug
Postavljenje različitih opcija program a za pronalaženje i ispravljenje grešaka (DEBUGER)
Break/Watch
Postavljenje prekidnih izvršavanja programa
točaka
u
procesu
Tablica 1.1. Pregled i značenje opcija osnovnog izbora
File Izhorom opcije File otvara se prozor s dodatnim izborom za rad s da totekama i direktorijima, slika 1.3. Pojedine opcije, kao i II svim ostalim dodatnim izborima, biraju se korištenjem strelica gore - dolje. Opcija Load omoguć.uje u č.itavanje datoteka. Pretpostavlja se u čitavanje datoteka koje imaju dodatak (exten.'1ion) .C. Međutim , navo(tenjem punog pu t a (path) i imena datoteke može se učitati sadržaj bilo koje datoteke iz bilo kojeg di rektorija. Opcija Pick prikazuje listu od osam zadnje u čitavanih d atoteka. Izbor, odnosno u č. i tavanje datoteke obavlja se pomicanjem inverzno osvijet ljene linije i pritiskom n a tipku ENTER Izborom opcije New počinje se :
LI. Osnovni izbor File
11 Run
Edit
Compile
Pro j ect
Load Pick
. · F3 Alt-F3
Col l
Options
Debug
Break/watch
Edit -------....., Insert Indent Tab
Fill
Unindent * D: I DlAKE . C
lew Save
F3
Write to Directory Change
dir
Quit
Alt-X
OS shell
1----Fl-Help
FS-Zoom
F6-Switch
Message
F7-Trace
-------j
FS-Step
F9-Make
FlO-Menu
IUM
Slika 1.3. Dodatni izbor osnovnog izbora File
stvarati nova (l atoteka. Opcij o m Save se trenutni s adr žaj datoteke pohra njuj e u t eku ći direktorij, odnosno di sk . Opcija Write to om ogu ćuj e pohra nj ivanje trenutnog sadržaja u čitane datoteke pod nekim drugim imenom. Directory prikazuje sadržaj - t ek u ćeg direktorija. Change dir mij enj a t ek u ći direk t or ij . Op cij a OS s hell pokreće DOS-ov komandni procesor. Pokretan j em kom an d n og procesora mogu se izvršiti sve funkcije DOS ope rati vnog s i stem a . Prillljetit� d a se izb orom ove funkcije i d alj e nalazite u TURBO e o kru ž enj u . Naredba EXIT vraća stanje kakvo je hilo prije p ozi va komandnog p ro ces o r a . I na kr aj u , op cij a Quit predst avlja izlaz odnosno kraj rad a sa TURBO e-om . Najčešće korištenim opcij ama dod atnih i zb or a prid ruž ene su funkcijske tipke. Na pr i m je r , p r i tis k om na funkcij sku tipk u F2, u bilo kojem t renutku
u re (ti vanja programa, i z vrš ava se o pcij a Save, dok je za pokret anje ko m and n og procesora n eo ph odno prvo pozvati izbor File, a zatim izahrati opc ij u OS shell. Pritiskom na tipku izbor.
ESC,
II
bil o k oj em trenu tku, vraća se u osnovni
12
Osnovne karakteristike TURBO G-a
Run
i Compile
Odabiranjem opcij e Run osnovnog izbora po k reće se prevođenje, povezi se trenutno ure
Al t-F
Aktivira izbor < File>
Alt-O
Aktivira izbor < Options >
Alt- P
Aktivira izbor < Project >
Alt- R
Aktivira izbor < Run >
Alt-X
Izlaz iz TURBO C okruženja
Ctrl- F 1 Ctrl- F2
Uklju čuje pomoć (značka mora biti postavljena na ključnu riječ) - vrijedi samo za ure(uvač teksta Prekid izvršavanja programa - korak po korak način izvršavanja programa ( trace mode)
Ctrl- F:l
Prikaz stanja stoga (stack)
Ctr1-F4
Promjena vrijednosti zadane varijable ili člana polja (vrijedi za izvršavanje programa u modu korak po korak)
Ctrl- F7
Dodavanje nove varijable za praćenje promjene vrijednosti
Ctrl- F8
Postavljanje/uklanjanje prekidne točke
Ctl'l- F9
Stvaranje izvršne verzije i izvođenje programa iz T U RBO C okru ženja
Tablic.a 1 .2. Pregled
j
značenje vrućih tipki TURBO C-a
1. 10. Ureilivač teksta
(TURBO e EDITOR)
1 . 1 0 . Uređivač teksta
19
(TURBO
e
EDITOR)
Tu rbo e u r E'Ct i va č. t ek s t a pr i 1 ago (ten je p i s anj u s t r u k t u r i r an ih p ro gr am a . U ređi vač. radi au tom atsko u vlačenje teksta (auto-indentation) . To z n a č i d a
ć e s e n akon p ri t iska n a t i pk u E N T E R ( nova lin ij a ) zn a č ka pos t av i t i n a i s t u
kolon u n a
kojoj
p o č i nj e tekst p r e t h od n o g
u v l a če n j a d obije se tekst kao u
slj ede ćem
reda. Korištenjem
au to m a ts ko g
p rimjeru
Ovo j e p r imj er
< Poz ic i j a značke nakon prvog prit i ska na t ipku Pozic i j a zna�ke nakon drugog p r it i ska na t ipku < BackSpac e >
N aredbe z a b ri s anj e t e k st a ,
u č i t avanj e i pohranji vanje blokova
u č i t a van j e i poh ranj i vanj e d a t ot e ka i sl . pot p u n o su j e d n ake
tekst a ,
naredbam a ko j e
koristi tekst p ro cesor Wo rd star ili u služni p rogram S i cleKick . Prem a tome,
ako s t e u p oz n a t i s n ared ham a i mogućnos t i m a n avede n o g t eks t pro ces o r a ili u s l u ž n og program a sloh o d n o možete preskočiti ovaj dio p ogl av lj a . Ako II bilo kom t ren u t ku
ni s t e
s i g ur n i II stečeno zn anj e pri t i s kom n a
e u r e (ii vač. t eks ta možete veom a b r z o nau či t i i koriš tenjem pomoći . Zbog toga u ovom pogl avlj u nije n ačinjen d e t alj an opis svih mogućnosti T U RB O e uređivača teksta. tipku F l p oz ov i t e p om o ć . D akle, T U RB O
jed n os t av n o i
1 . 1 0 . 1 . Unos , izmj ena
i p ohranj ivanj e t e ks t a
Po k r e t an j em T U R B O e-a au t o m a ts ki se ak t i v i r a o s n o v n i i z b o r . Prij e n ego počnemo unos ili i zmjenu teksta pot re h n o j e aktivirati ure(ii vač tek s t a . Urc(iivač t eks t a može se ak ti v ir a t i na dva n ačina. P rvim se n ačinom u i zb o r u File od abere op cij a New. Drugi n a č i n jest d a se izahere op cij a osnov n og izbora Edit . U klju čivanjem ure D irectories . O d abi r anj e m opcije Run n a z as l on u računala ć e se p oj av i ti isto š t o i n a slici 2 . 1 .
Izhorom Run ili Ctrl-F9, pr o gr am koji s e n alazi
u ure(tivaču teksta, Spomenuta o p cij a objedinjava d va p o s t u p k a , prevo(tenje p rog r am a u relokat i hiln i oblik ( . O B J d a t o t eka ) i povez i vanje program a s a stan d ardnim bibliotekam a fun k c ij a ( linking). Pro g r am se izvršava u objedinjenom r a d n o m okr u ž enj u . Rezul t at i i z v r š avan j a program a m ogu se v i d je t i i z b orom op cije Run ( User s creen ) ili p ri t i s k o m
p r e v o di se i st vara nj eg o va izvršn a ver z ij a .
36
Osnove programskog jezika e
File
Run
Edit
L ine
Co�ile
Pro j e ct
gr8.ll r� ��t
· a.un
1
Pro
ctH'-'rn
Ctrl:"ri
b F ill Unindent
Break/watch D : IOUME . C
F3
S t ep over
FS
Us e r screen
ilt - FS
1-----
FS-Zoom
Debug
F4
Go to cursor
Trace into
Fl -Belp
Opt ions
F6- S w i t ch
Iles s age
F7-Trace
--------j
FS-St ep
F9-lIake
F10-Kenu
lUK
Slika 2. 1 . Dodatni izbor opcije RUll
na tipke z asl on .
Alt-F5
č.ime se aktivira za,,;lon za prikaz re zu ltata -
tzv . korisni čki
Iz v ršavanj e programa u modu korak po korak dobije se izborom jed n e od op cija: Go t o c ursor Trace into Step over
ili pritiskom na funkcijsku tipku
ili pritiskom ili
i veom a je korisno
II
na
funkcijsku tipku
F4
F7
FB.
fazi ispitivanja programa.
Ako tokom unosa program a nije u či njena pogreška, od abiranje opcije bi sljedećim d ijal ogom :
Run, rezul tiralo
Kako s e zoves ? Ivo Kol iko imas god ina ? 17
Ti s e zoves Ivo i imas
17
godina
37
Pronalaženje i ispravljanje grešaka
2. 5.
2.5.
P ronalaženj e i ispravlj anj e grešaka
Greške koje n astanu u fazi kodiranja program a m ogu se podijeli t i u dvije grupe: sin t aksne greške logi čke greške. Sintaksne greške n astaj u u toku p revođenj a program a. T U RB O e će n astale greške označit i i por u ku o grešci upisati u prozor z a p oruke ( Message Window ) . Detaljnije objašnjenje n astale greške dobije se pozicioniranjem n a n astal u grešk u i pri t iskom n a t ipku Fl ( HELP ) . Pogl edajmo prethodni primjer. U programu ćemo n ačinit i nekoliko grešaka. Na pri mj er , izost avit ćemo oznaku kraja program a } i ozn aku kraj a n aredbe j. P revođenjem program a u prozoru za ispis poruka pojavit će se tekst kao na slici 2.2. File
Edit
Run
Comp ile
Proj ect
Opt ions
Debug
Break/&atch
r------ Edit --------,
L ine
12
Col 66
Ins e rt Indent Tab F ill Unindent
D : IOIAKE . C
/ . program z a anal izu . / ma in O
{
char
iJ i· _-----
int
g�
pr intf ( "'E
Compiling --___...,.
Main file :
IOIAKE . C
Compiling :
EDITOR
IOIAKE . C
s c anf ( "Xs ' pr intf ( " 'l
T o t al
File
Warnings :
O
Errors :
2
O
s c anf ( " Xd'
L ines compiled :
pr intf ( " '�
i
Availab e aemory :
f-----
F 5 - Z o oa
F6 -S&it ch
14
odina)
2
1 261 Press any ke y
Errors
Fl - H elp
14
Message
F7-Trac e
-------l
F8- Step
F9-Make
FlO-Menu
lUK
Slika 2 . 2 . Poruke o greškama n akon prevođenj a programa Inverzno o svijetljen a li nija u kodu program a i u prozoru za p oruke označavaju nas t alu grešku , kao n a slici 2.3.
38
Osn ove progra mskog jezika e
F ile
Edit
aun
Comp il e
Pro j ect
Opt ions
Debug
Break/watch
,----- Edit --------� Line t 3 Col t In s er t Indent Tab Fill U n indent * D : I OIAME . C chu ime [30] ; godina ; int pr intf C " \n Kako se zoves " ) ; s c anf C "� s " , ime ) ; print f ( " \n Koliko imas godina" ) ; s c anf C "�d" , &:godina) ; printf C " \n t i se z oves Xs i imas �d godina" , ime , god ina)
I-------�Compiling D : \TC\IOIAKE . C :
Error D : \ TC\IOIAME : C 1 3 : Error D : \ TC\IOIAME . C 14 : Fl -Help
Slika
FS-Zo om
Stat ament
Message =�-------�-....,
missing T in fill\C1;��i{ .ain . . ng } in fwlct i on. ,;aiD.
Compound s t at emen.t miss i
F6- Switch
F7-Trace
2 . 3 . P r i kaz grešaka koj e
FS-St ep
F9-Kake
F t O-Menu
.
.. ...
lUK
nastanu tokom prevo đenj a programa
Treba razlikovati greške koje upozoravaju na nekorektnosti u programu , ali dopu š t aj u s tvar anj e izvršne verzije program a i izvršavanje program a - upo zorenja (Warnings) i greške preko kojih prevodilac ne može prijeći - greške ( Errors ) . A ko nismo sigurni u značenje p ojedine greške možemo zatražiti p om oć. Pomoć ( fu n k c ij s ka tipka F l ) ć e dati detaljnije objašnjenje n astale greške. N a p r i mj e r , nije n am j as n a poruka o grešci koj a je nastal a izost av ljanjem ozn ake kraja naredbe j. Pozi cioniranjem i n verzno o s vij e tlj en e linije na n as t alu grešku i pritiskom n a tipku F l na zaslonu će se pojaviti isto š t o i n a slici 2 . 4 . Postupak
i ispravljanja logi č.k i h grešaka u programu je obaviti sam p rogr am er . Veliku pomoć. I I ispravljanju i p ron ala ž enj u takvih grešaka pru ža mogu ćnost izvršavanja programa korak po korak , kao i m ogu ćn os t pr a ćenj a p romjen e vrij e dn os ti p ojedinih varijabli i članova polj a. Postavljanje prekidnih točaka ( breakpoint.'l) u p ro gr am u je korisno 11 velikim programima, gdje je većina kod a ispi tan a i ne želi se kroz neki dio koda prolaziti korak po korak . Postavljanje prekidnih točaka, izbor varijabli ili članova polja koji se žele p ratit i tokom izvršavanja programa, promjena v r ijedn os t i odrecten e varij able ili člana p olja obavlja se izborom opcija Debug i B reak/watch osnov n og izbora. pron al aženj a
p osao koj i m ora
39
2. 6. Programska petlja for File
Edit
Run
Co.pil e
Proj ect
Opt ions
Debng
Break/watch
Edit
Line 13
;
Insert Indent r ab Fill Un indent * D : IOIAME . C
god ina ;
int
i
Co I l
ime [30]
char
,------ Help --------..,
pr n s c an
S t a t eaent m i s s ing ;
p r in scanj
p r int
Th e co.piler
encount ered
an expression
s t at ..ent without a s e.icolon foll o w ing it .
i
C omp l in g D : Error D : \rC \(.'------I
Error D : \rC\IOIAKE . C F t - Help inde x
14 :
tl��-Pick
Compound s t a t ement miss ing } in �unct i on main t op i c
" s c anf ( " Yod " , to cj ena [i] ) ; }
iH) ;
zbroj _ocj ena = O ; ukupno_ocj ena = O ; tor ( i = O ; i < 5 ; i ++ ) { zbroj _ocj ena += ( i+ l ) * ocj ena [ i] ; ukupno_ocj ena += ocj ena [i] ; } printt ( "\n Prosj ek ocj ena j e Yod" , zbro j _ocj ena/ukupno_ocj ena) ;
} Indeksi polja u e-u kreću od O . Prema tome, prvi č.1an polja ima, indeks O , a n e i n d eks 1 , što zn ači d a je u prethodn om primjeru prvi član ' ' polja ocjena[O] , a n e ocjena[1] . Budući d a je t akav n ačin indeksi ranja polja različit od i n d eksi ranja polja u m atematici ili u drugim programskim ' jezici m a, pristup pogrešnom članu polja jedna je od n ajčešćih grešaka koje se j avljaj u u početku korištenja programskog jezika C. Greške koje nastanu pogrešnim in d eksi ranjem polja mora otkriti sam programer. Programski · jez i k e ne p1'otljemtla p7'ekoračenje indeksa polja. Š to bi se desilo d a smo u . prethod nom primjeru n apisali programsku petlju koja ide od O do 6? Tad a bi u posljed njem prolazu kroz petlju dohili izraz
zbroj _ o cj ena += ( 5+ 1 )
*
ocj ena [5] ;
Cjelobrojn o p olje ocj ena deklarirano je kao polje od pet članova i u memo riji računala će se zapisati vrijednosti pet č.1 anova polja. Kako se u izrazu pojavljuje i n d eks šestog čl an a polj a, prethodnom zbroju će se dodati sadržaj mem orije n a koji pokazuje šesti čl an polja, Budući da se radi o cjelobrojnolll polju , koje za prikaz jednog čl ana zahtijeva dva bajta, sadržaj n aredna d va baj t a u m emorij i će se uzeti kao vrijed nost šestog član a polja. Prema tome, program će redovn o d avati pogrešan rezultat . Indeksi p olja mogu biti i ari tmetički izrazi, uz uvjet , da je tip rezultata izraza cjelobrojni ( intege7').
Osn ove programskog jezika e
46
Vj e r ojatno jed an od n ajvi š e upotrehljavanih tipova polja u e-u jest polje znakova. P olje zn akova og r ani čen o s p e c ij al n i m N U L L znakom \0 ( null char actcT') naziva se niz znakova ( stT·ing). Zhog toga u dekl ara ciji polj a znakova, polje mora b i t i z a je
>= ! =
&& N aj n i Ži
II
1 ; k-- ) { blok naredbi ; } } niz naredbi ; } =
4.5.2.
Programska p etlja while
Opći oblik programske p et lj e while gl asi: while (uvjet) blok naredbi;
naredbi ima isto zn ačenje kao kod for petlje, što znači d a se ( i ) , j e d n e n aredbe ili hloka n aredbi. U vj et može biti varijahla, ari tmeti čki ili logi čki izraz . B lok naredbi u p e t lj i se pon av lj a s ve dok je uvjet istinit (true), odnosno različit od nule. Kad u vjet postan e lažan (false) , odnosno jednak nuli , program se g rana na prvu n aredbu izvan p etlj e . U vjet ponavljanja petlje ispituje se n a početku petlje. Samim t i lli b lok naredbi ne mora nužno biti izvršen ni j e d n o m . Bu v o id main ( v o i d ) { bufier [255] , ch , char FILE *f p ; int ii if « fp=f open( " t e st . dat" , "r " » == NULL) { prinU ( "\n Greska ot varanj a datot ek e exit ( O ) ;
}
t es t . dat " ) ;
4. 7. Naredba
}
95
cOlltillue
ch = g e t e (fp) ; whi l e ( eh 1 - EOF) 1* e itaj do kraj a dat ot ek e * 1 { i = O; 1 * pro e it aj j edan red dat ot ek e *1 for ( ; ; ) { if ( eh = = ' \n ' ) 1* kraj reda ? *1 { buffer [i] = ' \0 ' ; printf ( " \n %s " . but t er ) ; 1 * ispis * 1 1* novi red *1 break ; } buf f er [i++] = eh ; eh = get e (fp) j 1 * sl j ed e e i znak * 1 } 1 * naredba koj a s e izvrs ava nakon naredbe break * 1 e h = get e (fp) j 1* pro e itaj znak iz slj ede e eg reda * 1 }
4 . 7 . Naredba cont inue N ared b a continue je po n ačinu djelovanja sli čna n aredbi b reak. Kao i n ared ba b re a k , naredha continue prouzrokuj e preskakanj e dij ela bloka
n aredbi u n u tar petlje. Međutim� izvršavanj em n ar e dbe break program se
gran a n a prvu n ar ed h u izvan
petlje,
dok se iz vršavan j em n aredbe
n as t avl j a s izvršavanj em sljed eće i terac ij e
continue
petlje.
1* pr ikaz nacina dj elovanj a naredbe
cOlltillue *1
v o id main ( v o id ) { int x •·
}
for ( i = O ; i < 20 ; i++) { if ( x % 2) cont inue ; 1* nast avak , neparan bro j *1 1* ispis parnog bro j a * 1 printf (" %d " , x ) ; }
Konlrola t oka programa
96
Svaki put kad program generira n eparan broj , uvjet u n aredbi if je istinit i izvršava se n ared ba continue. N aredba continue prouzrokuje pres kakanje funkcije printf O i izvršavanje sljedeće iter a c ij e . U p rog ram s k i m pet ljama while i do-while, izvršavanjem n aredbe con tinue p rog r am se g r ana n a i sp i t i vanje uvjetnog izraza. Kod for pet lje prvo se izvršava i zraz ko ji mijenj a kon trolnu varijabl u petlje (izraz 3 ) , a poto111 se ispi tuje uvjetni i zraz ( izraz2). U llgnjei 100) printf ( tl Y.d tI,x); goto ponovi; van: printf (tI\n Kraj i spisa
tl
);
}
Ovo je samo jedan od niza primjera kako se jednostavan program može
zakomplicirati. Isti program pi san kori š tenjem
for
petlje glasi:
1* prethodni program napisan koristenj em *1 programske petlje for *1 1* main ( )
{ int
Xi
for (x = 1; x , kao
pdatum->dan
Prema tome, n aredba
printf
("\n Dan
=
Yed", (*pdatum).dan)i
ekvivalentna je naredbi
printf
("\n Dan
=
Yed" pdatum->dan);
Pristu p član o v i m a stru kturne varijable pomoću operatora - > je p og odn iji i mnogo se češ će koristi. Osim tog a, adresa pojedin og čJan a strukturne varija ble može se dobiti isključivo korišt enjem tog operatora. Na p ri mjer , adresa člana strukturne varijable na ko ju p okaz uj e pdatum je
Treba imati n a umu da izvršavanjem naredbe
pdatum++i
p o kaz ivač ne pokazuje na n ared ni član strukturne varijable, nego na strukturne v arijah le u memoriji.
ni z apis
nared
Pokazivači na strukture n aj češć e se koriste za prijeno s strukturnih va. ri jabli u funkciju i za s tvaran je dinamič.kih struktura p odataka . Naredna p ogla.vlja o h ra.(1 u ju ovu problematiku.
202
Složeniji tipovi podataka
8.1.6. Strukturne varijable i funkcije Strukturne vari ja b l e mogll se
prijenosom pojedinih
prenijeti
u funk ciju na tri načina:
članova strukturne v arijable
prijenosom kompletne strukturne varijable
p r ijen oso m pokazivača na strukturnu varijablu.
Svaki od prij e nos a
ima odrectene p redn os ti odnosno nedostatke .
Kod prva dva načina prijcnosa prenose se
.
vrijednosti članova.strukturne
Karakteristika tak vog na či n a
prijenosa je s t da vrijednosti čl an ova strukturne varijable, unutar poz vane fun krije, lldan = 1; novi_datum->mjesec = 5; novi_datum->godina 1964; } =
Rezultat izvršavanja progra m a je: 30. 4. 1964. 1. S. 1964.
Podaci prij e korekcije korekc ij e
Podaci po s lij e
Prijenos pokazivača na st rukt ur nu varijablu (prijenos strukturne varijable preko adrese) po go dan je iz dva razloga. Prv i, prijenos p okazivača j e mnogo brži od prijenosa vrijednosti strukture. N ai me, kod p rijen osa pokazivača, preko stoga se prenosi samo adl'csa strukturne varijable, dok se kod prijenosa vrijednosti prenose vrijednosti st,ih članova . Ako uzmemo u obzir da se
struktuma varijabla može sastojati od nekoliko desetaka članova p ovećanje efikasnosti je očito. Drugi razlog zbog kojeg se preferira prijenos pokazivača na strukturn u varij ablu je mogućnost promjene vrijednosti članova struk turne varijable unutar pozvane funkcije, kojom će se automatski promijeniti vrijednosti članova strukturne varijable u nadre(le n oj funkciji. Adresa 'strukturne varija bl e
II
memoriji dobiva se kao kod ostalih tipova
p o d ataka korištenjem adresnog operatora &l. Prema tome, kod prijenosa
strukturne varijable preko adrese i kad varijabla nije deklarirana kao pokazi t'(lČ na stl'uktU7'U, u pozivu funkdje ispred imena strukturne varijable mora stajati adresni op erator &l. Osim prijenosa strukturne var ij ab le u funkciju, funkcija se mo ž e defini rati t ako da vraća strukturu, odnosno da vraća pokazivač na struk turu odrc(lcnog tipa. Prije definicije funkc ij e mora se izvršiti deklaracija strukture. Deklaracija strukture mora biti izvan svih funkcija. Za prikaz funkcije koja vraća pokazivač na st r u k t uru preuredit ćemo prethodni prim jer U primjeru se koristi prethodna deklaracija strukture datum.
.
Složeniji tipovi podataka
206
1* definicija funkcije koja vraca pokazivac *1 1* na strukturu tipa datulll *1 struct datum *ucitaj_podatke () { static struct datum rodjendan; printf printf printf printf printf
("\n Unesi podatke o datumu rodjenja : : "); ("\n ==================================u ) ; : II); scanf ("%d".&:rodjendan.dan); ("\n Dan ) ; scanf ("%d".&:rodjendan.mjesec); (" Mjesec ) ; scanf ("%d".&:rodjendan.godina); (" Godina lt
lt
return (&:rodjendan);
} main () { 1* prototipi funkcja *1 void korekcija (struct datum *); struct datum *rodjendan; struct datum *ucitaj_podatke (void); 1* podaci o rodjendanu *1 rodjendan = ucitaj_podatke (); printf ("\n Podaci prije korekcije => %d. %d. %d.". rodjendan->dan, rodjendan->mjesec. rodjendan->godina); 1* poziv funkcije definirane u prethodnom primjeru *1 1* varijabla rodjendan deklarirana je kao *1 1* pokazivac i adresni operator &: nije potreban *1 korekcija (rodjendan);
printf ("\n
Podaci
poslije korekcije => %d. %d. %d.". rodjendan->dan. rodjendan->mjesec, rodjendan->godina);
} Rezultat
izvršavanja programa. je:
8.1. Strukture
207
Unesi podatke o datumu rodjenja :: ------------------------------------------------------------------Dan 30 4 Mjesec Godina 1964
Podaci pr1Je korekcije
=
>
Podaci poslije korekcije
=
30. 4. 1964. > 1. 5. 1964.
Pokazivač na s tr u k t u ru koji funkcija vraća naredbom
return
mora odgo
varati tipu definirane funkcije. To znači da se strukturna varijabla
u
funkciji
uci taj _podatkeO ,
rodj endan
mom deklarirati kao pokazivač na strukturu
tipa datum. Gornji primjer može se riješiti i na drugi naCln, funkcija koja vraća
struct datum
{
strukturu. Preure(teni
tako
da se definira
program glasi:
ucitaj_podatke C)
static struct
datum
rodjendan;
prinU (II\n Unesi podatke o datumu rodjenja : : "); print! (II\n ==================================" ) ; print! (II\n Dan : ); scan! ("%d". rodjendan.dan); II ) ; scanf ("%d". rodjendan.mjesec); print! (" Mjesec "
print! (" Godina
"); scanf ("%d". rodjendan.godina);
return (rodjendan);
} main ()
{
void
korekcija (struct datum *);
struct datum
rodjendan;
struct datum
ucitaj_podatke (void);
1* podaci o rOdjendanu *1 rodjendan
=
ucitaj_podatke ();
printf (II\n Podaci prije korekcije
=
> %d. %d. %d.".
rodjendan.dan. rodjendan.mjesec. rodjendan.godina);
208
Složeniji tipovi podataka
/* varijabla nije deklarirana kao po k az ivac */ */ /* adresni operator t neophodan
korekcija {trodjendan):
}
8.1.7.
printf ("\n Podaci poslije korekcije = > Y.d. Y.d. Y.d.", rodjendan . dan. rodjendan.mjesec, rodjendan.godina) i
Pokazivač kao član strukture
Budući da član strukt ure može biti hilo koji definirani ti p , nema razloga kao član strukture ne pojavi pokazivač. S pokazivačem kao čl anom strukture post u p a se potpuno isto kao i sa samostalnim p okaz iv a či ma . To znači da se pokazivaču prije korištenja mora pridružiti adresa.
da
se
Strukturu datum iz p r ethodnih primje ra deklarirat ć em o tako da su članovi strukture pokazivači na cjelobrojne vrijednosti: struct
datum
{ int
int int
*dan; *mjesec; *godina;
};
Budući da su varijahle d an, mjesec, godina čl anov i strukture, za pristu p pojedinoj varijahli Ulora se koristiti točka op e rat or . Funkcija za unos po dataka iz prethodnog primjera koja koristi deklariranu strukturu glasi: / * funkcija za unos podataka spredeklariranom /* strukturom datum
*/ */
unos_podataka O
{ struct datum rodjendan: int
d,
m.
g;
printf ("\n Unesi dan, mjesec i gOdinu rodjenja : : II); printf ("\n :;:;:;:;:;:;================================" ) ;
209
B.l. Strukture print! (lI\n Dan printf ("\n Mjesec printf ("\n Godina
If); scan! ("%d". td); II); scan! ( "% d ". tm); tl); scanf ("%d" , tg);
1* pridruzi adrese *1 rodjendan.dan = td; rodjendan.mjesec = tm; rOdjendan.godina = tg;
}
Naredbama rodjendan.dan = td; rodjendan.mjesec = tm; rodjendan.godina = tg;
članovima strukture pridružuju se adrese varijabli d, m, g.
Prikaz strukturne var ijable rodj endan u memoriji može se prikazati kao
rodjendan
dan mjesec godina - -
I
30
d
4
m
1964
g
Korištenjem unarnog op erator a * može se pristupiti sadržaju memorije na koj u p o kazuj u pokazivači unutar strukture. Izraz day
=
*(rodjendan.dan);
pridružuje varij abli day sadržaj s a d re se na koju pokazuje čJan strukturne varijable dan. Budući da točka op erator ima veći prioritet od * operatora zagrade sc mogu izostat1žti. Veoma je bitno razlučiti razliku između pokazivača kao člana s trukt ure i člana st7'ukturc na koju pokazuje pokazivač. Izrazom
210
Slože.niji tipovi podataka
(*rodjendan).dan
pristupa se članu strukturne varijahle
što
se
može prikazat i kao
n a koju pokazuje pokazivač rodjendan,
rodjendan . dan mjesec.
operator . ima veći priori tet od operatora *, zagrade neophodne. Ako se zagrade izostave i nap i š e izraz
Budući da
slučaju
su ovom
*rodjendan.dan
tada
vrijed nosti na koju pokazuje pokazivač *dan koji je član varijahle rodj endan, što se može prikazati kao
se pristupa
strli kturne
rodjendan
:;n
:
--��------------r---- - -e-s-e-c--
340_
__________
�
�
____
Adresa (,·.lana strukture na kOjH pokazuje pokazivač *rodjendan je adresa_elana
=
�rodjendan->dan;
dok je adresa na koju pokazuje član strukture rodj end an
211
8.1. Strukture 8.1.8. Samoreferentne strukture
Pod pojmom samoreJC1'cntna st7'uktura podrazumijevamo strukturu koj a sadrži član ili ('lanove koj i su pokazivači na strukture istog tipa kao deklari rana struktura, Samoreferentne strukture često se na zivaj u i rekurzivne strukture. Za razliku od var ij abli i polja za k oja se au t o m a t sk i zauzima m em o ri ja , samoreferentnI' strukture najčešće zahtijevaju posebne fu nk cije za zauzi m anje odnosno oslobadan, xl.s1jedeci->mjesec, xl.s1jedeci->godina);
1* treci element liste *1
printt ("\n Treci element liste: Y.d Y.d Y.d", xl.s1jedeci->sljedeci->dan, xl.
sIj edeci->sljedeci->mj esec ,
xl.s1jedeci->sljedeci->godina);
} Organizacija povezane liste iz danog primjera može se slikovito prikazati kao na slici 8.1. Bud lIć.i da postoji veza između elemenata liste, vrijednostima pojedinih članova elemenata može se pristupiti preko prethodnih elemenata liste. Tako se vrijednostima članova zadnjeg elemen ta II listi može pristupiti na više načina:
x2. dan
ili
8.1. Strukture x3.s1jedeci->dan x1.sljedeci->sljedeci->dan
dan
mjesec godina
30 4
215
ili
Xl
1 96 4
29 X3
dan
4
mjesec
1964
godi na 1
X2
5
1964 NULL
-h
Slika 8.1.
Izraz x3.sljedeci->dan;
z n ač i : P ro čit aj vrijednost č.lana strukture dan na koju pokaz uje pokazivač sIjedeci j"z p r et h odne strukture. Prema tome , rezultat izvršavanja navedeuog programa je: Prvi element liste Drugi element liste Treci element liste
30 4 1964 29 4 1964 1 5 1964
Za razliku o d polja, el e m e nti liste nisu i
memoriji sekvencijalno.
ne
moraju biti zapisani u
Veličina m e m orij e koju zauzima povezaua lista iz prethoduog primjera. o drectena je b roj em elemena.ta u listi. Buduć.i da su elementi liste statičke
216
Složeniji tipovi podataka
stru ktu re, m em orija se z auzi m a definicijom struk turnih varijabli. Broj ele me n at a u lis ti ograničen je b roje m definiranih strukturnih varijahli. Iz toga proi zl azi da se broj elemenata u listi mora o dre dit i u n a prijed . U slučaju da se za zapi s p o d ata ka ne iskoriste sve definirane varijabl e , dio memorije zau ze t d e fi nic ijo m strukturnih var ijabli ost aj e n eiskorišten . Da bi se izbjegl e takve situacije koriste se dinam ičke st rukt ure po d at aka. One omogućuju z auzi m anj e i oslobađanje m em orij skog prostora ovisno o b ro j u p o dat aka koji se zapisuju u memorij u . Dinamičke stru kture gl avlj u.
8.2.
Dinamičke
pod at aka
obra(tene su
det alj nij e
u n a redn o m po
strukture podataka
R asp ol oži v i me morij s ki prostor veoma je važan resurs, p ogo t ov o
u v i še sustav i ma . P rogrami koji o periraj u s velikim b roj em p o d ataka zauz imaj u m em ori ju i samim tim onemogu ćuj u p okre tanj e drugih pr ogram a i procesa. Di namički m zau zim anjem i oslohađanjem memorije d aj e se mogućnost efika.'inog iskorištenja memorije. Veli čina za uzetog prostora u tom sl učaju ovisi o stvarn o m, a ne o pred viđenom broju podataka. Osim efikasnog kori štenj a m em orij skog prostora dinamičke strukture podataka kao i pokazivači imaju i d ru ge prednosti, kao što su hrzina pri stupa p o d aci ma, jednostavno proširivanje b roja p o d at aka i sl. Me(111tim, nepažlji vo rukovanje dinamičkim strukturama može prouzroč.iti nepredvi(tene zav rš etke programa.
procesorskilll'i višekorisničkim
dinamičkih struktura p o dataka objasnit će se na p r i mjer i m a lista i binarnih stabala. Tako đer će bit i objašnjene i funkcije zauzima (malloc O), odnosno osloba(1a (free O) memorijski
Stvaranje
povezanih kojima
prostor.
8.2.1.
se
Funkcije mallocO, reallocO
i
free{)
Zauzimanje mem orij e pri li kom definicije globalne varijahle ili prilikom .deklaracije polja, je stvar ko j u obavlja prevod ilac. Z auz i m anje mem or ije za dinamičke strukture pod a t aka lllora obaviti sam progr am er . M em or ija se u C-u zauzima pozivom fun k cij e mallocO. Opći oblik fun kcije mallocO
Je:
8.2. Dinamičke strukture podalaka
217
void *lllalloc(veličil1s)j
Funkcija
vraća pokaz i v ač tipa void, što
znač i
da se može pridružiti bilo
kojem tipu pokazivača. Na primjer, naredbom i
=
(int
.
) malloc(sizeof(int»i
za.uzima
se m emor i ja po t rebn a za zapis cj elobro jne
dovolj no
memorije fu nk cija
uzete mem orije
pridružuje
vrijednosti i
adresa za
se poka.zivačkoj varijabli i. Veličina zauzete memorije ov is i o ti pu podatka. Operator sizeof v raća veličinu memorije potrebnu za zapis hilo kojeg defin i rang tipa podatka. U sl u čaj u da nema
mallocO vraća NULL pokaz i vač .
U sl u č aj u da v eličina zauze te memorije nije dovol j na za s mje štaj svih podat aka , može se izvrši t i dodatn o zauzim a nje r as položive memorije. Ono se hitn o razlikuje od ponovnog z au z i m a nj a memorije. N ai me , novim zauzi maujem memor ij e svi podaci, z api s an i u pre t ho dno zauzetom dijel u memo rije, su iz gu bljen i . Dodatni m zauzim anjem ra spol ožive memorije svi podaci os t aju sahlvani. Funkcija koja omogu ć uje dodatno zau zim anje rasp olo žive memorije u C-ll je reallocO. Opći ohlik funkcije je: void *l"calloc(pokazivac, velieina); A rg u m ent pokazivac
odre(tuje za koji p o d atak se obavlja dodatno zauzi memorije, dok se arglllllentom velieina određuje koliko se dodatne m e m orije z ah tij eva. Svakako da se funkci j om reallocO može i sm anji ti veličin a z au zete m emorije . U tom slučaju programer je sam o dgovoran za gu bit ak odre(lenih podataka. manje
Neprestanim zauzimanjem. mem orije , bez o bzira na njezinu veličinu, raspoloživa mem orij a bi se veoma brzo i scr pil a . Zbog toga se memo rija koja je zauze t a nepotrebnim podacima, osloha(la. O slob ađanje dijela zauzete memorije obavlja se pozivom funkcije freeO. Opći obli k funkcije freeO je void free(void *pokazivac);
A rgum e nt funkcije pokazivac sadrži adresu bloka memorije koji se oslobađa. Argument fu n k cije je t ipa void, što zn a č i da funkcija prih va ća pokazivač na
bilo
koji
tip podataka. Pri tome je
dobro eksplicite zadati o kojem se t i pu
pokazivača radi (korištenjem cast o pera t or a
zauze t e memorije
iz
O).
Na primjer, oslobadan = d; novi_ el ement->mj e s ec = m; n o v i_ e l ement->godina = g; n o v i_ e l ement-> slj edeci = KRAJ_L ISTE;
1* da li j e nov i_element prv i u li s t i *1 if (p oc etak_ l i s t e == KRAJ _L I STE) poc etak_l i s t e = kraj_li s t e = n o v i _ el ement; else
{ 1* zadnj i elem ent li s t e pokazuj e na novi e l em ent *1 kraj_Ii s t e-> sl j edeci = novi _ elemen t ;
1* novi el ement postaj e zadnji kraj_li s t e
=
u lis ti *1 n ovi _ element ;
} printf ("\n Unos novih p odataka (d/nL_" ) ; ch = g etche( ) ; } 1* kraj uno sa vrati pokazivac na prvi element u li sti *1 r eturn (poc etak_lis te ) ;
}
Funkcija kreiraj _listu O
stvara povezanu listu i vraća pokazivač na Bitno je uo čiti da se pri dod avanju novog elementa prvo moraju riješiti pokazivači. To znači da se zadnje m elementu u listi prvo mora pridružiti pokazivač na novi element liste, a zatim taj element liste proglasiti zadnjim II listi. Stvaranje i dodavanje novih elemenata u listu se
početak liste.
221
B.e. Dinamičke slr1tkture podataka može
prikazati
kao:
pocetak...liste I
novLelement -
I I I I
-L
Ispis sadržaja liste Funkcija
ispis_sadrzaja O
ispisuje
sadržaj li st e. U fu nkciju je dovoljno element II li st i odrNten je
prenijeti pokazivač na. prvi el em ent liste. Z a.d nji pokazivačem KRAJ_LISTE. 1*
i s pi s sadrzaja li s t e *1
void i spi s_sadrzaj a_l is te (struct
d atum *poc etak_li s t e )
{ struct datum int i;
*i spi s:
1* i s pitaj d a li l i sta uopc e postoji *1 if (poc etak_ l i s t e == KRAJ_L ISTE )
{ print! ("\nLi s t a ne postoji ili greska m em orije " ) ; return:
} 1* i s p i s une s enih podataka *1 printf (" \n Sadrzaj l i s t e : : "); printf ("\n============================" ) ; i = O; for (i s p i s = poc etak_l ist e: ispi s != KRAJ_L ISTE; i spi s = i spi s-> slj edeci )
{
i++: pr intf ( " \n Datum rodj enj a Y.d. o s ob e : Y.d. Y.d. Y.d.".i. i s p i s->dan.
222
Složen iji tipovi podataka
i s p i s->mj e s e c, i s pis->godina ) ;
} pr intf ("\n\n Kraj l i s t e .....
"
);
}
Dodavanje novih elemenata u listu
Dodavanje novih elemenata prikazano je funkcijom unos_novog_elementaO. Elementi se dodaju na kraj liste, premda se funkcija može preoblikovati tako da se elementi uhacuju iza ili ispred zadano� elemenata. Postupak za ubaci vanje elementa iza zadanog elementa u listi je 1.
zauzmi memoriju za novi element
2.
učitaj podatke za novi element
3. pronacti
element(test) iza kojeg se ubacuje novi element
4. riješi pokazivač.e: nov i_ e lement->sl j edeci = t est-> s lj edec i ; t e s t-> slj edeci = nov i _ e l ement;
što se može prikazati kao
pocetak�iste I
test ,--+
L -
-
,, , , , , , J
J-
novLelement Ako
funkdji.
je zadani
element
zadnji
u
listi, postupak je
isti
kao
II
prikazanoj
8.2. Dinamičke strukture podataka 1* dodavanje novog elementa na kraj liste *1 v o id uno s_novog_ el ementa (struct datum *pocetak) { s truct datum *novi_ el em en t, *kraj_list e: int d, m, g ; nov i_el ement= ( struct datum *) malloc ( sizeof ( struct datum»; if (novi_element == IULL) { pr intf ( " \n lema dovoljno memor ije .... . II); return : }
1* unos vrijedno sti novog e l ementa l is t e *1 printf pr intf printf printf printf
( " \n Un es i t e podatke o datumu rodjenja: " ) : ( " \n = = = ===== = = = = = = = = = = = = = = = = = = = = = = = = = = " ) : ( " \n\n Dan II): s canf ("Y.d " ,lcd ) : ( " Mjesec II ) : s canf ("Y.d " ,Icm ) : ( " God ina : lt ) : scanf ("Y.d " ,lcg ) ;
novi_ el ement->dan = d ; nov i_el ement->mjese c = m ; nov i_el ement->godina = g : nov i_ e l ement-> s lj ed e c i = K RA J_L I STE ;
1* pronadji kraj l ist e *1 for (kraj_l i st e = poc·etak ; kraj_ l i s t e->slj ede c i != KRAJ_LISTE; kraj_ l i st e = kraj_ l i s t e->slj ed e c i ) : 1* zadnji el ement p� kazuje na nov oun eseni el ement *1 kraj_l ist e-> s ljed e c i = nov i_ e lement; 1* novouneseni el ement zadnji u l ist i *1 kraj_l i s t e = novi_element ; }
Pretraživanje liste Lista se pretražuje usporedhom zadanih podataka s podacima svakog ele menta liste. Budući da je jednostruko povezana lista sekvencijaIna, u funkciju
se mora prenijeti pokazivač. na prvi element liste.
224
Složeniji tipovi podataka
1* pretrazivanje liste *1 void pretrazivanje_Iiste(struct
datum
*pocetak)
{ struct datum *testi int d . m. gi
pr int f printf pr intf pr intf printf pr inU
("\n Pretrazivanj e liste : ")j ("\n = = =========== = ======== =")j ( " \n Unesite podatke o datumu rodj enj a " ) ; ")j s e anf (" Y.d" . td); (" \n\nDan ")j scanf ("Y.d" . b)i ("Mjesec ( " Godina " ) i scani (·�Y.d" . tg) i
1* pret raz i vanje liste *1 for (test = pocetakj test != KRAJ_LISTEj test = t e s t - >slj edeci)
{ if (test->dan
{
--
printf ( "\n return;
d II test->mjesec == m II te st->go dina == g) Podat ak je u
} } pr inU ("\n Podatak nije
II
l ist i
");
listi");
} Brisanje elemenata liste
pojedi n og elt'llIenta
listi zahtijeva dvije operacije. Prva je pro nalaženje zadanog element a II list i, a druga oslobađanje memorije koju je> zauzimao ohrisani element. Brisanje odnosno izhacivanje, elementa iz liste znači da će prethodni elelllt'nt pokazivati n a n aredni element liste koji slijedi iza izbačenog elementa. N akon toga nema ni jednog elementa II listi koji hi pokazivao na iz b a čeni element. Prema tome, o n nije više d o s t u pan program ll. Zbog toga je dio memorije koji on zauzim a d ob ro osloboditi. Da Brisanje
II
m ora se deklarirati privremeni pokazivač hriše. U navedenoj funkciji to je pokazivač temp. Situacija je uešto drukčija kada se hriše prvi element 11 listi.
hi se memorija mogl a osloboditi, na element Uste koji se
1* brisanje elementa iz liste *1 void brisanje_elementa_iz_liste(struct datum *pocetak) {
225
8. 2. Din a mičke strukture poda t aka struct int printf pr intf printf printf printf p r intf
datum * t e s t , *t emp ; d , m , g , redn i _broj
=
O;
( " \n Br i s anj e el emenata l i s t e : " ) ; ( " \n============================ " ) ; ( " \n Podac i struktur e ko j a s e izbacuj e : " ) j ( " \n\nDan ) ; s canf ( " %d" , a: d) i ( " Mj e s e c " ) ; s canf ( " %d " . a:m) ; tl ) ; s canf ( " %d " • .tg) ; ( " Godina "
1* pronadj i zadan i el ement *1 for ( t est = p o c et ak ; t e st ! = KRA J_LI STE ; t e s t = t e st->slj ed e c i )
{ r edni_broj ++ ; 1* t emp pokazuj e na j edan e l ement i spred t e s t *1 t emp = t e st->slj edec i ; 1* da l i j e to prv i e l ement u l i s t i *1 if ( t e s t ->dan == d tt t e st ->mj e s ec = = m ta: t e s t->godina == g ta: r edn i_broj == 1 )
{ 1* promij en i pokaz ivac prvog e l ement a l i s t e s t art = t emp ;
*1
1* o s lobodi memor i j u e l ement a koj i s e br i s e *1 fr e e « s truct datum * ) t e s t ) ; return ;
} if ( t emp->dan == d tt t emp- >mj e s e c == m tt t emp->godina = = g )
{ 1* pronasađ zadani el ement *1 t es t - > s l j ed e c i = t e s t - > s lj e d e c i - > s l j edec i ; 1* o s lobodi m emor i j u obr i s anog el ement a *1 free « struct datum * ) t emp ) i return ;
}
}
}
B risanje el em en t a li ste može se prikazati kao
226
Slože n iji t ipovi poda taka
p o c et alel i st e t e st
�
-
-
t emp
-
-
-
-
I
l
free ( )
o slobodi dio memorij e ovđg el ementa N an·dni primjer daje prikaz osnovnih operacija n ad jednostruko poveza nim listam a. Primjer koristi navedene funkcije. Operacija se bira II funk ciji menu e ) . 1* o s n o vn e opera c ij e nad j ednos t ruko pov ezanom l i s t om * 1
int menu ( v o i d ) { i zbo r ; i nt 1 * obr i s i zaslon * 1
clrs cr O ;
* * tt ) ; - - - - - - - -- - - - - - - - - - , ) ; 1 . ) S t v aranj e l i s t e " ) ; ; Ispis s adrzaj a l i s t e " ) 2. ) 3 . ) Unos novog e l ement a " ) ; 4 . ) Pretraz ivanj e l i s t e , , ) ; S. ) B r i s anj e e l ement a l i s t e " ) ; 6 . ) Kra j rada __ " ) ;
pr intf ( " . . pr intf ( " \ n printf ( " \n pr intf ( " \n p r int f ( " \n pr inU ( " \n prinU ( " \n pr i n t f ( " \n
OSNOVNE OPERA C I J E
.
s c anf ( "Y.d" .tizbor) ; return ( izbor) ; •
}
void main ( v o id ) { 1* pr o t ot ip o v i f unkc i j a *1 struct datum *kr e i ra j _ l i stu ( v o i d ) ; void ispis_ sadrzaj a_l i ste ( struct d at um * ) ; void uno s _novog_elementa ( struct datum * ) ;
8. 2. Dinamičke s trukture pod a t aka
227
v o id pretrazivanje_l iste (struct datum * ) ; v o id brisanje_elementa_iz_ liste (struct datum * ) ; int menu (vo id) ;
int izbor_operacije ; int kreirana = O ; char ch ; do
{
switch ( izbor_operacij e
{
=
menu ( »
case 1 : if (kre irana -- 1 )
{
}
pr intf ( "\n L ista vec stvorena ! ! " ) ; pr intf ( "\n Zel ite n ovu l istu ? (d/n L_ ") ; ch = getche O i if (ch = = ' n ' I I ch = = ' N ' ) break ;
printf ( " \n * * STVARAN JE NOVE LI STE ** ") ; /* p okazivac na pocetak liste */ start = kre iraj _listu ( ) i kre irana = 1 ; br eak ; case 2 : printf ( "\n * * I S P I S SADRZ A J A LISTE ** " ) ; i s p is _sadrzaja_liste (start) ; printf ( " Za nastavak prit isnuti b i l o koj u t ipku"); getch O ; break ; case 3 : ; pr intf ( " \n * * UNOS NOVOG ELEMENTA * * I I ) unos_novog_elementa (start) ; break ; case 4 : pr intf ( "\n * * PRETRAZ I VANJE LISTE * * " ) i pretrazivanje_ l iste (start) ; pr intf ( " Za nastavak pritisnuti b il o koja t ipku ") ; getch O ; break ; case 5 : printf ( "\n * * BRISANJE ELEMENATA L I STE * * ") ; brisanj e_elementa_ iz_l iste ( start) ; break ; case 6 : pr intf ( "\n\n . . . . k r a j . . . . . . . " ) ; •
228
Složeniji tipovi podataka break ;
default : printf ( " \n Pogresan izbor ! ") ; pr intf ( " Za nast avak pr it i snut i bilo ko j a t ipku" ) ; get ch O ; break ;
}
} } while ( izbor_operac i j e
!=
6) ;
Rezu1tat izvršavanja programa je: ** OSHOVHE OPERACI J E * *
1. ) 2. ) 3.) 4. ) 5. ) 6.)
Stvaranj e l i s t e I sp i s s adrzaj a l i s t e Un os novog el ementa Pretrazivan j e l i s t e Brisanj e el ementa l i s t e Kraj rada __ 1
* * STVARANJ E HOVE LISTE *. Un e s i t e podatke o datumu rodj enj a :
= ====== === ===== == ===== == === === = = = = Dan 1 Mj e s e c 1 1990 God ina Uno s nov ih podataka {d/n ) __d
Dan Mj e s e c
Godina
2 2 1990
Unos nov ih podat aka ( d/n) __n .* I S P I S SADRZA JA LISTE .*
Sadrzaj l i s t e :
-------- ------Datum r odj enj a 1 .
osobe
Datum rodj enj a 2 .
os ob e
Kraj l iste . . . . .
1. 1. 1990 . 1 990 .
2. 2.
8. 2. Dinamičke strukture podataka **
UNOS IOVOG ELEMEITA
229
**
Unes i t e podatke o datumu rodjenj a : = = = ======================= = ====== = Dan 4 Mj esec 4 Godina 1 990
**
I S P I S SADRZAJl LISTE
••
S adrzaj liste : - - - - - - - -- - - - - - - - -----------
Datum rodjenj a 1 . osobe Datum rodj enja 2 . osobe Datum rodjenja 3 . osobe
1 . 1 . 1 990 . 2 . 1 990 . 4 . 4 . 1 990 . 2.
Kraj l i ste . . . . .
••
PRETRAZ IVlij E LISTE
••
Pretrazivanje liste : === = === = ============ Unesit e podatke o datumu rodjenja : Dan Mjesec Godina
2 2
1 990
Podatak j e u listi
**
BRISAXJE ELEMElATA LISTE • • =========== = ======= == =====
P odaci st rukture koja se izbacuje : Dan Mjesec Godina **
2 2
1 990
ISPIS SADRZA J! LISTE
••
Sadrzaj list e : - - - - - - - -- - - - - --------- -----
Datum rodjenja 1 . osobe
. . 1.
1.
1 990 .
Složeniji tipovi podataka Datum rodjenja 2 . osobe
4.
4.
1 990 .
Kraj liste . . . . .
Fu n kc ij a za
ispis sadržaj a p ove z a ne lis t e može se
riješiti i rekurzijom :
1* funkcija za ispis sadrzaja liste * 1 rekurz ivna metoda *1 1* vo id ispis_sadrzaj a_liste (st ruct { struct datum * ispis ;
}
datum * pocetak_liste)
ispis = pocetak_liste ; printf ( "\n Datum rodjenja osobe : Y.d . Y.d . 'lod . " , ispis->dan , ispis->mjesec, ispis->godina) ; if « ispis = pocetak_liste->sljedeci) 1 - KRA J_LISTE) ispis_sadrzaja_liste ( ispis) ;
8. 2 . 3 . B i narna stabla
povez anih lista dinamička stru k t ura podataka može obliku binarnog stabla. Oblik bi n arn o g s t abla m o ž e s e
O s i m jed n o s t ruko
se
o rgan i z i ra t i i
II
slikovito prikazati kao
P rije nego kff'nemo na ohj ašnjenje strukt ure i k reiranj a binarnog s t abla pot r('bno je u s voj i ti o d re cten u terminologiju vezanu za binarna stabla.
8. 2. Din am ičke strukture poda t aka
mora imati dva pokaz i vača. Jedan k o j i lijev i cleme n t i jedan ko ji p okaz uje na des n i element. Element stabl a koji se nal azi na n ajvišoj razini n aziva sc kor ijen (root ) . Preko ko r i jena s t abl a pri s t u pa sc ostalim el e m e n t i m a koji sc nalaze na nižim razinam a. L ijevi i d e sn i elem enti pred s t avlj aju lij e vo i d esno podstablo . S vaki elem e n t bin arnog stabl a
pokazuje
na
Za prikaz din amičkih struktura po d a t aka organiziranih u obliku bin a n og stabla , riješit ćemo j e dan jednostavan zadatak . Cj el o b r ojne vrijed nosti po(l at aka, koje se u n ose s tastature, treba organizirati u obliku bin arnog s t abla prem a slij ed ećem pravilu : S v i podaci k o j i su m anji od p rethodn o un e s e nog smje š t aju se 11 lijevo podst ablo, a p o d aci veći ili jednaki od prethodno r
u nesenog smje š t aj u se II desno
podstablo. Za
rj ešenje n avedenog zadatka
potrebno je p ravilno d eklarirati odgovarajući element, odnosno samorefer
entn u s t r uk t u rn . Deklaracija elem enta bin ar nog stabla glasi : s h'uet
{
iut
};
eLh i u -.S t vl'ijl�(lllos t j
s h'uet
eLbiu ...s t
*lijevij
s trud
eLhiu ...s t
*deSllij
što se može p r i kazati kao v r ijed n ost d es n i
lije v i
Stvaranje binarnog stabla ' Za s t varanje b i nar n og stabla
pogodno je koristiti metod u rekurzije. Funk kreiraj _ stab l o ( ) v raća p o kaz i va č na korijen binarnog stabla. Argu men t i funkcije S11 p okaziva č n a čvor stabla više razine i te v rij e d nost elem enta koj i se trcha i n tegri rat i II b i n arn o stablo, Program sko rješenje n avedenog cij a
zad atka
je:
1* stvaranje binarnog stabla *1 struct
el_bin_st
*kre iraj_stablo (priv, v ) struct el_bin_st *priv;
Složeniji tipovi poda taka
232 {
v I·
int
1* naj n iza raz ina ? *1 if ( p r i v == NULL)
{
}
1* pokaz ivac na nov i e l ement *1 pr i v = ( s truct el_bin_st * ) malloc ( s iz e o f ( stru ct el_bin_st » ; priv->vrij ednost = v ; priv-> l i j ev i = pr iv->d e s n i = NULL ;
e l s e if (v < pr iv->vr i j edno st ) 1* lijevo podstablo pr iv->l i j e v i = kre iraj _st ablp ( priv-> l i j e v i , v ) ; else 1* desilo pods tablo priv->d e s n i = kre iraj _stablo (priv->de s n i , v ) ;
}
*1
*1
r eturn (priv ) ;
Kom pletan program za s t var anj e n aved enim kriterijima glasi: 1 * program
ispis sadržaja binarnog stabla, prema
binarno s t abl o
*1
# include < s t d i o . h> # inelude #def ine
NULPTR *kor i j en ;
main ( )
{
ehar
ch
int
v;
korj en
=
'd' ;
:;
NULPTR ;
whi l e ( ch ! = ' n '
{
eh
!=
'N')
print:! ( " \n Un e s i t e vr ij edno st : " ) ; s eani ( ":!.d " , .v ) ; kre iraj _stablo ( korij en , v ) ; pr int! ( " Dalj e ( din) II ) ; ch get che O ; kor i J en
}
II
=
=
8. 2. Dinamičke strukture podataka
233
print _ s t ablo (kori j en) ;
}
Ispis sadržaja binarnog stabla Za ispis sadržaja b i n ar n o g s t abla koris t i t ćemo rekurzijl1 . Rekurzi vni n ačin ispisa p o d ataka hinarnog stabla je n ajjednostavniji i n ajprirodniji n ač.in i s pi sa Prvo se ispi suje s ad r ž aj lijevog podstabJa, zatim sad ržaj č v or a i .
potom sadržaj desnog }lodstabl a.
/ * i s p i s sadrzaj a b inarnog stabla */ vo id pr int_stablo ( struct el_bin_st *root ) { if ( root ! = NULPTR) { print_stablo ( root->l ij ev i ) ; printf ( " \n Vr ij edno st = Y.d" . root->vr ij ednost ) ; pr int_stablo ( root->desni ) ; } }
Rezul tat i z v r š avanja program a je:
Un e s i t e vrij edno st : Dalj e ( d/n) d Une s it e vrij ednost : ' Dalj e ( d/n) d Une s i t e vrij ednost : D al j e ( d/n ) d Une s i t e vrij edno st : Dalj e ( d/n ) d Une s i t e vrij edno st : Dalj e (d/n) d Une s i t e vrij edno s t : Dalj e ( d/n) d Unes i t e vrij ednost : Dalj e (d/n) n
20 10 5
12 30 25
32
B i n arno s t ablo n akon u n osa podataka izgled a ovako:
234
Složen iji t ipo vi poda t a k a
20
Ispis
s ad rž aj a b i n arn og stabl a prema go ;e navedenom pravilu je
Vr ij ednost Vrijednost Vrijednost Vr ijednost Vrij ednos t Vr ijednost Vrij edno s t
=
5
=
10
= = = = =
12 20 25 30 32
nad line arnim list ama j es t kraće vri s t ab l a vrijeme obilaska proporcion aln o je logari t m u b r o j a č vorova, do k je kod linearni h list a proporcionalno broj u G l avn a pred n o s t b i n arnog stabl a
jeme ob ilas ka .
K o d b i n arnog
el emcn at a li s t e . Postoj i
nekoliko na č i n a obilaska binarnog st abl a :
inorder, postorder
i p reorder.
Detaljnije ob j aš nj e nj e ope r a c ij a
n ad
dinami č.kim strukturam a p o d at aka
z all zel o hi d o s t a pros tora, š t o prelazi o k v i re ove knjige. Ako vas i nt er esi r a ova probl ematika, detaljnije o tome m o ž e t e p ro č i t a t i u knjizi "A lgorit hms + D ata S t ruct ures = P rograms" čij i je au tor N iklaus Wirt h .
8.3.
Polj a bitova
P rogramski jczik e i m a m ogućn ost pristu pa pojed i n o m h i t u ili gru p i P rem d a s e u većini programskih jezika kombin acijom odre(tenih vrijed nosti ( fi l t e r ) i logi čkih operatora može pročit at i v rij ed nost s vakog b i t a , bitova.
8. 3. II
e
Polja bitova
235
se m ože ne samo proč i t a t i vrijednos t pojedinog b i t a ,
v rijed n os t p o j e d i n o m
nego i zad a t i
h i t u ili gru pi bitova.
Pos toj i n ekoli ko razloga z a pristu p
pojedinim hitovima
unu t ar riječi .
N a primjer, ako je m em orijski p r o s t o r ogranič,en , može sc zapi sati nekoliko l ogi čk i h varij ahli u ll u t ar j e d no g haj t a , pristu p i t i od re(tenom s t at u su u ređaj a
čije stanje je
zapisano u n u t a r
hajta, pris t u pi t i
koja se či t a s nestan d ard n og u l a z a i sl .
određenom dijel u i n form acije
Kori št enjem p olj a h i t ova često se
m ože p ove ć at i efikasn ost i pregled n ost program a. D eklaracij a p olja h i tova sli čn a je deklaraciji strukture . O p ći oblik d e
kl aracije
polj a h i t o va j e :
s h'uet
{
illW _:Polja
t ip
illleO : b roj_hitova;
tip
illleN : broj _hitova;
}; S vakom čl anu st r u k t u r e p ri d ru žuje se o d re
.
. .
II ) ;
} 1* u c i t avanj e podat aka *1 f s eanf ( f p . "%S % s %s %d " , radn ik 1 . ime , radn ik 1 . prez ime . radn ik l . grad , tradnik l . radni_st az ) ; 1* i sp i s pro e it anih podat aka *1 printf ( " \n Pro c itani podaci o radn iku : " ) ; printf ( " 'n================== = = = = = = = ===== " ) ; printf ( " \nIme i pr ez ime : %s %s " , radnik 1 . ime . radn ik l . pr e z ime ) ; %8 " , radn i k 1 . grad) ; printf ( " \nMj est o s t anovanj a %d " , radn ik 1 . radni_ s t az ) ; pr intf ( " \n Godina staza }
Rezu l t at izvršavanja program a je:
Un e s it e ime radn ika Un e s i t e pre z ime radn ika Mj e s t o st anovanj a God ina s t az a : •
: P et ar : P etrovi c Zagreb
12
Pro c itani podac i o radniku : = = = = == = = = = = = = = = = = = = = = = = = = = = = = = Ime i prez ime : Petar P etrovic Mj e s t o s t anovanj a : Zagr eb God ina s t aza : 12
Pogl ed aj m o verzij u program a koj a za upis strukture II
cas t operator.
d a t o t ek u koristi
246
Složen iji t ipovi poda t a ka
1* v r i j ed i d eklarac i j a s t rukture pre t hodnog pr o gr ama 1*
iz * 1 *1
v o i d main ( v o id )
{
int char
i; * ch ;
1 * pokaz i vac n a n i z znak o v a *1
s t at i c s truct zap o s l en i radnik , radn ik 1 ; F I LE
*fp ;
1* pokaz ivac dat o t ek e * 1
1* uno s podataka o radn iku * 1 : ); pr intf ( " \n Un e s it e ime radn ika' g e t s ( radn ik . ime ) ; lt ) ; printf ( I t Une s it e prez ime radn ika get s ( radn ik . pr e z ime ) ; lt ) ; pr intf ( " Mj e s t o s t anovanj a s canf ( ItXs " , radn i k . mj e s t o _ s t anovanj a ) ; ); printf ( It God ina s t aza l s c anf ( t l.d " , &:radn ik . radn i _ s taz) ; "
lt
1* o t v aran j e dat o t ek e za up i s podat aka * 1 = = NULL ) « fp = f op en ( I t POD A C I . DATIt , w lt )
if
{ }
"
printf ( " \n Greska o t v aranj a dat o t eke l t ) ; printf ( II \n\n Prek id programa . . . . . II ) ; exit (O) ;
1* up i s s t rukt ur e u dat o t eku * 1 1 * up i s kompl etna struktura bez obzira na bro j e l anova *1 1 * pokaz i v aeu koj i p okazuj e na n iz znakova pridruzi * 1 adr e s u s t ruktur e *1 1*
( st ruct zap o s l eni * ) ch
=
&:radn ik ;
1* podaci s e iz s t rukt ur e u da t o t e k u up i s uj u *1 *1 baj t p o baj t 1* f or ( i =0 ; i < s iz eof ( struet zapo s l en i ) ; i + + ) pu t e « int ) * ch+ + , fp) ; t e l o s e ( fp ) ;
1*
1* zatvori dat ot eku *1
u c i t av anj podat aka
*1
*-------- -----------�---------- *I
1* o t v o r i dat o t eku PODAC I . D A T z a c i t anj e * 1
8. 7. Pre tvara nje t ipova podataka (casting) it
« fp
=
247
fopen ( " PODA C I . DAT" J "rb" »
= = NULL )
{ printf ( " \n Greska otvaranj a dat ot ek e " ) ; print! ( " \n\n Kraj programa . . . . . " ) ; exit ( O ) ;
} ( s truc t zap o s l e n i
*)
ch : �radn i k 1 ;
1 * u c i t avanj e podataka iz datot eke u s t rukt u ru * 1 1* baj t po baj t *1 f o r ( i : 0 ; i < s iz e o f ( struct z apo s l en i ) ; i + + ) * ch++ = g et c ( f p ) ; f c l o s eall ( ) ;
1 * 2at vo r i s v e otvorene datot eke * 1
1 * i s p i s p r o c i t an ih podat aka *1 ); print! ( " \n Pro c i t an i podac i o radn iku : print f ( " \n: : = = : = : : : : : : : : : = =======: = = = = = = " ) ; print f ( " \nIme i pre2 ime : %s % s " J r adnik 1 . i me J r adn i k 1 . pr ez im e ) ; printf ( " \nMj e st o stanovanj a : % s " , r adn i k 1 . m j esto _ s t anov anj a ) ; printf ( " \nGod ina s t a2 a : %d " , radn ik 1 . radn i _ s t az ) ; tl
}
Rezul t at izvršavanja p r ogr am a je i s t i kao
i kod prethodne verzije program a.
Pred nost program a koji k ori sti cast op e rat or jest u nim meh anizm om može u d atoteku poh rani t i ili pročitati b ez obzira na b roj čl an ova.
činjenic i d a
se jed
bilo koja struk tura
9 . D O DATNI S K U P O P E RAT O RA
O peratori opisani 11 prethodnim pogl avljima om ogu ćuju izvršavanje svih arit m et i čkih i logi čkih operacija. N avedeni operatori mogu se svrstat i u skup opcratora koji je zajedni čki za većinu programskih jezika. Programski jezik C u vodi n ckoliko dod atnih operatora kojima se može povećati fleksibil n ost i efikasnost programa. Dodatni sku p operatora posebno d olazi do izražaja kod sistem skog programi ranja; na primjer, operatori orijentirani na rad sa hitovim a ( bitwisc opcmt01w) . O vo p ogl avlje obra(tuje operatore orijent irane n a rad s b itovim a i p oljem bitova, t e operatore sizeof, ? i zarez. Na kraj u pogl avlja d an je pregled i priori tet izvršavanja svih operatora programskog jezika C .
Dodatni skup operatora
250
9.1.
Operatori orijentirani na rad
s
hitovima
Programski jezik e sadrži šest operatora orijentiranih n a rad s bitovima. Oni omoguć11ju izv ršavanje logičkih operacija, ispitivanje i postavljanje po jedinih hitova, te pomicanje bitova unutar bajta ili riječi. Zhog
načina djelova.nja operatori orijentirani na rad s bitovima mogu
char, short , int kao signed ili unsigned. Pregled i
long,
se primijeniti samo na varijable tipa
i
da li su deklarirane
znač.enje pojedinih
bez obzira
operatora dani su u tahlici 9.1.
Operator
Znače n j e logički I
&
9.1.1.
(OR) -
između hitova
ekskluzivno ILI ( exclusive
-
9.1.
između bitova
l ogi č k i ILI
I �
Tablica
(AND) -
komplement
(NOT)
«
pomak ulijevo
( left shift )
»
pomak udesno
( right sh ift )
Pregled
OR)
i značenje operatora orijentiranih na rad
Pomak ulijevo
i
s
hitovima
pomak udesno
Operatori za pomak ulijevo i pomak udesno pomiču bitove unutar bajta
ili
rijf'či.
Opći oblik naredbe za pomak ulijevo je:
varijabla
broj;
«
gdje je varijabla identifikator deklarirane varijable, a broj označava bitova za koliko t re b a pomaći. Na primjer, deklarirana var ij abla ch, char
ch
;
OxF;
za.pisana je I I memoriji kao
broj
9.1. Operatori orijentirani
na
IOI
O
rad
s
O
bilovima
251
O
l
l
1
O
O
O
Izvršavanjem naredbe ch
varijahla
=
ch
ch u
4'
«
,
mcmoriji izgleda ovako
I 1 I1I 1 I 1 I Pomak hitova lHlesl10 definira se
O
slično pomaku bitova u lijevo Opći .
oblik
naredhe za pomak udesno je:
varijublu
»
broj;
pojedinih dij elova naredbe isto je kao i kod pomaka ulijevo. Da vidjeli razliku izmedu p o m aka. u lijevo i pomaka udesno pogledajmo kako je var i j abla ch prikazana li memoriji nakon naredbe za po m ak 4 mjesta udesno Značenje
hi
ch
=
ch
»
4;
I O I O I 0.1 O I N aredbe
za, p o m ak ne rade rotaciju.
O
IOIOIOI
To
znači da prvi
udesno ne postaje osmi bit, ()dnosno osmi bit n ak o n
hit nakon pomaka
pomaka ulijevo
ne
postaje prvi bit.
pomak udesno pogodni su za ispitivanje stanja pojedi nih za operacije množenja i dijeljenja s 2.
Pomak ulijevo i bitova,
kao
i
1* 1*
primjena operatora za pomak u l i je vo i udesno
mnozenje i dijeljenje brojem
main ( )
{ void prikazi_binarno (int); unsigned char
x =
7;
2
*1 *1
Dodatni skup operatora
252
printf ( " \n x = %d B inarno : : " x); pr ikaz i_b inarno ( x ) ; x = x « 1; 1* pomak ulijevo => mnoz enje s 2 pr intf ( " \n x « 1 = %d Binarno :: ", x ) ; prikaz i_b inarno ( x ) ; « 3; x = 1* pomak ul ijevo => mnozenje s 8 *1 pr intf ("\n x « 3 = %d B inarno :: ", x ) ; prikaz i_b inarno ( x ) ;
x = x « 2; pr intf ("\n x « 2 = %d pr ikaz i_b inarno ( x ) ;
"
B inarno
x);
x = x » 1; 1* pomak ud esno => dij eljenje s 2 *1 pr intf ("\n x » 1 = %d Binarno : : " , x); pr ikaz i_b inarno ( x ) ; x = x » 2; pr intf ( " \n x » 2 = %d pr ikaz i_b inarno ( x ) ;
", x ) ;
Binarno
} void pr ikaz i_b inarno ( int x ) { int t, •
for ( t = 128; t > O; t = t/2 ) { if ( x lc t ) pr intf ( "1 ) ; els e pr intf ("O " ) ; } pr intf ( " \n"); II
}
Rezultat izvršavanja programa je:
x = 7 x « 1 3 x « x
« x » x »
2 1 2
=
= =
= =
96
B inarno B inarno Binarno Binarno Binarno
24
Binarno
14 112 192
, ,
O O O 1 O O
O O 1 1 1 O
O O 1 O 1 O
O O 1 O O 1
O 1 O O O 1
1 1 O O O O
1 1 O O O O
1 O O O O O
9. J. Operatori orijentirani na rad 9.1.2.
biiovima
s
Logičke operacije
Logii:'kc operacije A ND , OR, 'XOR i NOT koje se odnose na rad s hit ovima imaju iste t ablice istinitost i kao i logi čke operacije AND, OR,XOR i NOT koje se pri mjenjuju na logi čke varijable. Razli ka je u tome da logičke operacije koje se odnose na rad s hi tovima kao logičke vrijednost i (O il )
uzimaju vrijednost svakog pojedinog bita za d ane varijable, a ne logi čku vrijednos t varijable. Na p rimjer, varijable x i y d eklariran e kao
ehar
ullsiglled
Yi
x,
sadrže vrijed nosti x=10 i y=20. o
O
O
O
O
O
O
Prikaz varijabli u memoriji je
1
O
1
o
varijabla x
O
1
O
O
varijahla y
��__�__-L__�__�__L-���
L-�__�__-L__-L__�__L-�__�
Varijab li
e
koja je ist og t ipa kao i varijable x l y pri druž uje se rezultat
izvršavanja spomenutih logi čkih operacija.
& Yi
e = x
Nakon
zadane
I
naredbe varijahla
O
I
O
I
O
I
O
I
e
O
prikazana
I
O
I
O
I
Dakle, decimalna vrijednost �arijahJe je O.
je O
u memoriji kao
I
varijabl a
e
Da je na varijable x, y hio
primijenjen logički operator AND (&&), varijabla
vrijednost 1, jer s u logičke vrijedn o s t i varijabli x
e
bi poprimila logičku
i y 1.
Logi čka operacija
AND (&) naj češće se kori s t i kod m askiranja o d ređenih bitova riječi ili bajta. Na p ri mj er, u programu koji prima niz z nakova sa serijskog p or t a
o s m i hit
je hit pariteta. Bit
pariteta s luži kao potvrd a pravilnog prijen osa
pojedinog zn aka, a komhi nacija o s t alih sedam bi tova pred stavlja preneseni znak . Zbog t oga se bit pariteta mor a post avi t i na O. Da bi osmi bit bio
pos t avljen na O potreb n o ga je maskirati. Dakle, ako je primljeni niz bit ova sa serijskog p ort a zapisan u varijahli x, koja je deklarirana kao ullsiglled
ebar
Xj
Dodatni skup operatora
254 tada
se ASCII vr ijed no s t prenesenog bajta dobije kao (x &
121);
Ostali logi čki operato r i koji se odnose na rad s bitovima su isklj učivo ILI (XOR - ) i n egac ija (NOT -). Tablica ist in i tosti logičke operacije XOR prikazana je tablicom 9.2. Logi čk i operator - (NOT) m ij e nj a O u 1, i p
q
p - q
O
O
O
1
O
1
O
1
1
1
1
O
•
Tablica 9.2. TahIica istinitosti logičke operacije XOR obrnuto.
Na primjer, va r ij a b li x p r i d r u žen a
je decimalna vrijednost 10 i
p r ikaza n a je 11 m e m oriji kao
x=00001010 N akon naredbe x
=
-x, varijabla x
p ri ka z a n a je u
m e m o r i ji kao
x=11110101. NOT često se koristi u aritmetici d vojnog komplementa.
Logički operator
Bitno je zapamtiti ela relacijski i logički ope ratori kao rezultat d aju logički O ili logič.ki 1. Logički operatori koji se o d nose na r ad s hitovima kao rezultat daj u bilo koju vrijednost koja ovi si o s tanj u va rijabli i logičkom
operatoru primijenjenom na zadane va rija ble . Usporedba logičkih operatora
i logičkih op er ator a koji se odnose na rad s bitovima može se prikazati ovim primjerom:
unsigned x
Y
= =
char
O 1 1 O 1 O 1 1
x&. y = 43; I y ;:;;; 251;
x
1 O 1 O
x,
1
Yi
1 (binarno)
1 1
(binarno) x x
&&. Y
II
y =
=
= =
1;
107 187 1;
9.2. sizeof
9.2.
255
operator
sizeof operator
Operator sizeof često je korišten u p reth od n im primjerima i ako ste pojedine primjere d e t a l j n ije analizirali mogli ste shvatiti njegovo značenje. Sizeof op e ra t o r je tlllarni op erator i kao rezultat vraća veličinu memorije i z ra ž e n u brojem h aj t o va, koju zadana varijabla zauzima. Operator sizeof zadaje se kao:
sizeof (tip-I>odatka)
i može se pojaviti
ato r
II
s vim ti povim a izraza.
Tip_podatka može biti bilo koji definirani tip. U TURBO e-u, oper sizeof primijenjen na osnovne ti p ov e podataka daje sljedeće rezultate:
sizeof sizeof sizeof sizeof
(char) (int) (float)
(douhle)
Ako je
= =
tip_podatka
1;
2;
4',
8;
struktura, tada o p erat o r
broj hajtova koji struktura zauzima
II
sizeof
ra ču n a ukupan
memoriji. Na primjer, ako se struk
tura deklarira kao:
stl'uet pokus
{ }
iut
fl oat
X; y;
tada je vrijednost koj u vraća op erat o r
sizeof (struet pokus)
=
6.
Budući da prikaz različ.itih tipova podataka u različitim i m pl em ent aci
jama ne zah tije va uvije k istu veličinu memorije, korištenjem tora u izrazima može povećati prenosivost programa.
sizeof op era
256
Dodatni skup operatora
9.3. Uvjetni? operator Uvj e t ni operator 7 je ternarni operator, što znači da zahtijeva tri o p er an ela. Opći ohlik konstrukcije u kojoj se primjenjuje uvjetni operator 7
je: izrazI 7 izraz2 : izraz3; gdje izrazI, izraz2 i izraz3 predstavljaju aritmetičke i logičke izraze. Navedena konstrukcija koristi se za zamjenu niza n aredbi
if (izraz!) izraz2; dSl�
izraz3; Načili djelovanja y
=
x
operatora može se prikazati primjerom:
> 9 ? 10
:
20;
Varijahli y prid ružit će se vrijednos t 10, ako je ispunjen u vjet x > 9. U pro ti v n o m varijabli y pri d ružuje se vrijedn os t 20. Gornja naredba, koja je napisana u p o treh o m operatora 7, može se napisati kao if
Cx
>
else y
=
y
U mjesto
=
9) 10; 20;
izra,za izraz2 i izraz3 mogu
stajati i
/* primjena uvjetnog operatora main O
{
void void int
fl f2 X·,
(int);
(void);
printt ("\n Unesite broj scanf ("Yod", tx);
"
);
?
poz ivi */
funkcija.
257
9.4- Zarez operator 1* i s p i s poruke o ? fl(x) : 120;
n esenom broju *1
u
x
}
vo id fl ( int
{
a)
printf ( "\n Uneseni broj razli ci t od O");
}
void f2 (vo id)
{
}
printf ( "\n Unes en i broj j edn ak O");
Ako je uneseni broj različit od nule, tada je u vjet ispunjen i izvršava se prvi dio izraza, tj . funkcija fi O, II suprotnom izvršava se fllnkcija f20. Zbog jednostavnost i i kratke forme zapisa uvjetni operator? najčešće se koristi u m akro-definicijama.
Zarez operator
9.4.
Zarez operator povezuje nekoliko izraza. Izraz na lijevoj strani zarez operatora uvijek je tipa void, što znači da rezultat izraza povezanih zarez operatorom ovisi o vrijednosti koja se d obije izvršavanjem svih izraza s desne strane operatora. Na primjer, n ared bom x
=
( y = 20 , y/4);
varijahli y prvo se pridru ži vrijednost 20, zatim se izračuna izraz y / 4 i izračunata vrijednost pridruži varijabli x. Kako operator pridruživanja ima veći prioritet od zarez operatora, zagrad e su neophodne. Izostavljanjem zagrada varijahli x će se pridr užiti vrijednost 20. Gornja naredba je zamjena za niz naredbi: y
=
x
=
20 ; y I 4;
Dodatni skup operatora
258
9.5. Pregled i prioritet operatora e-a Vrijednost izraza u kojem se nalazi nekoliko operatora ovisi o prioritetu izvršavanja pojedinih operatora. Prioriteti pojedinih operatora obrađivani su kroz primjere u prethodnim poglavljima. Zbog toga se u ovom poglavlju neće ponavljati značenja pojedinih operatora, već će se jednostavno navesti svi operatori i njihovi prioriteti. Tablica 9.3. daje prikaz svih operatora programskog jezika e po prioritetima.
Prioritet Najviši
Operatori ( ) ! * «
< --
->
[ ] ++
-
/
(type)
--
*
ct
sizeof
'!. »
>=
!=
ct -
I .tet
II ? >=
Najniži
+=
-=
*=
/=
J
Tablica 9.3. Lista prioriteta operatora programskog jezika e
10. ULAZ I IZLAZ
Programski jezik e nema llgrađene ulazno/izlazne (U/I) naredbe. Ulaz i izlaz podataka u e-u oba\rlja se preko funkcija. Funkcije se nalaze u stan dardnoj ulazno/izlaznoj biblioteci i definirane su ANSI standardom. Funkcije standardne ulazno/izlazne biblioteke kompatibilne su u svim imple mentacijama e-a. Prema tome, prijenos izvornog koda programa s j ednog sistema na drugi ne zahtijeva nikakve izmjene. Osim standardnih U/I funkcija kori snik može definirati i vlastite funkcije koje su prilagođene za htjevima programa. U ovom poglavlju bit će opisane osnovne U/I funkcije i načini prijenosa podataka i zmeđu programa i ulazno/izlaznih uređaja, datoteka. Poglavlje je podijeljeno u dva dijela. U prvom dijelu obrađene su funkcije za u čitavanje podataka sa standardnog ulaza i funkcije za ispis podataka na standardni i zlaz . U drugom dijelu je opisan rad s datotekama podataka.
Ulaz i izlaz
260
10.1.
Pristup standardnoj ulazno/izlaznoj biblioteci
Programi koji koriste standardne ulazno/izlazne funkcije moraju sadr žavati liniju #include
<stdio.b>
koja se obično nalazi na početk u programa.
•
U datoteci stdio.h sadržani su prototipovi svih ulazno/izlazllih funkcija i definirane su sve simbolič.ke kon st ante i makro naredbe koje se koriste II p ozivima U/I funkcija. U stdio.h je također deklarirana i kon trolna struk tura FILE. Za sada ćemo reći da kon trolna struktura tipa FILE sadrži sve podatke potrebne za izvršavanje ulazn o/izlaznih operacija. Ako je si stem datoteka (file system) organiziran t ako da se d atoteka stdio.h ne nalazi u standardnim direktorijima, kod TURBO C-a je to direktorij \tc\indude, a na UNIX sistemima, /usr/include, tada se ime datoteke u n aredbi #in dude mora nalaziti između zn akova navoda ""
#include
"stdio.h"
U slučaju kad se datoteka ne n alazi u tekućem direktoriju, imena datoteke mora navesti i put (path):
#illclude "c:\ lteaders\
10.2.
tada
se ispre d
stdio.h"
Međuspremnički sistem datoteka
Postoje dva načina prijenosa podataka izme(tu programa i vanjskih ure main
{
O
1* dek l ara c i j a int
x, y;
float
f, gj
ehu
s [20] j
varijabli */
char
*format_unosa;
char
*format_ispisa;
1* definiranje formata za unos i ispis podataka *1 format_unosa format_ispisa
Xd, Xf, Xf, Xs";
"Xd,
=
=
.'X
:: Xd,y :: Xd,t
=
X.3f,g
=
Xf,s
X.l0s"j
puts("\n Unos podataka ;\n")j
1*
ucitavanje podataka po definiranom formatu *1
scanf (format_unosa, lx, ly, lf, 19,
s);
puts("\n Ispis unesenih podataka ;")j 1* ispis podataka po definiranom formatu printf (format_ispisa, x, y, f, g,
*1
s);
} Rezultat
izvršava.njit
progra.ma
je:
Unos podataka: lO,
20, 345.123456, 1.123, Danas je suncano
r�pi� unesenih podataka: x
10.B.
=
10, Y
=
20, f
=
345.123,
g
=
1 . 1 23, s
=
D anas
Funkcije sprintfO i sscanfO
Funkcije sprintfO i sscanf() slič.ne su funkcijama printf() i scanf(). MNtutim, funkcije printfO i scanfO namijenjene su za rad s datotekama,
1 0. B.
Funkcije
sprintfO
i sscanfO
275
uređaj ima, d ok su funkcije sprintf( ) i sscanf( ) n ami B u d u ć.i d a je n i z zn akova pohranjen u me sscanfO i sprintf( ) u s t vari n amijenj e n e z a formatirano pretvaranje (konverzij u ) podataka unutar memorije.
o d n o s n o vanj skim
jenjene rad u s nizom z n ak ov a. m orij i , proizl azi d a su fu n kcije O p ći oblik fUll kcija j e :
sprint f ( s tring, kOlltrolllLniz , l i s t a at'gumenata) j
( s t ring ,
s s canf
Argumen t
kOll t roluL.lliz, l is t a argumenat a ) ;
string pred s t avlj a niz
zn akova u koj i se upisuj u , o d n osno iz kojeg
se u či t avajll , p o d aci argu m e n t a liste
argumenata. Form at zapisa, odn osno kontrolnim_nizom . Pozivom fu nk
form at u č i t avanj a pod a t aka , zad aje se cije
sprintf ( string, " O v o je bro j %d" , x ) ; formira se niz zn akova s t r ing sadržaja
Ovo je bro j kojem se dod aje vrijed n o s t varij abl e x . Ako je vrijednost varij able x = 1 2 3 , t ad a je sad ržaj niza zn akova s t r ing n akon poziva funkcij e
Ovo j e broj 1 2 3
Fu n k cij a sscanfO u č i t ava vrijednosti varij abli string. Neka je ni z zn akova z ;;d an kao s tring
=
koje s u zadan e argum entom
" 0 0 1 Pero Petro v i c S O O " ;
Pozivom funkcije
s s canf ( string , " %3d % 1 5 s % 1 5 s %3d" , tr_br , ime , prezime , .tbr_bod) ; u či t avaj u se v rijednosti varij abli r _ br, b r _ b o d , ime i prez ime s adržanih u argum entu fu nkcij e str ing. fun kcije prE'll O S E'
Vrijedn osti varij abli r _br i br _b o d n akon
r _br = 1 , br_bod = 500. P rimijeti t e da se argumenti preko ad rese. Razl og je is t i kao i kod fu nkcije scanfO .
poziva fu nkcije s u :
Ulaz i izlaz
276
10.9. Datoteke
Svi vanjski ure main(int
{
argv, char *argcO)
FILE ehar
*fp, *fpl; 1* deklaracija pokazivaca na datoteke *1 ch;
if (argv < 3)
{.
puts (It\n Program se koristi kao KOPI dat1 dat21t) ; puts ( lt dat1 : izvorna datoteka, dat2:ci1jna datoteke"); exit (1);
} 1* otvori izvornu datoteku *1 if «fp = fopen(argc[i] , "rb"»
{
printf ("\n Datoteka exit (1);
%s
}
if «fpi
{
=
fopen(argc[2] ,
"
==
NULL)
ne postoji. .. "
w b"»
==
argc[l]) ;
NULL)
printf ("\n Greska stvaranja nove d ato teke . .
. . ,,) ;
Ulaz i izlaz
286
}
}
exit ( 1 ) ;
1* kop iraj s adrzaj datot eke * 1 wh i l e ( ( ch = fget c ( f p » ! = EOF) { if ( ch = = EOF �� f eof ( fp ) -- O) { put s ( " Greska c i t anj a , datoteka nij e kopirana " ) ; exit ( 1 ) ; } if ( put c ( ch , f p 1 ) = = EOF) { put s ( II Gre ska up i s a , dat ot eka nij e kop irana" ) ; exit ( 1 ) ; } }
Svakim pozi vom funkcije fget cO , pokazivač II međuspremniku , koji je pri postojećoj d atoteci , pomiče se n a sljedeći znak . To znači da se sad ržaj d atoteke či ta sekvencijalno. N akon svih u čitanih pod at aka iz m e(tusprenmi ka, II Ill elluspremnik se u čitava novi blok podataka iz datoteke. Uč.itavanje novog bloka II lll€ltu spremnik obaVljaju same funkcije i o tome programer ne mora voditi računa. dru žen
D irektan p rist up po dacima
Podacim a 1 1 datoteci Ulože se pristupiti d i rek tno , pozicioniranjelIl p okazivača IllCltusprem nikl1 . Fun kcija za pozicioniranje pokazi vača II Illeltu spremni k u defini ran a je u stan d ardnoj ulaZIlo/izlaznoj biblioteci kao:
u
iut fseek (FILE trp, long iut broj_baj ta, int odakle) ; U slu čaju pravilnog pozici o n i ranj a pokazivača u dat o t e c i , funkcija vraća vri jed n ost nula. U suprotnolJl funkcija vraća vrijedn ost razli čitu od nule. Ar gument fp je pokazi vač n a datoteku koji se vraća pozivom funkcije fop e n O , a broj_bajtova od l'c(tuje sljedeću poziciju pokazivača II d atoteci koja ovisi o argumentu odakle. Argu ment odakle određuje mjesto od kojeg ć.e se p okazi vač pomak n u t i z a zad ani broj baj tova i može poprimit i vrijednosti :
287
1 0. 9. Datot eke z
odakle
n a č e
n
j e
SEEK_S ET
pomak za
hroj_hajtova
od početka d atoteke
S EEK_e U R
p om ak z a
hroj_hajtova
od trenutne p ozicije
S E E K _END
pomak za
hroj_bajtova
od
kraja
Deklaracijom argum e n t a hroj_bajtova kao long cioniranje p okazi vača u d atotekam a većim od 64K .
int
datoteke
omogu ćeno je p ozi
Za prikaz d i rek t n og pri stupa pod acim a d atoteke napisat ćemo kratk i p rogram k oji s t vara datoteku TEST . D A T i u pisuje u n j u niz zn akova I I ABCDEFG H i l . Treba proči t ati četvrti znak zadanog niza.
1* d irekt an pr i s t up podac ima dat o t eke *1 # i n clude < s t d i o . h>
main ( )
{
*fp ; ch ;
FILE char
1* deklarac i j a pokaz ivaca na dat ot eku *1
1* s t v aranj e dat o t eke TEST . DAT *1 if « f p = f open ( "TEST . DAT" , " wb " » {
==
NULL )
printf ( " \n Greska s t v aranj a dat ot eke " ) ; exit ( 1 ) ;
} 1* up i s zadanog n iza znakova * 1 f j>r intf ( f p , " ABCDEFGH " ) ; f cl o s e ( f p ) ; •
1* otvori dat ot eku za c it anj e *1 if « fp
{
=
f open ( " TEST . DAT" ,
"rb" »
==
NULL)
pr int f ( l I \n D atot eka TEST . DAT ne p o s t o j i i l i greska otvaranj a I I ) ; exit ( 1 ) ;
} 1* poz l c loniranj e na c e t vrt i znak niza *1 f s e ek ( f p , 3 , SEEK_SET) ; ch = g et c ( f p ) ;
1* u c i t av anj e znaka *1
Ulaz i izlaz
288 pr intf ( " \n Uc itani znak j e : %c " , ch) ; fc l o s e ( f p);
} Rezul t at izvršavanj a program a j e :
Uc itan i znak j e : D Ako pod aci koji su zapi san i u d atoteku nisu tipa char, što zn ači da su d ulj i od jed n og b aj t a, tada se pozi cioni ranje na sljedeći p o d at ak u d atoteci ob avlj a kori štenjem operatora sizeofO . U- n aved enom primjeru p ozicioni ranje na če t vrti znak niza bi bilo
f s e ek ( f p , siz eof (char) * 3, SEEK_SET) ; D i rek tan p ri s t u p pod aci m a u d atoteci p ogo dan je jedin o b aj t ova) u
datoteka j er je d ulj i n a p o d at aka ( izražen a brojem
kod binarnih mectuspremni
ku jedn aka d ulj i n i podataka u datoteci n a disk u . Kod tek s t u alnih d atot eka mogu n as t a t i p roblemi , jer se za u p i s u d atotek u ob avlj aju d o d atne trans form acij e , n a primjer pret varanje para C R- LF ( carriage return-line feee!) u L F ( line fccd) i obr n u t o . .J e d an z n ak iz mectl1 sprem n i ka, prid ru žen og ot vorenoj d ato teci , može se u či t ati i pozi vom getc(fp ) . Vrijednosti koje getcO v raća i argumen t fp imaj u isto znal-enje kao kod fu nkcije fgetcO . .J edina razlika je u tome što je fgetcO fu n kcija, a getcO m akro n ared ba.
Učitavanje niza znakova Fu nkcij a fgetsO u či t ava niz zn akova iz mectu sprem i ka sve do oznake n ovog red a ( ncwliue) , ili d o proči t anog zn aka - 1 . O z n aka n ovog red a postaje dio u či t anog niza, a n a kraj n i z a au tom atski se d o d aje oznaka k raj a niza J \0 J Fun k cij a je p opu t pret h o d n e d efiniran a u s t an d ardnoj b ibliot eci ulazno/izlazni h fu n kcija_ P rototip fu n kcije glasi : •
ehar *fget s ( ehar *strillg, int duzilla, FILE *fp ) ;
Funkcija fgetsO sprema l1 či t an e p o d atke na adresu na koju pokazuje argu funkcije string i vraća pokazivač n a p ro či t ani niz zn akova. U slu č aj u grdke fllll keije v r aća NULL pokazivač. ment
289
10. 9. Datoteke U čitavanj e bloka po dat aka zadane
duljine
P ozi v om fu nkcije freadO u či t ava se bl ok p od at aka z adanih razli čitih d uljin a. Funkcija je definiran a u st an dardn oj bibliot eci ulazno/izlaznih fun kcija. P r o t ot i p funkcije n a,la,zi se u s t d io . h i glasi :
iut fread (void
*huffer,
int
hr_h ,
int
hr...gr upa, FILE *fp ) ;
Z n ačenja p ojedinih argu m en ata i st a su kao k od funkcije z a upis bl oka p o datka - fun kcij a fwriteO . Funk cija vraća cjelobrojnu v rijedn ost k oja pred st avlja broj u či t anih bl okova p od at aka . m anji od broja z adanih bl okova sl u čaja.
koji
se
B roj u čitanih blok ova mož e b i t i
trebaju
u či t at i ,
U p r v o m slu ('aju d ošlo se do kraja d at ot eke.
br _grupa, u
d va
U dru gom sl u čaju
d ošl o je do greške. Z b og t oga je kod poz i va funkcije d obro izvrši ti provjeru broja u či t anih gru pa i provjeru kraja dat ot eke. Ako je b roj u čitanih grup a m anji od broja zadanih gru p a, br _grupa, i a,ko nij e kra,j d a,t oteke, d ošlo je do
greške učitavanja. Z a prikaz funkcije fr e adO napisat ćem o
funkciju
koja u či t ava niz p o
d at aka strukture iz p rimjera koji je d an za prikaz funkcije fwrite O . 1 * u c i t avanj e bloka podat aka * 1
v o id pro c it aj _blok ( ) { 1* deklarac i j a varij abl i * 1 FILE *fp ; struct datum rod ; 1* o t v aranj a dat o t ek e za c i t anj e * 1
if « fp = f open ( " TEST . DAT" , "rw " » = = NULL ) {. put s ( It\n Gre ska otvaranj a dat o t ek e . . . " ) ; e x it ( 1 ) ; } 1* u c itaj podatke iz dat o t eke i spremi ih u s trukturu f r e ad ( trod , s izeof ( struct datum) , l , fp) ;
}
1* i s p i s pro c i t an ih podat aka *1 put s ( " \n Podaci o datumu rodj enj a " ) ; printf ( " \n Ime i Prezim e : " , rod . ime , rod . prezime ) ; printf ( lI \n Datum rodj enj a : %d . %d . %d" , rod . dan , rod . mj e s e c , rod . godina) ; f c l o s e ( fp ) ;
*1
Ulaz i izlaz
290
Funkcij om freadO m ože se u či tat i bilo koji tip p o d at aka, razli či tih d ulj i na. D uljina gru pe podataka koj a se u či t ava z ad aje se argu mentom funk c ije br_b. Najčešća primjena fun kcije freadO je kod u či t avanja: polj a, p olja stru k t u ra, d i n ami č,kih s truktura podataka i slič,no . Najčešće se primjenjuje u p aru s fun kcijom za u pis bloka podat aka - funkcij a fw r it eO . Sljedeća funkcij a za u či t avanje po d at aka iz međuspremnika je funkci ja fscanfO . O n a omogu ćuje funk c ije j e :
formatirano učitatlanje podataka.
O p ći oblik
fscallf (fp, kontrolni-niz, lista argumenata) ; gdje je fp pokazi vač na d atoteku koj i se vraća po z i v om fu n k c ij e fop e n O . Argum enti kontrolnLniz i lista argumenata imaj u isto zn ačenje kao kod funkcij e scanfO. U s t vari funkcij a scanfO je speci j alni oblik funkcije fscanfO g dj e j e d atoteka iz koje se pod aci u či t avaj u standardni ulaz. Z b og toga se funkcij a scanfO m ože zamijeni t i funkcij om fscanfO tako d a argu ment fp bude stdin. Funkcija fscanfO n aj češće s e p r i mj e njuj e u paru s fun kcijom z a form atirani upis podataka - funkcijom fprintfO .
1* f o rmat irani up i s i u c i t avanj e podat aka *1 # include < s t d io . h> main O
{
1* defini c ij a strukture *1 s t r u c t zapos l en i {
ime [20] ; char char . prez ime [20] ; int god_st ; } radnik , rad ; FILE
* fp ;
1* deklarac ij a pokaz ivaca na datot eku *1
1* unos podataka * 1 put s ( " \n Uno s podat aka :
")
;
put s
( " ====================\n"); II ) ; get s ( radnik . ime) ; put s ( lI\n Ime put s ( " \n Prezime " ) ; get s ( radnik . prezime ) ; put a ( " \ n Godina staza ,, ) ; a c anf ( " %d" . tr adn ik . go d _ st ) ;
1*
stvaranj e dat ot eke TEST . DAT
if
« f p = f op en ( " TEST . DAT " ,
*1
" wb" »
--
NULL)
29 1
10. 9. D a t o t eke {
printf ( " \n Greska stvaranj a dat ot eke " ) ; e x i t (1) ;
} 1* up i s podat aka u dat ot eku TEST . DAT *1 fprintf ( f p , "%s %s %d " , radnik . ime , radnik . prezime , radn ik . god_st ) ; f cl o s e ( f p ) ; 1* ot vori datot eku za c i t anj e *1 if « fp = f open ( " TEST . DAT" , "rb" ) )
==
NULL )
{ printf ( " \n Datot eka TEST . DAT ne postoj i i l i greska otvaranj a " ) ; exit ( 1 ) ;
} 1* pro c itaj podatke iz dat o t ek e po zadanom f ormatu *1 f s canf (fp , "%s %s %d" , rad . ime , rad . prez ime , &:rad . god_ st ) ; 1 * i s p i s pro c i t an ih podataka * 1 printf ( " \n Pro c itani podac i : %s %s ima %d godina s t aza" , rad . ime , rad . prez ime , rad . god_ s t ) ;
f c10se (fp) ;
} Rezul t at izvršavanja program a je:
Uno s podat aka :
= = = = � = = = = = = == =
Ime P ero Prezime P etrov i c Godina s t aza 20 Pro c i t ani podac i : Pero P etro v i c ima 20 godina s t az a P rem d a s u
fu nkcije fprintfO i fwriteO
n ajpregl ednij i i
n ajl akš i n ačin
upisa
odnosno či t an j a p o d at aka iz m e(tusprenmika, koj i su prid r užen i d efinirani m datotekam a, zaos t aju u p ogl e d u brzine i s veobuhvatnosti u odnos u n a os t al e osnov n e fun kcije za u či t avanje odnosno
u pis
p o d at aka u datoteke n a
disku . Me(tu t i m , ako je n eop h odn o d a s e p o daci u d atoteci prikažu u i stom
p r i kazu j u n a z aslonu računala ili š t am paču , fprintfO i scanfO mogu postati prednos t .
obliku kao što se funkcija
t ada nedos t aci
292
Ulaz i izlaz
10.9.4.
Funkcij a
-
ffiush O
Sve operacije upisa i u čitavanja podataka u međuspremni čkom sistemu d atoteka odvijaju se preko m eđuspremnika. Prilikom upisa podataka u da toteku , podaci se prvo upišu u međuspremnik, a zatim se prenose u datoteku . Drugim riječima, pozivom funkcija za upis podataka u me(tuspremnik , po daci još uvijek nisu u datoteci . K ada će se podaci iz međuspremnika preni jeti u d atoteku (file) ovisi o stanju me(tuspremnika i karakteristikama p oje dinih d atoteka. Podaci se najčešć.e prenose u trenu tku kad broj podataka prekorači maksimalnu veli činu spremnika ( buffer) u međuspremniku ili zat varanjem d atoteke. Maksimalna veličina sp.remnika u međuspremniku je kod već.ine imp1f�men t acij a jed n aka veli čini jednog bloka. Veličin a bloka je 5 1 2 baj t a i predstavlj a m aksimalnu količinu podataka koja se može preni jeti u /iz memorije u d atoteku u jed nom prijenosu . Ako se hoće da pri jenos podataka u datoteku bude neposredno nakon poziva funkcije za upis podataka u me(tuspremnik , koji je pridru žen od ređenoj d atoteci , mora se pozvati funkcije fHushO. Prototip funkcije n alazi se II stdio.h i glasi: int fHush (FILE
*fp)j
Ako je datoteka otvorena za upis podat aka, tada će se podaci iz mectu spremnika fp prenijeti u pridru žen u d atoteku i osloboditi spremnik u među spremniku za upis novih podataka. Ako je datoteka otvorena za u či t avanje podataka, tad a se sadržaj spremnika u m e(tuspremniku fp briše. Funkcija fHushO vraća cjelohrojuu vrijednost . Ako je vrijednost koju funkcija vrati jednaka uuli , funkcija je u spješno završila. U slučaju da funkcija vrati EOF došlo je do greške. Za prikaz načina djelovanja funkcije fHushO, n apisat ćemo i an alizirati funkcije koje upisuju niz znakova u odre(tenu datoteku . Zadani niz se upisuje znak po znak . fHushO
1 * funk c i j a z a up is n iza znakova - bez vo id up i s _niza ( char * 8 ,
{
ch ;
char
wh i l e « ch
{
FILE * f p )
=
*s++)
!=
i f ( fput s ( ch , fp)
{
' \0 ' ) ==
EOF)
puts ( " \n Greska up i s a . . . . . .
"
)
;
*1
1 0. 9.
293
Datote.ke.
}
}
exit ( 1 ) ;
}
f cl o s e ( f p ) ;
Ako je duljin a niza z nak ova s m anja od jednog bloka (512 bajta ) , tada će niza s biti u d atoteci , tek nakon izvršenja funkcije fcloseO . Svi pod aci s e prenose zajedno. svi p o d a c i
ffiush O
1* funk c i j a za up i s niza znakova - sa
FILE *fp)
v o id up i s _niza ( char * s ,
{
char
*1
ch ;
wh i l e ( ( ch = * s t r ing+ + ) ! = ' \0 ' )
{
if ( fput s ( ch , f p )
{ } }
}
==
EOF)
put s ( lI\n Gre ska up i s a . . . . . . e x it ( 1 ) ;
lt
);
ff lush (fp) ;
fclose (fp) ;
Svaki se p o d at a k niza zn akova fp upisuje i 11 d at o tek u .
s,
neposredno n a ko n
u pi s a u
m eđuspremnik
Korištenje funkcije fflushO usp orava izvršavanje programa, međutim sigurnost u pisa p o dat ak a . N aime, ako dođe do pada sistema zb og n e st a nka elektri čne energije ili slično, postoji velika vjerojatnost da će većina p o dat a ka , koji su do tog trenutka bili upisani , biti upisani i sačuvani u d a t o t e ci .
poveć ava
10.9.5.
Zatvaranje datoteka
Datoteka se zatvara p ozi vom fclose (fp ) ;
funkcije
fcloseO . Opć.i
oblik funkcije je:
Ulaz i izlaz
294
gdj e je argu m en t fun k cije fp pokazivač na d at o t ek u k o j i v rać a fun k ci j a fopen O . Fu n k ci j a fclose O u p isuje p reos t ale p o d atke iz m eđuspremnika
u d a t o t eku na disku , u pisuje ozn ak u kraj a d atoteke EOF i prekid a vezu izm eđu m e (tu spr e m n i ka i datoteke. Zatvaranjem d atoteke međusprem ni k , kojem je b il a pridru žen a d atoteka , s e oslobađa. B u du ć i d a većina opera t i vnih sistema i m a ograni čen broj istovremeno ot vorenih me(tu spremnika, dobro j e u p rogr amu zat vori t i sve d at o t eke k o je n am nisu više potrebne . G rešk e koje nastaju prilikom z a tvar an j a d atoteke m ogu prouzro čiti gubi t ak dijel a ili p ak svih p o d a t aka z ap i s anih u d at o t e c i . Završet kom program a au tom atski se z at varaju sve ot vorene datoteke .
Podaci se m ogu p roči tati sam o iz p rav i lno k reirane datoteke. To zn ači d a se n akon u p i s a p o d at aka u datoteku o n a m ora pravilno z at voriti, Za vježbu probaj t e u pi s a t i pretho dni p rogram h ez fu nkc i je fcloseO i bez ponovnog o t var a nj a d atoteke TEST . DAT za či tanje podataka. Izvedi te progr am i p rov jeri t e r ezul t a t e .
10 . 1 0 .
P reusmjeravanje ulaz / izlaz
S ve van js ke ure(t a j e ko j i i m aj u s p oso bnos t ra z mj ene p o d a t aka s p ro gram om n az ivam o datotekam a. S ve d atoteke koje se koriste u programu m or aj u biti o t vore n e . O t varanje m datoteke p ri d r u žuje joj se m e ctu sp r e mnik . K arak t e r i s t i ke p o j edi n ih d atoteka su različite, m eđu t im , svi mectu s p remni ci su ist i . P rem a t om e , upis podataka, o d nosno č i t anje podat aka iz bilo koje d atoteke ob avlj a se je d n im t e i s t im m eh anizmom . Na pri m j er , p o d aci se na zasl on raču n al a ispisuju i s t om fun kc i j o m kojom se ispisuju na š t ampač. S ve što je pot rebno uradi t i j es t d a se u mjes t o u m e ctusp remnik , k oj i j e p ri d ru ž en d a t o t eci s t an d ardnog izl aza, p o d aci u pi s uj u u m e đu s p re m n ik k o j i j e p ri d r u žen d atoteci štam pača. Takav k on c ep t ulazno/izl azni h operacija veom a je pogod an z a preusmje
ravanje podataka izme(tu različitih ulazno/izl aznih ure(taj a ( d a t o t eka ) . U o p e r a t i v n im sistemima D O S i U N IX oznake za preusmjeravanje ulaz i /izlaz s u < i > . Nared hom type ime_datoteke, u opera t i v n om sis t emu D O S , sadržaj d atoteke ime_datoteke isp i s u je se na zaslon račun ala. Pre u s m j eravan j em s e s ad r žaj d atoteke ime_datoteke m ože u p isa t i u b ilo koj u datoteku . Treb a imati n a umu d a je preusmjeravanje ( r e d ir ekcij a ) ka rak teristika pojedinih operat i v nih s i s t em a , i d a preusmjeravanje obavlj a sam operati vni sistem . Me(tu t i m , koriš tenjem među spremui čkog si s t em a datoteka preu smjeravanje ulaz/izlaz iz e-a postaje vrlo jednos t av n o . Za
PreusmjeratJanje ulaz/izlaz
1 0.10.
295
prikaz n aveden og n apišimo program ispisi koji sadržaj datoteke, čije se ime zad aje pokretanjem programa ( command line argument) , ispisuje na zaslon računala ili na štampač. Program ispisi ekvivalent an je naredbi type ope rativnog sistem a D O S . preusmj eravanj e ulazi izlaz 1 * program ispisi poz i v a programa : i s p i s i ime_dat o t eke 1* ( i s p i s na zaslon) 1* ispis ime_dat o t eke > lpt l 1* ( i s p i s na stampac ) 1*
*1 *1 *1 *1 *1
# include < s t d i o . h> # include < s t r ing . h>
DA NE
#def ine #d ef ine v o id main ( int
{
FILE int char
1 O argv . char
* argc [] )
*fp ; i s p i s _na_stampac ; ch ;
if ( argv < 2 )
{
put s ( " \n Program se kor i s t i kao : i s p i s i ime_dat => i s p i s na zaslon" ) ; put s ( " \n Opcionalno i s p i s i ime_dat > lpt l => i sp i s na s t ampac " ) ; exit ( 1 ) ;
}. 1* otvori datot eku * 1 if « fp = f open ( argc [ l ] . "rb " »
{
= = Hl)LL)
print! ( " Gr e ska otvaranj a datot eka y.s " . arg c [1 ] ) ; exit ( 1 ) ;
}
if « strcmp ( arg c [2] . " > " ) == O) tt ( strcmp ( arg c [3] . " lpt 1 " ) -- O »
296
Ulaz i izlaz
wh i l e « ch
{
}
}
Izvo(tenjem
=
g et e ( f p ) ) ! = EOF)
if ( i s p i s_na_ stampae ) put e ( eh , stdprn) j else put e ( ch , stdout ) j
1 * i s p i s na s t ampae * 1 1* i s p i s na zaslon *1
p r ogra m a sadržaj z ad an e d atoteke i s p i s at
će se n a z as l on računa vj e žb u p oku šajt e prošir i t i p rogram tako da se sadržaj ' datot ek e m ože u p i s a ti u bilo koju datoteku (št am p ač , d ruga dat oteka na disku , zasl on i sli čno) .
la ili na š t am p ač . Za
,
1 1 . D O DATNE M O G U C N O S TI TURB O C-a
U prethodnim poglavljima objašnjene su osnovne kar ak teri st ike i mo gu ćnosti program skog Jezika C. S ve što je n apisano odgovara ANSI e stan d ard u . Prema tome, kod programa koji ste napisali i koji radi korek tno možete bez velikih teškoća prenijeti i izvršavati u bilo kojoj verziji e prevo dioca, naravno uz uvjet d a podržava A NSI e standard .
Prolazeći prethodnim pogl avljim a stekli ste sasvim dovoljno isk u st va i znanja d a va.m ovo pogl avlje ne bi trebalo stvarati poteškoće. Informacije sadržane II ovom pogl avlju karakteristične su za T U R B O C . One će vam pomoći da kodiranje bud u ćih program a u T U R B O e-u bude brže i efikas n ije . Naravno d a po re d onoga što će biti opisano, TURB O C i m a i niz drugih mogućnosti. Međutim, opis svih mogućnosti T U RB O C-a p r el az i okvire ove knjige.
Doda t n e m ogućn osti TUR B O G- a
298
11.1.
Razbijanje izvornog koda programa datoteka
II
više
P ro g r am i sad ržani u p ret h o d nim p ogl avlj i m a i oni k o j e s t e p i s ali u čeći p rogram s ki jezik e n i s u ni pribli ž n o složeni kao p r ogr ami koji rješavaju konkret n e p rogram ske zad atke. Rj eš av anj e m konkretnih program skih za d at aka i z vorni k o d je čes to pu t a mnogo v e ć i i sl oženij i . P ron al aženje i otk la nj anj e sin t ak snih i logi čkih g r ešaka u t ak v i m p r og r ami m a, čiji b i se i z vo r n i kod n alazio u j ed n o j d a t o t eci , bilo b i veoma teško . K ao ol ak š i cu T U R B O e d aj e m ogućno s t r azh ij an ja i z vor n og koda program a u više d at o t eka.
R az b ijanje i z vo rn og ko d a p ro g r am a II više d at o t e ka i m a n e koli k o pre d nos t i . P rije svega, ure / AISI
v i ol at i ons
COlllDlon errors Less c ommon errors
1------
Ft -Belp
FS-Zoom
F6- S w i t ch
S l ika
Il e s s age
F7-Trace
--------1
FS-St ep
F9-Kake
F 1 0 -Kenu
lUlI
A .4 . Dodatne opcije izbora Errors
p ovez i vač će p'o t r a ž i t i sve n edefi n i r an e m o dul e
II
s vi m bihl i o tekam a fu n k c ij a .
A k o se vrijed n ost op c ij e zad a kao Off, t a d a se koriste s am o T U RB O b i blioteke fu nkc ij a , o d nosn o fu n k c ij e ko j e su p revedene T U Rn O C-om.
C
Gmpllics libm ry omogućuje
i zvršavanje program a, koji poz i vaju funkcije iz grafi čke biblioteke fu n kcij a , iz objedinjenog rad n og okru ženj a . Tak va m ogu ćnost nije postoj al a u prethodnoj v erz ij i Ver. 1 ..5 . Me(tu tim , zadava njem vrijed l1 0 s t i O n vrijeme p ov e z i v anj a program a b i t e.e n e š t o du lj e . A ko je vrijednost o p c ije Off, t ad a . se p rogram i , koj i sadrže p oz i ve fun k c ij a iz grafi čke biblio t eke , mogu prevo d i t i st varanjem P roject datoteka k o j a će uklj u či t i b i bl i o t ek u grafi čkih funkcija, grap hics . lib . Wam duplica te symbols može p o p rimi t i v r ij Nl n os t i O n i O ff.
d avanj em vrij f'( \ n os t i O n povezi vač e.e jav i t i
poruku u
korisni čki defini ran e fun kcije j ed n ako im en u fu n k c ije li o t e ka m a fun kcij a . P re tp o s t avlj en a vrijednost je O ff.
u
Za
sl u čaj u d a je i m e s t an d ardni m b i b
onemogućava/omogućava dojavu poruke No stack. N a ved en a p o ru k a obavezn o se p oj avljuje kod Tiny m emorij skog modela. Stack waming
Case sensitive link
mehi��toriE!� •.••.• Inc:lud8 . d iredories ; Library d i r e c t o r i e s :
)X;Sl'c\ijg.@ E / · · C : \TC\L I B
Output d i r e c t ory : Turbo C d i r e c t o r y :
C : \TC
P ick f ile name : Current p ick f i l e :
j-----F l -Help
F S - Z o om
F6 - S w i t ch
Message --------1
F7-Trace
F8-S t ep
F9 -Make
F 1 0 -Menu
IUM
Slika A . 8 . Dodatne op cije izbora D irectories D o d at n e
o p c i je omogu ćuju p r omjenu osnov n e podatkovlle s t rukture de
finiran e s t an d ard nim T U RB O e - om . In cludc dircctor'ic8 o d r e ctuj e
direktorij koji sadrži s t an d ardne d at o t eke
koj e s e u klju čuj u u p rogram preprocesorskom n are d b o m # include, a koje sadrže proto t i p ove i s i mboli čke kon stante s t an d ar dnih funkcij a T U RB O
e bib l i o t e k a
funkcija,
S t an d ardni direktorij definiran T U R B O e-om j e
c : \ t c \ include.
L ibmr'y dirccto1'Žcs o d rectuje direktorij koj i s adrži s t an d ar d n e b iblioteke fun kcij a T U RB O e-a. Ako se u kaže potreba d a se s tvori vlas t i t a bib
lio teka funkcij a,
i
da
se on a o d voji od s t an d ardni h b i bli o teka , t ad a se m ože fe sadržavati s tvorenu bih
s t vori t i novi direk torij , n a primjer M Y D IR, koji
lio t ek u . U tom slu čaj u s e izh orom n avedene op cij e t reb a zadati c : \ t c\ lih j c : \ t c \ mydir
A . Postavljenje op timaln og ra dnog okruže nja
326
o d rc(tllje II k o j i će s e di r ekt or ij s p r em a t i sve izvršne ve r z i je pr og r a m a n a s t al e p r c vo (te nj e m program a. Ako se dr u k č i j c ne zada, s t an d ardni i zl az n i d i r e k to rij je c : \ t c . Tr eb a n a gl as iti d a d ir ek to r ij koji se z ad aj e II n av e d e n oj op cij i mora biti definiran ( kr e iran ) . Output dir'ector'Y
Tu rbo C directory određuje direktorij II kojem su z ap i s an e s v e d a tot e k e n eo ph od ne z a p o k r e t an j e T U R B O e-a. D irektorij se s t vara i n s tal ac ij o m T U R B O e-a. Pick file name s a d r ž i
o s am u č i t an i h d a to t e ka . C1l1Te n t pick file
c ij o m Pick file name.
ime d atoteke u koj u se
p o h r anj u j u
imena zadnj ih
p r i kaz u j e i m e i lokaciju .d atot ek e koj a je zadan a op S t an d a rd n a d atoteka d efiniran a T U R B O e-om je
T CP I C K . T C P .
Arguments
Z ad avanj e a rgu m en at a funkc ij e main O m ože se o b av i ti i i z v o (te nj em pro ohj e di nj en og radnog ok r u ž enj a . Izb orom op cije A r g u m e nt s ot
gram a iz
vara se prozor u koj i se u pisuju s n ajmanj e j e d n i m razm akom .
n avedeni ar gu m e n t i . A r gu m e n t i se o d vaj aj u
S ave options
I z b o r om op c ij e S ave optio n s sprem a s e p o s t avljeno radno okru ženje. S t an d ardna d atoteka u koju se p oh r anj u j e p ostavljeno radno ok r u ž e nj e je TC CONFIG. T C . Me(tu tim , odre(tene k onfi gu r acije rad n og okruženj a , sp eci fi čn e za odre