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
<10.3. Standardne d at ot e k e, 263 10.4. Standardne ulazno/izlazne 10.5. 10.6. 10.7. 10.8.
funkcije,
264
Funkcije - gets(), puts(), 265
Formatirani ulaz - scallfO, 267 Formatirani izlaz - prilltfO, 270 Funk c ije sprilltfO i sscanf(), 274
10.9. Datoteke, 276 10.10. Preusmjeravanje ulaz/izlaz, 294 11.
DODATNE MOGUĆNOSTI TURBO e-a, 297
11.1. Razbijanje izvornog koda programa u više datoteka, 298
Prevođenje programa sastavljenog. iz više datoteka (Project file), 299 11.3. Stvaranje vlastitih i p romjena post.ojećih biblioteka fun k cija , 303 11.4. Povezivanje vlastitih biblioteka funkcija i programa, 305 11.5. Uključivanje naredbi ASSEMBLER-a u izvorni kod programa, 11.2.
307
11.6. Prevođenje programa izvan ohje-
c1injenog radnog okruženja, 309 Uslužni program - G RE P , 312 11.8. Uslužni program - NORTON 1 1 . 7.
GUIDE, 313 A.
Postavljenje optimalnog radnog okruženja, 315
Kazalo pojmova, 329
UVOD
Programski jezik enastao je u AT&T Bell Laboratories, u težnji da se stvori programski jezik koji će omogućiti brzo i efikasno programiranje. Bud u ći da su osnovni problemi kojima su se bavili u AT&T Bell Laboratories bili vezani uz s istemsko programiranje ( pisanje operativnih sistema) , novi programski jezik trebao je zadovoljiti prili čno visoke kriterije. Trebao je biti , s jedne s trane, n a dovoljno niskoj razini da bi se riješili svi problemi koji su se d otad rješavali uglavnom u ASSEMBLER-u , a s druge strane trebao je biti na dovoljno visokoj razini kako b i se iskoristile sve prednost i i pogodnosti programskih jezika više razine. Sad a s e već može reći da s e u tome i uspjelo. To pokazuje niz programskih paketa pisanih u e-u , odnosno cperativni s i s t cm UNIX koji je svojim najvećim dijelom pisan u program skom jeziku C. Programski jezik C bio je dugo t ijesno povezan s UNIX, verzijom 5, ope rativnim sistemom. Osnovne postavke n aslije(tene su od programskog jezika B , odnosno TJrogramskog jezika BePL koji jc prethodio programskom jeziku B. Prva i m plementacija e-a bila je n a računalima DEe PDP-ll koja su koristila UNIX operativni sistem. Glavne postavke ea- postale su dostupne širem krugu korisnika 1978. gQdine, nakon pojave prvog izdanja k nj ige "The e Programing Language". Autori knjige B1'ian W. J(erninghan i Dennis M. Ritchie ujedno su i t vorci programskog jezika e. O d tada je e krenu o u osvajanje sve većeg- broja korisnika. Dan as se slobodno može refi da je C . postao programski jezik br�j 1. S razvojem mikroračunala pojavio se niz implementacija e-a. Samo za računala koja rade pod operati vnim sistemom D OS postoj i nekoliko imple mentacija: TURBO e, QUIeK e, LATTIeE ei druge. Zbog toga je 1983. godine osnovan komitet koji je trebao standardizirati programski jezik C. Kao rezultat t oga nastala je jezgra standarda programskog jezika e, ANSI e standard. Baza za razvoj ANSI estandarda je bio U N IX C. Na osnovnu jezgru ANSI eje d odao nekoliko mogu ćnosti koje olakšavaju programiranje. TURBO e sadrži potpunu implementaciju A NS I e-a. Ono što TURBO e izdvaja od ostalih implementacija jest veoma dobro okruženje. U pro gramski paket T UR B O e uključen je ure(tivač teksta ( EDITOR ) , prevodilac
2
Uvod
(COMPILER), p rogram za povezivanje (LINKER) i p ro gra m za o t k riva nje i . uk l anjanje grešaka (DEBUGER). Tak v o ok ru ž enje pruža velike mog ućn o sti za raz v oj programa, i to ne samo za one koji v eć zn aju program s ki j ez i k C već i za one ko ji ga uče. Mog u ćno st i z v rša vanja p ro gra m a kor ak ]lO ko rak , g d j e se u s va kom trenutku mogu doznati v rije dno s ti p oje d i n ih v ari jabli i stanje s t o g a (.I/tack) o m o g u ćuje programeru da i sp i ta tok p r o gr am a i da uoči sve l og i čk e g r e š ke n as t ale u tok u ko dir anja . O s im toga p o mo ć ( HELP ) dostupna je u svakom t renu t k u p i s anja p r ogram a . U Cpro gr am mogu se direktno u ključi vat i blokovi n aredbi ili poje d i ne n aredhe pi sane u ASSEMBLER-u. Mogu ćnost uključivanja asemblerskih n a red b i u iz v orni ko d p ro grama, kao i m 0!1\ućnos t direk t nog pristupa i ruko vanja p oje din i m b i to v im a, b aj tov i m a i blokovima memorije čine program sk i jezik Cveoma pogodni m za pisanje s i st em s k ih p rogr ama .
U C-u
n e m a mnogo provjeravanja .tokom izv ršavanja p r ogram a
time checking),
(run
su, na p r imjer , provjeravanj e p rekorač e n ja i n de ksa p olj a , provjera van je t i pova po dat aka koji se n al az e II poz iv u fu nk ci je i slično. Ta provje r avanj a bi z ah t ijevala poduzimanje dodatnih akcija. Samim tim bi se s manj il a b rzin a p rograma . Zb og toga pro g ram ski j ezik e z ah t ij e va određenu disciplinu u toku p i s a nja pro gr am a . M e đut im , dis c iplin a u toku pisanja programa je nagra(t ena brzim i efi kasn i m pro gram im a . Brzin a p ro g ra m a p i s anih u C-u može se m j e r i ti brzinom i efikasnošću p ro grama pis anih kao što
u
ASSEMBLER-u.
O sno v ni tipov i podataka II C-u su znakovni (chamcte7·), cjelohro j ni (in i b roje v i s p o m ični m zarezom (float). Cn ije st rogo t ip s ki orijen ti r an . Dozvoljene su gotovo s ve vrste p ret varanja ( konv e rzije ) ti p o va po d at aka . U i zraz i m a se mogu komhini rati raz li č iti tipov i p o dataka. Kra jnj i rezultat i z raz a , u k oj em se nalaze različiti t ipovi podataka, ov i si o llgra(tenim p r a v ilima za pr e tv ar anje ti p o va podataka. M e(tu t i m , ti p re zul t a t a p ro g r a m er mo ž e z ad ati i e k s pli ci te.
teger)
Osi m o s nov n i h, p os toji i nekoliko s lo ženiji h tipova podataka, kao što su , s t r u k t ure, p olja struk tura, unije i po lja bito va. O mogućeno je i defini
polj a
ranje vlast itih tipova podataka. Primjena p ok azi v ač a omo gućuje s t var an je dinam i č kih s tru k t ura p o d a t a ka i efikasno iskorištenje r as p ol o ži vog memo rij s kog prostora. Pokazivači u C-u su m nogo fleksibilniji nego u o stalim p ro grams ki m je zi ci m a . Za razliku o d većin e p rogr amskih j ezika, p okazi v ači u C-u mogu pokaz i vat i i na statičke strukture p o d a t aka. Raz li č i t o s t t i po va p o d at a ka i mogućnost defi nir anj a vlastitih tipova po dataka je v rl o dobra podloga za razvoj apl i kacij a u gotovo s vim p o druč jima.
N aj p ogo d nij i način rješavanja programskih prohlema jes t r ast avljan j e u niz manjill , me(tusobno povezanih cjelina (modularno p ro grami-
p ro bl e m a
Uvod
3
ranje). Ovaj prist u p rješavanju problema p o držan je i II e-u. Programi u e-u s astoje se o d niza me
t u re, unije ili p okaziva če. S funkcijama se u programu ruku je kao i svim ost alim tipov ima pod at aka. Funkcije se mogu pojaviti u izrazima, mogu biti argumenti tl pozivu druge funkcije, mogu biti pozi vane rekurziv n o i sličn o . Međutim, svaka funkcija definira s e odvojeno. To znači d a s e uIlutar jedne funkcije ne može d efinirati druga funkcije. Funkcije
u
e-u se n ajčeš
će defini raju tako d a o bavljaju jedan zad atak, odnosno jed nu akciju. Sve funkcije koje s u dovoljno o pćeni te, što znači da se mogu primijeniti u većini programa, smješt aju se u bibli o teke funkcija. Osim standardnih biblioteka funkcija, mogu se definirati i vlas t i t e biblioteke funkcija. Programsk i jezik e s adrži s ve naredbe neo phodne za struk turiran o pro
gramiranje: naredbu višestru kog grananja
(if-else),
naredbu za izbor jedne
o d niza mogućnos t i ( switch-case ) , n aredbe za ponavljanje bloka n aredhi; petlju (dO-Whil e), s i spi tivanjem u vjet a izlaska iz petlje na k raju bloka n aredbi i petlje ( f or - wh i l e) s isp i t ivanjellll1vjeta izlaska iz petlje na početku petlje. Iako je e programski jf'zik relati vno niske razine programi pisani u
njemu imaju visok
stupanj
prenosivos t i . To znači da
se
izvorni kodov i pro
grama mogu, bez go t ovo ikakvih promjena, izvodi t i na različitim račun alima, ko ja r ad e pod raz1iNtim o perativnim s i s temima. Visok stupanj pren osivo s t i p rograma post ignut j e neugrađivanjem n ared bi koje direk t n o ovise o kon
figur aciji račun ala. Zbo g toga u
e
nisu u gra
Sve n aredbe za ulaz i izlaz podataka riješen e su ulazno/izlazni m funkcijama. Funkcije su d efiniran e II stand ardnoj ulazno/izlaznoj biblio teci funkcija. Pozivi ulaZIlo/izlaznih funkcija" standardizirani
Sl1
i ne
ovise o
tip u raču n ala
ni o operat iv n o m sistemu na kojem se radi . .Jo š je/:lna karak teristika. e-a je i veo ma mali broj u gra
riječi) . ANSI C s adrž i svega :32 ključne riječi. Za u sporedbu naves t ćemo da mM PC BASIC ima "s amo " 159 klju čnih riječi
(ključnih
1. OSNOVNE KARAKTERISTIKE TURBO C
..
a
Programski paket TURBO C proizvod je programske kuće BORLAND. BORLAND je poznat po nizu programskih proizvoda koji se koriste na IBM PC računalima (TURBO PASCAL, SIDEKICK, PARADOX i drugi). Os novna karakteristika BORLANDOVIH proizvoda je cjelovitost, što znači da se programski proizvodi nastoje kompletirati tako da sadrže sve neophodne alate. Programski paket TURBO C sastoji se od programa za uređivanje teksta (EDITOR), prevodioca (COMPILER), programa za povezivanje (LIN KER) i programa za pronalaženje i uklanjanje grešaka (DEBUGER). Svi alati su objedinjeni II jedno radno okruženje koje omogućuje ure
rilago(ten strukturiranom pisanju programa. Mectutim, ako ste u dosadašnjem radu koristili tekst procesor WORDSTAR ili SIDEKICK-ov ure
Osnovne karakteristike TURBO G- a
6
1.1. Sadržaj programskog paketa TURBO e Programski paket T U R BO C, ver. 2.0, nalazi se na Šf'st disketa.
Na
jednoj od diske t a je pr ogr a m INSTALL koji će vam pomoći pri instalaciji p rogr am a . U programski paket T U R B O C uključen je prevodilac ( COM PILER) , program za p ov ez i va nje ( LINKER ) , progr am za UfNti vanje teksta
(DEBUGER). k o ri s t i t i u zajednič,kom r adn o m okru
(EDITOR) i program za pronal aženje i ispravljanje grešaka
Svi p rog r am i su objedinjeni i mogu se ženju
(intcgmtcd cnvironmcnt)
ili kao zasebni moduli. Za početak je dohro
radi t i II o hje d i nje n o m r adnom okruženju jer je pisanje i p re vo (tenje programa
mnogo hrže i jednos t av nije.
1.2. Instalacija Bez obzira n a prethodna iskus tva u korištenju računala i programskih p aket a, inst alacija T U R B O C-a t oliko je jednostavna da zaista ne možete
Pri instaliranju postoje dvije mogucnosti. TURBO C m ože te (hard) disk il i na d i sk etu (floppy disk). Instalacije na t v rdom disku rade zn atno brže. No krenimo na ins t alaciju. N a jednoj
pogriješiti.
instalirati ili na tvrdi
od disketa, koja je ozn ačen a kao INSTALL/HELP, nalazi se program za (floppy disk) A i
inst alaciju. Stavite označen u disketu u di ske tnu jedinicu napišite INSTALL
A:\> INSTALL Nakon pokretanja programa na zaslonu računala pojavit će se prikaz kao na sli ci 1.1. Na kon toga pritisnite ti pku ENTER. Inst alacija p rogram a može se u b il o ko jem trenutku prekinuti prit i sk o m na tipku ESe. Budući da daljnji t ok instalacije vodi sam instalacijski p rogram , nećemo se zadržavati
objašnjavajući svaki p ojedi n i korak inst alacije.
Dobro je zn ati da se za
odahire disk A, a za odredišnji ili ciljni (target) disk, disk e o dnosno onaj dio diska (particija) na ko ji će se TURBO e instali rati, e, D i sl. Ostale upute o instalaciji dane su programom. Na kraju ins t alacije provj e ri te vrijednosti koje su p r i dr u ž ene paramet rima FILES izvorni
(smtrce)
disk
i BUFFERS u datoteci eONFIG.SYS. Vrijednosti k o je se pridružuju,
t rebaju biti najmanje 20. Dakle, zadnji korak inst al acije s a st o j i se u p r ov
jeri sadržaja datoteke CONFIG.SYS. U eONFIG.SYS dat oteci svakako bi t rebale bit i linije:
FILES
=
20
1.2. Inslalaciia
7
:::««:<: :::il ····tt:: t:mfffUi\\ : :: . .. . · :: ... : .. : :·,n: : : : : : : : : : : i: :i : : �: :!: i : .,' ',. . . : ·:':: : :i::::: :[: :!:i: :::::::)·iI:� � �:::::� :: :�:::::i.i::i:>.::,: ::::i:::�: : :::�:::: t::::.·· li} .••.•.. ,",:,o..::���;�;';ili Tu rbo
C
2.0
Instalation Utility
. .
00",'0"
Cd ,os.
by Borl'"
,------ Install Utility Version Welcome t o the Turbo vilI copy
the
e
1.0 ------.., .. This program
instalation program.
fil e s needed t o install Turbo C on your
system Press EITEl to c ontinu e, ESC to quit
.
EITE1-Continue ESC-Cancel
Slika 1.1. Osnovni zaslon pri instalaciji programskog paketa TURBO e BUFFERS
=
Ver. 2,0
20
Prav ilnom in stalacijom TURBO e-a stvori t će se osnovni direktorij TC i poddirektoriji LIB, II kojem se n alaze bibli oteke funkcij a , i INCLUDE,
u ko jem se nalaze datoteke p rototipova svih funkcij a iz biblioteka, kao i d efinicije s v ih potreb nih simb olički h konstan t i i globalnih varij abli .
Instalacijom programa postavljen o je sta n d ardn o radno okruženje u ko
jem je d.efin iran memorijski m o d el, n aredbe u re(ti vača t eksta, boje i sl. Promjen a sta n d ardnih vrijedn osti može se izvršiti p okret anjem programa
TCINST, koji se n al azi u osnovnom direktoriju TC. Me(tutim , promjenu defini ranih p arametara trebalo hi odložiti za kasnije. U slučaju da p osjedu j ete kol or m onitor možete postaviti vlast i tu paletu boja.
8
Osnovne karakteristike TURBO G-a
1.3. Pokretanje TURBO e-a Pretpostavivši da tokom ins t al acije nije došlo do nekih problema i da su u d atoteci C O NFIG.SYS par ametrima files i buffers p ridružene prave vrijednosti, došli smo do t renu tka kada se može pokrenuti TURBO C. Za pokret anje objedinjenog r adnog okruženja dovoljno je upisati
C:\TC> 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
.
.
Dod atne opcije ovog izbora omogućavaju:
izv ršavanje progra m a korak po korak (funkcijske tipke F7 i izvršavanje programa do mjes t a l'Ia kojem
(cursor)
-
FB )
se trenutno nalazi značka
(funkcijska ti pka F4 )
p rek id izvršavanja programa u modu korak po korak ( istovremeni p ri i funkcijsku tipku F2).
tisak na tipku CTRL
Dod atne opcije, koje su na raspolaganju u slučaju izvrš avanja programa u modu korak po korak, mogu se d obiti i tako d a se prvo izabere Run, a zatim streli cama gore-dolje izahere odgovarajuća dodatna opc.ija. Izbor Compile s adrži p et dodatnih opcija.
Prva opcija omoguCllJe
prevo(tenje izvornog koda u relokatibilni objektni oblik i dodjeljuje
mu
do
datak .OBJ. Da toteke s d oda tkom .OBJ su datoteke koje je neophodno
(linking) s ostalim mod ulima da bi se dobila izv ršna verzija pro grama. O datotekama ti p a .OBJ bit će više riječi u p oglavlju 11 ( Dodat ne m ogućnosti TURBO e-a). Druga opcija izbora Compile je Make EXE file. Odabiranjem ove opcije obavit će se prevo(tenje i povezi vanje programa i stvoriti i z vršna verzija programa. Izvršna verzija je smješ tena II tekući i li radni di rek t orij. Nakon što je s tvoren a izvršna verzija p rograma, program se ne i zvodi, kao što je to slučaj pri izb oru Run, n ego se ponovno vraća u ure
stvara izvršn u verziju programa. Kao i kod prethodne opcije, izvršna verzija pohranjena je II tekući ili radni direktorij. Četvrta opcija Build all obavlja
p onovno prevo(tellje i povezivanje svih programa koji se nalaze u datoteci t i pa .PRJ.
O
datotekama ovog tip a kao i o objašnjenju ove opcije biti će
još riječi u ll. poglavlju. izvornog kod a koja
Opcijom
Primary
C
file definira se datoteka
će se, ak tiviranjem opcija Compile ili Run, prevo di ti,
o dnosno za tu datotekll će se stvoriti izvršna verzija programa bez ohzira koja se datoteka treIl11tno ure(tuje. I na kra ju, opcija Get info d aje pregled
pod ataka o stanju r adnog okruženj a, odnosno p o datke o trenu tno nre(tivanoj datoteci, veličini ra.<;po]ožive memorije i slično.
LI. Osnovni izbor
13
Project O va će se opcij a detaljnije objasniti tl poglavlju koje ohra(tuje problematiku stvaranja složenijih programa (poglavlje ll). Za sada recimo samo to da se unu tar ove opcije zadaje datoteka koja u sebi sadrži imena datoteka i zvornih .C ili relokatibilnih .OBJ datoteka koje č.in e jedan program. Pri stvaranju izvršne verzije mora se aktivirati datoteka koja sadrži nazive da toteka izvornog ili relokatibilnog koda, datoteka s dodatkom .PRJ .
Options Izbor Options sadrži, kao i prethodni izbori, dodatni izbor koji se sastoji od opcija: Compiler Linker Environment Directories Arguments Save options Retrieve options . Unu tar dodatnih izbora postoji n i z opcija kojima s e postavlja optimalno radno okruženje, odnosno okrnženje koje n ajbolje odgovara problemu koji se rješava. Instal acijom TURB O C-a postavljeno je standardno radno okru ženje kojeje optimalno za velik broj slučajeva. Zbog toga se u ovom poglav lju n ećemo zadržavati na ob�ašnjenjima opcija dodatnih izbora. Ako n etko želi, prije nego uopć.e upozna mogućnosti programskog jezika C, mijenjati i postavljati dodatn e opcije radnog okruženja, opis opcija dodatnih i zbora d an je u prilogu A Postavljanje optimalnog radnog okruženja. -
Debug i Break/Watch Opcije Debug i Break/Watch su dvije opcije osnovnog izbora. Me
14
Osno vne karakteristike TURBO G-a
Izbor Deb ug se sastoji od šest opcij a dodat n og izbora. To su: - Evaluate (Ctrl F4). Kori štenj e opcije omogu ćuje p romj e nu vrijed n osi lokalnih i globalnih varijabli , te vrijedno s t i članova polja. - Call stack. Buduć.i da se argumenti funkcija u e-u p reno se preko stoga (.5ilU:k), p o nekad će b i ti potrebno vidjeti stanje stog a. Pogotovo se to odnosi na one dijelove programa koji ko r i s te rek urz ij u . Odabirom n avedene opcije na zaslonu računala pojavit će se prozor u koj e m piše trenutno stanje stoga. Najneugodnije greške, koje nije mogu će otkriti ni d etaljnom logičkom analizom programa, ot k r ivaj u se upravo p r ovj e ravanj em stanja stoga u t ok u izv r šavanja programa. - Find function. Opcija se kor i s ti u slu čaj u kad se izvorni kod n al az i d atote ka. Kad se II prozor koj i se otvori prilikom izbora ove opcije upiše ime funkcije, tada se p rogram izvršava sve d ok ne naiete n a zad an u funkciju (ako u d i jelu koda koji pre th odi zadanoj funkciji nije postavljena nit i jedna p rekidna to č ka). u više
- Refresh display. Za opis ove o p cije dovolj an je i koji manje poznaju engleski ): Obnovi sadr žaj zaslona.
prijevod
(za one
- Source debuging. Vrij ednosti koje su dostupne izborom ove opcije su On, Standaione i None. U slučaju da se tokom testiranja program izvršava korak po korak , da bi se i s kor istile sve m og uć nosti programa za pron al aženje grešaka, vrijednost ove opcije mora biti On. Postavljanjem vrijednosti na On program je n ešto veći. Ako se želi da izvršni program bude manji i neš to brži, vrijednost n avedene opcije t reba po s t aviti n a N one. U tom slučaju treba zaboraviti na mod izvršavanja p rogram a korak p o kor ak (t1'aCC mode). Ako se vrijednost opcije Source debuging postavi kao Stand alo ne , t ada je izvršavanje programa korak po korak mog u će samo kad se izvorni kod program a n alazi u jed noj datoteci. Praćenje promjena v r ij e d n osti va rijabli , polj a i pojedinih članova polja tokom izvršavanja programa postiž e se izborom opcije Add watch ili Ctrl FT, d o d at n og izbora Break/ Watch. Vr ijed n os ti varijabH k oj e se prate nalaze se u prozoru za poruke. U s lu č aj u d a nema više potrehe za praćenj em , izabire se opcija De le t e wat ch. Izborom opcije Edit watch omogućuje se p re i m e n o vanje praćene varijable. Remove all watches nije potrebno posebno ob jaš nj avati. Reci mo da to znači : ne zanim a me više p r omjena v rije d n o sti ni t i jedne var ij ab l e II p rog r am u .
Izvršavanje programa korak po korak je pri li č no zamorno. Zamislite jednu petlju koja ide od O do 100, a vi ste u mod u izvršavanja programa ko rak po ko r ak (t1'ace mode). A da ne govori m o o većim p e tlj am a i od sječci m a
1.5. Prozor za uređivanje programa
15
programa koje ste već ispitali. Postoje dva n ačina da se izbjegne izvođenje programa korak po korak II dijelovima koji" su već ispitani ili u petljam a, a da se ipak ostane u modu izvo(tenja programa korak po korak . Prvi n ačin smo već spomenuli . To je izvršavanje programa do mjesta n a kojem se trenutno n alazi značka (cursor) - fun kcijska t ipka F4. Drugi i mnogo češće korišten način je postav1janje prekidnih točaka (breakpoints). Postav1janje prekidnih točaka u programu obavlja se izborom opcije Toggle breakpoint ili pri tiskom na tipke Ctrl i FB. Izvođenje programa do preki dne točke ne mora biti u modu korak po korak. Naime, izvođenje programa će se zaustaviti nailaskom n a prvu prekidnu točk u . Izvršavanje programa od prekidn e toč.ke može se n astaviti u modu korak po korak, do s1jedeće prekidne točke ( op cija View next breakpoints) ili do kraja programa (t i p ke Ctrl i F9 ) . O p c ijom Clear all breakpoints hrišu se sve prekidne točke u programu . Korištenje programa z a pronalaženje grešaka u programu (DEll UGER) je veoma jednostavno i dobro ga je koristiti, pogotovo n a početku rada i kod velikih programa .
1.5.
Prozor za uređivanj e programa
Pokretanjem TURBO C-a na zaslonu računala pojav i se osnovni ( glavni ) izhor, prozor za ureftivanje program a, prozor za poruke i status linija . U prozor za lIreftivanje programa prelazi se izborom opcije Edit. Neposredno nakon odabira značka (cu7'sor) se postavi u gornji lijevi ugao. To je znak da se n alazite u u re đivaču teksta i da možete poč.e ti sa pisanjem novog pro gram a odnosno teksta, ili s u re(tivanjem postojećeg kojega ste prethodno učitali . Prozor za ure(tivanje teksta napušta se pritiskom n a t ipku FlO, što d aje osnovni izhor, ili pritiskom na tipk1.1 F6, što vas dovodi u prozor za poruke, ili istovre m enim pritiskom na t i pke Alt X, čime se n apu šta TURBO C okru ženje i vraća u operativni sistem .
1.6.
Prozor za ispis poruka
Prozor za ispis poruka nalazi se ispod prozora za u re(tivanje tekst a i zau zima m anji dio zaslona. P rozor za ispis poruka je dio zaslona na koji prevodi l ac i povezivač ispisuju poruke o greškama koje n astaj u u tok u prevođenja i povezivanja programa. U prozor za ispis poruka n e može se upisivati tekst.
16
Osnovne karakteristike TURBO G- a
Prevodilac će tokom prevođenja programa zapamtiti na kojoj je liniji pro grama n astala greška. Prelaskom u prozor za poruke i korištenjem strelica m ožete se postaviti točno na liniju koda gdje je greška n astala. U prozoru za ispis poruka je vrsta greške koja je načinjena. Pritiskom na tipku F6 ili izhorom Edit , ispravlja se p ogrešni kod, a zatim ponovnim pritiskom na F6 prelazi se u prozor za ispis poruka i pronalazi sljedeća greška. U toku izvršavanja programa korak po korak, ili korištenjem prekidnih točaka prozor za ispis poruka postaje prozor za prikaz vrijednosti varijabli koje se prate tokom izvršavanja programa. Dio prostora n a zaslonu koji je rezerviran za ispis poruka može se, pri tiskom na t ipku F5, dodijeliti prozoTl\ za uređivanje teksta. Vrijedi i obrat .
1 . 7 . Mogućnost korištenj a dvostrukog zaslona
Moguć.n ost korištenja dvostrukog zaslona je još jedno od dobrih svo jstava T U R B O e-a. N aime, tokom izvršavanja program a sve poruke koje ispisuje program prikazuju se u drugoj ravnini. To znači da se u jednoj ravnini zaslona nal azi rad no okru ženje, a u drugoj p oruke koje ispisuje pro gram . Izvo(tenjem program a korak po korak m ože se pratiti n ačin ispisa rezul tata programa, što je veoma pogodno u procesu stvaranja grafi čkog sučelja prema budućem korisniku programa. Za prelazak u ravninu u kojoj se n alaze poruke koje ispisuje program koriste se tipke Alt i F5 . Ponovnim pritiskom na tipke Alt i F5 vraća se TURBO e okruženje.
1 . 8 . Pomoć ( Help )
Svi programi koji imaju m ogućnost da u svakom trenutku daju d o d atna i precizna objašnjenja o nastal oj grešci i sL, imaju velike šan se da budu prihvaćeni od strane korisnika. Za skoro sve korisnike računala, početnike i one koji zn aju malo ili mnogo više, vrijedi pravilo: "Ako baš ništa ne ide pogledaj u priručnik." B u du ći se ovo pravilo tako često pojavljuje, u gotovo svim profesionalnim programskim paketima dostupan je mini-priručnik u obliku pomoći. Pomoć se može zatražiti u svakom trenutku pritiskom n a jednu ili n a kombinaciju više t ipki.
1 . 9.
Vruće tipke (Hot keys)
17
Pomoć u T U R B O C-u dobiva se pritiskom n a funkcijsku t ipku F l ili pritiskom n a tipke Ctrl i F l . Pritiskom na tipku Fl dobivaju se dodatna ohavještenja o nastalim greškama (ako je akt i van prozor za ispis poruka) ili općenita objašnjenja, na primjer o korištenju uređivača teksta i sl . Pritiskom na tipke Ctrl i Fl dobiva se kratak opis funkcije koja se nalazi II nekoj od standardnih biblioteka funkcija. Pri tome se značka mora pozicionirati na tekst koji pred stavlja ime funkcije.
1 . 9 . Vruće
tipke (Hot keys)
T U R B O e raclno okru ženje podržava niz vru ć.i h tipki . Pod pojmom vruća tipka ( hot key) pod razumijeva se t ipka ili kombin acija tipki pomoću kojih se, u bilo kojem trenutku , pokreće odre(teni niz akcija. U t ablici 1 .2. dan je pregled i značenje svih vru ćih tipki T U RB O C-a.
Z
Vru ća tipka
n
ačenje
Fl
Pokretanje on-line sistema za pomoć
F2 F3
Pohranjivanje trenutnog sadržaja d atoteke iz nre
F5
P roširivanje ak tivnog prozora
. F6
Promje!la aktivnog prozora
F7
Vraćanje na prethodnu grešku
F8
Prelazak na sljedeću grešku (u prozoru za prikaz poruka) ; vrijedi i za F7 Prevo(tenje i povezivanje programa (stvaranje izvršne verzije programa) Aktiviranje osnovnog izbora
F9 FlO
Al t- F l
Prelazak
Alt- F3
Izbor za učitavanje zadnjih osam d atoteka koje su bile ure
II
zadnji prozor za pomoć
18
Osnovne karakt e ristike TUR B O G- a
Alt- F5
Prijelaz/vraćanje iz druge ravnine zaslona; u drugoj ravnini se ispisuju rezultati izvršavanja programa
Alt- F6
Vraća sadržaj prethodno urNtivane datoteke
Alt- F7
Ispis pretllOdne greške (greške koje nastaju tokom prevo(tenja i povezivanja programa) Ispis naredne greške (radi se o istim greškama kao kod Alt- F7 )
Alt- F8 Alt-F9
Prevo(tenje programa (stvara .OBJ datoteku)
Al t-B
Aktivira izbor < Bpeak/watch >
Alt-C
Aktivira izbor < Compile >
Alt- D
Aktivira i zbor
Alt- E
Aktivira izhor < Edit >
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
<
za aut omatsko uvla�enj e teksta , koj e s e kor i sti u TURBO e uređivaču tekst a , i veoma pogoduj e p i s anj u strukturiranih programa . < Poz icij a značke nakon p r it i s ka na t ipku < ENTER> < 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
20
Osn ovn e karakteristike TURBO G- a
lijevi ugao zaslon a (screen). U go r nj em d ij el u zaslona, ispod linije osnovnog izbora, n al az i se s t at u s linij a u re(ti vača tek s t a . S t atu s linij a ure (ti vač a tek sta d aje inform acije o t r enu t n o m položaju značke , im enu datoteke koj a se ure(tuj e i m o d u rad a. M o d rada može b i t i I nsert , koji o m og u ć uj e u m et an j e t ek s t a u p o s t oj e ć i t e ks t , ili Overwrite, k o j i im a m og u ćn o s t dodavanja tek sta na kraju b l o ka ili prepisivanja prek o p os t o j eće g t e k s t a . U ključivanjem u re cti v a č a teksta au t o m at s k i se o t vara d atoteka pod im e no m N O N AME. C . O snovni zaslon z a
File
Edit
u r e(ti vanj e teks t a j e prikazan sli k o m 1 .4 .
Run
Compile
Project
Opt ions
.
D ebug
Bre ak/�atch
r------ Edit --------� L ine
1
CoI l
Insert Indent
Tab
F ill Un indent • C : I OIAKE . C
1------ Me s s ag e --------l
F l - Hel p
FS- Zoom
F6-Svit ch
F7-Traca
FS-S t ep
F9-Make
Fl O-Menu
.UM
S l i ka 1 .4 . Prikaz osnovnog zaslona za uređi vanje teksta
K ao što p o kaz uj e
slika 1 .4 . dio zaslona dodijeljen je pr oz oru za ispis B u du ći t aj dio z aslon a, u trenutku unošenja i li izmjene u či tan o g teksta nije potreban , p ri t i sk om n a fu nkcijsku tipku F5 , m o ž e se d od ij e li t i prozoru za ure(tivanje teksta. Prikaz zaslon a n akon pri tiska na t i pku F5 je prikazan slikom 1 . 5 . N ako n unošenja novog ili i z mj en e u č i t an o g t ek s t a sve p romjene j e p o tr e b n o pohranit i na disk . Pohranjivanje , s p r em an j e , t ek s t a n a disk obavlja se o d ab i r an j e m op cije F ile osnovnog iz b or a . Pod izabranom o p cij o m n alazi se dodatni i zb o r koji u se bi sadrži o p c ij u S ave . Aktiviranjem op c ij e Save (pohrani, spremi) ure(tivani tekst
p o r uka ( Message window) .
1 . 1 0. Ure1tiva č teksta
File
Edit
F l -Help
Comp ile
Run
L ine l
Col l
F S - Z o om
21
(TUR BO e EDITOR)
Proj e ct
I nsert
F6- S v it ch
Opt ions
Debug
Br e ak/watch
Indent Tab F ill Un indent
F7-Trace
F8- S t ep
F9-Make
D : IOI'ME . C
FlO-Menu
JUM
Slika 1 .5 . Proširi vanj e prozora za uređi vanj e teksta s e p ohran j u j e u d atoteku n a disku .
Ako
je
bila nre(ti van a datoteka N O
N A M E . C , izb orom o pr ij e Save ure(tivač će ponuditi mogu ćnost d a se
tek s t p o h ran i pod n ekim dr u gi m imenom .
Ako to ne želim o i pri t i sn em o
E N T E R tekst će h i t i p o h ra nj e n u tekući direk t orij
II
d atoteku N O N
A M E . C . B u d u ći je pohranji vanje tek s t a relat i v n o čes t o p o t rebno t okom
r ad a , p ri d ru žen a m u je funkcijska t i p ka F 2 . D akl e , pri ti skom oh a v lj aj u se s ve pret h o d n o opisane
osn ov n og i d o d atnog i zbora
Pohranjivanjem
.
U č i t avanj e
cije File
n a t i pk u F2
ko je se m ogu pokrenu t i op cijam a
•
t e k s t a s t ari sad r žaj datoteke se u pi s uj e u dato teku koj a
sadrži kopij u , d atoteka s d o dat kom u re(tivani s adr ž aj
akcije,
zamjenjuje
sadržaja
u
n azivu
( extension)
. B A K , a t renu t n o
s t ar i .
d atoteke
u
u re(tivač t ek s t a obavlj a se izb orom op
osnov n og izbora i izhorom oprije Load d o d atnog izbora, o dnosno
mn ogo kraće pri t i skom
na
funkcijsku tipku F 3 .
22
Osnovne karakte.ristike TURBO G- a
1 . 1 0 . 2 . Osnovne naredb e N ared be bilo kojeg uređivača teksta m oraj u om ogu ći t i b rzo i efi kasno un ošenje , izmjenu i p oh ranj i vanj e teks ta. P rem d a se s vaki korisnik n akon o d ređenog vremen a pril agodi uređi vaču i postan e , više ili manj e , zadovoljan njegovim m ogu ćnostim a s vaka promjena n a bolje brzo se prihvaća. Može se slob o d n o reći d a j e za p o t rebe pis anj a e program a ure(tivač tek s t a T U R n o
e-a veo m a d obar .
N aredbe T U RB O e UTectivača teksta omogu ćuj u brzo kretanje k roz
tekst , brisanje dijelova tek s t a ( slova, riječi , linij a i dijelova tek s t a ) , u či t avanje
dijelova tek s ta iz drugih d atot eka, poh ranj ivanj e d ij elova tek s t a u druge
d a toteke , p ron al aženj e d ijelova teksta, kop iranje dijelova t ek s t a na više ra zli či t i h mjesta te pron al aženje i z amjenu dijelova t ek s t a . Osim toga ure(ti vač u v ijek i m a ak t i v ne dvij e datoteke. .J edna datoteka je u pozadini ( back g7'Ound) , dok se d ruga uređuje. Zamjena datoteke iz pozad i n e i d atoteke koja
se ure(tuje
ohavlj a se i s t ovrem enim prit iskom na t i pke Alt i
F6 .
N ajjednostav n iji n ačin pomicanja značke n a z aslon u p os t i ž e se koriš
tenj em s t reli ca, t i p k i Page Up, Page D own, Home i End . T ipkam a Page Up i Page Down p omi če se zn ačka za broj linij a zaslona prem a gore o d n osno prem a d olje. Priti sak na tipku End p omi če zn ačku II donji desni , a p r i t i s a k na t ipku Home II gornj i lijevi dio zaslona. O s i m os n ovnih n ared b i postoj i i niz n aredbi kojim a se o s t varuje pomicanje zn ačke
na po četak s1je(kće riječi , na kraj prethodne riječi , na kraj tek s t a i sl. O ve n ared b e d ane su na kraj u p oglavlj a gdje se n alazi p regled svih naredbi T U RB O e ure(ti vača teksta.
Pojedin a slova se b rišu p r i t i skom n a t i p ke Delete i Backs pace. Delete b r i še slovo na t ren 1l t n oj pozi cij i z n ačke , dok Backs pace briše jedno mj esto
lijevo o d tren u t n og p oložaja značke. cijel a linij a , a t i pkam a Ct rlpol ožaj a zn ačke.
Q- Y
Prit iskom na t i p ke Ctrl-Y hriše se
bri še se dio linij e desno o d tren u t n og
1 . 1 0 . 3 . Premj ešt anj e , kopiranj e i brisanj e dij e l ova t e ks t a (;esto j e n eopho d n o d i o tek s t a , k o j i se s astoj i o d v i še linij a , premjes t i t i
n a n eko d ru go mj esto ili na više mjest a . D ijel om t ek s t a sc m ože rukovati
samo on
s
blokovima počinj u
pritiskom
n a tipke
C trl-
UreilitJač teksta (TUR BO e EDITOR)
1 . 1 0.
23
K- B , i k r aj , k oji se ozn ačava pri t iskom na t ip ke Ctr-K- K . Tako o zn ačeni dio t e kst a se n aj češće pri kaz uje u inverznom osvjetlj enj u , slika 1 . 6 .
File
Edit
Run
Compile
Pr o j e ct
Opt ions
Break /v at ch
Debug
�----- Edit --------� L ine
I.
7
Col
34
Insert Indent Tab Fill Un indent
HELLO . C -- Hello , vorld
D : HELLO . C
./
. include < s t di o . h>
lIlaillO f . , . ·?: · " }
1----- Me s s age
F l - He lp
FS-Z oom
F6- Svit ch
F7-Trac8
--------i
FS-St ep
F9-Make
Ft O-Kenu
lUK
Slika 1 .6. Prikaz ozn ačenog bloka teksta
Tek kad a f;C dio teks t a ozn ači kao hlok , onda se može kopirati ili pre mj es t i ti na hilo koje mj e s t o unu tar teksta. Pod p ojm om kopiranja ( copy a block) p o d r azu m ij e va se premještanje sadržaja bloka n a željeno mj est o , a d a pri tom t ek s t , koji je ozn ačep kao blok, ostane na "st aro m mjestu" . Kopi ranje se obavlja p r i t i sko m na ti p k e Ct rl-K-C . Pre mj e š tanje teksta ( motle a block) p remj es ti blok teks t a n a željen o mjesto, ali p ri tom obriše dio teksta
ozn ačenog kao hlok s a "starog mjest a" . Bl okovi teks t a se brišu nare d bom Ct rl-K- Y. Među tim , prij e b r is anja bloka dohro razmisli te, jer n aredba koja bi vraćala sadržaj oh ri s an o g bloka ne
postoji.
24
Osnovne k a rakt e ristike T UR B O G- a
1 . 10.4.
Pronalaženje i z a mje n a dijelova teksta
Vrije d nos t naredbi koje omogućuju p r on ala ž e nj e i z amj e n u o dre(tenih dijelova teksta proporcionalna je veličini teksta koji se urectuje . T U RB O C ure(ti vač t e k s t a im a d v ij e mogu ć.nosti : p r o n alaž e nje d ij e l a teksta pron alaženje d ijel a tek s t a i zam j e n a tog dijela t eksta sa zadanim . Nared b a z a pro n al a ž e nje dijelova tekst a aktivira s e i s t ovremenim p ri t i sko m n a tip k e C t r l- Q , a za t im pr i t iskom' n a t ipku F . Za ovu naredbu postoji n i z opcij a koje p ohliže o d r e (tuj u n ačin pretraživanja. N a primjer , razliko vanje veli ki h i m alih slova, pretraživanje o d početka da t ot e ke , o d trenu tnog p oložaja zn ačke i sl . Nare db a za p ron ala ž e nj e i z amj e nu dij el o va teks ta aktivira s e is t ovr e m e n i m p r i t i s k om n a t i pk e Ctrl- Q , a zat im n a tipku A. Pritom se z ad aj e d io tek s t a k oji se traži i dio teksta koji ć e z am i j eni t i traženi tekst . K ao i kod n are d b e za pron al aženje dijelova t ek sta i ova n ared ha pos j e d uj e niz opcija koj� d et aljn ij e o dre(tuju uvj e t e p r et raž i vanj a i način za mjene . N a pr imj e r , d a li zamijeni t i sve dijelove zadanog teksta koji imaju velika slova, il i koji im aju m ala slova, d a li n apr av i t i z amj e n u hez p r e t h o d n o g pi t anja da li se slažem o sa zamjenom , d a li z amj e nu n ap r avi t i od p o čet ka teksta ili od t renu tnog položaja značke i sli čno.
O pcije za p r onal až e nje i z amjenu dijelova teksta opisan e su n a k r aj u p oglavlja zaj edno sa o s t al im n ared b ama TURBO C ure(tivača teksta.
1 . 10.5.
Pohranjivanje i učitavanje dij elova teksta
N a bilo koje mjesto u tekstu može se, naredbam a z a u či t avanje di j el o va t e k s t a , u čitati tekst iz h il o koje A S CII dato t ek e s diska. M ogu ćnost u čitavanja d atoteka u tekst koj i se u ređuj e je veoma pogodno , p ogot ovo u slu čajevim a kad a se o d re(teni dio teksta često poj avlj uje II nizu razli čitih d atoteka. N a primjer, zaglavlje programa koje sadrži podatke o au t oru i n amjeni programa. N are�lb a za u č i t avanje d ij el a teksta aktivira se istovremenim priti skom n a t i p ke C t r l- K , a z a t i m pri tiskom n a tipku R. N avedena n a r e d b a z ah tij e va unos i m en a d atoteke iz koje se tekst u čitava.
N aredba za p o h ran j i vanj e dijela t e k s t a u datotek u aktivira se istovre menim p ri t isko m na t i p k e Ctrl- K , a z at i m p ri ti s ko m na tipku W. Pritom
25
1. 10. Urei1iva č teksta (TUR B O e EDITOR)
se m ora zad ati ime d a t o t eke u koju se odabrani tekst pohranjuje, a tekst se
m o ra
ozn ači t i kao
b lok.
1 . 1 0 . 6 . P regled n aredbi u ređivača teksta
U p reth o dnim p ogl avlj im a op i s an e su osnovne karak teris tike i mogu ć
n os t i
T U RB O
e nrecti vača teksta. U t ablici 1 . 3 . p rikaz an e su sve n ared b e .
N ared he s u raz v rs t ane p o g r u p am a ,
ovisno o
radnj i koj u
obavljaju .
Naredhe za pomicanje značke ( cursor) Naredba
Radnja
S t rel i ca l ij e v o
Pomiče z n ač k u za
Ctrl-S
Pomiče z n ačku za j e d n o
S trelica desno
Pomiče znač.ku za j e d n o mjesto udesno
C t rl - D
Po m i č e z n ač k u za
j ed no mj es to u d esno
Ctrl-A
Pomiče z n ačku za
jednu rij eč
Ctrl- F
Pomiče z n ačk u za
jednu r ij e č u desno
S t relica gore
Pomiče z n ač k u za jedan red prema gore
Ctrl-E
Pomič.e z n ač k u z a j e d an red prema gore
S trel i ca dolj e
Pomiče z n ač.ku za
j edan red
Ctrl-X
Pomiče z nač.ku za
jedan
Ctrl-W
.
jedno mj es t o ul ij e vo mj esto u lije vo
u l ij e v o
p r em a
dolje
red p rema dolj e
Pomiče t e s t za j ed an re d prema gore
�
( SeroIl up)
Ctrl-Z
Pomiče tekst za j e d an r e d p r em a
Page U p
Pomiče z n ačk u je d n u
Ctrl- R
Pomiče znač.k u jednu stranicu prema gore
Page Down
P o m i če
Ctrl-C
Pomiče znač.k u jednu stranicu prema dolje
H o me
Pomiče
Ct r l -Q S
Pomiče značku n a početak reda
End
Po m i č e
Ctrl-Q D
Pomiče z n ačku na k r aj
z
d olj e (SeroIl down)
stranicu prem a
go re
n a č k u j e d n u stranicu prem a dolje
značku na z n ač k u
na
početak reda
k raj re d a r
ed a
26
Osn ovn e karakt eris tike TUR B O G- a
C t r l -Q E
Pomit.e značku u gornji lijevi ugao
C t rl- Q X
Pomiče značku u donji desni ugao
Ctrl-Q R
Pomiče značku na početak teksta
Ctrl-Q e
Pomiče značku na kraj teksta
C t r l- Q
Pomiče značku na pot.etak bloka teksta
B
Ct r l - Q K
Pomiče značku na kraj bloka teksta
Ct rl - Q P
Pomiče značku na zadnj u poziciju Naredbe za brisanje
Ctrl-Y
Briše r.ijeli red teksta
Ct rl-Q Y
Briše dio teksta lijevo od trenutnog položaja značke
Bac:kspac:e
Briše jed an znak lijevo od trenutnog položaja znač.ke
D el ili
Briše jedan znak desno od trenutnog položaja značke
Ctrl-G
Ctrl-T
Briše jednu riječ desno od trenutnog položaja značke Naredbe za rad s blokom teksta
Ctrl- K B
Označava početak bloka
Ct rl- K
K
Označava kraj bloka
Ctrl-K
T
Označava jednu r iječ kao blok
Ctrl- K e
Kopira označeni blok na mjesto t renutnog položaja značke
Ctrl- K
Briše blok
Y
C t rl- K H
Prikazuje/sakriva označeni blok (promjena osvjetljenja)
Ct r l- K v
Premješta blok na mjesto trenutnog položaja značke
Ctrl-K R
Učitava blok teksta iz d atoteke sa diska
Ctrl-K W
Pohranjuje blok teksta
u
datoteku na disku
Naredbe za pretraživanje i zamjenu dijelova teksta C tr l - Q F
Pronalazi zadani dio teksta
C t r l- Q A
Pronalazi dio teksta i zamjenjuje ga zadanim tekstom
Ctrl- L
Ponavlja prethodnu naredbu
Ctrl- U ili ESC
Prekida izvršavanje prethodne naredbe
27
1. 10. Ureilivač teksta (TUR BO e EDITOR) . Opcije* B
P retražuj od trenutnog položaj a značke do početka teksta
G
Pretraž uj u cijelom tekstu bez obzira na trenutni položaj znač.ke
L
Pretražuj unutar ozn ačenog bloka
n
n
N
Pronacti dio zadanog teksta i zamijeni ga drugim bez pi tanj a d a l i se želi zamjena
u
Pron acti ili zamijeni dio tekst a bez obzira na mala i velika slova
w
Pronacti samo ako je to cij ela riječ, preskoči ako je dio neke rij eči
=
cijeli broj ; pretraž ivanj e n puta
Ostale naredbe Gtrl- K D
Osnovni izbor
Ctrl- K Q
Osnovni izbor
Ctrl- K S
Pohrani uređivani tekst i ostani u uređivaču
F3
Početak stvaranj a nove d atoteke (New file)
A l t- F3
Izaberi p rethodno uređivane datoteke
Tab ili Ctrl-I
TabuI ator
Gtrl-O
Uklj li či /isklj uči au tomatsko uvlač.enje
I
Ctrl-O T Ctrl- F' l * *
Uklj uči / isklj uči t abulator Opis sintakse i značenj a pojedinih funkcij a TU RBO G-a
n aredbi
Tablica l . :l . Pregl€i.d nared bi T U RBO C u recti vača teksta * Op cij e za pretraživanj e mogu se kombinirati tako da se zad a pretraživanj e uz više uvj eta. Na primjer, za zamj enu teksta TURB O s tekstom e bez obzira na vel ika i mala slova i bez obzira na trenutni položaj značke i bez pitanj a da li želimo zamjenu i l i ne, opcij e se zadaju kao gUIl .
** Značka mora biti n a dijelu funkcije ili n aredbe z a koju se traži obj ašnjenje
2 . O S N OVE P RO GRAMS KOG JEZIKA e
"I put od t is uću milja počinje jednim malim korakom" ( star a kineska poslovi ca) S t ara kin eska poslovica n as u či st rpljenju i postojanosti . Ako p o či njete programirati , a odlu čili ste .se za p rog r amsk i jezik C, n e preskačite ovo poglavlj e makar vam se ono u č i n i l o jednostavnim i razumljivim . U njemu je obra(Te1l a s truktura C p rogr am a i d an je opis osnovnih elemen ata pro g r am sk og j e z i ka C . Cilj ovog pogl av lja jest da vas što prije dovede do razine n a kojoj ćete j e d n os t av n e zad atke rj eš avati potpuno samostalno. Zbog toga se ne ulazi u pojed i n os t i poj edi ni h pr o b lema . N a č injeno je ne k oli k o kom ple t nih programa koji potk r eplj uj u i z n e seno gr a di vo. Nekolicinom u vodnih primjera objašnjen je postupak p revo (tenja i izvr š avanj a programa u ob jedinjenom radnom o kru žen ju ( T U RBO C Int egrated Environment» Osim n a vedeni h primjera p ro gr am a nastojte sami n ap i s at i nekoliko sličnih . Oni će vam posl u žiti ne samo kao pr ovj era n aučenog, nego će vam p omoći d a biste brže upoznali osnovne karakteristike i m o g u ćn osti pr o grams k og p aketa T U RB O C .
Osno v e p rogramskog jezika e
30
2 . 1 . Kako počet i
Jedini n a c m d a bi s t e nau č ili p rogr ams k i jezi k C jest da pro gr am irate . Da biste u op će p o čeli prog ram i r ati morate imati p ro bl em ko j i želite r ij e šiti . P rob le m i koji se susreću u praksi č.e sto su puta toliko složeni da nas već na samom p očetku m ogu ob eshrabrit i . Zbog toga prije nego što se odl u čite rje š avat i t ak v e p ro bl e m e n aučite dobro rješavati jedn os t av n e prob l e m e . To je prvi korak ka rješenju . Sljedeći korak u rješavanju sl ož en ih problema pre dstavlja r as t avljanje problema u n i z manjih , međusobno p ov ezani h cjelina. Svaka t ak va cjelin a p red s t avlja problem za sebe i moguće ju je daleko jednostavnije r iješiti n ego početni prohlem. Povezivanjem rj eš enj a p o j e dinih cjelin a dobiva se cjelokupno rješenje. Naved eni n ačin rje š avanj a probl e m a p r ed stavlja k o n ce p t k o ji je veom a je z ik om C. Rješenja p oj e din i h cj eli n a p red
d obro pod r ž an programskim
stav lj aj u
fu nkcije. Pojam fun kcije se može d o n ekle izjednač.iti s poj m om potprogram a ili pr o cedu re u d r ugi m programskim j ez ici m a . Povezivanjem funkcij a u z ajam n im p oz i v ima u jednu cjelin u , progmm, dobije se cjelokupno rješenje problema. Za prikaz n avedenog r iješ im o je d an jedn o st avan zadatak . Pretpostavimo na zaslonu r a čun ala, ili n a štampaču h o ćemo nešto i sp i sa t i . Neka to lmde ime čovje ka koji je r azv io p rogr am s k i je z i k C, Dennis Rit chie. Zadatak je za i st a jedn o st avan . Me
1* pr ik az n iza znakova na zaslonu racunala *1
main O {
}
1* poc e t ak programa *1
1* poz i v funk c ij e z a i s p i s niza znakova *1 printf ( "Programsk i j ezik e j e razvi o D enni s R i t ch i e " ) ;
Izvrš avanje m program,a na
zaslonu
račun al a
Programsk i j ezik e j e razvio D enn i s Ritch i e
p o j avi t će se tekst
2. 2.
Struktura e programa
31
To je upravo ono što smo željeli . Ako se za prvi korak kaže da je n aj teži, on je upravo načinjen . P rema tome nema razloga d a ne n astavite dalje.
2 . 2 . St rukt ura e programa
Svaki e program sastoji se od niza me
Osnove programskog jezika e
32
Programski jezik e nije pozicijski , kao npr. FO RTRA N , što znači da kod može poč.eti u hilo kojoj koloni . Naredbe, izrazi i komentari mogu se protezati u više programskih linija. Za prikaz strukt u re e programa p oslužit će n am sljed eći primjer.
Pseu d o kod : koment ar poč e t ak program a
C program :
primj er strukture
/*
e
pro g rama*/
main ( ) {
j , z;
deklaracija varijabli
int
učitavanje hrojeva
s canf
zbrajanje
z
ispis rezul tata
printf ( " 'lod+%d='lod" , i , j , z ) ;
kraj program a
=
i.
( " 'lod y'd" , &: i . &:j ) ;
i + j;
}
2 . 3 . Analiza TURB O e programa
Pokretanjf'lll T U R B O C-a i izborom op cije Edit , koja se dobije pri tiskom na tipke Alt-E, zn ačka će se n aći u gornjem lijevom ugl u zaslona. Time je označen početak unosa teksta, odnosno koda bu d u ćeg program a. Za početak unesite sljedeći kod program a: /* Program za anal izu *1 main O { char ime [30] ; int godina ; printf ( " \n Kako s e zoves ? " ) ; s canf ( "r.s " , ime ) ; print! ( " \n Kol iko imas godina ? " ) ; s can! ( " %d" . tgodina ) ; printf ( " \n Ti s e 20ves Y.S i imas %d godina . .. . ime , godina ) ;
}
2. 3.
Analiza T UR B O e programa
33
N akon un osa koda programa, neophodno je program p ohranit i n a disk . Izborom op cij e S ave osnovnog izb ora File, ili pri t i skom na funkcijsku t ipku F2 , program će biti smješten u d atoteku pod zadanim imenom i imat će dodatak ( extension ) .C. P rije n ego se opiše n ačin n a koji se s t vara izvršn a verzij a programa, an alizi rat ćemo kod n apisanog programa. Analiza n apisan og koda je neiz bježan korak u postu pku stvaranj a novog programa ili funkcije. Zbog t oga ćem o ovdj e provest i an alizu n apisanog, čime će još jednom bit i ponovljena osnovna struktura e programa. P rva lin ij a je kom entar . Komentari u e-u počinj u zn akom /* i završavaju z n akom * J . Komen t ar se može protezati na više program skih linija. S ve što se n al azi izme
main ( ) pred s t avlj a poziv fun kcije mainO . U svakom programu m ora h i t i jed na, i samo jed na fu nkcij a mainO . O n a ozn ačava mjesto poče tka izvršavanja program a. K ao i ost ale funkcije, funkcij a mainO ima m ogu ć,nost prijenosa pod at aka u fu nkciju . Podaci se u funkcij u prenose preko argumenata. Funk cija mainO Ul ože se pozvati sa ili b ez argumenata. O argumentima funkcij e main ć e b i t i riječi u jednom od n arednih poglavlja. Sljedeća linija sastoji se od zn aka
{ koji označava početak bloka n aredbi , o dnosno funkcije. Linija
char ime [30] ; predstavlja deklaraciju var ij abl e ime. Deklaracijom varij able o dre
int godina ; tako
Osnove. programskog jezika e
34 Sljedeća linij a
pr intf ( " \n Kako
se zoves ? " ) ;
predstavlja poziv stan dardne funkcije za isp is p odat aka. Poziv funkcije sas toji se od d va dijela: imena funkcije, printf( ) , i njen og argumen ata unut ar zagrade , " \n Kako s e zoves ? " . Tekst Kako s e zove s ? je niz znakova i kao takav će se ispisati na z aslon. O zn aka \n, n a p o četku teksta, označava prelazak zn ačke u n ovi red prije n ego se ispiše tek s t . O ost alim argumen tim a koji se mogu p oj aviti u funkciji printf( ) bi t će v iše riječi u n aredni m pog1 avljima. Linija
s c anf
( "Yos " , irne) ;
preds t avlj a poziv funkcije za formatiran o u čitavanje podat aka. Ona se, kao i poziv funkcije u preth odnoj liniji , sastoji od dva dijela: imena funkcije ,
scanf( ) ,
i liste argumen at a unu t ar zagrade " % s " , ime .
nav o dnika " " p l"ecl s t avlja ozn aku nač.ina
Kod form ata počinje znakom
form ata. Format po kojem
Y.
( formata )
Argum en t unutar
u č.i t avanj a podataka.
iza kojeg se mora n al aziti jedna od oznaka
ć.e se podaci čitati mora b i t i u skladu s tipom
varijable koje se čita. P regled osn ov nih formata prikazan je t ablicom
Tip podatka cjelobrojni realni
Format
(int )
(float , double)
znakovni
(char)
niz zn akova
2. 1 .
(string)
d f c s
Tab lica 2 . 1 . Formati za učit avanj e i ispis p o d ataka
A rgum en t iza oznake formata preds t av lja varijablu jednost u či t ati po zad anom formatu . N aredna linija
pr intf ( " \n Kol iko
irnas god ina ? " ) ;
ispisuje niz znakova n a zaslon. N aredbom
s c anf ( " y'd" . &:godina) ;
ime
čija će se vri
2. 4. Prevollenje i izvršavanje TURBO e p rogra m a
35
godina. U o či m o d a i s pr e d i m e n a lis t i argumenata funkcije stoji adresni operator & . Njegova u p o t re b a hit će obj aš nj e n a u p oglav lj u o funkcijama (5. p ogl avlj e ) i p ogl av l j u o pokazivačim a (7. p oglavlj e ) .
u či t ava se
p o d a t ak
va rij abl e , god ina,
Fo r m at i r an i
o vrijedn o s t i var ij abl e
u
isp i s
li n ij o m
p od a t aka n a z as l on d an
j e slj e d e ć o m p rog ram s k o m
pr intf ( " \n T i s e zoves 'los i imas 'lod godina . " , ime , god ina) ; r ed o sl j e d navo(tenja formata mora o d govar at i r e d o slje d u va r ij abl i . Pogrešno zadan format u o d n o s u n a d eklaraciju varij able gotovo u v ij e k d aje pogrešan ispis .
Treba n agl as i t i
da
n a vo (te nj a i m e n a
Z a d nj a linija program a
je znak
}
i pred stavlja k r aj
program a, od nosno
k r aj
funkcije
main O .
2 . 4 . P revo đenj e i izvršavanj e TURB O e programa P re v o (te nj e i izv ršavanje p r ogr am a II o b jedi nj e n o m ra dn om o k r u ž e nj u p okreće se o d abiranjem op cije osnovnog i z b o r a Run . P os t o j e d va način a
izvršavanja p rogram a:
iz v r š avanje program a kor'ak izvrš avanje .
po
korak ( trace mode)
ko m p l e t n o g p r og r am a .
O d abirom bilo kojeg način a
s t v o ri t će se izvršna ver z ij a progr ama. Iz vršn a
verzij a program a nalazi se u t ek u ć,e m
d i r ek t o r ij u ili d i r ek t orij u koji se n ave d e kao izl azni d i r ek t orij ( output directory) - o p c ij a osnovnog izbora - O ptions - > 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
<� -Go to t op i c
Esc-Exit Relp
lUK
Slika 2.4. Detaljniji opis nastalih grešaka
2 . 6 . Programska petlja for Prem d a će o p r og ra m skoj petlj i for biti detaljnije raspravljano u 4. p ogl a vlj u , ona se ovdje spominje jer pre d s t avlj a jed nu od osnovnih pro g ra m s k i h ·s t r u k t ura. M ože se slohodno reći d a gotovo nem a program skog
j e z i ka koji ne sad rži
for
petlju .
Po s v o jo j je formi got ovo i st a kod svih pro
c.ed u ralni h jezika. Prema t o m e , ako ste programirali
jezicima
n em a
u d rugim
programskim
razl oga da se već na p o če t ku ne u p oznate s jednim čes to ko r i š t e ni m i neizbježni m m eh a n i zm om II procesu p isanja program a. O p ć.i ohlik
prog r am s ke p et lje for
for (izrazI ; izraz2; izraz3) { blok naredbi; }
II
G-u
glasi:
40
Osn ove programskog jezika e
P rogramska petlja for svrstava se u grupu program skih p etlji gdje se ispitivanje uvjeta izlaza iz pet lje ispituje na početku. To znači da se može desiti d a se blok n aredbi petlje ne izvede ni jednom . U n ajjednostavnijoj for m i for petlje, izraz3 pridru žuje kontrolnoj vari j abli petlje početnu (inicijaln u ) vrijednost . Izraz2 predstavlja uvjetni izraz kojim se provjerava da li kontrolna var ijabl a petlje ispunjava uvjet izl aska i z petlje. Izraz3 definira način promjene kontrolne varijable petlje. Kontrolna varijabla petlje mijenja se u svakom ponavljanju petlje.
Za p rikaz iznesenog riješit ćemo jedan jednostavan zadatak . Pretposta vimo d a n a zaslon treba ispisati niz brojeva od 1 do 20. 1* program z a i s p i s niza broj eva od 1 do 2 0 * 1 main ( )
{
int x ; for ( x
}
= 1 ; x <= 20 ; x++ ) printf ( " Y.d " , x ) ;
U programu se pojavljuje izraz x + + . Takvi izrazi su karakteristični za programski jezik e i predstavljaju skraćen i oblik pisanja izraza x = x + 1 . Uočite d a iza n aredbe for n e stoji ozn aka početka bloka nared bi { . Ako se blok n aredbi sastoji od samo jedne n are dbe , oznake početka i kraja bloka n aredbi nisu potrebne. Za vježbu m ožete n apisati i izvesti program koji će n a zaslon ispisati niz brojeva od 20 do 1 . P rogram izvedi te korak po korak (funkcijska tipka F7), prateći promjenu vrijednosti varijable x (Ctrl-F7 - Add watch) . Za izraz koji mijenja vrijednost kon trolne varijable petlje možete k ori s ti t i skraćeni oblik X- - , umjesto x = x - t .
2 . 7. S imboličke konstant e
Korištenje simboli čkih konstanti doprinosi većoj općenitosti, prenosivost i i preglednosti programa. Simboli čke konstante moraju se definirati izvan svih fun kcija. U većini slu čajeva one se definiraju na početku programa. Opći oblik n aredbe za definiranj e simboličkih konstanti glasi:
41
2. B. Fu nkcije
#define simboličkoJ.me vrijednost S i n t aksa n ared be #define razlikuje se od sintakse ostalih n aredbi C a. Uočite d a izme
3 . 14
J* def in icij a s imbol i cke konstante *J
main ( ) { float radij us . povrs ina ; ); pr intf ( lI \n Zadaj t e rad i j u s krug a . 8cant ( "Yef " .tradij us ) ; povrs ina = (rad i j u s * radijus ) * P I ; pr intf ( " \n Povrs ina krug a rad i j u s a % . 3f j e Ye . 3 " . radij u s . povrs ina ) ; .
.
tl
•
}
U toku prevo
2.8.
Funkcije
Pojam fu n kcije u C-u može s e donekle pois tovjetiti s pojmom potpro grama u FO RT RA N-u ili B A S IC-u , ili s pojmom procedura u PA S C A L-u ili P L/I-ll . Me
Osn ove programskog jezika e
42
samo zato da bi se izbjeglo višestruko pisanje istih dijelova koda, n ego i zato d a se poveća preglednost n apisanog programa. Osnovna gra
}
deklaracija lokalnih varijabli; tij elo funkdje;
Tip_funkcije od rNluje tip po,latka koji će funkcija vratiti. Funkcija može vratiti bilo koji defini rani tip podatka ili pokaziv·ač. Ako nije n aveden t ip _funkcije, p retpostavljeni ( default) tip funkcije je cjelobrojni (integer) . B u d u ć.i d a u e-u ne postoj i operator z a potenciranje, napisat ćemo fun kcij u , pot enc i j a ( x , y) , koja kao vrijednost vrać,a kvadrat zadanog broja. 1 * def inic ij a i nacin poziva funkc ij e u e-u * 1 1* i s p i s kvadrat a broj eva od 1 0 do 1 5 * 1 int pot encij a ( int , int ) ;
1 * protot ip funk c i j e * 1
main ( )
{
1 * d eklaraci j a lokalne v ar i j abl e * 1
int i ;
}
f or ( i = 1 0 ; i < = 1 5 ; i++) printf ( lI\n Y.d - 2 = Y.d " , i . pot enc i j a ( i . 2 » ;
1* f unk c i j a izracunava i vraca pot encij u z adanog broj a * 1 i n t pot e n c ij a ( int x , int y )
{
1 * deklara c ij a lokalnih v ar i j abl i * 1
int i . p ;
}
p = 1; f or ( i
=
P
=
1 ; i <= y ; i++) * x; 1 * izracunavanj e *1
P
return ( p ) ;
1* vracanj e izracunat e vrij edno s t i *1
Argumenti fun kcije moraju se deklarirati tako d a odgovaraju t ipu pod at aka pozivu fUll kcije.
u
2. 9. A rgumenii funkcije
- Call by Value
43
Dekl aracija fu nkcije int potenc ij a ( int , int ) ; koja stoji ispred funk cije main O , kaže
2. 9 . Argumenti funkcij e - Call by Value
Pod aci se u f11nkciju prenose preko argumenata funkcije. Argument i funkcije sn lokaln og karaktera, š t o znači d a se n e mogu mijenjati u drugim fu n kcijam a, nit i njihova pr o mjena unu tar promatrane fu nkcije u tječe n a promjenu istoimenih varijabli izvan promatrane funkcije. Prijenos argu m enata preko vrijedn osti, call b y value , kopira v rijed nost i varijahli koje se prenose ti funkcij u u argumente funkcije . Argumenti fUli kcije su time inicijalizirani n a vrijednosti koje se prenose. U pretho d nom primjeru , pozi vom fu nkcije pot enc i j a ( i , 2 ) argumenti funkcije x i y popri m aju vrijednos t i zad an e pozivom funkcije. U ovom slu č.aju x = i , y=2. Me(tu t i III , promjena varijable x u funkciji pot enc i j a ( ) ne mijenja i ne može promijeni ti vrijednost varijable i u funkciji main O . Varijahle č.ij e se vrijednosti pren ose u funkciju i argumenti funkcije m oraju odgovarat i po tipu . Razlog je način prijenosa podataka u e-u ,
Osn ove programskog jezika e
44
koji se obavlja preko s toga (stack). Deklaracij a argumen ata o dređuje ko liko će se baj t a sa stoga pridružiti pojedinim argum en tima funkcije. Ako je varijabla koja se pren osi razli či ta po tipu , broj baj t a na s togu koji pred s t avlja preneseni p o d atak razli čit je od onog koji je deklariran i koj i funkcija očekuje. Zbog toga argument funkcije poprima pogrešnu vrijednos t . Taj tip grešaka se veoma teško otkriva, pogotovo u većim programim a. Izbjega vanje takvih grešaka pos t i že se deklaracijom funkcije, odnosno n avođenjem prototipa funkcij e . G reške se neće pojaviti kod onih t ipova podat aka koji iauzimaj l1 jed n ak broj baj tova za p rikaz II memoriji. Osim spomenu tog, postoji još jed an n ačin prijenosa podat aka II funkciju . To je prijenos pod ataka p reko adrese ( call by reference). Tim načinom pri jenosa p romjen a vrijed nosti preneslmih podataka unu tar p ozvane funkcij e u tječe n a promjenu vrijednost i pod at aka u fun kciji iz koje se p renose. O oha način a prijenosa podataka bit će det aljnije raspravljano u p oglavlju o fll nkcijam a (5. poglavlje ) .
2 . 1 0 . Polj a Skup podat aka istoga tipa koj i nosi zajedni čko ime n aziva se p olje. Organizacijski gled ano p olje je zapisan o u nizu mem orijskih lokacija. Za sad ćemo se ograni čiti na jednodimenzion alna cjelob rojna polj a i n a polja znakova. Dekl aracija jed nodimen zionalnog polja im a oblik :
int polje [n] j
/*
char string[n] j
cjelobrojno polje
/*
polje zn akova
*/
*/
gdje j e n dulj i n a, o d n osno b roj elemen ata p olja. Veličina jednodimen z ion alnog polja računa se prema relaciji
veličina polja
=
veličina tipa(broj bajtova} * d uljina polja
i pred stavlja koli činu memorije koju p olje zauzima. Korištenje polj a u programima je pogodno, jer om ogu ć ava jednostavno rukovanje nizom logički povezanih pod ataka. Kao primjer uzmimo program koji račun a prosjek ocjena jednog u čenika 1* izracunavanj e pro s j eka ocj ena * 1 main ( ) {
4.5
2. 1 0. Polja
int ocj ena [5] , zbroj _ocj ena ; int ukupno_ocj ena ; int i ; tor ( i = O ; i < 5 ; i ++ ) { printf ( " \n Yod . ocj ena => " 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
char polje[10] ; Zadano polje zn akova je II m e m or ij i što se može prikazati kao
zap i sano
ltD I
A
N
u nizu memorijskih lokacij a,
\0'
Za prikaz n ave d enog r ij eš i m o je d an jednostavan z ad at ak . Pretpostavimo d a treba u či t at i niz zn akova koji se unose preko tastature računala. Kraj u či t avanj a označava pr i t i sak n a t ipku ENTER ili u či t ani osam dese t i z n ak . Za u či t avanj e jednog zn aka s t astat ure kori s t i s e standardna funkcij a getcheO . 1 * uc itavanj e niza znakova s ta st ature *1 vo id u c i t aj _ s tring ( char * ) ; v o i d main ( v o id)
{
char str [80] ;
1 * d eklarac i j a polj a znakova *1
1* poz i v funk c i j a z a u c i t avanj e niza znakova * 1 uc itaj _string ( str) ; pr intf ( " \n Ud t an i niz znakova j e : y' s " . s t r ) ;
} 1* def in i c ij a funk c i j a za u c i t avanj e niza znakova *1 v o id u c i t aj _ string ( char str ing [] )
{
int i ; char ch ; f o r ( i = O ; i < 80 ; i + + )
47
fUJ. Globalne varijable {
ch
=
g e t che O ;
it ( ch == 1 3 I I i { string [i] = return ;
} str ing [i]
=
== J
79)
\0 J ;
1 * oznaka kraj a n iza *1
ch ;
} } Izvršavanjem programa dobije se: c : \tc> Test primj er Ucit ani niz znakova j e : Test primj er Za vježbu m ožete n apisati funkciju koja kopira sadržaj jednog niza znakova II drugi, ili fun kciju koja uspoređuje d va niza znakova. Za prikaz niza znakova koristite jednodimenzionalno polje znakova.
2 . 1 1 . G lobalne varijable Varijable dekl arirane unu tar funkcije l�vaju se lokalne varijable i ne dostupne su za sve ostale funkcije. Izl askom iz funkcije lokalne varijable nestaju . Mectu t i m , često se j avlja potreba da određene varijable budu dos tupne svim funkcijama. To se može ostvariti na dva n ačina. Prvi je n ačin da se takve varijable prenose kao argumenti funkcija, što je ponekad ne spretno, pogotovo ako se radi o velikom broju varijabli. D rugi n ačin je da se varijable definiraju kao gl� balne. U tom slu čaju promjena vrijednosti varijable u bilo kojoj funkciji automatski mijenja vrijednost varijable u svim funkcijam a. B u d u ći da su globalne varijable dostupne svim funkcijama, broj argum en ata u pozivima funkcija se smanjuje.
Definicija globalne varijable mora biti izvan svih funkcija. Radi pre glednosti programa, n ajčešće se nalazi na p očetku program a. Definicijom globalne varijable odrectlIje se tip varijable i pridjeljlIje joj se memorijski prostor. Prethodni primjer, II kojem je trebalo pročitati niz znakova s tastature i ispisati ga n a zaslon , može se riješiti i korištenjem globalnih varijabli. U tom slu čaju argumenti funkcije uci t aj _string O nisu potrebni .
48
Osn ove p rogramskog
jezika e
1* modif ikac i j a prethodnog programa * 1 1* kor ist enj em globalnih var i j abl i * 1 # include #includ e <stdio . h> v o id uc itaj _string ( vo id ) ; 1* prototip funk c i j e * 1 char string [80] j 1* defin i c ij a globalne var ij able *1
v o id main ( v o id)
{
1* poziv funk c ij a ko j a u� itava n iz znakova *1 ucitaj_ string ( ) ; 1 * ispis ucitanog n iza· znakova * 1 printf ( " \n Ucitani niz znakova j e : %s " , str) ;
} 1* u c i t avanj e niza znakova s t as t ature * 1 v o id u c itaj _ s tring ( vo id)
{ int i j char ch ; for ( i
=
O •'
i < 80 j i++)
{ ch = getche ( ) ; if ( ch = = 1 3 1 / i
==
79)
{
str ing [i] return ;
=
' \0 ' j
1* oznaka kraj a n iza *1
} str ing [iJ
=
ch ;
} }
Detaljnije o glohalnim varijahlam a hit (5. poglavlje).
će
riječi
u
poglavlju o funkcijama
2. 1 2. Sažetak
49
2 . 1 2 . S ažet ak
U prva d va poglavlja knjige prikazane su osnovne karakteristike pro gramskog paketa T U R B O Ci osnovne postavke program skog jezika C. Mogli ste primijetiti da je program ski jezik C, po svojoj strukturi , veoma pogodan za mod ularno programiranje. Mogućnost komunikacije izme(tu pojedinih mod ula i m ogućnos t pisanja programa u niz datoteka pogoduje timskom rješavanju problema. Mnoga pi tanja će se pojaviti upravo sada, jer se o pojedinim problemim a raspravljalo općenito i bez ulaženja u detalje . Međutim , cilj prethodnih poglavlja bio je d a vas upozna sa osnovama programskog jezika C, te da pomoću jednostavnib primjera n auč.ite n apisati i prevesti T URBO C pro gram . Ako ste pažljivo prošli pretbodna poglavlja već ste sada sposobni rješavati jednostavnije programske zadatke, što je dobar u vod u rješavanje složenijih . Prije nego krenete na čitanje ostalih pogl avlja bilo bi dobro da pokušate n apisati nekoliko programa ne samo da hi provjerili nau čeno , n ego i zhog niza pi tanja koja će se javiti u procesu kodiranja program a. Evo i nekoliko prijedloga program a koje ste sigurno sposohni n apisati, a koji će vam moći posl u žiti i kasnije. Prijedlog 1 . Napišite program koji slova u čitan a s tastature ispisuje na zaslon kao mala slova. Prijedlog 2. Napišite program za kopiranje jednog niza znakova u drugi . Prijedlog 3 . Napišite program za usporedhu niza znakova. Prijedlog 4. Napišite program koji hroji koliko puta se slova A i B pojav ljuju u unesenom nizu od 80 znakova.
3 . O S N OVNI TIP OVI P O DATA K A , O P ERAT O RI I IZRAZI
Programski jezik e podržava p e t osnovnih tipova p o d at aka. Na većinu tipova podataka mogu se primijenit i modifikatori . Modifikatori proširuj u znač.enje osnovnih tipova podat aka. Varijable i konstante preds t avljanju osnovne }loda tkov n e objekte kojim a se rukuje u programu . Kombinacijom kon stan t i , -varijabli i operatora n as t aju izrazi. P rema vrsti operatora koji se primjenjuju razli kujemo dvije vrste izraz a - aritmetički i logički. Arit metički m izrazima dodjeljuju se i mijenjaju vrijednosti p ojedinih varijabli u programu . Logi čki izrazi omogu ćuju grananje i donošenje o dre
52
Osnovni tipovi poda taka, opera t ori i izrazi
3 . 1 . Ident ifikat ori
Identifi katori su imen a koja se d odjeljuju varijablama, funkcijama, oz nakama ( labels) kao i ostalim korisnički definiranim ob j ek t ima . Identifikatori se sastoje od niza alfanumeričkih znakova ( brojke i slova ) . B r oj značajnih znakova je broj zn akova pomoću kojih sistem r azlikuj e dva identifikatora (imena) i ovisi o i m plementacij i . Ako je broj zn ačajnih znakova na pri mjer 8, tad a će varijable varijabla1 i varijabla2 biti iste. B r oj znač.aj nih z n ako va u T U RB O e-u je 3 2 . Prv i znak identifikatora mora biti slovo ili donja crta, ( under·score). T U RBO e dozvoljava i upotrebu $ kao j e d nog od znakova iden t ifikatora, s tim da $ ne smije biti na prvom mj es tu . Z a il u str acij u evo n ekoliko pravilno i nepravilno napisanih identifikatora. Pravilno
N e p r avilno
Ime l
l ime
test234
test ! #
prvi Jzraz
prvi . . i z r az
Prog r am s k i j ezik e razlikuje velika i maj a slova ( ca s e sensitil.e) , te t.e varijable test 1 , T Es t 1 i Te s t 1 biti tri po t p u no različ.i te varijable. Iden tifikatori ne smiju biti imena klj u č.n ih r ije č i e-a, kao što su if, els e , fo r , fl oat, double, .... , n i t i imen a fu n k c ija koja se n alaze u potprogramskim bibliotekam a. Dobro je z a imen a varijabli, funkcija ili konstanti odabrati mnem onič.ka, odnosno asocij a t iv n a imena. Većina prevodioca e-a prihvaća 32 značajna zn aka. Mectu tim, i d e n t i fi katori funkcij a i globalnih v ar ij abli bi trebala sadržavati m anj e od 32 znaka. Naime, fun k c ije pisane u e-u mogu se povezivati s funkcijama pisanim u A S S E M B L E R-u , koji nema m ogu ć n os t ra zlikovauja identifikatora s 32 značajna znaka. Za takve funkcije preporučuju se iden tifikatori koji imaju m anje od 6 znakova. Ist o tako, identifikatori ko risničkih funkcija ne bi trebali počinjati sa znakom tl _t l , jer sve funkcije, koje se n alaze u standardnim bibliotekama fu nk cij a , počinju tim znakom , i može se desiti da identifikatori budu isti.
3.2.
K lj učne
rij eči
Klju čne riječi su identifikatori koji im aj u točno određeno z n ače nj e . O ne ne m ogu pred efinirati niti se mogu u p o t rijebi ti kao identifi katori varijahli , konstanti ili oz n aka ( labels). se
9. 2.
53
Ključne riječi
Kl j u č n e r ij e č i, z aj e d no s a sintaksom određenog programs kog jezika, odre đuj u što i kako se u od ređenom prog r ams ko m jeziku može u č in i t i . B r o j k lj u čni h rij eč i često pu ta ne odražava snagu programskog je zika N ai m e, u v ijek se postavlja p i t anje da li je dobro i m at i v el i k b r oj klju č nih riječi ili mogu ćnos t velikog broj a kombin acij a s malim brojem klju čnih riječi . U .
r as prav u
o t ome što je b olje, a što gore nećemo se upuš t ati .
Karak teris t i ka programskog jezik a C je rel at i v n o m ali b roj k lju čn ih riječi . A N S I e s t an d ar d je odredio 32 klj u č ne r ije či Da bi se i s ko r is t ile sve m ogu ćnosti i s p e c i fi č no s t i procesora 8088/808 6 , odnosno 80286, m ogu ćnost pov e zi va nja T U RD O e-a s ost alim p rogr ams ki m je z i c i ma i sL, na po s tojeć i niz A N S I e - a, u T U R B O C- u , je dodano još jedanaest k ljučnih riječi . .
Klj u čne riječi sc
pišu malim slovima.
je u ta bli cam a 3 . 1 . i 3.2.
Pregled svih k ljuč.nih r ij e č i
au t o
dou bl e
int
struct
b re ak
else
long
s wi t ch
c as e
enu m
r egi s t e r
typedef
ch a r
ex t er n
return
u n i on
c o ns t
float
s h or t
u n si g n e d
c on t inue
for
s ign e d
vo i d
d efa ul t
got o
s i zeof
vol at i le
do
if
stat i c
wh i l e
Tablica 3 . 1 .
�regled k lj učnih riječi
asm
_cs
_ds
--B S
cdecl
far
i nte rru pt
ne ar
pascal
Tablica 3 . 2 . Dodatni niz
klj učnih r ij e č i
A NSI e-a
huge
T U R B O e-a
d an
54 3.3.
Osnovni tipovi podataka, operatori i izrazi
Osnovni t ip ovi podataka
Programski jezik C podržava pet osnovnih tipova podataka. To su znakovni , cjelobrojn i , realni , realni dvostruke pr e c iznos t i i t ip pod ataka koji ne sadrži vrijed nos t . Klj u č n e riječi koje određuju n avedene tipove podataka su char, int, float, double i void. Razlika izmectu p ojedi n i h t i p ova po dataka je u b roj u bitova koje zauzimaju pri li k om zapisa u memo r iji. U t ab li c i :3.:J. prikazane su d u lj i ne pojedinih tipova podataka. Pocl duljinom se podrazumijeva broj bitova koje pojedini tip p oda t aka zahtijeva za prikaz u memoriji rač.unala. P rimjer je dan za nekoliko razli čiti1) implementacija C-a. DEC PDP- 1 l
Interdata 8/32
IB M P C
char
8 bitova
8 bitova
8 hitova
int
16
32
16
float
32
32
double
:J2 64
64
64
void
O
O
O
Tablica 3 . 3. Dulj in a osnov n i h tipova podat aka
Iz tahlice se može primijetiti da tip podatka void ne zauzima mjesto u memorij i . Void, tip podatka koji ne sadrži vrijednos t , svrstan je u osnovne tip o ve pod ataka jer se veom a često koristi kod provjere tipova podataka funkcija, za d efi ni r a nj e funkcija bez argumenata i funk c ija koje ne vraćaju nikak vu vrijed nost . O p o d ac i m a , odnosno funkcijama tipa void detaljnije će se rasp ravljati kroz n ar e d n a poglavlja. Budući da je brojem h i t ova odrecten b roj razli čit ih kombin acija koje se mogu p ri kazat i II m emoriji, svaki tip pod at aka karakterizira zapis podat aka u različitim oblicima i veli čin ama. Broj b i t ova II memorij i , koji zauzima znakovni tip pod atka, (char) jest osam . U osam bitova mogu će je z a pam t i t i 256 različitih ko m b i n ac ij a . Iz toga proizlazi da je tip pod ataka char veom a pogodan za zapis alfanumeričkih znakova i s pec ij alni h znakova, odnosno znakova koji č i n e AS CII niza znakova. CjeIobrojni tip podataka, (int) u TURBO e-u , zauzima 1 6 hitova i pogodan je za prikaz cjelobrojnih konstanti malog opsega. Podaci tipa double i float koriste se II programim a koji
55
3. 3. Osn ovni t ipovi poda taka
z ah t ijevaj u zapis velikih brojeva , odnosno u p rogram i m a koji z ah t ij e vaj u od re(tenll preciznost m atematičkih op eracija .
P ravilnim i z b orom t ip ova p o d at aka može se p oveć at i efikasnost pro gr am a . N ai me, nije svejedn o da li se ru kuje s jed nim , d va ili četiri bajt a p o d at aka . Tipove po d at aka t reba zad avati ov is n o o ops egu koj i će o dređen a varij abl a ili konstanta pop ri m iti t ok om i z v ršavanj a programa.
Duljina tipova
p od a taka TU RBO C-a i njihov opseg d ani su u tablici
3.4. Opseg
B ro j hito va
Tip
O do
8
char
255
int
16
-32768 do 32767
float
32
3.4E-38 do 3.4 E+38
double
64
1 .7E-308 do 1 .7E+:108
O
bez vr ij e d nost i
void Tab l i ca
3.4. D u lj i n a i opseg osn ovnih tipova p o d at aka
Osnovni t i povi pod ataka mogu se preciznije definirati p r imj enom odgo var aju ć i h modifikatora. Mo d i fi katori pobliže oclrectuju n ačin zap i s a po d a.t aka 11 me m or ij i računal a. Promjenom n ačina z ap i s a , opseg p ojedini h t i p ova p o d a t aka se m ij enja , p ro š i n�je ili su žava. Mo difi kat or i koji se prim je nj uju u T U R B O C-u j esu :
signed unsigned long short se pišu ispred od reetenog tipa podataka. P ogl ed ajm o kako modifika tor unsigned u tječ.e n a cj el ob roj ni tip p o d at aka ( int ) . P retpostavljena vri je d n os t rjelobrojnog tipa je signed . To znači da varijabla k oj a se deklarira kao int može p o p r i mi t i vrij ednos t izme
i uvije k
ari tmetici d voj n og kom plem en t a b roj 1
I
I
1
I
1
I
]
I
bit za p redz n ak
]
1
1
O
O
o
O
o
O
1
=
- 1 27
56
Osnovni tipovi poda t aka, ope ratori
i
izrazi
gdje b i t za predz n ak ozn ačava + ili - . Mectu tim , ako varijablu d eklariramo kao više n ij e bit predzn aka i kombinacija
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
o
u nsigned int ,
O
O
O
O
t ad a gornj i bit
O
=
65404
poprima n azn ačenu vrijed nost . Da bi se u vjerili u n ačin djelovanj a modifikatora pogledajmo rezul t ate izvršavanj a kratkog test-program �:
1* Pr imj er nac ina dj elovanj a modif ikatora *1 # include <stdio . h> vo id main ( vo id ) { int i; uns igned int j i j = 65409 ; i = ji printf ( " \n i
}
=
�d
j
=
�u" . i , j ) ;
Rezu l t at izvršavanj a program a je:
i
=
- 1 27
j = 65409
Svi lll odifikatori ne mogu se primijeniti na sve tipove podataka. S ve dozvoljene kombin acij e prikazane su u t ablici 3 . 5 . Primjetit ćete da postoj i red u n d an t n os t o drectenih modifi ciranih tipova. Razlog t o m e s u pretpostavl jen e vrijednosti o dre(tenih t i p ova podataka, kao na primjer
unsigned
char i sli čn o .
Varijable t i p a
char
signed int ili
pogo d uju zapisu A S C II- i podataka. Među t im , t ako
deklariran a varijabl a može se upot rijebi ti i kao "mala" cjelobroj n a vrijednost (int ) , u slu čaj u da se vrijednosti koje varij abla poprima n al aze u opsegu izme(tu - 1 28 i 1 27. Osnovna prednost u p otreb e varijable tipa char, umjes to t i p a
int ,
jest u tom e što je rukovanje varij ablama tipa
char mnogo brže .
Da bi se u vjerili II ispravnost iznesenog n apišite za vježbu kratki t est pro gram koj i u jednom slu čaj u , kao i n deks p etlje, koristi varijablu tipa
char,
a
57
:L /. Deklaracija varijabli
Tip podatka
Broj hitova
Opseg
ch ar
8
O d o 255
u n signed char
8
O d o 25.5
signed char
8
- 1 28 do 1 2 7
int
16
- :l2768 do :l2767
unsi g n e d i nt
16
s i g n ed i n t
16
-32768 d o 32767
short i n t
16
- 32768 d o 32767
lo n g in t
32
- 2 1 47483648 do 2 147483647
u n s igned long int
32
O do 4294967295
float
32
3.4E- :l8 do 3 .4 E+:lS
d ouble
64
1 . 7E- 308 do 1 . 7E+308
long double
64
1 . 7E-308
O
d o 655:l5
do
1 . 7 E+:108
Tabl ica :U.i. Dozvoljene kombinacije osnovnih tipova podataka
i
modifikatora
u d rugom var ijabl u tipa int . Budući d a varijabl a t ipa char može poprimiti v rijedno s t izme(tu - 1 28 i + 1 27, što ograničava vrijedn ost indeksa petlje, koristite nekoliko petlji koje se izvršavaju jedna u drugoj .
3 .4 .
D eklaracij a varij abli
Sve varijable koje se koriste u programu m o raj u se d ekl arirat i . Deklaraci jom varijable, zad aje se tip i ime varijable. Opći oblik n aredbe za d eklaraciju varijable je:
lista_varijabli; Tip _podatka predstav lj a jedan od osnovnih ili korisnički defi n i ranih t i p ova pod a t aka . Lista_varijabli p redst avlj a niz varijabli koje će u toku izvršavanja programa sad r žavati v rij e d nos t i zad anog tipa podatka. Ako se lista_varijabli sastoji od više varij abli , one se moraju odvojiti zarezom:
58
Osn ovn i tipovi podataka, opera tori i izrazi
int
a, b ,
C;
float
i, j , k;
unsigned int
t , tt ;
Pod ru l�je djelovanja odre
i njihov sad ržaj se može pročitati i promijeniti u b i l o kojem dijelu pro
gram a. Lokalne varijable d eklariraju se na početku funkcije ( u klju čujući i funkcij u main O ) ili se d eklariraju kao argumen t i funkcije i dostupne su samo tl definiran oj fu n kcij i . Pod pojmom lokalne varijable podrazumijevaju se i varija.ble koje se dekl ariraju n a početku hloka n aredhi . S ve lokalne vari jable d ostupne su samo unutar fun kcije odnosno bloka. Izlaskom iz funkcije odnosIlo bloka u kojem su bile d eklarirane, lokalne varijable više ne postoje. Imen a lokalni h varijabli različitih funkcija, odnosno razli čitih blokova, mogu b i t i potpuno ista. Me
int
Pr imj er deklarac ij e i podrucj a * 1 dj elovanj a var i j abl i *1
globalna ;
1* def inic i j a globalne varij able * 1
v oid i s p i s i _medj urezult at ( v o id ) ; v o i d main ( v o id ) {
1* protot ip funk c i j e *1
9. 5. Konst a n te
59
int
i;
for ( i
=
{
1 * deklara c i j a lokalne var i j abl e *1 O
i < S j i++)
int b l o k = 1 ; 1 * deklarac i j e l okalne var i j ab l e * 1 globalna = globalna + i + blok ; i s p i s i_medj urezultat ( ) ;
} } 1 * f unk c i j a za i s p i s medj urezultat a *1 v o id i s p i s i _medj urezultat ( v o id )
{ pr intf ( " \n Vr i j edno st globalne v ar i j abl e : %d " . globalna ) ;
} Rezul t at izvršavanj a program a: Vr i j edno st Vr i j edno st Vr i j ednost Vri j edno st Vri j ednost
globalne globalne globalne globalne globalne
var i j abl e v ar i j able var i j able var i j able v arij abl e
1 3 6 10 15
Defi n i cijom glob al n e varijahle au tomatski j o j s e dodjeljuje i n i cijaln a vri jed n os t O.
L okalne varijable n e sadrže ini cijalnu v rijednost i moraju se
ini cij al i zi rati posebnom n aredbom . Incijalizacij a lokalnih varijabli može se obav i t i II toku deklaracije:
int
i
=
Oj
ili n eposre�l n o nakon d eklaracije:
int ij i
=
Oj
Neini cij ali z irane lokaln e varijahle s adrže
neodređene vrijednosti.
3 . 5 . Konstant e Pod pojmom kon s t ante podrazumijevaju se vrijednosti koje se zad aju jed n om i
ne mijenjaju
BC tokom izvršavanj a programa.
S obz irom n a tipove
60
Osn ovni tipovi poda t aka, operatori i izrazi
podataka razlikujemo nek oliko tipova k ons t an t i : cjelobrojne realne
- znakovne kons t an te .
Cjelobroj ne konstante ( integer constant) zad aj u s e u opsegu koji ov i si o vrijednostim a koje mogu poprimi t i cjelobrojni t ipovi podataka. Konstante čije su vr ij e d no st i u opsegu između -:J2768 i :J 2 7 6 7 p i šu se kao što smo n av ikli . Na primjer, 3 4 5 , 8765 i t d . M e (tu t i m , dulje cj el o b r oj n e kon s tan te , odnosno cjelo h r ojn e kon s t an t e hez predz n aka, koje ·se pridru žuju varijah lam a dekl arirani m kao long int ili uns igned int , pišu se s oznakama l ili L , o d n osno o z n akam a u ili :u n a kr aj u . N a pri mje r , 1 23456789L, ili 60000u. Cj el ob r ojn e k o n st an t e k oj e n a k raj u imaju ul (UL) predstavljaju d uge kon s t an t e b e z predz n aka (uns igned long int ) . Realne konstante (floating point constan t) sad r ž e decimaInu t očku koja o d vaj a cjelobrojni od decim 3J.nog dijel a konstante. Kao i kod cjelo brojnih kon stanti d u ge realne konstante (long) im aju na kraju l ( L ) . Na pri mj e r , 1 23 . 345 ili - 1 23456789 . 345 L . Realne konstante se mogu pisa t i i u e ks po nen c ij alnoj E notacij i , n a p r i mj e r 1 . 7E- l 0 2 . U pro g rami m a odnosno funkcijama koji trebaj u izluči t i v r ijedn os t i p o j e din i h bitova d aleko je p ogo d nije radi ti s oktalnim ili heksadecimalnim hro jev n i m sustavom . Konstan te koje počinju s O ( n ul a) su oktalne konstante. Na primjer, 0 1 1 je oktalna konstanta č.ija je vrijednost 9 de c i m al n o . Hek sadecimainc konstante p o č inj u s OX. Na p rimjer , heksadecimaIn a kon s t an t a OxFF p r ed s t av lj a broj 255 u decimalnom brojnom sustav u . Programski jez i k e d o z v olj ava upotrebu različitih o blika konstanti u aritm e ti čk i m i logi čkim i z raz i m a . Izraz
a
=
24 + 0 1 1 +
OxFF
je potpuno kore k t an .
Z nakovne konstante ( chamcter constant) zad aju se u n u t ar 1i teraJa , '. Vrijednost konstante od govara numeričkoj vrijednosti z n aka koji se n al az i unutar li terala. Na p r i mje r , n u mer i čka vrije d no st znakovne kon s tant e ' A ' , u A S en nizu z n akova, je 6 5 . Kad a s e znakovna kon stan t a n acte u ar i tm e t i č ki m izrazima, koristi s e isključivo nj e na numerička vr ij ed nost . Znakovne konstante ugl avnom se s as t oj e od jednog zn aka koji s e p i š e izme
61
3. 5. Konst a n t e
zn ačenje. Kori ste se kao mnemonici za kontrolu ispi s a , a uvedene su zbog toga što n e pos toje kao zasebni zn aci i ne mogu se u nijeti preko t astat ure raču n al a . Kodovi i z n ačenja konstan t i koje s e koris te za kon t rolu ispisa d ani s u tablici :1 . 6 .
Kod
u
Zn ačenje
\h
pom ak za jedno mjesto u n azad
\f
n ova st ranica
\n
n ov i r e d
\ 1'
povratak n a početak linije
\t
horizon talni tah u l at or
\"
n avo d n i znak
\'
li teral ( single quote)
\\
ob r nu t a kosa crta
\0
n ul znak
\v
vertikalni t ab u l at o r
\0
oktalna kon s t an t a
\x
heksad eci m ain a kon stanta
( backspace)
(form feed)
( new line) ( carTiage return)
( horizontal tab)
( double quote)
( backslash)
( null character) ( ver·tical tab)
( octal constant) ( hexadecirnal constant)
Tabl i ca 3 . 6 . Ko dovi i z n ačenj a specij alnih znakovnih konstanti
O s im n avedenih tipova kons t an t i koje se mogu dovest i u izravnu vezu s osnovn i m tipovima pod at aka, program ski jezik e definira i konstantu niza znakova (str'ing constant). Konstan t a niza zn akova sas toji se od nula ili više zn akova uuu tar jednog para zn akova n avoda. Na primjer, " Konst ant a " Znakovi navod a n i su d ij el ov i kon stante. Konstan t a niza zn akova zapisuje se u m emor ij i kao jed n o di menzionalno polj e znakova č.iji je zadnj i član nul znak (\0) . Na p r imjer,
K
I
o
I
n
I
s
t
a
I
n
t
a
I
\0
62
Osnovni t ipovi podat aka, operatori i izrazi
N ul znak , \ 0 , d o d aje se au tomatski i označava kraj niza zn akova. Iz toga proizl azi d a je stvarn a d ulj i n a konstante niza zn akova z a j edan d ulj a od broja zn akova koji čine ko nstantu . Posljedica takvog n ačina zapisa je zauzeće dod atnog mjes ta 11 memorij i ( za zapis nul znaka ) . S druge strane, t akav n ač.in zapisa nc pmdavija ograničenje n a broj znakova kon stante, omogu ćava spaj anje n ekoliko ko nstan t i , od rNti vanje numeri čke vrijed nosti kon stante i sli čn o . N a primjer, {\v erb+ "Danas " " j e " " utorak "+ }
isto je što
i {\v erb+ "Danas j e utorak o o + }
Koristeći Ilul z n ak \ 0 , napisat ćemo fun kciju koj a izračunava numeričku vrijed nost kon stante niza zn akova. 1 * odredj ivanj e numer i ck e vr ij edno s t i * 1 1* konstant e niza znakova *1 int {
num_vrij edno st ( char int int
string [ ] )
suma = O ; i = O;
wh ile ( st r ing [i] ! = ' \0 ' ) suma += string [i++] ; return ( s uma) ;
} B i tno je razlikovati zn akovnu kon stantu od kon s t an te niza zn akova koj i se s astoj i od jcdnog znaka. Znakovna kon s t an t a je cjelobrojn a vrijednost zn aka iz A S CII niza i kao t akva se može direk tno u ključivati u izraze. Kon stan t e niza zn akova S11 jednodimen zionalna p olj a zn akova i prem a tome se mogu u klju č i t i u izraze tek n akon što i m se o dredi num eri č.ka vrijednost ( pogled aj gornju fUll kriju ) . Terminološki se ove dvije kon s t ante jasno raz likuju , me(tl1 tim u programu se mogu pojaviti greške jer je sintaksa dosta sli čn a. K ako bismo n aglasili razliku izme(tu ova d va tipa kons t an t i , p ogle d ajmo kako se z n akovn a kon stanta ' A ' , odnosno kon s t an t a niza z n akova " A" zapisuj u u m emorij i račun ala.
3. 6. A ritm eti čki operatori
63
prikaz z n akov n e kon stante
prikaz kon s t an t e niza znakova ( s t r i n g cons t an t )
( ch aracter con s t an t )
I
A
I
I
A
I
\0
I
3 . 6 . Arit met ički op erat ori A ri t m e t i čki operatori koji se ko r i s t e u C - u , ident i čn i su ari t m e t i čkim
operatori m a ostalih p rog r am s k i h j ezi ka . Binarni o p e rat o r i +,
-, *,
/
od go
varaj l\ ari t m e t i čkim op er ac ij am a z b r aj anj a , o d u z i m anj a , m n o ž enj a i dijelje
nj a . Uz n aved ene op e r atore II C- u p ostoj e i b i n ar n i operator % ( modulo ) , te un arIl i operator i p re d z n ak -. Un arni op e ra t or + n e pos t oji , što znači d a za pozi t i v n e
%
Rezul t at
b r oj e ve n ije potreb n o p i sat i p r ed z n ak + .
operacijf' mod ulo j e ostatak cjelobrojnog dijeljenja.
m ože se primijen i t i s am o n a cj el o h ro j n e t i p o v e p o d at ak a .
/* prikaz nac ina dj elovanj a operatora
O p erator
module * /
void main ( v o i d ) { int i, j ; i = 1; j = 2; printf ( l I \n
}
%d % %d
=
%d " , i , j , i%j ) ;
Izvršavanjem program a d obije se: 1
� 2 ·= 1
Tok i z v r š avanja ar i t m et i č k i h o p e r ac ij a određen je p r io r i t e t o m ari t metič kih operatora. Priori tet b inarnih operatora + i - je ni ži od *, / i Y.. P re m a tome II i z raz u e
=
a*b
+
d/e ;
U), a zatim op e rac ij a Kod operatora s i s t i m prior i t etom , t ok i z v r š avan j a ide sli jeva n ad esn o . P r i o r i t e t izv r š av an j a p o j e di nih op eracija se m ože mij enj a t i korištenjem zagrad a. A ko u pre t h o d n i primjer u vrst i m o z agrade prvo
će sc i z v r š i t i operac ij e množenja (*) i d ijelj e n j a
zbraj anja ( + ) .
e
=
( a* (b+d» / e ;
operacija dijeljenja
će se izvršiti p oslj e dnj a .
64
Osn o vni tipovi
podataka, operatori i izrazi
3 . 7. Operat ori inkrement i dekrement
Programski jezik e u vodi dva nova aritmetička operatora, ++ : uvećaj za j edan ( inkrement ) i - - : umanj i za j edan (dekrement ) . Oba ope ratora su unarna i mogu se pisat i ispred ( prefiks ) ili iza ( postfiks ) varijable. Izrazi x = x + lj y = y - lj
su potpuno identični izrazima x++ j y- - ;
Ako je d eklariran a varijabla
int
x = 10 ;
vrijednost varijable n akon izvršenja n aredbe x++ j
ili
+ +X j
je 1 1 i svejedno je d a li se operator n alazi
ispred
ili iza varijable.
Me(tutim , korištenjem navedenih operatora u izrazima stvari se nešto mijenjaju . U izrazima nije s vej e dn o da li se operatori ++ i n alaze ispred ili iza varijable. O položaju operatora u odnosu na varijablu ovisi kada će se vrijecl nost varijable povećati odnosno smanj it i ( side efect ) . Naime, ako se operator + + nalazi isp1'ed varijable, tada se vrijednost varijable prvo poveća, a zatim se uvećana vrijednost koristi u izrazu . Ako je operator iza varijahle, t ad a se u izrazu uzima trenutna vrijednost varijable, a n akon izraču n avanja izraza uveća se vrijednost varijable. N a primjer: n eka je y = 1 0 . Izračun avanjem izraza - -
x = ++y ;
vrijednost varijable y se prvo poveća za 1 , čime je vrijednost varijable y jednaka 1 1 . Zatim se ta vrijednost pridruži varijabli x. Konačna vrijednost varijabli x i y je 1 1 . S druge strane , izračunavanjem izraza. x = y++ ;
varijabli x se pridru ži . v rijednost varijable y, koja je jedn aka 1 0 , a zatim se poveća vrijednost varijable y. Vrijednost varijable x nakon izračunavanja gornjag izraza je 1 0 , a varijable y je 1 1 .
3. B. Rc/arij.ski i logički opera tori Pažlj i vim od a b i rom
razumljivost
65
inkrement i dekrement operatora m ože se poboljšati p r i mj er , odsječak programa
i p reglednost kod a. N a
if ( a == 1 )
{
polj a Ci] = 1 ; i = i + 1;
}
m ože s e pi sat i
if ( a == 1 ) polj a [i++] Ink7'C7ncnt
=
1;
i dek1'Cment ne mogu i zrazi
se
primijeni ti
n a ari t m e t i čke izraze i
kon s t ante. P re m a tom e
(x + y ) ++ ;
ili
1 . 234++
pogrešni. N aved eni op era t or i su n a p r vi p ogl ed pomalo n eo b i čni i ne s pr e t n i , ule(tu t i m , got o vo da n e m a e p rogram a u koj im a se ne pojavljuj u .
Sll
3.8.
Relacijski
i
logički operatori
Relacijski i logički o p e ratori određuju p o vezanos t d viju varij ahli , funkcije ili i zraz a . Relacijskim op erato r i m a može se u s t an ovi t i u kakvom s u o d n osu dvije vrijednosti; jed n a veća od d ruge, m anj a ili j edn aka i sl . Logi čki opera t ori p o vezuj u d va op e r an d a , p r ed s t avlj en a logi čkim vrijednos t i m a O (laž) ili 1 (istina) , (false ili true) , i kao re z ul t a t d aj u v r ij e d nost odre(tenu logičkim operatorom . Rezul t a t i rel acijskih i log i č k i h izraza m ogu poprimiti samo d v ij e v rijedn o s t i O il i 1 , odnosno mogu biti laž ili istina. P regled i z n ačenje
relacijskih
Rel acijski o p e r a t ori i m aj u m a to m e ,
1'
t <
operatora prikazano
niži p r ior i t e t od a ri t m e ti čkih
e (1 0 sl ij e d izv r š a vanja i zr aza
i + 1
je t ablicom 3 . 7. operatora. P re
66
Osnovni tipovi podataka, operatori i izrazi
O p e r at o r
O p er ac ij a
Tip o p eran d a
Tip rezultata
<
m anj e od
osnovni tip p o d at aka ili p o kazi va č
cjelobrojni
>
veće od
osnovni tip pod ataka ili p o k az i va č
cjelobrojni
--
j ed n a k o
osnovni tip pod ataka i l i p okazi va č
cjelohrojni
<=
m anje ili j ed n ak o
osnovni tip p od at aka iH p o kazi vač
cjelohrojni
•
>=
veće ili j e d n a k o
osnovni tip podat aka iH p okazi va č
cjelohrojni
! =
r azl i č i t o
osn ovni tip pod ataka ili p okazi va č
cjelohrojni
Tablica 3 . 7 . Relacijski operatori je
t < (i
+ 1)
što z n ač i el a se p r v o obavi operacija zbrajanja, a zatim u spoređuje v r ij ed n o sti varijable t i dobiv e n og re z ul tat a.
Evo još n ekoliko p ri mj era koji p okaz uj u redoslijed izvršavanja i rez ul t a t relacijskih izraza. Prvo se izvršavaju izrazi II zagradam a .
izraz
rezultat
redoslijed izvršavanja
4<5
1 ( i s t in a )
(4 < 5)
5 * 2 >= 10
1 ( istina)
(5 * 2) > = 1 0
J!
= 7 == O
O ( laž)
(l!
=
7) = = O
Sim h oli i z n ače nje l ogić.k i h operatora e-a prikazani su t ahIi co m 3.8. Rezul tat iz v r š avanja logičkih i zraza je O ili 1 (false ili tT'Ue) , i ovisi o priori tetu i tipu operatora. Tablica i s tini tosti za logi čk e op er at o re pr i kaz an a je u tablici :3 .9.
N aj v e ć. i pr i o r i t e t II izvršavanju logi čkih izraza ima o p e ra t o r Prema tome, rezult at l ogičkog izraza
!
(negacija).
67
3. 8. Relacijski i logički opera t ori
O p erat o r &&
II
logi čki
,
n egacija
osnovni tip podataka
(AND)
logički I
cjelobrojni
ILI
o s n ov n i t i p p o d a taka
cjelob rojni
( N OT)
os n ovn i t i p p o d a t ak a
cj elobrojni
( O R)
Tablica :l . 8 . Prf'gled
i
znač.enje
logički h operatora e-a
&& y
II
!x
x
y
O
O
O
O
1
1
O
O
1
O
O
1
O
l
1
l
1
1
1
O
Tab lica
Tip rezul tata
T i p op e ran cl a
Operacija
3.9.
x
x
y
Tab l i ca istinitosti logičkih op e r acij a
l U !O 1 1 1 je 1 ( trile). K ao i kod os t ali h izraza redoslijed izvršavanja m o ž e se p ro m ij e n i t i koriš tenjem zagrad a. Tako će rez ul t at pre t h o dn o g izraza uz dvije zagrade 1
U ! (O I I 1 )
b i t i p o t p u n o su protan ,
tj .
O
(false) .
Ako se II izr az u n a(te v i še l ogi ć.kih z agr a d a prioritet izvršavanja je s lj e d e ć i
i rel acij ski h operatora, i ako n em a
N aj viši priori tet
>
>= ! =
&& N aj n i Ži
II
<
<=
68
Osn ovni tipovi poda taka, ope ra t ori i izrazi
Logi čki operator ! se veom a često koristi u izrazu if ( ! izraz) koji je p ot p u n o
if (izraz
Koji ć.e
se od
jed n ak izrazu
==
O)
izraza koristiti ovisi o samom programeru .
N aj češće greške koje
se javljaju kod primjene logičkih operatora
k
11 t o u
k odi r a n ja p rogram a su :
a &&
/*
a l b
/ * operator
a lul b
/* razmak (space, u) nije
&a
/ * izraz d aje
d taj e jeda.n operan d */
n e os
za
rad
s
bi t o v i m a * / do zv olj e n
ad resu varij abl e
*/
a */
Za vježbu možete napisati kratki program koji će ispisivati rezul tate logi čkih operacija. Ulazni parametri moraju imati vrijednos ti O ili 1 .
3.9.
Op erator pridruživanja vrijednost i i izrazi
Kombin acijom varijabli , kon stanti i o p er at o ra n astaju izrazi. P rema vrsti operatora razlikujemo d v ije vrste izraza: arit metičke i logičke . U nared bi za dodjeljivanje vrijednosti, čiji je opći obli k :
varija b la
=
iz raz ;
strana izraza pov ez an e Sll operatorom pridruživanja vri Uloga operatora pridru živanja jest d a vrijednost desne strane izraza d o dijeli (preslika) varijabli na lijevoj strani izraza.
lijeva i
d es n a
jed nosti Za
=.
ff\zliku od većine programskih jezik a , e doz volj ava da se op e r at or lI a(1e II i zrazi m a koji sa.d rže druge opera.tore. Na. primjer , u
pri d ru ži vanj a
naredbi if « i
=
a *
e)
<
20 )
opera.tor pridru živa.nja se nalazi unutar logičkog izraza. Budući operator pridruživa.nja ima najniži prioritet izvršavanja, aritmetičke operacije moraju
3. 1 0. Prdvorba t ipova poda taka
69
Tok izvršavanja gore n av e den og izraza je sljede ći . Vari i se prvo pri d r u ž i umnožak varijabli a i e , a zatim se izvrši u spored ba v rijednosti var ij able i s vrijed n ošću cjelobrojne kons t an t e 20. Evo j oš neko liko primjera: b it i
II zagrad ama.
j abli
x = ( i = 2) + (e = 3 ) ; Varij a b l i i se p r id r u ž i v rij ed nos t 2 , zat i m se varijabli e pridruži vrijed n ost 3, p o t om se izvrši ari tmetička op erac ija zbrajanja i dobiven a vrijednost se p rid ru ži varijabli x. Sljed eći primjer je izraz v i š est r ukog pridru živanja, x
= i = e =
O;
B u du ći d a je red oslijed izvršavanja operacij a pridru živanja zdesna nali se var ijabli e p r i druži vrijednost O , zatim se vrijednost varijable e pridruži var ijabli i , č i j a se vr ij edn os t pridru ži varij ab li x .
je110 prvo
Operator pridru živanja se može n aći u k omb i n acij i s ar itmetičk i m opera torima. Tak ve kom b i n acije čine jedinstvene ko n s t r u k cij e aritmetičkih izraza koje su karakteristične za progr am sk i jezik C. N a primjer, a += 1 0 ; a - = 10 ; a /= 2 ;
a * = 10+b ; a + = ++b+20 ; a Y.= 3 ;
N ave (lfm i ari tmeti čki izrazi izgle d aj u na prvi pogle d n ej as n o . Me (tu t im , ako se uzme II obzir r edoslij e d izvršavanja zdesna n alijevo, može se uočiti d a takav n ačin zapisa pre ds t avlj a skraćeni oblik p i sanja aritmeti čkih izraza. Z n ačenj a gore n ap i s anill , sk rać.enih izraza su : a = a + 10 ; a = a - lO ; ' a = a I 2;
a = a * 10 + b; a = a + b + 1 + 20 ; a = a. Y. 3 ;
Izbor n ačina pisanja potpuno je proizvoljan i o nj em u ne ovisi brzina izvr šavanja programa, jedi n o je kod skraćenih oblika kod programa nešto kraći .
3 . 1 0 . P ret vorba t ip ova p o dat aka
Tip rezultata aritmetičkih izraza, g dje su operan di istog t i pa , odgovara tipu operanada. N a primjer, rezultat aritm e t ič kog izraza b * e ; gdje su o p e r an d i b i e cjelobrojn i tipovi podat aka ( int) , cjelobrojnog je t i pa .
Osn ovni tipo vi podat aka, operatori i izrazi
70
Me
u izraz i m a se
gotovo redovno p oj a v1j uj u
različiti t i p ovi ope
ran ad a . U to k u iz rač.un avanj a t ak v i h izraza različiti tipovi p o d a t aka s vo d e s e n a isti t i p prem a
p o d at aka .
u g rade n i m pravili m a za pretvaranje ( k o n ve r z ij u ) t i p ova
P ravil a za pret varanje t i p o va podataka sas t avni su dio program
skog jezika e i or ije n t i r an a Sl] prema " v i šem" t i p u p o d atka. To znači d a će t i p rezul t at a izraz a,
kojem su operan di cj clohroj ni
II
(double).
b i t i realni
( i nt )
i realni
(double),
Prema ugradenim pravili m a za p r e t var a nj a tipova p o
d at aka vrijedi :
1 . Svi p o d aci t i pa
2 . Ako
tl
i z r azu p ostoji b i l o koji operan d
pret varaj u
3 . Ako
char i s hort p r e t var aj u se
II
int ,
a p o d aci
tipa float
double;
tl t i p
II
double i
re z u l t at je t i p a
tl i z r a z u postoji o p er an d tipa
u tip
long i
r e z u l t a t je t i p a
Bu d u ći d a
se prem a p r v o m
double ;
long,
tada se svi podaci pretvaraj u
long;
4. Ako je bilo koji od operan ad a ost ali o p e r an d i s c pret varaj u u 5 . Ako su svi o p eran d i t i p a
t i pa double, tada se s v i po d a ci
unsigned i
int , tad a je i
pravil u
unsigned , s v i t i pa unsigned j
11 iz r azu dekl ariran kao
rezul tat je
rezul t at t i p a
svi p o d aci tipa
int .
char pretvaraju
tl cje1o
hroj ni t i p p o d a t a ka (int ), p ro i z l az i da se oni m ogu , bez i kak ve d o d atne pr e t v o r h e , u klj u či vat i u ari t m e t i čke i zraze. U tom slu čaj u uzi m a se nj ih ova cjeloh roj II a vrijed nost . Prvo prav ilo t akoder kaže da se s v i
p r e t var aj u II
double,
pod aci
tipa
float
što zn ači da se ari t m e ti ka pokretnog zarez a u e-u
u v ijek obavlja d vostrukom preciznošću .
Najčešći n az i v i koj i se
koriste II
l i t eraturi za pret varanje razli č i tih ti pova
po d a t ak a tokom i zraču n avanj a izraza su :
automatsko pretvaranje (au tomatic conversion ) , i implicit no p retvaranje (implicit convers ion) . Pri kaz au t o m a t s kog pret varanja t i p ova p o d a t aka pre m a n aved enim pra
vili m a d an
je
sljed e ć i m pri mjerom . P retpos t av i m o d a su p od a c i dekl ari rani
kao :
char
c ,·
int
i;
f l o at
f ,·
doub l e
d '•
Izraz gl as i
71
3. 10. Pretvorba tipova poda t a ka
rezul t at
=
Cc
+
i)
*
Cf
+
d) - Cf
*
i) ;
Postu pak pretvaranja je sljedeći : rezultat
=
(e
+
i)
*
(f
\;
l int l
+
d) - ( f
l
� �b l e
dO ble
*
i) ;
� l
dO b l e
double
doub l e
�
doub l e
Osim n avedenog, i kori štenje operatora pridruživanja aktivira au tomat sko pretvaranje podataka. N ct primjer, int doub l e d = i;
i; d;
Prethodnim izrazom će se cjelobrojna vrijednost varijable i prvo pretvoriti odgovaraj u ću realnu vrijednost, a zatim će se pridružiti varijahli d . Ako se izraz napiše kao
II
i
=
d;
tada se va.rijabli i prid r1J žuje cJdobrojna vrijednost varijable d . Cjelohrojna vrijed nost se dobije "odhacivanjem" decimalnog dijela. Pritom treha imati na umu da nema zaokruživanja i rezultat može od stupati od očekivanog .
razlikl1 od automatske (implicitne) pretvorbe podataka, koja se odvija prema ugra(1cnim pravilima, u aritmetičkim izrazima se pretvorba podataka može zadat i eksplicit no . Eksplicitna pretvorba ima viši prioritet od au tom atske. To znači d a će se pretvaranje tipova pod ataka obaviti hez obzira na pravila koja vrijede za au tomatsku pret vorhu. Za eksplicitnu pretvorhu ti pova podataka koristi se cast operator. Opći oblik izraza za ekspli citnu pret vorbu je: .
Za
( t ip _p o datka) operan d j
gdje su zagrade O oznake cast operatora, tip_podatka jed an od tipova podat aka d efi niranih u C-u , a operand varijahla ili aritmetički izraz . Na primjer,
72
Osn o vni t ipovi poda t a ka, opera t o ri
i
=
x
=
e =
i
izrazi
( int ) (d + 1 . 23 5 ) ; ( f l o at ) « int ) i + 1 ) ; ( doub l e ) ( x = 105) ;
Vrijednost varij ahl e ill aritmeti čkog izraza n a desnoj strani ć e s e , prij e n ego se p ri d ru ži varij abli na lijevoj stran i , p retvori t i u z adani t i p . D akle , II izrazu e =
(doubl e ) (x
=
105) ;
varij ahli x se prvo pridru ž i cjeloh rojn a vrijednos t 1 0 5 , a z a t im se t a vri
jed n o s t pre t vori u realni h roj d ,.ostruke preciznosti i pridru ži varij abli c. Cast op erator je ll lJ afll i operator i im a isti prioritet" i redoslijed izvršavanja ( z d es n a n alijpvo) kao o s t al i un arni operatori. Zhog redoslijeda izvršavanja izraz
( int)
x =
« int ) x )
77 ; =
smisla i
je ekvival en t an izraz u
77 ;
koj i
nema
nije ispmvan.
hiti
r iječi u 8. p ogl avlj u .
Varijahla x j e d eklari ran a kao double x .
C as t operatori se veoma često koriste u e programim a i o nj ima ć e još
3 . 11. �aj češće greške Prij e n ego
se izlože
ostal e
mogućnosti
program skog j ezika C, p on ovit
ćem o još jednom n aj češće tipove grešaka koj i se poj avlj uju u arit m e t ičkim i logi čki m izrazima. S v rh a ovog p on avlj anj a j es t d a vam skrene pažnj u na
činjenice
koje s t e mož d a
previdjeli ili
ste mislili da one nisu toliko važn e ,
a m ogu izazvati logičke p ogreške u programu .
Budu ći d a j e otkrivanje
logi č.kih grešaka u p rogramu d aleko složenije, one se m ogu izbjeći pažljivim kodi ranjem program a, a prije s vega razumijevanjem n apisanog . B u d u ći pro gram ski jezik C lI vo di n ove oblike z ap i s a aritmet i čkih izraza, n ove opera tore ( i n kr elll ell t , d ekremen t , cas t ) , te logi čke operatore za rad s b i t ov i m a, n eop h o d n o je posve t i t i odre
N aj češć.e greške koje s e j avlj aj u s u :
1 .)
if (a
=
b) {
3. 1 1 . Najčešće greške
73
i b. Iza u vj e t n og izraza postoj i niz n ared bi koje se trebaju izvršiti u slu č.aju d a su v r ij e d n o s ti varij able a i b iste. Me
if ( a
==
se ispitati jednakost
varij abli a
b) {
Inkrement i d ekrement operatori m ogu se primijeniti sam o n a varijahle. P rem a tome izraz
2.)
(i + j)++ pr o u z rok uj e grcšku .
j
=
Ako je vrijf'
=
=
1 0 , n akon izraza
++i
vrijednosti ohje var ijab l e s u l l .
j
i
Me
i z r az a
i ++
vrijednost varijahIl' j j e 1 0 , a var ij abl e i je
11.
:3 . ) Ve o m a
(�esto se j av lj aj u greške pri k or i š t enju l og i č k i h operatora AND ( I I ) . Tak vi op eratori se veom a čes to miješaj u s o p era t or i m a za h i tov i m a ( bitwise operators).
(&&) i OR
rad
s
Tipihla g re š ka koj a se javlja je: a
=
e
& dj
e
&& d j
umjesto a
=
U gornjem izrazu l ogička operacij a I (AND) i zv r š i t će s e izme(tu l ogi č k i h v r ije d n o s ti pojedinih b i to v a varijabli e i d, d o k će se u donjem izrazu logička op er ac ij a I (AND) i z vr š i t i izmectu logi čkih v r ij ed no s t i va 7'ijabli e i d . Rezul t at n aj češće nije isti.
4 . KO NTRO LA TOKA P RO GRAMA
U pro ced u ralnim program skim jezici m a, koj i m a pripad a i programski jezik C, n ared he se izv ršavaj u sekvencijalno, tj . redoslijedom u kojem su n ap i sane. N arcdhe za kon t rolu toka program a omogućuju p reusmjeravanje
toka progra:m a i pon avljanje jedne ili v i še n aredhi . P rogram ski jezik e sadrži sve n ared h e n eoph od n e za gr ađu struk turiranih program a. Skup n aredhi za kon trolu t oka programa može s e po dijeli ti u četiri Prvu grupu čine n aredhe uvjet nih i višestrukih uvjetnih gra nanja (if . i f - e l s e i f - e l s e ) . Drugu grupu čine n aredhe za ponav ljanje dijelova programa, odnosno programske petlje (f or . whil e . do-whi l e ) . Treć.u grupu čini n aredh a za ispitivanje niza stanja varijabli
grupe.
ili izraza ( swit ch-cas e ) , a u četv r t u grupu pripad a n ared ba bezuvj etnog skoka, goto . Ve ć i n a n aredb i je kori š t en a u dosad ašnjim primjeri m a , t ako d a s e n ačin djel ovanja pojedinih n aredbi m ogao z aklj u č i t i an alizom d anih primjera. Me đu t i m , II ovom poglavlju m nogo j e det alj n ij e opisan cijeli skup n aredb i .
76
Ko n t rola t oka progra m a
4 . 1 . N ared b e i blokovi naredbi P rij e n ego obj asnimo n aredbe za kont rolu t oka
objas n i t i pojmove
ment ) .
Sve
n ar e d be
int
a =
u
naredba ( statement ) i blok
p rogram a neoph o d n o je naredbi ( compound sta te
C-u završ avaj u o zn ak o m kraja n ared b e
(j).
Na primjer ,
1 ;
Ako ozn aka kr aj a n ared be stoji samostalno
printf ( " Naredba" ) ; 1 * naredba * 1 1 * nul naredba * 1
ona prech; t avlj a nul naredbu ( null statement ) . N u l n ared b a n e Jl okrefe ni kak v u akciju . Koris t i se II sl u čaje vima u ko j im a je n eophodno zado volj i t i s i n t aksu od re(tenih n a re db i . Primjer korišt enj a 11111 n a red b e d an je II po gl avlju 4 . 5 . 0 . u kojem se obj ašnj ava beskon ačn a for petlj a - for ( ; ; ) . N i z n ared h i koj i č ini jednu logičku i izvršnu cjeli n u , n aziva se blok blo kovi n aredbi II C-u o z n ače ni su ozrwkom početka bloka, { i oznakom kmja bloka, } . N a primjer,
nared bi. Svi {
a = b + e; pr intf ( " \n Vri j edno st var i j able a
} Blok
naredb i
=
%d" , a ) ;
može se n al azi t i i unutar dr u g i h blokova.
4 . 2 . J ednost ruka uvj et na grananj a O p ć i oblik n aredbe za
if (uvjet) { }
blok naredbi;
jednostruko uvjetno grananje programa je:
77
4 . 2. Jednostruka lwjel n a grananja Ako j e
uvjet
i s p u njen , odnosno ako je
istinit ,
izvršava se
blok naredbi.
U protivnom n ared b e koje se n al aze u bloku s e preskaču . Blok n ared bi se može sastoj at i od jed n e ili v i še n aredb i . K ao pri mjer jednostrukog u vjetnog gran anj a možemo n apisati kratki program koji ispi tlIje parnost unesenog broja. 1 * Primj er j edno strukog uvj etnog grananj a programa * 1 naredba 1* if *1
v o id main ( v o id )
{
f l o at
f;
printf ( " \n Zadaj te broj : " ) ; 1* ucitav anj e zadanog broj a * 1 s c anf ( " %f " , tf ) ; if « ( f /2) - ( int ) ( f / 2 » = = O) 1* i s p it ivanj e p arno s t i * 1 p r i n t f ( " \n B r o j % f j e PARAN" , f ) ;
} Za razliku od veći n e p rogram skih jezika koji z ah t ijevaju d a j e
logički izraz,
uvjet gran anj a Uvjet
p rogram ski jezik C ne p os t avlj a takvo ograni čenj e .
m ože b i t i bilo koj i logički ili aritmetički izraz. B l ok n an'db i koji izvrš i t će se ako je rezultat izraza različit od nule. P rem a tome, ako se hlok n ared hi t reha izvrš i t i kad a je rezul t at i zraza r azli (�it od nule, t ad a
C-u slijedi
II
uvjet u može izost av i t i logi čki op erator jednakosti ( = = ) , odnosno u mjesto logi čkog može se n ap i s.ati ari t m e t i čki izraz . N a primjer , neka se
se u
u mjesto ispi t i vanj a p arn ost i broja ispi tuje neparn ost zadan og broj a . program a koj i ispi tuje n ep arnos t un esenog b roj a glasi: if « ( f / 2 ) - ( int ) ( f /2 » ! = O) pr int f ( " \n Broj % f j e NEPARA N " , f l ; što je ekvival e n t n o if « ( f / 2 ) - ( int ) ( f /2 » ) pr intf ( " \n Broj %f j e NEPARAN " , f l ; Prem a iznesenom vrijedi da je n ared b a if ( ! a )
Dio
78
Kontrola toka programa
ekvival entna naredbi if ( a
-- O)
Pogledajmo zašto. Neka je vrijednost varijable a = l . U prvoj n aredbi , u n ami operator ima viši prioritet i pretvara vrijed nost varijahle a u O. B u d u ći da se blok naredhi izvršava tek onda kad je vrijednost izraza ra zličita od nule, što ovdje nije slu čaj , hlok naredbi se ne izvršava. U drugom slu č aj u očito je da u vjet nije ispunjen i da blok naredbi neće biti izveden . A ko se blok naredbi sastnji od jedne naredbe, ozn ake početka { i kraja bloka } nisu neophodne. Sumiraju ći izneseno; odsječak programa koji ispituje pamost broja može se n apisati if ( ! « f/2 ) - ( int ) (f/2 » ) 1 * i s p it i vanj e parnos t i * 1 printf ( " \n B r o j Xf j e P A RU " , f l ;
Izostavlja.nje oznaka početka i k raja bloka n aredbi ponekad m ože dovesti do odre
4 . 3 . Višestruka uvj et na grananj a
Opći oblici n aredbi višestrukih u vjetnih grananja program a s u : if {
(uvjeti)
} l�lse { }
odnosno
blok uaredbi1;
hlok uaredbi2;
79
4· 3. Višesln,ka 1111jetna grananja
if (uvjct I ) { blok narcdbil; } else if ( uvjct2) { blok llal'edbi2j } _
.
.
.
.
.
.
.
.
.
else if (uvjct N- l ) { blok nal'edbi N- l j } else { blok nal'cdhi N j }
K ao i kod nar ed h e za je dn o st ru k o u vjetn o grananje , uvjet m o že biti uvjetni ili arit metički izraz . Za prvi oblik n aredbe if-else vr ij e di : ako je l o gi č ki u vjet is p u nj en ( i st i ni t ) , odnosno ako je vrij ednost aritmetič.kog izraza ra zličita od 0, i zvršava se blok naredbil i preskače blok naredbi2, u pro tivnom se p reskače blok naredbi1 i izvršava blok naredbi2 . Drugi o b lik naredbe if-else if-else o m ogu ć ava u zas t opn o isp i t i vanje niza u vj eta. Ako je bilo koji u vjet is p u njen ( istini t) ili r az li č i t od nule izvršava se bl o k naredbi p r i d ru ž en t o m u vjetu , a svi o s t ali blokovi se preskaču . B roj uvjeta koj i se ispit uj u sa else if nije ogran i čen. .
Pogl ed aj m o n ekoliko pri mje ra. Prethodni program za is p i t i vanje par nosti hroja �n ožem o p ro š i ri t i tako da se na zaslon i spisuj e da li je broj paran ili n e paran Od sječak p r ograma bi glasi o : .
if « ( f / 2 ) - ( int ) ( f/2» == o ) pr intf ( " \n Broj % f j e PARAN " , f l ; else pr intf ( " \n Broj %f je NEPARAN " , f ) ;
funkciji za h i narn o pretraži pretraživanje se radi t ako da se vrijed n o st t raženog elementa prvo u s p o redi s vr ije d nosti elementa p olj a u sred i n i . A ko j e vr ijed n o st manja, tada se u s p o re (tuj e s vrij e d n o š ću eleme n t a II sredini prve pol o vine polja i tako cl alje. V išes t ru ko u vjetn o grananje p r i mje n i t ćemo u vanj e ( binll7'Y sea7'Ch ) Ufectenog polja. B inarn o
K on troia toka progra m a
80
/ * f unkc ij a z a b inarno pretraz i vanj e * 1
int b inpre ( int { int
v r i j ednost ,
gornj i , donj i , sr edina ;
g ornj i = br_ cI_polj a donj i = O ;
-
1;
gornj i )
wh i l e ( d onj i <=
{
int polj e [ J , i n t br_cI_pol j a )
sredina = ( donj i + gornj i ) / 2 ; if ( vrij ednost < PQlj e [sredina] )
gorn j i
=
sred ina
-
li
1* l i j eva polov ina *1
( vr i j ednost > polj e [sred ina] ) gornj i = s red ina + 1 ; 1 * de sna p o l o v ina * 1
else if
else r eturn ( sred ina) ;
}
1* vrat i trazeni indeks elana pol j a */
print! ( " \n Traz ena vrij ednos t nij e
r eturn ( - 1 ) ;
}
u
polju . . . . .
"
);
KOllstrn keija if-else if- e l s e kori s t i se z a ispitivanje vrijednost i jedne va rijable ili iZHlza, dok se gnijež(tenje n aredbi za u vjet na grananja najčešće koristi z a ispitivanje vrijed n o s t i niza 17arijabli ili izraza. P rogram ski jezik e ne postavlja ogran i čenja. n a dubinu llgnježđivanja. Gnijež<1enje ( ncsting) je prikazano sljedećim primjerom : if {
}
(uvjet1 ) if (uvjd2 ) { if (llvjet3 ) { }
}
Svaka od n aredbi if nnutar gnijezd a može b i ti if-else, o d n o s n o if-else if -else konstrukcija. Pri tom hi bilo dobro pazi ti da se dijelovi kon s t rukcij a
.., . .., . Naredba switch- case
81
s mj e š taju n a r azinu gn ij ez d a koj u diktira počet ak konstrukcije. Nepažlj i v i m gnijež(tenjem n are d h i mogu se pojav i t i o dređene logičke greške. N a primjer, it ( x
10)
==
if ( y = = 20) pr intf ( " \n • • • • • • • • • • • • " ) ;
els e printf ( " \n . . . . . . . . . . . . " ) ;
B u d u ći da se blok n aredbi p rve n ared be if (x == 1 0 ) sastoji od jedne n aredb e if (y = = 20) o z n aka početka bl oka, prem a sintak s i e-a, n ij e n e ophodna. Isto vrijed i i za dru g u n aredbu if (y == 20) , odnosno else. Dakle, sintak tički gle d an o sve je u redu. Među ti m , postavlja se p i t anj e kad a će se n a zaslonu račun ala prikazati niz zvjezdica, a kad niz to č aka. Drugim riječ.ima, d a li else p r i pad a p rvoj i li d r u go j n aredbi if. Ako else pr i p ad a prvoj n are dh i if tad a se niz točaka prikazuje kad a je is p u nje n u vj e t d a je x različito od 1 0 . Ako else p r i p ad a d rugoj n aredbi if, tad a se niz točaka prikazuje uz ispunjenje u vj eta da je x jed nako 10 i y različito od 2 0 . DiJemu rj e ša va p rav i l o : else ut,ijek pripada najbližoj naredbi if.
Uvlačenje nare d b i , odnosno bl okova n aredb i , o s igu rava veću pregled nost poveza n o s t i pojedi ni h dij elova program a , prem d a ne djeluje na l ogi k u iz vo (te nj a program a. Iz n ačina n a koj i je napisan pretbodni pr i m j er m oglo se odmah uočiti da else pr i pada d r u goj n aredbi if. Me(tut im , da je pr i mj er bio n apisan n a sljedeći nači n : it ( x = = 1 0 ) i f ( y == 2 0 ) pr intf ( " \n • • • • • • • • • • • • io ) ;
els e print� ( " \n . . . . . . . . . . . . " ) ;
bilo bi to teže uočlj i v o.
4.4.
Naredba
swit ch- case
Naredha switch-case je p ogod n a p ri v iš est rukom g ran an j u progr am a. Ona omogu čava iz b or jed nog izme(tu v i še mogućih puteva d alj nj eg i zvo đenj a programa, što ovisi o vrijednosti koju poprima varijabla odnosno izraz . Opća struktura naredbe glasi:
Konlrola toka program a
82 swit cb ( izraz )
{
case konstanta 1 : blok naredbi 1 ;
break;
case konstanta
2: blok naredbi 2 ; b re ak ; case konstanta N- l : blok naredbi N - l ; b re ak; d efaul t :
}
blok naredbi N ; bre ak ;
Isti logi čki tok p ro gr am a mogao bi se ostvariti i nizom n aredbi if, odnosno kor i š te nj em if-else if-else ko n stru k c ij e. Međutim , za istu akciju se korište njem if-else if-else konstrukcije, u najgorem sl u č aj u , izračunava N izraza i obavlja N-l u sp ored b a , dok se naredbom switch-case izračunava 1 i z raz i vrši N- l u sporedba. Osim toga, kor i š tenje switch-case n ared be pridonosi
boljoj pregled nosti programa.
Tok i z v rš avanja switch-case naredbe je s lj e d e ći : prvo se iz r aču n a vri jednost izraza, a zatim se vrši usporedba s konstantama: konstanta 1 , konstanta 2 , . . . , konstanta N- l . Ako je izračunati izraz jednak nekoj od konstan t i , ta(l a se izvršava blok n aredbi pridru žen t o j konstanti. U pro tivnom , ako rezultat izraza nije jednak ni jednoj od n avedenih konstanti , izvršava se blok nared bi p r i d ru ž en opciji default . Iz v r š avanj e bloka n are d b i pridru ženog odrec!enoj kon stanti prekid a se naredbom break ili zagr ad om } koja označava kraj switch-case naredbe. O p cij a default se, z aj e dno sa pripadnim blokom n ared bi, m ože izostaviti . Tada se, u slu čaju d a vrijednos t i z raz a nije jednaka n i jed n o j k o n s t an t i , i zv r š avanj e programa n astavlja o d prve n aredbe k o j a slijedi i za switch-case strukture.
Postoje još n eka p r avil a koja j e potrebno imati na umu pri ko rišt enju s witch-case :
n ared be
n ared ba switch-case razlikuje se od naredbe if-else if- else po tome što se TI case može i s pi ti vati samo jednakost rezult at a i konstante, dok II n ar e d hi if mOŽe biti bilo koji uvjetni izraz dvije konstan te TI case ne m ogu imati i s t u vrijednost , osim u slu čaju da se n are d h a switch-case n alazi unutar druge switch- case naredbe
83
4.4. Naredba switch- case ako blok n aredbi u case ne završava s blok n aredbi sljedećeg case.
break, n ast avlj a se izvršavat i
U sljedećih nekoliko primjera prikazane su neke m ogu ćn osti korištenj a n a redbe switch- case. Naredba switch-case n aj češće se koris ti u funkcij am a za oblikovanje i zb ora ( meTlu).
1* korist enj e swi tch- case naredbe * 1 1* za obl ikovanj e izbora *1 int osnovni_izbor ( v o id) { char ch ; printf ( " * * * OSNOVNI IZBOR ***\n" ) ; pr intf ( " = ===== =========== =====\n" ) ; printf ( " \n 1 . Nast avak programa " ) ; pr intf ( " \n 2 . Prethodni izbor ") ; printf ( " \n 3 . K r a j programa " ) ; __
ch = getche ( ) ; 1* ucitaj izbor s t astatur e * 1 swit ch ( ch) { cas e ' l ' : return ( 1 ) ; break ; cas e ' 2 ' : return ( 2 ) ; . break ; cas e ' 3 ' : return ( 3 ). ; break ; default : return ( - 1 ) ; break ; } }
S obzirom da n aredba ret urn označava povrat ak iz funkcije, on a ujedno ozn ačava i kraj bloka naredb i . P rem a tome, II ovom primjeru break se može izos tav i t i . Među t im , ako ne postoji ret urn , izost avlj anje n aredbe break ZlI ači n astavak izvršavanja n aredbi sve do n ailaska n a break ili na ozn aku kraja switch-case n aredbe (}).
Kontrola toka programa
84
1* primj er za gresku koj a nastane izostavljanj em *1 1* naredbe break *1 void main ( void ) { i; int prinU ( "\n Une s it e bilo koj u vr ij ednos t od 1 do s can! ( llYod" , l i ) ; swit ch ( i ) { cas e 1 : printf cas e 2 : printf case 3 : printf cas e 4 : print! default : print! break ; }
}
( "\n Izabral i s t e bro j
1 ' '' )
( " \n Izabral i s t e broj
2
lI ) j
( " \n Izabral i s t e broj
3
"
( " \n Izabral i s t e broj
4
II ) ;
Isti blok primjer,
;
);
je sljedeći:
s t e broj 1 s t e broj 2 s t e broj 3 s t e broj 4 izbor . . . . . . .
n ared hi može se
pridružiti
switch (i) {
II ) ;
( " \n Pogresan izbor . . . . . . . " > ;
Rezul tat izvršavanj a program a
Izabr al i Izabral i Izabrali Izabrali Pogr e s an
4:
case l : case 3: case 5: blok naredbi1; break; case 2:
za nekoliko različitih vrijednos t i . Na
85
4.4. Naredba switcb-case case
4:
blok llaredbi2; break;
case
6:
blok llaredbi3; break;
dt�fault: p r intf
( It \ n
Pogresan
izbor
It
......
);
break:
}
Dozvoljeno je gniježctenje
( nesting)
n ar edbi N a primjer ,
switch-case
.
swit ch ( i )
{
cas e 1 : s w i t ch ( t )
{
cas e 1 : printf ( I t \n laredba s e izvrsava i s punj enj em uvj eta i == 1 tt t = = 1 l t ) ; br eak ; default : pr int f ( It \n
}
. . .
Greska
.
. . .
.
.
lt
);
break ;
pr intf
( It \n las t avak izvrs avanj a nar edbi prve s w it ch- cas e naredbe
lt
);
break ; cas e 2 : pr intf ( It\n lar edba s e izvrs ava ispunj enj em uvj eta i == 2 " ) ;
}
br eak ;
Kod niza u gnježcten ih swit ch- case n aredbi break označava prekid izvr šavanja bloka
naredhi izbora case koji se odnosi na "najbližt�' swit ch
-case . Nakon toga n astavlja se i zv r š avanj e n aredbi izbora case prve vanjske switch-case n ared be .
Kontro/a toka program a
86 4 . 5 . P rogramske petlje
P rogram ske petlje omogu ćavaj u višestruka u vj e t n a pon avlj anj a blokova n ared b i .
S obzirom na mjes to ispi t i vanja u vjeta, koj i o dlu čuje ela II će se
pon avlj anj e n as t aviti ili ne, program ske p etlje se dij el e u d v ije gru p e . P rv u
g r u pu č i n e programske petlj e s ispitivanjem uvjeta na početku, d ok drugu grupu čine program ske petlje s ispitivanjem uvjeta na kraju p et lje. Osnovna razlika iZll1 e
kraju
petlje blok
naredbi
mora iz vršiti barem jednom.
P rogram ski jezik
e podržava obje gru pe programskth p etlj i . U grupu s ispitivanjem u vj e t a n a p o č e t k u p etlj e u braj aj u se p rogramske petlj e for i wh ile , a u grupu s
ispi t i vanjem u vjeta n a kraj u ubraja se do-while p etlj a .
4.5. 1 .
Programska petlja for
P rogram ska petlj a for sas t avni je dio gotovo svih p roced uralnih pro gramskih jezi ka. Me(tu t i m , for petlj a u e-u je v rlo fleksibiln a . O p ći oblik programske p e tlje fo r je:
for (izraz I ; izraz2; izraz3) {
}
blok nare(lhi;
Iz vršavanje petlje teče tl koracima:
l . p o s t avi kon t rolnu varij abl u petlje n a početnu v rijednost
2.
i sp i t aj d a li j e u vjet pon avlj anj a bloka
naredbi
(izraz 1 )
petlje zadovoljen
( izraz2): NE DA
završi pet lju; izvrši blok nared bi do dijdi kon trolnoj varijabli novu vrijednost
( izraz3)j
idi na 2; Pogo d n os t for p etlje j e u tome š t o se n a jednom mjest u n al az i p o č.et n o s t anje,
izraz 1 ,
u vjet koji m ora b i t i zadovoljen z a ponavlj anje bloka naredbi
87
..{ . 5. Program.ske pet/je
petlje, izraz 2 , i izraz koji mijenja vrijednost kontrolne varijable petlje, izraz3. Za kon trolnu varijablu p etlje često se kor i s ti i izraz indeks petlje. Jednost avan p r i mje r za prikaz for petlje je ispis niza brojeva o d 1 do 1 0 po r as t u će m i p ad aju će m red oslijedu .
1 * j ednost avan pr imj er
for petlj e * 1
v o id main ( v o i d ) { int i; 1* ispis broj eva u rastucem r edoslj edu *1 f or ( i = 1 ; i <= 1 0 ; i++ ) printf ( " Y.d " , i ) ;
}
1* i s p i s broj eva u padaj u c em redoslj edu *1 f or ( i = 1 0 ; i > O ; i--) printf (" Y.d " , i ) ;
Kao i kod n ared bi u vjetnog gran anja vrijedi pravilo: ako se blok naredbi sastoji od jedne n aredbe, zagrade { } nisu neophodne. U p r eth o d n om p ri mjeru p r ikazan je n ajjednostavniji oblik for petlje. Osnovni oblik for petlje pogodan je za stvaranje niza razli čitih kom bin acij a , što ovisi o prohlemu koji se rj eš ava . U n arednih n ekoliko p r i mje r a n avest ćemo neke od n j i h .
U programskoj p etlj i for može se n aći više od jedne kon t r oln e varijable
pet lj e :
t or C i = O , j = O ; i+j < 1 0 ; i++ . j ++ ) printt ( " Y.d " , i+j ) ;
Izrazi koji ini cijaliziraju ili mijenjaj u vrijednosti kontrolnih varijabli p etlji od vajaju se zarezom . Zarez n aznačava da će se sve operacije odvojene zarezom obaviti prije n ego se krene na i z vr šavanje sljedeće naredbe. U n avedenom primjeru to znači: poveć.aj vrijednost var ijab le i i vrijednost varijable j prije n ego izvršiš logički izraz i + j < 1 0 . U vjet ponavljanja petlje može bi t i bilo koji u vjetni i z r az ali i ne mora aktivn u ulogu imati kontrolna varij abl a petlje.
u
kojem m ože
Kon trola toka progra ma
88
izracunavanj e i p r i k az kvađrata pozit ivnih *1 cij e l ih broj ev a *1
1* 1*
v o id main ( vo id)
{
int char f or ( i
i;
dalj e ;
O ; (dalj e
=
==
'N'
I I d al j e
==
' n ' ) ; i++ )
{ pr int f ( �d - 2 = �d " J i . i* i ) ; print:f ( " \n Z alit e dalj e (DIl O ? II ) >> d al j e get che ( ) ; "
=
}
}
Izlaz iz petlje ne ovisi izvršavanja.
o
varijabli l, nego o odgovoru na pit anje
o
n ast avku
Do sad a smo vi djelj d a Sl1 parametri for petlje uglavn om bili arit mct i čki i 10gi čki izrazi . M e(tu tim , ne m ora biti uvijek tako . /* funk c ij e kao
gume nt i programs ke pet l j e * /
ar
:f unkcij a l (v oid) ; funkcij a2 (void) ; kvadrat_broj a ( int ) ;
vo id
int
void
voiđ main ( vo id) { int
i J'
1* ispis kvadrata un e s enog broj a * 1 f or ( f unc ij al ( ) ; i = funkcij a2 ( ) ; funkcij al ( » kvadrat_bro j a ( i) ; } 1* pr ikaz poruke *1 vo id funk c i j a l ( ) {
printf C " \n Une s i t e broj od razl i c it od
}
int
/ * u c i t avanj e cj elobr oj ne vrij ednost i * / f unkcij a2 ( )
{ int
i '.
O ") ;
89
4. 5. Programske pellje
s c anf ( " %d " return ( i ) ;
}
•
.t i ) ;
J* izracunavanj e i prikaz kvadrat a une s enog broj a * J v o id kvadrat_broj a ( int broj ) { printf ( " \n Kvadrat bro j a %d j e Y.d" . broj . broj *broj ) ; }
For
p etlj a se u n avedenom 11flll1Jeru izvršava sve dok je uvjet zadovoljen ,
odnosn o dok
je
u n e s e n i broj razli čit od o.
To n ije sve. B i l o koji parametar petlje može se izostav i t i . Pri takvom
n ačinu zad avanja petlje treba biti oprezan , jer se od jednostavne p etlje veo m a l ako m ože n ačini t i b eskon ačn a petlj a . U sljedećim p rimjerima prika zane su n e ke od kombi n acij a for petlje s izos tavljeni m parametrima:
Primjer 1 : i=O ; f or ( ; i < 1 0 ; + + i ) . . . .
J * in i c i j alizacij a uc inj ena prethodnom naredbom *J
Primjer 2: for (i = O ; i ! = 10 ; ) s canf ( "%d" .t i ) ; •
" Petlj a se izvr šava s ve do u n osa broj a razli čitog od 1 0 . Ako j e unesen b roj
1 0 , u vjetni izraz nije ispunjen i petlj a se prekida.
Primjer 3:
Beskon ačn a petlj a .
f or ( ; ; ) Izlaz iz b esko n ačne petlj e m ogu ć j e u p o treb om naredbe za p reki d
.n ared h e
ret urnO.
U o čite d a se izostavljanjem p o j e dinih parametara petlje
ozn aka j. N u l n ar e dh a
( j ) je neohodna iz dva razloga:
oblik progr am s ke petlje p etlje for izostavljen .
for
break ili
mora
pisati
da hi se zadovolj i o op ći
i da bi se ozn ačilo koji je parametar programske
Pod razu mijeva se da je gniježctenje gu ća je sljedeća kon s t r uk cij a:
(nesting) for petlji
dozvoljeno . M o
J(onlrola toka programa
90 for (i O ; i < 10 ; i++) { niz n aredb i ; f o r ( j = O ; j < 1 0 ; j ++ ) { tor (k : 10 ; k > 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
m ož e s as t oj a t i od nul n are d b e
Zamjena for pe t lj e p r o g r ams kom petljom while može se obaviti
slj edeći n ač.in . For petlja
for ( izl'az ! ; izraz2; izraz3) { hlok naredbi; }
istovjetn a je
while petlji
na
91
4- 5. Progra mske petlje
izraz ! ; while (izraz2) {
blok naredbi; izraz 3 ;
}
for, a kad while pe t lj a , ovisi jedino o au toru programa . v rije d i d a kod kraćih petlj i gdje je n a j ed n om mjes t u pogodno i m a t i p r egl e d početnog s t anj a , u vjeta po nav lj anj a petlje i n a č.ina p r o mj en e kontrolnih varij abli , k o r i st i se for p etlj a . Kad ć e se k or i s t i t i
Medu tim , općeni t o
While petlja
se m n ogo češće koristi pri čitanju sad r ž aj a od ređenih d a toteka, od re(ti vanju d u lj i ne niza zn akova (s tring) i sli (� n o . N aime, n ačin zapisa w hile p e tl j e mnogo je p r i ro d n ij i i odgovara nač.inu razmi šljanja, tj .
vrijedi :
dok j e ( ispunj en uvj et ) { radi . . . . } Me
II
i m pl emen t acij i go tovo s v i h m atemat i čkih iteracij skih postup aka
koris t i se for pe t lj a. N a p rimj er , za izrabm avanj c zbro j a brojeva,
množcnje m atrica i
ili umnoška- niza
sl .
Za p r i k az progr amsk e petlje
while p ogl ed aj m o
kako bi m ogli n ap i s at i
fu n kc ij u koja vraća d ulj i n u zad ano g niza znakova - fu nkcij u Funk c ij a j e sas t avni dio s t an d ardne b iblioteke funkcij a.
1 * funk c ij a odredj uj e i vraca dul j inu *1 1* zadanog n iza znakova *1 int strI en ( char string [ ] ) { int i = O; int dulj ina = O ; whi l e ( string [ i++] ! = ' \0 ' ) dulj ina++ ; }
return ( dulj ina) ;
strlen O .
92
Konlrola t oka programa
Program ska p etlja while m ože biti sastavni dio bilo koje programske petlje. Pri mj er beskon ačne while pet lj e glasi: while ( 1 ) 1 * b eskonacna { blok uaredbi; }
whil e
petlj a * 1
.
Programska petlja do-while
4.5.3.
Programska petlja do-while predstavlja grupu program sk ih p etlji kod koj ih se u vjet pon avljanja petlje isp i tuje na kraj u bloka n aredbi petlje Iz toga proi z l az i da se blok n aredbi petlje mora izvesti najmanj e j ednom. Opći o hli k programske petlje do-while gl asi : .
do {
}
blok naredbi; w h ile (uvjet );
Tok izvršavanja p rogram ske petlje do-while je: 1 . Izvr š i
blok naredbi
2. I s p i t aj da li je uvjet istinit ili različit od nule:
DA
I d i n a korak 1 .
NE
Idi n a prvu naredbu iza while
Uvjet pon avlj anja bloka n ared b i petlje može biti varijabla, logički ili arit met i čki i zraz . C i njeni ca da se blok n aredbi petlje mora obaviti barem jed nOlli nije baš n ajpovol j n ija Zbog toga se u praksi mnogo češće koriste pro gram s ke p e t lje for i while. Među tim , postoje slu čajevi kada je neophodno da se blok n ared bi izvrš i bar jednom . Takav z ah tj e v j avlja se kod programa s izborom niza ponuctenih akcija: .
4.5. Programske pet/je
93
1* naj c e s c i primj er kor i s t enj a
do-while petlj e * 1
void main ( v o id ) { ch ; char do { printf ( l I \n Osnovni izbor : : I I ) ; printf ( l I \n ============== = ==" ) ; printf ( lI \n 1 . Uno s podataka " ) ; print! ( " \n 2 . Pregl ed sadrzaj a baze podat aka" ) ; printf ( " \n 3 . Pretraz ivanj e " ) ; printf ( " \n 4 . Kraj rada . . . . II ) ; ch = get ch e O ; switch ( ch ) { cas e ' 1 ' : unos_podataka ( ) ; break ; cas e ' 2 ' : pregled_baze ( ) ; bre ak ; cas e ' 3 ' : pretraz ivanj e ( ) ; break ; } } wh ile ( ch ! =
'l'
tt
ch ! =
'2'
tt
ch ! = ' 3 ' ) ;
}
N akon prikaza ponu denih op erac ija program izvršava izabranu operacij u , ili završava ako ni jedna od ponlHtenih operacija nij e izab ran a. D a li
će se
11 programu
koristiti for, while ili do-while petlja
ovisi
o vrs t i problema koji se rješava. Velikih prednosti, odnosno velikih ne dostataka jed n e program ske p etlj e u o dnosu na druge programske petlje nema.
K ontrola t oka progra m a
94
4 . 6 . Naredba break break koris t i se u d va sl u č aj a. U p rvom slu čaju break om o gu prijevremeni izlazak iz petlje, a u drugom slu čaju redovn i završetak switch-case n aredbe. Naredba
ćuje
1 * pr ij evremeni z avrsetak petlj e *1 for ( i = O , i < 1 0 0 , i++) { p r intf ( l O Y.d lO , i ) i 1* izlaz iz p � tlj e *1 if ( i == 5 5 ) break , pr intf ( " \n Ispis ide dalj e . . . . II ) ; }
P remd a je u uvjetu for petlje odre
S ve p r ogr am s ke petlje i n are d b a switch-case dopuštaju da se unutar druge pe t lje , odnosno n aredbe switch-case. K ad a se n ared b a break n a(le u nu t ar tak ve strukture, on a pro u z ro kuje izlazak iz unutrašnje pe tlje, o d n osn o iz unu trašnje n ared be switch-case. P retpos t avimo d a j e p o t rebno p l o č i t a t i i i s pi s a t i s adr ž aj ASCII dat o t eka s diska. S adržaj j e p oh r anj en p o redovima. O z n aka k raj a r e d a je '\n' (new line) . Kad program u čita ozn ak u kraja reda, sad rž aj red a ispisuje se n a z aslon . petlje n al az e
'
.
1* ucitavanj e sadrzaj a dat o t eke *1 ( p o r ed o v ima ) 1* *1
#include <stdio . h> 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
4 . 8 . Naredba got o Pob or nici str u k t uri ranog pr ogrami r anj a često koriste izreku : " Vr ije d nost p r ogr am a obrnuto je proporcionaln a b r oju g oto n aredbi" . Prem d a j e i s t i n a da s e svaki program može n apisati bez goto n are dbi , u knjizi se n e će raspravljati je li n aredbu goto p o t rebno izbaci ti iz skupa naredbi za kontrol u t oka programa ili n ije . Pro g r ami u knj izi , osim u ovom p oglavlju , p i sani su bez korištenja n aredbe goto.
Velik b roj goto n ar ed bi svakako smanjuje č itlj i vos t programa, među tim t ak vi p rogrami ne m or aju biti ništa m anje e fikasn i o d programa bez n aredbi goto. N ared b a goto z ah t ij eva simboli čku oznaku mjesta ( label) na koje se program gr ana nakon i zvršene n aredbe. Oznaka mjes t a u e-u je iden tifikat o r sa zn akom d vo t očk e ( : ) kao s ufi ksom i n ajčešće se zad aje kao mn em onik . Za prikaz n aredbe goto n apisat ćemo kratak program k oji ispisuj e niz cijelib h roje va o d 1 do 1 00 : 1 * Primj er programa za naredbu
main O {
int
x = O: ponov i :
goto *1
x;
1 * s imbol icka oznaka ( label) * 1
97
4.B. Naredba golo x++; goto van; if (x > 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 <= 100; x++) pr intf ( tl Y.d ",x) ; print f ("\n Kraj ispisa ");
}
PretllOdni primjer pokazuje kako naredbu gota ne treba koristiti. Međutim ,
postoje slučajevi kada se kori štenjem n aredbe
gota
umnogome p ove ćava
preglednost programa i smanjuje d ulj i n a izvornog koda. .Jedan o d takvih
slu č aje va je izlaz iz niza lIgnjei
{
while ( ..... )
{
for ( ..... )
{ if ( ..... )
}
}
goto van; 1* izlaz iz svih petlj i *1
}
van:
printf ("\n Izlaz iz vis e s truko ugnj ezdenih petlj i
ll
);
Kontrola toka programa
98
slučajevima zahtijeva definiranje do datne kontrolne varijable i nekoliko dodatnih ispitivanja. Razlog tome je to što se naredbom break može izaći samo iz unutarnje petlje u vanjsku. Prema tome, gornji primjer bez naredbe goto bi glasio: Izostavljanje naredbe goto
u
takvim
for ( ..... ) { for ( ..... ) { vhile (. .... ) { it (. .... ) { kraj = ii 1* izlazak iz svih petlji */ break; } } if (kraj == 1 ) break; } if (kraj == 1) break; } print! (lI\n Izlaz iz visestruko ugnjezdenih petlji " ) ;
da takvih primjera ima još. Ako je očito da ć.e korištenjem postati pregledniji, kraći i razumljiviji, nema razloga goto ne upotrijebi.
Sigurno je
naredhe goto program
da se
5. FUNKCIJE
Rješa va nje složen ih progr am s ki h p roblem a postaje mn ogo jedn ost av nije
ras tavljanje m p r o hl em a u niz
manjih,
logički p o vez an ih cjelina.
Takav
pri s tup rješavanju p rogra m ski h pro bl e m a podržan je i na neki način se
n ameće p r og ram skim jezik om C.
Fu nk cije u C-u predstavljaju rj eše nja poj edinih cjeli n a O bje dinjava njem svih fu nkcija u jed n u cjeli n u do bije se rješenje cjelokupnog problem a . .
Prilikom s t va r anj a n ovih funkcija dobro je d a kod funk cij e bude što k ra ć i i da fun k cija uvijek rješava 'jedan zadat ak . Veliki dio funk cija koj e se od n ose na
rad
sa sistemom nalaze se u bibliotekam a funkcija.
Funkcije u C-u mogu se na neki n ačin dovesti u vezu s p ot p r ogr amim a, o d n o sn o p ro c e dur a m a u n ekim d r u gi m programskim je z ici m a. Me(tutim, programski j ezik e je već na p očetku s tvara n ja zamišljen tako da se progr a m i g rade od
niza funkcija.
Za razliku od funkcija, p o t p r ogra m i i procedure su
n astale kao olakšice u p i s an ju velikih programa, i mogu se ali i ne moraj u koristiti u pr ogra m u. S druge strane, II C-u ne m ožete n ap i s a t i ni jed a n program, a da ne koristite p oziv bar jedne funkcije.
U ov om poglavlju s t avit će se n agl a s ak na stvaranje nov ih fu nk c ij a i komunikaciji izme(tu njih.
Funkcije
100
5.1. Poziv
funkcije u e-u -
Programi u e u sastoje se od jedne ili više funkcija od kojih jedna i samo jedna može biti funkcija mainO. Funkcija mainO označava mjesto na kojem počinje izv ršavanje programa. Poziv o dre(tene funkcije u e-u ne zahtijeva dodatnu naredbu, kao na primjer u FORTRAN-u call. Dovoljno
je na
odgovarajućem mjestu navesti i m e funkcije i
njene
argumente, ukoliko
Ka d prilikom izvođenja pro gram naiđe na p oz iv neke funkcije, kontrolu programa preuzima pozvana funkcija. Nakon zav ršetka funkcije
postoje.
kontrola programa se ponov no vraća funkciji iz koje se pozi va
)
( nadre(tena
funkcija .
1* primjer poziva funkcije
u
e-u *1
main O { primjer_poziva_funkcije () ; 1* poziv funkcije *1 } primjer_poziva_funkcije () { print! (ot\n Kontrola programa je u pozvanoj funkciji ot); } Izvršavanje prog rama naiđe
počinje pozivom funkcije main O. Kad program na primj er _poziva_funkcij e O, poziva se na vedena funkcija k o j a
zatim preuzima kontrolu programa. Nakon ispisa poruke, kontrolu programa ponovno preuzima funkcija
5.2.
main O.
Definicija funkcije
Izvorni ko d kojim je opisan način djelovanja funkcije naziva se
funkcije. Opći
oblik funkcije u e-u glasi:
tip1unkcije ime..funkcije (deklaracija liste argumenata) {
}
deklaracija lokalnih varijabli; tijelo funkcije
definicija
5.e.
De.finicija funkcije
101
Osim nav ede n og , fun kc ij a se može definirati i na sljedeći n a čin :
tip..funkcije ime..funkcije (lista argumenata) deklaracija liste argumenata; {
dt�kl81'acija lokalnih varijabli; tijelo funkcije;
} O vaj način
defi ni cij e funkcije je stariji način i može se preporučiti za defini
ranje fu n kci ja koje imaju veći bro j ar g u menata. Na kraju deklaracije liste
(j). di j el ovi f u n kc i je mogu se i zost av i ti . Minimum koji s vaka fu nk
argumenata mora biti oznaka kraja naredbe Po jedini
ci j a
mora imati da bi uopće mogla biti proglašena funkcijom je:
fUl1kdja O { } Takva
fun kci ja ne radi ništa
osim što troši vrijeme poziva fun kc ije u toku
i z v r šavanj a programa.
Tip3unkcije o dre đu j e tip p o d at ka ko ji će funkcija v ratiti. Ako se tip3unkcije izostavi, pod r azumijeva se da funkcija vraća cj eloh roj nu vri jed n ost . Vrijednost 21 hi se v ratila iz f un kc ij e flO naredbom r eturn (21);
Funkcijom dataka.
" se u
programu
rukuJe kao i s ostalim osnovnim tipovima po
Prema tome, ako f u n kcija vraća c.jelobrojnu v rijednos t , tada se s
njom mogu obavljati sve a r itm etičk e operac ije kao s ostalim cjelobrojnim
Isto tako, fu n kcija se može p ojavi ti i kao argument u pozivu dmgih funkcija. M eđu ti m , funkciji se ne može pridru žiti vrije d nost . To znači, ako je fu n kcija flO defi nirana kao podacima.
f1 O
int ne m o že fi
se p i s a t i O
=
21;
Funkcije
102
Funkcije koje ne trebaju vratiti nikakvu vrijednost definiraju se kao
void. Budući da II prethodnom programu funkcija primj er_pozi va_funkci j e O ne vrać.a nikakvu vrijednost, mo že se definirati kao: void primj er_poz iva_fun k c ij e ( )
Komunikacija
i zme
se
preko podataka koji se prenose u
funkciju, odnosno preko vrijednosti koju funkcija vraća. Podaci se II funkciju prenose preko argumenata funkcije navedenih u
listi
Argumenti u definiciji funkcije često se nazivaju i a argu menti u POZ1VU funkcije stvarni (aktualni) argu u p rogr am u mogu pojaviti u bilo kojem- redoslijedu. Kod
argumenata.
formalni argumenti,
menti. Funkcije se pozvane fu n k cije ne mora biti u istoj datoteci u kojoj se nalazi funkcija iz koje se poziva. Funkcije kao na
koje
SI1 dovoljno općenite i koje se koriste II većini programa,
primjer, funkcija printf{), smještaju se
II
biblioteke funkcija
(li
Biblioteke funkcija mogu se proširivati dodavanjem novih funkcija ili se mogu stvarati vlastite h i blioteke
brary).
.
Sve definirane funkcije
koje se koriste unutar funkcije se deklarirati.
main{
)
ili unutar
neke druge funkcije, moraju
1* pr imjer deklarac i j a funk c i j e *1 1* i upotrebe naredbe r eturn *1 main ()
{ int int
i, j; fi ( int , int) ;
i = 20; j = 20; printf { " \n Zbroj
=
1* dek l ar a c i j a funkc ij e fi *1
Y.d", fl ( i , j » ; 1* p ozi v funk c ij e *1
} 1* definic ija f un kcij e fie) *1 int fl (int a. int b) { int c· c = a + b; return ( c ) ; •
1* vr a c anj e rezultata *1
}
Deklaracija funkcije može biti na početku programa ili unutar funkcije iz koje poziva. Ako se funkcija deklarira na početku programa njezina deklaracija
se
5.9. Naredba return
103
v rijedi za sve funkci je . M e etu ti m , ako se fu nkcija deklarira unutar funkcije tada njezi n a deklaraci ja vrije di samo za tu fun kci j u . Funkc ija se može deklarirati na dva načina: na način koji je pro pi sival a p r v o b it na verzija C-a, kao i na način koji omogućavaju novije verzi je. Prema prvo b i t n oj definiciji C-a, de klaraci jom fu n kcije o dre (tuje se samo tip funkc ije , odnosno tip rezultata koji fu nk cija vrać a : int
f1 O;
1* prvobitna deklaracija funkcij e *1
Tako deklarirana funkcija omogućuje pravilnu pre t vo rbu različitih t i po va podataka. Međutim, ona ne omogućuje provjeru različitosti tipova po dataka ar g um e n ata fu nkcije i podataka koji se prenose u fun kci j u . P r vobitna dek laracija funkcije za d r ž an a je jedi n o zbog toga da bi se " starij i " programi mogli prevoditi novim prevodiocima. ANSI e standard dozvoljava da
funkcije: int
se za deklaraciju funkcije k oristi
prototip
fi ( int. int);
Takva deklaracija funkcije će u toku prevođenja programa om ogući ti pravilnu
otk rivanje gre š aka koje nastaju zbog eventualne razlike t ip ova podata ka u pozi v u , i tipova p o dataka koji su deklarirani kao argumenti funkcije. Det aljn ija rasprava o tome zašto je neopho dn a podu darnost ti pova p o dat aka koji se prenose i argu m ena ta funkcije dana je u p oglavlju 5.4. p r etvorh u pod ataka, ali i
Sve var ija hle ko je se koriste un u tar funkcije moraju se deklar i rati. De klaracij a varij abli funk cij e o bavlja se na p očetku fun kci je, prije prve izvršne naredhe. Sve varijahle deklarirane unutar funkcije imaju lokalni karakter i n e d ostupne su o kol n i m funkcijama. •
Naredbe koje se nalaze između deklara cije kra ja
5.3.
fu n kcije
argumenata funkcije i oznake
}, čine tijelo funkcije.
Naredba return
Naredba return koristi se u vraćanje tl
nadre(tenu fun kcij u .
dva sl u čaja. U prvom slu čaj u služi za slučaju naredba return vraća
U dr ugom
Funkcije
104
rezultat izvršavanja fun kcije u nadređenu funkciju. Pod p ojmom nadređena
fu nk cija podrazumijeva se funkcija iz ko je se poziva
.
Opći ohlici naredbe
ret urn glase: returll; returll izraz; Prvi oblik naredbe označava prekid izvršavanje funkcije i vraćanje kontrole programa nadre(tenoj funkciji.
Pritom funkcija ne vraća nikakvu v rijed
nost. Takav oblik nare dh e return ob avlja isto što i oznaka kraja funkcije }.
Međutim, u jed noj funkciji može biti samo j edna oznaka kraja funkcije, dok n aredb i return može biti tliše. T i m e je omogućen prijevremeni završetak fun kcije na više različitih mjesta unutar funkcije.
1* prijevremen i zavrsetak funkcije *1 v o id izracunaj _potenciju_broja (int broj , int potencija )
{ int
i, eksp;
if (potencija < O)
{
pr intf ( " \n Potenc i j a broja mora b it i veca od O ")j return j 1* vracanj e u nadredjenu funkc iju *1
} eks p = potencijaj i = 1j f or (j potencija ; potencija-- ) i *= broj j pr intf ("\n %d na %d = %d" , broj , eksp , i ) ;
} Ako je potencij a manja od nule, dio koda koji izračunava potenciju zadanog broja neće bit i nikada izvršen, jer je time i s p unjen u v jet za izvršavanje naredbe return.
Drug i oblik naredbe return omogućuje vraćanje rezultata izvršavanja p ozvan e funkcije u n ad ređen u funkciju. Na primjer, return (125); return (a
+
b - c);
5.4. Tipovi /1mkcija
105
Zagrade nisu neopbodne međutim, dobro ih je koristiti jer p ove ća vaju pre glednost programa. Ako tip rezultata izraza ne odgovara definiranom tipu funkcije, naredbom return obavlja se automatska pretvorba rezultata u tip odreden funkcijom.
5.4.
Tipovi funkcija
U prethodnim poglavljima spominjana su u glavnom dva tipa funkcija: cjelohrojne
funkcije i funkcije tipa void. Iz dosadašnjih izlaganja ste mogli zakJjuči ti da tip funkcije ovisi o tipu podatka koji funkcija vraća u nadrectenu funkciju. Funkcije u e-u mogu se definirati tako da vraćaju bilo koji defini rani tip podataka. Budu ći da je automatskom ( i mpli citn o m ) pretvorbom podataka odrecteno da se znakovni tip podatka automatski pretvara u cjelo brojni tip i da se u izrazima rač.u na s njegovom cjelobrojnom vrijednošću, funkcija koja vraća znakovni podatak definira se uvijek kao funkcija koja vraća cjelobrojnu vrijednost (int). Ako se definicijom funkcije ne navede tip funkcije, podrazumijeva se da funkcija vraća cjelobrojnv. vrijednost. Sve funkcije, koje vrać.aju ne-cjelobrojne vrijednosti, moraju se definirati i dekla1'imti kao takve. Definicijom funkcije oclre(tuje se tip i n a N n djelovanja
funkcije. Deklaracija funkcije obavlja isti zadatak kao i deklaracija varijabli. Ona kaže prevodiocu koji će tip podatka funkcija v rati ti. Kao i za varijable, i za funkcije vrijedi da se moraju dekl ari ra t i un u ta r funkcij e ili programa u kojem se koriste. Deklarirani tip funkcije mora odgovarati definiranom tipu. Ako tip funkcije u deklaraciji ne odgovara tipu funkcije u definiciji prevodilac će u toku prevo(tenja programa javiti grešku. Me(tutim, to vrijedi samo za one funkcije koje su definirane, odnosno čiji se kod n al azi u datoteci u kojoj se koriste. Ako je funkcija definirana u drugoj datoteci, koja se prevodi odvojeno, prevodilac neće moći uočiti grešku. Zbog čega je neophodno deklarirati funkcije koje ne v raćaju cjelohrojne vrijednosti? Kad program pozove funkciju koja nije deklarirana, on očekuje da funkcija vra ti cjelo brojnu vrijednost. Prema tome, hilo koji podatak koji funkcija vrati tretirat će se kao cjelohrojni. To može izaz vati neoč.eki vane i neispravne rezultate. Isto vrijedi i za funkcije čija deklaracija ne odgo vara definiranom tipu funkcije. Vrijednosti koje funkcija vraća u nadređenu funkciju mogu se, ali i ne moraju iskoristi ti u nadređenoj funkciji.
Funkcije
106 1* primjer za funkciju koja vraca *1 necjelobrojnu vrijednost *1 1* main ()
{
double suma (double, double) ; 1* deklaracija funkcije *1 double a, b; 1* deklaracija lokalnih varijabli *1 printf (lI \ n Unesite dva realna broja: " ) ; scanf ("Yef Yef", ta , tb); print f ("\n Zbroj Yef + Yef = Xf", a, b, suma (a, b» ;
} suma() 1* definicija funkcije double suma (double x, double y )
{
*1
return (x + y ) ;
}
Ako se kod definirane funkcije nalazi u is toj dat otec i u kojoj se koristi, i ako je definicija funkcije ispred prvog pozi va funkcije, d eklaracija funkcije nije potrebna. To znači, da je u d anom pr i mj er u funkcij a sumaO bila defini rana. ispred fun krije main O, deklaracija funkcij e u funkciji main O m ogl a se izostaviti.
Za razliku od nekih p r ogram sk ih jezika , na primjer PASCAL, definicija
fun kcije unutar druge funkcije
D e taljnij i opis ostalih
u kojima će se obra
5.5.
nije dozvoljena.
tipova funkcija bit će dan k roz sljedeća poglavlja, pokaz i va či i složeniji tipovi podataka.
Argumenti funkcije
Komunika.cija izme
argumenti funkcije.
Argumenti funkcije moraju se deklarirati tak o da odgovaraju tipu po se prenose u funkciju. Postoje dva načina deklaracije argume č.esto se naziva i novi (moderni), dozvolj ava de kl ar ac iju argume nata unutar zagrada funkcije dataka koji nata. Prvi,
5.5. A rgumcllii funkcije int fuukeija { .....
Drugi, koj i se često menata, je: ill t
107
(int
II
a,
iut b)
literaturi n avodi kao klasič.ni način deklaracije argu
funkcija (a, b)
iut iut
aj b;
{
Koji t.e se način deklaracije koristiti ovisi o sitnaciji. U slučaju velikog broja argumenata, zbog pregledn osti programa pogodnije je koristit i klasični nač.in deklaracije. Podaci se u funkcije p renose na dva načina: preko twijednm;ti pl'eko adrese
(call by t,aiue)
(call by
)
refeT"ellce .
Razlika iZlllectu navedenih načina prijenosa podataka sadržana je II moguć nosti, odnosno nemogućnosti promjene v rijednosti podataka II nadređenoj funkciji. Karakteristika oha načina prijenosa podataka jeste da se podaci prenose preko stoga (stack), što omogućuje stvaranje rekurzivnih funkcija.
5.5.1.
Prijenos podataka preko vrijednosti (Call by value)
Osnovna značajka prijenosa pod ataka preko vrijed n osti jest d a se vri jed nos t i varijabli koje se prenose ne mogu mijenjati u pozvanoj funkciji. Argum enti pozvane funkcije prihvaćaju samo kop ij u vrijednosti tih varijabli. Prema tome, promjena vrijednos t i argumenata unutar funkcije ne može ut jecati na promjenu vrijednosti prenesenih varij abli . 1* pr ij enos podataka preko vri j edno s t i *1 1* call by value *1 main ()
{ int
i, kvadrat ( int);
Funkcije
108 pr intf ( "\n Une s i t e broj :: II); s canf ( "%d " , ti ) ; printf { " \n Kvadrat broj a %d = %d" , i , kvadrat (i »; _
} funkc ij a vraca kvadrat *1 1* prene sene c jelobrojne vrij ednos t i *1
1*
i nt kvad rat ( int i )
{
i *= i i r e t urn {i ) i
} Rezultat izvršavanja program a je:
Une s it e b ro j : : 1 0 Kvadrat b roj a 1 0 = 100 Rezu1tat iz vršavan ja fu nkcije pokazuje da je vrijedn ost varijable i u funkciji
mainO
ostala ista, bez obzira na promjenu vrijednos t i varijable i koj a j e
deklarirana kao argument funkcije
5.5.2.
kvadrat O.
Prijenos podataka preko adrese (Call by reference)
P rijenos pod at aka preko adrese omogućuje promjenu vrijednosti pre nesenih varijabli unutar poz vane funkcije .
Kod prijenosa podataka preko
adre�a varij able. U trenutku funkcije argu m entu funkcije pridružuje se adresa prenesene varijable. adrese u pozvanu funkciju prenosi se
poziva Prom
jenom vrijednosti argumen t a funkcije, n a adresu na koju pokazuje argument funkcije , upi suje se nova, promijenjena vrijednost. Bu d ući da je adresa ar gumen t a funkcije ujedno i ad resa prenesen e varijable, svaka promjen a v ri jednosti argumen ta funkcije ujedno znači i promjenu vrijednosti prenesene varijable . Za pojašnjenje n aved enog nap isat ćemo funkciju koja zamjenjuje vrijednosti d vije varijable . Ova funkcija je gotovo neizbježna kod funkcija sor t i ranj a .
zamjena vr ij edno s t i dvi je v arij able 1* *1 1* pri je no s po dataka preko adre s e ( call by reference) *1
5.5. A rgume.nti funkcije
109
main O { v o i d zamij eni ( int *, int *); i, j ; int printf ( " \n Une s it e dv ij e vrij e dnos t i : " ); s c anf ( " %d %d" , .ti, lj ) ; print ! ( "\n Vr ij e dnos t i varij abl i pr ij e z amj ene i = %d j = %d" ,i, j ) ; poz iv funkc ij e za z amj enu vr ij ednost i *1 pri jeno s var i j abl i i i j pr eko adrese *1
1* 1*
&;
1*
zamij eni ( ti , tj ) ;
j e adresni operat or *1
printf ( " \n Vr ij e dnost i varij abl i nakon z amj ene i = %d j = %d" ,i , j ) ; } 1* z amj ena vrij edno s t i *1 v o i d zamij eni ( int *x, int *y) { int t emp; t emp
=
*x;
*x = *y;
*Y }
=
t e mp;
1* 1* 1* 1* 1*
zapamt i vrij e dnost s adr e s e x *1 vrij e dno s t s adr e s e y kopiraj *1 na adr e s u x *1 na adres u y kopiraj vri j e dno s t *1 varij able temp *1
Deklaracija.argumen a t a II fu nkciji zamijeni O , int *X, int *y, kaže d a ć e
varij able x i y sadržava t i
adr�se na
kojima su zapisane v r ijednost i p rene
se nih varij abli . Zbog toga se u poz ivu funkcije zamijeniO ispred varij a b li i i j lUora post avi ti adresni operator t . Uloga adresnog operatora je da
umjes t o vrijedn osti varijabli i, j prenese u funkciju zamijeni O nj ihove adrese.
Naredba *x = *y; oz načava d a će se
družiti vrijednost s adrese
y.
Rezul t a t izvršavanja program a je:
Une s i t e dv i j e vrij e dn os t i
:
10
21
v rijednosti na adresi
x
pri
Funkcije
110 Vrijednos ti varijabli prije zamj ene i :: 10 Vrijednosti varijabli nakon zamjene i 21
j :: 21 j :: 10
Ostanimo još za trenutak kod prethodnog programa i pogledajmo što se za v r ijem e izvršavanja programa d oga(ta II memoriji. U čitavanjem vrijednosti varijabli i i
j
u funkciji
main() stanje memorije je:
varijabla
l
varijahla J
Pozivom funkcije
[--10 I
zamijeniO varijable
21
x i
y sadrže
(pokazuju na) adresu na
kojoj su zapisane vrijednosti varijabli i i j, što se može prikazati kao varijabla i
varijabla j varijabla
10 21
x
varijabla y
Poslije izvršene zamjene stanje memorije je:
varijabla i varijabla j
10
varijabla- x
varijabla y
u funkciju mainO, na adresi na kojoj je. bila zapisana vari jabla i upisana je vrijednost varijable j, i obrnuto, čime je izvršena zamjena vrijed nosti varijahli. Nakon vraćanja
5.6.
Lokalne varijable
111
Navedeni pr imjer je i m ao za c ilj d a pri ka že
osnovnu razliku izme(tu
pr ijeno sa p o d at aka preko ad rese i p r ijen osa p odataka preko vrijednosti. U primjeru su a rg um en ti funkcije d e kl arirani kao pokaz ivači. O p oka zi vači m a
će se d et alj n ije ra sp ravljati u 7. poglavl ju .
5.6.
Lokalne varijable
Varijahle d eklarirane unutar fun k cij e ili hloka n aredbi n azivaju se lokal ne var ija hle . Osnovna karakteristika lokalnih vari j abli j e s t da su nedostupne
o stali m dij el ovi m a programa. Na primjer,
fuuklO { int Xj x = 20; }
fUllk2() { iut Xj x =
35;
}
Varijabla
funkl0 nije ni u kak voj vezi s varijablo m funk20. Varijabl a x u ohje fun k cije postoji sam o
x deklarirana II funkciji
x deklariranoj
u fu nkcij i
tokom izvršavanja funkcije. Sve lokalne varij able, arg u ment i fun k cije i lokalna p ol j a zapisuju se n a
Stog predstavlj a din amički dio m em orij e . Vraćanjem u nadređenu funkciju z a uzet i dio stoga se oslobađa. Iz ovoga je razumlji vo zašto podaci
stog.
lokalnih varija bli i polja nisu d ostupni ostalim funkcijam a i zašto se gube izlaskom iz pozvane funkcije. Na stogu se tako (ter nalaze i p ov r atn e adrese. Povratna adresa pokazuje
na m j e st o s kojeg se n as t avlja izvršavanje p rogr a m a n akon p oziva određene
fun kc ije.
Već je reč.eno da.
programski
jezik e nema ugra (tene mehanizme
provjeravanja p rek ora čenja indeksa dim enzija p olja .
n osti č. l anu polja, č.iji indeks prekoračuje
Z ad avanjem vrij ed m ože se desiti da
dimenzije p olja,
se v r ij e d n o st zadanog člana upiše preko povratne adrese. U tom sl u čaj u p ad programa je neminovan . TURBO e će u tom slučaju isp i sati p oruku "Abnormal program terminatio n" .
Funkcije
1 12
S ve va rij a ble koje se k or i ste u fu n kc iji najčešće se deklar iraj u na p o četk u fun kdje prije prve izvršne nare
bloka naredbi. Tako deklari rana varijabla pred st a v lj a. lo kalnu varij abl u d e fi n i ranog bloka, što znači da je d os t u pn a samo unutar tog bloka.
1* primjer za d e kl ara c ij u var i j able *1 1* unut ar d e fi niranog bl oka *1 funk 1 O
{
c har c hi 1* vari jabla dostupna-c i jelom podruc ju funk c i j e *1 pr int f ("\n Dalj e DIN " ) ; i f (c h
{
int
==
)D)
p[120] ;
1* var i j abla j e dostupna salllO za *1 *1 1* bl ok naredbi naredb e if
} } P redn ost d eklaracije varijabli u nut ar bloka naredbi jest u tome što se mem orija zauzima samo tokom izv r šava nja bloka naredbi. Nakon i zlaska iz bloka zauzeti dio me morije se oslobađa. Naravno, to ponekad može biti i n e dostatak.
5.7.
Memorijske klase
Sve d eklarirane varijable i funkcije u e-u imaju dtla atri bu t a: tip i memorijsku klasu. Memorijskom klasom pobliže se z ad aju karakteristike varijabU. One odre
e p održava četiri
mem orijs k e
klase:
5.7.
Mcmorijsle Hase
113
auto extern stat ic register. Identifikatori memorijskih klasa moraju stajati ispred deklaracije tipa var ijable. Opći oblik deklaracije varijable i memorijske klase je: identifikator ..lIlenL.ldase
tip_varijable ime_varijable
Na primjer, exterll extenl
5.7.1.
iut
i;
ehar strillg[ l;
Automatske varijable
Najčešće korištena m e m orij s ka klasa varijabli su automatske varijahle. Sve lokalne varijahle su po svojoj pretpostavljenoj vrijednosti ( default ) au tomatske varij a ble . Zbog toga se kod deklaracije lokalnih varijabli atrihut auto može izostaviti. Na p ri mjer ,
{ 1*
}
deklaracija automatskih varijabli
. auto int auto char
*1
i·• ch;
je potpuno isto što i
{ 1*
}
deklaracija automatskih varijabli
int char
i·, ch;
*1
Funkcije
114
Korištenjem automatskih ( lokalnih ) varijabli minimizira se količina zauze te memorije. Budući da programski jezik e ne dopušta definiranje funkcija unutar ne može pridružiti atribut
funkcija ili bloka, proizlazi da se funkcijama auto.
5.7.2.
Eksterne varijable
Područje djelovanja varijabli proširuje se ppotrebom globalnih varijabli. Pod područjem djelovanja podrazumijevaju se ovdje dijelovi programa ili funkcija u kojima se može pristupiti vrijednostima pojedinih varijabli radi čitanja ili mijenjanja njihova sadržaja. Područje djelovanja globalnih va rijahli je cijeli program. Globalne varijalile m oraju se definirati i zva n svih funkcija. Me(tutim, i područje djelovanja globalnih varijabli može se proširiti dodavanjem ključne riječi extern ispred imena varijahle. Prema memorijskoj klasi ove varijable se nazivaju eksterne var ijable. Iako se pojmovi globalna varijabla i eksterna varijahla često poistovjećuju, postoje odrectene razlike. Razlika između glohalnih i eksternih varijabli je II području djelovanja, te načinu definicije i deklaracije. Definicija eksterne varijable je potpuno jednaka definiciji globalne varijable. Međutim, definicija globalne varijable je ujedno i deklaracija glohalne varijable, za sve funkcije čiji se kod nalazi II istoj datoteci, dok se eksterne varijable moraju deklarirati na početku svake funkcije u kojoj se koristi. Ako se eksterna varijabla koristi u svim fun kcijama može se deklarirati na početku datoteke izvan svih funkcija. Globalne varijable dostupne su samo funkcijama koje se nalaze u da toteci tl kojoj je globalna llaT'ijabla definirana. Eksterne varijable su dostupne sllim funkcijama tl kojima je eksterna tla7'ijabla definirana ili deklarirana. Prema tome, ako se područje djelovanja globalne varijable hoće proširiti na sve funkcije programa, bez obzira u kojoj datoteci se nalazi izvorni kod funkcije, globalna varijabla se mora proglasiti eksternom. Dakle, global ne varijahle možemo promatrati kao podskup eksternih varijabli. Kako u programima, čiji se izvorni kod n alazi u jednoj datoteci, razlike između globalnih i eksternih varijabli pra.ktički nema, ova dva pojma se često pois tovjećuju. 1* primjer za globalnu varijablu *1 int
suma;
1* definicija i deklarac ija *1 1* globalne var ijable *1
5.7.
Memorijske klase
115
main () { suma = O; zbroji O ; printf (lI\n Zbroj brojeva od 1 do 100 j e %d".suma); } int zbroji O { i; int for (i=l; i<=100; i++) suma +=i; }
Varijabla jama
suma je
glob aln a var ijabl a i kao tak va je dostupn a svim funk ci
unntar datoteke
kojoj je definirana.
u
Prethodni primjer preuredit ćemo tako da se izvorni kod programa nalaz i u dvije d at o t eke, test.c i test1.c. Ako se želi da varijabla suma bude dostupna svim funkcijama programa, kao u prethodnom primjeru, mora se definirati kao ek s t e rn a varijabla. **
DATOTEKA TEST.C **
1* primjer za eksterne varijable *1 suma; int 1* definicija eksterne varijable *1 void zbroji (); void ispis_rezultata (); main () { suma = O; zbroji O ; ispis_rezultata (); }
**
extern int
suma;
void zbroji O {
DATOTEKA TEST1.C
**
1* deklaracija eksterne varijable *1
Funkcije
116 ii int for (i=1i i<=100i i++) suma += ii
} 1* ispis rezultata *1 void ispis_rezultata() {
printf ("'n Zbroj brojeva od 1 do 100 je Yed",suma) i
} Budući da se eksterna varija b l a suma
koristi u obje funkcije može se
deklarirati na početku datoteke. Deklaracija eksternih varijabli unutar poje
dinih funkcija koris t i se u slučajevima kada lok alne varijable imaju isto ime kao i eksterne varija.ble koje se ne koriste'u toj funkciji. Način izvršavanja programa čiji se izvorni kod nalazi u više odvojenih datoteka opisan je II 11. p oglav lj u .
Ekstern e varijable najčešće se koriste u programima gdje v eliki broj fu nk c ija utječe na promjenu istog skupa varijabli . U takvim slučajevima korištenje eksternih varij abli mnogo je povoljnije od kor i š t enja niza argume nata funkcija. Za razliku od automatskih varijabli
k oje nestaju tek nakon
izlaska iz fu u kcije , eksterne varijabl e nestaju završetkom programa.
Neophodno je razli kovati definiciju od deklaracije
eksterne var ij ahl e .
Definicijom eksterne varijable odreduje se tip varijable, zauzima memorijski prolitor', i inicijalizira tJarijabla. Deklara c ija ek ste r ne varija bl e daje samo informaciju o tipu i nazivu varijable. Deklaracijom se ne zauzima m emo r ijski prostor. Osim toga eksterna varijabla mo ž e se izvan svih fun kcija .
U velikim 1> ro g ramima
definirati samo jednom i
to
čiji se izvorni kod nal azi u niz datoteka , de
kla rac ij a eksterni11 varijabli lt s vako j
d ato t eci izbjegava se upotrebom pre p ro cesorske naredbe #indude ime_dat. P re p roce sors ka naredha #in dude u č i tava , na mjesto na koje m je navedena, sadržaj dato t eke zadane parametrom ime_dat. U datoteci ime_dat sadr ž ane su deklaracije svih eksternih varijabli i prototipi definirani h funkc ija. Neka se izvorni kod pro grama n alazi u tri datoteke:
varijabl e dijelovi
datoteka 1, datoteka2 i datoteka3.
ko d a
II
Eksterne
1, j, p [100]. Radi j ednostavn osti prikazani su samo kojem su eksterne varijable definirane, odnosno deklarirane.
su suma,
datoteka 1 1* definicija ekste rni h
varijabli *1
117
5.7. Memorijske klase
int char
suma, i,j; p[100];
datoteka heder 1* deklaracija extern int extern char
eksternih
varijabli *1
suma, i, j;
p[];
datoteka 2
#include "heder"
datoteka 3
#include "heder"
Korištenjem pre pro ceso rske naredbe .include "heder" pisanje koda za deklaraciju eksternih varijabli: extern int extern char
izb jegava
se
suma, i,j;
p[ ];
Budući da programski jezik e ne doz voljava definiranje funkcije unutar fun k cije , sve funkcije su eksterne. Iz toga proizlazi ono što smo dosad u v ijek koristili a da toga nismo bili ni svjesni, tj. da se definirana funkcija može pozivati iz bilo k ojeg dijela programa.
Funkcije
118 5.7.3.
Statičke varijable
S tat i č ke var ij able II e-u kori ste se za lokali z acij u po dru čj a djelovanj a varijabli ili funkcij a. Zad avanje stati č kih var ij abli obavlja se dodavanjem ključne riječi static II deklaraciji varij able ili fu nkcij e . Na primjer, statie int
k·,
Statičke varijable, slično kao i glo bal n e (eksterne) trajno z a u z i m aju mj es t o u memoriji. Me
statičke varijable.
Lokalne statičke varijable trajn o zauzimaju memorijski prostor i Sll sam o unutar funkcije u kojoj su deklarirane. Za razliku od
dostupne
automatskih lokalnih va r ij a b l i , koje nes t aju izlaskom iz fu nk c ij e , v rijedn os t lokalne statičke varijahle ostaje z a pisana u me m oriji . Svakim p onov ni m p oziv om f un kc ije vrij edn os t l okaln e s t at ičke va r ij a ble p ostavlj a se na v rijed nost koj u je varijahla imala prilikom z a d nje promjene. Me
Lokalne statičke varijable koriste se u sluč.ajevima kada je neophodno da se vrijednost poje d i n e varijable sačuva p rili k o m izl aza iz fu nk cije , a da je u isto vrijeme varijabla "sakri ve n a" od o s t ali h funkcija. P ro mje n a v rijedno st i glohalni11 varijabli ili lokalnih varijahli drugih funk cij a s istim im enom ne utječe na promjenu vrijednosti lokalne sta t i čk e varijable. Lokalne statičke varijable se veom a č.esto ko r i s te II funkcijama za generiranje slu č aj n ih bro Jeva. . Kao primjer možemo u z e t i lokalnu statičku var ijab l u da hi saznali broj p oziva o
broj_poziva_funkcije ()
{ static int
broj_poziva;
broj_poziva++; /* povecaj broj /* svakog poziva funkcije *1
poziva za
jedan nakon*/
119
5.7. Memorijske klase printf ("\n Broj poziva
=
%d". broj_poziva);
}
Lokalne statičke varijable se mogu defin irati i u nu t ar bloka n aredbi. TURBO e će prilikom deklaracije lokalnoj s t atičkoj varijabli dodijeliti vrijednost O. Neki prevodioci e-a to ne čine. U tom slu čaju se varijabla mora inicijalizirati p os eb n o m n aredhom ili funkcijom . Da bi varijabla bil a dostupna i u toj funkciji mora se definirati kao globaln a varijabla. Kako bi varijabla ostala i d alje "sakrivena" od nekih funkcija, definira se kao globalna statička varijabla. Globalne statičke varijable su dostupne samo funkcijama 6ji se kod nalazi unutar datoteke u kojoj je varijabla definirana. datoteka TEST.C 1* definicija i inicijalizacija *1 1* globalne staticke varijable *1 static int
broj_poziva;
inicijalizacija () { broj_poziva = O; } broj_poziva_funkcije () { broj_poziva++; 1* povecaj broj poziva nakon*1 1* svakog poziva funkcije *1 printf ' (II\n Broj poziva
=
%d". broj_poziva);
}
Varij able je dovoljno i nicijalizirati samo jednom . Pozivom bilo koje funkcije varijabla broj_poziva post av lja se na vrijednost koju je imala p r ili k o m zadnje promjen e . Defini cijom globalne statičke vari j able automatski joj se dodjeljUje vrije dnost O. unutar datoteke test.e
Globalne s t atič.ke varij able n aj češć,e se definiraju u funkcijama koje se smještaju I I biblioteke funkcija (library). Tako definiran a varijabla dostupna
Funkcije
1 20
j e s am o za fu n k cij e k oj e se n al az e u biblioteci. P romjen a globalne s t at ičke varijable, pozi vom bil o koje fu n k c ije iz b ibl i o t eke , ne utječe na p rom je n u global n i ll i lokal n i h varij abli istog imen a d efini r ani h unutar program a. A n alogn o gl o b al ni m stat i čkim varijabl ama m ogu se d eklarirati i statičke D efi n i c ijo m funkcije kao stat ic , ona se može pozivati samo i z
funkcije.
fu n kcij a čij i s e kod
5 . 7.4.
n al azi u istoj d atoteci .
Registarske varijable
(� et vr t a
mem or ij ska klas a je register.
ta.rske m ože se pr i m i j e n i ti s amo
D eklar aci ja varijable kao reg i s n a određene t i pove p o d ataka. To ovisi o
d u lj i n i varijabl e j d uJj i n i regi s ta ra račun ala. Na primjer, kod račun ala IB M P C reg i s t arsk im varijabl am a m ogu se p rogl asi t i samo varijabl e t i p a int i
char. Deklaracijom regi s t ar s ke varijabl e z ah t ijeva se od raču n ala da var ija bl u s mjes t i II j e d an o d reg i s tar a p ro cesora. P rogram i koji kori s te r egis t ars k e varij ahl e su kraći i brži , j er se š t e d i v rij eme
smješten a
p r is t u p a memoriji gdje j e inače
var ij abla t okom i z vršavanj a program a. Regist ar s ke varijable su gotovo id ealne za kontroln e varijable u p e t lj am a .
/* registarske varij able kao kontrolne */ vari j abl e petlj e /* */ funk c i j a O { reg i s t er int ij int suma = O j f or ( i = O j i < 100 j i + + ) suma += i i return ( suma) i
}
Budu ći
d a reg i s t r e procesora smatramo dinami čkim dijel om m e m orije ,
p r oi zlaz i da se registarskim varijabl am a mogu p r oglas i t i samo l o kaln e varijable i varij able koje pred s t avljaju argumente fun k cij e , uz u vj e t d a nisu deklarirane kao pokazitJači. Varij ab l a deklarirana kao pokaz ivač ne m ože b i t i regi s t ar s ka varijabla, j er se ni reg i s t ri m a procesora ne m ož e p r i s t u p i t i p reko ad r es e . Kod većine implementacija e-a ne m or ate brinu t i o prevelikom broju
registarskih varijabli . Prevodilac će au tomatski p rogl as i t i varijablu n eregis-
5.7.
Memorijske. klase.
121
j e broj registarskih var ij abli p rekor ači o dozvoljeni maksim um. Utjecaj regi starskih varijahli n a brzinu izvršavanj a p rogr am a može se isp i t at i slj e deć i m programo m : tarskom ako
1* t est iranj e brzine izvrs avanj a programa 1* koristenj em registarskih i l1eregistarskih 1* varij abl i
*1 *1 *1
# include main ( ) { uns igned int reg i s t er uns igne d int t; long
i, k; l, m;
t = t ime ( ' \0 ' ) ; for C i = O ; i < 50 ; i++ ) { f or (k = O. j k < 64000 ; k++ ) ; } printf ( lI\n Vr ij eme izvrsavanj a petlj i za neregistarske varij able = %l d " , t ime ( ' \O ' ) - t ) ;
t t ime ( ' \0 ' ) ; for ( 1 = o ,· l < 50 ; 1++ ) { f or (m ::: O; m < 64000 ; m++ ) ; } printf ( "\n Vr ij eme izvrsavanj a petlj i za registarske varij able = %ld" , t ime ( ' \O ' ) - t ) ; }. =
Izvršavanje pro gr am a pokazuje d a je
petlja
s regist arskom
varijablom skoro
dvap u t brža. Fu nkcija t ime O se n al az i u s t an d ardnoj biblioteci funkcija,
i vraća
cjc1ohrojnu
vrijed n o s t trenut nog vremena.
Funkcije
1 22
5. 8.
Rekurzij a
Fun krije koje p o z i va j u same sehe , d i rek t n o ili i n d i re k t n o , n aziv aj u se rekurz ivne fu nkcije . Komu nikacija izm e
m anje efi kas ni o d i te r ativ ni h postu p aka. Međutim , rješavan je p rogram sk i h z ad at aka r ek ur z i j o lll je u mn ogo slu č.ajeva priro dniji i j e dn o s t av n ij i
rJesavanja.
n ačin di
Osim to ga , neki program ski z ad aci , n a primjer obilazak n amičkih stru k t ur a p o d at aka, m ogu se riješiti isklju čivo rekurzijolll .
Vezu i Z lll e
Fakto r ij el zadan og
b roja rač u n a se prem a form uli :
n ! = n * (n - 1 ) * (n - 2 ) * . . . * 1
za svaki n > O
ili
n! = n * ( (n - l ) ! )
za svaki n > O
/ * izracunavanj e f aktorij e l a */ it erat ivn i postupak */ /* int f akt ( int i) { int k, fj f = lj for ( k = i j i> l j i-- ) f *= i j r e t urn ( f ) j
} Isti p roblem riješe n
r
e ku rzi vn o
1* izracunavanj e f aktorij ela */ r ekurz ivni po stupak *1 1* i n t f akt ( int n ) {
1 23
5. 8. Rcku rzija int
fj
(n <= O ) return ( 1) i else { f = n * f akt (n- i); return (f); } if
}
Funkcija za i zračunavanje faktorijela re kllTzijom traje nešto dulje od funkcije koja koristi i t erati vnu metod u . Zašto? Za izračunavanje faktorije l a i teraci jom, fu n kcija f akt O se poziva jedanput, dok se kod izračunavanja faktorijela rek urzijo lll , rU ll k dja fakt O poziva n- l pu ta . Vrijeme za poziv i izvršavanje fu nkcije je d u lje od vremena potrebnog z a jedan prolaz kroz programsku petlju. Svaki rckurzivni poziv funkcije zah tijeva pohranji vanje na stog vrijed nosti svih lokaln ih varijabli, polja i argumenata. fu nkcije. Nakon toga p očinje izvršavanje fu n kcije, ali s novim argumentima. Postupak se ponavlj a sve d o ispu njenja u vjeta za izlaz iz rekurzivne funkcije . U n ave denom primjeru , u vjet izlaska i z rekurzi vne funkcije je if (n < = 1 ) . Rekurzi vni m pozi vom sc ne stvara nova kopija fu nkcije, već su sa.m o argumenti u poziv u fu nkcije nov i . Tok izvršavanja funkcije f akt ( ) može se prikazati kao n a slici 5 . 1 . Meha nizam izvršavanja rek u rzivne funkcije prikazat ćemo n a primjeru u čitava lIja niza znakova. N akon unosa oznake za n ov i red ( new line J \n J RET U RN ) u či tani niz se ispisuju obrnu ti m re d oslijedom . Za učitavanje jed n og znaka s t astature koristi se stand ard na funkcija get char O . Funkci jom p ut char O ispisuje se je d an zn ak n a standardni izla,z . Prototi pi nave denih funkcija n alaze se I I d atoteci stdio . h . -
ispis ucitanog niza znakova 1* *1 1* obrnutim redoslijedom - rekurzivni pos t upak *1 #include <stdio . h> void
rek_unos ();
main () { printf (" \n Unesite niz znakova : " ); rek_unos O j }
Funkcije
1 24 rezultat
=
fakt (3)
(2)
(5)
return (f)
( 3) (4)
Slika 5 . 1 .
1* uno s i i s p i s niza znakova *1 void rek_unos ( )
{ char
ch ;
if « ch = getchar ( » ! = ' \n ' ) rek_uno s ( ) 1* rekurzivni poziv funkcij e *1 putchar (ch) ;
} Rezul tat iz v r šavan ja programa je: Unesite n iz znakova : Zdravo ovardZ
Pogledajmo tok izvršavanja programa. N akon poz i v a funkcije rek_unos ( ) , unosi se prvi zn ak (funkcija getchar ( » ) Z . Budući da je uneseni z n ak razli čit od ' \n ' , ponovo se poz i va fu n kcija rek_uno s ( ) . Kako funkcija nije završila, vrijed nosti lokalni h varijabli ostaj u na stogu. N a st ogu se isto tako nalazi i povratn a ad resa. S t anj e stoga nakon prvog prolaza i zgl e da ovako:
5. 8.
Rtkurzija pov.adr.
1 25
funkciji rek_unosO
<
----
povratna adresa
<:
----
povratna adresa u funkcij i
u
Z
pov. adr
mainO
Nakon pozi va rek_unos O i unosa sljede ćeg znaka (d) , ponovno se ispituje da li je zn ak razli čit od ' \n ' . Budući da je različit , ponovno se poziva rek_unos O . Meh a n i za m je isti kao u prvom prolazu. Vrijednost i lokalnih varijabli i povratna adresa zapisuju se n a stog i poziva se funkcija rek_unos O . St anje stoga nakon drugog prolaza je: pov.adr.
<
p ovratn a adresa
u
funkciji rek_ullosO
<
povratna adresa
u
funkcij i
<
povratna adresa u funkcij i
d pov.aeIr.
rek_ullosO
Z
pov. adr
mrullO
Is t a p ro c.e du ra se ponavlja sve dok je uneseni znak različit o d ' \n ' . Nakon unosa ' \n ' zadovoljen je u vjet izlaska iz rekurzivn e funkcije. Stanje stoga nakon u nosa znaka ' \n ' je: ' \n '
pov.adr.
fu nk c ij i
rek_ullosO
p ovratna adresa u funkcij i
rek_ll11os( }
<---- povratna adresa
u
o pov.adl'.
<
----
v pov.adl".
funkcij i
rck_ulloS{ )
povratn a adresa u funkciji
rek_ullosO
<---- povratna adresa u funkcij i
rek_ullos { )
povratna adresa u funkcij i
rek_ullos ( }
<'---- povratna adresa
u
a
pov.aeIr.
<
----
r pov.adr. d pov.aeIr.
<
----
Z
pov. adr
<---- p ovratna adresa
u
funkciji
mrullO
Funkcije
1 26
Unosom znaka ' \ n ' u vj e t izlaska iz rekurzivne fu n k cij e j e zad ovoljen . B u d u ći da više nema l'pk ll J'zi vni h p oz i va , fun kc ija se i z v r š ava do nail as ka na n ared b u return ,
oslo1)a{ta dio stoga koji je zauzet lokalnim varijablam a i grana
se
na pov rat nu ad resu . Povratn a a d res a, II o vom slučaj u , pokazuje n a funkcij u put char ( ch) . Fu n kcija put char ( ch ) uzima vrijednos t zn aka c h s a stoga i pri kazuje ga n a zaslon . S t anje s t oga m ože se prikazati :
pov.adr.
<----
povratna
adresa
<----
povratna
adres � u funkciji l'ek_llIlosO
II
funkcij i l'ek_tll1os0
v p ov.adr. a
< ---- p o v rat. n a
pov.a,Il'.
adresa
u funkcij i rek_llllos()
r
<---- povratna adresa
p ov.adl'.
u
funkciji l'ek_uuosO
tl p ov.adl'.
adresa II funkciji l'ek_unosO
<: ----
povratna
<----
povratna adresa
Z
pov. a dr P o s t upak Sl'
n as t avlj a je:
izvršavanja fu n k c ij e
sve d o
zadnjeg
II
argument a fu nkcije na s t ogu .
. . . . . .
ch = Z Z ! ,. ' \0 '
putchar (ch)
ch = d d ,- ' \ O ' __
putchar(ch)
funkcij i IllaillO
-
... . ______
Tok
.------,
ch : ' \0 ' . uvj et ispunj en
1> �ut��CU'(c�) · .
Treba ra z l i k ovat i u vjet izl aska iz reknrzivne fu n k cij e od z av r š e t k a reknr zivne fu nkcije. U vj e t izl aska i z rek n rzivne fun k cij e " pr eki d a" s t avlj anj e ar
gu tll ('n ata flJ llk�ij(' i l okal n i h var ij abl i na s t og , a fu nKcija će z av r š i t i tek on d a kad se s v i pod aci , koje je rek urzi v n a funkcija " spremil a" n a s t o g , " skinu" sa stog a. S vaka J'ek u rzi v n a ru nkcij a
mora
im ati u vjet
izlaska. Ako
u vjet ne po s
toji , fil nkcija t('orijski liP. završava nikad . N CI, primjf>r , ako SP, u funkcij i f akt O izostavi n aredba. if en < = 1 ) return ( 1 ) j program se vrti u b es kon ačnoj petlji pozivanja fu nkcijI' f akt O . Bu d u ći d a se svakim n ovim
5. B. Rcku rzija
1 27
pozi vom fu nkcije f akt O b ro j argumenata n a stogu p ovećava, u jedn om
t re nu tk u će doći do prekoračenja veličine m emorije rezervirane za stog i p rogram će h i t i prekinu t u z poruku
o
greš ci .
U nekim implement acijama e-a grešku može izazvati i korištenje dekre ment ili i n krem c nt op e r at o ra u p o z i v i m a funkcija. Na primjer, u funkciji f akt O , kod i z r a č u n av anja fak torijela, ne bi trebalo p i s at i
f
=
n
* fakt (--n) ;
jer p rom jen a - - n m ož e u tjecati n a p romje nu vrijednosti varij ab l e n i s pre d p ozi va fnkcij e f akt ( - -n ) i r e zul t a t će b i t i p ogrešan . Za k raj r asp r av e o rekurziji nap i sat ćemo fun kcij u ko ja rješava p ro ble m hanojs kog tornja. P roblem h an oj skog t ornj a glas i :
P rebad pr s t e n ove razli či t i h veli čin a sa š t ap a 1 na š t ap 3 pomoću š t ap a 2. P rebaci vanje mora ići t ako da se s am o m anji prsten m ože n aći na većem . To znači prsten 1 u v ijek m ože biti na prst enu 2 ili na prst enu 3, d ok prst en 2 m ože b i t i samo na prst enu 3 . Početno s t anje je:
š t ap
š t ap
1
š t ap
2
Z avršno s t anje je:
š t ap
1
š t ap
2
š t ap
3
3
Funkcije
1 28
1* Program
HAHOJ
*1
ma in ( )
{
print f ( " \n Broj prstenova : : " ) ; scanf ( "%d" , .tbr_pr ) ; pr int f ( " \n Sl ijedi uput stva : : " ) ; pr int f ( " \n = = = = = = = = = = = = = = = = = = = " ) ; t oranj ( i , 3 , 2 , br_pr ) ;
} 1* r ekurz i vna funkcija * 1 t oranj ( int f , int t , int a , int - br_pr s t enova )
{
if (br_prs tenova == 1) print f ( " \n Premj esti prsten i sa els e
%d na %d" , f , t );
{ toranj ( f , a , t , br_pr s t enova- i ) ; print:! ( "\n Premje st i prsten %d s a %d n a %d" , br_prstenova , f , t ) ; t oranj ( a , t , f , br_prstenova- i ) ;
} }
5 . 9 . Prot otip funkcije
P r oto ti p funkcije omogu ćava provjeru istovrsnosti tip ova podataka de finirane funkcije i tipova pod ataka koji se pojavljuju u poz i v u . P rovjera se
obav1j a II
tokll
prevođenja programa.
*1 1* pr evodilac ce pr il ikom prevodj enj a j a v iti gr e sku 1* razl i c itost i t ipova podataka defin irane funkc i j e i *1 podataka u poz ivu funkcij e 1* *1 funk ( int , float ) ;
f l oat main
O
1* protot ip funkc ij e * 1
5. 9.
Prototip funkcije { int float i
=
j
=
a
=
1 29
i, j ; a;
100; 200; funk ( i , j ) : 1* greska => razlicitost t ipova podat aka * 1
} float funk ( int x , float y ) { return ( x * y ) ; }
tipova podataka u pozivu funkcije i tipa pod ataka d efi n irane rezultira greškom. Na primjer, u prethodnom primjeru u fu nkcij u funk O prenose se dvije cjelobrojne v rijed nos t i i i j , što za ht ij eva četiri b a jt a memorije n a stogu . M e
fu nk c ij e
Svi p rototipi funk cij a obi čno se n avode na početku dat ot eke . U pro gramima koji koriste niz funkcij a , prototipe funkcija je n ajprakti č ni je g ru pi rati u od \l'ojene datoteke, tzv. header d atoteke, koje se preproc e s ors kom naredhom # include u ključuju na p očetku program a. D ato tek e u koj i m a se nalaze pr oto tipi fu nkcija obično sadrže dodat ak .h. O njima će b i t i više r ij e či u l l . p ogl avlj u .
Funkcije
1 30
5.10.
Preprocesorske naredbe
n ared be n i s u s as t av n i dio programskog jezika C . One akcija prije samog prevođenja p1'Ograma, odnos n o postavljaj u dodatne zahtjeve II pro c e s u prevo(tenja programa. P re procesorske naredb e n ajčešće se ko r i s t e za povećavanje o p ć eni t os t i programa. B u d u ći d a nisu sas t av n i (lio e-a, s i n t aksa preprocesorskih n aredbi razlikuje se od sintakse n ared bi C-a. Opći obli k pre p r o ces o r s k e n aredbe glasi : P reprocesorske
omoguć.uj u izvo(lcnje o d re
# naredba parametri Pre proc es o r s ka n aredb a m ože se naći II bi-lo k o j e m dijelu programa i n e ost ajill n are d bi oznakom ; . Preprocesorske naredhc definirane A N S I stan d anl olll su :
o d vaj a s e o d
# if # ifdef # ifndef #else #elif #include #defi ne # u ndef # line #error #pragma. Najčešće
5 . 10. 1 .
korištene pre proc es ors k e n aredbe su # include i #defi ne.
Naredba #include
Opći ohlik n aredh e #include je: #illdllde "imcJlatoteke"
131
5. 1 0. PrcJ>rocesors1.:e n a redbe ili
#illdude < ime_datoteke> . N are d b om # i nclude " im e _ d atoteke" ć e se
n a mjesto n aredbe
# includ e ,
u i z vorn om programu , kop irati sad r ž aj d at o t eke " ime_datoteke" . Uklj u či vanje pojedi n i h d at ot eka u i zvorni kod programa n aroči t o je pogodno kod program a s v eli k i m brojem fu nkc.ij a i
gl ob aln i h
varij abli , koje se 11loraj u
n al az i t i u s v i m d atotekam a i z vornog kod a program a. P rototipovi funkc.ij a
i gl obal n i h varij ab l i u t om se sl u č aj u
grupiraj u
u jednu d at o t ek u , koja s e
n aredbom # include u klju č i u d atoteke i z vornog kod a k o j e t e sadržaj e za h t ij evaju .
clude
N a p ri mje r
< st d io. h > .
,
n a početku p rogram a čes t o se nalazi li n ija # in
U d at ot ec.i s t d io . h n al aze se s v i prototipovi s t an d ar dnih
ulazn o- i z l az n i h fu nkc.ij a .
Bez n aredbe #include, u t ok u prevo (tenj a p ro
gram a, ne hi hila ispi t i van a suglasnost tipova funkcija i t i p ova p o d at aka ar
bi bile otkrivene pomoću n a druge načine š t o je svakako m n ogo
gumenata fu nkc.ij a . S amim tim i greške t og t ip a n e prevo d ioca, n ego hi se m orale otkrivat i zam or n ije i teže.
O p ći obli k n aredbe # include dozvolj ava da se ime_ datoteke n avede u nu t ar zn akova n avo d a "
" ili u n u t ar zagrad a
< >.
Ako se ime d at o t eke
n avede u n u t ar zagrad a < >, tada prevo dil ac traži n avedenu d atoteku
r e k t o r ij u koji je d efin iran poje di n o m i m plement ac.ijom . to p o d dir ek t o r ij e : \ t c \ includ e .
u
di
Za T U R B O e je
Ako je ime _ d atoteke unu t ar zn akova
n avo d a , može se zad ati b il o koj i direk t orij
u
kojem se datot eka nal az i .
5 . 1 0 . 2 . Naredba #define Uz
nared hu # include j e�ln a o d n ajkorisnijih i n aj češće kori š t enih naredbi je n ared ba # defi ne. O p ć i oblik n aredb e gl asi :
pre
procesorskih
#defil1e identifikator niz...z llakova Prije
s am og prevo(tenj a program a preprocesor će s ve ident ifikatore z am i
j en i t i n izo m _ z nakova.
P reprocesorska n aredba # defi ne p ogo d n a je za
defini ranje s i mholi čkih kon s t an t i kon s t an t i niza zn akova s t r ing con s t an t
,
(
)i
m akro n ared b i .
N aredb olll se m ože d efinirat i i bilo koj i d i o t ek s t a . N a p r imjer, defini c.ij o m :
Funkcije
1 32
'det ine test
" Ovo
funkcija printf ( t est ) ; Ovo
je test primj er"
će na zasJon računala ispisati tek s t
je test primj er
Naredba # defi ne veom a čest o se koristi
i
za definiranje simboli čkih kon
s t an t i :
#de:t ine #de:t ine
PI
3 . 14
R
10
Simboli čke konstante d o p r ino s e većoj
općenitosti programa.
N ared ba # define omogu ćuje d efini ranje
'det ine
HAX ( a . b)
« a)
<
(b»
?
makr o naredbi.
(b)
:
N a primjer,
(a)
definira m ak ro n aredbu MAX koja određuje koji je od zadanih argumen ata a i b v e ći . Razlog za definiranje makro naredb e a ne funkcije je u tome št o j e kod makro n ared bi d ovoljn o krat ak i razumljiv da se pisanje fu nk cij e n e is p1 at i . Isto tako argu me n t i makro naredbi nisu d efinirani , t ako d a ć e u ovom slu čaju MAX ( a . b) radi ti korek tno bez obzira na tip p o d at aka a i b. Da je u mj es t o m akro n aredbe biJa d efi ni rana funkcija, tip podataka II pozivu funkcije morao bi odgovarati defi niranom t ipu podat aka.
fu n k cij e jest i u tome što fun kcij a p os t oji za vrijeme i zvr šavanja program a, a makro n e . Naime, k ao što je rečeno , s ve linije koje sadrže m akro defi n i c ije se prije prevođenja zamjenju ju d efi n i ran im nizom _z nakova. Prema tome, program koji korist i m akro Razli ka izm eđu
makro- definicije
i
n ared b u MAX
main C ) { a
=
MAX
ci. j) ;
} će prije samog prevo(fenja izgled ati ovako:
5. 1 0. Preprocesorske
naredbe
133
main O { a
=
« i)
<
(j»
( i) ;
(j )
?
} Defi n i ra nj e i
ko r i š te nje makro naredbi
umjesto funkcija p ovećava b rz inu
program a jer se d ob i va n a vrem enu poziva funkcije.
M akro n are d b a može zamjenji vat i i niz n aredbi . U tom slu čaju n ared bam a se ua kraju li nije dodaje \ čime se označava n as tavak definicije.
#def ine
I I I C _POLJ A
(polj e , velieina )
f or ( i=O ; i
P rili kom d efi niranj a m akro n ared bi treba biti oprezan .
Naime, ne
spre t n o definiran a m akro n ared b a može prouzročiti n e željen e efek te. gl ed ajmo što se d oga(1a ako
kvadrata.
po
d efini r am o m akro n aredbu za izračunavanje
nekog broj a,
#de fine
KVADRAT ( x )
x
U p rogr amu će se linij a u kojoj
•
se
x nalazi
KVADRAT (x)
zamije n i ti kako je i
d efini rano . P rem a tom e preprocesor će linij u
a = KVADRAT(b + e ) ; p reves t i u .
a = b + e
b + e;
•
što se s obzirom n a p rio r i tet aritmeti čkih operatora izračunava kao
a = b + (e
•
b) + C ;
Jedna o d čestih greš aka pri definicij i m akro n aredbe j e pisanje grani čnika
na k r aj u
d efinicij e . U
ve ć i n i
slu čajeva
oznaka j
(j )
ne pred s t avlja prob lem , jer
se on a p re vodi kao nul n ared ba i ne izvršava se. Da je n a kraju pre t h o d ne
makro- definicije
bila stavljena ozn aka
; tad a bi se linij a
1 34
Funkcije a
prevel a a
=
KVADRAT ( x ) i
kao :
=
a
ai ;
*
što ne hi izazvalo p ogrešku . MNtutim , ako se nared b a n al azi II bloku
if ( a = = 2 ) x = KVADRAT (a) i else
x+ + ;
t ad a
d o d a t n a nul n ar e d b a j ne doz voljav<j, i z vođe nje hloka n aredbi koji je
p r i d ru žen e l s e i
p re vo d i l ac
j avlja
grešku .
Simhali čke kon st an t e i m ak ro n aredhe defini rane n aredbom # defi ne n aredbom # undefine. Na primjer, p oni št avanj e simb oli čke kon s t an t e P I zad aj e se nared bom
p oni š t avaj 1l s e
PI
#und e f
Poni š t avanje d efinirani h simbol i čkih k on stan t i i m akro n ared h i
koristi se p oništ avanja p o s t ojećih . Tek n akon poni št avanja d efi ni cije m akro n aredbe, on a m ože hiti zamijenjen a funkcijom . Na pri mjer , p oniš t avan j e d efinicije m akro n are d b e MAX ( a , b) gl asi: u
svrb u red e fi n i ranja ili
#und ef
KAX
i ne z ahtij (' va n avo (tenj e argnmenata.
5 . 1 0 . 3 . Nare d b e uvj e t n o g prevo đenja programa N ared he # if, # ifdef, # ifndef, #else, #elif, #endif omogu ćuju u vjetno p re v o{te n j e program a. Opći oblik n aredhi z a u vj e t n o prevo (te n j e je:
#if uvjet hlok naredbi #elldif
o.s t a le p rcproces orske n a redbe
5. J J.
1 35
N are d b e za u vj e t n o prevo(tenje prog r am a kori s t e se z a razvoj program a
koj em
se želi povećati pren osivost . U p o t rebom n aved enih n ared b i d uljin a i z v r š n og p rogram a može se smanjiti, š t o d akako ovisi o sistemu n a kojem se program prevo d i .
1* pr imj er uvj etnog pr evodj enj a programa *1 DOS #def ine 1 #def ine VER 3.3 main ( ) { #ifdef DOS pr intf ( I I\n DOS operat ing s y s t em ver . " ) ; #else pr intf ( I I \n UN I X op erat ing syst em , ver . " ) ; #endif # if VER -- 3 . 3 pr intf ( " 3 . 3 I I ) ; jelse printf ( " 5 . 0 " ) ; #endif
} Izvrš avanjem program a na z aslonu rač u n al a pojavit će se: DOS
operat ing s y s t em ver . 3 . 3
5. 1 1 . Ost ale preprocesorske naredbe N ar e d ho m #error p rek i d a s e pro ces p r e vo đe nj a program a . Kad p re vo dil ac n a i ete
#error
n a n ared hu :
Nepremostiva greska
i spisuje p o r u k u Nepre mostiva greska i p r ek d a d aljnje p re vo (te n j e progra
i
m a. Poru ka k o j a se i sp i s uje na z as l o n u račun al a
navoda. N aredha #error koristi se g r ešaka u pro g ram u . N ared h a # pragma
ne pi.§e se unutar znakova
u procesu pron al aženj a
i
otklanjanj a
om ogu ćuje d avanj e d o d atnih obavijes t i prevodi
ocu. O p ći o hli k n ared h e je:
Funkcije
1 36
#pragma
ime
Argument ime ovisi o implementaciji C-a. TURBO C definira dIJa argu menta ove naredbe: warn i inline. Argum ent varn signalizira prevodiocu da zaobilazi sve greške koje pri padaju tipu poruka (warnings) i koje se navedu II nared bi #pragma
warn
ti p-t;reske
Argument inline obavještava prevodioca fta izvorni kod programa sadrži n ared be A SSE M B L E R-a.
6 . P OLJA
Niz varijabli istog tipa koji nosi zajedni čko ime nazi va se polje ( array). (�lan polj a jed noznačno je o
Polja
1 38
6. 1 .
Jednodimenzionalno polj e
,Jedn odi m enzion aln o p olje (vek tor) z ap i s an o j e u kontin u ir anom n i z u m emorij s k i h l o kacij a. In deksi p olj a u e - u k r e ć u o d 0 , š t o z n ači d a je i n d ek s p rvog
čl a.n a
polj a. 0 , a n e 1 , d o k je i n deks o s m o g
člana 7 .
B u d u ć.i d a s e
t ak vo i n d eks iranje član ova p olj a razlik uje od in deksi ranj a koje srećemo II m at em at i ci
ili
n ekim d ru gi m programskim jezici m a , p ogrešno i n d e k s i ranje
čl an ova p olj a čes t a j e greška programera koji se p r v i pu t s usreću sa e-om . O p ći oblik d eklaracije jed n o di m en zion aln og p olj a glas i :
illle_polja[dimellzija] ;
�
Tip _polja p red s t avlj a jed an od osn l?vnih t i p ova p o d a t aka e-a. To float , double ili char. Dimenzija p red st avlj a b roj član ova o d n osn o d u lj i n u p olj a. Ime_polja je i d en tifikat or p olj a . Na primjer , p olje cijelih b rojeva skup koje se s as t oj i od 5 članova, d eklar i r a se kao : m ože b i t i int ,
int
skllp [5] ;
(� l anovi d eklari ranog p olj a
su
skup [O] , skup [l ] , . . . , skup [4] .
U program s k i jez i k e nije 1l gra(ten a mogu ćnost provjere p rekoračenj a d i m enzije polj a . P rema tome, prevo dilac neće j av i t i grešku ako
n ai
čiji
operan d koris ti element
polja s
u
p rogramu
i n d ek som većim od zadane
d i m en z ij e p olja.
1* gre s k a prekoracenj a indeksa polj a *1 main ( ) { int int
i . SV i skup [S] ;
1* d ek l ar acij a c j elobroj nog polj a *1
printf ( " \n Racunanj e s r ednj e vr ij edno s t i S podatka" ) ; printf ( " \n = = = = = == = = = == = ;;; ;;; ;;; ;;; ;;; = = = = = = = = = = = = = = = = = = = = = " ) ; f o r ( i ;;; O j i < S ; i++) { p r i n t ! ( " \n %d . podat ak " . i+ 1 ) ; s c anf ( " %d" . bkup [i] i } =
6. 1 . Jcd1lodimenzionaln o
polJe.
1 39
1* izracunavanj e sredn j e vrij e dnos t i *1 sv = O ; for ( i = O ; i < 1 0 ; i + + ) s v + = skup [ i ] ;
1*
greška
*1
sv 1 = 5 ; pr intf ( " 'n Srednja vrij ednost unesen ih p odat aka j e %d" . sv) ;
} B u d u ći d a n em a provjere p rek o r a č. enj a dimenzije, II petlj i će se n akon p r o či t ane.' vrijed nosti p e t og čl an a p olj a n astaviti s či t atljem sadržaj a m em o r ij s k i h lokacij a koje slijede i z a memorijskih lokacija zau ze t ih poljem . Rezul t at će oči t o b i t i d aleko od o č ekivan og . Za t ak ve vrste greš aka odgovoran je sam program er i pro n al aženje i o t kl anj anje t akvih gre š aka je njegov p osao . Rezul t at i z vršavanja n ave d e n og program a o v is i o t renu tn o m s t anju m emo rij e , i on je II trenutku izvršavanja p r og r am a d ao sljedeći rezultat : Racunanj e srednj e vr i j ed no st i 5 podataka = = = = = = = = = = = = = = = == = = = = == = = = == = = = = = = = = == = =
1 . podatak
=
10
p o da t ak = 2 3 . po datak = 5 4 . podat ak = 1 1 5 . podat ak = 4 Sr ednj a vrij edno s t une s en ih podataka j e -3438 2.
U pr o gra mi m a fl m n ogo p olja i indeksa m ogu ćnost n ast an ka t akve greške grešaka ove Š to u či n i t i da d o g- reške ne do ete ? Izbjegavanje . vrste m ogu će je kori š t enjem op er ator a sizeofO . O p Nat o r sizeofO , kao rez u l t at d aje cl u lj i n u n ave d en og pod atka izraženu brojem b aj t ova. Rj ešenje pret h o d n og primjera u p o t rellom o p e rator a s izeofO d aj e :
je velika.
1* rj e s enj e prethodnog primj era upotrebom *1 *1 1* sizeof () operatora main ( )
{ int int
i . sv ; skup [5] ;
1* d e kl ar a c i j a cj e l obroj nog po l j a *1
pr intf ( " \n Racunanj e srednj e vrij edno s t i 5 podatka : " ) ; pr int f ( " \n = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = " ) ;
Polja
140
for (i
=
{
O ; i < 5 ; i++)
printf ( "\n Yod . podatak s canf ( "Yod" , tskup [i] ;
=
" , i+ 1) ;
} 1* izracunavanje srednje vrijednosti *1
sv
=
O;
for ( i = O ; i < sizeof ( skup) I sizeof ( int) sv + = skup [i] ;
i++ )
s v 1= 5 ; printf ( " Srednja vrijednost unesenih podataka j e Yod" , sv) ; }
Rezul tat izvršavanja
programa:
Racunanje srednje vrijednosti 5 podataka = = = = = = = = = = = == = = = == = = = = = = = = = = = = = = = = = = = = = =
1 . podatak = 1 0 2 . podatak = 2 3 . podatak = 5 4 . podatak = 1 1 5 . podatak = 4 Srednja vrijednost unesenih podataka je 6
Rezul tat je definiran kao cijeli b roj te je, prema p ravili m a
za p re t varan je
pod ataka, pravom rj e š en j u 6.4 odbačen decimalni d io i konačan rezul tat je
6. Kod računanja di m e n z ije polja sad r žavat i isp ravan t i p polja. K ad smo
ski
jez i k
dr u gi član
ve ć kod grešaka tak vog tipa,
izraza
nameće
(sizeof(int» )
mora
se pitanje zašto program
takvih karak teri s tika kao e n ema mogu ćnost ot kr ivanja ovih tipova
grešaka. O d govor je u či njeni c i da j e e originalno bio zamiš lj en kao zam za ko di ranj e većine program a pisanih u A S S EMBLER- u . Da b i e
jen a
bio d ovol j n o brz da
to može i u č i ni t i , moralo se odreći p rovj eravan j a onih grešaka ko ji u sporavaju izvršavanje programa, a mogu se izb jeći bilo korištenjem drugih operatora, bilo logikom koju programer mora slij ed i ti u pro cesu pisan ja program a. tipova
6. 2.
Niz znakova
6 . 2 . Niz
141
znakova
N iz zn akova (string) nije ugra(ten kao osnovni p o d at kovni tip program skog jezika C . M e(tu tim , bez obzira na to rad s nizovim a zn akova II C-u
vrlo je jed o s t avan i efikasan . U biblioteci s t andardnih funkcij a postoji niz fun kcij a koje veom a efikasno rukuju s nizovim a znakova. Zbog jednos t avnog pristupa ovom t ipu podataka skup funkcija može se proširi t i dod avanjem ra zli či t i h korisni čkih funkcija .
.Jed an od n ačin a defini cije niza zn akova je preko jednodimen zion alnog
polja zn akova:
chal'
str[10] ;
defini ra niz zn akova str duljine 1 0 . Kod definicije d ulji n e niza zn akova t reba i m ati n a n Jll ll d a se on sas toji od jednodimenzion alnog polj a zn akova ogran i čen og nul znakom (nul character) . Zbog toga d ulj i n a polj a mora biti za jed an d ulj a o d broja znakova u nizu . N a primjer , ako se želi deklari
rati niz zn akova koj i sadrži riječ " Z D RAV O" deklarira se p olje znakova
( chamctc1' aJ'my) : chro'
8[7] ;
Prikaz niza z n akova II memorij i i zgleda ovako: s lOJ
s[lJ
s [2J
s [3 J
s [4 J
s [ 5J
s [6J
Z
D
R
A
V
O
\0
Iako niz z nakova nije defini ran kao osnovni pod atkovni t i p , C dozvoljava
)
defini ranje kon s t ante niza z n akova ( s t ring constant .
niza z n akova su :
Primj eri kon s t anti
" Z D RAVO" " DO B A R DAN" .
U niz zn akova, koji pred s t avlja konstantu niza znakova, n ije pot rebno ek spli c i t e n aves t i ozn ak u kraj a niz a (string terminator) \ 0 . Z a prikaz rad a s nizov i m a zn akova, d efiniranim kao jednodi menzion alno polje zn akova, n apisat ć emo dvije jednostavne funkcije. Funkcij a gets{ ) ,
u či t ava niz zn akova s a s t an d ardnog ulaza, a funkcij a zad anog niza zn akova.
strlen{)
vraća d uljinu
Polja
1 42 /* u c i t avanj e n iza znakova */ gets ( )
{
char int
s t r ing [8 1 ] ; /* mak s imalana dul j ina n iza * / i;
for ( i
O;
=
i < 81 ; i++)
{ if « s t r ing [i]
{ str ing [i] br eak ;
}
=
=
get che ( »
-- 1 3 )
/* CR * /
' \0 ' ;
}
printf ( " \n Un e s eni n iz znakova j e : %s " , string ) ;
} /* odredj ivanj e dulj ine zadanog n iza * / i n t strI e n ( char str e] )
{ int
i , dul j ina ;
dul j ina
=
O;
wh i l e ( st r [i++] dul j ina+ + ;
!=
' \0 ' )
return ( dulj ina) ;
}
Osim naved enih fnn kcija u stan d ardnoj bibliote ci funkcija n al azi fuukcija za rad s nizovim a znakova.
6.3.
se
čit av niz
Višedimenzionalno polje
Višed i m e n zion alno polje- može se opisati kao skup jednodi menzionaln ih polja. Da bi sc pristupilo odre
6. 3. Vi.šedim enzion aln o po/je
iut
143
lllatrica[2] [2] ;
pred st avlj a d vo d i m enzionaln o polj e . Prvi član p olj a je
lllatrica[O] [O] . u e - u s vaka d i m en z ij a p olj a im a s v o j p a r zagrad a. Tako se trodimen zional n o p olje deklarira kao
iut
t ro_diuLpolje[2] [3] [3] ;
e zapisuj e v i šedi m ezion aln a p olja
u m em oriju red
po red . D vodimenzio
n al n o p olje, zap i s an o II m emorij i , m ože se slikovi t o prikaz ati kao n a sli ci 6 . 1 . A d resa. z je zbroj počet ne a.drese m i d u ljin a polja. Velj t�in a d vodimenzio-
adresa m - ) mat r i c a [O] mat r i c a [O] matr i c a [ 1 ] adr e s a z ) mat r i c a [ l ] -
[O] [ 1] [O] [1]
odnosno
O, 1
O, O
1, O
adr e s a m
1,
adr e s a
1 z
S l i ka 6 . 1 . Prikaz dvodimenzionalnog polj a II memoriji računala n alnog polj a i zražen a b rojem b aj tova računa se prem a izrazu :
duljiua
=
bl' ..redaka
*
br ...s t upaca
*
sizeof ( tip_podatka)
P rem a gornjem izrazu , d ulj i n a d vo d im enzionalnog p olj a mat rica je:
duljina
=
2
*
2
*
2
=
8
bajtova.
Polja
144 Pojedinim č.l an ov i m a polj a pristupa se preko indeksa.
In deksi ozn a.čavaju
pozi ciju čl an a u polj u . U d vodimen zion alnom polju prvi i n d eks oz n ačava redak, a drugi stupac zad ane m atrice . Ako prostor opi šemo t rodimen zion alni m p oljem , t ad a prvi indeks zadanog člana pokazuje u d aljenost od ishod i š t a p o osi x , d rugi indeks, u d aljen ost o d ishodi š t a po osi y , a t reći i n d ek s u d aljenost o d ishodi š t a p o osi z . Za ilustracij u pogledaj m o funkcij u koj a zbraja d vije m at rice.
/ * zbroj matrica */ zbroj i_matrice ( int mat i [2] [2] , int mat 2 [2] [2] ) { int i , j , zbroj [2] [2] ; f or (i = O ; i < 2 ; i++) { f or ( j = O ; j < 2 ; j ++ ) zbroj [i] [j ] :: mat t [i] [j ] + mat 2 [i] [j ] ; } print:! ( "\n Zbroj mat t + mat2 j e : \n\n" ) ;
}
6.4.
/* i s p i s i dob ivenih vrij ednost i */ for ( i :: O ; i < 2 ; i++) { for ( j :: O ; j < 2 ; j + + ) printf ( " Y. d II , zbro j [i] [j] ) ; printf ( " \n" ) ; }
Polj e niza znakova
B u d u ći d a se niz zn akova može prikazati kao jednodimenzionalno polje tipa char, m ogu će je u e-u d efinirat i i polje niza zn akova. zn akova d efinira se kao d vodimenzion alno polje. zion al n og p olj a p redstavlj a
broj
Polje niza
P rvi i n d ek s d vodimen
niza zn akova polja, d ok drugi indeks pred
s t avlj a duljinu niza zn a.kova. N a primjer , deklaracij a polja niza znakova koje sadrži 32 niza zn akova d ulj i n e 1 5 zn akova je:
6...1 . Polje niza zn akova Deklarirano polje može se upotrijebit i za
1 45
zapis imena u čeni ka
u razred u .
Zapis o imenu učenika predstavlja j e d an niz zn akova. Pojedinom z apisu pri stupa se preko re d n og broja zapisa. Na primjer, ispis imen a učeni ka pod red n im brojem 15 glasi
printf ( " \n Ime u een ika j e y's " . zap i s _o_ueeniku [ 1 5] ) ; Među tim , osim pri stupa nizu znakova, može se
p ristupiti i p ojedinom
elemen t u niza . U n avedenom primjeru , to može biti slovo imen a. Na primjer prvo slovo imena u č.enika pod rednim brojem
15 je zapis_o_uceniku [ 1 5] [O] .
P rogram koj i tr eb a om ogu ći t i un o s 3 imen a i ispisati ih na za slo n rač.un ala
može gl asi t i : 1 * prikaz polj a n i z a znakova *1
main O { ehar int
ime [3J [ 1 5J ; i;
printf ( " \n Unos imena : " ) ; printt ( " \n = = = = = = = = = = = " ) ; tor ( i = O ; i < 3 ; i + + ) { printf ( lI \n Y.d . ime " . i+ 1 ) ; s canf ( "Y.s " . ime [i] ) ; } printf ( " \n Une s ena imena su : " ) ; printt ( lI\n = = = = = == = = = = = = = = == " ) ; fer ( i = O ; i < 3 ; i + + ) pr intt ( " \n Y. d . ime j e Y.s " . i+ 1 . ime [iJ ) ; } Rezl l1 tat izvršavanj a program a je:
Unos imena : ===========
1 . ime 2 . ime 3 . ime
Sanda Zeljko Raj ko
Polja
1 46
Unes ena imena su : ================;
1 . ime j e Sanda 2 . ime j e Z el j ko 3 . ime j e Raj ko
6.5.
Inicijalizacija polja
Varijable osnovnih tipova pod ataka mogu s e inicijalizirat i · II postupku d eklaracije varijable int float char
a
=
b
=
c
=
10; 1 0 . 25 ; 'A' ;
ili od vojenim i zrazom pridruživanja a; b ,' c ,'
int float char
a b c
=
10; 1 0 . 25 ;
=
'A' ;
=
Globalne i statičke varijable inicijaliziraju se u procesu prevođenja pro gram a i i m aj u vrijednost O. Ako lokalne i registarske varijable nisu ini cijalizi rane, u postupku d eklaracije ili posebnim izrazom pridruživanja one sadrže neodre
cj eLpolj e [5]
=
{ l , 2, 3 ,
4,
5} ;
147
6.5. Inicijalizacija polja
{ }
I n icij al n e v r ij ednos t i članova polje n avode se unu t ar viti častih zagrada i o d vajaju zarezom. Uočite d a i z a } stoj i j.
Polja niza z n a kova inic ijaliz ir aj u se n a d va načina.
Prvi n ačin je da
polje niza znakova shvatimo kao polje konstanti niza zn ak ova , a dru g i kao polje niza znakova. U prvom slu č aj u i n i c ij ali zacij a p olj a gl asi: ehar
u
string[7]
=
"Zdravo" ;
=
{ 'Z', 'd' , 'r' , 'a' , 'v'. ' o ', ' \O '} ;
d rugom slu č aj u je: ehar
string[7]
zn akova mora završiti nulom, '\0' ( u drugom s l u č aj u ) se m o r a navesti kao član polja. Isto t ako, duljina p olja mora biti za j ed an d ulj a od ukupn og b roja znakova niza. Ako se n i z zn akova deklarira kao konstanta niza zn akova prevodil ac će automatski d o d at i '\0'.
Budući d a niz
'\0'
Višedimenzionalna polja ini c ij al iz ir aj u se z adavanj e m v rij ed n osti poje
dinim članovima polja redak po redak .
Dakle isto onako kako će biti za memoriju. Na primjer, in i c ij a1iz acij a dvodimenzionalnog cjelob roj n og polja gl asi :
pisani
II
int
dvo_dim_polje[2] [3]
=
{ l, 2, 3, 4, 5, 6 };
1* prvi red *1 1* drugi red *1
I n i c ij a1i z adj a polja za koja nismo unap rijed sigurni kolika će im hit i d i m en m ože se o b av i t i II p ostupku deklaracije polja. Na pr i m j er, de kl ar ac ij om
z ij a ,
int
dvo_dim_polje[][] = {{l, {3, {S, {7,
2}, 4}, 6} , S} };
polju dvo_dim_polj e će se dodij eli t i s t varn e dim enz ij e (dvo_dim_polj e [4] [2] ) i izvršiti i ni c ij ali z a cij a članova polja.
dvodimenzionalnom
7. POKAZIVAČI
Pokaziva(�i (pointers)
prog r am i postaju
moćni. Korištenjem pokazivača pregledniji i što je najbitnije brži. Da bi pokaz ivača , neophodno je shvatiti smisao i na čin
u C:u su veoma
mnogo efi kasniji ,
se iskoristile sve prednosti djelovanja pokazivača.
Pokazivači u C-u se na jčešće koriste za p romj enu vrijednosti varijabli koje se prenose kao argument i funk cije , stvaranje dinamičkih struktura po d ataka i z am jen u polja pokazivačima. Nepravilno rukovanje pokazivačima može prouzročiti pad sistema. Međutim, kad se shvati način djelovan ja pokazivača greške se svode na minimum. U ovom poglavlju obj aš n jen i su osnovni pojmovi o načinu deklaracije i korištenja pokazivača u programu, prijenos pokazivača u funkcije , odnos polja i p ok azi vača , funkcije koje vraćaju pokazivače i pokaz ivači na funkcije .
Pokazivači
150
7.1. Pojam pokazivača
Pokazi vač je varijabla koja sadrži (pokazuje na) adresu u memorIJI.
Adresa koju sadrži pokazivač može biti adresa na kojoj je zapisana vrijednost
druge varijable ili ad resa funkcije. Prem a tome, varijahlama se, preko p okaz i va č a; pristupa indirektno.
ili funkcijama
Za rad s pokazivačima bitno je shvatiti zn ač enj e i način djelovanj a unarnih operatora & i •. Unarni operator & je adresni operator i vraća adresu objek ta II memoriji. N a primjer, izraz:
" varijahli adresa_var pridružuje adresu na kojoj je zapisana vrijednost va
rijable
var.
Neka je stanje memorije, prije izraza: pridruživanja
memorija
vrijednost
1000
326
( ad7'Csa) 100 102
Nakon izraza adresa_var
memorija
( adresa) 100
/* varijabla var */ =
&var;
stanje
u
memoriji je:
vrijednost 1 000
/* varijabla adresa_var */
102 1000
326
lt
varijabla var
*
/
Vrijecinost koju sadrži varijabla adresa_var je 1000 i ona predstavlja adresu memoriji na kojoj je za p isana vrijednost varijahle var (326).
II
ne
Budući da adresni operat or & vraća adresu o b j ek t a može primijeniti na: - konstante
II
memoriji, on se
7.2.
Deklaracija i inicijalizacija pokazivača
151
polja izraze registarske varija hl e .
Prema tome izrazi
int a = &dOO; a = &(x+20); int polje[20]; a = &polje; register int rv; a = krv; su neispravni. Sadržaju mem ori je , n a a dresi
na koju
dil'Cktno, korištenjem unarnog o p er atora
memorije s adrese ko ja je *. Izrazom
vrijednosLvar
=
pokazuje ]lokazivač, pristupa se in
*. Unarni operato r * vraća s ad r ž aj
pridružena varijabli
ispred koje se nalazi ope rator
*adresa_var;
varijabli vrijednosLvar pridrtižuje se sadržaj s adrese na koju pokazuje adresa_var. U ovom slu čaj u to je v rijed nost 326.
7.2. Deklaracija i inicijalizacija pokazivača
Kao
i sve ostale varijahle koje se koriste
u programu i pokaiivačke va
rija.hle moraju se deklarira.ti. Ovisno o mjestu rija.hla može biti
dek1aracije, pokazi va č ka
globalna ili lokalna. R egi starske varijable
ne
deklarirati kao ]lokazivači. Opći ohli k deklaracije pokazivača je:
va
mogu se
Pokazivači
152
Tip predstavlja jedan od osnovnih ili korisnički definiranih tipova podataka. Unarni operator * označava da će varijabla ime_varijable biti pokazivač. Sve varijable koje se deklariraju kao pokazivači zauzim aju istu veličinu mc
mm·ijc.
Zbog čega je onda neophodno zadati i
t ip
pokazivačke varijable?
Tip pokazivača koji se zadaje deklaracijom određuje veličinu mem orije čiji se sadržaj preslikava u varijablu kojoj se pridružuje. N a primjer,
int int
*poki x =
1 00, Yi
deklarira varijablu pok ka o pokazivač na cjelobrojnu vrijednost. Naredbom,
pok
ix:
=
varijabli pok pridružuje se adresa na kojoj je zapisana vrijednost varijable x,
pok
x
Nadalje, naredbom y =
*poki
varijabli y pridru žuje se sadržaj memorije s adrese na koju pokazuje pok. U
ovom primjeru to je vrijednost 100. Budući da je pokazivačka varijabla pok deklarirana kao pokazivač na vrijednost tipa int, TURBO e će varijabli y
pridružiti sadržaj dva bajta. Ako se pokazivačka varijabla pok deklarira kao tip
double
TURBO e će vari j abli y pridružiti sadržaj osam bajtova. Broj
pridruženih hajtova ovisi o tome koliko pojedina implementacija zahtijeva memorije za prikaz odre(tenog tipa podataka. /*
deklaracija pokaz ivaca
*/
7.2. Deklaracija
i inicijalizacija pokazivača
153
ma in O
{
* po k_na _ int i y = 12.123, Xi
int f loat
pOk _na _ int = �y; x = * po k_na _ int;
}
1* dekl ara ci ja pokaz iva ca *1 1* ini ci ja l iza c ija var ija bl e y*1
1* pri druzi po kaz iva cu a dre su *1 1 * pri druzi v ar ija b li x vr i j ednost *1 *1 1* na koju po kaz uje pok_n a_int
pri ntf ("\n V rijedno st varij ab l e y = %f",y); p r intf ( "\n A dresa va ri j ab le y = % p",�y); pr intf ( "\n Ad resa na koj u pok az uje po k_na _int = %p",pok_na_ int) ; pr intf ("\ n Vr ij edno s t va ri jable X = %f ",x);
Rezultat izvršavanja programa je:
Vr ij edno st va r i ja b le A dre s a va r ija b le A dr e sa na ko j u po ka zuje V r ij edno st varija b le Programom
se
y = 12.123000 Y = 2AOF:OFD8 po k_na_int = 2AOF:OFD8 x = -2097.000000
želi sadržaj varijable y pridružiti varijabli x. Budući da je
varijabla pok_na_ int deklarirana kao pokazivač na cjelobrojnu v rijednost,
TURBO e pridružuje sadržaj dva bajta memorije varijabli x. Za prikaz brojeva s pokretnim zarl'zom jednostruke preciznosti, tip float, potrebna su četiri hajta. Izlazni rezultati dovoljno dobro opisuju nastalu gre šku. Tokom prevo
će
ispisati poruku (warning)
o nekorektnom pridruživanju pokazivača. Međutim, može se na(�illiti izvršna verz ija programa.
Korištenjem memorije.
pokazivača m ože
se
bez
obzira na poruku
čitati ili upisivati II točno odre(telli dio
up i s i_u_memor i j u ( )
{
}
uns igned lon g int * po k; po k = ( uns i gn ed long int *) Oxi00; * pok = 20; 1* upi s i na adresu lOOH vr ij edno st 20 *1
Prije nego se iskoristi
mogućnost
direktnog
upisa na odre
memoriji, neophodno je poznavati kako sistem raspodjeljuje radnu memo
riju pojedinim resursima, odnosno procesima.
Ako ste do sada pažljivo
Pokazivači
154
pratili navedene prim jere, mogli ste uočiti veoma važno pravilo II radu s pokazivačima. Pravilo glasi: Svi pokazivači u p1'Ogramu mOT'aju se zmczJa lizimti. To znači da se svakom pokazivaču prvo mora pridružiti adresa. Adresa se može pridružiti: direktno pok
=
(tip pokazivaea) Oxl00;
korištenjem adresnog operatora pok
=
&x;
din amičkim zauzećem memorije pok - malloc(100). Koji će se način pridruživanja adrese primijeniti ovisi o vrsti problema koji se rješava. Neinicija1izirani pokazivači pokazuju na neodre
prika2 gr e s k e prou2rokovane n eini cijali2iranim poka2ivacem
main () { int x
}
=
*1 *1
x. *p i; 10;
*pi = x; 1* n eini cijali2irani poka2ivac *1 printf ( " \n Vrijedno st x = %d\n", x) ; printf ( " Vr ij edno st na adr e si na koju poka2uj e pi *pi);
=
%d",
Programom se vrijednost varijable x, 10 zapisuje na nepoznatu memorijsku adresu. U tako kratkom programu ta adresa najčešće neće biti II području u kojem su zapisane vrijednosti ostalih varijabli i program će na jčešće davati ispravne rezultate. Me
mjestima
u
programu.
7.3. Pokazivači kao argumenti funkcija
155
7.3. Pokazivači kao argumenti funkcija Deklaracijom argumcn ta funkcije kao pokaz i va ča omoguć.en je prijenos podataka preko adrese. Osnovna karakteristika prijenosa podataka preko ad rese (call by refe1'ence), jest da p ozvan a funkcija može mijenjati t17'ijcd nO!lli p1'Cnc,�cnih varijabli u nadre
1-1
I
--1 funkcija
I
sadržaj varij able y
I I
I
poka z ivač na
I I
I
A
sadržaj varijable
x
(nadre(tena funkcija )
x
:
px
p okazivač na y : py
funkcij a - zamijeni ( pozvana funkcija ) Slika 7.1.
Funkcija kojom se zamjenjuje sadržaj prenesenih varijahli je zamij eni (int
{
}
i nt
t;
t = * px; * px = * py ; * py = * px ;
* px. i nt *py)
Pokazivači
156
Pozivom funkcije zamijeni(&:x, &y) iz fu nkcije A prenos e se adrese varij a bli x i y. Sve promjene vrijednosti u pozvanoj fu nkciji zapisuju se na adrese na koje pokaz uju px i py. Budući da su to adrese na kojima su zapisane va rij able x i y, sve promjene sa d ržaj a memorije na ko j u p o kazuju px i py odrazit će se i na promj ene v rijedn osti vari jabli x i y funkcije A.
7.4. Aritmetika pokazivača .Jedini aritmetički op eratori koji se mogu ini mijeni ti na pokaz i vače su + Aritmetika p okaz i v ača ili adresna aritmeti ka bit n o s e r azli k uj e od arit metike ostalih tip o va p o d at aka N eka je pokazivač deklariran kao po ka zi vač na cjel o broj n u vrijednost
i
-.
.
int
*pok;
i neka je pokaziv aču
pok
=
pridružena adresa
(int *) Ox2000;
Adresa na koju pokazuje pok
je
2000H
(H je oz naka
za heksadecimalni
broj). Nakon izraza
pok++;
adresa na koju pokazuje pok bit će 2002H. Nakon svakog inkrementa poka zivač p okazuje na adresu na kojoj je z apisana sljedeća cjelobrojna vrijednost. Isto vrijedi i za dekrement. Da je umjesto n aredb e pok++ bila naredba pok--, tada hi pok sadržavao adresu 1998H, od nosno adresu prethod nog
cjelohrojnog podatka.
Prilikom s vak og povećavanja ili sm anjivanja v rije d nosti
p okaz i va č a
(in
krement i dekrement) p okazi va č p o kazu j e na adresu sljedećeg ili prethod nog podatka u memoriji. Da li će se adresa povećati za jedan, dva ili više
bajtova ovisi o tipu p o dataka na koje p o k aziv a č pokazuje.
zadaje se deklaracijom pok_na_char d ekl a ri ran i
p oka zi v ač a
su kao:
.
Tip po datka
Na primjer, po kaz i vači pok_na_int i
7../. A rilmclika pokazivača char int
157
*pok_na_char; *pok_na_int;
Oba pokazivača inicijalno pokazuju na istu adresu.
pok_na_int pok_na_char
=
=
(int *) 1 00; (char *) 1 00:
Adrese na koje ć.e pokazivati pok_na_char i pok_na_int nakon svakog po većanja prikazane su na slici 7.2. Da bi pokazivač pok_na_char pokazivao
adresa
adresa
pok..na_char
100
pok..na_int
100
pok..na_char
+
1
101
pok..na_int
+
1
102
pok..na_char
+
2
102
pok..na_int
+
2
104
pok..na_char
+
3
10:1
pok..nLchar
+
4
104
Slika 7.2.
Adrese na koje pokazuju pokazivači pok..na_int i pok..na_char nakon svakog povećanja
na istu adresu kao
i pOk_na_i'nt m ora se povećavati za dva.
Adresa na koju
će pokazivač pokazivati, nakon povećanja ili smanjenja, može se izračunati
prema relaciji adr e s a
=
tekuca_adr e s a + (sizeof( obj ekta) * broj)
nakon poveć.anja, a tekuca_ adresa je ona na koju pokazivač pokazuje u tom trenutku. Operator sizaof O daje veličinu objekta u memoriji izraženu brojem bajtova. Broj je
gdje je adresa ona na koju pokazivač pokazuje _
cjelobmj1la twijcdnost kojom se
zadaje redni broj objekta (podatak) na koji
pokazivač pokazuje. Koristeći prethodni primjer možemo izračunati adrese na koje će pokazivati pok_na_int
i pok_na_char
nakon prvog inkrementa.
158
Pokazivači t ek uca_ adre sa_ char = 1 00
+
(s i z e of( char) * 1) = 1 0 1
+
( s iz eof( in t) * 1)
odnosno 1 00
= 1 02
Pokazivač se može povećati za bilo koju cjelobrojnu vrijednost. Veličin a koju vraća operator sizeofO ov i si o i m pl em e ntacij i e- a. Prema tome, adresa koj a j e dobi vena p r eth o d ni m izračnnavanjem može biti veća ili manj a, ov i sn o o tome da li se u poj edi noj i m pl ementac iji za prikaz cjelobrojnih p odataka koriste v iše il i manje od dva bajta. Prema tome dozvoljeni su izrazi tipa .
p ok = p ok
+
b r oj ;
gdje je broj hilo koja cjelobrojna vrije d n ost
.
Usporedbom d vaju pokazivača odrectuje se da li oni p okazuju na i stu adresu. Usporedba se obavlja kori šte nje m rel acijskih operatora. N a primjer,
Pridruživanje j ed nog pokazivača d rugom dozvoljeno je samo II sl u čaju da su istog tipa. Ako pokazivači nisu istog tipa, mora se koristiti operator O (cast operator). Na primjer, int f l o at
*p ok _n a_ intl . pok _na_ int2 ; * pok _n a_f l oat;
1* p r idruz ivan j e i s t ih t ipova p ok az i vaca *1 p ok_na_ in tl = pok_n a_ int2 ; 1* pridru zi vanj e raz l i c i t ih t ipova *1 p ok_ na_f loat = (f loat *) pok _na_in t2 ; p ok _na_ intl = ( in t *) pok _na_f loat ; Vrij ed n ost
koju vraća *pok_na_intl n akon izraza
7.5. Polja i pokazivači
159
nije jednaka vrijednosti ko ju vraća *pok_na_flo at, jer t.e *pok_na_ int vratiti vrijednost prva d va bajta, dok će *pok_na_flo at vratiti vrijednost prva l'etiri bajta, Aritmetičke operacije dijelj enja i množenja nisu d ozvoljene. Operacije zbrajanja ili oduzimanja, gdje se pokazivaču dodaje ili oduzima vrijednost različita od cjel obrojne, nisu dozvoljene. Isto tako, zbraj anje, oduzimanje, množenje i dijeljenje dvaju pokazivača nije dozvoljeno. Prema tome izrazi, pok = p ok * 8 ; pok = pok + 1 0.2 1 3 ; pok = pok 1 + pok2 ;
pok = pok I 8 ; pok = pok 12 3. 1 ; pok = pok 1 / pok2 ; -
nisu dozvoljeni.
7.5. Polja i pokazivači
Sva polja u e-u mogu se zamijeniti pokazivačima. Pristup odre(tenom članu polja. m o že se ostvariti preko indeksa polja ili promjenom pokazivača. Opt.enito gl ..dajući zamjena polja pokazivačima može poveć.ati efikasnost p rograma. Naredba, in t
p[S] ;
cjelobrojno polje O(r 5 članova, p [O] , .... , p [4] . Da hi s e pris pojedinom članu polja preko p okazivača, neophodno je dekl arirati pokazivačku varijahlu istog tipa kao deklarirano polje i pridružiti mu po č.etnu adresu polja. Na primjer, deklarira hlpilo
in t
* pp ;
pp = 8l p[ O] ;
/* d ekl arac ij a pok az ivack e var ij ab l e */ 1* ini c i j al i za cij a pok az ivaca */
N akon inicij alizacije pokazivača, pokazivač sadrži adresu prvog člana polja (tj. pokazuje na prvi član polja), što se može prikazati kao
Pokazivači
160
pp
l
peo]
p [1]
p[2]
p [3 ]
P [4]
Budući da p o k azivač pp sadrži adresu pr vog člana p olja , može se dohiti vrijp.clnost tog člana polja. Iz toga pro izl azi da će se naredbom pridruživanja,
varij ahli x pridružiti vrijed n os t prvog člana polja . Ako pp pokazuje na prvi
član polja,
tada po definiciji, pp + 1 pokazuje na prvi naredni, a pp - 1 na prvi p re thod n i član polja . P rem a to m e, ako pp pokazuje na p [O] , tada
pp + 1 pokazuje na p [1]
.
Veza izmedu polja i pokazivača p ostoji ne samo II logičk om, nego i pogledu. Potpuno je s vej e dn o da li će se pisati,
silItaksnollI
x = p [o] ;
II
iJi
odnosno
x = P [3] ;
ili
x = *( pp
+
3);
DakIf', indeks č.lana polj a odgovara djelom broju koji se dod aj e početnoj
adresi
na koju p ok az uj e
vaču izrazom
pp
=
pokazivač. Adresa
polja m ože se pridružiti pokazi
p;
Me
je pokazivač varijahla, izrazi
p
=
x pogrešni.
i pokazi va č a . Budući da
su ispravni,
polja p okazivači m a vrijednosti na dva načina:
Kod za m je n e
pristnpiti
pp++, pp = p
dok
su
izrazi pH,
prvog člana polja može se
161
7.5. Polja i 1JOkazivači x = *(pp + 1):
što je ekvivalentno
x =p[1]:
ili
pp++: x = *pp; MNtutim, postoje određene razlike o kojima treba voditi računa. Prvi izraz će varijabli x pridružiti vrijednost prvog člana polja tako da vrati sadržaj
dva hajta s adrese, koja je za dva bajta viša od bazne adrese. Drugi način pridruživa.nja će prvo pomak nuti pokazivač na naredni podatak, a zatim će varijabli x pridružiti sadržaj naredna dva bajta. Pokazivač u prvom slučaju
i dalje pokazuje na
prvi čl an
polja,
pp
l
p [o] dok u drugom slučaju
pp
p[1]
P [2]
p [3]
p [4]
pokazuje na drugi čl an polja
pp
l p[p]
p[1]
p[2]
p[3]
P [4]
Ako se na.kon drugog izraza napiše,
x = *(pp + 1); varijabli x pridružuje se vrijednost
trećeg člana
Polje se u funkciju prenosi tako da se prenese
polja.
adresa prvog člana
polja.
Prema tome, argument funkcije može se deklarirati bilo kao polje ili kao
pokazivač
odgovarajućeg tipa. Na primjer, potrebno je izrač.unati srednju
vrijednost članova polja od 10 elemenata. funkcijom
sr_vrij ednost ()
Srednja vrijednost računa se
Pokazivači
162
/* prijenos jednodimenzionalnog cjelobrojnog polja */ /* preko adrese prvog elana polja */ float sr_vrijednost(int main O { int float
*,
int);
polj e [10J , i:
srv;
prinU ("\n Unesite vrijednosti elanova polja "); for (i O: i < sizeof(polje)/sizeof(int): i++) { printf ("\n Vrijednost Y.d. elana " i); seanf ("Y.d", I:polje[i]); } srv sr_vrijednost(polje, sizeof(polje)/sizeof(int»; print! ("\nSrednja vrijednost elanova polja je Y.f", srv); =
=
} /* izraeunavanje srednje vri� ednosti */ float sr_vrijednost (int *pok_na_polje, int dim) { float srv = 0.0: int ij for (i O: i < dim: i++) sry += *pok_na_polje++; =
sry = srv/dim; return (sry): }
Funkcija sr_vrijednost() može se napisati i t ako da float sr_vrijednost (int polje[ J. int dim) { float srv = 0.0; i;
int
for (i
arv srv
O; +=
i < dim: i++) polje[iJ;
= srv/dim: (arv) j
return
}
=
se
koristi polje
7.5. Polja i pokazivači
163
Fu nkcija za izračunavanje srednje vrijednosti, koja koristi pokazivač, brža je od iste funkcije koja koristi polje. N aime, pri izrač,unavanju sume članova polja, korištenjem indeksa članova polja, za svaki član polja prvo se mora izračunati adresa na kojoj se on nalazi ( računanje na temelju baze adrese ) , a zati m se uzima vrijednost s te adrese. Kod funkcije koja koristi pokazivač svaki put kad se uzme određena vrijednost, pokazivač se pozi cionira tako da pokazuje na sljedeći član polja. Budući da je operacija inkrementiran ja prili čno brža od operacije izračunavanja adrese pojedinog člana, samim tim će i vrijeme izvršavanja funkcije biti kraće. Me
f ( pi[3] )
f ( pi + 3 )
II funkciju f () prenosi adresa četvrtog člana polja p i. I z toga proizlazi da će u funkciji f () prvi čl an polja odgovarati četvrtom č.1anu prenesenog polja.
Razlika izmectu pisanja inkrement ili dekrement operatora ispred ili iza varijable (side eject), koja je bila spominjana u prethodnim poglavljima, sad dobiva pravo značenje. Podsjetimo se da je razlika bila u v remenu izvršavanja. Neka su u narednolll programu p i polje cijelih brojeva i *ppi pokazivač na polje cijelih brojeva . 1* prikaz main () { int int ppi
side efect-a *1
pieS] {t, 2, 3, 4, S}; *ppi, v ; =
=
pi ;
1* pokazivac pokazuje na prvi clan polja *1
1* prvi slueaj *1 1* op erator se nalazi i s pred *1 v = * (++ppi ) ; printf ( " \n Vri j ednost elana polj a j e rod", v ) ; }
164
Pokazivači
Rezultat izvršavanja programa je :
Vrijednost elana polja je 2 se umjesto naredbe v šavanja programa bit će:
Ako
=
*(++ppi)
napiše v
=
* (ppi++), rezultat
izvr
Vrijednost elana polja je 1
U prvom slučaju pokazivač se prvo pohlakne za jedan, što znači da
pokazuje na drugi član polja, a zatim se pomoću operatora * pročita sadržaj
memorije na koju pokazivač pokazl.1je.
U drugom slučaju prvo se pročita
sadržaj m emorije na koju pokazivač pokazuje, a zatim se pokazivač pomakne
na sljedeći
član polja.
7.6. Pokazivači i niz znakova
Konstanta niza znakova
"Niz znakova i l i str ing" zap isa n a je u niz memorijskih lokacija i ograničena je nul znakom ' \0'
.
Pokazivačka varijabla može se deklarirati tako da pokazuje na adresu na
kojoj počiuje zapis
niza znakova. Na primjer,
Iz razom
pokazivaču pok_na_string do djelj uje se adresa na kojoj počinje zapis kon stante niza znakova. Nakon pridruživanja adrese, može se pristupiti svakom pojedinom članu niza. Naredbom
165
7.6. Pokazivači i niz znakova print! ( "\n Drugo slovo je => Y.c". * (pok_na_string+1» ;
na zaslonu računala se ispisuje: Drugo slovo je => d
Niz znakova prenosi se u
funkcij u
kao i polje, što znači da
se
u funkciju
prenosi početna adresa. Argument funkcije se u tom slučaju mora dek lar i rati kao pokazivač. Na primjer,
1* poziv funkcije *1
duljina_stringa ("Zdravo"); duljina_stringa (char *pok na string ) _
_
1* defin i c ija funkcije *1
{
} Kako programski j ezik e nema definiran niz znakova
kao
osnovni tip
podataka, pokazivač na niz znakova omog u ćuje dodavanje različitih funkcija ko je rukuju sadržajem niza znakova. Niz funkcija koje rukuju nizom znakova
nalaze se u standardnoj biblioteci fun k cija.
strlenO, strem pO, strcatO i
To
su
na pri m jer ,
strepyO,
(lruge funk cije. Kod svih funkcija isključivo se koriste pokazivači. Za prikaz navedenog napisat ćemo funkciju strlenO koja vraća duljinu zadanog niza znakova.
1* izracunav anje duljine niza znakova *1 korist enjem pokazivaca *1 1* int strlen (char
{
int
*string)
duljina = O;
while (*string++ ! = '\0 ' ) duljina++; return (duljina);
} Već je pokazano da se niz znakova može zadati i preko jednodimenzio nalnog polja znakova:
Pokazivači
166 char
polje_znakova[10];
Kod zadavanja niza znakova preko polja
definiciju
polj e_znakova [ ]
char
"O
=
i
pokazivača bitno je razlikova ti
v o j e polj e" ;
od
U prvom slučaju deklarirano polje mora biti dovoljno du gačko da pri h vati
zadani niz i oznaku kraja niza' \0'. U dn!golll sl u čaj u sad r ži adresu prvog člana niza, a
duljina
pok_na_polj e_znk
zadanog niza znakova nije ograni
čena.
Prethodna funkcija, koja vraća duljin u zadanog niza može se
n api s a ti
i
korištenjem polja znakova
1* izracunavanje duljine niza znakova */ */ koristenjem polja /* int strI en (char
*string)
{ int
duljina = O;
while (string[duljina] != '\0') duljina++; return (duljina);
}
7.7. Polja pokazivača
Polja pokazivača deklariraju se kao i polja ostalih tipova podataka. N a
prim j e r , int
*ppi[10];
7.7.
Polja pokazivača
167
deklarira polje pokazivača na cjelobrojni tip podataka. Osnovno pravilo korištenja pokazi vača kaže da se svak i pokazivač prvo mora inicijalizirati. Inicijalizacija (pridruživanje adrese) pojedinih članova polja pokazi vača is tovjetna je inicijalizaciji pojedinačnih pokazivača: p pi[ O] = lx;
gdje je
x
cjeloh rojna varijabla. Pol je pokazivača može se prikazati kao
ppi [o]
----�----�.
�I _ 1_00_ __ I�__ _ 3_25_
----�----�.
IL__ _ 10_ __
----+----..
ppi[l]
ppi [10]
�
__
__
�
�
Sadržaj memorije na koju pokazuje član polja pokazivača pridružuje se varijabli x kao i kod pojedinačnog pokazivača. Razlika je jedino u tome da se kod polja pokazivača mora n avesti koji član polja pokazivača pokazuje n a vrijednost koja s e pridružuje. Na primjer, x
=
*ppi [1] ;
pridru žuje varijahli
x
vrijednost 325.
Poljem pokazi vača mogu se zamijeniti višedimenzionalna polj a. Neka je polje mat deklarirano kao: i nt
mat [3] [3] ;
Deklaracija polj a pokazivača, koj i m će se zamijeniti pol je mat, glasi:
Svaki član polja pokazivač.a je pokazivač na redak matrice. Zašto ne n a st upac'? Zhog toga što s e vrijednosti članova matr i ce u memoriji pohranjuju po redcima, te ć,e se povećavanjem adrese za jed an, na koju pokazuje pojedini član polja pokazivača, dohvaćati naredni član matrice. Analizirajmo sljedeći program:
Pokazivači
168 1* zamjena dvodimenzionalnog cjelobrojnog *1 1* polja poljem pokazivaca *1 main () { int
int int
1* deklaracija i inicijalizacija polja *1 ma t [3 ] [3 ] = { {l, 2, 3}, {4, 5 , 6}, {7, a, 9} }; 1* deklaracija polja pokazivaca *1 *ppi[3] j i, j;
1 * inicijalizacija polja pokaz ivaca *1 ppi [O] mat[O] ; ppi[l] = mat[l]; ppi[2] = mat(2]; •
=
printf printf printf printf
("\n ("\n ("\n ("\n
Adrese adresa adresa adresa
clanova polja pokazivaca su :"); ppi [O] = Y.p",ppi[O]) ; ppi(1] = Y.p" ,ppi[l]) ; ppi[2] = Y.p" ,ppi[2]);
print! ("\n\n Vrijednost i na koje pokazuju clanovi polja pokazivaca su: II ) j for (i = O; i < { printf (II\n for (j = O; prinU }
3; i++)
Redak Y.d :",i+1); j < 3; j++) (" %d " , *(ppi[i]
+
j»;
}
Rezultat izvršavanja programa je: Adrese clanova polja pokazivaca su: adresa ppi[O] = 2260:0FC2 adresa ppi[l] = 2260:0FCa adresa ppi[2] = 2260:0FCE Vrijednosti na koje pokazuju
Redak 1 Redak 2 Redak 3
1
2
7
8
4
6
3 6 9
članovi polja pokazivača su:
7.7. Polja pokazivača
169
Adrese poj E'C1 i n i h r ed aka pokazuj u da su v r ij ed nos ti članova matrice poh r a njeni red ak po redak. Element m atri c e mat [l J [oJ je na adresi koja je za 6 veća od početne adrese, mat [OJ [OJ. Budući da znamo
n ačin zapi sa m at ric e
11 memoriji, može se umjesto
p o lj a pokaziva č a koristiti i jed n a pokazivačka vari ja b la . Pokazivač se inicija lizira tako da p okazuje na prvi član matrice, mat [ oJ [OJ. U tom sl uča j u se za
pristup pojed i n im čl an ov ima ma t ric e mo raju ob av i ti d odatna izračun ava nj a . N a primje r , ako pokazivač. ppi pokazuje n a p r vi član m a tr ice mat [ O] [OJ, a
želi se p rist u p i t i v rijednos ti člana x = *( pp i
+
mat [1] [1], tada se ona
dobije kao
4)
Broj 4 dohije se kao suma redak + stupac. Treb a imati na umu da 4 ne zn ači pomak p okazivača u memor ij i za četiri haj t a, nego pom ak za onoliko ha jtova koliko je potrebno za prikaz četiri člana polja. Koliko je to bajtova, ovisi o tom e koliko pojedine implementacije za h t ij evaj u bajtova za prikaz odre
Polja i pokazivači su
u
e-u zamj e nj i v i .
dek l a r i ra na preko polja p okazi va č a kao: i nt
A ko je m atrica
mat [3] [3J
* pm at[3] ;
tada su i zrazi mat [lJ is tog č l a na m atri ce .
[1.] i pmat [1] [lJ p otpu n o korektni i sad r že v rijednost
Pred nost polja p o kazi va č a n ad poljima jest što polje uvijek zauzima onoliko memorije koliko je potrebno za zapis c jeloku pn og p olj a ,- dok je veličina m e m orije koja se zauzima poljem pokazivača promjenjiva. Polj a })okazivača
veoma često s e koriste kao pokazivači na konstante je pogodn o kod fu nkcija za obradu greške. Opi s greške m ože biti konstanta niza znakova p ro mj e njive d u l jine. Polje pokazi vača se II tom s lu čaj u deklarira kao globalna ( ek ster n a ) var ij ab la . S vaki član polja po kazi va ča pokazuje na odre
niza znakova, što
pokazivača c har
{
}
*g r e sk a[ ] "\n g r e sk a p rij eno sa po datak a", "\n g re sk a inicij al iz acij e COM!", "\n p rovj e r i k ablov e na COM! "
Pokazivači
170
koje se može slikovito p rikazati kao
greska[O]
----+-----••
�
n greska prijenosa podataka\O
greska[1]
----
+-----••
�
n greska inicijalizacije
greska[2]
----
+-----••
�n
COM1 \0
I
provjerite kablove na COM1\0
p okazuje na
niz konstanti niza znakova koje daju opis mogućih nastalih g re š aka. . D odavanje op i sa novih gre š aka zahtijeva samo dodavanje nove kon s tant e II deklaraciji polja p o kaz i va ča . Funkcija za obradu greške kod t ako defiuiranog p olja k r ajnje je je dnostav na . Dovoljno je II funkciju p renijeti kod g re ške . 1* funkcij a za obradu gre ske *1 void obrada_gre ske(int kod _gre ske) { printf ("%s" , gre ska[kod _gre ske])i }
Polja pokazivača gotovo su n ezam jenjiva u funkcijama sort i r anja nizova znakova. Z amjena redoslijeda dva ju nizova znakova zahtijeva samo zamjenu njihovih adresa, a ne i sadržaja, što je mnogo jednostavnije i brže. Neka je zadano polje p okazi va ča i p olje nizova znakova.
Polje pokazivača
Nesortirana polje
ppi [O]
ZAGREB
ppi[1]
LJUBLJANA
ppi
[2]
BEOGRAD
Ispis polja niza z n ak o va p rije sort i ra nja je ZAGREB, LJUBLJANA, BE OGRAD. Polje je potrebno sortirati tako da ispis bude po abecednom re du . Dakle, BEOGRAD" LJUBLJANA, ZAGREB. To u biti znači da prvi
7.8. Pokazitlači na pokazivače
171
niz znakova tl polju treba staviti na zadnje mjesto, a niz zn akova sa zad njeg na prvo mjesto. Ovaj bi proces bez polja. pokazivač.a bilo relativno teško izvesti. Me
niza znakova II polju neće zahtijevati i
j govo [[zičko premještanje. Do
n e
voljno je zamijeniti p oka ziva če koji pokazuju na nizove, što se m ože slikov i t o p r i kaza t i kao Polje pokazivača
Sortirano polje
ppi[O]
ZAGREB
ppi[1]
LJUBLJANA
ppi [2]
BEOGRAD
Funkcija koja zamjenjuje adrese dvaju nizova znakova skoro je ista kao i funkcija za zamjenu sadržaja dviju varijahli. U funkciju za zamjenu dovoljno je pre nij e ti polje pokazivača i indekse polj a p okaziva č a koji se z a mjenj u j u . 1* zam j ena s ad rzaj a d vaj u nizova znak ova *1 v o id
{
}
zam i je ni_niz ( char char
* pp_nizova[] . in t prv i . int d rug i)
* tem p ;
tem p = pp_n izova[pr v i]; pp_ nizova[prv i] = pp_nizova[dr ug i] ; pp_n izova[d rug i] = t em p ;
7.B. Pokazivači na pokazivače Pokazi va či II e-u ne moraju nužno s a državat i adresu na ko joj je za p i s ana v r ijednost vari j able. Pokazivač može sadržavati adresu na kojoj je za pisana adresa vrijed n osti varijable kojoj se želi pristupiti. Drugim riječima, pokazi v a č m ože pokazivati na drugi pokazivač koj i p o kazu je na adresu u
memoriji gdje je zapisana vrijednos t varijable. Takav nač.in pristupa v rijed
nosti varijable č est o se naziva višestruka indirekcija.
Deklaracija pokazivač.a na pokazivač obavlja se dodavanjem još jednog
unarnog operatora * i sp r ed varijable koja je deklarirana kao pokazivač.
Pokazivači
172 1* p r imje r v i s estruk e ind ire k c ij e *1 m ai n ()
{
i
}
i· * pi ; ** pn p ;
in t i nt i nt =
,
1* dekl araci j a po kaz ivac *1 1* dek lara c ij a pok az ivac na pokaz ivac *1
10;
pi = tij 1* pi pok azuj e na adresu v ar ij ab le i *1 pn p = t p ij 1* pnp pok azuj e na adr e s u po kaz ivaca pi *1 pr intf ( "\ n V r i jed no s t na ko j u pokazuj e pnp je Y. d" , ** pnp) ;
Stanje se s lik ov i t o može prikazati
kao pi
pnp -----r-----+.
I�
r------+.
____======
�1
x
_________l_0�
Rezultat izvršavanja programa je:
V ri jed no s t na ko j u p ok azuj e
p np
je
10
Takvim pristlIpoIll vrijednosti veoma je lako učiniti grešk u Otk ri vanje grešaka ovog tipa, pogotovo u već.iIll programima, može o du zet i prilično vremena. .
Višestruku indirekc.iju ne treba shvatiti kao povezanu li stu . Povezana lista je dinamička struktura pod a t ka. One će se detaljnije oh j asn i ti II po gl av lj u o složenijim t i povi m a podataka (8. poglavlje).
7.9. Problemi s pokazivačima Pokazivač.i
u
e-u pruzaJu zaista velike mogu ćnosti.
Međutim, da hi
se te mogućnosti iskoristile neophodno je poznavati smisao i način djelo
vanj a
pokazivača. Greške koje nastaju
nepravilnim
korištenjem
pokazi v a č a
7.9. Problemi
lj
pokazivačima
173
programu mogu, u najboljem slučaju, dati pogrešne rezultate, a često izazivaju prijevremeni prekid programa ili pad sistema. Otkrivanje grešaka prouzročenil} nepravilnim korištenjem pokazivača dugo je i zamorno. Zbog toga će se ovdje, nakon pregleda osnovnih pojmova o pokazivačima, još jednom ukazati na najčešće greške. Greške nastaju bilo zbog nesbvaćanja prirode pokazivača ili zbog nepažnje programera. u
Pokazivač sam za sebe nije problem. Problem nastaje kad se neka vri jednost treba čitati ili upisati na adresu na koju pokazivač pokazuje. Zbog čitanja s pogrešne adrese rezultati aritmetičkih izraza bit će pogrešni i otkri vanje greške ponekad i nije tako teško. Me
{
i. *pi;
int
i = 10; *pi = i;
1 * greska *1
}
Pokazivaču pi pridružuje se vrijednost prije nego mu je pridružena adresa, dakle prije .inicija1izacije. Vrijednost varijable i upisuje se na neodređenu adresu. Kod ma1ljih prograItla ova adresa najčešće neće biti u području memorije u kojem se nalaze ostali podaci ili kod programa, i program će ra diti "besprijekorno". Me
{
O int
i.
*pi ;
Pokazivači
1 74 i
=
10 ;
1* greska *1
P = i;
}
U navedenom primjeru pokazi vaču pi ne pridružuje se adresa na koj o j je zapi san a v rijed nost vari jable i, nego adresa 1 0 . Ispravan izraz glasi : pi
=
&i;
Zbog toga, prije čitanja ili upisi vanja u memofiju na ko ju pokazuje pokazivač, treba provjeriti da li je pokazivač pravilno inicijaliziran , odnosno na što on pokazuje. Klas i čan primjer pogreške u programirila s pokazi vačima, je greška ko ja nastaje zbog razli(�itosti tipova podataka i pokazivača ko ji pokazu ju na njih . 1* primj er za gr esku razli c it o s t i tipova *1 1* pokaz ivaca i varijabl e *1 main ( )
{
f l o at int
f 1 23 . 456 ; *pok_na_ int ;
pok_na_ int
=
=
�f ;
1* inici j alizac ij a pokaz ivaca *1
pr int ! ( " \n Vri j edno st na ko j u pokazuj e pok_na_int %d" , *pok_na_ int ) ; =
}
Na prvi pogled se čini da je sve u red u . Pokazivač je uredno deklari ran i pravilno m u je pridružena adresa. Me
7. 1 0.
Pokaziv a č tipa
void
175
7 . 1 0 . Pokazivač t ipa void Bilo koj i tip pokazivača može se pretvoriti u pokazivač t i p a vo id * . Pokazivač tipa vo id * n aj če šće se kori sti kod p rijen o s a podat aka u funkcij e , da bi se omogu ćio prijenos pokaz i va č a bilo kojeg t i pa pod a t aka . 1* pr imj ena pokaz ivaca t ipa vo id *1 main O { int
*x . y = 20 ;
x = "Y i f ( x ) ; 1* poz iv funkc ij e * 1
}
printf ( " 'n Vr i j ednost var i j abl e y = Y.d" . y ) ; pr intf ( " ' n Vr i j edno s t na koj u pokazuj e x = Y.d" . * x ) ;
1* def ini c i j a funkc ij e * 1 f ( vo id *t ) {
}
Izvršavanjem program a d o bij e
se:
Vr i j ed�o st varij abl e y = 1 0 0 Vr i j ednost na koj u pok�uj e x = 100
Tako d efiniran a funkcija f O omogu ćuje prij e n o s po kazi vač a na bilo k oj i tip Me
kaže: Na ad r esu
na koj u poka z uj e pokazi vač t u pi ši cjelo brojnu konstantu p ri mj eru se, za pret varanje pok azivač a void * II poka
100. U n aved enom
zivač na cjelobroj ni t i p podatka, koristi cast op erato r ( int * ) .
Pokazivači
176
7. 1 1 . Pokazivači i funkcije U p r eth o dnim poglav ljima pokazane su o sn ov n e karakteristike prijenosa podataka, gd j e su argu m en t i fu nkcij e d eklarirani kao pokazivači ( call by 1'C/c7'Cncc). Osim prij eno sa pokazivača u funk cij u , funkcije se mo gu definirati i tako da v ra ć aj u pokazivač na hilo koji defi ni rani tip podataka. O p ći oblik d e fi n i cije funkcije koja vraća pokazivač je: tip_podatka {
*funkcija( deklaracija argumenata funkcije)
} * označava da fu nk cija
O perator
N a primjer,
tlmća pokazit1ač na defini rani t ip_podatka.
1 * def ini c i j a f unkcij e koj a vraca pokaz ivac char
{
* vrat i _ string ( ) char
* s tr ing ;
s t r ing = "\n Vracanj e konstant e n iza znakova . . . " ; return ( str ing) ; 1 * vrat i pokaz ivac n a niz znakova * 1
}
fu nkcije koja v raća pokazivač n e razlikuje s e o d Pokazivai� ko ji fu n kcij a v raća u nadređenu funkciju ko ri s t iti Poziv
poziva ostalih funkcij a.
može se, ali i ne mora
.
1* poz iv funkcij e koj a vraca pokaz ivac char
*vrat i_string ( void) ;
main ( )
{
}
*1
pok_na_string = vrat i_str ing ( ) ; printf ( " % s " , pok_na_string ) ;
*1
7. 12. Pokazivači n a
funkcije
177
Izvršavanjem programa na zaslonu računal a dobije se: Vracanj e konst ant e niza znako v a . . .
Fu nkcije koje vraćaju p okazivač n a definirani tip podataka mnogo se češće koriste kod složenijib i korisni čki definiranib tipova podataka. Zbog toga će o ovim tipovima fu nkcija biti još riječi kroz naredn a poglavlja.
7 . 1 2 . Pokazivači na funkcij e
Dekl aracija pokazivačke varijable, koja sadrži adresu fun kcije II m em orij i , om ogu ćuje da se s funkcijom u programu rukuje na potpuno isti n ačin kao s ostalim pokazivačkim varijablam a. To znači da funkcija (preko pokaziva(�a) m ože h i t i argum en t d rugih funkcija, čl an nekog p olja ili struk ture, i sli čno. Poka.z ivač u a fu nkciju d ohije argu menata. N a primjer,
se
n avodeći ime funkcije, bez zagrad a i
kvadrat d aje pokazi vač. na fun kciju kvadrat O . Prije nego se koristi pokazivač u a funkciju , fu nkcija s e mora defi n i rati , odnosno d eklarirati . Definicija ili d eklaradja fu nkcije je neophodna da hi prevodilac znao da je kvadrat i d eu tifikator funkeije odre
kvadrat ( int ) ;
O pći oblik d ekl aracije pokazivača n a funkciju je: tip-podatka
(*pokazivac) O;
gdje tip_podatka m ora odgovarati tip u definirane funkcije. ozn ačavaju d a ( * pokazivac) p okazuje n a funkciju .
Zagrade O
Inicij alizacija pokazivača n a funkcij u jednaka j e inicija1izaciji pokazivača na ost ale til)OVe ]lodataka. N a primjer, pokazivač ua funkciju kvadrat O ,
1 78
Pokazivači
ini cijaliz i ra se izrazom
Ini cijalizacija p okazi vača pridru žuje pokazi vaču ad res u funkcije
u memorij i .
pok..na...k v adrat
Poziv fu nkcije kvadrat O
i pri stup vrijednosti koju funkcija vraća, ohav lja se i n d i rek t n o preko p okazivača. U navedenom sl učaju rezultat izvršavanja fu n kcije kvadrat ( ) d ohije se kao
Operator * i spre(]
imena pokazi vača im a isto zn ač.enje kao kod pokazivača ti pove pod at aka. On kaže: S adržaj s adr ese na koju pokazuje pokazivač pok_na_kvadrat pridru ži varijahli kvadrat _broj a. Zagrade ozna čavaj u d a je to vrijed nost koju vraća funkcija n a koju p ok az uj e pok_na kvadrat . Argum enti fu n k cije n a ko ju p okaz uj e p ok azi vač. z ad aj u se kao kod stan d ardnog p ozi va funkcija. na
osnovne
_
_
Pokaz ivači n a fu nkcije često se kor i s t e II situa cijam a kad poziv funkcije o o d re
ovisi
int
1* deklarac i j a f u nk c i j a *1 funk l ( ) , funk2 ( ) , funk3 ( ) . funk4 ( ) . funk cS ( ) ;
1* deklaracij a polj a pok az ivaca na funkCij e *1 s t at i c i n t C Ypok_na_funk ) ( ) [ ] = { funk 1 ,
Funkcija
se pozi va
funk2 , funk3 , funk4 , funkS
i n d irek tno preko pokazi vača
};
na funkcij u
1 79
7. 1 2. Pokazivači na fu nkcije
Vrij ed n o s t indeks a z ad aj e se u nu t ar funkcije i odre(tuje koja će se od funkcij a p o z va t i . Ako je v rij e d n o st var ij abl e indeks jedn aka 2 , pozvat će se funkcij a funk3 ( ) . Is t i problem b i s e m ogao rij e š i t i i kori štenjem swit ch- cas e , o d n os n o if- else if- else n ared bi , lIl Ntu t i m rj e š e n j e b i b i l o n e š t o slože n ij e . Pokaz i vaii
aktivni rad .
n a fu n kcije često s e
u p o t reblj avaj u i u p r o gr amim a. za i n t er
Int erak t i v n i rad omogu ćuje i z v rš avanje odre(tenih fu nkcij a , ali
t ek k a d se one un esu
sa s t an d a rd n o g
ulaza.
P re t p os t av i m o da p rogram treba o m o g u ć i t i os n o v n e ra č u n ske op era c ij e , zbrajanje, od uzimanje i množenje. S o bzi rom n a z ad anu o p e r a c ij u p oz i va se fil n k c i j a koja u či t ava o p e ra n d e i i z v r š ava zadanu op eracij u . D a bi n ap i s ali
program d e n n i rat ćemo s t r u k t u r u comman d . S t ruktura se sas t o j i od na i p o kazivača na odgovaraj u ć u fu nkcij u . B u d u ć i da do sad n i s m o spominjali s t ru k t u r e , a o n j i m a će b i t i m n ogo d et alj n ij e u n ared nom p oglavlj u , rec i m o z as ad , da j e s t r u k tura s l ožen i t i p p o d at aka koju č.i n e d en ni rani t i p o v i p o d a t ak a . S tru k tura sadrži nekol i k o p o d a t aka koj i z ajed n o č i n e j e d n u logi čkll cjeli n u . P rog r a m ko j i rje š ava n avedeni z a d a t ak j e : red b e
1* 1*
primj er pokaz i v a c a na funkc ij e k o j i omogu c u j u int erakt i v n i rad programa
# i n clude < s t d i o . h>
1*
d e f i n i c i j a s t rukture nar e d b i
*1
s t r u c t c ommand
{ char irit
* n az i v ; ( * f unk c i j a)
() ;
} ma in
{
()
1* dekl arac i j a var i j ab l i * 1 int i . r ezul t at . izvrs i o ; char nar [ 1 2] ;
1*
d e k l ar a c i j a o s n o v n i h f unkc i j a
i n t zbraj anj e ( ) . int mno z enj e ( ) .
1*
*1
oduz imanj e ( ) ; kraj _rada ( ) ;
d e f in i c i j a o s no vn i h naredbi
*1
s t at i c s t ru c t c ommand nar e dba [ ]
=
{
*1 *1
Pokazivači
1 80 { { { {
"zbroj i" , zbraj anj e } , " oduzmi" , oduz imanj e } , " pomnozi" , mno2 enj e } , "kraj " , kraj _rada } ,
}i /* izvr s i zadane naredbe */ f or ( i i ) / * ponavlj aj do zadane naredbe za kraj */
{
printf ( lI \n Naredba » " ) i s c anf ( " Y.s" , nar) ; / * izvrsavanj e zadane naredbe */ izvrs io = O i for{ i=O ; i<s izeof ( naredba ) / s izeof ( struct command) : i + + )
{ it ( strcmp (nar , nar edba [i] . naziv) == O )
{ r ezultat = ( *naredba [i] . funk c i j a ) ( ) ; printf ( " Rezultat = Y.d " , rezult at ) ; izvr s io = 1 i break i
} } if ( izvrs io == O ) printf ( " \n . . . lepoznat a naredba . . . . . . .
} } /* def ini c ij e o snovnih tunk c i j a */ int zbraj anj e ( )
{
)
int x , Y i prinU ( " \n . . . Zbraj anj e . . . . " ) ; pr intf { " \n Un es ite operande " ) i s canf ( "Y.d Y.d" , �X , �y ) i return ( x + Y) i
int oduz imanj e ( )
{ int
x,
Yi
pr int! ( " \n . . . Oduz imanj e . . . " ) i pr i nt ! ( " \n Unes ite operande " ) ; s c anf ( "Y.d Y.d" , .tx , ty ) ; return (x - Y ) i )
II
)
;
7. 12. Pokazivači n a
181
funkcije
int mnoz enj e O
{
int x , y ; j printf ( " \n . Mnozenj e . . I I ) II ) ; I printf ( l \n Un es ite operande s canf ( "%d %d" . h . I:y) ; r eturn ( x • y ) j .
}
.
int kraj _rada ( ) printf ( " \n exit ( 1 ) i
.
Kraj rada
.
.
.
.
.
. . lI ) j
}
Rezul tat izvršavanja programa je: . lar edba »
zbroj i
. . . Zbraj anj e . . . . Une s it e operande 1 0 20 Rezultat = 30 laredba »
add
. . . lfepoznata naredba lfaredba »
oduzmi
. . . Oduz imanj e . . . Unes it e operande 1 0 20 Rezultat = - 1 0 lfaredDa »
pomnozi
. . . Mnozenj e . , Une s i t e operande Rezultat = 200 .
20 10
Naredba » kraj . . . . . Kraj rada
Unosom n ared he s a stand ardnog ulaza pretražuje se t abela II kojoj s u defini rane d ozvoljene nared be. Ako je n aredba definiran a, poziva se funkcij a n a koju pokazuje pokazivač defini ran u strukturi unesen e n aredbe. Pre traživanje tabel a s n aredbama (polje s t rukt ura) u programu je linearno.
1 82
Pokaziva či
MNtlI t i m ,
u
p rogram i m a
s
većim b rojem d e fi n i ra n i h n ared b i , n ared h e j e
d o b ro s o r t i ra t i t ako d a o m og u ć av aj u b i n ar n o p retraživanje .
B i n arno p re
t ra ž i va n j e je k o d veli ki h t ab el a z n a t n o brže o d li n e arnog.
Z a k r aj t reba j o š jed n o m skren u t i pažnj u n a razliku izme(tll dek l ar ac ij a : int
int *funkO i na funkcij u
( * p Ok Jla..funk ) O ;
funkcij u k oj a vraća p okaz i va č n a cj elohrojni t i p od toga, int ( * pok_na_funk) O i deklarira pokazivač
d ekl ari r a
p o d a t k a . Z a r az li k u
7. 1 3 .
int
*funk O ;
k o j a v raća cj el o h r oj n u v r ij ed n o st .
Argument i funkcij e main O
Iz v r š avanje p r o g r a m a pOCl l1Je p o z i vom funkcije
main O .
Fun k c ij a
main O p oz i v a se s d va argum e n t a . To su ar g um e n ti arg c i argv . A r g u
m e n t arg c
( argument count)
d ekl ari r an je kao cj elohroj n a var ij ah l a i s ad r ž i
p od a t ak o d i m e n z ij i vek t ora argv
( argument vect01'). Ar g u m en t
argv je
p olje p ok az i va č a , d i m e n z ij e arg c , na n iz z ad ani h argumen ata. A rg1l m e n ti fu n k c ij e main O
( command-line arguments) om o g u ć avaj u p r o g r a m p ril i k o m pokretanja prog ram a . Zadaju se p rogram a. N a p r i mj e r ,
p r e n o š e n j e i n fo r m a cija z aj e d n o s i m e n o m t es t
II
argullwnt l argulllCu t 2 argllIllell t 3
A rgu m en t i s u o p cio n al n i , š t o z n ači da s e m ogu , ali i n e
m or
aj u d ek l ar i r at i .
A rg u m en t argv j e p olj e p okaz i vač a n a p olj e n i z a zn akova . S vaki elem ent
p o l j a p o ka z i va č a p o ka z uj e n a j e d an argu m e n t funkcije . P rema d efi n i c ij i , p r v i
argu m e n t argv [O] u v ij e k p re d s t avlj a i m e izvršne v e rz ij e program a . Polje p o k az i va č argv m o že se sl i kov i t o pri kaz a t i kao
[O]
t est\O
argv [ 1 ]
argument 1 \ 0
argv [2]
argument 2 \ 0
argv [3]
argument 3 \ 0
argv
7. 13. A rgum e n t i fu nkcije main
1 83
O
P rimjer prijenosa po da t aka u program d an je sljedećim programom . / * pr i j eno s podat aka u funkcij u main
{
maiu O
*/
( int arg c , char * argv [ ] )
if ( argc < 1 ) { printf ( " Pokretanj e programa : TEST [par i ] . . exit ( O ) ; } printf ( " \ n Pren e s e n i podac i su : " ) ; f or ( i 1; i < argc ; i + + ) pr intf ( " %s " , argv [ i ] ) ;
[parn] " ) ;
=
}
Izvršavan jem p rograma TEST dobije se: TEST
Pokretanj e programa : TEST [par 1 ] . .
[parn]
Pokretanjem program a sa TEST
podat ak 1 podatak2
na zaslonu računala dobije se: Prene's eni podac i su : �odat ak 1 podat ak2
Podaci koji se prenose u funkciju main O odvajaju se raz makom Zarez je ravnopravan argumen t s ostalim kombinacijama alfanu merički h znakova. Na primjer, ako se program pokrene sa
(space) .
TEST
podat ak1 , podat ak2
rezultat izvršavan ja je : Prene s eni podaci su : podat ak 1 , podat ak2
1 84
Pokazivači
Ako je neophodno pristupiti pojedinim znakovima zadan og argum en t a on d a se to obavlja dod avanjem d rugog ind eksa argument u arg v.
1 * pri s tup poj edinim znakovima argumenata * 1 1* funk c i j e main O *1 main ( int arge , ehar * argv [ ] ) { int i , j ; f or ( j = O ; j < arge ; j ++ ) { i = O; 1 * ispis pren e s enih podat aka u funk c i j u * 1 wh i l e ( argv [j] [i] ) { 1* ispis j ednog znaka prenes enog podatka*1 printf ( "Yoe " , argv [j ] [i] ) ; i++ ; } ; printf ( " II ) } }
B u d u ći da je argument fu n kcije main
0 , argv,
p okazivač n a polje nizova
znakova, pot rebno ga je u program u pretvoriti u odgovarajući t i p p o d atka. Dakl e , ako se program pokrene sa
set 123 tada j e argu ment fu n kcije arg v [ l] jedn ak " 123" , a ne 1 23 .
Da
bi
u
program u d obili cjelobroj n u vrijednost potrebno je izvršiti p re t vor bu niza zn akova II cjelobroj n u v rijednost . Na primjer ,
1* ini c ij alizac i j a s er i j skog porta COM 1 *1 main ( int arge , ehar * argv [ ] ) { int br , port ;
if ( arge < 2 ) { printf ( " \n Pokretanj e programa :
S ET
[part] [par2] " ) ;
7. 13. A rgumeflli funkcije main O
}
185
e x it ( O ) ;
port = at o i ( argv [ l ] ) ; 1* broj s erij skog porta * 1 br = at o i ( argv [2] ) ; 1* brz ina pr ij enosa ( baud rat e ) * 1
}
in icij al izac ij a (port , br) ;
Fun kcijom i n i c i j alizacij a O ini cijalizira se serijski port s brzinom pri jenosa br. P ravilno pokwtanje programa je s et 1 9600
što znači i n icijaliziraj serijski port 1 s brzinom prijenosa 9600 hita tl sekundi . P retva.ra.nje niza znakova II cjelobrojnll vrijednost obavlja s e pozivom funkcije ato i O . FU li kcij a se n alazi II standardnoj hiblioteci funkcija.
8 . S L O ŽENIJI TIP OVI P ODATAKA
Dosa.d ašnj i primj eri program a kori s t ili su , u glav n om , osnovne t i p ove p o d at aka, . K o r i š t enje osn ovnih t i pova po d a t aka, om ogu ćuj e rješ avanje već i n e zad ataka,. M Ntu t i m , velik broj p o d at aka u programu zah t ijeva deklaracij u n i z a varij abli . Rukovanj e nizom varijabli
u
programu prilično je složen o .
P rva ol ak š i ca u rukovanj u veliki m brojem p o d a t aka j e s t grupiranje niza
logi čki poveza.n i h p o d at aka is tog t i p a u jednodimen zion al n a i vi šedimenzi
on al ll a polja. M e (t u t im , po s toje s i t u acije kad p o d ac i pred s t avlj aju jednu l og i čk u cj elinu , i ako nisu istog t ipa. U t akvim slučajevima n eop h o d n o j e posegn u t i za sl oženijim t i p ovim a podataka, ili d efinirat i vlas t i t i t i p .
P rogram ski jezik e pod ržava n ekol i ko složenij ih t i pova p o d ataka. To s u strukt ura (structure ) , unija ( u nion) , polje bitova ( b itfield ) i e nu merirani t i p p o d a t aka (enumerat ion) . Kombin acijom os n ovnih i složenih t i p ova p o d ata.ka m ogu se d efinirat i i vl as t i t i t i p ov i p o d a t aka (typedef) . Korisni čki ( vl as t i t i ) t ipov i podataka postoje samo z a vrijeme izvršavanj a
program a.
U ovom p ogl avlj u obradi t će se složeniji t ipovi podataka i objasni t i n ačin d e fi n i c ij e vlas t i t ih t i p ova p o d at aka . Bit će riječ.i i o s t varanj u dinamičkih st,·uktu1"U podataka, te o n ačinu i razlozim a pret vorbe razli č i t ih t i p ova po d ataka ( cast ing) .
Složeniji tipovi podataka
1 88
8 . 1 . Strukture
P ri č a o struk t u ram a obično počinje u trenu t k u kad se n ai (te na problem tipa:
N apisati program koji vodi evi den ciju o svim upisanim s t u den t ima
jed n e škol s ke go dine ili grupe. Podaci o s t u den t u m oraj u sadržavat i :
ime - prez i m e - go dinu rođenja mjesto rođenja adresu d at u m upisa - god i n u u pisa - godinu s t u dija - gru p u .
V i d i se d a svi podaci nisu i stog t i p a , iz čega se m ože zaklj u či t i d a se n e m og u grupira t i II polje. Rješenje bi se moglo načini ti tako d a se za svaku istovrsnu grupu p o d at aka d efini ra p olje.
Na primjer , može se definirati d vodimenz i on alno polje zn akova koje bi sadržavalo imen a svih u pisanih s t udenata i drugo polje koje bi s adržavalo prezimena i t d . Među t im , t akva rješenj a su prilično n ep rak W:na i z ahtij evaju lIspostavljanje određenih relacija između pojedinih polja, što donosi nove poteškoće. Naj priklad n ij i n ačin rješavanja t akvih i sli čnih problem a je d ekl ariranje S t ruktura bi objedinjaval a sve n avedene pod atke, a podaci m a
strukt ure.
b i s e pri s t u pal o preko
identifikatora
strukture .
U tom slu čaju p o d aci o
svakom studentu n al aze se n a jednom mjest u i za pristup o dre(tenol11 p o (l atku o s t u d en t u nije potrebno pisati d o d at n e relacij e .
8. J. Strukture
1 89
Deklaracija strukture
8 . 1 .1 .
Struktura ( zapis ) predstavlja niz razli či t i h ,
logi čki povezanih , podataka
ko j i n os e z ajednič ko ime. Ra z li ka izme(tu stTUk ture i polja je II tom e š t o el emen ti s tr u kture ne moraj u b iti istog tipa . Podaci koji čine strukturu n azivaju se članov i stru k t ure . Sve stru k t u re koje se koriste u programu ,
m or aj u
deklarirati. Opći
se
s h'uet
{
o blik d ekl aracije strukture je:
hlle_� t rllkture
deklaracija clallova s t rukture;
}i
Deklaracijom članova strukt ure odre
stru k tu re.
tip
i tip pojedinih č.lan ova
clall ..s trukt nrej
gdje tip predstavlja jed an od d efiniranih tipova p o d a t aka . Ime strukt ure se kod d efi n i c ij e st r u k t u rnih var ija bl i . S t r uk t u r n a varijabl a je složena varijabla koja sadrži n i z vrijednost i istog ili razli čitog t ipa . Treba razliko vat i deklaraciju s tru k t u re od d efinicije stTUkturne varijabl e . Deklaracijom stru k t me odre<1uje se oblik stru kture i ne zauzima se m em or ijsk i prostor. Među tim , de fini cijom strukturne varijable rezervira se m em o r ij ski prostor, Vel i č i n a rezerviran e m em o r ije ov isi o d eklaracij i pojedinih čl an ova strukture .
korist i
Neka j e deklarirana st ruk tura ohlika
struct datum { int dan ; int mj e s e c ; int god ina ; }; D efi n i c. ijom strukturne va r ij a ble
struct
datum
rodj endan ;
Složen iji tipovi poda taka
1 90
zallzim a se m emorijski prostor po treban za zapis tri cjelohrojne varijable , što s e m ože prikazat i kao
rodjendan d an
2 b aj t a
mjesec
2 b aj t a
go dina
2 baj t a
S t ru k tu rn e varijahle mogu se d e fi n irat i i II pos tupku d ekl aracije st rukture :
struct datum
{ int dan ; int mjes e c ; int godina ; } rodj endan ;
K ad se d l'kl a riran a s t ruk tura ko risti samo j e dnom , i m e struk ture može se izos t av i t i :
struct
{ int dan ; int mjese c ; int gO d ina ; } rodj endan ; O v i s ilo o
mjes tu deklaracije,
s truk tura može biti lokal n a i glohalna. Ako je
stru k t ura dekl ar i r ana izvan svih funkcij a ona je globalna i njen a d eklaracij a vrijedi za sve
funkcije
un u t ar d ato t eke i zvornog ko da.
1* d eklarac ij a globalne s t r u c t dat um
{ int
dan ;
int
mjesec ;
int
godina ;
}j ma in ( )
s t rukture
*1
Na
primjer ,
191
8. 1. StrlIktlIre {
�truct
rOdj endan ;
datum
} funk c i j a O
{
s t ruct
datum
rodj endan ;
}
P ristup članovill)a strukturne varijable Pojedi nim članovima strukturne varijable pristupa s e p omoću strukturnog točka operatora ( . ) . Točka operator povezuje ime st rukturne varijable i ime član a. N a primjer, rodj endan . dan
=
30 ;
čl anu dan s t rukturne varijable rodj endan pridružuje vrijednost
30.
Programski jezik e n e podržava format z a ispis strukturne varijable . Za ispi s s t rukturn e varijable potrebno je ispisati vrijednost s vakog njenog čl an a: pr intf ( " Yod Yod Yod" , rodj endan . dan , rodj endan . mj e s e c , rodj endan . godina" ) ;
Inicijaliz acija strukturne varijable S t ruktu rn a varijabla m ože se inicijali zi rati u toku nJezm e defini cije. Vri jednosti pojedinih članova struktu rne varijable zad aju se unu t ar v i t ičastih zagrad a { } i od vajaju zarezima. Vrijednosti se moraj u zad avati t ako da od govaraju tipu čl ana s t rukture: s t ruct datum rodj endan
=
{ 3 0 , 4, 1 964 } ;
O s i m toga, inicijalizacij a se može obaviti i ekspli citnim zadavanjem vrijed nos t i svakom članu : rodj endan . dan = 30 ; rodj endan . mj e s e c = 4 ; rodj endan . godina = 1 964 ;
Složeniji tipovi podataka
192 8. 1 . 2 .
Struktura unutar strukture
Rečeno je da čl an struk ture Ulože bit i bil o koji defini rani tip podataka. Iz tog a proizl azi da se defin iran a struktura može poj av i t i kao član u dekl a
raciji
n o ve s t ru k t ure. Na primjer, u d ekl araciji strukture
zaposlen i
stru e t zapos l en i { r ednCbroj ; int adres a [30] ; ehar ime [ 1 5] ; ehar prez ime [ 1 5] ; ehar stru et datum rodj endan ;
}; kao (-l an n avodi se s t ru k t u ra
datum. Napomenimo d a je u struk turi datum
k ao čl an t ako(ter m ogla b i t i n aved en a n eka druga d efini ran a s t ru k t ura. B roj
s t r u k t ur a. u nu t ar s t rukture
nije ograničen.
(;l a.nov i m a s t r u k t ure, koj a je član n eke d ru ge struk t ure, t ako (ter se pris
tu pa
kori š tenjem s t r u k t u r n og točka operatora.
spustiti
Mc(tu tim , n eophodno . je se u a razinu član a t e stru k t u re. N a primjer , pridru ži vanje v r ijednost i
članu s trukturne varij able
rodj endan, koj a je Nan struk ture z apo s l en i , je
zaposleni . rodj endan . dan
=
30 ;
Niz stru k tma koje se n a1 aze jed n a unutar dru g e, ako to zai s t a nije neoph o d n o , treba. izbjegavat i .
d ru g u strukt uru m ože s e inici ini cij a1i z acija strukturne varij able
S t r u k t u rn a varij able koja u sebi sadrži
jalizil'ati tokom defi nicije. Prema tom e , radn ik tipa. z apos l eni može gl as i t i : struet z apo s l e n i rad n i k
=
{
100 , "V .
N azora 1 6 " ,
" P ero " ,
" P etro vi e " , { 1 2 . 1 2 . 1960 } .
}i Viti časte zagrad e unutar koj ih se zad aju vrijedn osti čl anova s t rukturne
rijable nisu uvijek ih je pisati.
va
neophod ne . Me(tl1 tim , zbog preglednosti program a dohro
1 93
8. 1. Strukture 8.1 .3.
Operacij e nad strukturama
Skup
o pera cij a nad
strukturama daleko j e manji
osnovnim t ipov i m a po d a t aka .
od skupa operacija nad
jedna strukturna varij abl a pridru žuje su obje strukturne varijable istog tipa. Na vrijednosti , struk turne var ij abl e r adnik u strukturnu
O p eracij a pri dru živanja kojom se
drugoj m o gu ća
je sam o
pri mjer, presli kavanje
ako
var ij a b l u r adn i k 1 gl asi :
radn ikl = radnik ; S t ru k t Ul'Il a varij ahl a radn i k 1 mora
se d efin i ra t i
kao:
struct zapo sleni radn ik l ;
To
je sve što se može uraditi sa strukturom kao cjelinom.
P rema
tome,
u vj etni izraz if ( r adnik == radn ik l ) j e pogrešan . Ostale op eracije nad struktu ram a obavljaju se preko članova str u ktu re .
P ri tom n e t reb a z aborav i t i d a se članovima strukture pristupa prek o struk
turn og toč.ka
e ra c ij a :
o pe rat or a .
Za il u s t r a cij u evo nekoliko pr av i ln o n apisanih op
if ( radn ik . redn i_broj > 1 0 0 ) radn ik . ime = " Marko � ; radnik . rodj endan . dan = 3 0 ;
8. 1 .4.
Polje struktura
Polje s t ruktura je p ogo d n o z a rad s velikim b roj em razli č.itih podataka
koji se mogu gr u pirati u str u k t ur e .
Primjer tog a je e v i d en c ija z ap osl e n ih r ad n i ka deklarira se struktura ( zapis ) koja sadrži sve neophodne p o d at k e o rad nik u , a za sve radnike p o duz e ća može se defi nirati polje struktura. Z api su o po je din o m r ad ni ku p r i s tu p a se prek o iudek<�a p ol j a. N a primjer, radnika jednog pod uzeća. Za s vakog
194
Slože n iji tipovi podataka 1* deklaraci j a s trukture s tru ct zap o s l e n i
{
};
int int char char char struct
*1
godina_staza ; s t ru cna_ s pr ema ; ime [ 1 5] ; pr ez ime [ 1 5] ; adre s a [30] ; datum datum_rodj enj a ;
Definicijom s truct zapo sleni radnik [ 1 00] ;
d efinira se polje struktura radnik tipa z ap o s l en i . Iz n aved enog proizl azi d a se definicija polj a struk t ura ne r azli kuje od deklaracije ostali h polja. Indeksi
p olj a struktu ra počinju , kao i kod ostalih polja, od nule. Polje struktura može se ini cijalizi rati u p o s eb n oj funkciji ili II tok u d efi n i c ije p olja. Na primjer,
struct zapo sleni radnik [ 1 00]
{
{ 2 1 , i , " Iv o " , " I v i c " , " S . Radica 1 2 " , 12 , 2 , 1 965} . { i , 3 . " P ero " , " P er i c " , " I l i c a 5 5 " , 1 3 , 5 , 1 945} ,
}; Vi ti časte zagrad e koje odjeljuju pojedin e zapise nisu neophodne, medu t i m , povećavaju pregled n ost programa. Ako s e polje kojem nije zadana d imen z ija ini cijalizira u toku definicije , autom atski će mu se do dijeliti dimenzij a. D aH'" prva li nija u d efinicij i polja radn i k može se pisati kao
zapo s l eni radnik [ ] struct { { 2 1 , l , " I v o " , " I v i c " , " S . Rad i c a 1 2 " , 1 2 , 2 , 1 965} , { l , 3 , " P e ro , " P e r i e " , " I l ica 5 5 " , 1 3 , 5 , 1 945} . "
}; što ČP,
polju
struktura pridru žiti
m en at a p olja. strukture.
dimenzij u
koja. ovisi o broju zad anih
ele
1 95
B. 1 . Struktu re Polje s t ru k t u ra z apisano
je
m o ž e p rikaz a t i kao
u m em o rij i sekven cij aln o , š t o se slikovito
godina_s t az a s t r u e n aJiprem a ime prezime adresa
r ad lli k [ O ]
d an m j esec
godi n a
godin aJi t az a . s t ru Cn aJi IHem a Ilne
prez i m e adresa
rad nik [99]
d an mjesec •
godin a
Za ilu s traciju n av e d e n og riješit ćemo jed an jednost avan z ad a t ak . Pot rebno program koj i omogu ćuje unos i prikaz p o d a t aka o z ap osleni m
j e n api sat i
radnicima.
1*
p r o g r am z a e v idenc i j u zapo s l enih radn ika
# in c l u d e < s t d i o . h> # i n clude < c o n i o . h> # i n clude < s t r ing . h>
1*
d e k l ar a c i j a s t rukt ura
*1
*1
Slože niji tipovi poda taka
1 96
struct datum
{
int int int
}i struct
{
dan i mj e s e c i god ina i zaposleni
int int char char char s truct
god ina_staza i strucna_sprema ; ime [ 1 5] ; prez ime [ 1 5] ; adr e s a [30] ; datum rodj endan ;
}; struct zaposleni radn ik [50] i int broj _radnika ;
v o id vo id v o id int char
/. ' def in ic ij a polj a . /
/. prot ot ip i pomocnih f unk c ij a ./ uno s_podat aka ( v o id) i ispis _podataka ( v o id ) i nastavak ( v o id ) i menu ( v o id ) ; .get _string ( v o id ) ;
v o id main ( v o id)
{
int izbor ; broj _radnika vh ile
{
=
-1 ;
« izbor = menu ( »
! = O)
svitch ( izbor ) { c as e
1:
unos _ podat aka ( ) ; nastavak O :
break : c as e 2 : ispis _podataka ( ) i nast avak O ; break ;
}
}
}
1 97
B. l . SLrukture */
/* izbor operac 1J e i n t menu ( vo id) {
izbor ; int clrs cr ( ) ; j* obr i s i zaslon */ print! ( " \n Izbor operac ij a : : " ) ; printf ( " \n =================== = " ) ; printf ( " \n 1 . Uno s podat aka ") ; pr intf ( " \n 2 . Ispis une s enih podat aka printf ( " \n 3 . Kraj . . ); s canf ( "%d " , t izbor) ; swit ch ( izbor ) .
{
}
It
II
);
cas e 1 : return ( 1 ) ; cas e 2 : return ( 2 ) ; default : r eturn (O);
}
/* i s p i s unes enih podataka */ v o id i s p i s _podataka ( ) {
int i ; if (broj _radn ika < O)
{
pr intf ( " \n R ema podataka o zapo s lenim radn i c ima return ;
}
printf ( " \n Podac i o zaposl enim radni cima : : " ) ; pr intf ( " \n======= =""========================= " ) ; for ( i = O; i <= broj _radn ika ; i + + )
{
pr intf ( " \n ) ; , printf ( " \n Ime i prez ime radnika : %s % a lO radnik [i] . ime , radn ik [i] . prezime ) ; pr intf ( " \n S ifra strucne spreme : %d" , radnik [ i] . strucna_ sprema) ; printf ( "\n Adresa st anovanj a : %s " , radn ik [i] . adresa) ; printf ( " \n God ina staza : %d" , radn ik [i] . god ina_staza) ; pr intf ( " \n Datum rodj enj a : %d . %d . Yod . " , II
II
)
;
Složen iji t ipovi poda taka
1 98
}
radn ik [ i J . rodj endan . dan , radn i k [ i J . rodj endan . mj e s e c , radn ik [ iJ . rodj endan . g o d ina ) ;
}
/* unos p odat ak a * / v o i d uno s _podat aka ( )
{
}
bro j _radnika ++ ; printf ( " \n Uno s p o d at aka o novom radn iku : : " ) ; printf ( " \n= = = = = = = = :: = = = = = = = = = = = = = = = = =========\n " ) ; : ") ; printf ( " Ime radn ika s t r cp y ( radn ik [broj _radnikaJ . ime , g et _ s t r ing ( ) ) ; : ") ; printf C " \nPrez ime radn ika s t r cp y C radn ik [br o j _radnikaJ . pr e z ime , g e t _ s tr i ng C ) ) ; printf C " \nAdr e s a s t an o v an j a . : ") ; s t r cp y C radn ik [bro j _radnikaJ . adr e s a , g e t _ str ing C ) ) ; : ") ; printf ( " \nS ifra s t rucne spreme s c anf ( " %d" , &radn ik [br o j _radnikaJ . st rucna_sprema) ; printf ( " \nGodina s t az a : ") ; s c anf ( " %d " , .tradni k [bro j _radn ikaJ . god ina_ s t az a ) ; printf ( " \nD an mj e s e c i godina rodj enj a : " ) ; s canf ( " %d %d %d" , .tradn ik [broj _radn ika] . rodj endan . dan , .tradnik [br oj _radn ikaJ . rodj endan . mj e s ec , .tradn ik [br o j _radn ikaJ . rodj endan . godina) ;
/ * u c i t avanj e niza znak o v a s t a s t ature * / char * g e t _ s tr ing ( )
{
int char
/* maks imalan broj u c i t an ih znak o v a * /
max ;
ch ;
s t at ic char max
=
s t r ing [80J ;
O;
f or ( ; ; )
{
ch ,;, g e t ch e O ; ( ch ' \r '
if
{ }
��
I I max > 7 9 ) / * ' \ n '
pot vrda uno s a
str ing [maxJ = ' \0 ' ; ret urn ( s t r ing) ; /* vrat i pokaz i v ac na s t r ing */
*/
199
8.1. Strukture
string[max] max ++;
}
=
ch;
}
v oid nastavak ( )
{ printt ("\n\n Za nastavak pritisnuti bilo koju tipku get ch O;
.... II);
}
Funkcija strcpy O preslikava uneseni niz zn akova ( string ) 11 pojedine članove strukture. Za unos podataka može se koristiti i standardna funkcija za unos scanf O. Form at za unosa niza znakova je Yes.
8.1.5. Pokazivači na strukture
Osnovna idej a pokazivača na strukture ne razlikuje se od pokazivača n a osn ov ne tipove podataka. Međutim , zbog građe strukture postoje odre(tene specifičnosti. Pogledajmo strukturu datum, koja je deklarirana n a početku poglavlja o strukturama: struct
datum
{ int int int
dan; mj esec; godina;
};
Deklaracija pokazivača n a strukturu tipa datum je : struct datum *pdatum;
Ne treba zaborav iti da sve pokazivačke varijable zauzimaju isti prostor u memoriji. Me(tutim , objekti na koje pokazuju različitih su veličina. Zbog toga se 11 d eklaraciji pokazivačke varijable uvijek mora n avesti tip objekta na koji ona pokazuje. Prem a tome, deklaracija pokazivača na strukturu
Složeniji tipovi podataka
200 struct
*pdatum;
je pogrešna. Svakom
.
se pokazi va ču prije korištenja mora pridru žit i
adresa. Pridru
.
ž i vanj e adrese može b iti dinamičko ili statičko Dinamičko pridruživanje adr e se znači da se p ok azivač u pridružuje ad r e s a ob j ek ta u memoriji koji
može, ali i ne
m ora postojati u memoriji
cije lo vrijem e iz v r š avanja fun k cije
ili programa. St at ičko pridruživanje adrese znači da se p oka zi vač u pridru žu je a d r esa ob jek t a koji je trajno zapi san u m emorij i tokom izvršavanja
funkcije ili programa. O dinamičkom pridr uži vanju a
=
{ 30, 40, 1964 };
Naredbom pdatum
=
�adatum;
pokazivaču pdatum p ri d ru ž uj e se adresu na kojoj je zapi sana str uk tur na var i jabl a adatum, što se slikovito može prikazati ovako:
pdatum
dan
30
mjesec
4
godina
1964
)
adatum
.
Clanovima strukturne varijable na koj u pokazuje p okaz i va č pdatum može se pristupiti na dva načina. P r v i način je isti kao kod ostalih p okazi vača Dakle, korištenjem unarnog op e r atora *. Budući da se radi o struktnri, za pristup pojedinom č.lanu strukturne varijabl e koristi se točka operator. Naredbom printf
("\n Dan
Y.d", (*pdatum) .dan);
B.I. Strnkture
201
ispisat će s e vrij ednost člana dan strukturne varijable na k oj u pokazu je p okaz i va č ka v a r ijahl a pdatum. Vrij ed nost tog člana je 30. Budući da točka operator . ima veći pr ioritet od * operatora, zag rade su neophodne. Drugi način pristupa članovima strukturne varijable na ko ju p okazuje po k az iv ač pdatum obavlja se korištenjem o pe ratora - > , 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, ll<' odražavaju na promjenu vrijednosti članova st ru kttl me varijable nadrc(tene funkcije. A rgu m enti pozvane funkcije moraju odgovarati tipu varijable
(call by value).
se sve pro 1 l J je ne
prenesenih po d ata ka .
1* pr imj er prij e n o s a strukturn e v ar ij ab l e u f unk cij u 1* prij enos odredj e nih clanova s t rukt ure
*1 *1
main ( )
{
v o i d i s pis i _dan_rodj enj a ( int, int, int ) ; s truct
{
int int int } rod ;
dan ; mj e s ec; godina;
rod .dan :: 30; rod . mj e s e c :: 4; rod . godina = 1964;
}
ispisi_dan_rodjenja (rod . dan , rod.mjesec, rod.godina) ;
1*
ispis
datuma rodjenja *1
void ispisi_dan_rodjenj a ( int d, int m, int g)
{
}
printf ( "\n Rodj endan j e %d. %d. %d " , d, m, g ) ;
8.1.
8lruklu1'e
U navedenom primjeru može se vidjeti da se struk t urn a varijabla u funkciju prenosi tako da se prenese vrijednost svakog pojedi n og člana. Argumenti f1lnkcije moraju o dg ovarat i t ipu pojedinih članova stru kt urn e varijable. Da bi se i zb j e glo n a b r ajanje svih čl anova , programski j ezi k e dozvoljava prijenos kom pl etn e strukturne varijable. 1* pr1mJer pr1Jenosa strukturne varijable u funkciju *1 *1 1* prijenos kompletne strukturne varijable main () { struct { int int int } rod;
dan; mjesec; godina;
rod.dan 30; rOd.mjesec 4; rod.godina 1964; ispisi_dan_rodjenja (rod); =
=
=
} 1* ispis datuma rodjenja *1
struct { int int int l' datum;
d; m; g;
{ printf ("Rodjendan je %d. %d. %d", datum.d, datum.m, datum.g);
} Argument fun k cij e
datum,
mo ra se
d ek lari rati kao struktura koja i m a i stu Budući da se podaci prenose pre ko vrijednosti, v r ijed n osti članova prenesene stru kt ur ne varij able pridru žuju se članovima lokalne strukturne varijab le definirane II funk c iji ispisL _dan_rodj enj a(). Ako bi deklaracije struktura u funkcijama bile različite, v rije d n ost i koje bi poprimili članovi strukturne varijab l e u pozvanoj funkciji ne bi o d gov a ra li prenesenim v rij ed n osti m a. gra
204
Složeniji tipovi podataka Ko(l spomenutih načina prijenosa
sve
v rijednosti pojedinih članova pre
nose se preko stoga. B11duć.i da svaki prijenos preko stoga zahtijeva operacije stavLna_stog (push) i skinLsa-stoga (pop), prijenos strukturnih varija hli s velikim brojem članova može smanjiti efikasnost programa. Osim toga, prijenos strukturnih varijahli preko vrijednosti treba izbjegavati kod poziva funkcija II više razina i kod rekurzija, jer se može desiti greška prekorač.enja dozvoljene veličine stoga
(stack
ot,crfiow .
)
N avedeni nedostaci mogu se izbjeći prijenosom pokazivača na struk
turnu varijablu. Prijenosom pokazivača, prenosi sa samo adresa strukturne varijable u memoriji. Argument funkcije mora se deklarirati kao pokazivač na stl'uktll1'U koja ima istu gra(tu kao prenesena strukturna varijabla. Da bi izbjegli deklaraciju strukture kao argumenta illnkcije , dohro je deklaraciju struktl11'e ohaviti i zvan svih funkcija.
/* primjer prijenosa strukture preko adrese */ /* -- prijenos pokazivaca na strukturu -- */ /* deklaracija strukture */ struct datum
{
};
int int int
dan; mjesec; godina;
main ( )
{
void korekcija (struct datum *); struct datum rodjendan;
/* pod aci o r odjend anu */ rodjendan.dan = 30; rodjendan.mjesec = 4; rodjendan.godina = 1964; pr int! ("\n P odac i prije korekcije : Y.d. Y.d. Y.d.... rodj endan. d an . rOdjendan.mjesec. rodjendan.godina); k orek c ija ( tr od j e ndan );
print! {"\n Podaci poslije korekcije rodjendan.dan.
Y.d. Y.d. Y.d . ...
B.l. Str'Ui.:ht7'e
205
rodjendan.mjes e c, rodjendan.godina);
} /* f u nkci j a za korekciju podataka o r odj e nd anu */ void korekcija (struct datum *novi_datum) { novi_datum->dan = 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 osloba
SamoreferentnI' strukture pogodn e su za povezivanje niza struktura u logičke cjeline promjenjive d u lj in e , odnosno stvaranje povezanih lista. Prethodni primjer proširit ćemo tako da se evidencija o datumu ro(tenja
vodi za n e k o li ko osoba. Samoreferentna
struk tu ra datum se u tom slučaju
deklarira kao: struct
datum
{ int dan j int mjesecj int godina j struct datum *sljedecij
};
Sve va rij abl e tipa struct datum sadrže četiri č.lana. Prva tri člana struk ture predstavljaju p o d at k ov ni dio strukture, a četvrti član s t rukture pred stavlja pokazivač na slje deć u strukturu II memoriji. Pokazivač služi kao veza izme
p o d atk ovn i' dio
pokazivač
Pokazivač. sIj ede ci može sadržavati adresu sljedeće strukture tipa datum ili specijalnu vrijednost NULL (NULL pokazivač ) . NULL pokazivač obično je definiran u stdio.h kao simholička konstanta vrijednosti O . Koristi se za označavanje samoreferentne strukture koja ne sadrži pokazivač ni na jednu strukturu i najčešće služi kao oznaka k raj a povezane liste. Prema tome, pokaziva{�u zadnjeg el eme nta liste u vij e k se pr i dru žuje vrijednost NULL. P ov ez an a li s ta koja će se pri kaz ati u nar e dno m p rimj eru s ast oji se od tri ele m en t a . Deklaracija elemenata povezane liste je: struct datum
x1, x2,
x3;
212
Složeniji tipovi podataka
Elemet x3 je zadnji u listi i mora mu se pridružiti oznaka k raj a liste
x3. sljedeci = (struct datum *) fULL;
Budući d a
je NULL defi n i ran
#define
NULL
gornji izraz može se pisati
kao:
O
kao:
x3.s1jedeci = O;
Formiranje liste
Stvaranje povezane liste po či nje zadavanjem
vrijednosti
liste.
xl. dan = 30; x1.mjesec = 4, xl.godina = 1964;
j * kraj liste *j xl.s1jedeci = (struct Lista tl memoriji nakon prvog
datum *) IULL;
koraka izgleda ovako 30
4 1964 NULL
Dodavanje
elementa X2 na kraj
x2.dan = 1;
x2.mjesec
x2.godina
= =
S;
1964;
liste
prvom
elementu
213
8.1. Strukture 1* povezivanj e prvog x1. sljedeci = tX2j
elementa liste sa narednim elementom *1
1* kraj liste *1 x2.sljedeci = (struct datum *) IULLj Lista u me m oriji nakon dodavanja elementa x2 izgl ed a
dan
30
mjesec
4
godina
1964
X1
sljedeci X2
.r--r-
1
dan
5
mjesec
1964
godina
NULL
sljedeci
Postupak se može nastaviti dodavanjem niza elemenata na k r aj liste ili liste izmectu postojećih elementa.
uhacivanjem elem en ata
1* formiranj e jednostavne povezan e li ste *1 1* deklaracija samoreferentne st rukture *1 struct datum { int dan; int mjesec; int godi naj st ruct dat um *slj edeci; }; 1* prikaz povezane liste *1 main C) { st ati c struct dat um x1, x2, x3; 1* formiranj e liste *1 1* prvi element *1 x1.dan = 30;
214
Složeniji tipovi podataka xl.mjesec = 4 ; xl.godina = 1964; xl.sljedeci
=
(struct datum *) NULL;
1* kraj liste *1
1* prosirivanje liste *1 x2.dan
=
1;
x2.mjesec
=
x2.godina
=
S;
1964;
1* prethodni element xl pokazuje na novi element x2 *1 xl.sljedeci
=
tx2;
x2.sljedeci
=
(struct datum *) NULL;
1* kraj liste *1
1* ubacivanje novog clana u listu *1 x3.dan = 29; x3.mjesec = 4;
x3.godina
=
1964;
1* element x3 se ubacuju izmeđju elementa xl i x2 *1 x3.sljedeci xl.s1jedeci
= =
xl.sljedeci; tx3;
1* ispis liste *1 printf ("\n Prvi element liste: Y.d Y.d Y.d", x1.dan, xl.mjesec, xl.godina);
1* ispis ostalih elemenata liste preko prvog clana *1 1* drugi element liste *1 print! ("\n Drugi element liste: Y.d Y.d Y.d", xl.s1jedeci->dan, 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, osloba
gornjeg primjera ostvarilo hi se sa
218
Složeniji t ipovi podataka
free«int *) i) ;
Za efikasno kor ištenje m e morije svaki poziv funkcije mallocO zahti jeva negdje u programu i poziv funkcije freeO. Međutim , poziv fu n kcij e freeO, p r i j e zauzimanj a memorije može prouzročiti nepredvidivi završetak program a .
.Jedn a od čestih grešaka j e da se zaboravlja da funkcije mallocO i re allocO vraćaju pokazivač i da se n a lijevoj strani izraza mora pojaviti pokazivačka var ijabl a. Izraz i
=
(int *) malloc (sizeof (int) ) ;
uzrokuje grešku ako j e varijabla i deklarirana kao int
i·
I
a ne kao int
*i;
Pokazivač kojeg v r a ć a funkc ija mallocO u v ije k bi prije korištenja trebalo i s pi tati Ko r iš tenje pokazivača koji ima O (NULL) v r ij e dn ost skoro uvijek izaziva pad sistema. .
Prototipovi navedenih funkcija nalaze se u dat ot ec i aHoc.h. Njihovo korištenj e II stvaranju dinamičkih st r u k tu ra podataka prikazano je u naredna dva poglavlja.
8.2.2. Liste Jed nost ruko povezane liste predstavljaju n ajjednostav niji oblik dinamič struktura podataka. Elementi li ste povezani su sekvencijalno. Osnovne operadje nad jednostruko povezanim listama su: kih
stvaranje liste dodav a nj e novih elemenata u listu
219
8.2. Dinamičke .strukture podataka
hrisanje elemen at a i z liste pretraživanje liste ispis sad rž aj a pojedinih elemenata ili cjelokupne liste. Dodavanjp novih elemenata u listu p o dr az u m ije v a i p ove z ivanje dviju lista. Osnovne operacije nad jednostruko povezani m listama objasnit ćemo kroz nekoliko n arednih primjera. Kao osnovni element liste iskoristit ć.e se deklarirana struktura datum.
Stvaranje liste 1* definicija pokazivaca na kraj liste *1 #define KRAJ_LISTE (struct datum *) O 1* deklaracija strukture *1 struct datum
{
};
int dan; int mjesec; int godina; struct datum
*sljedeci;
1* pokazivac na prvi element liste *1 struct datum *start;
*1 1* stvaranje povezane liste 1* funkcija vraca pokazivac na prvi element liste *1 struct
{
datum
*kreiraj.listu()
struct
datum
*pocetak_liste, *kraj_liste, *novi_element;
char int
ch; d, m, g;
1* inicijalizacija liste *1 pocetak_liste = KRAJ_LISTE; 1* stvaranje liste *1 printf ("\n Unesite podatke o datumu rodjenja : ); printf (tI\n ===================================" ) ; ch = 'd'; "
220
Složeniji tipovi podataka
whil e (ch ! ='n'
tt
ch!='.' )
{ 1* zauz imanj e m em orij e za novi elem ent li s t e *1 nov i_ e l em ent = (struct datum *) mall oc(sizeof(struct datum»; 1* da li postoji dovolj no m emor ij e *1 if (n ovi_elem ent == NULL )
{ pr intf ("N ema dovoljno m em orij e ...... ) ; ex it (1);
} 1* ucitavanje no vih podataka *1 pr int! (" \n\n Dan ") ; scanf ("Yod",td ) ; pr intf ( " Mj e s ec "); scanf ("Yod",tm ) ; pr intf ( .. Godin a : .. ) ; scanf ("Yod",tg) ; n o v i_ e l ement->dan = 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
hl rf' p olja h i t ova, imeO , .. . . . , imeN , m ogu se d eklarirat i s am o kao int ,
un s igned , ili s igned . A ko je b roj _bitova o d r Nt e n o g člana jedan ( 1) , on se mora dekl ari rati kao unsigned .
Nai m e , jedan
b i t n e može i mati predz n ak .
N a p ri mjer , s t ruct t ipka { uns igned : 4 ; uns i gned s crol_lock_on un s igned num_lo ck_on uns igned caps _on uns igned ins ert_on ' uns igned : 8 ; }; dek l arira s t r u k turu polj a bitova
1; 1; 1; 1;
tipka. Iz raz o m ,
s h'uet t ipka pri tislluta_tipka;
d e fi n i ra se stru k t u r n a varij a b la prit isnut a_t ipka koj a se s as t oj i od šest
polj a bi to va . Polj a h i t ova su r a z l i č i t e d uljin e , št o je pril ago (ten o p o t reb am a p rogram a. Poj e di n o m p olju bi tova pristupa se n a p otp un o isti način kao i članovima strukture. N a pri mj er ,
Složeniji tipovi podataka ili
pl'itislluta_tipka.caps _oll pl'itisllllta_tipka.inser t ..on
M ogu ćnost korištenja po1ja bitova može se prikazati kratkim programom koji ispisuje n aziv pritisnute tip ke na tastaturi. U programu se koristi poziv funkcije bioskeyO , čiji se prototip nalazi u d a t o t e ci bios . h . Funkcij a bioskeyO vraća cjelohrojn u vrijednos t , koja sadrži i nformaciju o statusu t as t at u re . 1* primj er kor i s t enj a pol j a bitova *1 # in clud e # in clud e <stdio . h> main ( ) { struct t ipka *pr it isnut a_t ipka ; int s t atus , a ;
status = bioskey ( 2 ) ; pri t i s nuta_t ipka = ( struct t ipka * ) tst atus ; if ( pr i t is nuta_t ipka->num_lock_on == 1) printf ( " NUM LOCK " ) ; if ( prit i snuta_t ipka->scroll_lock_on == 1 ) printf ( I I SCROL LOCK " ) ; if ( pr i t isnuta_t ipka- > caps_on == 1 ) pr intf ( I I CAPS LOCK " ) ; if ( pr i t i s nuta_t ipka-> ins ert_on == 1 ) print! ( " !lSERT II ) ;
}
Izvršavanjem program a, ako
su pri ti snu te tipke INSERT
i
N umLock ,
na
z asl olI u raču n al a će se ispisati : NUM LOCK
INSERT
U navedenom primjeru d efini ran je pokazivač na strukturu koj a se sastoji od polja hitova. Z h og toga se pojedinim p olji m a bit ova , članovima strukture, pristupa korištenjem operatora
->.
Pojedini hi tovi ili grupa bi tova, koja
nosi z a n as nezanimljivu informa bitova unut ar strukture ne imenuje. S tru kturna varijabla pritisnuta_tipka m ože se slikovito prikaz at i kao
ciju , mogu se zaobići t ako d a se polj e
8. 4. U7Iije
237
'---'-----'----'----'------
neiskorišteni hitovi SC RO L L LOCK N U M LOC K CA PS LOCK I N S ERT
S trukturne varijahle koje se definiraju kao polje bitova imaju odre
Unij e
8.4.
Unije s u varijahle koje u razli čitim dijelovima programa mogu sadr žavati različite tipove podataka. Promatrano sa stajališta memorije unija pred stavlja isti dio memorije koji se koristi za zapis nekoliko različit ih tipova podataka. Deklaracija unije slična je deklaraciji strukture:
ullioll test-unija {
iut float char
i; f;
chj
}j
Definicijom varijable,
zauzima se m em o rijski prostor koji je dovoljan za zapis najd uljeg podatka unije. Varijabl a se može definirati kao unija i u p ostupku deklaracije. Na primjer,
2:38
Slože n iji t ipovi poda t aka
union
{
t e st_unij a
int i; f •' f l o at ch ; char } int_ilo_ch ; S v i članovi defini rane u n ije dijele i s t i m emorijski prostor , što se slikovito može prikaza t i ovako f
r
baj t O
bajt
1
bajt
'-v-" ch �------�v--� i
2
b ajt 3
Zbog toga će se p r i d ru živanjem vrijednost i b ilo kojem članu unije promi jen i t i i v rij ednost svih os talih čl anova. Pojedinim čl anovi ma unije pris t u p a s e potpuno i s to kao i član ovima s t r u k t u re , odnosno članovima polja bi tova. Dakle , d i rek tan pristu p čl anovi m a unije os t varuje se korištenjem točka oper atora, dok se p ri s t u p čl anov ima u nije p reko pokaz i vača os t varuje kori štenjem operatora >. -
Dozvoljene operacije nad lI nijam a i dentične su operacijama n ad struk turam a . U n ije se mogu pojav i t i i kao članovi dru gih struktu ra. Na p rimjer, s h'uet
{
t e s t ...s t l'uk tul'a
iut
ehal'
l ',
* s tring ;
11l1lOll
{
} Varijabli
}
iut
jj
float
fj
cbar
cb;
ll ;
tcsLprimjcl';
j struk t u re tesLprimjer
tesLpl'imjcl'.u.j
=
pristupa se na slijed eći nači n :
20;
čim e joj se prid ru žuje vrijed nost
20.
8. 5. En u m e rira n i t ipovi poda t a k a
239
8. 5 . Enumerirani t ip ovi p o d at aka Enu m erirani t i p p o d a t a ka predstavlja list u simbola koji se definirajn kao jed n od i m en zi o n al n o p olje . Položaj s i m b ol a unu t ar liste ( p olj a) o dre(tuje nj ego v u numeri čku v rije d n o s t . Definicija en u me r i r an og tip p o d a t aka može se p o ve z a t i s d efinicijom s i m b o li čkih k o n st an t i , ko j e se defini raj u p r e p ro ce sorskolll n ar e d b o m # defi ne. M e(tu t i m , preprocesorskom n ared bom defini ran a kon stanta može b i t i bilo kojeg tipa, dok se enumeri ranim tipom po d a t k a definiraju isklju čivo cj elohroj n e k o n s t an t e . D e fi n i c ij a ennm eriran og tipa s li čn a je d efi n i c ij i strukture. O pći oblik defi n i c ije enum eriranog tipa gl asi :
('llUlU llosač { I d e n t i fi kator nosač,
li s t a...s i mb ola } ime_varijable;
koji se zad aje
(gra(ti) defini ranog tipa,
iza klj u čn e riječi e n u m , sadrži p o d a t ak o
imenu i v r ije d n o s t i si mbol a u lis t i � i m b ola . Značenje ost alih p olj a u d efiniciji enumeri ran og tipa n ajje d n o s tav n ij e s e m o že o b j as n i ti na n ar ed n o m primjeru : stru k turi
enum
o d n o s n o p o d atke o b roj u ,
week
{ ponedj elj ak , utorak , sri j eda , cetvrtak , petak , subota , nedj elj a } dan_u_tj ednu ;
Varijabl a dan_u_tj ednu d efiniran a je kao enumeriran a var ij abl a i m o ž e joj se p ri d r u ž i ti bilo koj i simbol iz li s t e simb ola:
t i p a week
simholi d efi n i r an i II listLsimbola cj el ob ro j ne v r ije d n o s t i , p ro i varijabl i dan_u_ t j ednu može pridru žiti i bilo ko ja druga cjelo brojna v r ij e d n o st . Mectll tim , up o t r e b a enumeriranih tipova p ri d o n os i b oljoj pH'gl ed n os t i i raz u m lj i v o s ti i z v or n o g kod a program a. B u d u ći
da su
zlazi d a sc
S vaki s i m b o l u list Lsimbola , ponedj elj ak, ut orak, . . . , n edj elj a,
pre d s t a v lj a
j e d n u cj el o h r oj n u v r ij e d n o s t . B u d u ći da inicijalizacija eleme nata liste nije eksplicite n ave d e na , on a se au tomatski i z v r šava tako da prvi el e m en t u listi poprima v rijed n o s t 0, d r u g i 1 i t d . Prem a tome, v rij e d n os t i simbol a unu t ar liste_simb ola su:
240
Složen iji tipovi podataka
ponedj elj ak srij eda petak nedj elj a
=
=
=
O,
utorak 2 , c e t vrtak 4 , subota 6
= =
=
l,
3, 5,
Me(tu t im , ako simbol u ponedjeljak dodijelimo inicijalnu vrijednost 1 enum w e ek {ponedj elj ak = l , ut orak , srij eda , cet vrtak , pet ak , subot a , nedj elj a} t j edan ;
n aredba pr intf ( " \n % d % d % d %d %d %d %d" , ponedj e l j ak , utorak , srij eda , c et vrtak , petak , subota , nedj e l j a) ;
ispisat će n a z aslon račun ala: 1 , 2 , 3 , 4, 5, 6, 7. Dakle, II stu čaju eksplicitne illi cijal izacije bilo kojeg simbol a liste, svaki sljedeći simbol au tomatski p opri ma cjelohrojn u vrijed nost prethodnog simbola uvećanu z a jedan . To vrijedi sam o ako u postupku definicije lista simbol a nije drukčije inicijalizirana. Na primjer, enum week
{
ponedj elj ak = i , utorak = 10 , srij eda = i i , cet vrtak = 3 , petak = 2, subota = O , nedj elj a } t j edan ;
Simboli enumerirani h tipova podataka mogu izrazim a. Vrijednost varij able n akon izraza i
=
9
+
pojaviti
u
18
aritmetičkim
ponedj elj ak ;
j e 1 0 . Mectu t i m , simboli s e toga će n aredba
ponedj elj ak
prou zročit i grešk u .
se
=
=
ne
10;
mogu pojaviti n a lijevoj strani izraza. Zbog
Definiranje vlastitih tipova poda taka
8. 6.
8.6.
24 1
Definiranje vlastit ih tipova
P r o gr am s k i jezik
e omog u ćuj e
d efi n i r anje
p o d at aka vlastitih tipova pod ataka.
Vlas t i t i tipovi p o d ataka d efiniraj u se kori štenjem klju čne riječi typedef. Tako defini rani tip ne predstavlja novi tip po d at aka . On ustvari p re d st av lja
sam o n ovo ime
već postojećih
t i p o va
p od a t aka . Opći oblik naredbe typ e
def glas i :
typf!def tip ime; Tip pr e d s t av lj a hilo koj i d efi ni r ani tip p o d at aka . N a pri mj er , int , float , d o u ble, struct i sl . Ime pred stavlja novo ime definiranog t ipa p o d at ka . Novo i m e koje s e d o dj elj uje p re d s tav lj a dodatak, a ne zamjenu pos tojf'ćem i m enu t i p a ]l o d atka . N ared b o m t ypedef
int
cj e lobroj n i :
se prevodiocu d a će sve varij able k oj e se d eklariraju kao cjelob roj ni b i t i t i p a i nt . Drugim rij e č im a , ako se u programu neke varijable hoće deklari rati kao int, to se m o ž e uradi ti n a d va n ačin a. Prvi n ačin je
kaže
int
x ,
y,
z:
koj i s m o već d o sad kori s t ili . D r u gi n ačin je
cj elobroj n i
x,
y,
is kor i s ti vlastiti tip
ti p ov� podat aka got ovo d a se i n e i s p l at i kod os M e
D efiniranje vlas t itih
koje
se
z;
novnih t i p ova }lod at aka.
lj aj u
da
na i m en ovani objek t :
t ypedef s t ruct zap i s { ime [20] ; ehar ehar prezime [20] ; adr e s a [30] ; ehar int stupanj ; } POLAZlHK ;
242
Slože n iji t ipovi podat aka
d efini ra novo ime za strukturu n avedenog oblika. N ared bom , POLAZNIK
br_polaznika [ 1 00] ;
d efinira se polje struktura br _po l azn ika koje se sastoji od 1 00 elem e n ata. Svaki element polja pred stavlja strukturu koja ima navedeni obli k . Pokazi vač na zadanu strukturu deklarira s e naredbom: POLAZNIK
*br_polazn ika ;
I m en a vlastitih t i pova pod at aka ohično se zadaj u velikim slovima kako hi se razlikoval a od ostalih varijabli i stan d ardnih t ipova podataka. Postoje d va osn ov n a razloga za definiranje vl astitih tipova podataka.
Prvi , da bi se povećala p renosivost p rogram a. N aime, typedef se koristi
za
d efi ni ranje onih tipova podat aka koj i su ovisni o konkretnoj implementacij i . Za prijenos program a n a d rugu implementacij u d ovoljno j e sam o p romi jenit i typedef. D ru gi je razlog što d efiniranjem vlas t i t ih tipova lJOdataka doku m en t acija program a postaje preglednija. Ako su imen a vlastitih tipova pod at aka zadana asocijat ivno, mnogo je jednostavnije zaklju čiti čemu je odrNteni tip podataka n amijenjen .
8.7.
Pretvaranj e tipova podataka (casting)
O peran di ari t m etičkib izraz a m ogu hiti razl i čitog tipa. P ravila za pret varanje ( konverziju ) podataka odre
=
x
* y
-
z;
gdje s u varijable deklarirane kao int x ; f loat j j doubl e Z j
8. 7.
je
(casting)
Pre tvara nje l ipova poda taka
doubl e .
243
om ogu ćuje da se ekspli cite n aved e žel i . To se postiže upotrebom cast c a s t operatora je:
M e
t i p p o d at k a o p eran d a ili rezu l t a t a k o j i se
o p e r a t o ra O . O p ć i oblik n avo
( tip _podatka) operandi gdje z ag r a d e O p red s t avlj aj u
cast
o pe r at o r . Tip _po dat ka m o ž e biti
bilo
varijabla ili arit m e t i čki izraz . Cast izraza ili i s p red po j ed i n i h varij abl i . Ako se operator n avede ispred izraza, t ad a s e rez u l t at izraz a pre t va ra 1 1 zadani tip p o d atka. U slu čaju da se o p e r a tor n al az i isp red varij ahl e , t a d a se s a m o ta varijabla p re t vara u zad ani t i p p o
i
m ože se n al a z i t i i s p red ari t m e t i č.kih
t i p rC'zul t a t a l\,ri t m e t i čkog izraza j e p rem a pravili m a z a kon verzij u t i p ova p o d at aka. doubl e . A ko h o ćemo da t i p rezul t a t a b u d e int , t ad a se isp red i z ra.z a m o r a p o j av i t i cast operator:
rez
( int)
=
x
* Y - Zj
Vl\,rij l\,bla z 11 n aved en om izrazu je t i p a raČlI n at i
doub l e .
Ako j e u izrazu n eo p h o d n o
njenom cj eloh roj n om vrijednošću , t ad a se
s
on a
m o r a p retvori t i u
cjelo b rojni t i p :
rez
Cast
=
oper a t o r se v e om a čes t o kori s t i II p o z i v u
raČ.1ll1 a d nrgi
su
* y - (int) Z j
x
korijen ,
v r ijed n o s t i
s
q
Funk cij a koj a
s rt O , oček uje arg u m en t t i p a double. M ectut im , ako
koj i m a se o p � r i r a
varij abli koje se p re n o se u funk c ij u
t i p . Pozi vom fu n k cij e
fun kcije.
s q rt O
p r ogram u t i p a int , t ad a se vrij e d n o s t i sq rt O m or aj u pre t vo r i t i u odgovaraj u ći
u
sqrt « doubl e ) i ) j s vaka će se v r ijed n os t k o j a se pr e n o s i u fu nk c ij u , bez o b z ira na t i p , prvo p re t v o ri t i u t i p d o u b le i kao t ak va će se k op ir at i II argu m e n t fu nkcij e sqrt O . Fu n kci j a se u tom s l u č aj u m o r a
244
Slože n iji tipovi podat aka
Sljedeći primjer korištenja cast operator a je u radu sa st rukturam a. S t ru ktura se kao cjel ina n e može pohraniti u d atoteku n a disku . Za po hr anj i vanje strukture u d atoteku moraju se p ohran i t i svi njeni članovi. To može biti prilično nepraktično, pogotovo u slu čaju kad se struktura sastoji od lllIlogO čl an ova Na primjer, .
1* pohranj ivanj e podat aka strukture
u
dat ot ekU * 1
# include < s t d i o . h> # include <stdl ib . h> 1* deklarac ij a struktur e * 1 s t ruct zapo sleni
{
char ime [ 1 5] ; char prez ime [ 1 5] ; char mj esto_stanovanj a ; int radn i _ s t az i
}
v o i d main ( vo id )
{
int i; char * ch ; s t at i c s t ruct zapo s l en i r adnik . radn ik 1 ; FILE
*tp ;
1* unos podataka o radn iku *1 : ") ; pr int! ( lI \n Une s ite ime r adn ika gets ( radn ik . im e ) ; ") ; print t ( " Une s i t e prez,ime radnika get s ( r adnik . prez ime ) ; printt ( lI \n Mj e s t o stanovanj a ") ; s canf ( lI %s " . radnik . mj e st o _ s t anovanj a ) ; : ") ; pr int f ( " \n God ina staza s c ant ( lI%d" . tradn ik . radn i _ s t az ) ; 1* ot vori dat ot eku PODACI . DAT za up i s podat aka * 1 it « tp = fopen ( " PODACI . DAT " , " w " » = = NULL )
{
}
printf ( lI \n Greska ot varanj a datot eke PODACI . DAT ") ; printf ( " \n\n Prekid programa . . . . . II ) ; exit ( O ) ;
8. 7.
Pretvaranje tipova podataka (casting)
245
1* upi s struktur e u dat ot eku *1 1 * up i s uj u se s amo clanovi koj i su nav edeni u pop i s u *1
f pr intf ( f p , " % s %s %8 %d" . radnik . ime . radnik . prez ime , radnik . grad , radnik . radn i _ staz ) ; f el o s e ( fp ) ;
1* zat v ori dat ot eku *1
1 * u e i t avanj e strukture iz dat ot eke *1 if «fp
{
=
f open ( " POOAC I . O AT " , " r " »
--
HULL)
pr inU ( " \n Dat ot eka PODAC I . DAT ne po s t oj i . pr int ! ( " \n\n Prekid programa . . . . . " ) ; exit ( O) ;
.
. .
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
261
10.2. Meilllspremnički sistem datoteka program
p o d ac i
r-------�I. L
p o d a ci _ _ _ ---- � � �_ d at o teka
__
m eđ u spremnik
(stream)
Slika 10.1. Prijenos podataka system)
II
međuspremničkom si st em u
datoteka (buffered file
program L-
Slika
�--------�IL.
p o d aci ___ _ _ _ _ _ ____
p o d a ci _ ___ � � d atoteka
__
�
__
10.2. Prijenos podataka u direktnom načinu prijenosa
(unbllffered file system )
U d irek tn om n ač inu pr ijenosa svak oj d atot eci se prist u p a prek o
deskrip
De skriptor datot eke je cjelobr oj n a k o n s t an t a koja se d o d jeljuje II postupku ot varanj a datotek e . S v e ul azno/izl azne operacij e o d vi
tom datoteke.
j aju se kori š te njem deskr i p t ora d atotek e
(file descriptor).
P rogramer m or a
obrat i t i p ažnju koj i deskr i p tor j e pridru žen k ojoj d at o teci.
U n eki m pro
gramskim jezi c i m a (F O RT RAN) , odre(teni desk ri p t or i sistemski su pridru ženi p ojedi n im d atotekama; na primjer, s t an d ardnom ulazu ili s t and ard n om izl azu . A ko se t akav deskr ip tor pridruži n ek oj dru goj dat oteci, sve operacije se pr eu smjeravajn . N a p rimjer, ako se ot vori d atotek a i pridruž i joj se deskr ipt or , k oj i je sistem sk i ·pridru žen standardnom izlazu, s vi p od aci koji se upisuju II t u d atoteku, ispisuju se na standar dni izl az (n ajčešće z asl on termi n ala ili račun al a). Upis p o d at aka u d atotek u, u d ire k t n om n ač inu prijenosa, obavlja se k o d već in e operat i v nih si s tem a u trenutku izvršat1anja bez obzir a na broj p o d at aka koj i se prenos i . To z n ač i d a se k o d
funkcije,
svak og p oz i va funkcije za u p i s p o d at aka u d atotek u ob avlja i pr ijenos p o dataka iZ me(tll program a i d atotek e . Ak o se niz z n ak ova duljine 60 zn akova prenosi u d atoteku z n ak po z n ak , to zah t ijeva 60 p oziva funk cije za pri jenos. Iz t oga se m ože z ak ljuči t i d a će direk t an n ačin p rijenosa, u n ek im sl učaje vi m a , u sp oriti izvršavanje ul azno/ i zl aznih operacija. D a b i objasnili m e(tuspremničk i sistem d atoteka, n eophodn o je r azluči t i poj m ove: datoteka
(file),
spremnik (buffer) i m eđuspremnik
(stream).
Pod
Ulaz i izlaz
262
poj mom datoteke u C- u podrazumijeva se bil o k oj i uređ aj koji im a m ogu ć nost razmjene podataka s program om . P rema tome, pojam d atoteke, koj i u većini progra m s k ih jezika pred s tavlja niz podataka zapisa n ih na disk u ili m agnetskoj traci , proširuje se na sve ula zno/i zlazne urectaj e . Dakle , i zaslon rač unala , i t asta t ura, i pa ral el n i , i serijsk i ulazi
(port)
i sl . smatraju se da
toteka m a . Spremnik (buffer) je p o d ručje II m emorij i u kojem se nalazi niz pod ataka k oji se prenose u datotek u , il i su proč i tan i i z dat otek e Raz mjena p o d ata ka izm eđ u progra ma i van jski h uređaja , da tot eka, obavlja se preko međuspremnika (stream). Svak oj d atoteci u koju se u p i suju, ili iz k oje se uč ita vaju p o d aci, mora se pridr u ži t i međ uspre m nik . Međ u sp r emn i k je struktura p o d at aka u m e morij i u kojoj su sa držani s vi neoph o dn i p o d aci o da toteci k ojoj je pridr u žen. M ož e se prom atra t i i kao l ogič ka prezent acij a .
da totek e. N ač i n u p i s a il i uč i tavanj a poda taka iz različ i t ih datotek a m ože bi ti ra zlič i t , m eđ u ti m n ač in upisa ili uč i t avanja poda taka i z svih m e (tusp remnika , bez obzira kojim su dat o tekam a pri d ru ženi , je isti . Zbog toga se i s t im m eh anizmom ( f u nk c ij am a ) kojim se p o d aci u p is uju u dat o tek u n a disk u obavlj a i isp is p o d at aka n a z asl on rač un ala. P ost oje d vije vrste međuspremika: tekstualni i b in arni . Pod aci u tek s tualnom m e(tu s p rem niku (text stream) su n izovi z nakova. Ni zovi zna kova o r gani z ira n i su u linije. N a k raju svake l i nije je ozn aka nove linije (newline
character) . O visno o d atot eci kojoj je međ usprem n ik pridr u žen , nova l i n (newline) uj edno znač i i p oz i cioni r anje na poč etak nove l inije ( carriage -return-linefeed). Prema tome, broj znakova u tek st u al nim m eđuspremni
ij a
c im a ne mora o dgovara t i br oju znakova za pis anim n a vanj skom u ređaju ( da toteci). Poda ci u b i n arn om
m
e(t u sprem n i k u
(binary streams)
su n izovi baj t ova .
B roj b aj t ova u bina rn om me(tu sprem niku jednak j e broju ba jt ova koji se upisuj e n a vanj ski ure(taj . Z b og toga pret varanje form at a p o da t aka m e
(tuspremnika u format p odata ka koji o d govara pri d rlIženoj d atoteci
nije
potrebno.
R azmje n a podataka i zm eđ u program a i da t o teka (vanj skih uređaj a) moguć a je sa m o ak o je datoteka otvorena. Operacij om o t vara nj a da tot eci se pridružuje m e(tnspr emn ik. Svaki m eđ u sprem n ik opisa n je kon t roln om s t ruk tur om t ipa FILE. S tr uk t u ra t ipa FILE dekl arirana je u da toteci stdio.h i nezna tn o s e razlikuje II pojedi n im impl em en t ac ijama C
-a. P o dac i k ontrol ne s t r u k t ur e t ipa FILE sadrž e i n forma cije n eoph od n e za ob avljanje svih ulazno/i zlaznih opera,. cij a: deskriptor dat oteke, pokaz i vač na
s p r em n i k (buffer) u koj i se u pis u j u I podaci prije pr ij enosa, vel iči n u sprem nika, karakteristike pojedi n e da to t e k e i sl . Da bi ti podaci bili dost upni , u sve ulazno/izlazne funkcije mora se prenijeti p od at ak o pridr u ženom među spremniku.
10.3. Standardne datoteke Pod aci i z
programa prenose se u
263 d atoteku t ako da
se
prvo
prenesu
u
me
' ftlush O i li pozivom funkcije koja zatvara da tot eku fcloseO. Veli č.i na spremnika je u v eći ni slučajeva jednaka veličini jednog bloka (.512 bajtova ) . Blok pred s t av lja osnovnu količinu podataka koja se p renosi izm e
pozivom
funkcij e
Kako je ANSI standardom defini ran samo me
10.3.
Standardne datoteke
otvaraju tri datoteke. To su: da toteka standardnog ulaza, datoteka standardnog izlaza i datoteka standardnih grešaka. Datoteka s tan da rd nog ulaza je najčeš će tastatura (konzola),. dok je datoteka s ta nda rd no g izlaza najčešće zaslon termin ala, odnosno rač,unala. U proc e su ot varanja s t and ardnih datoteka svakoj da toteci pri d ružuj e se odgovaraju ći me
postoje u svim sis t em i ma i zbog t oga je i z d vo j en niz ulazno/ izlazni h fu nkcija koje čitaju podatke sa standa rd n og ulaza, odnosno upisuju podat ke u dat ot eku s t anda rdno g izlaza i d at oteku s tan d ardni h g re ša ka . U na red ni m pogl avljim a p okazat će s e da se t e ist e fu nk ci je mogu ostvariti i korištenjem funkcija koje upis uju podat ke u korisni čki d efini ran e d at oteke, odnosno čitaju po dat ke i z kori s ni čk i defi ni ran ih da toteka. Stand ardne d atoteke
Ulaz i izlaz
264
Pokazi vač i n a kontrol n e s tr uktur e m eđ u spremnika pridr u ž en ih s t an d ar d nim d atotekama su glob aln e varijable i n ije ih p o trebno pren osit i u pozivim a st and ar d nih ltl azn o/izl aznih fu nkcij a. O s i m st an d ar d nih d atote ka T U R B O C ot vara i datoteke za u p i s i uči t avanje p o d at aka s a serij skog i p ar alel nog izlaza (port). Pokazivač i n a kon tr ol n e st ruk t u re me(tuspremnika t ih d at ot eka su: stdaux i stdprn. Bu d uć i d a n avede ne d at oteke n i su s t an d ar dn e za sve impl em ent acije, upis i č i t anje p o d at aka ohavlja se funkcij ama koje su namijenjene za upi s p o d at aka u korisni čki defi nir ane d at ot eke i č it anje p o d at aka iz korisnič.ki d efiniranih d a t ot eka.
10.4.
Standardne ulazno/izlazne funkcije
St an da rd n e ulazno/izlazne oper acije odn ose se n a oper acije č i t anj a s a st an d ard nog ulaza, o d n o s n o n a oper acij e i s p i s a podat aka n a stand ardni izlaz. Sta n d ard ni ula z i st an d ar d n i izlaz d efi ni rani su odr e(ten om i m pl e m ent acijom C-a. K o d ve ćine impl em ent acija pod st an d ardnim ulazom po drazumije va se t ast atura, a pod st an d ardnim izl azom zaslo n r ačunal a, o d nosn o terminala. M e(tut im , kao st an d ard n i ul az, odnosno izlaz , može se d efi ni rat i h ilo koj i ul azno / i zl azni ure(taj (dat ot eka). N ajje dnos tavn ije U /I op era cij e su u čit av anje jed n og zn aka s a st and ar d nog ulaza, odnosno i s p i s je dn og znak a na st an d ard ni izl az. N avedene op era cije ost varuju se poziv om getcharO i puteharO . Budu ći d a getcharO i puteharO oper iraju s jednim zn akom jed i n i u vjet k oji moraju zado volj i t i jest h rzin a i z vrš avanj a zadanih oper acij a . Z b og t oga se getcharO i
puteharO najčešće d efini raju kao maho naredbe. puteharO n al aze se u d atote ci stdio.h.
M ak ro d efi n i cije getcharO
i
N ač i n djelovan j a getcharO i
puteharO
m ož e se prikazat i je dnost avnim
p rogram om , koj i u čit ava zn akove sa st an d ard n og ulaza i i sp i suje ih na st an d ar d ni izl az. 1* ucitavanj e niza znakova sa standardnog ulaza *1 i ispi s na standardni izlaz *1 1*
#include <stdio.h> #detine CR 13 ma.in ()
10.5. Funkcije {
-
26.5
gets(j, puls()
c har
/*
ch;
drklaracija varijable *1
1* u c i t avan j a znaka s a s t andardnog ulaza*/ wh ile (ch = get c har(» ! = CR) put c har ( c h); /* i s p i s j ednog znaka * 1
}
Rezultat izvršavanja p rogram a j e: Ovo j e test primj er TURBO e definira i dvije dodatne funkcij e koje se odnose na učit avanje jednog znaka s t as t at ur e . To su getchO i getcheO. Prototipovi n avedenih funkcija nalaz e se u d a t ot ec i
cjelohrojnu
conio.h.
Funkcije
getchO i getcheO
vraćaju
vrijednost lIčitanog z n aka. Bu du ći d a je t astatura, 11 TURBO
C
u, d efini ran a kao s t an d ard ni ulaz proizlazi da se za u čit avanje jednog z naka sa st an d ardnog ulaza mogu kori s titi:
10.5.
getcharO, getchO i getcheO.
Funkcije - getsO, putsO
Funkcija getsO uč.i t ava niz znakova s a s t an d ard nog ulaza ( stdin ) i pohranj uje ga na adresu zad an u argum entom fun kcije. Opći oblik funkcij e
getsO
je:
char *gets (ehar *strihg); Fu nkcija.
getsO
učit ava niz z n akova, do un osa ozn ake z a n ovi red
'\n'.
Umjesto oznake za novi red '\n', TURBO C, na k raj niza dodaje oznak u
kraja niza ( string te1'minator) , '\0'. Prem e t ome, funkcij om getsO n e m ož e se u nijeti oznaku za n ovi red . Ako je neophodn o d a '\n' blHle sas t avni dio unesen og niz a, potrehno ga je ek splicite d od at i. Fllllkcija
putsO
i s pi suje niz zn akova n a stan d ardni izl az. Niz znakova
zad aje se kao argument funkcije. O pći oblik funkcij e
int put s (ehar *strillg);
puts()
j e:
Ulaz i izlaz
266
gdje string pr ed s t avlja p okazivač n a niz zn akov a koji se ispis uje . O znaka kraj a niza '\0' se u fu n kcij i putsO zamjenj uje oznakom za n ov i red '\n'. Fu n k cij a
printfO. tome
što
putsO
prepozn aje sve kontr ol ne zn akove za ispi s kao i funkcija
Nedostat ak fu nkcije putsO u odnosu na funkcij u printfO je u funkcij a putsO ispisuje i s ključ iv o niz znak ov a , d ok se funkcijom mogu ispisiv at i i br oje v i različi tih for mata . Me
printfO putsO zau zim a
manje pr ostora i br ža je od funkcije printfO. Z b og t oga se pr ogr amim a , koj i m a se želi post ić i ve ća br z i n a i b olj a optimizacij a kod a, za ispis niza z nakova u mje s t o fun kcije printfO koris t i fun k cij a putsO .
u
Za pr i kaz n avedenih funkcija napi sat ćem o pr ogram koj i uči tav a niz zn akov a s tastature i ispi suje ih n a za sl on rl\čun al a .
1* prikaz rada funkcij a g e t s ( ) i puts () * 1
#include <stdio.h> mainO { char
string [80];
put s ( " Unos niza znakova s tastatur e : \n " ) ; get s ( str ing ) ; put s ( " \n Une s en i niz znakova j e : " ) ; put s ( " ==========================="); 1* i spis une s enog niza znakova * 1 put s ( string ) ;
}
Rezultat
izvr šavanj a program a je:
Uno s niza znakova s tastature : Petak je najljepsi dan u tj ednu Uneseni niz znakova j e:
= = = = ====== = = = ==========
Petak je najljepsi dan u tjednu
Pregled osnovnih funkcija za unos podataka s tastature (st an d ard ni ul az) i ispis podataka na zaslon (standardni izlaz) prikazan je tablicom 10.1.
10.6.
Formalirani ulaz - scan/O
267
Funkcija
Operacija
Prototip u
getcharO
učitava nIZ znakova sa standardnog ulaza; čeka "carriage-
stdio.h
-return" getchO
učitava
jedan znak s tastature;
conio.h
ne čeka "carriage-return" getcheO
kao i
prethodna funkcija s tim
conio.h
što prikazuje uneseni znak putcharO
ispisuje zadani znak
na stan-
stdio.h
dardni izlaz (zaslon računala) getsO
učitava niz znakova sa
standard-
stdio.h
nog ulaza (tastatura računala) putsO
ispisuje niz znakova na
stan-
stdio.h
dardni izlaz
Tablica 10.1. Osnovne lJ/I funkcije 10.6. Formatirani ulaz - scanfO
U prethodnom poglavlju opisane su funkcije za unos podataka sa stan daninog ulaza. Navedene funkcije omogućavaju unos jednog ili niza znakova. Uneseni niz znakova neophodno je prilagoditi zahtjevima programa, što znači da je potrebno napisati dodatne funkcije koje će uneseni niz pretvoriti u ohlik podataka prik ladan za upotrebu u programu. Drugim riječima une seni niz znakova potrebno je
- formatirati.
Funkcija scanfO omogućavct formatirani unos podataka.
Opći oblik
funkcije scanfO je:
scanf ("kontrolni niz", lista argumenata); Kontrolni niz odre(tuje format unosa podataka. Uneseni podaci pri družuju se argumentima funkcije navedenim u listi argumenata. Kontrolni niz sastoji se od tri grupe znakova: oznaka formata prazno mjesto
(blank),
tabulator ili oznaka nove linije
( newline)
Ulaz i izlaz
268
ostalih
zn akova koji služe za p ovezi vanje un esenih p o d a t aka s a rgu
mentima u
listi argumenata.
Oznaka formata sastoji se
od z n aka
% i tipa formata.
Tip formata
odre
ili oz n a ka nove niza.
linije u kontrolnom nizu omo
gućuju preskakanje praz ni n a ul az nog
Ostali z ll akov i koji se nalaze u kon t rol nom nizu omog u ćuju da se p o dac i koji IH' odgovar aj u n av ed e nom tipu form at a jed n ostavno ne uzimaju u obzi r . N a primjer, kontrolni niz koji se sastoji od, "%d, %d" čita jednu cjelobro j n u vrije dn os t , pre ska če zarez (,) i nas tav lja s či tan jem druge cjelobrojne vri je d n os t i . M e
1* pr ikaz format iranog uno s a podataka *1
#includ e < std io.h> main () { int
x,
y;
put s ( "Une sit e dva c i j ela broj a po f ormatu scanf ( " %d , %d" , .tx, ty); printf ( " \n Uc itan i podaci su
x
=
%d
Y
=
%d,%d: \n ") ;
Y.d " ,
x,
y);
} Rezultat izvršavanja prog ram a je: Une s it e dva c ijela broja po formatu Uc itan i podaci su x = 10 Y = 20
Y.d , Y.d: 10, 20
Rezul tat i z vršavanja programa kad su se poda c i unosili b e z za reza b i o je Une site dva cijela broja po formatu Ucitan i podaci su x = 10 Y = 32
%d , %d
: :
10 2 0
10.6.
269
Formalirani ulaz - scan/O
Oznaka, form ata koji se n alazi u kontrolnom nizu ovi si o tipu podatka koji se unosi. T ip i značenje form ata d ani su u tablici 10.2. Značenje
Format %c
u čitava jedan znak
%d
u čitava cijeli broj
%i
u čitava cijeli b roj
%e
u čitava broj s pokretnim zarezom
%f
učitava broj s pokretnim
%h
u či tava cijeli broj (short int)
%0
u čitava oktalni broj
%s
u či tava niz zn akova ( string)
%x
uči t ava lleksadecim alni broj
%p
u čitava pokazivač
%n
broj znakova zn ač.ajan za određeni format Tablica 10.2. Formati
zarezom
funkcije
scallf
Značenja pojedinih formata prikazan a su u nekoliko narednih primjera: scanf ( "%5" , s tring) ;
u čitava niz zn akova s tastature. Budu ći da je argument funkcije p olje znakova ili pokazivač na polje znakova adresni op erator & nije potreban . Ako se u program treba u nijeti više podat aka, tad a se argumenti funkcije odvajaju zarezom . Na primjer, potrebno je unijeti d va cijela broja: scanf ("%d%d " , tx, ty) ;
Ako se brojevi unesu kao 1 2, tada se varijablama x, y pridružuju vri jed n osti x = 1, Y = 2. Među tim, ako se uneseni podaci odvoje zarezom 1, 2 varijab li y nije pridružena prava vrijednost. U slu čaju d a se podaci koji se unose od vajaju o
Ulaz i izlaz
270
To zn ači da se bilo koji z n ak koji se n alazi iza prvog cijelog broj a preskače. Pozivom funkcije
o m oguću je se unos d va cijela broja koji su odvojeni bilo kojim z n akom. Na p rimjer, unosom 1/2 ili 1:2 ili 1i2 varij abli x pridru žuje se vrijednost 1, a varijabli y vrijednost 2. Kont rolnim nizom može se ograničiti broj znakova koji se pridru žuje pojedinom argument u . D�klaracijom varij abli int
f loat char
Xi Yi
ime [20]
j
n akon poziva funkcije scan! ( "%2d %f %*d %4s" , .h, &:y, ime) j
i un osa podataka 1234
435 18Marko
varijabli x pridružuj e se v rijednost 12, varij abli y v rij ed no s t 34.0, naredni c ijel i broj se preskače, a četiri n ared n a znaka 1aMa pridr u žuju se niz u zn a kova ime. Bu d uci da je varijabla ime deklarirana kao p olj e zn akova adresni operato r & nije pot7'Cban, jer ime predstavlj a adresu polja zn akova u memo
riji.
Na kraj u treba naglasiti d a se funkcijom scanfO n e m ogu ispisi vati poruke na zaslon r aču n al a ili terminala. Funkcij a koja omogućuje i s pi s poruka na z aslon je funkcija printfO.
10.7.
Formatirani izlaz - printfO
Opći oblik funkcije za ispis poruka na
standardni izlaz
je
10.7. Formalirani izlaz priutf
-
print/O
271
("kontrolui niz", lista argumenata);
Kontrolni niz sastoj i se od d va t i p a znakova. Prvi tip znakova su oznake formata ispisa. Kao i kod funkcije scanfO, ozna ka formata sastoji se od obav e zn og znaka % i oznake tipa fo rm at a koj i se nalazi neposredno iz a %. Formati za i sp i s p odataka prikazani su tablicom 10.3.
Značenje
Format
%c
ispisuje j e d an zn ak
%d
ispisuje zadani argument lldecimalnoj notaciji
%i
ispisuje zadani arg um ent u decimalno j no tac iji
%e
isp isuje zadani argmnet
%f
ispisuju zadani argument kao broj s pokretnim zarezom
%g
izabire kraći način zapisa
%0
ispis u je zadani argument kao oktalni broj
%s
ispisuje niz znakova
%u
ispisuje decimalni broj
%x
ispisuj e zadani argument kao heksadecimaIni broj
%%
ispisuje znak %
%p
isp is uje vrijed n ost p oka zi v a č a
%n
označava broj znakova za ispis Tablica IO.3�
II
E-notaciji
između f ormata %f i
b ez
e
predzn aka
Formati funkcije prilltfO
U deklaraciji formata i sp i sa mogu se do d avati određeni atributi koji o dređuju broj znamenki koje se ispisuju, broj decimalnih mjesta, broj znakova niza koji se ispisuje, lijevo ili desno p orav n avanje i sl. Broj argumenata koji se nal azi u listi argumenata m ora biti jednak broju zadanih fo rmata. Ako je h roj argumenata manji od broja zadanih formata, pre v odi l ac neće jav iti grešku, m e
272
Ulaz i izlaz U nastavku je dano nekoliko
karakteristke
funkcije printfO.
pr int! (
"
primjera
u ko j ima se
mogu vi djeti osnovn e
Ispis poruke bez liste argumenata " );
Rezultat iz vršavanja funkcije Ispis poruke
je:
bez liste argume nata
Pozivom fuukcije print!
("\n Cj elobrojna konstanta = %d , broj s pomienim zarezom = Y.t",
i,
f);
rezult at izvršavanja je:
ko n st anta
Cjelobrojna
=
543 , b ro j s pomienim zarezom
=
123.543
Naredbom
string
" Danas je ponedjeljak ";
=
i pozivom funkcije print"! ("\n %8 'I, string);
dobije
se:
Danas
je ponedjeljak
Dodavanjem atributa ispred oznake formata postižu se različiti oblici ispisa. Ako se ispred oznake formata nalazi broj s decimalnom točkom, tada će se prema zadanom formatu ispisati točno određeni broj znamenki zadan og broja, odnosno zadani broj znakova dotičnog niza zn ako va Na primjer, .
int
x
tloat
t
char print!
*5
'"
12345;
=
23.45678;
=
II
D anas
je
suncano ";
("\n Ispis: x = %d, Y = %.2!, s = %.6s "
x, f,
5);
10.7.
Formalirani izlaz
- print/O
Re zul t at isp i s a j e: Ispis:
Format
x
=
1 2345, f
%.2f ozn ačava
=
23.45, s
=
Danas
da se ispisuj e br oj s pomi čni m zar ezom , ali sam o s
d v ije deci m al n e zn am en ke iza decim alne to čk e . Ak o s e format zada kao 5.2 t ad a se hroj is pisuj e s n aj m anj e pet znamen k i i s d v ij e decimalne zn am enk e i z a de ci mal ne točke. Form at %.6 ozn ačava ispis šes t z n ak ova z ad an og niza. Svi izl azn i r ezult ati su desno poravnati. Z a lijevo poravn anj e dovoljn o je d odat i minus i sp red ozn ake formata: printf (1t'l..2flt,123.4567);
printf (1t'l.-.2flt,3.4567);
I zlaz je:
123.45 3.45
A t r ihu ti l i h poj avljuju se i spr ed form at a za isp is n u m eri čkih p o d at aka. Atribut l ozn ačava ispi s p o d ataka tipa long int od nosn o double. Atribut h označava is p i s p o d a t aka tipa short int:
long int double print! (It
x = 357892; y = 1 23a3456; x = 'l.ld, Y = 'l.lflt, x, y);
Rezu} tat ispisa je: x
=
357892, Y
Budući d a je
=
123.3456
kontrolni niz
dek la rira n kao k on s t an t a niza z n ak ova za i s p i s odnosno unos podataka m ogu se defi ni rati i n a p oč etku pro gram a . U tom slučaju, umj esto pi sanj a c ij elog k on trol n og niza , piše se defi niran a kon s tan t a . Pogodnost ovog n ač in a pisanj a posebn o
( str'ing constant) , form ati
d olazi d o izražaj a k o d k o m p lici ra n i j i h i d uljih f ormat a za unos o d nosno ispis p o d at aka.
Ulaz i izlaz
274
/* primjer definiranja unaprijed zadanih formata *1 #include <stdio.h> 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
•
Informacije o datoteci daje pokazivač na datoteku (file pointer). Pokazivač na datoteku (filc pointcr) je ustvari pokazivač. na kontrolnu struk turu tipa FILE, koja opisuje mectuspremnik pridružen odre(tenoj datoteci. Pokazivači na datoteke identificiraju različite datoteke, uključujući ime da toteke, status, tekuću poziciju i slično. U n arednim poglavljima opisat će se postupak upisa i čitanja podataka iz korisnički definiranih datoteka. Korištenje me(tuspremnika, pridruženih standardnim ttlazno/izlaznim datotekama, ako to zaista nije neophodno, treba izbjegavati.
10.9.1.
Otvaranje datoteka
napisani programi učitavali su podatke sa standardnog ulaza i podatke na standardni izlaz. Sljedeći korak u opisu U/I operacija je upis i čitanje podataka iz datoteka koje nisu direktno povezane s programom. Neki od primjera su upis i čitanje podataka odre(tene baze podataka ili upis izvornog koda programa na disk. Da bi podatke iz programa upisali u datoteku koja nije direktno povezana s programom, neophodno je naučiti nekoliko pravila. Do sad
ispisivali
Sve datoteke koje se koriste u programu moraju se otvoriti. Datoteka se u programskom jeziku e otvara pozivom funkcije fopenO. Funkcija fopenO obavlja dvije operacije. Prvo, definira međuspremnik i drugo, povezuje me(tuspremnik s datotekom. Opć.i oblik funkcije je: fopen (imeJlatoteke, mod)
10.9. Datoteke
277
Vrijednosti
Z
n a
č
e
nj
e
argumenta lUod "r"
otvara datoteku za čitanje
"w"
otvara datoteku za upis
"a"
dodaje nove podatke na kraj tekstualne datoteke
"rb"
otvara binarnu datoteku za čitanje
"wb"
otvara binarnu datoteku za upis
"ab"
dodaje nove podatke na kraj binarne datoteke
"r+"
otvara tekstualnu datoteku za operacije čitanja/pisanja
"w+"
stvara novu tekstualnu datoteku za operacije čitanja/pisanja
"a+"
otvara ili stvara tekstualnu datoteku za čitanje/pisanje
"r+b"
otvara binarnu datoteku za čitanje
"w+b"
stvara novu binarnu datoteku za operacije čitanja/pisanja
"a+b"
otvara ili stvara binarnu datoteku za čitanje/pisanje
"rt"
otvara tekstualnu datoteku za čitanje
"wt"
stvara novu tekstualnu datoteku za upis podataka
"at"
otvara tekstualnu datoteku za dodavanje podataka na kraj datoteke
"r+t"
otvara tekstualnu datoteku za čitanje/pis anje
"w+t"
stvara novu tekstualnu datoteku za čitanje/pisanje
"a+t"
otvara ili stvara tekstualnu datoteku za čit anj e /pis anj e 'Tablica 10.4. Vrijednosti i značenja argumenta mod .'
Argument ime_datoteke predstavlja ek sterno ime datoteke. Ako se po daci nalaze na disku, tada se ime_datoteke odnosi na dio diska na kojem su zapisani podaci koji se identificiraju argumentom ime_datoteke. U slučaju datoteka, koje ne mogu dijeliti svoje resurse na više logičkih dijelova, argu ment ime_datoteke predstavlja samu datoteku. Argument mod određuje U JI operaciju. U tahlici 10.4. navedene su vrijednosti i značenja argumenta mod. Funkcija fopenO definirana je kao
Ulaz i izlaz
278 FILE *fopell (char *ime_datoteke, char *Illod);
Prema definiciji funkcija fopenO vraća pokazivač na strukturu tipa FILE, koja se još naziva i pokazivač na datoteku (file pointer). Pokazivač na datoteku deklarira se kao: FILE
*fp;
Programer ne mora voditi računa o sadržaju strukture tipa FILE. Poziv funkcije koja otvara datoteku :fp
=
teS'!;. dat
je:
:fopen ("test.dat", "v");
gdje je varijabla fp deklarirana kao pokazivač na strukturu tipa FILE. Budu ći da struktura sadrži sve neopoliodne podatke za prijenos podataka izme(tu programa i datoteke, promjena vrijednosti pojedinih članova strukture na koju pokazuje fp nije preporučljiva. Vrijednosti i sadržaj pojedinih čla nova ove strukture odre(tuju način prijenosa podataka izmectu programa i datoteke. Ako se u postupku otvaranja datoteke pojavi greška, funkcija fopenO vraća NULL pokazivač. Greške koje nastaju otvaranjem datoteke mogu biti prouzročene otvaranjem nepostojeće datoteke za čitanje, pokušajem ot varanja datoteke koje su sistemski zaštićene ili nečim sličnim. Greške takve prirode zahtijevaju prekid programa. Zbog toga ih je neophodno ispitati. Ispitivanje grešaka koje nastaju prilikom otvaranja datoteke obavlja se ispi tivanjem st anja pokazivača: if «fp;; fopen("test .dat", "r"»
{
;;;;
NULL)
puts ("\n Datoteka ne postoji exit (1); /* prekid programa */
.
.. . It);
}
Otvaranjem postojeće datoteke za operaciju upisa podataka, brišu se svi podaci koji su bili zapisani u toj datoteci, o čemu treba voditi računa, jer postoji i mogućnost upisa podataka na kraj datoteke. Otvaranjem datoteke za operacije čitanja/pisanja postojeći sadržaj datoteke ostaje sačuvan. Ako datoteka ne postoji stvara se nova.
279
10.9. Datoteke 10.9.2.
Upis podataka
Podaci se u datoteku mogu upisati samo onda kada je datoteka otvore na za operacije pisanja, čitanja/pisanja ili dodavanja HOt,ih podataka na kroj datoteke. Postoji nekoliko funkcija za upis podataka II datoteku, odnosno pridruženi me(tuspremnik. Pregled funkcija za upis podataka prikazan je tablicom 10.5. funkcija
operacija
putcO (makro naredba)
upis jednog znaka
fputcO
upis jednog znaka
fputsO
upis niza znakova (string)
fw riteO
upis hloka podataka
fprintfO
formatirani upis podataka
Tablica 10.5. P regled osnovnih funkcija za upis podataka
Funkcija fputcO omogućuje upis jednog znaka u me(tuspremni k Funkcija je definirana u standardnoj ulazno/izlaznoj biblioteci funkcija kao: .
iut fpute (int eh,
FILE *fp)i
gdje je fp pokazivač na datoteku (fl/c pointer) kojeg vraća funkcija fopenO. Argumentom ch zadaje se cjelobrojna vrijednost znaka koji se upisuje. Ako se u toku upisa podatka ne pojavi greška, funkcija vraća cjelobroj nu vrijednost upisanog znaka. U protivnom funkcija v raća EOF. EOF je oznaka kraja datoteke i definirana je u stdio.h. Jedan znak se u me(tuspremnik može upisati i makro naredbom puteO. Budući fputcO i putcO omogućuju upis saUlO jednog znaka, odnosno jednog hajta, mogu se iskoristiti za definiranje složenijih funkcija. Funkcija fputsO omogućuje upis niza znakova u UlNtuspremnik. Defi nirana je u biblioteci standardnih ulazno/izlaznih funkcija kao: int fputs (char
*8, FILE
*fp)i
280
Ulaz i izlaz
gdje s predstavlja adresu niza znakova. Ako je došlo do greške funkcija vraća EOF. U suprotnom funkcija vraća cjelobrojnu v rijednost zadnjeg upisanog znaka iz niza. U slučaju da se upisuje prazan niz (empty string) funkcija vraća vrijednost nula. Funkcija fwriteO omogućuje upis niza blokova podataka. Definirana je u standardnoj ulazno/izlaznoj biblioteci funkcija kao: int fwrite (void *huffer, iut br_b, int
br_grupa, FILE *fp);
Argument buffer je pokazivač na blok podataka u memoriji. Pokazivač je deklariran kao void, čime je omogućen prij�os pokazivača bilo kojeg tipa podataka. Argumentom br _b zadaje se duljina osnovnog bloka podataka, a br_grupa odre
main ()
{
FILE
*fp; datum
stz-uct
{
1* deklaracija pokazivaca na datoteku *1
int
dan;
int int char
mjesec; godina; ime [20] i
char
prezime[20] i
} rodjendani puts ("\n Podaci o imenu i datumu rOdjenja: II); puts ("\n=======�====:::========:;==============");
10.9. Datoteke puts puts puts puts puts
("\n ("\n ("\n (lI\n ("\n
281 Ime :"); :"); Prezime Dan rodjenja:"); Mjesec :") j Godina :");
gets (rodjendan.ime) j gets (rodjendan.prezime); scanf ("%d".&rodjendan.dan); scan! ("%d" .&rodjendan.mjesed; scanf ("%d" • .lrodjendan.godina);
if «fp = fopen("TEST.DAT", "vt"»
{
== NULL)
printf (lI\n Greska otvaranja datoteke...... exit (1);
,,
);
} 1* upis bloka podataka *1 fvrite (&rodjendan, sizeof(struct datum). l. fp); felose (fp);
}
Funkcija fprintfO omoguć.uje formatirani upis }lodataka. Već samo ime funkcije ukazuje na sličnost s funkcijom za formatirani ispis podataka funkcijom printfO. Funkcija je definirana u standardnoj biblioteci ulaznoj /izlaznih funkcija kao: int fprintf (fp, kontrolni niz, lista argumellata);
Razlika izme(tu fUll klije za formatirani ispis podataka (funkcija printfO) i funkcije fprintfO je u prvom argumentu funkcije. Argument funkcije fp je pokazivač na datoteku, koji se vraća pozivom funkcije fopenO. U slučaju da se fp zamijeni sa stdout obje funkcije bi obavljale potpuno iste operacije, formatirani ispis podataka na standardni izlaz. Ostali argumenti funkcije fprintfO imaju isto znač.enje kao u funkciji printfO. 1* usporedba funkcije fprintf() i printf()
*1
#include <stdio.h> main ()
{
1* deklaracija varijabli *1
int x; float y; puts ("\n Unesite vrijednosti varijabli oo); puts (" ===============================\n");
282
Ulaz i izlaz puts ("\n Unos cjelobrojne konstante X II); scan! ("%d", .tx); puts ("\n Unos broja s pomienim zarezom Y II); scanf ("%f", .ty); 1* formatirani ispis unesenih vrijednosti *1 puts (lI\n Ispis podataka funkcijom - printtO "); printf ("X = %d, Y = %.4f", x, y);
puts ("\n\n Ispis podataka tunkcijom - fprintfO "); fprintf (stdout, "X = %d, Y = %.4f", x, y);
}
Rezultat izvršavanja programa je: Unesite vrijednosti varijabli ======;====================== Unos cjelobrojne konstante X 325 Unos broja s pomienim zarezom Y 123.4568 Ispis pOdataka funkcijom - printf () X = 325, Y = 123.4568 Ispis podataka funkcijom - fprintf () X = 325, Y = 123.4568
Datoteka stan dardn og izlaza automatski se otvara i pridružuje joj se me (tuspremnik, opisan kontrolnom strukturom tipa FILE, na koji pokazuje pokazivač stdout. Zbog toga je nije potrebno posebno otvarati pozivom fu nkcije fopenO. O tome je već bilo riječi II jednom od prethodnih poglavlja.
prikaz nekih od mogućnosti formatiranog upisa podataka u datoteke, kori štenj em funkcije fprintfO, lllodificirat ćemo program koji je za upis bloka podataka koristio funkciju fwriteO. Za
1* formatirani upis podataka u datoteke na disku *1
#include <stdio.h> main ()
{ FILE
struct
{
*ip; datWII
1* deklaracija pokaz ivaca *1
10.9. Datoteke
283
int dan; int mjesec; int godina; char ime[20]; char prezime[20] j } rodjendan; /* unos podataka */ puts(II\n Podaci o imenu i datumu rodjenja : II)j puts("\n===================================="); II); gets(rodjendan.ime); puts("\n Ime puts("\n Prezime "); gets(rodjendan.prezime); puts("\n Dan rodjenja: "); scan f("%d" , lr o djend an . dan ) ; " ); scanf("%d",.trodjendan.mjese<;); puts("\n Mjesec puts("\n Godina ,,); scanf("%d",krodjendan. godina) i /* otv aran j e datoteke TEST.DAT */
if «fp = fopen("TEST.DAT", "wt")) == NULL)
{ printf (tr\n Greska otvaranja datoteke . exit (1);
. . . . .
"
);
} /*
formatirani upis podataka
u
datoteku */
fprintf (fp,"%s %s %d %d %d", rodjendan.ime, rodjendan.prezime. rodj endan. dan, rodjendan.mjesec, rodjendan.godina); fclose (fp);
}
Bitno je uol·.iti da funkcija fprintfO upisuje podatke u datoteku II ASCII formatu, što znači da će podati u datoteci hiti zapisani potpuno isto kao da se ispisuju na zaslon. Medutim, takav upis podataka zahtijeva dodatne operacije. To zahtijeva određeno vrijeme, što rezultira usporavanjfnn pro grama. Prema tome, ako je brzina programa bitan faktor bolje je koristiti funkcije fputeO i fwriteO ili makro naredbu putcO.
10.9.3.
Učitavanje podataka
Podaci iz datoteke mogu se uČ.itati samo onda kad datoteka već postoji kad je datoteka otvorena za operaciju, čitanja odnosno čitanja/piBanja.
Ulaz i izlaz
284
Postoji nekoHko funkcija za učitavanje podataka iz datoteke, odnosno iz me(tuspremnika pridruženog zadanoj datoteci. Pregled osnovnih funkcija za učitavanje podataka prikazan je tablicom 10.6.
Fnn k c i j a
getrO
(makro naredba)
Op e r aci j a učitavanje jednog znaka
fgetsO
učitavanje niza znakova
freadO
učitavanje hloka podataka
fscanfO
formatirano nč.itavanje niza podataka
Tabli ca 10.6. Pregled osnovnih funkci ja za uči tavanje podataka
Funkcija fgetcO omogućuje učitavanje jednog znaka. Definirana je u standardnoj ulazno/izlaznoj biblioteci funkcija kao:
int fsete (fp); g dje arg ument fp predstavlja pokazivač na datoteku koji se vraća pozivom f unkcije fopenO. Funkcija vraća cjelohrojnu vrijednost pročitanog znaka i pomiče pokazivač na sljedeć.i znak u me(tuspremniku. U slučaju greške funkcija vraća EOF. B u d u ći da EOF označava kraj datoteke, funkcija će i II slučaju redovno pročitanog kraja datotke vratiti EOF. Zbog toga se pri ispitivanju grešaka u postupku učitavanja podataka mora k oristiti i reorO. Makro naredba reofO vraća cjelobrojnu vrijednost različitu od nule, ako je kraj datoteke, ili nula, ako nije kraj. /* ucitavanje podataka iz korisnicki */ definirane datoteke */ /. #include <stdio.h>
main ()
{ FILE char
"'fp; sljedeci_znak;
/* otvori datoteku za ucitavanje podataka ... / if «fp = fopen("test.dat", "r+")) != NULL)
{
10.9. Datoteke
285 while (!feof(fp»
{
}
1* citaj do kraja datoteke *1
sljedeci_znak ; fgetc(fp); 1* ucitaj jedan znak *1 putch (sljedeci_znak); 1* ispis na zaslon *1
fclose (fp);
}
else
{
}
puts (It\n Datoteka test. dat ne postoji ili lt); puts (It\n greska otvaranja.... lt);
}
Budući da fgetcO učitava jedan znak, dakle jedan bajt, može se iskoristiti za definiranje složenijih funkcija. Kao primjer možemo napisati program KOP I koji kopira sadržaj jedne datoteke u drugu. Program zahtijeva dva argumenta funkcije mainO (command line arguments), koji predstavljaju imena datoteka. 1* kopiranje sadrzaja jedne datoteke u drugu *1 #inelude <stdio.h> 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
logi čke cj el i n e mogu se g r u p i r a t i u j ed n u ili v i še d a t o t eka , č ij e će i m e po d sj eća t i n a p robl em k oji je riješen tim dij el o m koda. O vo su samo neke o d p r e d n o s t i razb ij a.nj a i z vor n o g koda pr ogram a II v i še d atoteka. .
Postoje d va n a č in a n a k o ji se takvi p r ogr am s k i zadaci m ogu riješi ti u T U R n o e-u . Prvi n ačill , ko j i je već o p i s an u p r e t h o d ni m p ogl avlj i m a , jes t kori štenje p rep rocesorske n ared be
#illdude
ime da t o t eke .
Me
k oj i
pru ža s ve
n ab ro j an e p red n o s t i ,
o s t varuj e se korištenjem
P RO J E C T d atoteka. Kor i št e njem P ROJECT d at o t eka dijelov i i z vo rn og ko d a p r evo d e se od v o j eno , a zatim se povezuju ( linking) u jednu tzv .
log i č k u cjelin u . Pro mj en e i z vo rn og k o d a z ah t ij e vaj u ponov n o prevođe nj e Bamo onih datoteka koje su mijenjane. Promijenjena d at oteka se n ak o n ponov n og prevo(tenj a jed n o s t av n o p oveže s o s t ali m d atotekam a P ROJ E C T d a t o te k e i s t vori se n ova ve rz ij a i z vršnog programa. Proces pon ovnog prevo
i njezino p ov e z i vanje s ostalim m o d ulim a d aleko je brže nego ponovno p r ev o (tf' nj e i povezivanje cijelog ko d a programa. D akle, (te nja izmijenjene d a t o t e k e
sažm emo li i z n es e n o
možemo doći do slj ede ć eg zaklju čka. Rj eš avanje veli kih njihovim r as t av 1j anj em n a niz m anj i h
program skih zad at aka ol ak šava se
1 1 . 2. Pre voilenje programa sastavljen og iz više dat o t eka (Project file)
299
me(tusohno povezanih cjeli n a , fu nkc ija. Istom logikom , ko d iranj e program a s t varanje i z v ršne verzije postaje mn ogo j e d n o st av nije razbijanjem i zv o rn og ko d a \I niz m anj i h pod cj e li n a i nj ihovim pohranjivanjem lt za.c;ebne d atoteke. i
1 1 .2 .
P revođenje programa sast avlj eno g iz više da toteka (Project file)
K ao š t o je rečeno 1 1 prethodnom p ogl av l j u izvorni kod programa može se n al az i t i 11 v i š e odvoj e n i h d atoteka. Spomenuta su d va načina o rg an i z acije program a - jed an koji koristi stan d ardnu preprocesorsku n aredbu # include, i d ru gi koji kori s t i mogu ćnost T U RB O C radnog okruženja, odnosno PROJECT d atoteku .
P ROJECT datoteka je A S C II datoteka koja sadrži imena d atoteka koje čine program . Datoteka i m a dodat ak ( extension) .PRJ i prilikom prevo(tenja mora h i t i aktivna. PROJECT datoteke se aktivira izborom opcije osn ovn og izbora - Project t e opcije dod atnog izbora P roject name. Izborom n avedene opcije, otvara se prozor u koj i se mora upisat i ime P RO JECT d atoteke ( s li ka 1 1 . 1 ) koj e ulaze tl P ROJECT m ogu sadržavati izvorni kod , C pro gram , ili relokat i h i l ni o b li k , .OBJ d atoteke. Datoteke koje sadrže izvorni kod će se II procesll stvaranja izvršne ve r zij e program a prvo prevest i u relokati biln i oblik ( . O BJ d at oteke) , a zatim povez at i s ostal i m modulima PROJ ECT-a. Ako se n akon stvaranja izvršne verzije programa uoče greške i i z v rši ispravak p o j e d i n i h dijelova koda, od n osno pojedinih d a t o t e k a, za stvaranje n ove verzije i z vršn o g programa ponovno će se prev odit i samo one d atote k e u " kojima je d o š l o do. promjene. Datoteke
N a primjer, potrebno je n api sat i program koj i m hi s e r ije š i l o zbrajanje brojeva od l do n . Program možemo rast avit i t ako da se zbrajanje brojeva ohavlja u posebnoj fu n kcij i zhrojiO . Izvorni kod funkcije n al az i se u d a t ote c i test2 .c. U d a t ote c i test1 .c je p o čet ak program a, u či t avanje hroj a n i ispis rezult ata.
1 * dat ot eka t e st l . c * 1 # i n clude < s t d i o . h> v o i d main ( vo i d )
{
Dodatne mogućnosti TURBO G-a
300
File
Edit
Line
l
Run
Pro jjjH
COlllpile
Options
Insert .Proj.etn��m:(
Col l
.
r------:
I··PRJ
Debug ..
Break/vatch
• . .... ......... . ...... . ...... •·•·•· ···. •
P roje:i
·
:�:
1
C : ""· ......•.• :-----, --.-
I
Ilelllo.e .essages
1----- Jlessage -------1 Fl-Help
FS-ZooIII
F6-Svitch
F7-Trace
F8-Step
Slika 11.1. Prikaz zaslona nakon izbora
double zbroji (int); double zbroj; n', int
F9-Jlake
FlO-Jlenu
lUK
opcije Project Ilame
/* prototip funkcije */
printf ("\n Ovo je datoteka testi.c"): prinU ("\n ----------------------"): : printf ("\n Zelite sumu brojeva do : II) scanf ("%d", lm):
}
zbroj = zbroji(n); printf ("\n\n I spis j e u datoteci test1. e " ); print! ("\n ============================" ) ; printf ("\n Zbroj prvih Y.d brojeva je %f",n, zbroj);
1* datoteka test2.c *1
double zbroji(int n)
11.2. Prevoil.enje programa sastavljenog iz više datoteka (Project file)
301
{ double int
zbroj; i;
zbroj = Oi for (i = li i <= ni i ++) zbroj +=ii printf ("Zbrajanje u funkciji
}
u
datoteci test2.c
!");
return (zbroj) i
Datoteka TEST. PR] ima sljedeći sadržaj
1* datoteka test.prj *1 test1 test2
Pretpostavimo da d atote k e testi. e i test2. e nisn preve dene n .OBJ da toteke. Izborom opcije Project, odnosno opcije Project name aktivi ramo PROJECT datoteku test.prj. Izborom opcij e Run osnovnog izbo ra TURBO e čita sadržaj datoteke test. prj i svaku datoteku, koj a nije prevedena, prevodi u relokatibilni oblik (.OBJ datoteke). Sljedeći korak je povezivanje i izvršavanje programa. Drugi način st varanj a izvršne verzije programa obavlj a se izborom opcije
Make osnovnog izhora Compile. Opcija Make razlikuje se od opcije Run jedi n o po tOllle što Make ue pokreće izvršavanje programa. .
U gotovo svim većim programima postoji niz gl obalni h (eks ternih) varijabli, simboličkih kon stan t i i funkcija. N avedeni parametri, koji se ko
ris te u
nekoj funkciji, moraju se deklarirati unutar datoteke u kojoj se koriste. Da ne bi u svakoj datoteci ponovno deklarirali iste parametre, najprikladnije je sve parametre smjestiti u jedn u datoteku, tzv. head er d a toteku i uključiti n are d bom #include u svaku datoteku tl kojoj se navedeni parametri ko ri s t e. Header dat ot eka ima dodatak .h i ona bi za navedeni primjer sadržavala prototip funkcije zbroji O.
1* header datoteka PERO.H *1 double Zbroji (int);
Dodatne mogućnosti TURBO G-a
302
U tom sIn čajn sadržaj datoteke test 1 . e bio bi
1* datoteka
testl.c
*1
#include <stdio.h> #include "pero.h" void main (void)
{ double int
zbroj; n;
printf ("\n Ovo je datoteka tesU c"); printf ("\n ----------------------"); ; printf ("\n Zelite sumu brojeva do : II ) scanf ("%d" , \Im); •.
zbroj = zbroji(n); printf ("\n\n Ispis je u datoteci testloe "); printf ("\n ====== ======================" ) ; printf ("\n Zbroj prvih %d brojeva je %f" ,n, zbroj);
}
Promjena II header datoteci zahtijeva ponov no prev ođenje svih datoteka koje ju u k lj u čuju . Me(tntim, i z v orni kod se, u datotekama koje uključuju header datoteku, nije promije nio. Prema tome, te se datoteke neće ponovo prevoditi . Iz toga proizl azi da će nova verzija programa biti jednaka prethod noj, bez obzira na nastale p rom jen e. Izbjegavanje grešaka ove vrste posti že se definiranjem relacije ( ov i s nosti ) izme(tu dviju datoteka. U navedenom p ri mje ru relacija izme(tu datoteke test 1. e i pero. h bi se u s post av ila sa testl
(peroJl)
i potreb no jn je upi sati
n PROJECT d ato t e k u.
relac ij e izme(tu datoteke test 1 sljede ć i sad ržaj
N akon uspostavljanja i datoteke pero. h, datoteka test. prj ima
1* datoteka test.prj *1 testi
(pero.h)
test2
datoteka bilo koje izmjene u da zahtijevaju pon ov n o prevođenje datoteke
Uspostavljanjem rela.cije izme(tu navedenih
toted test1.c ili test1.c.
11 datoteci
pero. h
11.3.
Stvaranje vlastitih i promjet14 postojećih biblioteka funkcija
303
Kao što je pokazano, izgradnja velikih programa, čiji se izvorni kod
nalazi
II n ekoli ko datoteka,
znatno je jednostavnija nego što
na prvi pogled učiniti. Sve je to moguće izve sti
okruženju izvršavajući
program
to moglo
se
objedinjenom radnom
u modu korak po korak i koristeći pritom
veoma dobar program za pro n al až enje
11.3.
u
Stvaranje vlastitih b lio t e ka funkcija
i
i
ispravljenje gr eša ka
(DEBUGER).
promjena postojećih bi
Kako je u C-u malo toga š t o se ne može ostvariti, dopušteno je i mijen
janje i proširivanje već postojećih biblioteka funkcija. Funkcije ko je ne zado voljavaju potrebe odre
da bi bile korisne.
dodati
pak e t TURBO C uključeno je nekoliko uslužnih programa pozivati iz ohjedinjenog radnog okruženja. Jedan od tih p rogram a je TLIB. Već se i po n azi vu mo že zaključiti da je program nami U programski
ko ji se ne mogu
jenjen radu s hibliotekama funkcija. Korištenjem programa TLIB dana mo gu ć no s t stvar'anja vlastitih i mijenjanja postojećih biblioteka funkcija.
je
Program se pokreće iz DOS-a. Opći oblik pozi va programa je: TLIĐ bihlioteka
[jC] [j E]
naredhe, upisna_datoteka
gdje su:
biblioteka naziv n are d
be
niz
postojeće hihlibteke fu n kcija ili nove ko ja se stvara
parametara
koji odre
nad bibli
otekom
upisna_datoteka ot eci
( naziv
datoteka
u
koju se
lIpisuju
informacije
i veliNna pojedinih modula i sl.)
Parametar naredbe ima sljedeći oblik: <simhol>illle_datoteke
P regled simbola i
n
jih o vo značenje dano
je
II
tabli ci 11.1.
o n aveden oj
bibli
Dodatne mogućnosti TURBO G-a
304
simbol
+
zn ačenj e dodaj modul u biblioteku
funkcija
izbaci modul iz biblioteke i zdvoji modul iz biblioteke, modul ostaje u biblioteci
*
-+ ili +-
zamijeni postojeći modul u biblioteci s modulom koji ima isto ime
-*
or
*-
izdvoji modul iz biblioteke i zatim ga izbaci iz biblioteke Tablica 11.1. Pregled i značenje simbola
Moduli koji se dodaju , izdvajaju ili izbacuju iz biblioteke funkcija moraju se nalaziti u datoteci čije se ime zadaje parametrom ime_datoteke i nalazi se nep osr ed n o iza simbola. Parametar jC definira biblioteku u kojoj se funkcije, osim po imenu, r az lik uj u i po u potre bi velikih i malih slova ( case sensititle library) . Na primjer, korištenjem navedenog parametra funkcije tesU i TesU su dvije potpuno neovisne i različite funkcije. In for m acije o veličini biblioteke i funkcijama koje
se II njoj nalaze, do se tako(tel' pokretanjem programa TLIB. U datoteci koja se zadaje parametrom upisna_datoteka bit će u pisani svi podaci o navedenoj bib lioteci. Datoteka zadana parametrom upisna_datoteka je ASCII datoteka i može se ispisivati bilo na štampač ili na zaslon ( n ar edbom DOS-a type ) . Na primjer, podaci o veličini i funkcija.ma grafičke biblioteke funkcija dobivaju se na sljed e ći n ač in : bivaju
TLIĐ graphics.lih, grafika.Ist
N akon toga, na.redbom type grafika.lst
I
more
podaci se p r ika z u j u na zaslonu računala.
Ako
niste
(path).
u
direktoriju
II
kojem se biblioteka nalazi, obavezno nave dite put
11..4. Povezivanje
tJ/aslilih
biblioteka funkcija i programa
30,1)
Post upak s tvaranj a vlastitih biblioteka funkcija potpuno je jednak pos
t upk u dodavanj a funkcija u
već postojeće biblioteke. Veoma je bitno uočiti d o d aj u hi bli otekam a moraj u biti zasebni moduli. U jednoj datoteci može biti sadržano nekoliko funkcija. Ako bismo fun k cij u zbrojiO iz p reth od nog primjera h tjeli u gradi t i u v l astit u biblioteku funkcija onda hismo to učinili na sljed eći način. N akon prevođenja datoteke test2. e dobi li bismo datoteku test2. obj, i zašli bismo iz TURBO e radnog okru ženja i u DOS-u n ap i sali da funkcije koje se
TLIB
mylib.lib +test2
Nakon toga bi sve fun kcije s adr ža n e u datoteci test2.obj hihlioteku funkcija mylib.lib.
11.4.
U
bile smještene u
Povezivanje vlastitih biblioteka funkcija i programa
prethodnom
poglavlju
obja š nj en je postupak proširivanja postojećih
i s tvaranje vlastitih biblioteka fu n k c ija U p ostu pk u stvaranja izvršne ver .
zije p rogram a sve funkcije koje su dodane postojećim bibliotekama funkcija automatski će se povezati s ostalim modulima programa. Me đu ti m, u pro gramima koji pozivaju funkcije iz vlastitih bi bli oteka fu nkcij a, pot rebno je, u pr o cesu povezivanja modula progr ama nave st i ime b i bli oteke u kojoj se fu nkcije nalaze. Programi koji koriste vlastite biblioteke fun k cij a su u bi t i programi koji se sastoje iz više datoteka. Iz n avedenog proizlazi da je za stvaran je izvršne verzije takvih' program a neophodno koristiti PROJECT datoteku. Za ob jašnj enje postupka povezivanja funkcija iz v l as titih biblioteka i modula programa iskoristit ćemo prethodni primjer. Kompletan postupak će se ovdje oh j as niti još jednom korak po korak.
1. korak - Pi s an j e
iz vor n og kod a funkcij e (d atoteka test2. e )
2. korak - Prevo(tenje relokatibilni
3. korak - S tvaranje
izvornog koda funkcije (datoteke test2. e ) u oblik (datoteka test2. obj)
datot eke u koj oj se nalazi prot ot i p funkcije
zbro j i () (datoteka pero. h)
306
Dodatne mogućnosti TURBO
1*
datoteka
pero.h
G-a
*1
double zbroji (int);
4. korak -
Stvaranje v1astite biblioteke funkcija mylib.lib
tlib mylib.lib +test2
N akon
stvaranja v1astite bihlioteke dobro je provjeriti njen sadržaj. Naredba,
tlib mojlib.lib, sadrzaj.lst
će II datoteku sadrzaj .Ist upisati sadržaj biblioteke moj lib .lib, odnosno popis svih dostupnih funkcija navedene biblioteke. Sadržaj datoteke sadrzaj .Ist može se prikazati naredbom type. 5. korak -
Pisanje izvornog koda programa (datoteka t est 1. e)
#include <stdio.h> #include "pero.h" void main (void)
{ double int
zbroj; n;
printf ("\n Ovo je datoteka testi.c"); printf ("\n ----------------------,,); ; printf ("\n Zelite sumu brojeva do : II) scan! ("%d",tn); zbroj = zbroji(n); printf ("\n\n Ispis je u datoteci testl.c II ) ; printf ("\n ============================" ) ; print:f ("\n Zbroj prvih %d brojeva je %f" ,n, zbroj);
} 6. korak
- Stvaranje PROJECT datoteke test. prj 1*
test1 mojlib.lib
datoteka test.prj
*1
307
11.S. lIkIjučitIanje naredbi ASSEMBLER-a u izvorni kod programa 7. korak - Aktiv ira nje
PROJECT datoteke test .prj
8. korak - Prevo(tenje programa i ili
stvaranje
izvršne verzije.
Izvršna verzija programa stvara se izborom opcije izborom opcije Make do da tn og izbora Compile.
Run osnovnog izbora
Programi koji koriste funk cije
iz vlastitih biblioteka m o ra j u u sadržavati naziv biblioteke u kojoj se nalaze p o zivan e funkcije. N a taj način će sistemski program za povezivanje (linker) znati gdje će pot ražit i navedene fun k cije. Izvršavanje programa korak po korak (tmce mode - F7) ne ulazi u funkcije koje se nalaze u bibliotekama funkcija. Zhog toga je u procesu testiranja funkcija i programa dobro koristiti pre procesorsku naredbu #include, a n akon toga stvoriti vlastitu biblioteku. Odmah se može u o čit i da se za mali hro j funkcija st vara nje vlastitih bib lioteka funkcija ne isplati . PROJECT datoteci
11.5.
Uključivanje naredbi ASSEMBLER-a vorni kod programa
u
iz
Uključivanje naredbi ASSEMBLER-a u izvorni kod programa je JOS jedna dobra karakteristika TURBO e-a. Prije nego kažemo nekoliko riječi o ovoj mogućnosti, potrebno je n a gl as iti razliku izme
S druge strane, uključivanje naredbi ASSEMBLER-a u izvorni kod omo gućuje miješanje naredbi ASSEMBLER-a i n a r e d b i e-a. To zn a č i da se deklaracija funkcije i varijabli može ostvariti naredbama e-a, a naredbe u n u ta r funkcije mogu se pisati u ASSEMBLER-u. Da bi se to iskoristilo neophodno je imati kopij u Tmbo Assembler-a ( TASM ).
Opći ohlik poziva naredbe ASSEMBLER-a je:
asm
opkod operandi
308
Dodatne mogućnosti TURBO G-a
Ključna riječ asm označava početak naredbe ASSEMBLER-a. Opkod je operacijski kod n aredbe, a operandi su operandi navedene naredbe. Na primjer, naredbom asm moy ax, i
će se u registar -AX upisati vrijednost varijable i, koja je deklarirana standardnom e deklaracijom i·
int
,
Međutim, m ogućnost uključivanja naredbi ASSEMBLER-a u izvorni kod nema sve mogućnosti koje pruža " čisti" ASSEMBLER. Isto tako, već.ina grešaka koje nastanu u toku prevo(tenja programa neće se moći odmah otkriti. Prevodilac neće, u većini slučajeva, moć.i locirati grešku, jer se uključivanjem ASSEMBLER-a brojevi linija originalnog e koda izgube. Evo zašto. Prevo(tenje programa koji u sebi sadrži naredbe ASSEMBLER-a obavlja se u dvije faze. Prvu fazu prevođenja smo već upoznali tokom prevođenja izvornog e programa. Me(tutim, u prvoj fazi prevođenja prevodilac ne pre vodi naredbe koje počinju ključnom riječju asmo U drugoj fazi prevo(tenja poziva se TASM koji prevodi sve naredbe koji počinju sa asmo U toj fazi prevo(tenja gube se brojevi naredbi linija koda, čime je lokalizacija nastale greške nešto teža. Ako se ipak odlučite da u kritičnim odsječcima pro grama koristite naredbe ASSEMBLER-a, lokalizacija greške nije nemoguća. Naime, već i sama obavijest o nastaloj grešci može uputiti na mjesto na kojem je greška n astala. Mectutim, ako niste upoznati s mogućnostima i gra(tom procesora ne mojte se upuštati u pisanje složenijih programa, jer pronalaženje i isprav ljanje grešaka može potrajati. Za kraj evo i dva primjera: 1* int
primjer 1.
*1
test_funkcije (int a, int b)
{ x·
int if
,
(a
>
asm
b) moy
x,
25
1* zamjena za naredbu x
=
25
*1
11.6. Prevoilenje
programa izvan objedinjenog radnog okruženja
309
else x = 125; return (x);
}
Za razliku od " standardnog" ASSEMBLER-a, gdje komentar počinje s ;, kod asm naredbi komentar ostaje standardni e ko mentar. Drugi primjer za uključivanje naredbi ASSEMBLER-a u izvorni kod je funkcija koja usporectuje dva broja i kao vrijednost vraća manji broj. 1* primjer int
2.
*1
manj Lbroj (int a, int b)
{ asm asm asm asm vrati:
mov cmp
ax , a ax, b
jIe mov
ax, b
vrati
return LAX);
}
Prednost uključivanja naredbi ASSEMBLER-a u izvorni kod nad pozi vanjem ASSEMDLER-skih rutina je II činjenici da se ne mora voditi računa o tome za koji memorijski model se funkcija piše. Isto tako ne mora se voditi računa o naloinu prijenosa argumenata. Navedeni primjer radit će bez obzira na trenutno postavljeni memorijski model i bez obzira na način prijenosa argumenata (Pascal calling convention ili e calling convention). Programi koji sadrže ASSEMBLER-ske linije koda mogu se prevoditi samo izvan. objedinjenog radnog okruženja, uz uvjet da se na disku nalazi kopija TURBO ASSE MBL ER .a , TASM.
11.6. Prevođenje programa izvan objedinjenog radnog okruženja
U dosadašnjim primjerima pisanje i prevoetenje programa odvijalo se u objedinjenom radnom okruženju (integrated environment). Međutim, TUR BO e ver. 2.0 omogućuje prevođenje programa i izvan spomenutog okruže nja. Takav način predstavlja klasičan način pisanja i prevođenja programa
310
Dodatne mogućnosti TURBO G-a
i još uvijek je jedini n ačin pisanj a i prevo(tenj a p rograma n a velikim (main si stemima. U pro cesu stvaranj a izvršne verzij e programa, što se u objedinjenom rad n om okruženju obavlja izborom jedne od opcija osnov n og izbora, p otreb n o je program prvo prevesti (compilation), a zatim ga p ovezati s ostalim modulim a u jed n u cjelinu (linking).
frame)
Prevo(tenje program a izvan objedinjenog radn og ok ruženj a ima n e što veće m ogućn osti o d prevo(tenj a program a unutar radnog okruženj a. Na primjer , stvaranje ASSEMBLER-skog izlista programa ili prevo(tenje p ro
-
gram a koji im aju ASSEMBLER s ke linije koda moguće je jedino izvan rad n og okruženja - pozivom p rogram a TCC.EXE.
Opći
oblik poziva TCC prevodioca je:
TCC
opcija1, ..., opeijaN datoteka1, ... , datotekaN
Argumenti m a
opcija1, ... opcijaN
zad aj e se niz opcij a koje se koriste u
procesu prevo(tenj a i povezi vanj a program a. Svaka op cij a p o č i nje z n akom -. Argumenti
datoteka1, .... , datotekaN
m ogu biti d atoteke koje sadrže
(
)
iz vorni C kod, .OBJ d atoteke ili imena n estan d ardnih vlas t it ih biblioteka funkcij a. Ako d rukčij e n ije zad ano i ako nema grešaka u programu p okre tanjem TCC p revo dioca, stvorit će se iz vršna verzij a program a
)
(.EXE
d a
toteka . Iz v r š n a verzij a programa smješten a je u tekući direktorij . Pregled i z n ačenje op cij a TCe prevo dioca dani su u tablici 11.2. Nije svej e d n o d a li se opcije z ad aju veliki m ili malim slovima. Do datne, n estan danIn e biblioteke funkcij a povezuju se s program om tako da se n aved e ime biblioteke čije se fun kcij e koriste u pozivu programa. Datoteke s izvornim
C programom n e moraju sadržavati d o d atak (extension). Za razliku o d njih d atoteke s relokatihilnim oblikom (.OBJ ) i biblioteke (.LIB) moraj u se označiti kao tak ve. Na primjer , ako p rogram TEST sadrži pozive funkcij a, koje se n alaze u datoteci testi, koja je p revedena u testi.obj, i pozive funkcij a bibli oteke mylib, tad a poziv TCC prevodioca izgleda ovako: Tee
TEST test1.obj mylib.lib
Ime izvršne verzije program a jed n ako je imenu iz vorn e d atoteke koj a se prevodi s d o d atkom .EXE. Me
-e
izv r š ni oblik
p rogram a može popri miti b ilo koje i m e . Na primjer, p revo(tenjem program a
Tee -eTEST pokus izvršna verz ij a programa pokus nalazi se
II
datoteci TEST. EXE.
11.6. Prevođenje programa izvan objedinjenog radnog okruženja
Značenje
Opcija -A -
B
311
Prepoznaju se samo ANSII ključne riječi U
kod su uključene naredbe ASSEMBLER-a
-C
Dozvoljava se gniježđenje komentara
-c
Prevo(tenje programa
-edatoteka
Zadavanje imena datoteke koja će sadržavati izvršni oblik programa
-f
Emulacija matematičkog koprocesora
- f-
Nema emuladje matem atičkog koprocesora
-f87
Korištenje naredbi matematičkog koprocesora
-G
Optimizacija koda prema brzini
-gN
Prekid prevo(tenja nakon N grešaka
-Iput
Zadavanje puta gdje se nalazi
-iN
Zadavanje duljine identifikatora
-jN -K
-K-
u
relokatibilni oblik ( .OBJ datoteka )
(warning errors)
include
direktorij
(Jatal errors) Pretpostavljeni tip je llnBigned char Pretpostavljeni tip je Bigned char Prekid nakon N grešaka
-k
Korištenje standardne veličine stoga
-Lput
Definiranje puta za direktorij u kojem se nalaze standardne biblioteke funkcija
-M
Stvaranje datot�ke s memorijskom mapom ( .MAP datoteka )
-mc
Prevo(tenje u compact memorijskom modelu
-mh
Prevo(lenje u
-ml
Prevo(tenje u large memorijskom modelu
-mIll
Prevo(lenje u medium memorijskom modelu
-ms
Prevo(tenje u small memorijskom modelu
-mt
Prevo(tenje
-N
Provjeravanje prekoračenja zadane veličine stoga
huge
u tiny
memorijskom modelu
memorijskom modelu
312
Dodatne mogućnosti TURBO C·a
-nput
Zadavanje izlaznog direktorija
-O
Optimizacija koda prema veličini
-p
Prijenos argumenata kao u PASCAL·u
)
conventions
( Pascal
-p-
Standardni način prijenosa argumenata
-r
Omogućavanje korištenja registarskih varijabli
-S
Generiranje ASSEMBLER-skog koda iz C programa
-Uime
Predefinicija makro imena
calling
Prikazivanje svih grešaka ( warning error ) koje nastanu tokom prevođenja programa
-w
-w-
Ne prikazuju se greške koje "nastanu tokom prevođenja programa
-1
Generiranje 80186/80286 koda
-1-
Generiranje 8080/8086 koda Tablica 11.2.
Pregled i značenje op cij a TCC prevodioca
11.7. Uslužni program
- GREP
Kada smo govorili o mogućnosti razbijanja programa u nekoliko da toteka, zanemarili smo činjenicu da je traženje odre(tenih dijelova teksta u takvim programima znatno teže nego u programima čiji je izvorni kod u jednoj datoteci. Razlog tome je uslužni program - GREP koji se dobije uz standardni programski paket TURBO C. Radi se o programu koji omogućuje pretraživanje dijelova teksta u zadanim datotekama. Uslužni program GREP pruža mnogo veće mogućnosti pretraživanja teksta od standardne mogućnosti koja se nalazi u objedinjenom TURBO C okruženju. Program se pokreće iz DOS-a. Opći oblik naredbe glasi: GREP
[-rlcllvidzuwo] tekst datoteke
Opcijama unutar uglatih zagrada detaljnije se određuju način i uvjeti pre traživanja. Argument tekst predstavlja dio teksta koji se pretražuje u
11.B. Uslužni
program
-
NORTON GUIDE
313
datotekama, zadanim argumentom datoteke. U mj esto naziva datoteka moguće je koristiti znak * (wildcarrI), čime se naznačava pretraživanje u pojedinim grupama datoteka. Na primjer, grep
turbo *.c
traži tekst turbo
u
svim datotekama s do d atkom
. c.
Značenja pojedinih opcija programa GREP dobiju grama s argumentom?
se
pokretanjem pro
GREP ?
11.8. Uslužni program
-
NORTON GUIDE
Logič an nastavak knjige o TURBO e-u bio bi pregled i ob jašnjenje najosnovn ijih funkcija koje se nalaze tl standardnim bibliotekama funkcija. Mectutim, to se ovdje neće učiniti iz dva razloga. Prvi, jer se iz TURBO e obj edinj enog rad nog okruženja, i st ovr em eni m pritiskom na tipke Ctrl Fl, mogu dobiti osnovne i nfo rm ac ije o pojedinoj funkciji. Drugo, uslužni program NORTON GUIDE, koji se instalira kao rezidentan program, sadrži p opi se i detalj na obj aš n jenj a svih funkcija standardnih biblioteka f u n kcija P ro gram se veoma jednostavno instalira i još jednostav nij e poziva. Do voljno je pritisnuti odgovarajuć.e tipke, najčešće Alt-M, i na zaslonu će se pojaviti objašnjenje za traženu funkciju. Objaš njenje je potpuno jed nako objašnjenju -koje se nalazi u originalnom priručniku. Jedini problem može predstavljati nepoznavanje engl esk o g jezi ka Me
.
A.
Postavljenje optimalnog radnog okruženja
Instalac ijom programskog paketa TURBO C ver 2.0 postavlja se stan dardno TURBO e okruženje. Takvo radno okruženje dovoljno je za rješa vanje već.ine problema. Me(tlltim, rje š avanj e specifičnih problema zahtijeva postavljanje dodatnih parametara, kojima se odre(tuje memorijski model, način prij e nosa argumenata u f un kc ije, generiranje koda, optimizacija koda i sl. Namjena ovog dodatka jest u pozn avan je pojedinih opcija osn ovn ih i dodatnih izbora koji omogućuju ]>ostavljal1je optimalnog radnog okruženja. Potrebno je naglasiti da promjene ra dn og okruženja nisu česte. (�ak što više, ako se izvorni kod programa nalazi u više datoteka , tada različ.ita radna okruženja tokom pre vo đenja po jedi nih datoteka (u .OBJ dat ote k e ) mogu izazvati odre(tene greške u toku rada programa. Zbog toga je tak ve programe n a jbolj e p revodit i II jednom radnom okruženju. Problemi najčešće n asta ju na onim dij e lovi m a program a koji koriste pokazivače. Pretpostavljeni tipovi pokazivač.a u različitim m em orij s ki m modelima Sl1 razli6ti, te postoji velika mogućnost da mije šanjem memorijskih modela doete do nepravilnosti II toku rada programa. Takve greške veoma je teško otkriti, jer program malo radi a malo ne, a cijeli kod i algoritam su korektno napisani. Izbjegavanje takvih grešaka postiže se ili korištenjem j e d i n st ven og radnog okruženja ili ek splicitni m navo{tenjem tipa Jlokazivača (casting).
Optimalno radno okruženje postavlja se zadavanjem odre
Compiler
Linker
Environment Arguments Save options
A. Postavljenje optimalnog radnog okruženja
316 Retreive options, koje se pojave
File
na
Eđit
z asl onu nakon izbora
Run
Compile
P r oj e
opcije Comp iler (slika.
()ptiCiri:�
ct
Debug
A.I)
Break/watch
r----- Edit,------, --------,
Line l
CoIl
Insert Inđent
Colllpilej::)
T.
'OIAItE. C
Linker Environment Directories Argument s Save
�
optio ns options
Retr eve
f------ Message
Fl-Uelp
FS-Zoom
F6-Switch
F7-Trace
--------1
F8-Step
F9-Make
FlO-Menu
lUX
Slika A.1. Dodatni izbor osnovnog izbora Options
Compiler
dodatnih parametara pre postupku prevo(tenja programa. Izborom opcije z asl onu računala o tvorit će se prozor (slika A.2)
Izbor opcije Compiler omogućuje postavljanje vodioca koji se koriste II
Compiler na
Model odre
program i podaci bit će smješteni u segment od 64K. Prema tome, programi koji zauzimaju više od 64K ne mogu se prevoditi II modelu T i ny . Taj memorijski model koristi se za preVO(tellje programa koji će se transformirati u .COM oblik. Pretpostavljena vrijednost navedene opcije je Small.
Defines omogućuje definiranje i promjenu vrijednosti stanti koje se koriste II programu.
simboličkih kon
317 File Edit Ilun Coapile Project !l.p�M#'� nebug Brealt/watch �--------------------------- Edi�------------�-----------� Line 1 Col 1 Insert Ind ent Ta :i:!ompile]:'::: .H::·::::\r IOIAME. C
K�;t�i::/:(
I
.
•
, •....
\))\K�ciium{
Defines Code generation Opt imizat ion Source
-
Errors lames
1---- Kessage -----1 Ft-Belp
F6-Zooa
F6-Switch
Slika A.2.
Code generation
Calling C07wcntžou
Instruction II
set
F8-Step
F9-Kake
FlO-Kenu
lUK
Opcije dodatnog izhora Compiler
sa stoji se od
nekoliko dodatnih opcija (slika
odre(tuje način prije n os a argumenata u
Pretpostavljena vrijednost
titi
F7-Trace
A.3)
funkcije.
je C.
odrNtuje koji
procesu generiranje koda.
će
se niz naredbi (instruction set) koris
Ako
se program prevodi na računalima
IBM PC AT, može se postaviti generiranje koda 80186/80286. Programi koji se stvore izborom navedepog niz a naredhi br ž i su od p r o gram a koji se pre vo de izborom 8086/8088. Me(tu ti m , tr eh a n ag l as i ti da neki pro grami, koji se prevode izborom n aredbi 80186/80286, neće raditi na IBM
koji će ra diti na s vim IBM dobro je izabrati generiranje koda korištenjem uiza naredhi
P C XT računalima. Prema tome, za programe PC ra čun ali m a
8086/8088. Floating point odre
koda koji za izvrša vanje aritmetič Dodatne opcije ovog izbora su None, Emulation, i 8087/80287. Ako matematič.ki ko pro cesor nije instaliran, tacla se mogu iz a b r a ti opc ij e None ili Emulation. kih op eracija kori sti m atema ti čki kopro cesor.
Default char type
char.
po d atka odrNtuje vrijednosti koje može popri-
post av lja pretpostavljeni tip osnovnog tipa
Pretpostavljeni tip po d atk a
A. Postavljenje
:318
optimalnog radnog
okruženja
File Edit Run Compile Proj ect opH@1i Debug Break/watch �--------------------------- Edi�------------,--------===� < Line l Insert Indent TĐ .• H9mp il.et> CoIl
> l lIo1lAKE.C
Kodel
Kedium
.••••• Ciliiingconvention Instruction set
80186/80286
Float ing point
Emulation
S igned
Default char type
By te
Alignment
On
Generate underbars
�
Kerge d plicate strings
Standard stade :frame
On
Test stack over:flov
On
Line nUlllbers
On On
OBJ
1-----Fl-Help
FS-Zoom
F6-Switch
Kessage
F7-Trace
Off
debug in:formation
--------/
F8-Step
F9-Kake
Fl0-Kenu
ilUK
Slika A.a. Opc.ije dodatnog izbora Code generation miti znakovna va rijabla ( char), (signed).
od O do 255
(unsigned)
ili od -128 do 127
Alignment odre.finiranim funkcijama će se u toku prevodenja p rog ram a dodati donja crta (underbar).
_
Merge duplicate lItrings poprima dvije vrijednosti On i Off. Zadavanjem vrijednosti On p re vodil ac će sve iste (duplicate) nizove znakova pohraniti na istu memorijsku lokaciju i tako uštedjeti dio memorijskog prostora.
St(mda1'Cl stack fmme generira s tan d ard ni stog, koji sadrži standardni poziv funkcije i generira kod za povratak iz funkcije (cnt7'Y and exit code), Vrijl'dnosti koje se mogu zadati izhorom navedene opcije su On i Off. PI'O-
319 g r am i pr e veden i s
v rijed n ošću o pcije Off
n
e što su krać i
i
brži, mectutim,
onemogućuju pokretanje programa koji pomaže u pronal ažen ju j a nj u grešaka
bude
(DEllUGER).
Prema tome, dobro je da
v rij ed n ost
i
isp r avl
ove opcije
On.
Tcst stack OtJC7jIOW odre(tuje provje r u prekoračenja definirane veličine
stoga prilikom
s va
kog p oz i va fu nkc ije.
Linc number's može po p rimi t i d v ij e
vrije dn ost i On i Off. Kada je vri On, vrši se n umeriranj e svih Unija koda u toku prevođenja program a. Kor i šte nj e programa koji pomaže u pron al až enj u i ispravljanju g rešaka , DEBUGER, zahtijeva d a v rij ed nos t opcije hude On.
je d n os t op cije
OBJ dcbug information, kao i pret h o dn a opc ij a m ože p opri mi t i d vije On i Off. Ako se program želi izvoditi u mo d u korak po ko rak (tmcc modc), u svrhu pron alaženj a i i s p rav lj anj a grešaka, opcija mora imati v rijed nost On. Pritom i opcija Linc numbcr's mora imati v r ij e d n ost On. Vrij edn os ti On po ve ć. avaj u v eli či nu i z v r šnog programa, te se nakon ispravljanja svih grešaka, kon a č n a izvršna verzija programa može prevesti s v rij e d n osti m a navedenih opcija Off. vrijednosti,
Optimization p ostav lj a dodatne parametre koji se kor i s t e II vo (tenj a programa i koj i ob avlj aju op t i miz aci j u nap i sano g koda. s astoji od četiri dodatne op c ij e .
toku p re Izbor se
i Size. Postav v erz ija p ro gram a bud e š t o je m oguć e manja. Ako se p o st av i Speed, n a p i s an i kod o p t i m izi r a se t ako d a hrz i n a izvršavanja p r ogr am a bude što veća. Optimize for
m ož
e
poprimiti d v ij e vrijednosti, Speed
ljan jem opcije Size prog ram se p re v o d i tako da izvršna
Use register variables može poprimiti dvije vrijednosti On i Off, čime se odre(tuje upotreba registarskih var ijab li . Ako se navedena opcija p os t av i na Off, tada se II prog ram u ncće kori s tit i reg i s t arsk e va r ij a bl e , bez obzira da li su one dek];triran e u program1J ili ne. Ako je v r ij e dn os t opcije On, tada će prevo dilac koristiti m ak s i m al n o mogući broj registarskih varijahli.
Registcr optimizaiion p o p r i m a cl vije vr ijedn osti On i Off. Postavlja v rije d n o sti On pam t i se sadržaj pojedinih r e g i s tar a ka.ko bi se i zb j egle red u n d a n t n e op e r acije u čitavanj a u registre. Zbog malog broja registara procesora 8086, (IBM PC / XT računala), vrijednost n av e dene op cij e bi trebalo zadati kao Off, jer većina programa neće radit i k orektno. Is to v rijedi i za programe koj i se prevo d e n a AT računalima, a koji će se iz vod i ti i na IBM PC XT računalima. njem
Jump optimization sažima kod programa tako da izbj egava redl1ndantne s koko ve . Na primjer, kod fun kcija koje i m aju niz nare d b i return, kod z a i zlaz ak i z funkcije u v ijek ć e biti n a istoj adresi. Efekti navedene o pti miz ac ij e
A.
320
Postavljenje optimalnog radnog okruženja
mogu se veoma dohro llOčiti pri izvršavanju programa u modu korak po korak, jer se povratak iz funkcije ohavlja uvijek istom naredbom retum. Source o d re
Identific7'length odrectuje bro j znač.ajnih znakova identifikatora. Vrijed nosti koje se mogu zadati su u opsegu iZllle
Ne mijenjajte za početak vrijednosti opcija navedenog izbora.
Linker
Vr ijedno sti opcija koje se zadaju izborom Linker k or i s te se
programa (linking). Dodatne opcije navedenog slikom A.6. vanja
11 toku povezi
izbora
prikazane su
Map filc može poprimiti dvije v r ije d n o s t i , On i Off, što o<1re
će
se
Initialize segments "kaže" povezivaču (linkct·) da inicijalizira neinicija lizirane segmente. Pretpostavljena v rijednost navedene opcije je Off i nije ju p o treb n o mijenjati. Ako se opcija postavi na On, izvršni program bit će nešto dulji.
Default libmry m o že poprimiti dvije vrije d n os ti On i Off. Koristi se u slučaje v im a kada se n program uključuju moduli (funkcije) koji sn prevedeni nekim drugim prevodiocima, odnosno koji se nalaze u koje nisu sastavni dio TURBO e bihlioteka. Ako je
bibliotekama funkcija
vrijednost opcije
On,
32 1 File Ed i t Run C omp il e Proj ect Opn!il):s Debug B r e ak/watch �---------------------------- Edi�-------------, ------------� compil er ) . IOI!ME . C Line 1 CoI l Insert Indent ro
I
Me dium
Kodel Defines Code generat ion Opt imizat ion S ourc e L- .·, : Errors
L-
•
Errors s t op aft e r 25 Warnings : s t op aft e r 1 00 On D isplay warnings l'()rt abi1.ity warntng� > / 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
me
om ogu ć ava /o n em ogu ćava r aspozn ava nje razlike iz izvornom kodu program a. Pretpos tavljena v ri-
i m alih s l ova u
322
A.
File
Ed it
Run
Compile
Postavljenje op tim aln og ra dnog okruženja
Proj ect
()PU§Il.�
Debug
r------ Edit,------r! o,�"P "J'.e z<" · •• ·· " .·· .· · ••• , · •., ,. · Insert Ind ent T. I C"' L ine 1 Col 1
Break/vatch
---, . , .., , 1 ------..., ' .C • . ' ' ' •. . .....
..
· I IO I AKE
Model Defines Code generat ion Opt imizat ion Sourc e '-
Medium
Errors s t op aft er 2 S Warnings : st op aft er 100 On D isplay v arn ings l'§rtabi1itY ilarIliilgš / · .
. A : lon-port able po �nt�f � oIlversiC)Il / · · · · · .
FS-Zoom
F6-Svit ch
F7-Trace
F8-St ep
F9-Make
FlO-Menu
IUM
Slika A . 5 . Dodatni izbor opcije Portabi li ty warnings
jednost j e O n , slova.
što zn ači
da se II programu
razli k uj u
velika
m al a
Enviro nment
Izb orom op cije Enviro nment n a zaslonu raču n ala otvori t ć e s e p rozor s
(
n ekoliko dod atnih op cij a slika A . 7 ) . Message Tracking m ože p op rimi ti tri v rijed n os t i , Off, C urrent file i
Al l files . Pos t avlj anjem vrijednosti Off, prevo dil ac će j av i t i da su tokom
prevo(tenj a program a n as t al e o drectene greške , mectu tim , n e će ih ispisati u prozor z a p oruke ( Message window) . Ako je vrijedn ost op cije Cu rrent files prevodilac će , u prozor z a greške ispisati samo one greške koje se odnose n a izvorni kod , koji s e n alazi u t renu t n o ak tiv noj datoteci . U slu čaju d a se izvorni kod p rograma n al azi u više o d jedne d at oteke, p oruke o greškam a,
koje su n as t al e u d r u gim datotekam a, neće se ispi sat i . Ako j e n eoph o d n o imati
i
t e greške , vrijednost op cije m ora se postaviti n a All files .
Keep
messages m ože p oprimi t i vrijednos t i Yes i
No.
Ako je vrijed
nost n aveden e op cije Yes , t ad a će sve p oruke o greškam a i u p ozorenj im a
323 File
Edit
Run
Comp ile
Pro j ect
Line 1
Col t
Debug
Opt ioiili
Break/"at ch
------ ------=, �i:i!� l
Edi� Insert Indent T a
r------
er
___,
»
liOIlAKE . C
Map
fil" I�it iai :i.:z e segment s Default librar ies Graphics l ibrary Warn dupl icate s ymbols S t ack "arning Cas e -s ens itive l ink
OH. > On On On On On On
f----- Message -------1 Ft -Help
FS-Zoom
F6- S"it ch
F7-Trace
F8-S t ep
F9-Kake
FlO-Kenu
liUK
Slika A . 6 . Dodatne op cij e izbora Linker pret h o dn o preved ene d atoteke ost ati sačuvan e , a p oruke o greškam a i up ozo renjim a tren u t n o preved ene d atoteke će se d o d a t i na kraj prozora za p oruke.
U
slu čaju v rijednosti
No,
sve p oruke o greškama i u pozorenjima prethodno
prevedene d atoteke brišu se n a p o četku prevo
Config auto save
m ože p oprimi ti d vije vrijednosti On i O ff. Ako j e vri
jedn ost op cije O n , svaki put kad se ob avlj a prevo
Edit
auto save
m ože p oprimi ti d v ije vrijednos t i O n i Off.
Ako s e
vrijedn ost op cije zad a kao O n , T U RB O e će t renu tni sadržaj d atoteke p ohran i t i u vij ek kad se želi n apu s t i t i ure
op cije File - Save.
up) .
Backup files om ogu ćuj e s t varanje rezervne kopij e sadržaj a d at oteke (back Rezervn a kopija s t vara se au tom atski , n akon izbora op cij a File- S ave
A.
324
File
Ed it
Run
Compile
l
Col
l
Opt icirts
Pro j ect
r-----
Lina
Pos t a vljenje optima ln og radn og okru ž e nja
n
Debug
Break/Ilatch
Edit,-------, Comp i l e r
I sert Indent Ta
Linker
-�=�=�__,
IOIAKE . C
. i En"ii6illije!it
��sMge ",;l"a.t:Jdr.g Keep mes sages C onfig aut o save '-
Edit aut o save
Backup f iles Tab s ize Zo omed Il indOllS
AlFFiles lo
Off On On 8
Off
SCl;een s i z e
f-----F l -Help
FS- Zoo.
F6-S w i t ch
Ilessage
F7-Trac e
--------/
F8-St ep
F9-lIake
Fl O-Kenn
IUIf
Slika A . 7 . Opc.ije dodatnog i zbora Environment
ili pritiskom na fun k cij sku t i p ku F 2 .
Ako je vrij e d n o s t On .
n e vrijedi . P ret p o s t avljen a v rijednost j e Tab .'lize o d re
tipku
Tab.
k oj i
se
opcije Off,
navedeno
pOHlIce z n a čka pri t i skom n a
Vrijed n o s t i koje s e mogu zadati navedenom opcijom s u u opsegu
između 2 i 1 6 . P retpostavljena v rijednost je 8 .
Zommcd windows o d re
om ogućuj e
z ad avanje broj a lin ija t ek s t a koj i s e p rikazuje
n a zaslonu račun a.la, 25 ili 43/50 l i n ija .
Broj lin ij a ovisi o m ogućn o s t i m a.
gra.fi čke kartice ugra.(ten e u r aču n alo . Ako je u račun alo l1 gra.(ten a EGA/ /VGA grafi čka kartica, t ad a se m o ž e zadati bilo koji navedeni broj li n ij a . In ače, grafičke kartice H ERC U LES ili C G A omogu ćuj u samo 25 1inija t eks ta.
325 Diredories
Izborom opcijf' D iredories na z aslonu računal a ot vorit će se prozor s n eko liko d o d atnih o p c ij a ( sli ka A.8). File
Run
Edit
C o.p i l e
OpH"l\š
P r o j ect
Debug
B r e ak/watch
r------==- Edi �------_. ---=-=-=----�
L ine 1
Col
1
Insert Indent T,
Comp iler
I OIAIIE . C
L inker Env i ronment
l>hi��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
Zadavanjem vrijednos t i op cija izbora Opt ions post avlja se konfiguracij a
oh j edin jen og radnog okru ženja. Rad ni m okruženjem d e fi ni r an je n ač i n i u vj e t i prevO(tenj a p r og r am a , te s t var an j e izvršne verzij e program a. Logi čki gl e d an o , unutar naved enih o p cij a bi se mogla svrstati i op cij a osnovnog izbo ra Deb ug - opcija So urce debuging . Izb orom opcije S o urce deb uging na zaslonu račun ala ć.e se pojaviti (slika A . 9 ) .
327
File
Edit
Rnn
Compile
Pro j e c t
Opt ions
Debug
Bre ak/vatch
�------�-- Edit �-------. L ine
t
Col
t
Ins ert Indent Tab
Evaluate
Ct rl-F4
Call stack
Ctrl-F3
F ind :funct i on
Re:fresh
d isplay Smart
D isplay s v apping
. On: .....
SO�f� d.".b�ggill$} .
I d# i . i.
>
S t andaIone Ione
f-----
Ft -Help
F5 -Zooa
F6-S v i t ch
S l ika A .9.
Ifessage
F7-Trac e
-------j
FB-S t ep
F9-Ifate
F 1 0-Ifenu
lUK
Opcije dodatnog izbora Source debngillg
debttging m ože p o p rim i ti tri vrije d n os t i , O n , Standaione i No Vrijednosti n avedene opcije odrectuju d a li je pron alaženje i ispravlja nje grešaka m ogu će s a.mo iz o bje d i nj e nog radnog okruženja, sa samost al nim T U RB O D E R U G ER-om , ili će se onemogućiti korištenje programa koji p o m až u II p ron al aženj u i ispravljanju grešaka ( D E B U G ER) . Ako je vrijed nost ove op cij e None izvršavanje programa II modu korak po korak nij e Sout'ce
ne .
mogu će.
Lit erat ura
Brian W . Kemigh an , Dennis M. Ri t chi e ,
( secon d
edi tion ) , P rentice- Hal1 In c . , 1 9 8 8 .
A l Kel1 ey, Ira Poh] , e hy Dissection ,
The
The
e Progmmm ing Language,
EssentiaL" of e Programm ing, The
Benjamin j C u mmi n gs P u hli shi n g Company, Inc . , ] 9 8 7 .
S t ephen G . Kod n on , Patri c H . \Vood , Top ics i n e Programming, P i p eli n e Associates In c . , 1 9 8 7 . Hansen A u gie,
Projicient
C, M i crosoft P ress , 1 98 6 .
Kazalo p ojmova
A d d Wate.h , 1 4
uklj učivanj e
307
adresa
u
izvorni kod ,
opći o b l i k n ared b e , 307
adresa fun kcij e , 1 78
atribu t , 1 1 2 , 273 a u to ,
ad resa p rvog ('.lana m atrie.e , 1 59 ad resa s\j edeć.e s t r u k t ure , 2 1 1
auto , 1 1 3 au tomatske varij able , 1 1 3
ad resa stru k t u r e , 2 0 0 , 204
adresa varijab l e , 1 53 ad resni o p erator & , 3 5 , 109 , 1 5 0 , 1 54 , 205 ak t.ualni argu menti , 1 02
A UTO EXEC . B AT , 6 au tom atska p r e t vorba, 70, 1 05 a u to m a t s k e varij able , 1 1 :3
početn a ad resa polj a, 1 4 3
au tomatsko u vlačenj e tekst a , 1 9
pov r a t n a adresa, 1 2 5 p r i d ruživanj e adrese , 2 0 0
backgrou n d (pozadina) , 22
p r ijenos pod at.aka preko ad rese , J 0 8 ,
1 55 , 1 70
sadržaj s ad rese , 1 5 1 , 1 5 2
baj t , 2 :3 5 , 24 6 , 285
b i blioteka biblioteka fu nkcij a, 1 02 , 259 b i b l i o teka standardnih lJ/I fu n kcij a ,
tek u ća ad resa , 1 5 8
280
vrijednost n a ad resi , 1 09
poziv funkcija iz vlasti tih biblioteka, 305 s t varanj e v]a..,ti tih b iblioteka, 3 0 3 b i n arni me(tuspremnik , 262
ak t u al n i argu menti , 1 02 alfanumeri čk i , 3 1 , 33, 5 2 , 54 aligllment p oravn avanj e , 3 1 8
bin arno s t ablo
all o e. 0 , 2 1 8 , 2 3 2
desno podstablo, 23 1
A N D , 6 7 , n , 250, 253 , 3 1 8 A N S I C , 5 , fa;} , 297
isp is
A NS I key words , ;}20
l ijevo p o dstab l o , 2:1 1 binarni o p e ratori , 63
argc. , argv , 1 8 2
b ioskey 0, 236
arg u m e n t i fu nkcije 3 1 , 3 :3 , 4 3 , 2 1 7 argume n t i fu nkcij e main deklaracij a , 4 2 , 5 8 , 1 00
0,
fun kcij a kao argument , 100
prijenos a r g u m e n a t a , 4 1 , 43 aritmetika, 50, 70, 1 5 5 , 254 ari t metički operator i , 6:3, 79 array, 1:1 7 , 140 :3 0 7 , 308 A SS E M B L E R
sadržaja, 233
korij e n b i n arnog s t a b l a , 22 1
argumen ti
asm ,
naredbi
182
b i t w ise operators , 24 9 , 250 .
blok b lok n a re d bi , 3 1 , 76 , 79, 87 kop iranje b l o ka teks t a , 23 k r aj bloka teksta (Ctrl- K- K ) , 23 p o če t ak b loka teksta ( C t rl- K- B ) , 2 2 premješt.anj e I.>loka t ek s t a , 23 B O R LA N D , 5
break
op cij a B reak- Watch , 1 3 , 38
Ka zalo pojm ova
n a re d ba b r ea k , 8 3 , 94
p r i s t u p članu struk turne va rij a hle , 191
b reak p o i n ts o br iši sve p r e ki d ne točke , 1 5
prekidne točke, 1 5 , 3 8 toggle b re ak p o i n t (Ctrl- F8) , 1 5 b risa nj e dij e l o va tek s t a , 22
razin a član a , 1 9 2 datoteka, 2 5 9 , 26 1 , 276
deskriptor, 26 1 direk tan prijenos pod ataka, 260 d irek tan prist.u p pod acima, 2 8 6
sl ov a , 22
FI L E, 276, 278 , 2 8 2
buffe r , 262
stan d ardne dat.oteke, 2 6 3
B U F F E RS , buffe rs = 20 , 6 b uffer , 94 , 9 5 , 26 1
formatirano u č i t avanj e pod ataka, 290 o t varanj e d at o teke , 276
b uffere d fil e syste m , 26 0
uč i t ava nj e bloka po d ataka , 28 9 u č.itavanj e pod ataka, 2 8 , 2 8 8
call stack
u p is po d atka, 2 7 9
stanj e stoga, 1 4
deb llg
call b y reference p r ij e n o s pod ataka p rek o adrese , 1 08 , 1 09
. op cij a Deb u g , I :� , 38 defaul t L i brary, 320 define
call by value p r ij enos p o d at aka p reko vrijed nost i , 1 07
p repro cesorska n ared b a define, 4 1 , 131 defi nes , :3 1 6
ca:,e se nsi t i ve l i n k , 3 1 2 cast o perator , 7 1 , 1 7 5 , 243
ch ar , 54 c i lj n i , 6 cjelobroj n e konstante, 60 , 1 75 cjelob roj no p olj e , 4 4
d efi n icij a
enumeriranog tipa , 2:39 fu nkcij e , 1 0 0 , 1 77 gl o baln e v ar ij a b l e , 47 simbolič.ke konstante, 4 0 str uk tur ne varij ab le, 1 8 9
cj elobroj ni t i p , 54 cjelobroj ne vrij e d n ost. i , 33 code generation , 3 1 7
unij e , 2 8 7 v l as t i t i h t ip ova p o d a t aka, 24 l dekl aracij a
com mand line a rg u men ts 1 8 2
a rg ume nt i fu nkcij e , 4 4
CON F I G .SYS , 6 co m p ile
autom atske v arij ab l e , 1 1 3
,
o p cij a Co m p il e , 1 2 , 30 I
čl an str u k t ur e , 1 89 jednodimen z i o n ii\no polj e , 4 1
compiler ( p revo d ilac) , 5 , 1 :3 , :3 1 5 , 3 1 6
p olj a b i t o vii, 23 5
continue
naredba wntinlle, 95
p olj a p okaz i vača, 1 6 7 pokazi vač.a, 1 5 1
ad resa člana stru k t ur e , 2 0 1
p o kazi vač.a na struk t u ru , 1 99 reg istarsk e varij abl e , 1 2 0
p okazi vač a n a fu nkcij u , 1 77
član čla n p o lj a , 44
str u k ture, 1 8 9 , 1 9 0
član s tr u k t u r e , 1 89 , 200 član stru k t ll T e n a koj u p o kazuj e po kazi vač , 2 0 9 dekl aracij a članov a stru kture, 1 89
unij e , 2 3 7
po k a zi vač kao član s t r u k t ur e , 208
var ij able, 5 7 dekremen t , 6 4 desno porav n ava nj e , 273 dij elovi teksta
Kazalo pojm ova p r o n a l až e nj e , 24
z amj e n a, 24
poh ranj i vanj e , 24 , 2.5 uč it av a nj e , 2 4 , 2 5 din amičko p r i d r u ž i vanje a d r es e , 200 dinamičke s t r u k t ure p o d at ak a , 1 87 , 2 1 6 din amičko z auz i m anj e i os l o b a đ anj e
m orij e , 2 1 6
me-
fdose 0 , 293 feofO , 284 m usil O, 292
fgetc O ,
fgets 0 ,
2 8 :3 ,
288
FILE
kont rolna stru k t ura F I L E , 262
opcij a F I L E , 10, 1 9
funkcij a maIloc O , 2 1 6 di r e do r i e s , 1 3 , 325
fi l e descr i p t o r , 26 1
do- w h ile
fil tar ,
F I L ES ,
op ći o b l i k , 9 2
tok izvršavanj a, d o d a t. a k , 1 0
92
formatirani izlaz , 270
format-irani u l az , 2 6 7
. BA K , 2 1 E X E , 1 2 , :309 .LI B, 3 1 0 . P RJ , 1 2 , 299 .
.OBJ ,
1 2 , 299
d o d avanj e nov i h elemenata liste, 222
DOS , 5 d u lj i n a t i p ov a p o d ataka, 5 5
a r g u m e n t i fu nkcij e , 4 2 , 4 3 ,
definicija, 1 00 , 205 fun k c ij a vraća p o kaz i vač ,
CI vostruki zaslo n , 1 6
os n o v n a
E d i t Watch o p c ij a Ed i t Watch , 1 4
pokaz i vači i fu nkcije,
eksterne va
fak torijela,
1 2:3
1 76
p o z i v , 34 , 1 00
prijenos stru k t urne v a r ij abl e u funkc ij u , 202
p roto t i p funkcije, 42, 1 28
rek urzivne
funkcije, 1 22
stat ičke funkcije, 1 20
1 87, 2:39,
24 0
p r o mj e n a lokaln i h i globaln i h vari j abli , 1 4
n ared b a exi t" 1 8 extension ( do d a t a k ) , 1 0
1 76
p o k a z i v a č na funkcij u , 1 77
elementi strukt.ure, 1 89 defini cija, 2:19
EXE, 12
1 06
građa, 4 2
poj a m fun kcije, 4 1 1 9 , 2.5
r ij a b l e , 1 1 6
ex i t ,
275
fscanf 0 , 290
dou b l e , 54 fioat , 54
e n v i r o n me n t , l 3 , :H 5 enumerirani t i p p o d ataka, E O F , 284 , 292 , 294 , 2 7 9 eval u ate (Ct rl- F4 )
fo rm at i r an o p re t va r anj e p o d a t ak a , fp r i n tf 0, 2 8 1 fputc 0 , 279 fputs O, 279 fread O, 284 , 289 free 0, 2 1 6
fseek 0, 286 fun kc ij a , 3 0 , :3 1 , 4 1 , 9 9
dvostruka preciznost
editor (urectivač teksta) , 5 , eksp l i c i t n a p re t vo r b a , 7 1 eksterne v a rij a b l e , 1 1 4 d e fi n i c ij a i d e k l a ra c ij a
6
2 :3 4 fopen 0, 2 7 6 format isp isa, 27 1
stru k t urne varij able i
tip
fu n k c ij e ,
fu n k c ij e , 4 2 , 1 0 1 , 1 02 , 1 05
funkcijske t i p k e , l l , 1 2 fwrite O , 280 getche O , 46 get i nfo, 1 2
globalne varij able defi n i c ij a , 47 deklaracij a , 4 7
globalne statič.ke
var ij ab l e , 1 1 9
202
Kazalo pojm ova
332
globalne s t ru kture, 1 90 gnij eŽ<1enj e gn iježelenje kom entara, 3 1 gnij ež
insert , 20 INSTA L L instalac.ij a programa, 6 i n t , 54 integer, 3 3 , 12 , if f> , 6 0 integrated environment objedinjen o radno okru ženj e , 6 , 3 0 9 op timalno radno okruženj e , 3 1 5 inverzno osvij etljena linija, 37 ispis sadržaj a bin arnog stabla, 233 ispis sadržaj a liste , 22 1 i teracij a , 95 i terati vni p ost u p c i , 9 1 , 1 23 izlaz ii ugnijeŽ<1enih petlj i , 98 izvršna verzij a programa, 3f> izrazi , 5 1 , 68 . ari tmetički, 68 logičk i , 68 jedinstveno radno okruženj e , 1 3 , 3 1 5 jednodimenzion alno polje cj elobroj no polje, 4 4 , 1 3 8 n i z znakova, 1 4 1 p olj e znakova, 46 j ednostruko uvj etno grananje, 76 klj u č.ne rij eči , 52 kod programa, 32 komandni p rocesor, I I komen tar, 3 1 gnijež
Kazalo pojmova o z n aka mj est a , 96 oznake, 52 l i nker (sistemski p rogram z a p o vezi va nj e ) , 1 5 , 1 3 , 3 1 5 , 3 20 load ( F:3) o p c ij a Load , 1 0 , 2 1 logički iz razi , 7 7 logički operato r i , 6 5 , 254 I (A N D) , 6 7 I L I (OR) , 6 7 n eg a c ij a ( N OT) , 6 7 operat.or j ed n akosti , 7 7 p ri o r i tet operat.ora, 67 logičke o p e r acij e
A N D , N OT, O R , X O R, 2 5 :3 l okalizar.ij a greške , 308 lokaln a polj a, 1 4 6 lokal n e varij a b l e , 4 7 ,
III
deklarac ij a , 5 8 , 1 1 2 stati č.ke varij ab l e , 1 1 8 long , 55 , 2 7:J ll1ain m ake
0,
33
o p c ij a Make, 30 I 1 :32
makro-definicija,
m akro n ared ba, 1 3 1 malIoc 0 , :3 1 6 m at r i c a , 1 43 me
b i n arn i , 2625 tekstual n i , 2 6 3 međuspremnič.ki sistem d atoteka ' 2 6 0 m emorijske k l ase , 1 1 2 au t.o , 1 1 :3 ex tern , 1 1 :3 stat i c , 1 l :3 register , 1 1 3 memorij a d i namii:'. ko zauzimanje memorij e , 2 16
niz memorij s k i h l okacij a 44 memorij s k i model , :3 09 , :3 1 6 ' message w i n d ow p rozor za ispis poruka, 2 0 , :32 2 m nemon i čka i mena , 52
mnemon i ci kontrole ispisa, 6 1 m o d i fi katori , 5 5
lon g , 55 shor t , .J5 signed , 55
u nsigned , 55 modulo , 63 uadrecten a fu n kcij a, 1 5.5
n aj češće greške, n aredb a
72
bezu vjetni
skok , 7.5 b lo k n ared b i , 3 1 , 7 6 , 7 9 , 8 7 b reak , 9 4 continue , 95
goto , 96 null n ared b a , 76 p o n av lj anj e dijelova programa , 7 5 return , 1 03 switch-case , 8 2 uvj e t n o gran anj e , 7 5 n aredb e uređi vača teks t a , 2 5 neinic.ij alizi rani p okazivač , 1 73 niz z n a k o va , 6 2 , 1 3 1 , 1 4 1 , 1 64 , 1 66 , 1 70 konstanta n i z a zn akova, 6 1 n u m e ričk a vrij ednost , 6 2 n i z varij a bl i , 80 N U L L , 2 1 2 , 278 objedinjeno radno okruženj e , 5 , 8, 3 1 6 . ok talne k o n s t a n t e , 6 0 op erator sizeof 0 , 1 3 9 , 2 4 9 , 2 5 5 o peracije nad s t r u k t ur a m a , 1 9:3 operatori za rad s b i tovima, 250 opseg p o d ataka, .5 5 opt m alno radno o k ru ženj e , 9 , 3 1 6 optIOns opcija osnovnog izbora, 1 :3 oslob aetanj e memorij e , 2 1 7
�
osnovne n are d b e , 2 2 osnovni izbor, 9 osnovn i ti povi p o d at aka, 51, 54
osnov ni z aslo n , 8 otvaranj e d atoteke, 276 overwrite, 20 oznaka k r aj a n ared h e , 1 0 1 oznaka formata, 2 6 8
p arametri p e t lj e , 8 8 poče t n a adresa, 1 65 p o drui:'j e dj elovanj a varij ahle , 5 8
Kazalo pojmova
334 podstab l o , 2:3 1
poh ranj i vanje teksta, 1 9 , p o lj a ,
4 4 , 1 38 , 1 5 9
prevo(1enj e program a, 35, 299, 309 p reusmjeravanj e u l az- i z l az , 294
24
i l l i c ij alizacij a , 1 4 6 j e d n od i me n z i o n al n o cj elob roj n o ,
1 87
p o lj e b i tova,
polj e pokazi vača,
44
1 66 , 1 69
4 4 , 46 , 1 38 , 144 prij enos u fu nkcij u , 1 6 1 vektor, 1 3 9 p okaz i vači , l l , 1 49 , 1 50 argument. funkcij e , 1 55 aritmetika pokaz i vača , 1 5 6 deklaracij a i i n i c ij al i z acij a, 1 5 1 , 1 67 , l n , 1 78 pokazi vači i fu n kcij e , 1 76 polj e z n akova,
pokazi vači na fu n k c ij e , 1 77
171 1 99 problemi s p o kazi vačim a , 1 72 p okaz i vač kao čl an strukture, 208 p okazi vač n a d atotek u , 276 , 278 pomoć , 1 6 , 38 p o kazi vači na pokazi vače , p okazi vač.i n a stru k t ur e ,
postfik s , 6 4
2:34
povratn a adres a , I I I
P RJ , 1 2
20 l
p rogram ,
30
programska p e tlj a
92 39, 8 6 while, 90 P ROJ ECT, 298 do-while,
for ,
24 4 :3 , 1 0:3 , 1 28
p ronalaženj e d ij elova tcckst a , prototip funkcij e , p u t c O , 279
raz b ij anj e i zvornog koda, 298
realni broj e v i , 33 real ne konstante " realloc
O, 2 1 6
redirekcij a,
60
294
rel acij a ,
1 00
234
preprocesorske n ared b e ,
2 2 , 23
1 29 , 1 30
#define, 1 3 0 , 1 3 1
# if, # ifdef,
1 30 , 1 3.5
302
1 30 , 1 :35
6 5 , 1 .5 8 , 2.5 4 .
3 5 , 30 l 316
relokatibilni obli k , retrieve op t i ons , retu r n ,
1 0 1 , 1 03
s amoreferentne stru k t ure , scanf O, 267 shor t , 55
smal l , 3 1 6 signed , 55
,
pretvorba t i pova p o d at aka,
67
save op tions , :3 1 6 , :326
1 36
1 30 , 1 :3 6 1 :34 , 1 :36 pretraž i vanj e l ist.e, 2 1 9 , 223
prioritet ,
opcij a osnov nog izbora,
# pragm a ,
# u n def, 1 :3 0
1 0 7 , 1 22
RUN
#error, 1 :3 0 , 1 :3 5
# ifn d ef, 1 3 , 1 :3.5 # i nline, 1 :3 0 , 1 :34 , # i n c l u d e , 1 :30
1 22 , 23 1
relacij ski operatori ,
premještanj e d ij elova teksta,
# else , #el i f,
rek urz ij a ,
rekur z i v n e fun kcij e ,
reku rz i v ne s t ru k ture, 2 1 1
pozad i n a ( b ackgrou n d ) , 22
preorder ,
258
p r istup članovima stru k ture,
registar , 1 1 3
povezivanj e v l as t i t i h b i b l ioteka, :305
64
3 3 , 4 4 , 1 07 ,
registarske varij able, 1 20
212, 2 16 povezivanj e ( li n k i n g) , 1 2
prefi k s ,
1 08 , 20:3 printf O, 30
red undantnos t , 56
povezan a lista,
poz i v fun kcij e ,
p r ij enos p odataka 1l f1lnkcij e ,
prioritet operatora,
polj e str u k tura, 1 93
postorder ,
prij evremeni završetak fun kcij e , 1 04 p r ij evremeni z avršetak petlj e , 94
69, 242
side efect , 64 , 1 6:3 simboličke konstan t e ,
40
35, 3 0 1
20 1 , 2 :3 1
Kazalo pojmova
335
sizeof 0, 1 39 , 2 4 9 , 2 5 5 , 288 sour ce d e b u g i ng
u č i t av anj e po d a t k a , 283 , 2 8 8 , 289 uč i tavanje s ad r ž aj a , 2 1 , 24 u k lj u č i v anj e naredbi A S SEMB LER-a,
op c ij a Debugj Watch , 1 4 s p re m n i k (butfer) , 262, 263
307 unarni operator , 6 3 , 6 4 , 1 5 0 , 1 5 1 , 1 7 1 , 2 0 0 , 243
sprintf O, 274 sscanf 0, 2 7 4
stack overft ow , 204
un ij e , 1 8 7 , 237
stand ard ne biblioteke fu n k c ij a , 35, 2 5 9 st an d a r d n e d atoteke , 263 u l az , izlaz, datoteka greša ka , 263 stand ard n i i z l az , 26 1 stan dard n i u l az , 26 1 static, 1 1 :3 statičke funkcije, 1 20
status l i nij a, 20
unos te ks t a , 1 0 unsigned , 5 5 u p is p o d at ak a , 279 ure(1ivač. t e kst a , 1 9 u vj e t p o n avlj a nja p et lj e , 8 7 , 9 0 , 92 u vj e t izlaska iz re k ur zi vn e funkcij e , 125 u vj e t n a gr a n anj a , 7 5 je d nost ru ka , 7 7 v išes t r u ka , 7 8 u vj e t ni izraz , 7 9 , E l3
stdaux , 2 64
uvjetni operator ? , 256
statičke v arij ab l e , 1 1 8 stat.i čko p r i d r t l ž i vanj e a d rese ,
200
s t d e r r , 2 6 :3 stdi n , 2 6 3
va rij a b l e, 3 1 au t om ats k e
st do u t , 2 6 3 s t d p rn , 2 6 4 stog (st.ack ) , 4 4 , string, 4 6 , 1 4 1
I l l , 1 24
s t r i n g constan t , 6 1 stru k t u r a , 1 79
d e k l a r ac ij a, 1 89 de fi n i cij a stru k t. u rne varij ab l e , 1 89 i {lentifikat.o r , 1 8 9 pokazi vači na st ru k t u re , 1 89 stru k t ur a u Il u tar s trn k t u re , 1 92
p ro gram a , :W , :3 1 stru kt.u rne varijab l C' , 202
st ru k tura e
stru k t. u r n i operator , 1 9 1 s w i t.ch-case nared b a , 82
TA S M ,
308
Tee , 3 1 0 tekst ual n i me(tus p remn i k
a dres a , 1 57 ter m i n a tor ( g r an i č n i k ) , :3 1 t e r n a rni o p e r a t. or , 2 5 6 t i p o v i fu n k cij a , 1 05
teku ć a
točka operator , 2:3 8 T L I B , :30 3 trace m o d e , 1 :3
T U RBO C, 5 ty p e d ef, 1 87 , 24 1
var ij ab l e ,
1 13
dekl aracij a , 33 , 58 , 1 1 2 definicij a , 47 ek s t ern e va r ij a ble , 1 1 4 gl o b a l n e v ar ij a b le , 47 globalne statičke, 1 1 8 , 1 1 9 i n i cij a li zacij a , 5 9 lokalne stat i čke , 1 1 9
lokal ne va r ij ab l e , 4 :3 , 4 7 , I I I p odru čj e dj el o v a nj a , 58 statičke va r ij ab l e , 1 1 8 vek t or , 1 :39 višedimenzion alna p o lj a , 1 42 višestruka grananja, 8 1 višestruka in direkcija, 1 72 v i š es t r u k a u vje t na g r an a nj a , 78 v l as ti t e bibl ioteke funkcij a, 303 vo i d , 5 4 , 1 0 2 , 1 75
(stream) ,
2 62
vrijednost s adrese , 1 09 v ruć e t ip ke ( Ho t keys) ,
17
zarez operator, 249 , 257 zaslon ( sc r e e n ) , 8 , 2 0 za t var anj e datoteke , 2 9 2 , 2 93 značaj ni znakovi, .5 2 z n a č k a ( cu r s o r ) , 1 2 , 1 7 , 1 9 }) om i c a nj e z n ač k e , 22 z n ak o v n e k o ns t an t e , 60
Izdavačko poduzeće "Školska knjiga« Zagreb, Masarykova 28
Za izdavača: mr.
M I LJ E N KO ŽAG AR K orek tori : ANTE TERZIĆ: NA DA A N IĆ:
II
Tiskanje završeno kolovozu 1 9 9 1 . godine
mj esecu
N aklada: 1 500
primjeraka