Sunteți pe pagina 1din 287

Limbajul de programare C

Brian W. Kernighan Dennis M. Ritchie

CONINUT Prefa ................................................ .. 3 Capit !"! #. ....................................... % Capit !"! &. Iniiere ......................................... ' &.& P rnirea............................................... ' &.( )aria*i!e si arit+etica .................................... , &.3 Instr"ci"nea - r ......................................... &# &.% C nstante si+* !ice....................................... && &.. O c !ecie $e pr gra+e "ti!e.................................. && &./ Ta*! "ri ............................................... &. &.' -"ncii ................................................ &/ &., 0rg"+ente 1 ape!"! prin 2a! are................................ &' &.3 Ta*! "ri $e caractere....................................... &, &.&# D +enii. )aria*i!e e4terne.................................. &3 &.&& Re5"+at............................................... (&
3

Intr $"cere

Capit !"! (. Tip"ri $e $ate6 perat ri si e4presii......................... (( (.& N"+e $e 2aria*i!e......................................... (( (.( Tip"ri!e si +ri+ea $ate! r .................................. (( (.3 C nstante .............................................. (( (.% Dec!araii.............................................. (3 (.. Operat ri arit+etici....................................... (% (./ Operat ri re!ai na!i si ! gici ................................ (% (.' C n2ersii $e tip......................................... (. (., Operat ri $e incre+entare si $ecre+entare ........................ (' (.3 Operat ri ! gici pe *ii..................................... (, (.&# Operat r"! si e4presii $e asignare.............................. (3 (.&& 74presii c n$ii na!e...................................... 3# (.&( P n$ere si r$ine $e e2a!"are................................ 3# Capit !"! 3. C ntr !"! e4ec"iei................................... 3( 3.& Instr"cii si *! c"ri........................................ 3( 3.( If1 e!se................................................ 3(
4

3.3 7!se if................................................33

3.% 89itch................................................ 33 3.. B"c!e 1 9hi!e si f r ....................................... 3% 3./ B"c!e $ 19hi!e .......................................... 3/ 3.' Brea: ................................................ 3' 3., C ntin"e............................................... 3, 3.3 ; t 1"ri si etichete........................................ 3, Capit !"! %. 8tr"ct"ra pr gra+e! r si f"ncii! r.......................... 33 %.& N i"ni $e *a5a........................................... 33 %.( -"ncii ce ret"rnea5 ne1<ntregi ................................ %& %.3 0rg"+ente!e f"ncii! r ...................................... %( %.% )aria*i!e e4terne.......................................... %( %.. Reg"!i $espre $ +enii ...................................... %. %./ )aria*i!e statice .......................................... %' %.' )aria*i!e registr" ......................................... %, %., 8tr"ct"ra $e *! c.......................................... %,
5

%.3 Iniia!i5are.............................................. %3 %.&# Rec"rsi2itate............................................ .# %.&& Prepr ces r"! C.......................................... .& Capit !"! .. P interi si ta*! "ri.................................... .3 ..& P interi si a$rese.......................................... .3 ..( P interi si arg"+ente $e f"ncii................................. .% ..3 P interi si ta*! "ri ......................................... .. ..% 0rit+etica a$rese! r ........................................ .' ... P interi !a f"ncii pe caractere.................................. ., ../ P interii n" s"nt <ntregi....................................... /# ..' Matrici +"!ti1 $i+ensi na!e.................................... /& .., Matrici $e p interi= p interi !a p interi ............................ /( ..3 Iniia!i5area +atrici! r $e p interi................................ /3 ..&# C +paraie P interi 1 Matrici +"!ti1 $i+ensi na!e..................... /% ..&& 0rg"+ente a!e !iniei $e c +an$a................................ /% ..&( P interi !a f"ncii.......................................... //
6

Capit !"! /. 8tr"ct"ri ........................................... /3 /.& N i"ni $e *a5a ........................................... /3 /.( 8tr"ct"ri si f"ncii.......................................... '# /.3 Matrici $e str"ct"ri......................................... '& /.% P interi !a str"ct"ri......................................... '3 /.. 8tr"ct"ri a"t 1 referite....................................... '. /./ C"tarea ta*e!ara.......................................... '' /.' i+p"ri >?fie!$s?@......................................... ', /., Uni"ni................................................. '3 /.3 Definire $e tip >?tApe$ef?@ ................................... ,# Capit !"! '. Intrri si ieBiri....................................... ,( '.& 0cces"! !a *i*!i teca stan$ar$................................. ,( '.( Intrri si ieBiri stan$ar$ 1 getchar si p"tchar ........................ ,( '.3 IeBire c" f r+at 1 printf ..................................... ,3 '.% Intrare c" f r+at 1 scanf ..................................... ,% '.. C n2ersie $e f r+at in +e+ rie............................... ,.
7

'./ 0cces !a .......................................... ,/ '.' Tratarea er ri! r 1 st$err e4it................................ ,' '., Cinia in intrare ieBire..................................... ,, '.3 Di2erse f"ncii........................................ ,3

fiBiere si si a!te

Capit !"! ,. Interfaa c" siste+"! UNID.............................. ,.& Descript ri $e fiBier........................................ ,.( IntrriEieBiri $e ni2e! inferi r 1 rea$ si 9rite......................... ,.3 Open6 Creat6 C! se6 Un!in:............................. ,.% 0cces $irect 1 see: si !see:........................... ,.. 74e+p!" 1 f pen si getc i+p!e+entat.................... ,./ 74e+p!" 1 !istarea $irect r"!"i........................ ,.' 74e+p!" 1 a! cat r $e +e+ rie..........................

0ppen$i4 0. Man"a! $e referina a! !i+*aF"!"i C ....................... 3# &. Intr $"cere .............................................. 3# (. C n2enii !e4ica!e.......................................... 3# 3. N taii $e sinta4a .......................................... 3& %. Ce este intr1"n n"+e G ....................................... 3& .. O*iecte si ?C2a! ri? ........................................ 3(
8

/. C n2ersii................................................ 3( '. 74presii................................................ . 33 ,. Dec!araii............................................... . 3, 3. Instr"ci"ni ..............................................&#% &#. Definiii e4terne ..........................................&#/ &&. Reg"!i referit are !a 2i5i*i!itate ................................&#' &(. Cinii $e c ntr ! a! c +pi!at r"!"i ..............................&#, &3. Dec!araii i+p!icite ........................................&#3 &%. Re5"+at $espre tip"ri ......................................&#3 &.. 74presii c nstante.........................................&&& &/. C nsi$eraii $espre p ta*i!itate................................&&& &'. 0nacr nis+e ............................................&&& &,. Re5"+at"! sinta4ei ........................................&&( In$e4.................................................. ..

PREFAA C este "n !i+*aF $e pr gra+are c" sc p genera! a!e cr"i caracteristici s"nt ec n +ia $e e4presie6 str"ct"ri + $erne $e c ntr ! a! f!"4"!"i si $e $ate6 prec"+ si "n set * gat $e perat ri. C n" este "n !i+*aF $e ni2e! ?f arte <na!t?6 nici ?+are?6 si n" este specia!i5at 2re"nei arii partic"!are $e ap!icaii. Dar a*senta in restricii si genera!itatea sa ! fac +ai c n2ena*i! si +ai $e efect pentr" +ai +"!te sc p"ri $ecHt !i+*aFe pres"p"se +ai p"ternice. C a f st !a <ncep"t pr iectat si i+p!e+entat pe siste+"! $e perare UNID pe D7C PDP&& $e ctre Dennis Ritchie. 8iste+"! $e perare6 c +pi!at r"! C si in + $ esenia!6 t ate pr gra+e!e $e ap!icaii a!e !"i UNID >inc!"si2 s ft9are1"! f ! sit pentr" a pregti cartea aceasta@ s"nt scrise in C. C +pi!at are $e C e4ista $e ase+enea si pe +ai +"!te a!te ca!c"!at are6 intre care IBM 8Aste+E3'# I neA9e!! /### si Inter$ata ,E3(. C n" este !egat $e nici "n har$9are sa" ca!c"!at r an"+it si e si+p!" $e scris pr gra+e care se p t e4ec"ta fr nici + $ificare pe $iferite ca!c"!at are care a" !i+*aF"! C i+p!e+entat. 0ceasta carte are $rept sc p sa1! aF"te pe citit r sa <n2ee sa pr gra+e5e in C. 7a c nine iniiere6 pentr" ca n ii "ti!i5at ri sa p at <ncepe cit +ai repe$e p si*i!6 capit !e separate pentr" fiecare caracteristica +aF ra6 si "n +an"a! $e referina. Marea parte a te4t"!"i n" se *a5ea5 atHt pe e4p"nerea $e reg"!i si pr p 5iii cit pe citirea6 scrierea si re2i5"irea $e e4e+p!e. In cea +ai +are parte e4e+p!e!e s"nt pr gra+e rea!e si s"nt c +p!ete si n" frag+ente i5 !ate. T ate e4e+p!e!e a" f st testate $irect $in te4t6 care este intr1 f r+a citi*i! pe ca!c"!at r. Pe !Hng fapt"! ca a+ artat c"+ se "ti!i5ea5 efecti2 !i+*aF"!6 a+ <ncercat in p!"s6 ac ! "n$e era p si*i!6 sa1! i!"stra+ c" a!g rit+i "ti!i si c" principii $e *"n sti! in pr gra+are si pr iectare snt as. 0ceasta carte n" este "n +an"a! intr $"cti2 $e pr gra+are. 7a pres"p"ne an"+ite fa+i!iariti c" c ncepte!e $e *a5a $in pr gra+are6 ca 2aria*i!e6 instr"ci"ni $e asignare6 *"c!e6 f"ncii. C" t ate acestea6 "n pr gra+at r n 2ice 2a fi in stare sa citeasc cartea si sa1si <ns"Beasc !i+*aF"!6 chiar $aca aF"t r"! "n"i c !eg c" e4periena +ai +are i1 ar "B"ra +"nca f arte +"!t. In e4periena n astr6 C s1a $ 2e$it "n !i+*aF
10

p!c"t6 e4presi2 si a$apta*i! pentr" +are 2arietate $e pr gra+e. 7ste "B r $e <n2at si ?se p arta *ine? pe +s"ra ce e4periena in pr gra+are c" e! creste. 8pera+ ca aceasta carte 2 2a aF"ta sa1! f ! sii *ine. Brian W. Kernighan Dennis M. Ritchie

11

CAPITOLUL 0 INTRODUC7R7 C este "n !i+*aF $e pr gra+are c" sc p genera!. 7! este p"ternic !egat $e siste+"! UNID6 $e arece a f st $e52 !tat pe acest siste+ si $e arece UNID1"! si s ft9are1"! sa" s"nt scrise in C. C" t ate acestea6 !i+*aF"! n" este !egat $e "n an"+e siste+ $e perare sa" ca!c"!at r= si6 $eBi a f st n"+it ?!i+*aF $e pr gra+are siste+?6 $e arece este "ti! in scrierea siste+e! r $e perare6 e! a f st f ! sit !a fe! $e *ine in scrierea $e pr gra+e i+p rtante ce tratea5 pr *!e+e n"+erice6 pre!"crri $e te4te sa" *a5e $e $ate. C este "n !i+*aF re!ati2 ?$e ni2e! inferi r?. 0ceasta caracteri5are n" este pei rati2a= ea <nsea+n p"r si si+p!" ca C perea5 c" aceeaBi c!asa $e *iecte c" care !"crea5 +aF ritatea ca!c"!at are! r6 si an"+e caractere6 n"+ere si a$rese. 0cestea p t fi c +*inate si pre!"crate c" perat ri arit+etici si ! gici i+p!e+entai pe act"a!e!e ca!c"!at are. C n" p se$a peraii pentr" a pre!"cra $irect *iecte c +p"se6 c"+ ar fi Bir"ri $e caractere6 +"!i+i6 !iste sa" ta*! "ri c nsi$erate ca "n <ntreg. N" e4ist nici ana! gie6 $e e4e+p!"6 c" peraii!e $in PCE& care +anip"!ea5 "n <ntreg ta*! " sa" Bir. Ci+*aF"! n" $efineBte nici a!ta faci!itate $e a! care $e +e+ rie in afara $e $efiniii!e statice si $e !"cr"! c" sti2a f ! site $e 2aria*i!e!e ! ca!e a!e f"ncii! r= n" e4ista c !ecii re5i$"a!e sa" $e gr+e5i ca in 0!g ! /,. In sfHrBit6 !i+*aF"! C in sine n" are faci!iti $e intrare1ieBireJ n" e4ista instr"ci"ni R70D sa" WRIT7 si nici +et $e $e acces !a fiBiere6 ?ca*!ate? in !i+*aF. T ate aceste +ecanis+e $e ni2e! <na!t tre*"iesc fc"te prin ape!"ri e4p!icite $e f"ncii. In + $ si+i!ar6 C fer n"+ai c nstr"cii $irecte6 !iniare $e c ntr ! a! f!"4"!"iJ teste6 *"c!e6 gr"pri6 si s"*pr gra+e6 insa n" +"!tipr gra+are6 peraii para!e!e6 sincr ni5ri sa" c r"tine. C" t ate ca a*senta acest r caracteristici ar prea gra2a $eficienta >?)rei sa sp"i ca tre*"ie sa ape!e5 f"ncie pentr" a c +para $ "a Bir"ri $e caractere G?@6 pstrarea !i+*aF"!"i !a $i+ensi"ne + $esta a a$"s *eneficii rea!e. De arece C este re!ati2 +ic6 e! p ate fi $escris intr1"n spai" re$"s si <n2at repe$e. Un c +pi!at r pentr" C p ate fi si+p!" si c +pact. C +pi!at are!e s"nt $e ase+enea "B r $e scris= f ! sin$ tehn ! gia c"renta6 ne p"te+ aBtepta !a "n ti+p $e cHte2a !"ni pentr" scrierea "n"i c +pi!at r
12

n " si sa a2e+ s"rpri5a ca ,#K $in c $"! n "!"i c +pi!at r este c +"n c" ce!e e4istente. 0ceasta $ 2e$eBte +are!e gra$ $e + *i!itate a !i+*aF"!"i. De arece tip"ri!e $e $ate si str"ct"ri!e $e c ntr ! p se$ate $e C s"nt s"p rtate $e +aF ritatea ca!c"!at are! r e4istente6 *i*!i teca necesara e4ec"iei Lr"n 1 ti+eM necesara pentr" a i+p!e+enta pr gra+e!e in$epen$ente este +in"sc"!a. Pe PDP1&&6 $e e4e+p!"6 ea c nine n"+ai r"tine!e pentr" <n+"!irea si <+prirea pe 3( $e *ii si s"*r"tine!e ce rea!i5ea5 sec2ene!e $e <ncep"t si $e sfHrBit. Desig"r6 fiecare i+p!e+entare p se$a *i*!i teca c"prin5t are si c +pati*i!a $e f"ncii pentr" a <n$ep!ini f"ncii!e $e IEO6 a trata Bir"ri!e si peraii!e $e a! care $e +e+ rie $ar6 $e arece se ape!ea5 n"+ai e4p!icit6 p ate fi e2itata $aca e ne2 ie= ea p ate fi scrisa p rta*i! chiar in C. Din n "6 $e arece !i+*aF"! ref!ecta capaciti!e ca!c"!at are! r c"rente6 pr gra+e!e C tin$ sa fie s"ficient $e eficiente astfe! ca n" e4ista nici c nstrHngere pentr" a !e scrie in !i+*aF"! $e asa+*!are. Ce! +ai e2i$ent e4e+p!" in acest sens este chiar siste+"! $e perare UNID6 care este scris apr ape in <ntregi+e in C. Din ce!e &3### $e !inii $e c $ a!e siste+"!"i6 n"+ai apr 4i+ati2 ,## $e !inii $e !a ni2e!"! ce! +ai $e F s s"nt scrise in !i+*aF"! $e asa+*!are. In p!"s6 s ft9are1"! pentr" t ate ap!icaii!e UNID esenia!e este scris in C= +area +aF ritate a "ti!i5at ri! r UNID >inc!"si2 "n"! $in a"t rii acestei cri@ nici +car n" c"n sc !i+*aF"! $e asa+*!are a! !"i PDP1&&. C" t ate ca C se p tri2eBte c" caracteristici!e +"!t r ca!c"!at are6 e! este in$epen$ent $e arhitect"ra ricr"i ca!c"!at r partic"!ar si astfe!6 c" p"tina griFa6 este "B r a scrie pr gra+e ?p rta*i!e?6 a$ic pr gra+e care p t fi r"!ate fr + $ificri pe 2arietate $e ca!c"!at are. In +e$i"! n str" este $eFa "n fapt *iBn"it ca pr gra+e!e $e52 !tate pe UNID sa fie transp rtate pe siste+e!e I neA9e!!6 IBM si Inter$ata. In rea!itate6 c +pi!at are!e $e C si s"p rt"! $e e4ec"ie pentr" aceste patr" tip"ri $e ca!c"!at are s"nt +ai c +pati*i!e $ecHt 2ersi"ni!e pres"p"se stan$ar$ 0N8I pentr" -ORTR0N. 8iste+"! $e perare UNID <ns"Bi se e4ec"ta ac"+ atHt pe PDP1&& cit si pe Inter$ata ,E3(. In afara pr gra+e! r care6 in + $ necesar6 s"nt <ntr"cHt2a $epen$ente $e tip"! $e ca!c"!at r6 caJ asa+*! r"!6 c +pi!at r"!6 $epanat r"! 1 s ft9are1"! scris in C este i$entic pe a+*e!e ca!c"!at are. Chiar in ca$r"! siste+"!"i $e perare6 '### $e !inii $e c $6 in afara s"p rt"!"i pentr"
13

!i+*aF"! $e asa+*!are si han$!ere! r $isp 5iti2e! r $e IEO este i$entic in pr p rie $e 3.K. Pentr" pr gra+at rii fa+i!iari c" a!te !i+*aFe6 se p ate $ 2e$i "ti! sa +eni na+ cHte2a aspecte ist rice6 tehnice si fi! s fice !egate $e C6 pentr" c ntrast si c +paraie. M"!te $in ce!e +ai i+p rtante i$ei $in C <Bi a" r$cina in !i+*aF"! $e ac"+ s"ficient $e *trHn6 $ar <nc 2ia*i! 1 BCPC6 $e52 !tat $e Martin Richar$s. Inf!"enta !"i BCPC as"pra !"i C apare in$irect prin !i+*aF"! B6 care a f st scris $e Ken Th +ps n in &3'# pentr" pri+"! siste+ UNID pe "n PDP1'. C" t ate <+prtBeBte +"!te caracteristici esenia!e c" BCPC6 !i+*aF"! C n" este in nici "n sens "n $ia!ect a! acest"ia. Ci+*aFe!e BCPC si B s"nt !i+*aFe ?fr tip"ri?LtApe!essMJ sing"r"! tip $e $ata este c"2Hnt"! +aBina6 si acces"! !a a!te tip"ri $e *iecte se face c" perat ri specia!i sa" ape!"ri $e f"ncii. In C *iecte!e >$ate!e@ f"n$a+enta!e s"nt caractere!e6 <ntregii $e $iferite $i+ensi"ni si n"+ere!e f! tante. In p!"s6 e4ista ierarhie $e tip"ri $e $ate $eri2ate create c" p interi6 ta*! "ri6 str"ct"ri6 "ni"ni si f"ncii. Ci+*aF"! C p se$a c nstr"cii!e f"n$a+enta!e pentr" c ntr !"! f!"4"!"i necesare pentr" pr gra+e!e *ine str"ct"rateJ gr"pare $e instr"ci"ni= !"are $e $eci5ii >?if?@= *"c!are c" test $e ter+inare !a <ncep"t >?9hi!e?6 ?f r?@ sa" !a sfHrBit >?$ ?@6 se!ectare a "n"i ca5 $intr1 +"!i+e $e ca5"ri p si*i!e >?s9itch?@. >T ate acestea era" 2a!i$e si in BCPC6 chiar $aca c" sinta4a $iferita= acest !i+*aF anticipa 2 ga pentr" ?pr gra+are str"ct"rata? c" +ai +"!i ani <nainte@. Ci+*aF"! C f ! seBte p interi si are a*i!itatea $e a face arit+etica c" a$rese. 0rg"+ente!e f"ncii! r s"nt pasate c piin$ 2a! area arg"+ent"!"i si este i+p si*i! pentr" f"ncia ape!ata sa + $ifice arg"+ent"! rea! $in ape!ant. CHn$ se $ reBte sa se *in "n ?ape! prin referina?6 se tri+ite e4p!icit "n p inter6 iar f"ncia p ate + $ifica *iect"! !a care p"nctea5 p inter"!. N"+e!e $e ta*! "ri s"nt tri+ise ca ! caie a riginii ta*! "!"i6 aBa ca arg"+ente!e ta*! "ri s"nt efecti2 ape!"ri prin referina. Orice f"ncie p ate fi ape!ata rec"rsi2 si 2aria*i!e!e sa!e s"nt tipic ?a"t +ate? sa" create n " c" fiecare in2 care. Definiii!e $e f"ncii n" p t fi i+*ricate $ar 2aria*i!e!e p t fi $ec!arate in +aniera $e *! c str"ct"rat.
14

-"ncii!e "n"i pr gra+ C p t fi c +pi!ate separat. )aria*i!e!e p t fi interne "nei f"ncii6 e4terne $ar c"n sc"te n"+ai intr1"n sing"r fiBier s"rsa6 sa" c +p!et g! *a!e. )aria*i!e!e interne p t fi a"t +ate sa" statice. )aria*i!e!e a"t +ate p t fi in registre pentr" eficienta +rita6 $ar $ec!araia $e registr" este n"+ai interna c +pi!at r"!"i si n" se refera !a 2re"n registr" specific a! ca!c"!at r"!"i. Ci+*aF"! C n" este "n !i+*aF p"ternic tipi5at in sens"! !"i P08C0C sa" 0!g ! 1 /,. 7! este re!ati2 !i*era! in c n2ersia $e $ate6 c" t ate ca n" c n2erteBte a"t +at tip"ri!e $e $ate c"+ ar fi PCE&. C +pi!at are!e e4istente n" p se$a 2erificare !a e4ec"ie a in$ici! r e!e+ente! r $e ta*! "ri6 tip"ri! r arg"+ente! r6 etc. Pentr" ace!e sit"aii in care se cere p"ternica 2erificare a tip"!"i6 se f ! seBte 2ersi"ne separata a c +pi!at r"!"i. 0cest pr gra+ se n"+eBte ?!int? $e arece tria5 *iii $"*i Bi f f!"ff $intr1"n pr gra+. 7! n" generea5 c $6 2erifica n"+ai f arte strict +"!te aspecte a!e pr gra+e! r aBa c"+ p t fi 2erificate !a c +pi!are si !a <ncrcare. 7! $etectea5 nep tri2iri!e $e tip6 f ! sirea inc nsistenta a arg"+ente! r6 2aria*i!e!e nef ! site sa" aparent neiniia!i5ate6 $ific"!ti!e p tenia!e $e p rta*i!itate si a!te ase+enea aspecte. Pr gra+e!e care trec c" *ine aceasta 2erificare6 c" cHte2a e4cepii6 se e!i*erea5 $e er ri!e $e tip !a fe! $e c +p!et ca si6 $e e4e+p!"6 pr gra+e!e scrise in 0!g ! /,. ) + +eni na si a!te capaciti a!e !"i ?!int? at"nci cHn$ ni se 2a i2i ca5ia. In fine6 !i+*aF"! C6 ca si a!te !i+*aFe6 are $efecte!e sa!e. Unii $in perat ri a" p n$ere greBita= parte sa" pari a!e sinta4ei ar fi p"t"t fi +ai *"ne= e4ista +ai +"!te 2ersi"ni a!e !i+*aF"!"i $iferin$ f arte p"in "na $e a!ta. C" t ate acestea6 !i+*aF"! C s1a $ 2e$it a fi "n !i+*aF e4tre+ $e eficace si e4presi2 pentr" !arga 2arietate $e ap!icaii $e pr gra+are. Rest"! crii este rgani5at $"p c"+ "r+ea5. Capit !"! & este iniiere in partea centra!a a !i+*aF"!"i C. 8c p"! !"i este sa fac citit r"! sa <nceap sa pr gra+e5e in C cit +ai repe$e p si*i!6 $e arece n i cre$e+ p"ternic ca sing"r"! + $ $e a <n2a "n !i+*aF n " este $e a se scrie pr gra+e in e!. ?Iniierea? pres"p"ne c"n aBtere a e!e+ente! r $e *a5a a!e pr gra+rii= n" se $a" e4p!icaii $espre ca!c"!at are6 c +pi!at are si nici $espre se+nificaia "n r e4presii ca6 $e e4e+p!"6 n N n O &. C" t ate
15

ca a+ <ncercat pe cit p si*i! sa arta+ tehnici $e pr gra+are "ti!e6 cartea aceasta n" se 2rea $e referina in str"ct"ri $e $ate si a!g rit+i= cHn$ a+ f st f rai sa a!ege+6 ne1a+ c ncentrat as"pra !i+*aF"!"i. Capit !e!e (1/ $isc"ta $iferite aspecte a!e !i+*aF"!"i C +ai $eta!iat si +ai f r+a! $ecHt face Capit !"! &6 c" t ate ca accent"! ca$e t t pe e4e+p!e $e pr gra+e "ti!e c +p!ete si n" pe frag+ente i5 !ate. Capit !"! ( se c"pa c" tip"ri!e $e $ate f"n$a+enta!e6 perat rii si e4presii!e. Capit !"! 3 tratea5 c ntr !"! f!"4"!"iJ if1e!se6 9hi!e6 f r6 etc. Capit !"! % ac per f"ncii!e si str"ct"ra pr gra+"!"i 12aria*i!e e4terne6 reg"!i $e $ +eni"6 si aBa +ai $eparte. Capit !"! . $isc"ta p interii si arit+etica a$rese! r. Capit !"! / c nine $eta!ii $espre str"ct"ri si "ni"ni. Capit !"! ' $escrie *i*!i teca C stan$ar$ $e IEO care asig"ra interfaa *iBn"it c" siste+"! $e perare. 0ceasta *i*!i teca $e IEO este tratata pe t ate ca!c"!at are!e care s"p rta !i+*aF"! C6 aBa ca pr gra+e!e care f ! sesc pentr" intrri6 ieBiri si a!te f"ncii siste+ p t fi +"tate $e pe "n siste+ pe a!t"! in principa! fr + $ificri. Capit !"! , $escrie interfaa intre pr gra+e!e C si siste+"! $e perare UNID6 c ncentrHn$"1se as"pra peraii! r $e intrareEieBire6 siste+"!"i $e fiBiere si p rta*i!itii. C" t ate ca acest capit ! este arec"+ specific pentr" UNID6 pr gra+at rii care n" f ! sesc acest siste+ p t gsi si aici "n +ateria! "ti!6 inc!"si2 pri2ire as"pra + $"!"i in care este i+p!e+entata 2ersi"ne a *i*!i tecii stan$ar$6 prec"+ si s"gestii pentr" a *ine "n c $ p rta*i!. 0ne4a 0 c nine +an"a!"! $e referina a! !i+*aF"!"i C. 0cesta este $ec!araia ? ficia!a? a sinta4ei si se+anticii !"i C si >e4ceptHn$ c +pi!at are!e pr prii@ ar*itr"! fina! a! ricr"i a+*ig"iti sa" +isi"ni $in capit !e!e prece$ente. De arece C este "n !i+*aF <n $e52 !tare care e4ist pe 2arietate $e ca!c"!at are6 an"+ite pri $in aceast carte p t sa n" +ai c resp"n$ c" sta$i"! c"rent $e $e52 !tare pentr" "n siste+ partic"!ar. 0+ <ncercat sa e2ita+ aceste pr *!e+e Bi s ateni n+ as"pra p tenia!e! r $ific"!ti. CHn$ a+ f st in $"*i"6 a+ a!es in genera! $escrierea sit"aiei PDP1&& UNID6 care este +e$i"! $e !"cr" a! +aF ritii pr gra+at ri! r in C. 0ne4a 0 c nine $e ase+enea $iferente!e $e i+p!e+entare pentr" C pe siste+e!e +aF re pe care e! p ate fi gsit.
16

CAPITOLUL 1. INII7R7 8 <ncepe+ c" intr $"cere rapi$ <n C. 8c p"! n str" este s pre5ent+ e!e+ente!e esenia!e a!e !i+*aF"!"i <n pr gra+e rea!e6 fr <ns a ne <+p t+ !i <n $eta!ii6 reg"!i f r+a!e si e4cepii. In acest p"nct a! e4p"nerii n" <ncerc+ s fi+ c +p!ei Bi nici +car f arte preciBi >+eni n+ t t"Bi c e4e+p!e!e 2 r sa fie c recte@. D ri+ s 2 a$"ce+ cHt +ai repe$e p si*i! <n p"nct"! <n care 2ei fi capa*i!i s scriei pr gra+e "ti!e Bi6 pentr" aceasta6 ne1 a+ c ncentrat as"pra f"n$a+ente! rJ 2aria*i!e si c nstante6 arit+etica6 c ntr !"! f!"4"!"i6 f"ncii si r"$i+ente $e peraii $e IEO. 0+ !sat $e parte inteni nat $in acest capit ! ace!e caracteristici a!e !i+*aF"!"i C care s"nt $e i+p rtan 2ita! <n scrierea pr gra+e! r +ai +ari. 0cestea inc!"$ p interii6 str"ct"ri!e6 +aF ritatea $in * gat"! set $e perat ri ai !"i C6 an"+ite instr"ci"ni $e c ntr ! a! f!"4"!"i si +"!i+e $e $eta!ii. 0cest + $ $e a* r$are are neaF"ns"ri!e !"i6 $esig"r. Ce! +ai n ta*i! este ace!a c p 2estea c +p!et a caracteristici! r ricr"i !i+*aF $e pr gra+are n" este gsit <ntr1"n sing"r ! c6 iar iniiere in e!6 fiin$ sc"rt6 p ate in$"ce <n er are. De arece e4e+p!e!e n" p t f ! si <ntreaga p"tere a !"i C6 e!e n" s"nt atHt $e c ncise Bi $e e!egante pe cHt ar p"tea fi. 0+ <ncercat s +ini+a!i5+ aceste efecte6 $ar fii ateniP Un a!t neaF"ns este ace!a c <n capit !e!e "r+t are 2 + repeta <n + $ necesar cHte ce2a $in acest capit !. 8per+ c aceast repetiie 2 2a aF"ta +ai +"!t $ecHt 2 2a p!ictisi. In rice ca56 pr gra+at rii e4peri+entai 2 r fi capa*i!i s e4trap !e5e $in +ateria!"! $in acest capit ! pr prii!e ! r ne2 i $e pr gra+are. Qncept rii 2 r p"tea scrie +ici pr gra+e6 si+i!are ce! r pre5entate $e n i. 0+*e!e gr"pe p t f ! si acest capit ! $rept ca$r" pentr" $escrieri!e rig"r ase care <ncep c" Capit !"! (. &.& 8a <ncepe+
17

8ing"r"! + $ $e a <n2a "n n " !i+*aF $e pr gra+are este $e a scrie pr gra+e in e!. Pri+"! pr gra+ pe care1! 2 + scrie este ace!aBi pentr" t ate !i+*aFe!eJ Tiprii c"2inte!e hello, world 0cesta este pri+"! *stac != pentr" a sari peste e!6 tre*"ie sa fii in stare sa creai "n$e2a te4t"! pr gra+6 sa1! c +pi!ai c" s"cces6 sa1! <ncrcai6 sa1! e4ec"tai si sa af!ai te4t"! tiprit ac ! "n$e este ieBirea ca!c"!at r"!"i $"+nea2 astr. In C6 pr gra+"! pentr" a tipri ?he!! 6 9 r!$? esteJ main () { printf("hello, world\n"); } C"+ r"!ea5 acest pr gra+6 $epin$e $e siste+"! pe care1! f ! sii6 Drept e4e+p!" specific6 pe siste+"! $e perare R8D6 tre*"ie sa creai acest pr gra+ s"rsa intr1"n fiBier a! cr"i n"+e se ter+ina in ?.C?6 $e e4e+p!" ?he!! .C? ap i sa1! c +pi!ai c" c +en5i!eJ >cc hello >as hello Daca n1ai greBit ni+ic6 $e e4e+p!" sa fi "itat "n caracter sa" sa fi in2ersat $ "a caractere6 c +pi!area se 2a $esfB"ra si!eni s si 2a pr $"ce "n fiBier *iect n"+it ?he!! . *F?. CansHn$"1! in e4ec"ie $"p !in:e$itare c" c +en5i!e >tkb hello=hello,lb: !,!"clib#lb >r$n hello 2a pr $"ce
18

hello, world ca ieBire a sa. Pe a!te siste+e6 reg"!i!e 2 r fi $iferite= 2erificai1!e c" e4pert"! ! ca!. 74ercii"! &.&. 74ec"tai acest pr gra+ pe siste+"! $"+nea2 astr. Qncercai sa 2e$ei ce +esaFe $e er are *inei6 !sHn$ !a parte pri $in pr gra+. 8i ac"+ cHte2a e4p!icaii $espre pr gra+"! <ns"Bi. Un pr gra+ C6 ricare i1 ar fi +ri+ea6 c nsta $in "na sa" +ai +"!te ?f"ncii? care specifica peraii!e efecti2e $e ca!c"!at care tre*"iesc fc"te. -"ncii!e $in C s"nt si+i!are c" f"ncii!e si s"*r"tine!e $intr1"n pr gra+ - rtran sa" c" pr ce$"ri!e $in PCE&6 Pasca!6etc. In e4e+p!"! n str"6 ?+ain? este astfe! $e f"ncie. In + $ n r+a! a2ei !i*ertatea $e a $a f"ncii! r ce n"+e $ rii6 $ar ?+ain? este "n n"+e specia! 1 pr gra+"! $"+nea2 astr se 2a e4ec"ta $e !a <ncep"t"! !"i ?+ain?. 0ceasta <nsea+n ca fiecare pr gra+ tre*"ie sa ai*e "n ?+ain? "n$e2a6 ca ?+ain? 2a in2 ca in + $ *iBn"it a!te f"ncii pentr" a1si rea!i5a sc p"!6 "ne!e 2enin$ $in ace!aBi pr gra+ iar a!te!e $in *i*!i teci ce c nin f"ncii scrise anteri r. O +et $a $e a c +"nica $ate intre f"ncii este prin arg"+ente!e f"ncii! r. Parante5e!e care "r+ea5 $"p n"+e!e f"nciei inc!"$ !ista $e arg"+ente. In ca5"! n str"6 ?+ain? este f"ncie fr arg"+ente ceea ce se in$ica prin ?>@?. 0c !a$e!e ?R S? inc!"$ instr"ci"ni!e care a!ct"iesc f"ncia. 7!e s"nt ana! ge !"i ?DO17ND? $in PCE& sa" !"i ?*egin1en$? $in 0C;OC6 P08C0C6 etc. O f"ncie este ape!ata prin n"+e6 "r+ate $e !ista $e arg"+ente in parante5e. N" e4ista instr"ci"nea C0CC ca in -ORTR0N sa" PCE&. Parante5e!e tre*"ie sa fie pre5ente chiar $aca n" e4ista arg"+ente. Cinia care sp"neJ printf("hello, world\n"); este "n ape! $e f"ncie6 care chea+ f"ncie n"+ita ?printf? c" arg"+ent"! >?he!! 6 9 r!$Tn?@. ?printf? este f"ncie $in *i*!i teca care tipreBte pe
19

ter+ina! >$aca n" este specificata a!ta $estinaie@. In acest ca56 ea tipreBte Bir"! $e caractere care a!ct"iesc arg"+ent"!. O sec2ena a!ct"it $in rice n"+r $e caractere c"prinse intre $ "a ghi!i+e!e ?. . .? se n"+eBte Bir $e caractere sa" c nstanta Bir. Pentr" + +ent6 sing"ra f ! sire a Bir"ri! r $e caractere 2a fi ca arg"+ente!e pentr" ?printf? si a!te f"ncii. 8ec2ena ?Tn? $in Bir este n taia $in C pentr" caracter"! ?!inie n "a?6 care6 cHn$ este tiprit6 a2ansea5 c"rs r"! ter+ina!"!"i !a +arginea $in sting a "r+t arei !inii. Daca "itai ?Tn? >"n e4peri+ent care +erita fc"t@6 2ei *ser2a ca ieBirea $"+nea2 astr n" se ter+ina c" !inie n "a. 8ing"r"! + $ $e a a2ea caracter"! ?!inie n "a? in ?printf? este ?Tn? ca arg"+ent. Daca <ncercai ce2a $e tip"! printf("hello, world "); c +pi!at r"! C 2 2a tipri "n $iagn stic neprieten s $espre ghi!i+e!e a*sente. ?printf? n" f"rni5ea5 !inie n "a in + $ a"t +at6 aBa ca ape!"ri!e +"!tip!e p t fi f ! site pentr" a ipari !inie pe etape. Pri+"! n str" pr gra+ p ate fi scris !a fe! $e *ine si astfe!J main() {

printf("hello, "); printf("world"); printf("\n");

} pentr" a pr $"ce ieBire i$entica. 8a n ta+ ca ?Tn? repre5int "n sing"r caracter. O ?sec2ena escape? ca $e e4e+p!" ?Tn? este in genera! "n +ecanis+ e4tensi*i! pentr" repre5entarea caractere! r gre" $e *in"t sa" in2i5i*i!e. Printre a!te sec2ene escape6
20

!i+*aF"! C p se$aJ Tt pentr" ta*6 T* pentr" *ac:space6 T? pentr" ap str f $"*!" si TT pentr" *ac:space. 74ercii"! &.(. 74peri+entai sa 2e$ei ce se <ntH+p! cHn$ Bir"! arg"+ent $in ?printf? c nine ?T4? "n$e 4 este "n caracter arecare care n" a f st !istat +ai s"s. &.(. )aria*i!e si arit+etica Ur+t r"! pr gra+ tipreBte ta*e!a $e te+perat"ri -ahrenheit si echi2a!ente!e ! r in centigra$e sa" gra$e Ce!si"s6 f ! sin$ f r+"!aJ C N >. E 3@ U >- 1 3(@. &!'.( )% &*.' +% +.+ *% !,.* ... )*% !)*.' )(% !-'.( -%% !+(.. Iat ac"+ si pr gra+"!J #/ 0rint 1ahrenheit&2elsi$s table for f = %, )%, ..., -%% /# main() { int lower, $pper, step; float fahr, celsi$s; lower = %; #/ lower limit temperat$re table /# $pper = -%%; #/ $pper limit /# step = )%; #/ step si3e /# fahr = lower; while (fahr 4= $pper) {
21

of

celsi$s); } } Pri+e!e $ "a !inii J

celsi$s = (,.% # ..%) / (fahr & -).%); printf("5+.%f 5*.!f\n", fahr, fahr = fahr 6 step;

#/ 0rint 1ahrenheit&2elsi$s table for f = %, )%, ..., -%% /# s"nt "n c +entari"6 care in acest ca5 e4p!ica pe sc"rt ce face pr gra+"!. Orice caractere c"prinse intre ?EU? si ?UE? s"nt ign rate $e c +pi!at r= e!e p t fi f ! site !i*er pentr" a face pr gra+"! +ai "B r $e <ne!es. C +entarii!e p t apare ri"n$e p ate aprea "n spai" sa" !inie n "a. In !i+*aF"! C6 t ate 2aria*i!e!e tre*"ie $ec!arate <nainte $e a fi f ! site6 $e *icei !a <ncep"t"! !iniei6 <naintea ricrei instr"ci"ni e4ec"ta*i!e. Daca 2ei "ita $ec!araie6 2ei pri+i "n $iagn stic $e !a c +pi!at r. O $ec!araie c nsta $intr1"n ?tip? si !ista $e 2aria*i!e care a" ace! tip6 ca inJ int lower, $pper, step; float fahr, celsi$s; Tip"! ?int? i+p!ica fapt"! ca 2aria*i!e!e !istate s"nt <ntregi= ?f! at? $en ta 2irg"!a + *i!a6 a$ic n"+ere care p t a2ea parte fraci nar. Preci5ia atHt pentr" ?int? cit si pentr" ?f! at? $epin$e $e ca!c"!at r"! pe care1! f ! sii. Pentr" PDP1&&6 $e e4e+p!"6 "n ?int? este "n n"+r c" se+n $e &/ *ii6 a$ic "n n"+r c"prins intre 13('/, si O3('/' . Un n"+r ?f! at? este cantitate ce se repre5int pe 3( $e *ii ceea ce re2ine !a apr 4i+ati2 Bapte cifre se+nificati2e6 c" +agnit"$inea c"prinsa apr 4i+ati2 intre &# V 13, si &# V O3,. Capit !"! ( $a !ist a acest r +ri+i pentr" a!te ca!c"!at are. Pe !Hng tip"ri!e ?int? si ?f! at?6 !i+*aF"! C p se$a si a!te tip"ri $e $ate f"n$a+enta!e J
22

"char" caracter & $n sin7$r octet "short" 8ntre7 sc$rt "lon7" 8ntre7 l$n7 "do$ble" n$m9r flotant d$bla preci3ie Mri+ea acest r *iecte este $e ase+enea $epen$enta $e ca!c"!at r= $eta!ii se $a" in Capit !"! (. 74ista $e ase+enea ?ta*! "ri?6 ?str"ct"ri? si ?"ni"ni? $e ase+enea tip"ri $e *a5a6 ?p interi? !a e!e si ?f"ncii? care !e ret"rnea5a si c" t ate ne 2 + <ntH!ni in aceasta carte. Ca!c"!"! efecti2 in pr gra+"! $e c n2ersie te+perat"ra <ncepe c" asignri!eJ lower = %; $pper = -%%; step = )%; fahr = lower; care setea5 2aria*i!e!e pe 2a! ri!e ! r $e start. Instr"ci"ni!e in$i2i$"a!e se ter+ina c" p"nct si 2irg"!a. -iecare !inie a ta*e!ei este ca!c"!ata in ace!aBi fe!6 aBa ca 2 + f ! si *"c!a care se repeta $at pe !inie= acesta este sc p"! instr"ci"nii ?9hi!e?J while (fahr 4= $pper) { ... } 7ste testata c n$iia $in parante5a. Daca ea este a$e2rata >fahr este +ai +ic sau ega! c" "pper@6 este e4ec"tat c rp"! *"c!ei >t ate instr"ci"ni!e inc!"se intre parante5e!e R si S@. 0p i c n$iia este retestat si6 $aca este a$e2rata6 c rp"! este e4ec"tat $in n " . CHn$ test"! $e2ine fa!s >fahr este +ai +are $ecHt "pper@6 *"c!a se ter+ina si e4ec"ia c ntin"a c" instr"ci"nea care "r+ea5 *"c!ei. De arece in acest pr gra+ n" +ai e4ista a!te instr"ci"ni care sa s"ccea$ *"c!a6 e4ec"ia !"i se ter+ina. C rp"! "nei *"c!e 9hi!e p ate fi a!ct"it $in +ai +"!te instr"ci"ni inc!"se intre ac !a$e6 ca in pr gra+"! $e +ai s"s sa" $intr1 sing"ra instr"ci"ne6 fr parante5e6 ca in e4e+p!"! $e +ai F sJ
23

while(i4:) i = ) / i; In a+*e!e ca5"ri6 instr"ci"ni!e c ntr !ate $e ?while? s"nt $eca!ate c" "n ta*6 aBa ca se *ser2a $e !a pri+a pri2ire ce instr"ci"ni se gsesc in interi r"! *"c!ei. Deca!area sc ate in e2i$enta str"ct"ra ! gica a pr gra+"!"i. C" t ate ca !i+*aF"! C este $est"! $e !i*era! in ceea ce pri2eBte p 5ii narea instr"ci"ni! r6 ta*"!are p tri2ita si f ! sirea spatii! r a!*e s"nt critice in scrierea pr gra+e! r "B r citi*i!e si $e ctre a!ii $ecHt a"t r"! ! r. Rec +an$a+ scrierea "nei sing"re instr"ci"ni pe "n rHn$ si !sarea $e spatii >"5"a!@ in F"r"! perat ri! r. P 5iia ac !a$e! r este +ai p"in i+p rtanta= n i a+ a!es "n"! $intre sti!"ri!e ce!e +ai p p"!are. 0!egei12a "n sti! care 2a c n2ine6 ap i f ! sii1! c nsec2ent. Te+perat"ra ce!si"s este ca!c"!ata si asignat !"i ?ce!si"s? prin instr"ci"neaJ celsi$s = (,.% # ..%) / (fahr & -).%); Rai"nea pentr" f ! sirea !"i >..#E3.#@ in ! c"! +ai si+p!ei .E3 este aceea ca in C6 ca si in +"!te a!te !i+*aFe6 <+prirea <ntreag tr"nchia5 re5"!tat"!6 aBa ca rice parte fraci nar este e!i+inata. 0stfe! .E3 este 5er si t t aBa ar fi f st t ate te+perat"ri!e. Un p"nct 5eci+a! intr1 c nstanta in$ica fapt"! ca aceasta este f! tanta si $eci ..#E3.# este #........ ceea ce a+ si $ rit. 0+ scris $e ase+enea 3(.# in ! c $e 3(6 chiar $aca $e arece ?fahr? este ?f! at?6 3( ar fi c n2ertit a"t +at in ?f! at? <nainte $e sc$ere. Ca pr *!e+a $e sti!6 este *ine sa scrie+ c nstante!e f! tante c" p"nct 5eci+a! e4p!icit chiar cHn$ a" 2a! ri <ntregi= aceasta accent"ea5 nat"ra ! r f! tanta pentr" citit rii "+ani si ne asig"ra ca si c +pi!at r"! 2a gHn$i in ace!aBi + $ ca si n i. Reg"!i!e $eta!iate pentr" c n2ersii!e $e <ntregi in f! tante s"nt $ate in Capit !"! (. 0c"+ sa n ta+ $ ar ca asignarea fahr = lower;
24

si test"! while (fahr 4= $pper) 2 r !"cra a+Hn$ "a aBa c"+ ne aBtepta+ ?int? este c n2ertit in ?f! at? <nainte $e e4ec"ia peraiei. 0cest e4e+p!" arata $e ase+enea p"in +ai +"!te $espre + $"! $e !"cr" a! !"i ?printf?. 7a este f"ncie $e c n2ersie $e f r+at c" sc p genera!6 care 2a fi $escrisa c +p!et in Capit !"! '. Pri+"! sa" arg"+ent este "n Bir $e caractere ce se 2 r tipri6 fiecare caracter K in$icHn$ arg"+ente!e >a! $ i!ea6 a! trei!ea@ ce se 2a s"*stit"i si f r+a in care se 2 r tipri. De e4e+p!"6 in instr"ci"nea printf("5+.%f 5*.!f\n", fahr, celsi$s); specificaia $e c n2ersie ?K%.#f? sp"ne ca "n n"+r f! tant 2a fi tiprit intr1"n spai" $e ce! p"in patr" caractere6 c" 5er cifre $"p p"nct"! 5eci+a!. ?K/.&f? $escrie "n a!t n"+r care 2a c"pa ce! p"in sase spatii6 c" cifra $"p p"nct"! 5eci+a!6 ana! g c" -/.& $in -ORTR0N sa" ->/6&@ $in PCE&. Pri $in specificat r p t fi +iseJ ?K/f? arata ca n"+r"! are !"ngi+e $e ce! p"in / caractere= ?K.(f? cere $ "a p 5iii $"p p"nct"! 5eci+a!6 $ar !"ngi+ea !"i n" este s"p"sa restricii! r= ?Kf? sp"ne $ ar sa se tipreasc n"+r"! ca f! tant. ?printf? rec"n aBte $e ase+eneaJ ?K$? pentr" <ntregi 5eci+a!i6 ?K ? pentr" n"+ere cta!e6 ?K4? pentr" he4a5eci+a!e6 ?Kc? pentr" "n caracter6 ?Ks? pentr" Bir $e caractere si ?K K? pentr" <ns"Bi se+n"! ?K?. -iecare c nstr"cie c" K in pri+"! arg"+ent a! !"i ?printf? face pereche c" a! $ i!ea6 a! trei!ea6 arg"+ent. 0ceste perechi tre*"ie sa c resp"n$a ca n"+r si tip6 a!tfe! 2ei a2ea s"rpri5a "n r re5"!tate !ipsite $e <ne!es. -iin$c 2eni 2 r*a6 ?printf? NU face parte $in !i+*aF"! C. N" e4ista $efinite in C intrri si ieBiri. N" e ni+ic +agic in !egt"r c" ?printf? ea este p"r si si+p!" f"ncie "ti!a care face parte $in *i*!i teca stan$ar$ $e r"tine care s"nt in + $ n r+a! accesi*i!e pr gra+e! r C. C" sc p"! $e a ne
25

c ncentra as"pra !i+*aF"!"i C6 n" 2 + sp"ne prea +"!te $espre peraii!e $e IEO pHn in Capit !"! '. In partic"!ar6 2 + a+ina $escrierea intrri! r c" f r+at pHn at"nci. Daca a2ei $e intr $"s n"+ere6 citii $escrierea f"nciei ?scanf? $in Capit !"! '6 seci"nea '.%= ?scanf? este f arte ase+nt are c" ?printf? atHt $ ar ca ea citeBte intrri in ! c sa scrie ieBiri. 74ercii"! &.3. M $ificai pr gra+"! $e c n2ersie te+perat"ri pentr" a scrie "n antet !a <ncep"t"! ta*e!ei $e c n2ersie. 74ercii"! &.%. 8criei "n pr gra+ care sa tipreasc ta*e!a c resp"n5t are Ce!si"s 1 -ahrenheit. 1.3. In !ru"#iunea For 0Ba c"+ pr *a*i! 2a aBteptai6 e4ista +"!i+e $e + $"ri pentr" a scrie "n pr gra+= hai$ei sa <ncerc+ a!ta 2arianta a pr gra+"!"i $e c n2ersie $e te+perat"raJ main() #/ 1ahrenheit&2elsi$s table /# { int fahr; for (fahr = %; fahr 4= -%%; fahr = fahr 6 )%) printf("5+d 5*.!f\n", fahr, (,.% # ..%) / (fahr & -))); } 0ceasta 2a pr $"ce ace!eaBi re5"!tate $ar6 c" sig"rana6 arata a!tfe! $ecHt pri+a. O + $ificare esenia! este e!i+inarea +aF ritii 2aria*i!e! r= a r+as n"+ai ?fahr?6 $ec!arata ca ?int? > *ser2ai specificat r"! ?K$? in printf@. Ci+ite!e inferi ara si s"peri ara si +ri+ea pas"!"i apar $ ar ca si c nstante in instr"ci"nea ?f r?6 ea <nsBi c nstr"cie n "a6 iar e4presia care ca!c"!ea5 te+perat"ra Ce!si"s apare ac"+ ca a! trei!ea arg"+ent $in ?printf? in ! c $e a fi instr"ci"ne $e asignare separata. 0ceasta "!ti+a schi+*are este "n e4e+p!" pentr" reg"!a genera!a in C 1 in rice c nte4t in care este per+isa f ! sirea 2a! rii "nei 2aria*i!e $e "n an"+it tip6 se p ate f ! si e4presie $e ace! tip. De arece a! trei!ea arg"+ent
26

a! !"i ?printf? tre*"ie sa fie 2a! are f! tanta pentr" a se p tri2i c" ?K/.&f?6 rice e4presie f! tanta p ate apare pe ! c"! ei. Instr"ci"nea ?f r? este *"c!a6 genera!i5are a !"i ?9hi!e?. Daca c +parai c" ?9hi!e?6 aceasta afir+aie 2 2a fi c!ara. 7a c nine trei pari separate prin p"nct si 2irg"!a. Pri+a parte fahr = % se face $ata6 <nainte ca *"c!a pr pri"15isa sa <nceap. 0 $ "a parte este test"! sa" c n$iia care c ntr !ea5 *"c!aJ fahr 4= -%% 7ste e2a!"ata aceasta c n$iie= $aca ea este a$e2rat6 este e4ec"tat c rp"! *"c!ei >!a n i6 sing"ra ?printf?@. Ur+ea5 ap i pas"! $e reiniia!i5are fahr = fahr 6 )% care este e4ec"tat si ap i c n$iia este ree2a!"ata. B"c!a se ter+ina at"nci cHn$ c n$iia $e2ine fa!sa. Ca fe! ca si !a instr"ci"nea ?9hi!e?6 c rp"! *"c!ei p ate fi a!ct"it $intr1 sing"ra instr"ci"ne sa" $intr1"n gr"p $e instr"ci"ni inc!"s intre ac !a$e. Pri!e $e iniia!i5are si reiniia!i5are p t fi sing"ra e4presie. 0!egerea intre ?9hi!e? si ?f r? este ar*itrara6 *a5ata pe ceea ce ne pare n "a a fi +ai c!ar. Instr"ci"nea ?f r? este p tri2ita in + $ "5"a! pentr" *"c!e!e in care iniia!i5area si reiniia!i5area s"nt instr"ci"ni "nice si ! gic <nr"$ite $e arece este +ai c +pacta $ecHt ?9hi!e? si pstrea5 instr"ci"ni!e $e c ntr ! a! *"c!ei intr1"n sing"r ! c si <+pre"na. 74ercii"! &... M $ificai pr gra+"! $e c n2ersie te+perat"ra pentr" a tipri ta*e!a in r$ine in2ersa6 a$ic $e !a 3## $e gra$e !a 5er . &.%. C nstante si+* !ice
27

) + face *ser2aie fina!a <nainte $e a prsi pentr" t t$ea"na pr gra+"! $e c n2ersie $e te+perat"ra. 7 practica pr asta aceea $e a <n+ r+Hnta ?n"+ere +agice? ca 3## sa" (#6 intr1"n pr gra+= e!e trans+it p"tina inf r+aie c"i2a care 2a citi pr gra+"! +ai tHr5i" si este gre" sa !e + $ifica+ intr1 +aniera siste+atica. Din fericire6 C p se$a + $a!itate $e a e2ita astfe! $e n"+ere +agice. C" aF"t r"! c nstr"ciei ?W$efine?6 se p t $efini !a <ncep"t"! pr gra+"!"i n"+e sa" c nstante si+* !ice6 care s"nt "n Bir partic"!ar $e caractere. D"p aceea6 c +pi!at r"! 2a <n! c"i t ate apariii!e nep"se intre ghi!i+e!e a!e n"+e!"i6 prin Bir"! c resp"n5t r. Qn! c"irea efecti2a a n"+e!"i p ate fi rice te4t= ea n" se !i+itea5 !a n"+ere. ;define <=>?@ % #/ lower limit of the table /# ;define A00?@ -%% #/ $pper limit /# ;define BC?0 )% #/ step si3e /# main() #/ 1ahrenheit&2elsi$s table /# { int fahr; for (fahr = <=>?@; fahr 4= A00?@; fahr = fahr 6 BC?0) printf("5+d 5*.!f\n", fahr, (,.% # ..%) / (fahr & -))); } Cantitati!e COW7R6 UPP7R si 8T7P s"nt c nstante6 asa incit e!e n" apar in $ec!aratii. N"+e!e si+* !ice se scri" in + $ n r+a! c" !itere +ari6 asa ca e!e p t fi "s r $istinse $e n"+e!e $e 2aria*i!e care se scri" c" !itere +ici. 8a n ta+ ca !a sfirsit"! "nei $efinitii NU se p"ne p"nct si 2irg"!a. De arece intreaga !inie $e $"pa n"+e!e $efinit este s"*stit"ita6 in instr"cti"nea ?f r? ar e4ista prea +"!te p"nct si 2irg"!e. &... O c !ectie $e pr gra+e "ti!e ) + c nsi$era in ce!e ce "r+ea5a fa+i!ie $e pr gra+e inr"$ite pentr" efect"area $e peratii si+p!e as"pra $ate! r a!cat"ite $in caractere.
28

) + 2e$ea ca +"!te pr gra+e s"nt $ ar 2ersi"ni e4tinse a!e pr t tip"ri! r pe care !e 2 + $isc"ta aici. Intr $"cere si e4tragere $e caractere Bi*!i teca stan$ar$ p se$a f"nctii pentr" citirea si scrierea "n"i caracter !a "n + +ent $at. ?getchar>@? a$"ce "r+at r"! caracter $e intrare $e fiecare $ata cin$ este ape!ata si ret"rnea5a ace! caracter ca si 2a! are a ei. 0$ica6 $"pa c=7etchar() 2aria*i!a ?c? c ntine "r+at r"! caracter $e intrare. Caractere!e 2in in + $ n r+a! $e !a ter+ina!6 $ar aceasta n" ne interesea5a pina in Capit !"! '. -"nctia ?p"tchar>c@? este c +p!e+entara !"i ?getchar>@?J p$tchar(c) tipareste c ntin"t"! 2aria*i!ei ?c? pe "n +e$i" $e iesire6 in + $ n r+a!6 t t pe ter+ina!. 0pe!"ri!e !a ?p"tchar? si ?printf? p t fi interca!ate= iesirea 2a apare in r$inea in care s1a" fac"t ape!"ri!e. Ca si in ca5"! !"i ?printf?6 n" e4ista ni+ic specia! re!ati2 !a ? 7etchar? si ?p$tchar?. 7!e n" s"nt parti a!e !i+*aF"!"i C6 $ar s"nt "ni2ersa! $isp ni*i!e. C piere $e fisiere Date ?7etchar? si ?p$tchar?6 2eti p"tea scrie cantitate s"rprin5at are $e c $ "ti!6 fara a sti ni+ic $espre peratii!e $e IEO. Ce! +ai si+p!" pr gra+ este ace!a care1si c pia5a intrarea in iesire6 caracter c" caracter. 8chitin$"1!J citesteD$nDcaracter while (caracter$lDn$DesteDsemnalDdeDsfirsitDdeDfisier) tiparesteDcaracter$lDchiarDcitit
29

citesteD$nDno$Dcaracter C n2ertin$ aceasta in !i+*aF"! C6 *tine+J main() #/ copE inp$t to o$tp$t; !st Fersion /# { int c; c = 7etchar(); while (c G= ?=1) { p$tchar(c); c = 7etchar(c); } } Operat r"! re!ati na! ?PN? insea+na ?$iferit $e ?. Principa!a pr *!e+a este $etectarea sfirsit"!"i $e intrare. Prin c n2entie6 ?getchar? ret"rnea5a 2a! are care n" este "n caracter 2a!i$ at"nci cin$ inti!neste sfirsit"! intrarii= in acest + $6 pr gra+e!e p t $etecta cin$ s1a" ter+inat intrari!e. 8ing"ra c +p!icatie6 nep!acere seri asa $e fapt este aceea ca e4ista $ "a c n2entii ce se f ! sesc "5"a! pentr" 2a! area sfirsit"!"i $e fisier. N i a+ e2itat aceasta f ! sin$ $e *icei n"+e!e si+* !ic $e 7O- pentr" aceasta 2a! are6 ricare ar fi f st ea. In practica6 7O- p ate fi sa" 1& sa" #6 asa ca pr gra+"! tre*"ie sa fie prece$at $e "na $in $ec!aratii!e $e +ai F sJ ;define ?=1 &! sa" ;define ?=1 % pentr" ca e! sa !"cre5e c rect. - ! sin$ c nstanta si+* !ica 7O- pentr" a repre5enta 2a! area pe care retEnea5a getchar cin$ inti!neste sfirsit"! $e fisier6 ne asig"ra+ ca n"+ai "n sing"r !"cr" $in pr gra+ $epin$e $e 2a! area n"+erica specificata. De ase+enea i! $ec!ara+ pe ?c? ca fiin$ ?int?6 n" ?char?6 pentr" ca e! sa p ata pastra 2a! area pe care ret"rnea5a ?getchar?. C"+ 2 + 2e$ea in
30

Capit !"! (6 aceasta 2a! are este n r+a! "n ?int?6 $e arece ea tre*"ie sa fie capa*i!a sa1! repre5inte si pe 7O- in p!"s fata $e t ate char1"ri!e p si*i!e. Pr gra+"! $e c piere ar p"tea fi $e fapt scris +"!t +ai c ncis $e catre "n pr gra+at r e4peri+entat in !i+*aF"! C. In C6 asignare ca c = 7etchar() p ate fi f ! sita intr1 e4presie= 2a! area sa este p"r si si+p!" 2a! area ce se asignea5a partii stingi. Daca asignarea "n"i caracter !"i c se p"ne in partea $e test a "n"i ?9hi!e?6 pr gra+"! $e c piat fisiere p ate fi scris astfe!J main() #/ copE inp$t to o$tp$t; )nd Fersion /# { int c while ((c = 7etchar()) G= ?=1) p$tchar(c); } Pr gra+"! citeste "n caracter6 i! asignea5a !"i ?c? si ap i testea5a $aca acesta a f st se+na!"! $e sfirsit $e fisier. Daca n" a f st6 c rp"! *"c!ei ?9hi!e? este e4ec"tat6 tiparin$"1se caracter"! si *"c!a se repeta. Cin$ se+na!"! $e sfirsit $e fisier este atins in fine6 *"c!a ?9hi!e? se ter+ina6 ter+inin$"1se t t $ata si pr gra+"! ?+ain?. 0ceasta 2ersi"ne centra!i5ea5a intrari!e 1 n" +ai apare $ecit "n sing"r ape! !a ?getchar?1 si restringe pr gra+"!. P!asarea "nei asignari intr1"n test c nstit"ie "n"! $in ! c"ri!e "n$e C per+ite c nci5ie "!"it are. >7ste p si*i! sa +ergeti si +ai $eparte6 crein$ "n c $ i+penetra*i!6 ten$inta pe care n i incerca+ sa n" inc"raFa+@. 7ste i+p rtant sa rec"n aste+ ca parante5e!e ce inc!"$ asignarea s"nt a*s !"t necesare. P n$erea !"i ?PN? este +ai +are $ecit aceea a !"i ?N? ceea ce insea+na ca6 in a*senta parante5e! r6 test"! re!ati na! ?PN? 2a fi fac"t inaintea asignarii ?N?. 0sa ca instr"cti"nea c = 7etchar() G= ?=1
31

este echi2a!enta c" c = (7etchar() G= ?=1) 0ceasta are "n efect ne$ rit6 prin setarea !"i ?c? pe # sa" &6 $"pa c"+ ape!"! !"i ?getchar ? a inti!nit sa" n" sfirsit"! $e fisier. >Mai +"!te $espre acestea se 2 r 2e$ea in Capit !"! (@. C nt ri5area caractere! r Ur+at r"! pr gra+ 2a c nt ri5a caractere!e= e! este pr gra+"!"i $e c piere. +ica e!a* rare a

main() #/ co$nt characters in inp$t /# { lon7 nc; nc = %; while (7etchar() G= ?=1) 66nc; printf("5ld\n",nc); } Hnstr$cti$nea 66nc; ne intr $"ce "n n " perat r ?OO? care insea+na6 incre+ent c" &. 8e p"tea scrie si ?nc N ncO&?6 $ar ?OOnc? este +ai c ncisa si a$esea +ai eficienta. 74ista "n perat r c resp"n5at r6 ?11? pentr" $ecre+entare c" &. Operat rii ?OO? si ?11? p t fi atit perat ri prefi46 cit si s"fi4 >?ncOO?@= aceste $ "a f r+e a" 2a! ri $iferite in e4presii asa c"+ se 2a arata in Capit !"! (6 $ar ?OOnc? si ?ncOO? i! incre+entea5a a+in$ i pe ?nc?. Pr gra+"! $e c nt ri5are $e caractere ac"+"!ea5a n"+ar"! $e caractere intr1 2aria*i!a ?! ng? in ! c $e ?int?. Ca PDP1&&6 2a! area +a4i+a pentr" "n intreg este 3('/' si s1ar p"tea ca sa $a+ peste $epasire
32

$e c nt r $aca1! $ec!ara+ intreg= pe I neA9e!! si pe IBM6 ?! ng? si ?int? s"nt sin ni+e si +"!t +ai +ari. 8pecificat r"! $e c n2ersie ?K!$? se+na!ea5a !"i ?printf? ca arg"+ent"! c resp"n5at r este "n intreg ?! ng?. Pentr" a face fata !a n"+ere chiar si +ai +ari6 se p ate f ! si $ec!aratie $e ?$ "*!e? >?f! at? $e !"ngi+e $"*!a@. ) + f ! si6 $e ase+enea6 instr"cti"nea ?f r? in ! c"! !"i ?9hi!e? pentr" a i!"stra "n a!t + $ in scrierea *"c!ei. main() #/ co$nt characters in inp$t /# { do$ble nc ; for (nc = %; 7etchar() G= ?=1; 66nc) ; printf("5.%f\n", nc); } ?printf? f ! seste ?Kf? atit pentr" ?f! at? cit si pentr" ?$ "*!e?= ?K.#f? s"pri+a tiparirea partii fracti nare ine4istente. C rp"! *"c!ei ?f r? este in ca5"! acesta 2i$6 $e arece t ata +"nca este fac"ta in parti!e $e test si reinitia!i5are. Dar reg"!i!e gra+atica!e a!e !i+*aF"!"i C pretin$ ca instr"cti"ne ?f r? sa ai*a "n c rp. P"nct"! si 2irg"!a ce apare i5 !at pe !inie6 in + $ tehnic instr"cti"ne n"!a6 este p"s t c+ai pentr" a satisface aceasta cerere. N i !1a+ p"s pe !inie separata t c+ai pentr" a1! face +ai 2i5i*i!. Inainte $e a parasi pr gra+"! $e c nt ri5are caractere6 sa *ser2a+ ca $aca intrarea n" c ntine nici "n caracter6 test"! $in ?9hi!e? sa" ?f r? es"ea5a !a pri+"! ape! !a getchar si $eci re5"!tat"! pr gra+"!"i este 5er 6 ceea ce este c rect. 0ceasta este *ser2atie i+p rtanta. Un"! $in !"cr"ri!e fr"+ ase care se p t sp"ne $espre ?9hi!e? si $espre ?f r? este ce!a ca e!e testea5a !a incep"t"! *"c!ei6 inainte $e a pre!"cra c rp"! *"c!ei. Daca n" este ni+ic $e fac"t6 ni+ic n" se face6 chiar $aca aceasta insea+na ca n" se 2a parc"rge c rp"! *"c!ei nici $ata. Pr gra+e!e 2 r acti na inte!igent at"nci cin$ 2 r +in"i intrari $e tip"! ?nici "n caracter?. Instr"cti"ni!e ?9hi!e? si ?f r? ne asig"ra ca 2 r face !"cr"ri re5 na*i!e si in c n$itii !a !i+ita.
33

C nt ri5area !inii! r Ur+at r"! pr gra+ c nt ri5ea5a !inii!e pe care !e pri+este ca intrare. Cinii!e $e intrare se pres"p"n a fi ter+inate c" "n caracter ?!inie n "a? Tn a$a"gat c" sfintenie !a fiecare !inie scrisa. main() #/ contori3area liniilor in intrare /# { int c, nl; nl = %; while ((c = 7etchar()) G= ?=1) if(c == I\nI) 66nl; printf("5d\n", nl); } C rp"! *"c!ei ?while? c nsta ac"+ $intr1"n ?if?6care !a rin$"! ei c ntr !ea5a incre+entarea OOn!. Instr"cti"nea ?if? testea5a c n$itia $in parante5a si6 $aca este a$e2arata6 se e4ec"ta instr"cti"nea >sa" gr"p"! $e instr"cti"ni $intre ac !a$e@ care "r+ea5a. 0+ a!iniat iarasi6 ca sa arata+ ce este c ntr !at $e cine >ce@. 8e+n"! $"*!" $e ega! ?N N? este in C n tatia pentr" ?este ega! c"? >ca si .7X. $in -ORTR0N@. 0cest si+* ! este f ! sit pentr" a $istinge test"! $e ega!itate $e ega! si+p!" >N@ f ! sit pentr" asignare. De arece asignarea este ca+ $e $ "a ri +ai frec2enta in C $ecit test"! $e ega!itate6 este n r+a! ca si perat r"! $e asignare sa fie F"+atate $in ce! $e ega!itate6 ca !"ngi+e. Orice caracter sing"r p ate fi scris intre ap str f"ri6 pentr" a pr $"ce 2a! area n"+erica a caracter"!"i in c $"! $e carctere a! ca!c"!at r"!"i= acesta se n"+este c nstanta $e caracter. 0sa $e e4e+p!"6 Y0Y este c nstanta $e caracter= in set"! $e caractere 08CII6 2a! area sa este /.6 repre5entarea interna a caracter"!"i 0. Desig"r Y0Y este $e preferat !"i /.J 8e+nificatia !"i este e2i$enta si in$epen$enta $e rice set partic"!ar $e caractere.
34

8ec2ente!e escape f ! site in sir"ri!e $e caractere s"nt si e!e !ega!e in c nstante!e $e caracter6 asa ca in teste si in e4presii arit+etice YTnY tine ! c"! caracter"!"i ?!inie n "a?. 8a n ta+ ca YTnY este "n sing"r caracter si6 in e4presii6 este echi2a!ent c" "n sing"r intreg= pe $e a!ta parte6 ?Tn? este "n sir $e caractere care6 inti+p!at r6 c ntine "n sing"r caracter. 8"*iect"! c +paratiei intre sir"ri si caractere este $isc"tat +ai $eparte in Capit !"! (. 74erciti"! &./. 8crieti "n pr gra+ care sa n"+ere *!an:"ri!e6 ta*"ri!e si ne91!ine1"ri!e. 74erciti"! &.'. 8crieti "n pr gra+ care sa c pie5e intrarea in iesire6in! c"in$ fiecare sir $e "n"! sa" +ai +"!te *!an:"ri c" "n sing"r *!an:. 74erciti"! &.,. 8crieti "n pr gra+ care sa in! c"iasca fiecare ta* printr1 sec2enta Z6*ac:space61 care se 2a tipari ca ?1Z? s fiecare *ac:space prin sec2enta si+i!ara ?[1?. 0ceasta face ta*"ri!e si *ac:space1"ri!e 2i5i*i!e. C nt ri5area $e c"2inte 0! patr"!ea pr gra+ $in seria $e pr gra+e "ti!e 2a c nt ri5a !inii6 c"2inte si caractere6 "n sing"r c"2int fiin$ $efinit ca rice sec2enta $e caractere care n" c ntine *!anc6 ta* sa" !inie n "a >acesta este $e fapt "n sche!et a! pr gra+"!"i "ti!itar ?9c? $in UNID@. ;define J?B ! ;define K= % main() #/contori3are linii, c$Finte si caractere la intrare/# { int c, nl, nw, nc, inword; inword = K=; nl = nw = nc = %; while ((c = 7etchar()) G= ?=1) { 66nc; if(c == I\nI)
35

I\tI)

66nl; if(c == I I LL c == I\nI LL c == inword = K=; else if (inword == K=) { inword = J?B; 66nw; }

} printf("5d 5d 5dI\n", nl, nw, nc);

De fiecare $ata cin$ pr gra+"! inti!neste pri+"! caracter a! "n"i c"2int6 i! c nt ri5ea5a. )aria*i!a ?in9 r$? inregistrea5a $e cite ri pr gra+"! este intr1"n c"2int sa" n" = initia! e! ?n" este intr1"n c"2int ? si 2aria*i!ei i s1a asignat 2a! area NO. Prefera+ c nstante!e si+* !ice \78 si NO 2a! ri! r !itera!e & si # $e arece e!e fac pr gra+"! +ai "s r citi*i!. Desig"r ca intr1"n pr gra+ +ic ca acesta $iferenta este +ica6 $ar intr1"n pr gra+ +ai +are cresterea in c!aritate +erita +ic"! ef rt s"p!i+enar $e a1! scrie in acest + $ $e !a incep"t. )eti 2e$ea $e ase+enea ca este +ai "s r sa efect"ati + $ificari +asi2e in pr gra+e in care n"+ere!e apar n"+ai ca si c nstante si+* !ice. Cinia nl = nw = nc = %; setea5a t ate ce!e trei 2aria*i!e pe 5er . 0cesta n" este "n ca5 specia! ci $ ar c nsecinta a fapt"!"i ca asignare as cia5a $e !a $reapta spre stinga. 7ste ca si cin$ a+ fi scris= nc = (nl = (nw = %)); Operat r"! ]] insea+na 80U6 asa ca !inia if(c == I I LL c == I\nI LL c == I\tI);
36

sp"ne ca ?$aca c este "n *!anc sa" c este !inie n "a sa" c este "n ta*...?. >8ec2enta escape Tt este repre5entarea 2i5i*i!a a caracter"!"i ta*@.74ista "n perat r c resp"n5at r ^^ pentr" 8I. 74presii!e c nectate prin ^^ sa" ]] s"nt e2a!"ate $e !a stinga !a $reapta si e2a!"area se preste at"nci cin$ se c"n aste a$e2ar"! sa" fa!s"! e4presiei. 0stfe! $aca c c ntine "n *!anc6 n" +ai este ne2 ie sa testa+ $aca e! c ntine !ine n "a sa" "n ta*6 asa ca teste!e acestea n" se +ai fac. In partic"!ar6 aceasta n" este i+p rtant aici6 $ar este f arte se+nificati2 in +"!te sit"atii c +p!icate6 asa c"+ 2 + 2e$ea in c"rin$. 74e+p!"! n str" f ! seste $e ase+enea instr"cti"nea ?e!se?6 care specifica acti"ne a!ternati2a ce tre*"ie e4ec"tata $aca partea $e c n$itie "nei instr"cti"ni ?if? este fa!sa. - r+a genera!a esteJ if (eMpresie) instr$cti$ne! else instr$cti$ne) Una si n"+ai "na $in instr"cti"ni!e as ciate c" if1e!se se e4ec"ta. Daca ?e4presia? este a$e2arata6 se e4ec"ta ?instr"cti"nea1&?= $aca n"6 se e4ec"ta ?instr"cti"nea1(?. -iecare ?instr"cti"ne? p ate fi6 $e fapt6 +"!t +ai c +p!icata. In e4e+p!"! n str" instr"cti"ea $e $"pa ?e!se? este "n ?if? care c ntr !ea5a $ "a instr"cti"ni in parante5e. 74erciti"! &.3. C"+ 2eti testa pr gra+"! $e c nt ri5are c"2inteG Care s"nt "ne!e $intre !i+ite!e !"iG 74erciti"! &.&#. 8crieti "n pr gra+ care sa tipareasca c"2inte!e intr $"se6cite "n"! pe !inie. 74erciti"! &.&&. Re2i5"iti pr gra+"! $e c nt ri5are c"2inte pentr" a f ! si +ai *"na $efinitie a ?c"2int"!"i?6 $e e4e+p!" sec2enta $e !itere6 cifre si ap str f"ri care incepe c" !itera.
37

&./. Ta*! "ri ) + scrie ac"+ "n pr gra+ care 2a c nt ri5a aparitii!e fiecarei cifre6 a fiecar"i caracter $e spatiere >*!anc6 ta*6 !inie n "a@ si a t"t"r r ce! r!a!te caractere. Desig"r6 este "n pr gra+ artificia!6 $ar ne 2a per+ite sa i!"stra+ +ai +"!te aspecte a!e !"i C intr1"n sing"r pr gra+. 74ista &( categ rii $e intrari6 asa ca ne este +ai c n2ena*i! sa f ! si+ "n ta*! " pentr" a tine n"+ar"! $e aparitii a fiecarei cifre6 $ecit sa f ! si+ &# 2aria*i!e in$i2i$"a!e. Iata ac"+ 2ersi"ne a acest"i pr gra+J main() #/ contori3ea3a cifre, spatii albe, alte caractere /# { int c, i, nwhite, nother; int, ndi7it !%"; nwhite = nother = %; for (i = %; i 4 !%; 66i) ndi7it i" = %; while ((c = 7etchar()) G= ?=1) if (c >= I%I NN c 4= I.I) 66ndi7it c&I%I"; else if (c == I I LL c == I\nI LL c == I\tI) 66nwhite; else 66nother; printf("di7its ="); for (i = %; i 4 !%; 66i) printf(" 5d", ndi7it i"); printf("\nwhite space = 5d, other = 5d\n", nwhite, nother); } Dec!aratia
38

int ndi7it !%"; sp"ne ca n$igit este "n ta*! " $e &# intregi. In$icii $e ta*! " int $ea"na incep $e !a 5er in C >spre $e se*ire $e -ORTR0N sa" PCE& "n$e incepe $e !a "n"@6 asa ca e!e+ente!e ta*! "!"i s"nt ndi7it %"6 ndi7it !"6 . . .6 ndi7it .". 0cestea se ref!ecta in *"c!e!e ?for?6 care initia!i5ea5a si tiparesc ta*! "!.Un in$ice p ate sa fie rice e4presie intreaga6 inc!"si2 $esig"r 2aria*i!e!e intregi ca ?i?6 sa" c nstante!e intregi. 0cest pr gra+ partic"!ar se *a5ea5a +"!t pe pr prietati!e repre5entarii $rept caractere a cifre! r. De e4e+p!"6 test"! if (c >= I%I NN c 4= I.I) ... $eter+ina $aca "n caracter $in c este cifra. Daca e! este cifra6 2a! are n"+erica a ace!ei cifre este c & I%I 0cest a!g rit+ f"ncti nea5a *ine n"+ai $aca Y#Y6 Y&Y6 etc6 s"nt p 5iti2e si in r$ine crescat are6 si intre Y#Y si Y3Y n" se gaseste a!tce2a $ecit cifre. Din fericire6 aceasta este a$e2ar"! pentr" t ate set"ri!e $e caractere c n2enti na!e. Prin $efinitie6 ca!c"!e!e arit+etice care i+p!ica tip"ri ?char? si ?int?6 c n2ertesc t t"! in tip"! ?int? inainte $e pre!"crare6 asa a 2aria*i!e!e si c nstante!e $e tip ?char? s"nt esentia! i$entice c" tip"! ?int? in c nte4te arit+etice. 0cest fapt este apr ape nat"ra! si c n2ena*i!= $e e4e+p!"J c1Y#Y este e4presie intreaga c" 2a! are intre # si 3 c resp"n5at are caracter"!"i$intre Y#Y si Y3Y $ep"s in c6 si $eci este "n in$ice 2a!i$ pentr" ta*! "! n$igit. Deci5ia se ia as"pra caracter"!"i >$aca e! este sa" a!tce2a@ in sec2entaJ if (c >= I%I NN c 4= I.I)
39

cifra6 "n caracter $e spatiere

66ndi7it c&I%I"; else if (c == I I LL c == I\nI LL c == I\tI) 66nwhite; else 66nother; C nstr"ctia $e tip"! if (conditie) instr$cti$ne else if (conditie) instr$cti$ne else instr$cti$ne apare frec2ent in pr gra+e ca + $a!itate $e a e4pri+a $eci5ii!e +"!tip!e. C $"! se citeste si+p!" $e s"s in F s pina cin$ c n$itie este in$ep!inita= in acest p"nct6 se e4ec"ta partea c resp"n5at are $e ?instr"cti"ne? si intreaga c nstr"ctie este ter+inata. >Desig"r ca ?instr"cti"ne? p t fi +ai +"!te instr"cti"ni inc!"se intre parante5e@. Daca nici "na $in c n$itii n" este in$ep!inita6 instr"cti"nea care "r+ea5a $"pa "!ti+"! ?e!se? este e4ec"tata $aca este pre5enta. Daca ?e!se? fina! si ?instr"cti"ne? !ipsesc >ca in pr gra+"! n str"@6 n" are ! c nici acti"ne. P t e4ista "n n"+ar ar*itrar $e c nstr"ctii $e tip"! else if (conditie) instr$cti$ne gr"pate intre ?if?1"! initia! si ?e!se?1"! fina!. Ca chesti"ne $e sti!6 2a sfat"i+ sa f r+ati aceste c nstr"ctii asa c"+ !e1a+ fac"t si n i6 astfe! incit $eci5ii!e !"ngi sa n" aF"nga pe +arginea $in $reapta a paginii. Instr"cti"nea ?s9itch?6 care 2a fi pre5entata in Capit !"! 36 repre5inta "n a!t + $ $e a scrie $eci5ie +"!tip!a si este p tri2ita6 in partic"!ar6 cin$ c n$itia care se testea5a este si+p!a sa" cin$ e4presie $e caractere sa" $e intregi se
40

p tri2este c" c nstanta $intr1"n sir $at. Prin c ntrast6 2 + pre5enta 2ersi"ne ?s9itch? a acest"i pr gra+ in Capit !"! 3. 74erciti"! &1&(. 8crieti "n pr gra+ pentr" a tipari hist gra+a !"ngi+i! r c"2inte! r care apar !a intrare. 7ste ce! +ai "s r sa $esenati hist gra+a ri5 nta!= rientare 2ertica!a este +ai !a* ri asa. &.'. -"nctii In C f"nctie este echi2a!enta c" s"*r"tina sa" c" f"nctie $in -ORTR0N sa" c" pr ce$"ra $in PCE& sa" P08C0C6 etc. O f"nctie repre5inta "n + $ c n2ena*i! $e a incaps"!a an"+ite ca!c"!e intr1 c"tie neagra care p ate fi ap i f ! sita fara sa ne +ai pese $e ce se af!a ina"ntr". -"nctii!e s"nt sing"ra + $a!itate $e a face fata !a c +p!e4itatea p tentia!a a pr gra+e! r +ari. C" f"nctii scrise asa c"+ tre*"ie6 este p si*i! sa ign ra+ ?c"+? este fac"ta an"+ita trea*a= ne este s"ficient sa sti+ ?ce? an"+ita trea*a este fac"ta. Ci+*aF"! C este pr iectat pentr" a face f ! sirea ! r "s ara6 c n2ena*i!a si eficienta= 2eti *ser2a a$esea f"nctie !"nga n"+ai $e cite2a rin$"ri6 ape!ata sing"ra $ata6 n"+ai fiin$ca ea c!arifica an"+ite p rti"ni $e c $. Pina ac"+ a+ f ! sit n"+ai f"nctii ca printf6 getchar si p"tchar6 care a" f st scrise $e a!tii pentr" n i= este + +ent"! sa ne scrie+ si n i pr prii!e n astre f"nctii. De arece !i+*aF"! C n" p se$a "n perat r $e e4p nentiere ca UU $in -ORTR0N sa" PCE&6 2 + i!"stra +ecanis+"! $e $efinire $e f"nctii scriin$ f"nctie p"tere ?p 9er>+6n@? care 2a ri$ica "n intreg !a p"tere intreaga p 5iti2a in n. 0$ica6 2a! area !"i p 9er>(6.@ este 3(. Desig"r ca aceasta f"nctie n" rea!i5ea5a t ata trea*a !"i UU De arece +in"ieste n"+ai p"teri p 5iti2e a!e intregi! r +ici6 $ar ce! +ai *ine6este *ine sa apr f"n$a+ "n !"cr" !a "n + +ent $at. Iata ac"+ f"nctia ?p 9er? si "n pr gra+ principa! care f ! seste6 asa ca p"teti 2e$ea $e $ata intreaga str"ct"ra. main() #/ testea3a f$nctia power /# { int i;
41

power(&-,i)); } power(M,n) > % /# int M, n; { int p = for } Orice f"nctie are

for (i = %; i 4 !%; 66i) printf (I5d 5d 5d\nI, i,

power(),i),

#/ ridica pe M la p$terea a n&a ; n

i, p; !; (i = !, i 4= n; 66i) p = p / M; ret$rn(p);

aceeasi f r+aJ

n$me (lista de ar7$mente, daca eMista) declaratii de ar7$mente, daca eMista { declaratii instr$cti$ni } -"nctii!e p t apare in rice r$ine si intr1"n fisier s"rsa sa" in $ "a. Bineinte!es6 $aca s"rsa apare in $ "a fisiere6 2eti a2ea +ai +"!te $e sp"s !a c +pi!are si incarcare $ecit $aca e "n sing"r fisier $ar asta este pr *!e+a a siste+"!"i $e perare si n" "n atri*"t a! !i+*aF"!"i. Pentr" + +ent 2 + pres"p"ne ca a+*e!e f"nctii se gasesc intr1"n ace!asi fisier6 asa ca ceea ce ati in2atat $espre e4ec"tia pr gra+e! r C n" se + $ifica.-"nctia ?p 9er? este ape!ata $e $ "a ri in !inia printf("5d 5d 5d\n", i, power(),i), power(&-,i)); -iecare ape! tri+ite $ "a arg"+ente !"i p 9er6 care $e fiecare $ata ret"rnea5a "n intreg care tre*"ie f r+atat si tiparit. Intr1 e4presie
42

p 9er>(6i@ este "n intreg6 !a fe! ca si ( si i. >N" t ate f"nctii!e pr $"c 2a! are intreaga= 2 + 2e$ea aceasta in Capit !"! %@. In ?p 9er? arg"+ente!e tre*"ie sa fie $ec!arate c resp"n5at r c" tip"! ! r c"n sc"t. 0ceasta este fac"ta $e !inia int M,n; care "r+ea5a !iniei c" n"+e!e f"nctiei. Dec!aratii!e $e arg"+ente "r+ea5a sa se sit"e5e intre !ista $e arg"+ente si ac !a$a stinga $eschisa R= fiecare $ec!aratie se ter+ina c" p"nct si 2irg"!a. N"+e!e f ! site $e p 9er pentr" arg"+ente!e sa!e s"nt p"r ! ca!e !"i p 9er si n" s"nt accesi*i!e nici "nei a!te f"nctiiJ a!te r"tine p t f ! si ace!easi n"+e fara nici "n c nf!ict. 0ceasta este a$e2arat si pentr" 2aria*i!e!e i si pJ i $in p 9er >n" este !egat prin ni+ic@ n" are nici !egat"ra c" i $in +ain. )a! area pe care p 9er ca!c"!ea5a este ret"rnata in +ain prin instr"cti"nea ?ret"rn?6 care este !a fe! ca in PCE&. Orice e4presie p ate apare intre parante5e. O f"nctie n" tre*"ie sa ret"rne5e 2a! are= instr"cti"ne ?ret"rn? fara nici e4presie ca"5ea5a transfer"! c ntr !"!"i6 $ar n" 2a! are "ti!a6 spre ape!ant6 asa c"+ face ?iesirea $"pa sfirsit? a "nei f"nctii prin atingerea parante5ei $repte ter+inat are. 74erciti"! &.&3. 8crieti "n pr gra+ care sa c n2erteasca intrarea in !itere +ici6 f ! sin$ f"nctie ! 9er>c@ care ret"rnea5a pe c6 $aca c n" este !itera6 si 2a! area ?!itera +ica a !"i c?6 $aca c este !itera. &.,. 0rg"+ente 1 ape! prin 2a! are Un aspect a! f"nctii! r $in !i+*aF"! C s1ar p"tea sa fie nefa+i!iar pr gra+at ri! r *isn"iti c" a!te !i+*aFe6 in partic"!ar c" -ORTR0N sa" PCE&. In C6 t ate arg"+ente!e f"nctiei s"nt trans+ise ?prin 2a! are?. 0ceasta insea+na ca f"nctiei ape!ate i se trans+it 2a! ri!e arg"+ente! r in 2aria*i!e te+p rare >$e fapt intr1 sti2a @ si n" i se trans+it a$rese!e ! r. 0ceasta $"ce !a cite2a pr prietati $iferite fata $e !i+*aFe!e c" ?ape! prin referinta? $e tip"! -ORTR0N si PCE&6 in care r"tina ape!ata +in"ieste a$rese!e arg"+ente! r si n" 2a! ri!e ! r.
43

Principa!a $istinctie este aceea ca in !i+*aF"! C6 f"nctia ape!ata n" p ate a!tera 2aria*i!a in f"nctia ape!ata= ea p ate a!tera n"+ai c pia ei te+p rara si pri2ata. 0pe!"! prin 2a! are este6 c" t ate acestea "n a2antaF si n" *!igatie. U5"a!6 e! c n$"ce !a pr gra+e +ai c +pacte c" +ai p"tine 2aria*i!e in"ti!e6 $e arece arg"+ente!e p t fi tratate ca 2aria*i!e ! ca!e initia!i5ate c n2ena*i! in r"tina ape!ata. Drept e4e+p!"6 $a+ in c ntin"are 2ersi"ne a f"nctiei p 9er care face "5 $e acest fapt. power(M,n) #/ridica pe M la %;Fersi$nea )/# int M, n; { int p; for (p = !; n > %; &&n) p = p / M; ret$rn(p); } p$terea a n&a; n >

0rg"+ent"! n este f ! sit ca 2aria*i!a te+p rara6 si este $ecre+entat pina cin$ $e2ine 5er = n" +ai este ne2 ie $e 2aria*i!a i. Ceea ce se face c" n in interi r"! !"i p 9er n" are nici "n efect as"pra arg"+ent"!"i c" care a f st ape!ata p 9er initia!. Cin$ este necesar6 este p si*i! sa aranFa+ ca f"nctie sa + $ifice 2aria*i!a in r"tina ape!anta. 0pe!an$"! tre*"ie sa $ea a$resa 2aria*i!ei $e setat >in + $ tehnic6 sa cree5e "n p inter !a 2aria*i!a@6iar f"nctia ape!ata tre*"ie sa $ec!are arg"+ent"! ca fiin$ "n p inter si sa refere 2aria*i!a rea!a in + $ in$irect prin e!. ) + $isc"ta in $eta!i" aceste pr *!e+e in Capit !"! .. Cin$ n"+e!e "n"i ta*! " este f ! sit ca si arg"+ent6 2a! area trans+isa f"nctiei este ! catia sa" a$resa $e incep"t a ta*! "!"i. >N" se face nici c piere $e e!e+ente $e ta*! "@. In$icHn$ aceasta 2a! are6 f"nctia p ate a2ea acces si a!tera rice e!e+ent a! ta*! "!"i. 0cesta este s"*iect"! "r+at arei secti"ni.
44

&.3. Ta*! "ri $e caractere In + $ pr *a*i!6 ce! +ai c +"n tip $e ta*! "ri in !i+*aF"! C este ta*! "! $e caractere. Pentr" a i!"stra f ! sirea ta*! "ri! r $e caractere si a f"nctii! r care !e +anip"!ea5a6 2 + scrie "n pr gra+ care citeste "n set $e !inii si tipareste pe cea +ai !"nga. 8chita !"i este $est"! $e si+p!aJ while (mai eMista o alta linie) if (este mai l$n7a decit linia anterioara) salFea3a&o pe ea si l$n7imea ei tipareste linia cea mai l$n7a 0ceasta schita ne arata c!ar ca pr gra+"! se i+parte in *"cati. O *"cata citeste !inie n "a6 a!ta *"cata testea5a6 a!ta sa!2ea5a iar rest"! c ntr !ea5a pr ces"!. De arece !"cr"ri!e se i+part asa $e fr"+ s6 ar fi +ai *ine sa !e scrie+ !a fe!. Pentr" aceeasta6 2 + scrie !a incep"t f"nctie get!ine care 2a citi "r+at area !inie $e !a intrare= ea este genera!i5are a f"nctiei getchar. Pentr" a face f"nctia "ti!a si in a!te c nte4te6 2 + incerca sa scrie+ cit +ai f!e4i*i!. In + $ +ini+6 get!ine 2a tre*"i sa ret"rne5e "n se+na! $espre p si*i!"! sfirsit $e fisier= pr iectin$1 +ai genera!6ea 2a tre*"i sa ret"rne5e !"ngi+ea !iniei sa" 5er $aca se inti!neste sfirsit"! $e fisier. _er n" este nici $ata !"ngi+e 2a!i$a $e !inie6 $e arece rice !inie are ce! p"tin "n caracter6 chiar si !inie ce c ntine n"+ai caracter"! ?!inie n "a? are !"ngi+ea &. Cin$ gasi+ !inie care este +ai !"nga $ecit !inia cea +ai !"nga gasita anteri r6 tre*"ie sa sa!2a+ "n$e2a. 0ceasta s"gerea5a a $ "a f"nctie6 c pA6 pentr" a sa!2a n "a !inie intr1"n ! c sig"r. In fina!6 a2e+ ne2 ie $e "n pr gra+ principa! care sa c ntr 1 !e5e f"nctii!e get!ine si c pA. Iata re5"!at"!J ;define liniei /# main() l$n7a /# OPQ<HK? !%%% #/
45

#/

l$n7imea linia

maMima cea

a mai

7aseste

{ int len; #/ l$n7imea liniei c$rente /# int maM; #/ l$n7imea maMima 7asita pina ac$m /# char line OPQ<HK?"; #/ linia c$renta introd$sa /# char saFe OPQ<HK?"; #/ cea mai l$n7a linie salFata /# maM = %; while ((len = 7etline(line, OPQ<HK?)) > %) if (len > maM) { maM = len; copE(line, saFe); } if (maM > %) #/ s&a citit cel p$tin o linie /# printf("5s", saFe); } 7etline (s, lim) #/ citeste linia in s, ret$rnea3a l$n7imea /# char s "; int lim; { int c, i; for(i = %; i 4 lim & ! NN (c=7etchar())G=?=1 NN cG =I\nI;66i) s i" = c; if (c == I\nI) { s i" = c; 66i; } s i" = I\%I; ret$rn(i); } copE(s!, s)) #/ copia3a pe s! in s); s) s$ficient de mare /# char s! ", s) ";
46

{ int i; i = %; while ((s) i" = s! i") G= I\%I) 66i; } +ain si get!ine c +"nica intre e!e printr1 pereche $e arg"+ente si ret"rnata. In get!ine6 arg"+"+ente!e s"nt $ec!arate prin !inii!eJ char s "; int lim; care sp"n ca pri+"! arg"+ent este "n ta*! " iar a! $ i!ea "n intreg. C"ngi+ea ta*! "!"i s n" este specificata in get!ine $e arece ea este $eter+inata in +ain. ?get!ine? f ! seste instr"cti"nea ret"rn pentr" a tri+ite 2a! are inap i ape!ant"!"i6 !a fe! c"+ facea si f"nctia p 9er. Une!e f"nctii ret"rnea5a 2a! are "ti!a= a!te!e6 $e e4e+p!" c pA6 s"nt f ! site n"+ai pentr" efect"! ! r si n" ret"rnea5a nici 2a! are. get!ine p"ne caracter"! T# >caracter"! n"!6 a car"i 2a! are este 5er @ !a sfirsit"! ta*! "!"i pe care i! crea5a6 pentr" a +arca sfirsit"! sir"!"i $e caractere. 0ceasta c n2entie este f ! sita $e ase+enea si $e catre c +pi!at r"! C= cin$ c nstanta sir $e tip"! "hello\n" este scrisa intr1"n pr gra+ C6 c +pi!at r"! isi crea5a "n ta*! " $e caractere c ntinin$ carctere!e sir"!"i si ter+inat c" T#6 astfe! incit f"nctie6 $e e4e+p!" printf6 p ate sa1i $eter+ine sfirsit"!. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& L h L e L l L l L o L \n L \% L &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2a! are

47

8pecificat r"! $e f r+at Ks $in printf se asteapta !a "n sir repre5entat t c+ai in aceasta f r+a. Daca e4a+inati f"nctia c pA6 2eti $esc peri ca si ea se *i5"ie $e fapt pe ter+inarea arg"+ent"!"i sa" $e intrare s& c" "n T# si ea c pia5a acest caracter in arg"+ent"! $e iesire s(. >T ate acestea pres"p"n ca T# n" este parte a "n"i te4t n r+a!@. 7ste $e+n $e +enti nat in trecere ca6 "n pr gra+6 chiar si atit $e +ic ca acesta6 pre5inta "ne!e pr *!e+e $e!icate $e pr iectare. De e4e+p!"6 ce ar face +ain $aca ar inti!ni !inie +ai +are $ecit !i+ita saG get!ine !"crea5a *ine6 a$ica se 2a pri at"nci cin$ ta*! "! este p!in chiar $aca n" a inti!nit nici "n caracter ?!inie n "a?. Testin$ !"ngi+ea si "!ti+"! caracter ret"rnat6 +ain p ate $eter+ina cin$ a f st !inia prea !"nga si ap i sa acti ne5e c"+ 2rea. Pentr" a sc"rta pr gra+"!6 a+ ign rat acest aspect. N" e4ista 2re1 ca!e pentr" "ti!i5at r"! !"i getchar $e a sti inainte cit 2a fi $e !"nga !inie $e intrare6 asa ca get!ine 2erifica $aca n" s1a pr $"s $epasire. Pe $e a!ta parte6 "ti!i5at r"! !"i c pA stie int $ea"na >sa" p ate $esc peri@ cit este $e +are sir"!6 asa ca n" tre*"ie sa a$a"ga+ !a f"nctie 2erificare $e er ri. 74erciti"! &.&%. Re2i5"iti r"tina +ain $in pr gra+"! prece$ent astfe! incit ea sa tipareasca c rect !"ngi+ea "nei !inii $e intrare $e !"ngi+e ar*itrara6 si atita te4t cit este p si*i! $e tiparit. 74erciti"! &.&.. 8crieti "n pr gra+ care sa tipareasca t ate !inii!e +ai !"ngi $e ,# $e caractere. 74erciti"! &.&/. 8crieti "n pr gra+ care sa e!i+ine *!anc"ri!e nese+nificati2e >ce!e $e $"pa "n caracter $iferit $e *!anc sa" ta*@ $in fiecare !inie $e intrare si care sa stearga !inii!e care c ntin n"+ai *!anc"ri. 74erciti"! &.&' 8crieti f"nctie re2erse>s@ care sa in2erse5e "n sir $e caractere s. - ! siti1 pentr" a scrie "n pr gra+ care isi in2ersea5a !inie c" !inie intrarea. &.&# D +eni"= 2aria*i!e e4terne

48

)aria*i!e $in +ain >!ine6 sa2e6 etc@ s"nt pri2ate sa" ! ca!e !"i +ain= $e arece e!e s"nt $ec!arate in +ain6 nici a!ta f"nctie n" p ate a2ea acces $irect !a e!e. Ca fe! se inti+p!a si c" 2aria*i!e!e $in a!te f"nctii $e e4e+p!" 2aria*i!a i $in get!ine n" are nici !egat"ra c" 2ari*i!a i $in c pA. -iecare 2aria*i!a ! ca!a $intr1 r"tina se naste n"+ai at"nci cin$ f"nctia este ape!ata si?$ispare? cin$ f"nctia isi ter+ina acti2itatea. 0ceasta este rati"nea pentr" care astfe! $e 2aria*i!e s"nt c"n sc"te "5"a! s"nt n"+e!e $e 2aria*i!e a"t +ate6 "r+in$ ter+in ! gia $in a!te !i+*aFe. ) + f ! si ter+en"! $e ?a"t +at? $e aici inainte pentr" a ne referi !a aceste 2aria*i!e $ina+ice ! ca!e. >Capit !"! % $isc"ta c!asa $e +e+ rie ?statica? in care 2aria*i!e!e ! ca!e isi pastrea5a 2a! area intre ape!"ri!e !a f"nctii@. De arece 2aria*i!e!e a"t +ate 2in si p!eaca $ata c" ape!"ri!e $e f"nctii6 e!e n"1si pastrea5a 2a! area $e !a "n ape! !a a!t"! si tre*"ie initia!i5ate e4p!icit inainte $e fiecare intrare. Daca n" s"nt setate6 re5"!tate!e 2 r fi i+pre2i5i*i!e. Ca a!ternati2a !a 2aria*i!e!e a"t +ate6 este p si*i! sa $efini+ 2aria*i!e care sa fie ?e4terne? t"t"r r f"nctii! r6 a$ica6 2aria*i!e!e g! *a!e care sa fie accesate prin n"+e $e rice f"nctie care $ reste sa faca. >0cest +ecanis+ este f arte ase+anat r c" COMMON $in -ORTR0N sa" 7DT7RN0C $in PCE&@. De arece 2aria*i!e!e e4terne s"nt accesi*i!e g! *a!6 e!e p t fi f ! site in ! c"! !iste! r $e arg"+ente pentr" a c +"nica $ate intre f"nctii. Mai +"!t6 $e arece 2aria*i!e!e e4terne e4ista per+anent6 si n" apar si $ispar $"pa c"+ f"nctia este ape!ata sa" s1a ter+inat6 e!e isi pastrea5a 2a! ri!e chiar si $"pa ce s1a ter+inat f"nctia care !e1a setat. O 2aria*i!a e4terna tre*"ie sa fie $efinita in afara ricarei f"nctii= acest !"cr" face sa se a! ce +e+ rie rea!a pentr" ea. )aria*i!a tre*"ie $e ase+enea sa fie $ec!arata in fiecare f"nctie care 2rea sa f ! seasca= aceasta se p ate face fie printr1 $ec!aratie e4p!icita ?e4tern?6 fie i+p!icit prin c nte4t. Pentr" a face $isc"tia c recta6 2 + rescrie pr gra+"! prece$ent6 in care !ine6 sa2e6 +a4 2 r fi $ec!arate 2aria*i!e e4terne. 0ceasta 2a cere + $ificari in ape!"ri6 in $ec!aratii si in c rp"ri!e ce! r trei f"nctii. ;define OPQ<HK? !%%% #/ marimea maMima a liniei de intrare /# char line OPQ<HK?"; #/ linia de intrare /#
49

char saFe OPQ<HK?"; #/ cea mai l$n7a linie este salFata aici/# int maM; #/ l$n7imea liniei celei mai mari /# main() #/ 7aseste linia cea mai l$n7a ;Fersi$ne speciali3ata/# { int len; eMtern int, maM; eMtern char saFe "; maM = %; while ((len = 7etline() > %) if (len > maM) { maM = len; copE(); } if (maM > %) #/ a fost cel p$tin o linie /# printf("5s", saFe); } 7etline() { #/ Fersi$ne speciali3ata /#

int c, i; eMtern char line "; for (i = %; i 4 OPQ<HK?&! NN (c = 7etchar()) G= ?=1 NN c G= I\nI; 66i) line i" = c; if (c == I\nI) { line i" = c; 66i; } line i" = I\%I; ret$rn(i); } copE() { #/ Fersi$ne speciali3ata /#
50

int i; eMtern char line ", saFe "; i = %; while ((saFe i" = line i") G= I\%I) 66i; } )aria*i!e!e e4terne $in +ain6 get!ine si c pA s"nt $efinite $e pri+e!e !inii $in e4e+p!"! $e +ai s"s care $ec!ara tip"! ! r si pr 2 aca a! care $e +e+ rie pentr" e!e. Din p"nct $e 2e$ere sintactic6 $efinitii!e e4terne s"nt ase+anat are c" $ec!aratii!e pe care !e1a+ f ! sit anteri r $ar $e arece e!e apar in afara f"nctii! r6 2aria*i!e!e s"nt e4terne. Inainte ca f"nctie sa p ata f ! si 2aria*i!a e4terna6 n"+e!e 2aria*i!ei tre*"ie sa fie fac"t c"n sc"t f"nctiei O + $a!itate pentr" a face aceasta este scriin$ $ec!aratie ?e4tern?= $ec!aratia este i$entica c" cea $e $inainte6 a2in$ insa in p!"s c"2int"! cheie e4tern. In an"+ite circ"+stante6 $ec!aratia ?e4tern? p ate fi +isaJ$aca $efinitia e4terna a 2aria*i!ei apare in fisier"! s"rsa inainte $e f ! sirea ei intr1 f"nctie partic"!ara6 at"nci n" este necesara $ec!aratie ?e4tern? in f"nctie. Deci6 $ec!aratii!e ?e4tern? $in +ain6 get!ine si cp A s"nt re$"n$ante. De fapt practica "5"a!a c nsta in p!asarea $efinitii! r t"t"r r 2aria*i!e! r e4terne !a incep"t"! fisier"!"i s"rsa si ap i +iterea t"t"r r $ec!aratii! r ?e4tern?. Daca pr gra+"! c nsta $in +ai +"!te fisiere s"rsa si 2aria*i!a este $efinita in fisier"! & si f ! sita in fisier"! ( at"nci e ne2 ie $e $ec!aratie ?e4tern? in fisier"! ( pentr" a c necta ce!e ( aparitii a!e 2aria*i!ei. 0cest s"*iect este $isc"tat pe !arg in capit !"! %. P"teti n ta ca a+ f ! sit c" griFa c"2inte!e ?$ec!aratie? si ?$efinitie? cin$ ne1a+ referit !a 2aria*i!e e4terne in aceasta secti"ne. ?Definitii!e? se refera !a ! c"! in care 2aria*i!a este efecti2 creata si i se asignea5a +e+ rie= ?$ec!aratie? se refera !a ! c"! "n$e nat"ra 2aria*i!ei este $ec!arata $ar n" i se a! ca +e+ rie. -iin$ca 2eni 2 r*a6 e4ista ten$inta $e a face t t"! c" aF"t r"! 2aria*i!e! r e4terne $e arece e!e par a si+p!ifica t ate c +"nicatii!e 1 !iste!e $e
51

arg"+ente s"nt sc"rte si 2aria*i!e!e s"nt int $ea"na ac ! cin$ a2eti ne2 ie $e e!e. Dar 2aria*i!e!e e4terne s"nt int $ea"na ac ! chiar si cin$ n" a2eti ne2 ie $e e!e. 0cest sti! $e a c $ifica este p!in $e peric !e $e arece e! c n$"ce !a pr gra+e a!e car r c ne4i"ni $e $ate n" s"nt e2i$ente c!ar 1 2aria*i!e!e p t fi + $ificate in + $"ri neasteptate si chiar ina$2ertente iar pr gra+"! $e2ine gre" $e + $ificat $aca acest !"cr" este necesar. 0 $ "a 2ersi"ne a pr gra+"!"i care ca"ta !inia cea +ai !""nga este inferi ara pri+ei6 partia! $in aceste + ti2e6 si partia! $e arece ea $istr"ge genera!itatea a $ "a f"nctii atit $e "ti!e intr $"cin$ in e!e n"+e!e "n r 2aria*i!e pe care !e 2 r f ! si. 74erciti"! &.&, Test"! $in instr"cti"nea f r $in f"nctia get!ine $e +ai s"s este apr ape $e neinte!es. Rescrieti pr gra+"! pentr" a1! face +ai c!ar $ar pastrati ace!asi c +p rta+ent !a sfirsit"! fisier"!"i sa" !a $epasire $e *"ffer. 7ste acest c +p rta+ent ce! +ai a$ec2at G &.&& Re5"+at In acest p"nct a+ ac perit ceea ce6 c n2enti na!6 p ate fi n"+it esenta !"i C. C" aceste cite2a cara+i5i6 este p si*i! sa scrieti pr gra+e "ti!e $e +ari+e c nsi$era*i!a $ar ar fi *"na i$ee $aca 21ati $ihni +ai +"!t inainte $e a face asa ce2a. 74ercitii!e care "r+ea5a a" intetia $e a 2a feri s"gestii pentr" pr gra+e $e c +p!e4itate arec"+ +ai +are $ecit ce!e pre5entate in acest capit !. D"pa ce re"siti sa a2eti s"* c ntr ! aceasta parte a !"i C6 ar fi $e+n $e ef rt"! $"+nea2 astra sa cititi +ai $eparte6 $e arece caracteristici!e !"i C ac perite in "r+at are!e cite2a capit !e s"nt ce!e in care p"terea si e4presi2itatea !i+*aF"!"i $e2in aparente. 74erciti"! &.&3. 8crieti "n pr gra+ ?$eta*? care in! c"ieste ta*"ri!e $in intrare c" n"+ar"! p tri2it $e *!anc"ri pentr" a sari pina !a "r+at r"! st p $e ta*. Pres"p"neti "n set fi4at $e st p"ri $e ta*6 fie $in n in n p 5itii. 74erciti"! &.(#. 8crieti "n pr gra+ ?enta*? care in! c"ieste sir"ri $e *!anc"ri c" n"+ar"! +ini+ $e ta*"ri si *!anc"ri pentr" a *tine aceasi spatiere. - ! siti ace!easi st p"ri $e ta* ca si $eta*.
52

74erciti"! &.(&. 8crieti "n pr gra+ pentr" a ?i+pat"ri? !inii!e $e intrare !"ngi $"pa "!ti+"! caracter ne*!anc care apare inainte $e a n1a c ! ana a intrarii6 "n$e n este "n para+etr". 0sig"rati12a ca pr gra+"! $"+nea2 astra !"crea5a inte!igent c" !inii!e f arte !"ngi6 chiar $aca n" e nici "n ta* sa" *!anc inainte $e c ! ana specificata. 74erciti"! &.((. 8crieti "n pr gra+ care sa e!i+ine t ate c +entarii!e $intr1"n pr gra+ C. N" "itati sa +in"iti a$ec2at sir"ri!e $intre ghi!i+e!e si c nstante!e $e caractere. 74erciti"! &.(3. 8crieti "n pr gra+ pentr" a 2erfica "n pr gra+ C $in p"nct $e 2e$ere a! er ri! r $e sinta4a r"$i+entare ca $e e4e+p!"J parante5e neperechi. N" "itati ghi!i+e!e!e6 atit ce!e si+p!e cit si ce!e $"*!e si c +entarii!e. >0cest pr gra+ este gre" $aca i! faceti !a ca5"! ce! +ai genera!.@

53

CAPITOLUL $. T I P U R I6 O P 7 R 0 T O R I ` I 7 D P R 7 8 I I )aria*i!e!e si c nstante!e s"nt *iecte!e 1 $ate $e *a5a +anip"!ate intr1"n pr gra+. Dec!aratii!e !istea5a 2aria*i!e!e ce se 2 r f ! si si specifica tip"! ! r si pr *a*i!6 2a! ri!e ! r initia!e. Operat rii specifica ce tre*"ie fac"t c" e!e. 74presii!e c +*ina 2aria*i!e si c nstante pentr" a pr $"ce 2a! ri n i. T ate acestea c nstit"ie s"*iect"! acest"i capit !. (.&. N"+e $e 2aria*i!e C" t ate ca n" a+ sp"s1 pina ac"+a6 e4ista "ne!e restrictii as"pra n"+e! r $e c nstante si 2aria*i!e. N"+e!e s"nt a!cat"ite $in !itere si cifre= pri+"! caracter tre*"ie sa fie !itera. Cini"ta $e s"*!iniere ?a? este c nsi$erata !itera= ea este "ti!a in "s"rarea citirii n"+e! r !"ngi $e 2aria*i!e. Citere!e +ari si +ici s"nt caractere $istincte= practica tra$iti na!a in C f ! seste !itere!e +ici pentr" n"+e $e 2aria*i!e si !itere!e +ari pentr" c nstante!e si+* !ice. N"+ai pri+e!e pt caractere a!e "n"i n"+e intern s"nt se+nificati2e6 c" t ate ca se p t f ! si +ai +"!te. Pentr" n"+e!e e4terne6 $e e4e+p!" n"+e $e f"nctii si $e 2aria*i!e e4terne6 n"+ar"! $e caractere p ate sa fie +ai +ic ca ,6 $e arece n"+e!e e4terne s"nt f ! site $e $iferite asa+*! are si incarcat are. In 0ne4a 0 se $a" $eta!ii. Mai +"!t6 c"2inte cheie caJ if6 e!se6 int6 etc s"nt re5er2ateJ n" p t fi f ! site ca n"+e $e 2aria*i!e >tre*"ie sa fie scrise c" !itere +ici@. Nat"ra!6 e inte!ept sa a!ege+ n"+e!e $e 2aria*i!e astfe! incit sa inse+ne ce2a6 !egat $e sc p"! 2aria*i!ei6 si e nep!ac"t sa a+esteca+ !itere +ari c" +ici. (.(. Tip"ri si +ari+i $e $ate 74ista n"+ai cite2a tip"ri $e $ate $e *a5a in !i+*aF"! CJ char 1 "n sing"r ctet6 capa*i! sa pastre5e "n caracter $in set"! ! ca! $e caractere
54

int 1 "n intreg6 ref!ectin$ tipic +ari+ea efecti2a a intregi! r pe ca!c"!at r"! ga5$a float 1 n"+ar f! tant in si+p!a preci5ie do$ble 1 n"+ar f! tant in $"*!a preci5ie. In p!"s6 e4ista "n n"+ar $e ca!ificat ri care p t fi ap!icati tip"!"i ? int?J short6 lon7 si $nsi7ned. short si lon7 se refera !a $iferite +ari+i $e intregi. N"+ere!e ?$nsi7ned? se s"p"n !egi! r arit+eticii + $"! (Vn "n$e n este n"+ar"! $e *iti $intr1"n int= e!e s"nt int $ea"na p 5iti2e. Dec!aratii!e pentr" ca!ificat ri arata astfe!J short int M; lon7 int E; $nsi7ned int 3; C"2int"! int p ate fi +is in astfe! $e sit"atii6 ceea ce se si inti+p!a $e *icei. Preci5ia acest r *iecte $epin$e $e ca!c"!at r"! care !e +in"ieste= ta*e!"! "r+at r $a cite2a 2a! ri repre5entati2eJ R?2 0R0!! SoneEwell Hnterdata (#-) PB2HH PB2HH char int short lon7 float do$ble ( biti !* !* -) *+ -) -* -* -* ') *%%% ?T2RH2 PB2HH HTO#-'%

. biti ( biti ( biti -) -) !* !* -* -) -) -) -) *+ *+

55

Intentia e ca sh rt si ! ng sa ai*a !"ngi+i $iferite $e intregi "n$e e practic= int ref!ecta n r+a!6 cea +ai ?nat"ra!a? !"ngi+e pentr" "n ca!c"!at r. 0sa c"+ p"teti 2e$ea6 fiecare c +pi!at r este !i*er sa interprete5e sh rt si ! ng in f"nctie $e har$"! pe care se e4ec"ta. Ceea ce tre*"ie sa n tati este ca sh rt n" este nici $ata +ai !"ng $ecit ! ng. (.3. C nstante C nstante!e int si f! at a" f st $eFa e4p"se= n ta+ in p!"s ca n tatia "5"a!a !)-.+,*e&' sa" n tatia stiintifica %.!)?pentr" n"+ere!e f! tante s"nt a+*e!e !ega!e. Orice c nstanta f! tanta este c nsi$erata ca fiin$ $e tip"! $ "*!e6 asa ca n tatia ?e? ser2este atit pentr" f! at cit si pentr" $ "*!e. C nstante!e !"ngi s"nt scrise in sti!"! &(3C. O c nstanta intreaga n r+a!a care este prea !"nga pentr" "n int6 este !"ata $e ase+enea ca fiin$ c nstanta ! ng. 74ista n tatie specia!a pentr" c nstante!e cta!e si he4a5eci+a!eJ "n # >5er @ !a incep"t"! "nei c nstante int insea+na cta!= "n #4 sa" #D !a incep"t"! "nei c nstante int insea+na he4a5eci+a!. De e4e+p!"6 n"+ar"! 5eci+a! 3& p ate fi scris #3' in cta! si #4&f sa" #D&- in he4a5eci+a!. C nstante!e cta!e si he4a5eci+a!e p t fi "r+ate "n C pentr" a !e face ?! ng?. O c nstanta caracter este "n caracter sing"r scris intre ghi!i+e!e si+p!e ca6 $e e4e+p!"6 Y4Y. )a! area "nei c nstante caracter este 2a! area n"+erica a caracter"!"i in set"! $e caractere a! ca!c"!at r"!"i. De e4e+p!"6 in set"! $e caractere 08CII6 caracter"! 5er 6 sa" Y#Y6 are 2a! area %,6 iar in 7BCDIC6 (%#6 a+in$ "a 2a! ri!e fiin$ $iferite $e 2a! area n"+erica #. 8criin$ Y#Y in ! c $e 2a! are n"+erica $e tip"! %, sa" (%#6 face+ pr gra+"! in$epen$ent $e 2a! are partic"!ara. C nstante!e caracter participa in peratii!e n"+erice !a fe! ca ricare a!te n"+ere6 c" t ate ca ce! +ai a$esea e!e s"nt
56

f ! site in c +parari c" a!te caractere. O secti"ne 2iit are 2a trata t ate reg"!i!e $e c n2ersie. 0n"+ite caractere negrafice p t fi repre5entate c nstante caracter c" aF"t r"! sec2ente! r escape6 $e e4e+p!" Tn >!inie n "a@6 Tt >ta*@6 T# >n"!@6 TT >*ac:space@6 TY>ghi!i+ea si+p!a@ etc6 care arata ca $ "a caractere6 $ar $e fapt s"nt "n"! sing"r. In p!"s6 se p ate genera rice + $e! $e !"ngi+e "n ctet6 scriin$J I\dddI "n$e IdddI repre3inta ! & - cifre octale, ca in ;define 1=@O1??R I\%!+I #/ PB2HH formfeed /# C nstanta caracacter YT#Y repre5inta caracter"! ce are 2a! area YT#Y se scrie a$esea in ! c"! !"i # pentr" accent"a nat"ra caracter a an"+it r e4presii. O e4presie c nstanta este e4presie care i+p!ica n"+ai c nstante. 0stfe! $e e4presii s"nt e2a!"ate !a c +pi!are si n" !a e4ec"tie si e!e p t fi f ! site in rice ! c in care p ate apare c nstanta6 ca in ;define OPQ<HK? !%%% char line OPQ<HK?6!"; sa" seconds = *% / *% / ho$rs; O c nstanta1sir este sec2enta c +p"sa $in 5er caractere intre ghi!i+e!e $"*!e6 ca "H am a strin7" sa$ "" #/ $n sir n$l /# sa" +ai +"!te

57

;hi!i+e!e!e $"*!e n" s"nt parte a sir"!"i ci ser2esc $ ar ca $e!i+itat ri. 0ce!easi sec2ente escape f ! site pentr" c nstante!e caracter se ap!ica si !a sir"ri= T? repre5inta caracter"! $"*!a ghi!i+ea. Tehnic6 "n sir este "n ta*! " a!e car"i e!e+ente s"nt caractere. C +pi!at r"! p!asea5a a"t +at "n caracter n"! T# !a sfirsit"! ricar"i astfe! $e sir6 astfe! ca pr gra+e!e p t $eter+ina !esne sfirsit"! sir"!"i. 0ceasta repre5entare sp"ne ca n" e4ista !i+ita rea!a pentr" !"ngi+ea "n"i sir6 $ar pr gra+e!e tre*"ie sa parc"rga t t sir"! pentr" a1i $eter+ina !"ngi+ea. Me+ ria fi5ica cer"ta este c" ! catie +ai +"!t $ecit n"+ar"! $e caractere scrise intre ghi!i+e!e $"*!e. -"nctia "r+at are6 str!en>s@ ret"rnea5a !"ngi+ea "n"i sir $e carctere s6 e4c!"si2 ter+inat r"! T#. strlen(s) #/ ret$rnea3a l$n7imea l$i s /# char s "; { int i; i = %; while (s i" G= I\%I) 66i; ret$rn(i); } Tre*"ie $istins intre c nstanta caracter si "n sir care c ntine "n sing"r caracterJ Y4Y si ?4? n" s"nt ace!asi !"cr". Pri+"! este "n caracter6 f ! sit pentr" a pr $"ce 2a! area n"+erica a caracter"!"i 4 $in set"! $e caractere a! ca!c"!at r"!"i= a! $ i!ea este "n sir $e caractere care c ntine "n sing"r caracter >!itera 4@ si "n T#. (.%. Dec!aratii T ate 2aria*i!e!e tre*"ie $ec!arate inainte $e a fi f ! site 6 c" t ate ca an"+ite $ec!aratii p t fi fac"te i+p!icit $e c nte4t. O $ec!aratie specifica "n tip si este "r+ata $e !ista $e "na sa" +ai +"!te 2aria*i!e $e ace! tip6 ca in e4e+p!"! $e +ai F sJ int lower, $pper, step;
58

char c, line !%%%"; )aria*i!e!e p t apare ric"+ printre $ec!aratii. Cista $e +ai s"s p ate fi scrisa6 in + $ ega!6 si astfe!J int lower; int $pper; int step; char c; char line !%%%"; 0ceasta "!ti+a f r+a c"pa +ai +"!t spati" $ar este +ai c + $a pentr" a a$a"ga cite "n c +entari" !a fiecare $ec!aratie sa" pentr" + $ificari "!teri are. )aria*i!e!e p t fi6 $e ase+enea6 initia!i5ate in $ec!aratia ! r6 c" t ate ca e4ista an"+ite restrictii. Daca n"+e!e este "r+at $e "n se+n ega! si $e c nstanta6 aceasta ser2este !a initia!i5are6 ca inJ char backslash = I\\I; int i = %; float eps = !.%e&,; Daca 2aria*i!a in chesti"ne este e4terna sa" statica6 initia!i5area este fac"ta sing"ra $ata6 c ncept"a! inainte ca pr gra+"! sa1si inceapa e4ec"tia. )aria*i!e!e a"t +ate initia!i5ate e4p!icit s"nt initia!i5ate !a fiecare ape! a! f"nctiei in care s"nt c ntin"te. )aria*i!e!e a"t +ate pentr" care n" e4ista initia!i5are e4p!icita a" 2a! are ne$efinita >a$ica g"n i@. )aria*i!e!e e4terne si statice se initia!i5ea5a i+p!icit c" 5er $ar este "n *"n sti! $e pr gra+are ace!a $e a $ec!ara initia!i5area ! r in rice ca5. ) + $isc"ta initia!i5ari!e +ai $eparte pe +as"ra ce se intr $"c n i tip"ri $e $ate. (... Operat ri arit+etici

59

Operat rii arit+etici *inari s"nt ?O?6 ?1?6 ?U?6 ?E? si perat r"! + $"! ?K?. 74ista perat r"! ?1? "nar $ar n" e4ista perat r"! "nar ?O?. I+partirea intregi! r tr"nchia5a rice parte fracti nara. 74presia M 5 E pr $"ce rest"! cin$ 4 se i+parte !a A si $eci este 5er cin$ i+partirea este e4acta. De e4e+p!"6 "n an este *isect $aca este $i2i5i*i! c" % si $aca n" este $i2i5i*i! c" &##6 insa anii $i2i5i*i!i c" %## s"nt *isecti. Deci if (Eear 5 + == % NN Eear 5 !%% G= % LL Eear 5 +%% == %) itIs a leap Eear else itIs not Operat r"! K n" p ate fi ap!icat !a f! at sa" $ "*!e. Operat rii O si 1 a" aceeasi p n$ere6 care este +ai +ica $ecit p n$erea >i$entica@ a !"i U6 E si K care !a rin$"! ei este +ai +ica $ecit p n$erea perat r"!"i "nar 1. Operat rii arit+etici se gr"pea5a $e !a stinga !a $reapta >Ta*e!a $e !a sfirsit"! capit !"!"i re5"+a p n$erea si as ciati2itatea pentr" t ti perat rii@. Or$inea $e e2a!"are n" este specificata pentr" perat rii as ciati2i si c +"tati2i $e tip"! !"i U si O. C +pi!at r"! p ate rearanFa "n ca!c"! c" parante5e i+p!icin$ "n"! $in acestia. 0stfe!6 aO>*Oc@ p aate fi e2a!"at ca >aO*@Oc. 0cest !"cr" pr $"ce rar $iferente $ar $aca se cere r$ine partic"!ara6 tre*"ie f ! site e4p!icit 2aria*i!e!e te+p rare. 0cti"ni!e care pr $"c $epasiri s"peri are sa" inferi are $epin$ in "!ti+a instanta $e ca!c"!at r. (./. Operat ri re!ati na!i si ! gici Operat rii re!ati na!i s"nt Z ZN [ [N. 7i a" t ti aceasi p n$ere. 8"* ei in ta*e!"! $e p n$eri se af!a perat rii $e ega!itate N N P N 6 care a" aceeasi p n$ere. Operat rii re!ati na!i a" p n$erea +ai +ica $ecit cei arit+etici6 asa
60

ca e4presii $e tip"! i [ !i+1& se e2a!"ea5a ca i [ >!i+1&@6 asa c"+ ar fi $e asteptat. Mai interesanti s"nt c nect rii ! gici ^^ si ]]. 74presii!e care1i c ntin s"nt e2a!"ate $e !a stinga !a $reapta si e2a!"area se preste in c!ipa in care se c"n aste a$e2ar"! sa" fa!s"! re5"!tat"!"i. 0ceste pr prietati se $ 2e$esc critice in scrierea pr gra+e! r. De e4e+p!" iata *"c!a !"ata $in f"nctia $e intrare get!ine6 pe care a+ scris1 in Capit !"! &J for (i=%; i4lim&! NN (c = 7etchar()) G= I\nI NN c G = ?=1;66i) s i" = c; In + $ c!ar6 inainte $e a citi "n n " caracter tre*"ie 2a5"t $aca +ai e4ista ! c pentr" a1! $ep"ne in ta*! "! s 6 asa ca test"! i[!i+1& tre*"ie fac"t in pri+"! rin$. N" n"+ai atit $ar $aca test"! es"ea5a6 n" tre*"ie sa +ai citi+ "n n " caracter. 8i+i!ar6 ar fi nep tri2it sa testa+ $aca c este 7O- inainte $e ape!"! !"i getchar= ape!"! tre*"ie sa ai*a ! c inainte ca sa testa+ caracter"! c. P n$erea !"i ^^ este +ai +are $ecit cea a !"i ]] si a+in$ "a s"nt +ai +ici $ecit ce!e a!e perat ri! r re!ati na!i si $e ega!itate6 asa ca e4presii $e tip"! i4lim&! NN (c = 7etchar()) G= I\nI NN c G= ?=1 n" +ai a" ne2 ie $e parante5e s"p!i+entare. Dar6 $e arece p n$erea !"i PN este +ai +are $ecit cea a asignarii6 este ne2 ie $e parante5e in (c = 7etchar()) G= I\nI pentr" a *tine re5"!tat"! $ rit. Operat r"! "nar $e negatie ?P? c n2erteste "n peran$ n n5er sa" a$e2arat in 5er si "n peran$ 5er sa" fa!s in &. O "ti!i5are *isn"ita a !"i P este in c nstr"ctii $e tip"! if (Ginword)
61

+ai $egra*a $ecit if (inword == %) 7ste +ai gre" sa genera!i5a+ care f r+a este +ai *"na. C nstr"ctii!e $e tip"! 9in9 r$ arata +ai fr"+ s >?$aca n" e in c"2int?@6 $ar c nstr"ctii!e +ai c +p!icate p t fi gre" $e inte!es. 74erciti"! (.&. 8crieti f ! si ^^. (.'. C n2ersii $e tip Cin$ intr1 e4presiie apar peran5i $e +ai +"!te tip"ri6 ei se c n2ertesc intr1 "n tip c +"n6 $"pa "n n"+ar +ic $e reg"!i. In genera!6 sing"re!e c n2ersii care se fac a"t +at s"nt ace!ea c" sens 6 $e e4e+p!" c n2ertirea "n"i n"+ar intreg intr1"n f! tant in e4presii $e tip"! f O i. 74presii!e fara sens6 $e e4e+p!" f ! sirea "n"i f! at ca in$ice $e ta*! "6 n" s"nt per+ise. In pri+"! rin$6 char1i si int1i p t fi a+estecati in e4presii!e arit+eticeJ rice char este c n2ertit a"t +at intr1"n int. 0ceasta per+ite f!e4i*i!itate re+arca*i!a in an"+ite tip"ri $e transf r+ari $e caractere. 74e+p!ifica+ c" f"nctia at i6 care c n2erteste "n sir $e cifre in echi2a!ent"! !"i n"+eric. atoi(s) #/ conFerteste $n sir s in intre7 /# char s "; { int i, n; n = %; for (i = %; s i" >= I%I NN s i" 4= I.I ; 6 6i) } n = !% / n 6 s i" & I%I; ret$rn(n); *"c!a echi2a!enta c" *"c!a f r $e +ai s"s fara a

0sa c"+ a+ 2a5"t in Capit !"! &6 e4presia


62

s i"&I%I repre5inta 2a! area n"+erica a caracter"!"i af!at in sLiM $e arece 2a! ri!e !"i Y#Y6Y&Y6 etc f r+ea5a "n sir crescat r p 5iti2 si c ntig"". Un a!t e4e+p!" $e c n2ersie intre char si int i! c nstit"ie f"nctia ! 9er care transf r+a !itere!e +ari $in set"! $e caractere 08CII in !itere +ici. Daca intrarea n" este !itera +are6 f"nctia ret"rnea5a neschi+*ataJ lower(c) #/ conFersie PB2HH litere mari in litere mici /# int c; { if (c >= IPI NN c 4= IUI) ret$rn(c 6 IaI & IPI); else ret$rn(c) } 0ceasta f"nctie este 2a!a*i!a n"+ai pentr" 08CII $e arece pe $e parte intre !itere!e +ari si !itere!e +ici e4ista $istanta fi4ata6 ca 2a! are n"+erica6 iar pe $e a!ta parte a+*e!e a!fa*ete s"nt c ntig"e 1 intre 0 si _ se gasesc n"+ai !itere. 0ceasta "!ti+a *ser2atie n" este 2a!a*i!a pentr" set"! $e caractere 7BCDIC >IBM 3/#E3'#@6 asa incit f"nctia ! 9er es"ea5a pentr" aceste siste+e6 ea 2a c n2erti +ai +"!t $ecit !itere!e +ari. 74ista s"*ti!itate in c n2ersia caractere! r in intregi. Ci+*aF"! n" specifica $aca 2aria*i!a $e tip char este cantitate c" se+n sa" fara se+n. Cin$ "n char este c n2ertit intr1"n int6 p ate e! pr $"ce "n intreg negati2G Din pacate6 aceasta 2aria5a $e !a ca!c"!at r !a ca!c"!at r6 ref!ectin$ $iferente!e arhitect"ra!e. Pe an"+ite ca!c"!at are >$e e4e+p!" PDP1&&@ "n char a! car"i ce! +ai $in stinga *it este & 2a fi c n2ertit intr1"n intreg negati2 >?e4tensie $e se+n?. Pe a!te!e6 "n char este c n2ertit intr1"n int prin a$a"garea $e 5er "ri in partea stinga si astfe! e! este int $ea"na p 5iti2. Definitia !"i C asig"ra ca rice caracter $in set"! stan$ar$ a! +asinii n" 2a fi nici $ata negati26 asa ca aceste caractere p t fi f ! site !i*er in e4presii ca si cantitati p 5iti2e. Dar + $e!e ar*itrare $e *iti +e+ rate in 2aria*i!e $e
63

tip character p t apare $rept negati2e pe an"+ite ca!c"!at are si $rept p 5iti2e pe a!te!e. Cea +ai c +"na aparitie a acestei sit"atii este cin$ pentr" 7O- se f ! seste 1&. 8a c nsi$era+ c $"!J char c; c = 7etchar(); if (c == ?=1) ... Pe "n ca!c"!at r care n" face e4tensie $e se+n6 c este int $ea"na p 5iti2 $e arece e! este "n char6 $ar t t"si 7O- este negati2. In c nsecinta test"! es"ea5a int $ea"na. Pentr" a e2ita aceasta6 tre*"ie sa a2e+ griFa at"nci cin$ f ! si+ int in ! c $e char pentr" rice 2aria*i!a care pri+este 2a! are ret"rnata $e getchar. 0$e2arata rati"ne pentr" "ti!i5area !"i int in ! c $e char n" este !egata c" ni+ic $e p si*i!a e4tensie $e se+n. P"r si si+p!"6 7etchar tre*"ie sa ret"rne5e t ate caractere!e p si*i!e >astfe! incit sa p ate fi f ! sita pentr" a citi intrare ar*itrara@ si in p!"s6 2a! are pentr" 7O- $istincta. 0stfe!6 aceasta 2a! are n" p ate fi repre5entata ca si "n char6 $ar6 in schi+*6 tre*"ie +e+ rata ca si "n int. O a!ta f r+a "ti!a $e c n2ersie $e tip a"t +ata este aceea ca e4presii!e re!ati na!e $e tip"! i Z F si e4presii!e ! gice c nectate prin ^^ si ]] se $efinesc a a2ea 2a! area & pentr" a$e2ar si # pentr" fa!s. 0stfe!6 asignareJ isdi7it = c >= I%I NN c 4= I.I; p"ne pe is7it pe ! $aca c este cifra si pe % $aca n". >In partea $e test a !"i if6 while6 for6 etc6 ?a$e2arat? insea+na ?n n5er ?@. C n2ersii!e arit+etice i+p!icite !"crea5a in +are +as"ra c"+ ne astepta+. In genera!6 $aca "n perat r ca O sa" U care are $ i peran5i >"n ? perat r *inar?@ are peran5i $e tip"ri $iferite6 tip"! ?inferi r? este pr + 2at !a tip"! ?s"peri r? inainte $e e4ec"tia peratiei. Re5"!tat"! ins"si este $e tip"! s"peri r. Mai precis6 pentr" fiecare perat r arit+etic6 se ap!ica "r+at area sec2enta $e reg"!i $e c n2ersieJ
64

char si short se c n2ertesc in int iar float este c n2ertit in do$ble. 0p i6 $aca "n peran$ este do$ble 6 ce!a!a!t este c n2ertit in do$ble iar re5"!tat"! este do$ble. 0!tfe!6 $aca "n peran$ este lon76 ce!a!a!t este c n2ertit in lon7 iar re5"!tat"! este lon7. 0!tfe!6 $aca "n peran$ este $nsi7ned6 ce!a!a!t este c n2ertit in$nsi7ned6 iar re5"!tat"! este $nsi7ned. 0!tfe!6 peran5ii tre*"ie sa fie int6 iar re5"!tat"! este int. 8a n ta+ ca t ti float $intr1 e4presie s"nt c n2ertiti in do$ble= rice ca!c"! f! tant in C este fac"t in $"*!a preci5ie. C n2ersii!e se fac in asignari= 2a! area partii $repte este c n2ertita !a tip"! $in stinga6 care este tip"! re5"!tat"!"i. Un caracter este c n2ertit intr1 "n int fie c" e4tensie $e se+n6 fie n"6 asa c"+ s1a $escris +ai s"s. Operatia in2ersa6 int in char6 se c +p rta *ine6 p"r si si+p!"6 *itii $e r$in s"peri r in e4ces s"nt e!i+inati. 0stfe!6 inJ int i; char c; i = c; c = i; 2a! area !"i c este neschi+*ata. 0cesta este a$e2arat si cin$ e4tensia $e se+n este i+p!icita si cin$ n" este i+p!icita. Daca 4 este float iar i este int6 at"nciJ M = i;
65

si

i = M;

pr 2 aca a+in$ "a c n2ersii= f! at in int pr 2 aca tr"nchierea ricarei parti fracti nare. $ "*!e este c n2ertit in f! at prin r t"nFire. Intregii !"ngi s"nt c n2ertiti in sc"rti sa" in char prin pier$erea *iti! r $e r$in s"peri r in e4ces. De arece arg"+ent"! "nei f"nctii este e4presie6 c n2ersia $e tip are ! c $e ase+enea si cin$ arg"+ente!e s"nt pasate f"nctiei in partic"!ar6 char si short $e2in int6 iar float $e2ine do$ble. Iata $e ce a+ $ec!arat arg"+ent"! f"nctiei ca fiin$ int si do$ble chiar cin$ f"nctia este ape!ata c" char si float. In fina!6 c n2ersia e4p!icita $e tip p ate fi f rtata in rice e4presie c" c nstr"ctie n"+ita ?$istri*"ire?>cast@. In c nstr"ctiaJ (n$medetip) eMpresie 8e+nificatia precisa a "nei $istri*"iri este $e fapt ca si $aca e4presie ar fi asignata !a 2aria*i!a $e tip"! specificat6 care este ap i f ! sita in ! c"! intregii c nstr"ctii. De e4e+p!"6 r"tina $in *i*!i teca sVrt are ne2 ie $e "n arg"+ent do$ble si 2a pr $"ce n nsens $aca i se $a sa +in"iasca a!tce2a. 0stfe!6 $aca n este "n intregJ sVrt((do$ble) n) i! c n2erteste pe n in do$ble inainte $e a1! pasa !"i sVrt. >De n tat ca $istri*"irea pr $"ce 2a! area n in tip"! p tri2it= c ntin"t"! efecti2 a! !"i n n" este a!terat @. Operat r"! $e $istri*"ire are acceasi p n$ere ca si a!ti perat ri "nari6 asa c"+ apare si in ta*e!"! recapit"!ati2 $e !a sfirsit"! capit !"!"i. 74erciti"! (.(. 8crieti f"nctie htoi(s@ care c n2erteste "n sir $e cifre he4a5eci+a!e in 2a! area sa intreaga echi2a!enta. Cifre!e s"nt $e !a # !a 36 !itere!e $e !a a !a f si $e !a 0 !a -.
66

(.,. Operat ri $e incre+entare si $ecre+entare Ci+*aF"! C fera $ i perat ri ne"5"a!i pentr" incre+entarea si $ecre+entarea 2aria*i!e! r. Operat r"! $e incre+entare OO a$"na & !a peran$"! sa"= perat r"! $e $ecre+entare 11 sca$e &. 0+ f ! sit frec2ent OO pentr" a incre+enta 2aria*i!e!e6 $e e4e+p!"J if (c == I\nI) 66nl; 0spect"! ne *isn"it a! !"i OO si a! !"i 11 este ace!a ca ei p t fi f ! siti atit ca perat ri prefi4 >inaintea 2aria*i!ei6 ca in OOn@ cit si ca perat ri s"fi4 >$"pa 2aria*i!a6 ca in nOO@. In a+*e!e ca5"ri6 efect"! este incre+entarea !"i n. Dar e4presia OOn i! incre+entea5a pe n inainte $e a1i f ! si 2a! area6 in ti+p ce e4presia nOO6 i! incre+entea5a pe n $"pa ce a f st f ! sita 2a! area !"i. 0ceasta insea+na ca intr1"n c nte4t in care 2a! area este f ! sita6 si n" n"+ai efect"!6 OOn si nOO s"nt $iferiti. Daca n este .6 at"nciJ M = n66; i! face pe M ega! c" ,6 $ar M = 66n; i! face pe M ega! c" /. In a+*e!e ca5"ri6 n $e2ine *. Operat rii $e incre+entare si $ecre+entare se p t ap!ica n"+ai 2aria*i!e! r. O e4presie $e tip"! 4 N >iOF@OO este i!ega!a. Intr1"n c nte4t in care 2a! area n" este f ! sita6 ci n"+ai efect"! $e incre+entare6 ca in if (c == I\nI) nl66; a!egeti + $"! prefi4 sa" s"fi4 $"pa g"st"! $"+nea2 astra. Dar e4ista t t"si sit"atii in care "n"! sa" a!t"! este ape!at $in a$ins. De e4e+p!"6 sa
67

c nsi$era+ f"nctia sV$ee3e(s,c) care e!i+ina t ate aparitii!e !"i c $in sir"! sJ sV$ee3e (s,c) #/ ster7e toate aparitiile l$i c din s /# char s "; int c; { int i, :; for (i = : = %; s i" G= I\%I; i66) if (s i" G= c) s :66" = s i"; s :" = I\%I; } De fiecare $ata cin$ apare "n caracter non&c e! este c piat in p 5itia : c"renta si n"+ai $"pa aceea : este incre+entat pentr" a fi gata pentr" "r+at r"! caracter. 0ceasta c nstr"ctie este echi2a!enta c" "r+at areaJ if (s i" G= c) { s :" = s i"; :66; } Un a!t e4e+p!" $e c nstr"ctie si+i!ara este !"ata $in f"nctia get!ine pe care a+ scris1 in Capit !"! &6 in care p"te+ in! c"i if (c == I\nI s i"=c; 66i; } {

c" +"!t +ai c +pacta c nstr"ctieJ if (c == I\nI) s i66" = c;


68

Ca "n a! trei!ea e4e+p!" f"nctia strcat(s,t) care c ncatenea5a sir"! t !a sfirsit"! sir"!"i s. strcat pres"p"ne ca e4ista s"ficient spati" in s pentr" a pastra c +*inatia. strcat (s,t) #/ concatenea3a pe t la sfirsit$l l$i s /# char s ", t "; #/ s treb$ie sa fie s$ficient de mare /# { int i, :; i = : = %; while (s i" G= I\%I) #/ 7aseste sfirsit$l l$i s /# i66; while ((s i66" = t :66") G= I\%I) #/ copia3a pe t /# ; } C"+ fiecare caracter este c piat $in t in s6 se ap!ica p stfi4"! OO atit !"i i cit si !"i : pentr" a fi sig"ri ca s"nt pe p 5itie pentr" "r+at r"! pas $in *"c!a. 74erciti"! (.3. 8crieti a!ta 2ersi"ne a !"i sV$ee3e(s!, s)) care sterge fiecare caracter $in s! care se p tri2este c" 2re"n caracter $in s). 74erciti"! (.%. 8crieti f"nctia anE(s!, s)) care ret"rnea5a pri+a ! catie $in sir"! s! in care apare 2re"n c acter $in sir"! s)6 sa" pe 1& $aca s! n" c ntine nici "n caracter $in s). (.3. Operat ri ! gici pe *iti Ci+*aF"! C fera "n n"+ar $e perat ri pentr" +anip"!area *iti! r= acestia n" se p t ap!ica !"i f! at si $ "*!e. N BH bit c$ bit
69

L W 44 >> X

BPA incl$siF bit c$ bit BPA eMcl$siF bit c$ bit deplasare stin7a deplasare dreapta complement fata de ! ($nar)

Operat r"! 8I *it c" *it ?^? este f ! sit a$esea pentr" a +asca an"+ite +"!ti+i $e *iti= $e e4e+p!" c = n N %!''; p"ne pe 5er t ti *iti !"i n6 +ai p"tin *it"! ' >ce! +ai tare@. Operat r"! 80U *it c" *it ?]? este f ! sit pentr" a p"ne pe & *itiJ M = M L OPBY; p"ne pe & in 4 *itii care s"nt setati pe & in M08K. Tre*"ie sa $istingeti c" griFa perat rii pe *iti ^ si ] $e c nect rii ! gici ^^ si ]]6 care i+p!ica e2a!"are $e !a stinga !a $reapta a "nei 2a! ri $e a$e2ar. De e4e+p!"6 $aca 4 este & si A este (6 at"nci 4 ^ A este 5er $ar 4 ^^ A este &. >De ce G@ Operat rii $e $ep!asare [[ si ZZ rea!i5ea5a $ep!asari !a stinga si !a $reapta pentr" peran$"! ! r $in stinga6 c" n"+ar"! $e p 5itii $at $e peran$"! $in $reapta ! r. 0stfe! 4 [[ ( $ep!asea5a !a stinga pe 4 c" $ "a p 5itii6 "+p!in$ ! c"ri!e !i*ere c" 5er = aceasta este echi2a!ent c" in+"!tirea c" %. Dep!asin$ !a $reapta cantitate "nsigne$6 *itii 2acanti se "+p!" c" 5er . Dep!asin$ !a $reapta cantitate c" se+n6 *itii 2acanti se "+p!" c" se+n"! >?$ep!asarea arit+etica?@ pe an"+ite ca!c"!at are6 ca $e e4e+p!" PDP1&& si c" # >?$ep!asare ! gica?@ pe a!te!e. Operat r"! "nar b $a c +p!e+ent"! fata $e & a! "n"i intreg= a$ica6 e! c n2erteste fiecare *it $e & in # si 2ice2esa. 0cest perat r isi gaseste "ti!itate in e4presii $e tip"!
70

M N X%'' care +aschea5a "!ti+ii / *iti ai !"i 4 pe #. De n tat ca 4 ^ b#'' este in$epen$ent $e !"ngi+ea c"2int"!"i si $eci prefera*i!6 $e e4e+p!"6 !"i 4 ^ #&'''##6 care pres"p"ne ca 4 este cantitate c" !"ngi+e $e &/ *iti. - r+a p rta*i!a n" i+p!ica "n c st +ai +are6 $e arece b#'' este e4presie c nstanta si $eci e2a!"ata !a c +pi!are. Pentr" a i!"stra f ! sirea "n ra $in perat rii $e *iti6 sa c nsi$era+ f"nctia 7etbits(M,p,n) care ret"rnea5a >ca$rat !a $reapta@ ci+p"! $e !"ngi+e n *iti a! !"i 4 care incepe !a p 5itia p. Pres"p"ne+ ca *it"! # este ce! +ai $in $reapta si ca n si p s"nt 2a! ri p 5iti2e sensi*i!e. De e4e+p!"6 7etbits(M,+,-) ret"rnea5a 3 *iti in p 5itii!e %6 3 si (6 ca$rati !a $reapta. /# 7etbits (M, p, n) #/ ia n biti de la po3itia p $nsi7ned M, p, n; { ret$rn( (M >> (p6!&n) ) N X(X% 44 n)); } M >> (p6!&n) +"ta ci+p"! $ rit !a sfirsit"! $in $reapta a! c"2int"!"i. Dec!arin$ arg"+ent"! 4 ca fiin$ "nsigne$ ne asig"ra+ ca at"nci cin$ e! este $ep!asat !a $reapta *itii 2acanti 2 r fi "+p!"ti c" # si n" c" *itii $e se+n6 in$epen$ent $e ca!c"!at r"! pe care este e4ec"tat pr gra+"!. b# este c"2int"! c" t ti *itii pe &= $ep!asin$"1! !a stinga c" n p 5itii prin b# [[ n crea+ +asca c" 5er "ri pe cei +ai $in $reapta n *iti si & in rest= c +p!e+entin$"1! c" b face+ +asca $e & pe cei +ai $in $reapta n *iti. 74erciti"! (... M $ificati 7etbits pentr" a n"+ara *itii $e !a stinga !a $reapta. 74erciti"! (./. 8crieti f"nctie 9 r$!ength>@ care ca!c"!ea5a !"ngi+ea "n"i c"2int $e pe ca!c"!at r"! ga5$a6 a$ica n"+ar"! $e *iti $intr1"n int. -"nctia sa fie p rta*i!a in sens"! ca ace!asi c $ s"rsa sa !"cre5e pe t ate ca!c"!at are!e.
71

74erciti"! (.'. 8crieti $reapta c" * p 5itii.

f"nctie rightr t>n6 *@ care r teste intreg"! n !a

74erciti"! (.,. 8crieti f"nctie in2ert>46p6n@ care in2ersea5a >i.e. schi+*a pe & in # si 2ice2ersa@ cei n *iti ai !"i 4 care incep $e !a p 5itia p6!asin$"1i pe cei!a!ti neschi+*ati. (.&#. Operat ri si e4presii $e asignare 74presii $e tip"!J i = i 6 ) in care +e+*r"! sting este repetat in +e+*r"! $rept p t fi scrise intr1 f r+a c n$ensataJ i 6= ) f ! sin$ perat r"! $e asignare ON. MaF ritatea perat ri! r *inari > perat ri ca O6 care a" "n peran$ sting si "n peran$ $rept@ a" "n perat r $e asignare c resp"n5at r ? pN?6 "n$e p este "n"! $inJ 6 & / # 5 44 >> N W L

Daca e& si e( s"nt $ "a e4presii6 at"nciJ e! op= e) este echi2a!ent c" e! = (e!) op (e)) c" e4ceptia ca e& este ca!c"!at F"r"! !"i e(J sing"ra $ata. 8a re+arca+ parante5e!e $in
72

M /= E 6 ! insea+na $e fapt M = M / (E 6 !) si n" M = M / E 6 ! Da+ in c ntin"are6 $rept e4e+p!"6 f"nctia bitco$nt6 care c nt ri5ea5a n"+ar"! $e *iti pe & $intr1"n arg"+ent intreg. n /# bitco$nt(n) #/ contori3ea3a bitii ! din $nsi7ned n; { int b; for (b = %; n G= %; n >>= !) if (n N %!) b66; ret$rn(b); } Casin$ !a parte c nci5i"nea6 perat rii $e asignare a" a2antaF"! ca ei c resp"n$ ce! +ai *ine + $"!"i $e gin$ire a! a+eni! r. N i sp"ne+ ?a$"na+ ( !a i? sa" ? incre+enta+ pe i c" (? si n" ?ia1! pe i6 a$"na (6 ap i p"ne re5"!tat"! inap i in i?. Deci i ON (. In p!"s6 pentr" e4presie c +p!icata6 $e tip"!J EEFal EEpF p- 6 p+" 6 EEpF p! 6 p)"" 6= ) perat r"! $e asignare face c $"! +ai "s r $e inte!es6 $e arece citit r"! n" tre*"ie sa 2erifice sirg"inci s ca ce!e $ "a e4presii s"nt intr1a$e2ar aceeasi
73

sa" sa se intre*e $e ce n" s"nt. In p!"s6 "n perat r $e asignare aF"ta chiar c +pi!at r"! sa pr $"ca "n c $ +ai eficient. 0+ f ! sit $eFa fapt"! ca instr"cti"ne $e asignare are 2a! are si ca p ate sa apara in e4presii= e4e+p!"! ce! +ai c +"nJ while ((c = 7etchar()) G= ?=1) ... 0signari!e f ! sin$ a!ti perat ri $e asignare >ON6 1N6 etc@ p t $e ase+enea sa apara in e4presii6 c" t ate ca acestea se inti+p!a +ai rar. Tip"! "nei e4presii $e asignare este tip"! peran$"!"i sa" sting. 74erciti"! (.3. Intr1"n siste+ c" n"+ere c" c +p!e+ent fata $e (6 4 ^ >41&@ sterge *it"! & ce! +ai $eparte $e 4. >De ceG@. - ! siti aceasta *ser2atie pentr" a scrie 2ersi"ne +ai rapi$a a !"i *itc "nt. (.&&. 74presii c n$iti na!e Instr"cti"ni!e if (a 4 b) 3 = a; else 3 = b; ca!c"!ea5a $esig"r in 5 +a4i+"! $intre a si *. 74presia c n$iti na!a6 scrisa c" perat r"! ternar ?G J? fera "n + $ a!ternati2 pentr" a scrie acest !"cr" prec"+ si c nstr"ctii si+i!are. In e4presiaJ e! Z e) : ee4presia e& se e2a!"ea5a pri+a. Daca ea este n n5er >a$e2arata@ at"nci se e2a!"ea5a e4presia e( si aceasta este 2a! area e4presiei c n$iti na!e. 0!t+interi6 se e2a!"ea5a e3 si aceasta este 2a! area. N"+ai "na $in e4presii!e e( si e3 se e2a!"ea5a. Deci6 pentr" a p"ne in 5 +a4i+"! $intre a si *J
74

3 = (a > b) Z a : b;

#/ 3 = maM(a, b) /#

Tre*"ie sa n ta+ ca e4presia c n$iti na!a este intr1a$e2ar e4presie si ca ea p ate fi f ! sita e4act ca ricare a!ta e4presie. Daca e( si e3 s"nt e4presii $e tip"ri $iferite6 tip"! re"!tat"!"i se $eter+ina $"pa reg"!i!e $e c n2ersie $isc"tate +ai inainte in acest capit !. De e4e+p!"6 $aca f este "n f! at si n este "n int6 at"nci e4presia (n > %) Z f : n este $e tip"! $ "*!e6 in$iferent $aca n este p 5iti2 sa" n". Parante5e!e n" s"nt necesare in F"r"! pri+ei e4presii a "nei e4presii c n$iti na!e6 $e arece p n$erea !"i G J este f arte +ica6 chiar $eas"pra asignarii. 7!e s"nt t t"si rec +an$ate6 pentr" a face partea $e c n$itie a e4presiei +ai "s r $e 2a5"t. 74presii!e c n$iti na!e c n$"c a$esea !a "n c $ s"ccint. De e4e+p!"6 *"c!a "r+at are tipareste N e!e+ente a!e "n"i ta*! "6 &# pe !inie6 c" fiecare c ! ana separata printr1"n *!anc si c" fiecare !inie >inc!"si2 "!ti+a@ ter+inata c" "n sing"r caracter ?!inie n "a?. for (i = %; i 44 K; i66) printf("5*d5c", a i", (i 5 !% == . LL i == K&!) Z I\nI : I I); Un caracter ?!inie n "a? se tipareste t t $"pa a! 5ece!ea e!e+ent si $"pa a! N1!ea e!e+ent. T ate ce!e!a!te e!e+ente s"nt "r+ate $e "n *!anc. C" t ate ca sea+ana c" "n tr"c6 este instr"cti2 sa incercati sa scrieti !"cr"! acesta fara a f ! si e4presia c n$iti na!a. 74erciti"! (.&#. Rescrieti f"nctia ! 9er6 care c n2erteste !itere!e +ari in !itere +ici6 c" e4presie c n$iti na!a in ! c"! !"i if1e!se. (.&(. P n$erea si r$inea $e e2a!"are

75

Ta*e!"! $e +ai F s re5"+a reg"!i!e $e p n$ere si as ciati2itate pentr" t ti perat rii6 inc!"si2 pentr" aceia pe care n" i1a+ $isc"tat inca. Operat rii $e pe aceeasi !inie a" aceeasi p n$ere= !inii!e s"nt in r$ine $e p n$ere $escrescat are6 astfe! ca6 $e e4e+p!"6 ?U?6 ?E? si ?K? a" aceeasi p n$ere6 care este +ai +are $ecit a !"i ?O? ?1?. 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L () " &> . L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L G X 66 && & (tip) / N si3eof L de la dreapta la stin7a L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L / # 5 L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L 6 & L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L 44 >> L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L 4 4= > >= L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L == G= L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L N L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L W L de la stin7a la dreapta L
76

6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L L L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L NN L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L LL L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L Z : L de la dreapta la stin7a L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L = 6= &= etc L de la dreapta la stin7a L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 L , (2apitol$l -) L de la stin7a la dreapta L 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&6 Operat rii 1Z si. s"nt f ! siti pentr" a acce$e +e+*rii str"ct"ri! r= ei 2 r fi isc"tati in Capit !"! /6 i+pre"na c" si5e f >+ari+ea "n"i *iect@. Capit !"! . $isc"ta U >in$irectarea@ si ^ >a$resa !"i ...@. 8a n ta+ ca p n$erea perat ri! r ! gici pe *iti ^6 ] si V este s"* NN i ]N. 0ceasta i+p!ica fapt"! ca e4presii!e care testea5a *iti6 ca $e e4e+p!" if (( M N OPBY) == %) ... tre*"ie sa fie c"prinse in intregi+e intre parante5e6 pentr" a $a re5"!tate!e steptate.
77

0sa c"+ a+ +enti nat +ai inainte6 e4presii!e ce i+p!ica perat ri as ciati2i si c +"tati2i >O6 U6 ^6 V6 ]@ p t fi rearanFate chiar $aca s"nt c"prinse in parante5e. In +area +aF ritate a ca5"ri! r6 aceasta n" $a $iferente= in sit"atia in care ar $a6 se p t f ! si 2aria*i!e te+p rare e4p!icite pentr" a f rta r$ine $e e2a!"are partic"!ara. Ci+*aF"! C6 ca si +aF ritatea ce! r!a!te !i+*aFe6 n" specifica in ce r$ine se e2a!"ea5a peran5ii "n"i perat r. De e4e+p!"6 in instr"cti"ni $e tip"! M = f() 6 7(); f p ate fi e2a!"at inaintea !"i g sa" 2ice2ersa= $eci6 $aca sa" f sa" g a!terea5a 2aria*i!a e4terna $e care $epin$e si cea!a!ta6 4 p ate $epin$e $e r$inea $e e2a!"are. Din n "6 re5"!tate!e inter+e$iare p t fi st cate in 2aria*i!e te+p rare pentr" a fi sig"ri $e an"+ita sec2enta. In + $ si+i!ar6 r$inea in care s"nt e2a!"ate arg"+ente!e "nei f"nctii n" este specficata6 asa ca instr"cti"nea /# printf("5d 5d\n", 66n, power(), n)); #/ [@?BHC

p ate >si si face@ pr $"ce re5"!tate $iferite6 pe $iferite ca!c"!at are6 $epin5in$ $e fapt"! $aca n este incre+entat sa" n" inainte $e ape!"! !"i p 9er. 8 !"tia6 $esig"r6 este sa scrie+J 66n; printf("5d 5d\n", n, power(), n)); 0pe!"ri!e $e f"nctii6 instr"cti"ni!e $e asignare i+*ricate6 perat rii $e incre+entare si $ecre+entare pr 2 aca ?efecte sec"n$are? 1 an"+ita 2aria*i!a este + $ificata ca "n pr $"s a! "nei e2a!"ari $e e4presie. In rice e4presie i+p!icin$ efecte sec"n$are6 p t e4ista s"*ti!e $epen$ente $e r$inea in care s"nt st cate 2aria*i!e!e ce ia" parte in e4presie. O sit"atie nefericita este i!"strata $e instr"cti"neaJ a i" = i66;
78

Chesti"nea c nsta in a sti $aca in$ice!e este n "a 2a! are a !"i i sa" $aca este 2echea. C +pi!at r"! p ate face aceste !"cr"ri in + $"ri $iferite6 $epin5in$ $e interpretarea sa. Cin$ efecte!e sec"n$are >asignare !a 2aria*i!e efecti2e@ a" ! c6 s"nt !asate !a $iscretia c +pi!at r"!"i6 caci cea +ai *"na r$ine $epin$e p"ternic $e arhitect"ra ca!c"!at r"!"i. M ra!a acestei $isc"tii este aceea6 ca scrierea $e c $ ce $epin$e $e r$inea $e e2a!"are6 este pr asta practica $e pr gra+are in rice !i+*aF. Nat"ra!6 e necesar sa sti+ ce !"cr"ri tre*"ie e2itate6 $ar $aca n" sti+ c"+ s"nt e!e fac"te pe $iferite ca!c"!at are6 aceasta in centa ne 2a aF"ta sa ne pr teFa+. >)erificat r"! !"i C6 !int6 $etectea5a +aF ritatea $epen$ente! r $e r$inea $e e2a!"are@.

79

CAPITOLUL 3. CONTROCUC -CUDUCUI Instr"cti"ni!e $e c ntr ! a! f!"4"!"i $intr1"n !i+*aF specifica r$inea in care se fac ca!c"!e!e. Ne1a+ inti!nit $eFa c" ce!e +ai c"n sc"te c nstr"ctii $e c ntr ! a! f!"4"!"i $in !i+*aF"! C6 in e4e+p!e!e $ate in pagini!e anteri are= in ce!e ce "r+ea5a6 2 + c +p!eta set"! $e instr"cti"ni si 2 + fi +"!t +ai precisi as"pra ce! r $isc"tate +ai s"s. 3.&. Instr"cti"ni si *! c"ri O e4presie ca $e e4e+p!" 4 N # sa" iOO sa" printf>...@ $e2ine instr"cti"ne cin$ este "r+ata $e p"nct si 2irg"!a6 ca inJ M = %; i66; printf(...); In !i+*aF"! C6 p"nct12irg"!a este ter+inat r $e instr"cti"ne6 n" separat r6 c"+ este in !i+*aFe!e $e tip"! 0C;OC. 0c !a$e!e R si S s"nt f ! site pentr" a gr"pa i+pre"na instr"cti"ni si $ec!aratii intr1 instr"cti"ne c +p"sa sa" *! c6 asa ca e!e s"nt sintactic echi2a!ente c" sing"ra instr"cti"ne. 0c !a$e!e ce inchi$ instr"cti"ni!e "nei f"nctii sa" ce!e pentr" instr"cti"ni!e +"!tip!e $"pa "n if6 else6 while6 for s"nt e4e+p!e c!are pentr" aceasta. >)aria*i!e!e p t fi $e fapt $ec!arate in!a"ntr"! ricar"i *! c= 2 + $isc"ta $espre aceasta in Capit !"! %@. N" se p"ne nici $ata p"nct si 2irg"!a $"pa ac !a$a inchisa care ter+ina "n *! c. 3.(. If17!se Instr"cti"nea If17!se este f ! sita pentr" !"area $e $eci5ii. - r+a!6 sinta4a ei esteJ if(eMpresie) instr$cti$ne&!
80

else instr$cti$ne&) "n$e partea ?else? este pti na!a. ?74presia? este e2a!"ata= $aca este ?a$e2arata? >a$ica6 are 2a! are nen"!a@6 ?instr"cti"ne1&? este e4ec"tata. Daca ea este ?fa!sa? >?e4presia? este 5er @ si $aca e4ista partea c" ?e!se?6 se e4ec"ta in schi+* ?instr"cti"ne1(?. De arece "n ?if? testea5a p"r si si+p!" 2a! area n"+erica a "nei e4presii6 s"nt p si*i!e an"+ite presc"rtari $e c $. Ce! +ai c!ar e4e+p!" este scriin$ if(eMpresie) in ! c $e if(eMpresie G= %) Cite $ata6 acest !"cr" este nat"ra! si c!ar. 0!ta$ata p ate parea cifrat. De arece partea c" ?else? a "n"i if1e!se este pti na!a6 se p ate aF"nge !a a+*ig"itate cin$ se +ite "n e!se $intr1 sec2enta i+*ricata $e if1"ri. 0ceasta este re5 !2ata6 ca $e *icei6 asaJ e!se este as ciat c" if1"! anteri r ce! +ai apr piat6 care n" face pereche c" "n ?if?. De e4e+p!"6 inJ if (n > %) if (a > b) 3 = a; else 3 = b; else face pereche c" if ce! +ai $ina"ntr"6 asa c"+ a+ aratat prin ta*"!are. Daca n" $ ri+ aceasta6 tre*"ie sa f ! si+ ac !a$e pentr" a f rta as cierea p tri2itaJ if (n > %) { if (a > b) 3 = a;
81

} else

3 = b;

0+*ig"itatea este 2ata+at are in$e se*i in sit"atii ca "r+at areaJ if (n > %) for (i = %; i 4 n; i66) if (s i" > %) { printf("..."); ret$rn(i); } else #/ >@=K[ /# printf("error& n is 3ero \n"); Ta*"!area arata neechi2 c ceea ce $ ri+6 $ar c +pi!at r"! n" inte!ege acest +esaF6 si1! as cia5a pe else c" if1"! ce! +ai $ina"ntr". 0cest tip $e er are p ate fi f arte gre" $e gasit. 0pr p 6 sa n ta+ ca e4ista "n p"nct si 2irg"!a $"pa 5 N a inJ if (a > b) 3 = a; else 3 = b; 0ceasta $e arece6 gra+atica!6 $"pa if "r+ea5a instr"cti"ne si instr"cti"ne $e asignare $e tip"! 5 N a se ter+ina int $ea"na c" p"nct si 2irg"!a. 3.3. 7!se1If C nstr"ctia if (eMpresie) instr$cti$ne
82

else if (eMpresie) instr$cti$ne else if (eMpresie) instr$cti$ne else instr$cti$ne apare atit $e $es incit este $e+n $e p"rtat $isc"tie sc"rta si separata as"pra ei. 0ceasta sec2enta $e if1"ri este ca!ea cea +ai genera!a $e a scrie $eci5ii +"!tip!e. 74presii!e s"nt e2a!"ate in r$ine= $aca e4presie este a$e2arata6 instr"cti"nea as ciata c" ea este e4ec"tata6 si aceasta ter+ina intreg"! !ant. C $"! pentr" fiecare ?instr"cti"ne? este fie instr"cti"ne6 fie "n gr"p intre ac !a$e. U!ti+a parte $e ?e!se? +anip"!ea5a ca5"! ?nici"na $in ce!e +ai $e s"s? sa" i+p!icit6 in care nici "na $in c n$itii n" este in$ep!inita. Cite $ata n" e4ista nici acti"ne e4p!icita pentr" ca5"! i+p!icit= in acest ca56 else instr$cti$ne

p ate fi +isa6 sa" p ate fi "ti!a pentr" 2erificarea $e er ri6 pentr" a prin$e c n$itie ?i+p si*i!a?. Pentr" a i!"stra $eci5ie tri2a!enta6 $a+ f"nctie *inara $e ca"tare6 care $eci$e $aca 2a! are partic"!ara 4 apare intr1"n ta*! " s rtat 2. 7!e+ente!e !"i 2 tre*"ie sa fie in r$ine crescat are. -"nctia ret"rnea5a p 5itia >"n n"+ar intre # si n1&@ $aca 4 apare in 26 si 1& $aca n". binarE (M, F, n) #/ 7aseste F !", ..., F n&!" /# int M, F ", n; { int low, hi7h, mid; low = %; hi7h = n & !; while (low 4= hi7h) { mid = (low 6 hi7h) # );
83

pe

in

F %",

if (M 4 F mid") hi7h = mid & !; else if (M > F mid") low = mid 6 !; else #/ 7asit potriFirea /# ret$rn(mid); } ret$rn(&!);

Deci5ia f"n$a+enta!a este aceea $aca 4 este +ai +ic $ecit6 +ai +are $ecit sa" ega! c" e!e+ent"! $in +iF! c 2L+i$M !a fiecare pas= aceasta este nat"ra! pentr" "n if1e!se. 3.%. 89itch Instr"cti"nea s9itch este rea!i5at r specia! $e $eci5ii +"!tip!e care testea5a $aca e4presie se p tri2este c" "na $intr1"n n"+ar $e 2a! ri c nstante si ra+ifica c resp"n5at r pr gra+"!. In capit !"! & a+ scris "n pr gra+ care c nt ri5ea5a aparitii!e fiecarei cifre6 a spati"!"i6 si a t"t"r r ce! r!a!te caractere6 f ! sin$ sec2enta $e if ...else. Da+ in c ntin"are ace!asi pr gra+ c" instr"cti"nea s9itch. main() #/ contori3ea3a cifre , blanc$ri , alte caractere /# { int c, i, nwhite, nother, ndi7it !%"; nwhite = nother = %; for (i = %; i 4 !%; i66) ndi7it i" = %; while ((c = 7etchar()) G= ?=1) switch (c) { case I%I: case I!I: case I)I:
84

case I-I: case I+I: case I,I: case I*I: case I'I: case I(I: case I.I: ndi7it c&I%I"66; break; case I I: case I\nI: case I\tI: nwhite66; break; defa$lt: nother66; break; } printf("di7its ="); for (i = %; i 4 !%; i66) printf(" 5d", ndi7it i"); printf("\nwhite space= 5d, nwhite,nother); }

other=

5d\n",

Bwitch e2a!"ea5a e4presia intreaga $in parante5e >in acest pr gra+ caracter"! c@ si c +para 2a! area ei c" t ate ca5"ri!e. -iecare ca5 tre*"ie sa fie etichetat c" c nstanta intreaga sa" caracter sa" c" e4presie c nstanta. Daca "n ca5 se p tri2este c" 2a! area e4presiei6 e4ec"tia incepe !a ace! ca5. Ca5"! etichetat ?defa$lt? este e4ec"tat $aca nici "n"! $in ca5"ri n" este satisfac"t. Un ?defa$lt? este pti na!= $aca e! n" este pre5ent si nici "n"! $in ca5"ri n" se p tri2este n" se e4ec"ta nici acti"ne. Ca5"ri!e si ?defa$lt? p t apare in rice r$ine. Ca5"ri!e tre*"ie sa fie t ate $iferite. Instr"cti"nea break $ec!ansea5a iesire i+e$iata $in switch. De arece ca5"ri!e ser2esc $ ar ca etichete6 $"pa ce c $"! "n"i ca5 a f st e4ec"tat6 e4ec"tia c ntin"a spre "r+at area instr"cti"ne $aca n" n" !"ati
85

acti"ne e4p!icita spre a iesi. Treak si ret"rn s"nt + $"ri!e ce!e +ai "5"a!e $e a parasi instr"cti"ne s9itch. O instr"cti"ne s9itch p ate fi $e ase+enea f ! sita si pentr" a f rta iesire i+e$iata $intr1 *"c!a while6 for sa" do6 asa c"+ 2 + $isc"ta +ai $eparte in acest capit !. Ra+ificarea in ca5"ri este si *"na si rea. Pe partea p 5iti2a6 ea per+ite +ai +"!te ca5"ri pentr" sing"ra acti"ne6 asa c"+ s"nt ca5"ri!e pentr" *!anc6 ta* sa" !inie n "a in acest e4e+p!". Dar i+p!ica $e ase+enea fapt"! ca6 in + $ n r+a!6 fiecare ca5 tre*"ie sa se ter+ine c" "n break6 pentr" a pre2eni ra+ificarea pe ca5"! "r+at r. Iesirea $intr1"n ca5 in a!t"! n" este *"na6 fiin$ inc!inata spre $e5integrare at"nci cin$ pr gra+"! este + $ificat. C" e4ceptia etichete! r +"!tip!e pentr" "n sing"r ca56 aceste iesiri $intr1"n ca5 in a!t"! tre*"ie f ! site c" ec n +ie. Ca pr *!e+a $e f r+a *"na6 p"neti "n *rea: $"pa "!ti+"! ca5 >!a n i6 ca5"! $efa"!t@ chiar $aca ! gic n" este necesar. Intr1 5i cin$ 2eti a$a"ga !a sfirsit "n ca5 n "6 aceasta *"catica $e pr gra+are $efensi2a 2a 2a sa!2a. 74erciti"! 3.&. 8crieti f"nctie e4pan$>s6 t@ care c n2erteste caractere!e $e tip"! !"i ?!inie n "a? si ?ta*? in sec2ente escape 2i5i*i!e $e tip"! ?Tn? si ?Tt? in ti+p ce se c pia5a sir"! s in sir"! t. - ! siti instr"cti"nea s9itch. 3... B"c!e 1 >hile si 1or 0+ inti!nit $eFa *"c!e!e 9hi!e si f r. In while (eMpresie) instr$cti$ne ?e4presie? este e2a!"ata. Daca ea este nen"!a6 ?instr"cti"ne? este e4ec"tata si ?e4presie? este ree2a!"ata. 0cest cic!" c ntin"a atita ti+p cit ?e4presie? n" este 5er 6 iar cin$ ea $e2ine 5er e4ec"tia se reia $e $"pa ?instr"cti"ne?. Instr"cti"nea f rJ for (eMpr!; eMpr); eMpr-) instr$cti$ne este echi2a!enta c"
86

eMpr!; while (eMpr)) { instr$cti$ne eMpr-; } Din p"nct $e 2e$ere gra+atica!6 ce!e trei c +p nente a!e "nei *"c!e f r s"nt e4presii. In +aF ritatea ca5"ri! r6 eMpr& si eMpr- s"nt asignari sa" ape!"ri $e f"nctii iar eMpr( este e4presie re!ati na!a. Oricare $in ce!e trei parti p ate fi +isa6 c" t ate ca p"nct12irg"!a c resp"n5at are tre*"ie sa ra+ina. Daca eMpr! sa" eMpr- este !asata afara6 i n" +ai este incre+entat. Daca test"!6 eMpr) n" este pre5ent6 e! este !"at ca fiin$ per+anent a$e2arat6 asa incitJ for (;;) { ... { este *"c!a infinita6 si pr *a*i! $e spart c" a!te +iF! ace >ca $e e4e+p!"6 "n *rea: sa" ret"rn@. - ! sirea !"i while sa" a !"i for este in +are +as"ra "n s"*iect $e g"st. De e4e+p!"6 inJ while ((c = 7etchar()) == I I LL c == I\nI LL c == I\tI) ; #/ sari caracterele de spatiere /# n" e4ista nici initia!i5are sa" reinitia!i5are6 asa ca 9hi!e pare cea +ai nat"ra!a. B"c!a f r este c!ar s"peri ara at"nci cin$ e4ista si+p!a initia!i5are si reinitia!i5are6 $e arece ea pastrea5a instr"cti"ni!e $e c ntr ! a! *"c!ei i+pre"na si !a ! c 2i5i*i! in 2irf"! *"c!ei. 0cest !"cr" este ce! +ai e2i$ent inJ for (i = %; i 4 K; i66)
87

care este 2arianta in C pentr" pre!"crarea pri+e! r N e!e+ente $intr1"n ta*! "6 ana! g c" *"c!a DO $in -ORTR0N si PCE&. C" t ate acestea6 ana! gia n" este perfecta6 $e arece !i+ite!e "nei *"c!e f r p t fi a!terate $in interi r"! *"c!ei si 2aria*i!a $e c ntr ! i isi pastrea5a 2a! area cin$ *"c!a se ter+ina6 in$iferent c"+. De arece c +p nente!e "nei *"c!e for s"nt e4presii ar*itrare6 *"c!e!e for n" s"nt !i+itate !a pr gresii arit+etice. C" t ate acestea6 este "n pr st sti! $e pr gra+are ace!a $e a f rta ca!c"!e neinr"$ite intr1 *"c!a f r= +ai *ine re5er2ati1!e pentr" peratii!e $e c ntr ! a!e *"c!ei. Ca "n e4e+p!" +ai +are6 iata a!ta 2ersi"ne a f"nctiei at i pentr" c n2ertirea "n"i sir in echi2a!ent"! sa" n"+eric. 0cest e4e+p!" este +ai genera!= e! perea5a c" *!anc"ri pti na!e nese+nificati2e si c" se+n pti na! OE1. >Capit !"! % 2a $escrie f"nctia atof care face aceeasi c n2ersie pentr" n"+ere f! tante@. 8tr"ct"ra $e *a5a a pr gra+"!"i ref!ecta f r+a intrariiJ sari peste spatii!e a!*e 6 $aca e4ista ia se+n"!6 $aca e4ista ia partea intreaga6 c n2erteste1 -iecare pas isi face partea !"i si !asa !"cr"ri!e intr1 stare c"rata pentr" "r+at r"!. Intreg"! pr ces se ter+ina !a pri+"! caracter care n" p ate fi parte a "n"i n"+ar. atoi(s) #/ conFerteste pe s in intre7 /# char s "; { int i, n, si7n; for (i = %; s i" ==I I LL s i" ==I\nI LL s i" == I\tI;i66) ; #/ sari spatiile albe /# si7n = !; if (s i" == I6I LL s i" == I&I) #/ semn$l /# si7n = (s i66" == I6I) Z ! : &!; for (n = %; s i" >= I%I NN s i" 4= I.I; i66)
88

n = !% / n 6 s i" & I%I; ret$rn(si7n / n)

02antaF"! pastrarii centra!i5ate a c ntr !"!"i *"c!ei este si +ai c!ar at"nci cin$ e4ista +ai +"!te *"c!e i+*ricate. Ur+at area f"nctie este s rtare she!! pentr" "n ta*! " $e intregi. I$eea $e *a5a a s rtarii she!! este aceea ca in sta$ii!e $e incep"t se c +para e!e+ente in$epartate si n" ce!e a$iacente6 ca in s rtari!e si+p!e *a5ate pe interschi+*are. 0ceasta tin$e sa e!i+ine cantitati +ari $e $e5 r$ine6 rapi$6 asa ca sta$ii!e "r+at are a" +ai p"tin $e !"cr". Inter2a!"! $intre e!e+ente!e c +parate sca$e treptat spre "n"6 p"nct in care s rtarea $e2ine efecti2 +et $a $e interschi+*are a$iacenta. shell(F, n) #/ sortea3a F %", ...,F n&!" in ordine crescatoare /# int F ", n; { int 7ap, i, :, temp; for (7ap = n # ); 7ap > %; 7ap #= )) for (i = 7ap; i 4 n; i66) for (: = i & 7ap; :>= % NN F :" > F :67ap"; : &= 7ap){ temp = F :"; F :" = F : 6 7ap"; F : 6 7ap" = temp; } } 8"nt aici trei *"c!e i+*ricate. Cea +ai $inafara c nt !ea5a $istanta $intre e!e+ente!e c +parate6 c ntractin$1 $e !a nE( prin inF"+atatire !a fiecare pas6 pina cin$ $e2ine 5er . B"c!a $in +iF! c c +para fiecare pereche $e e!e+ente care este separata $e "n ?gap?= *"c!a cea +ai $in interi r !e in2ersea5a pe ace!e e!e+ente care n" s"nt in r$ine. De arece ?gap? p ate fi re$"s !a & e2ent"a!6 t ate e!e+ente!e s"nt e2ent"a! r$ nate c rect. 8a n ta+ ca genera!itatea !"i ?f r? face ca *"c!a e4teri ara sa ai*a aceeasi f r+a ca ce!e!a!te6 chiar $aca n" este pr gresie arit+etica.
89

Un perat r fina! in !i+*aF"! C este 2irg"!a ?6? care isi gaseste a$esea "ti!i5are in instr"cti"nea f r. O pereche $e e4presii separate printr1 2irg"!a este e2a!"ata $e !a stinga spre $reapta si tip"! si 2a! area re5"!tat"!"i s"nt tip"! si 2a! area peran$"!"i $in $reapta. 0stfe!6 intr1 instr"cti"ne f r este p si*i! sa p!asa+ e4presii +"!tip!e in parti 2ariate6 $e e4e+p!" sa pre!"cra+ $ i in$ici in para!e!. 0cest !"cr" este i!"strat $e f"nctia re2erse>s@ care in2ersea5a pe ! c "n sir s. reFerse(s) #/ inFersea3a pe loc sir$l s /# char s "; { int c, i, :; for (i = %, : = strlen(s) & !; i 4 :; i66, :&&) { c = s i"; s i" = s :"; s :" = c; } } )irg"!e!e care separa arg"+ente!e f"nctii! r6 2aria*i!e!e $in $ec!aratii6 etc nici n" s"nt perat ri ?2irg"!a? si n" garantea5a e2a!"area $e !a stinga !a $reapta. 74erciti"! 3.(. 8crieti f"nctie eMpand(s!, s)) care e4pan$ea5a n tatii!e sc"rte $e tip"! a15 in sir"! s& in !ista echi2a!enta si c +p!eta abc....ME3 in s(. 8"nt per+ise !itere +ari si +ici si cifre= sa fiti pregatiti sa tratati si ca5"ri $e tip"! a1*1c si a15#13 si 1a15. >O c n2entie "ti!a este aceea ca ?1?!a incep"t este c nsi$erat ca atare@. 3./. B"c!e Ro 1 >hile B"c!e!e 9hi!e si f r i+partasesc atri*"t"! $e testare a c n$itiei $e ter+inare !a incep"t"! *"c!ei +ai $egra*a $ecit !a sfirsit"! ei6 asa c"+ a+ $isc"tat in Capit !"! &. 0! trei!ea tip $e *"c!e in C 1 *"c!a $ 19hi!e 1 testea5a c n$itia !a
90

sfirsit6 $"pa ce a e4ec"tat intreg c rp"! *"c!ei= c rp"! este e4ec"tat ce! p"tin $ata. 8inta4a ei este do instr$cti$ne while (eMpresie); ?Instr"cti"ne? este e4ec"tata si ap i ?e4presie? este e2a!"ata. Daca este a$e2arata6 ?instr"cti"ne? se e4ec"ta $in n "6 s.a.+.$. Daca ?e4presie? $e2ine fa!sa6 *"c!a se ter+ina. 0sa c"+ este $e asteptat6 *"c!a ?$ 19hi!e? este f ! sita +ai p"tin $ecit while si for6 pr *a*i! .K $in t ta!"! $e f ! sire a *"c!e! r. C" t ate acestea6 ea este $in ti+p in ti+p 2a! r asa6 ca in e4e+p!"! "r+at r6 "n$e f"nctia itoa c n2erteste "n n"+ar intr1"n sir $e caractere >in2ersa !"i atoi@. C"crarea este p"tin +ai c +p!icata $ecit se pare !a pri+a 2e$ere6 $e arece +et $e!e "s are $e generare $e cifre !e generea5a intr1 r$ine gresita. 0+ a!es ca!ea $e a genera sir"! in2ers ap i $e a1! in2ersa. s /# itoa (n, s) #/ conFerteste pe n in caractere in

char s "; int n; { int i, si7n; if ((si7n = n) 4 %) #/ semn$l inre7istrarii /# n = &n; #/ face pe n po3itiF /# i = %; do { #/ 7enerea3a cifre in ordine inFersa /# s i66" = n 5 !% 6I%I;#/ia $ramatoarea cifra/# } while ((n #= !%) > %); #/ ster7e&o /#
91

if (si7n 4 %) s i66" = I&I; s i" = I\%I; reFerse(s);

B"c!a $ 19hi!e este necesara6 sa" ce! p"tin c n2ena*i!a $e arece ce! p"tin "n caracter tre*"ie p"s in +atricea s6 in$iferent $e 2a! area !"i n. 0+ f ! sit $e ase+enea ac !a$e!e in F"r"! sing"rei instr"cti"ni ce c +p"ne c rp"! *"c!ei do&while6 chiar $aca n" s"nt necesare pentr" ca citit r"! gra*it sa n" c nsi$ere gresit partea c" while ca fiin$ incep"t"! "nei *"c!e while. 74erciti"! 3.3. In repre5entarea n"+ere! r ca si c +p!e+ente fata $e ( 2ersi"nea n astra pentr" it a n" f"ncti nea5a pentr" n"+ar"! negati2 ce! +ai +ic6 a$ica pentr" 2a! area !"i n ega!a c" 1>( !a p"terea $i+ensi"ne c"2int1&@. 74p!icati $e ce. M $ificati f"nctia pentr" a f"ncti na c rect si pentr" aceasta 2a! are6 in$iferent $e ca!c"!at r"! pe care se e4ec"ta. 74erciti"! 3.%. 8crieti f"nctie ana! aga itob(n, s@ care c n2erteste intregii fara se+n n intr1 repre5entare *inara pe caracter in s. 8crieti itoh6 care c n2erteste "n intreg intr1"n n"+ar he4a5eci+a!. 74erciti"! 3... 8crieti 2ersi"ne a !"i it a care accepta trei arg"+ente in ! c $e $ "a. 0! trei!ea arg"+ent este "n ci+p $e !"ngi+e +ini+a= n"+ar"! c n2ertit tre*"ie c +p!etat c" *!anc"ri !a stinga6 $aca e necesar6 pentr" a se inscrie in ci+p"! $at. 3.'. Brea: 0$esea este c n2ena*i! sa c ntr !a+ iesiri!e $in *"c!e a!tfe! $ecit testin$ c n$itia !a incep"t"! sa" sfirsit"! *"c!ei. Instr"cti"nea *rea: fera iesire +ai $e2re+e $in for6 while6 do si switch. O instr"cti"ne break face ca *"c!a >sa" switch1"!@ cea +ai $in interi r sa se ter+ine i+e$iat. Ur+at r"! pr gra+ sterge *!anc"ri!e si ta*"ri!e $e !a sfirsit"! fiecarei !inii $e intrare6 f ! sin$ "n *rea: pentr" a iesi $in *"c!a !a >pri+"!@ ce! +ai $in $reapta caracter n n*!anc sa" n nta*
92

;define OPQ<HK? !%%% ; main() #/ ster7e caracterele albe de la sfirsit$l liniei /# { int n; char line OPQ<HK?"; while ((n = 7etline(line, OPQ<HK?)) > %) { while( &&n > %) if (line n" G= I I NN line n" G= I\tI NN line n" G= I\nI) break; line n6!" = I\%I; printf("5s\n", line); } } 7etline ret"rnea5a !"ngi+ea !iniei. B"c!a while $in interi r incepe c" "!ti+"! caracter a! !"i !ine >sa ne a+inti+ ca 11n $ecre+entea5a pe n inainte $e a1i f ! si 2a! area@ si ca"ta inap i pri+"! caracter care n" este *!anc6 ta* sa" >ne9!ine@ !inie n "a. B"c!a este sparta cin$ este gasit "n"! $in acestea sa" cin$ n $e2ine negati2 >a$ica at"nci cin$ intreaga !inie a f st ana!i5ata@. 0r tre*"i sa 2erificati ca este c rect si in ca5"! in care !inia este f r+ata n"+ai $in caractere a!*e >$e spatiere@. O a!ternati2a !a break c nsta in a p"ne test"! chiar in *"c!aJ while ((n = 7etline(line, OPQ<HK?)) > %) { while (&&n >= % NN (line n" == I I LL line n" == line n" == I\nI)) ; ... }
93

I\tI

LL

0ceasta este inferi ara 2ersi"nii prece$ente6 $e arece test"! este +ai gre" $e inte!es. Teste!e care necesita "n a+estec $e ^^ 6]]6P sa" parante5e s"nt in genera! inter5ise. 3.,. C ntin"e Instr"cti"nea c ntin"e este !egata $e *rea:6 $ar +"!t +ai p"tin f ! sita= ea face sa inceapa "r+at area iteratie a *"c!ei > while6 for6 do@. In ca5"! !"i while si do aceasta insea+na ca partea $e test se e4ec"ta i+e$iat= in ca5"! !"i for6 c ntr !"! se trece !a fa5a $e reinitia!i5are. >c ntin"e se ap!ica n"+ai !a *"c!e6 n" si !a switch. Un c ntin"e ina"ntr"! "n"i s9itch $intr1 *"c!a $ec!ansea5a "r+at area iteratie a *"c!ei. Ca e4e+p!"6 frag+ent"! "r+at r pre!"crea5a n"+ai e!e+ente!e p 5iti2e $intr1"n ta*! " a= 2a! ri!e negati2e s"nt sariteJ for (i = %; i 4 K; i66) { if (a i" 4 %) #/ sari elementele ne7atiFe contin$e; ...#/ prel$crea3a elementele po3itiFe /# } Instr"cti"nea c ntin"e este f ! sita a$esea cin$ partea $in *"c!a care "r+ea5a este c +p!icata6 astfe! ca in2ersin$ "n test si inc!"5in$ inca "n ni2e!6 ar i+*rica pr gra+"! si +ai +"!t. 74erciti"! 3./. 8crieti "n pr gra+ care c pia5a intrarea in iesire6 c" e4ceptia ca e! tipareste sing"ra $ata !inie $intr1"n gr"p $e !inii a$iacente i$entice. >0ceasta este 2ersi"ne si+p!a a "ti!itar"!"i UNID "nic.@ 3.3. ; t 1"ri si etichete Ci+*aF"! C fera instr"cti"nea 1 $e care se p ate a*"5a ricit 1 g t si etichete pentr" ra+ificare. - r+a!6 g t n" este necesara nici $ata si in practica este apr ape int $ea"na "s r sa scrie+ c $ fara ea. N i n" a+ f ! sit g t in aceasta carte.
94

/#

C" t ate acestea6 2a s"gera+ cite2a sit"atii in care g t isi p ate gasi ! c"!. Cea +ai *isn"ita f ! sire este aceea $e a a*an$ na pre!"crarea in an"+ite str"ct"ri p"ternic i+*ricate6 $e e4e+p!" $e a iesi afara $in $ "a *"c!e $e $ata. Instr"cti"nea break n" p ate fi f ! sita $e arece ea paraseste n"+ai *"c!a cea +ai $in interi r. 0stfe!J for (...) for (...) { ... if (de3astr$) 7oto error; } ... error: desc$rca belea$a 0ceasta rgani5are este +ane2ra*i!a $aca c $"! $e +in"ire a er rii este netri2ia! si $aca er ri!e p t apare in ! c"ri $iferite. O eticheta are aceeasi f r+a ca si "n n"+e $e 2aria*i!a si este "r+ata $e $ "a p"ncte. 7a p ate fi atasata ricarei instr"cti"ni $intr1 aceeasi f"nctie ca si g t . Ca "n a!t e4e+p!"6 sa c nsi$era+ pr *!e+a gasirii pri+"!"i e!e+ent negati2 $intr1"n ta*! " *i$i+ensi na!. >Ta*! "ri!e +"!ti$i+ensi na!e s"nt $isc"tate in Capit !"! .@. O p si*i!itate esteJ for (i = %; i 4 K; i66) for (: = %; : 4 O; :66) if (F i" :" 4 %) 7oto fo$nd; #/ n$ s&a 7asit /# ... fo$nd: #/ s&a 7asit la po3itia i,: /# ...

95

C $"! i+p!icin$ "n g t p ate fi scris int $ea"na fara 7o to6 chiar $aca pret"! pentr" aceasta este 2aria*i!a s"p!i+entara6 sa" teste repetate. De e4e+p!"6 ca"tarea in ta*! " $e2ineJ fo$nd = %; for (i = %; i 4 K NN Gfo$nd; i66) for (: = %; : 4 O NN Gfo$nd; :66) fo$nd = F i" :" 4 %; if (fo$nd) #/ a fost la i&!, :&! /# ... else #/ n$ a fost 7asit /# ... C" t ate ca n" s"nte+ $ g+atici in pri2inta s"*iect"!"i6 se pare ca e a$e2arat ca instr"cti"nea g t ar tre*"i f ! sita c" ec n +ie6 $aca n" chiar $e! c.

96

C0PITOCUC % -UNCII `I 8TRUCTUR0 PRO;R0MUCUI -"nctii!e sparg pr gra+e!e c" ca!c"!e +ari in +ai +"!te pr gra+e +ai +ici6 si per+it a+eni! r sa c nstr"iasca incepin$ $e !a ceea ce a" fac"t a!tii $eFa6 in ! c $e a p rni t t"! $e !a capat. -"nctii!e p tri2ite p t asc"n$e a$esea >parti@ $eta!ii a!e peratii! r $in parti a!e pr gra+"!"i pe care n" e ne2 ie sa !e c"n aste+6 c!arificin$ astfe! intreg"!6 si "s"rin$ stenea!a $e a face + $ificari. Ci+*aF"! C a f st pr iectat pentr" a face f"nctii!e eficiente si "s r $e f ! sit= pr gra+e!e C c nsta"6 in genera! +ai $egra*a $in n"+er ase f"nctii +ici $ecit $in cite2a f"nctii +ari. Un pr gra+ p ate fi re5i$ent intr1"n"! sa" +ai +"!te fisiere s"rsa in rice + $ c n2ena*i!= fisiere!e s"rsa p t fi c +pi!ate separat si incarcate i+pre"na6 i+pre"na c" a!te f"nctii c +pi!ate anteri r ce se gasesc in *i*!i teci. N" 2 + intra in inti+itatea pr ces"!"i aici6 $e arece $eta!ii!e 2aria5a $e !a "n siste+ !a a!t"!. MaF ritatea pr gra+at ri! r s"nt fa+i!iari5ati c" f"nctii!e ?$e *i*!i teca? pentr" intrari si iesiri >7etchar6 p$tchar@ si ca!c"!e!e n"+erice >sin6 c s6 scrt@. In acest capit ! 2 + pre5enta +ai +"!te $espre scrierea $e n i f"nctii. %.&. N ti"ni $e *a5a Pentr" a incepe6 hai$eti sa scrie+ "n pr gra+ care i+pri+a fiecare !inie care ii este intr $"sa si care c ntine "n ?+ $e!? sa" "n sir $e caractere. >0cesta este "n ca5 specia! a! pr gra+"!"i "ti!iar UNID ?grep?.@ De e4e+p!"6 sa ca"ta+ + $e!"! ?the? in "r+at are!e !iniiJ Kow is the time for all 7ood men to come to the aid of their partE. care 2a pr $"ce "r+at area iesireJ Kow is the time
97

men to come to the aid if their partE. 8tr"ct"ra $e *a5a a pr gra+"!"i se i+parte in e4act trei partiJ while (mai eMista o linie) if (linia contine model$l) tipareste&o C" t ate ca se p ate p"ne c $"! pentr" t ate acestea in r"tina principa!a6 + $a!itate +ai *"na este aceea $e a f ! si str"ct"ra nat"ra!a si $e a face $in fiecare parte f"nctie separata. 7ste +ai "s r sa ne c"pa+ $e trei *"cati +ai +ici $ecit $e *"cata +are6 $e arece $eta!ii!e nere!e2ante p t fi in+ r+intate in f"nctii si sansa $e a $a interacti"ni ne$ rite este +ini+a!i5ata. 8i *"cati!e p t fi "ti!e chiar !"ate ap i separat. ?>hile >+ai e4ista !inie@ ? este 7etline6 f"nctie pe care a+ scris1 in Capit !"! & iar ?tipareste1 ? este printf c" care $eFa a+ !"crat s"ficient. 0ceasta insea+na ca n" tre*"ie sa scrie+ $ecit r"tina care $eci$e $aca !inia c ntine 2re aparitie a + $e!"!"i. P"te+ re5 !2a pr *!e+a f"rin$ pr iectare $in PCE&J f"nctia in$e4>s6t@ ret"rnea5a p 5itia sa" in$e4"! $in sir"! s in care incepe sir"! t6 sa" 1&6 $aca s n"1! c ntine pe t. ) + f ! si # in ! c $e & ca p 5itie $e incep"t pentr" s6 $e arece ta*! "ri!e in C incep $in p 5itia #. Cin$6 +ai tir5i" 2 + a2ea ne2 ie $e ca"tare $e + $e! +ai s fisticata6 n" a2e+ $ecit sa in! c"i+ ?in$e4?= rest"! c $"!"i ra+ine ace!asi. Data aceasta schita6 rest"! pr gra+"!"i este fara asc"n5is"ri. Iata ac"+ pr gra+"! intreg6 asa ca p"teti 2e$ea c"+ se p tri2esc *"cati!e i+pre"na. D ar ca ac"+6 + $e!"! care tre*"ie ca"tat este !itera! sir $in arg"+ente!e !"i in$e46 care n" este ce! +ai genera! $intre +ecanis+e. Ne 2 + int arce pe sc"rt pentr" a $isc"ta c"+ sa initia!i5a+ ta*! "ri!e $e caractere si in Capit !"! . 2 + arata c"+ se face + $e!"! "n para+etr" care este setat at"nci cin$ pr gra+"! este !ansat in e4ec"tie. D+ $e ase+enea6 n "a 2ersi"ne 7etline= gasi+ ca este instr"cti2 sa c +parati c" cea $in Capit !"! &. ;define OPQ<HK? !%%%
98

main() #/ 7asiti toate liniile ce contin $n model dat /# { char line OPQ<HK?"; while (7etline(line, OPQ<HK?) > %) if (indeM(line, "the") >= %) printf("5s", line); } 7etline(s, lim) #/ citeste linia in s, ret$rnea3a l$n7imea ei /# char s "; int lim; { int c, i; i = %; while (&&lim > % NN (c = 7etchar()) G= ?=1 NN cG= I\nI) s i66" = c; if (c == I\nI) s i66" = c; s i" = I\%I; ret$rn(i); } indeM(s, t) #/ ret$rnea3a indeM$l l$i t in s, &! in lipsa /# char s ", t "; { int i, :, k; for (i = %; s i" G= I%I; i66) { for (: = i, k = %; t k" G= I\%I NN s :" == t k"; :66, k66) ; if (t k" == I\%I) ret$rn(i); } ret$rn(&!); }
99

-iecare f"nctie are f r+a n$me (lista de ar7$mente, daca eMista) declaratii de ar7$mente, daca eMista { declaratii si instr$cti$ni, daca eMista } 0sa c"+ a+ s"gerat6 an"+ite parti p t sa !ipseasca= f"nctia +ini+a esteJ d$mmE() {} care n" face ni+ic. >O f"nctie care n" face ni+ic este "ti!a "ne ri ca ! c pastrat pentr" $e52 !tari "!teri are in pr gra+@. N"+e!e f"nctiei p ate fi $e ase+enea prece$at $e "n tip $aca f"nctia ret"rnea5a a!tce2a $ecit 2a! are intreaga= acesta este s"*iect"! "r+at r"!"i capit !. Un pr gra+ este t c+ai "n set $e $efinitii $e f"nctii in$i2i$"a!e. C +"nicarea intre f"nctii este >in acest ca5@ fac"ta prin arg"+ente si 2a! ri ret"rnate $e f"nctii= ea p ate fi fac"ta $e ase+enea6 prin 2aria*i!e e4terne. -"nctii!e p t apare in rice r$ine in fisier"! s"rsa6 si pr gra+"! s"rsa p ate fi spart in +ai +"!te fisiere6 pe cin$ f"nctie n" este sparta. Instr"cti"nea ret"rn este +ecanis+"! $e ret"rnare a "nei 2a! ri $in f"nctia ape!ata in ape!ant. Orice e4presie p ate "r+a $"pa instr"cti"nea ret"rnJ ret$rn (eMpresie) -"nctia ape!anta este !i*era sa ign re 2a! area ret"rnata $aca $ reste. Mai +"!t6 n" e necesar sa e4iste nici e4presie $"pa ret"rn= in acest ca56 nici 2a! are n" este ret"rnata ape!ant"!"i. C ntr !"! este $e ase+enea ret"rnat ape!ant"!"i fara nici 2a! are at"nci cin$ e4ec"tia ?se c ntin"a $"pa sfirsit"!? f"nctiei6 atingin$ cea +ai $in $reapta parante5a. N" este i!ega! ci pr *a*i! "n se+n $e neca5 >$eranF@6 $aca f"nctie ret"rnea5a 2a! are $intr1"n ! c si nici 2a! are $in a!t"!. In rice ca5 ?2a! area? "nei f"nctii care n" ret"rnea5a nici "na6 este sig"r "n g"n i. )erificat r"! ?!int? ca"ta si $"pa astfe! $e er ri.
100

Mecanis+"! prin care se c +pi!ea5a si se incarca "n pr gra+ care re5i$a in +ai +"!te fisiere s"rsa 2aria5a $e !a "n siste+ !a a!t"! . Pe siste+"! UNID6 $e e4e+p!"6 c +an$a CC6 +enti nata in Capit !"! &6 face !"cr"! acesta. 8a pres"p"ne+ ca ce!e trei f"nctii se gasesc in trei fisiere n"+ite +ain.c6 get!ine.c si in$e4.c. 0t"nci c +an$aJ 22 main,c,7etline,c,indeM,c c +pi!ea5a ce!e trei fisiere6 p!asea5a c $"! *iect re! ca*i! re5"!tat in fisiere!e +ain. 6 7etline.o si indeM.o si !e incarca pe t ate intr1"n fisier e4ec"ta*i! n"+it a. "t.Daca e4ista 2re er are6 sa sp"ne+ in +ain.c6 fisier"! p ate fi rec +pi!at sing"r si re5"!tat"! incarcat c" fisiere!e *iect anteri are6 c" c +an$aJ 22 main.c 7etline.o indeM.o C +an$a CC f ! seste c n2entia $e n tare ?.c? spre $e se*ire $e ?. ? pentr" a $istinge fisiere!e s"rsa $e fisier"! *iect. 74erciti"! %.&. 8crieti f"nctia rin$e4>s6 t@ care ret"rnea5a p 5itia ce!ei +ai $in $reapta aparitii a !"i t in s6 si 1& $aca n" e nici "na. %.(. -"nctii care ret"rnea5a n n1intregi Pina ac"+6 nici "n"! $in pr gra+e!e n astre n" a c ntin"t 2re $ec!aratieas"pra tip"!"i "nei f"nctii. 0ceasta $e arece i+p!icit f"nctie este $ec!arata prin aparitia ei intr1 e4presie sa" instr"cti"ne6 ca inJ while (7etline(line, OPQ<HK?) > %) Daca "n n"+e care n" a f st $ec!arat apare intr1 e4presie si este "r+at $e parante5a stinga6 e! este $ec!arat $in c nte4t ca fiin$ "n n"+e $e f"nctie. Mai +"!t6 i+p!icit se pres"p"ne ca f"nctie ret"rnea5a "n int. De arece char se transf r+a in int in e4presii6 n" e ne2 ie sa $ec!ara+
101

f"nctii!e care ret"rnea5a char. 0ceste pre5"+tii ac pera +aF ritatea ca5"ri! r6 inc!"si2 t ate e4e+p!e!e n astre $e pina ac"+. Dar ce se inti+p!a $aca f"nctie tre*"ie sa ret"rne5e 2a! are $e a!t tip G M"!te f"nctii n"+erice6 ca sVrt6 sin6 cos ret"rnea5a $ "*!e= a!te f"nctii specia!i5ate ret"rnea5a a!te tip"ri. Pentr" a i!"stra + $"! ! r $e f ! sire 2 + scrie si 2 + f ! si f"nctie atof(s) care c n2erteste sir"! s in echi2a!ent"! !"i in $"*!a preci5ie= atof este e4tensie a !"i at i 6 pentr" care a+ scris in Capit !"! ( si in Capit !"! 3= ea +in"ieste "n se+n pti na! si "n p"nct 5eci+a!6 prec"+ si pre5enta sa" a*senta atit a partii intregi cit si a partii fracti nare.>0ceasta n" este r"tina $e c n2ersie $e intrari $e ina!ta ca!itate= ar !"a +"!t +ai +"!t spati" $ecit ne1a+ pr p"s n i sa f ! si+@. In pri+"! rin$6 atof insasi tre*"ie sa $ec!are tip"! 2a! rii pe care ea ret"rnea5a6 $e arece e! n" este int. De arece float este c n2ertit in $ "*!e in e4presii6 n" are nici "n r st sa sp"ne+ ca atof ret"rnea5a "n float= p"te+ !a fe! $e *ine sa face+ "5 $e preci5ie s"p!i+entara6 sa $ec!ara+ ca ea ret"rnea5a do$ble. N"+e!e tip"!"i prece$e n"+e!e f"nctiei6 ca inJ do$ble atof(s) #/ conFerteste sir$l s in do$ble /# char s "; { do$ble Fal, power; int i, si7n; for (i = %;s i"== I I LL s i"== I\nI LL s i"== I\tI;i66) ; #/ sare spatiile albe (blanc, tab, linie no$a) /# si7n = !; if (s i" == I6I LL s i" == I&I) #/ semn$l /# si7n = (s i66" == I6I) Z ! : &!; for (Fal = %; s i" >= I%I NN s i" 4= I.I; i66) Fal = !% / Fal 6 s i" & I%I; if (s i" == I.I) i66;
102

for (power = !; s i" >= I%I NN s i" 4= I.I; i6 6) { Fal & !% / Fal 6 s i" & I%I; power /= !%;

} ret$rn(si7n / Fal # power);

In a! $ i!ea rin$6 si !a fe! $e i+p rtant6 r"tina ape!anta tre*"ie sa specifice ca atof ret"rnea5a 2a! are n n1int. Dec!aratia este arata in "r+at r"! ca!c"!at r pri+iti2 $e *ir " >a$e2arat si+p!" pentr" *i!ant"! $e 2erificare $e c nt"ri $e carti GP@ care citeste "n n"+ar pe !inie6 prece$at pti na! $e "n se+n si1! a$"na !a t ate n"+ere!e anteri are6 tiparin$ s"+a $"pa fiecare intrare. define OPQ<HK? !%% main() #/ calc$lator r$dimentar de biro$ /# { do$ble s$m, atof(); char line OPQ<HK?"; s$m = %; while (7etline(line, OPQ<HK?) > %) printf("\t5.)f\n", s$m atof(line)); } Dec!aratia do$ble s$m, atof(); sp"ne ca s"+ este "n $ "*!e si ca atof este f"nctie care ret"rnea5a 2a! are do$ble. Ca +ne+ nica6 ea s"gerea5a ca s$m si atof(...) s"nt a+in$ "a 2a! ri f! tante in $"*!a preci5ie. In afara fapt"!"i cin$ atof este $ec!arata e4p!icit in a+*e!e ! c"ri6 !i+*aF"! C pres"p"ne ca ea ret"rnea5a "n intreg si rasp"ns"ri!e pri+ite $e
103

6=

$"+nea2 astra 2 r fi $e neinte!es. Daca atof insasi si ape!"! ei $in +ain a" tip"ri inc nsistente in ace!asi fisier s"rsa6 acest !"cr" 2a fi $epistat $e catre c +pi!at r. Dar $aca >si asta e +ai pr *a*i!@ at f se c +pi!ea5a separat6 nep tri2irea n" 2a fi $etectata si at f 2a ret"rna "n $ "*!e pe care +ain i! 2a trata ca intreg re5"!tin$ rasp"ns"ri i+pre2i5i*i!e > lint prin$e si aceste er ri@. Dat atof6 p"te+ scrie in principi" atoi >c n2ersie $e sir in intreg@ astfe!J atoi(s) #/ conFersie sir s la intre7 /# char s "; { do$ble atof(); ret$rn(atof(s)); } 8a re+arca+ str"ct"ra $ec!aratii! r si a instr"cti"nii ret"rn. )a! area e4presiei $inJ ret$rn (eMpresie) este int $ea"na c n2ertita in tip"! f"nctiei inainte ca re5"!tat"! sa ai*a ! c. Deci 2a! area !"i atof6 "n $ "*!e este c n2ertita a"t +at in int6 cin$ apare intr1 instr"cti"ne ret"rn6 $e arece f"nctia atoi ret"rnea5a "n int. >C n2ersia "nei 2a! ri f! tante intr1"n intreg tr"nchia5a rice parte fracti nara6 asa c"+ a+ 2a5"t in Capit !"! (@. 74erciti"! %.(. 74tin$eti f"nctia atof astfe! incit ea sa +in"iasca si n tatia stiintifica $e f r+a &(3.%.e1/ in care "n n"+ar f! tant p ate fi "r+at $e e sa" 7 si pti na! $e "n e4p nent c" se+n. %.3. Despre arg"+ente!e f"nctii! r In Capit !"! & a+ $isc"tat fapt"! ca arg"+ente!e f"nctii! r s"nt tri+ise prin 2a! area6 a$ica f"nctia ape!ata pri+este c pie te+p rara si pri2ata a fiecar"i arg"+ent si n" a$rese!e ! r. 0ceasta insea+na ca f"nctia n" p ate afecta arg"+ent"! rigina! $in f"nctia ape!anta. Intr1 f"nctie arg"+ent este
104

$e fapt 2aria*i!a ! ca!a initia!i5ata c" 2a! area c" care f"nctia a f st ape!ata. Cin$ "n n"+e $e ta*! " apare ca arg"+ent a! "nei f"nctii ! catia $e incep"t a ta*! "!"i este cea tri+isa= e!e+ente!e n" s"nt c piate. -"nctia p ate a!tera e!e+ente!e ta*! "!"i in$e4in$ c" aceasta 2a! are. 7fect"! este ca ta*! "ri!e s"nt tri+ise prin referinta. In capit !"! . 2 + $isc"ta f ! sirea p interi! r pentr" a per+ite f"nctii! r sa n" a!tere5e ta*! "ri!e $in f"nctii!e ape!ante. -iin$ca 2eni 2 r*a6 n" este "n + $ intr"t t"! satisfacat r ace!a $e a scrie f"nctie p rta*i!a care acepta "n n"+ar 2aria*i! $e arg"+ente6 $e arece n" e4ista nici + $a!itate p rta*i!a pentr" f"nctia ape!ata sa $eter+ine cite arg"+ente i1a" f st tri+ise act"a! intr1"n ape! $at. 0stfe!6 n" p"teti scrie f"nctie p rta*i!a intr1a$e2ar $e arg"+ente6 asa c"+ s"nt f"nctii!e M0D scrise in -ORTR0N sa" PCE&. 7ste in genera! sig"r sa ne c"pa+ c" "n n"+ar 2aria*i! $e arg"+ente $aca f"nctia ape!ata n" f ! seste "n arg"+ent care n" a f st f"rni5at efecti2 si $aca tip"ri!e s"nt c nsistente. printf6 cea +ai c +"na f"nctie in C c" "n n"+ar 2aria*i! $e arg"+ente6 ! seste inf r+atia $in pri+"! sa" arg"+ent pentr" a $eter+ina cite a!te e!e+ente s"nt pre5ente si care s"nt tip"ri!e ! r. 7a es"ea5a "rit $aca ape!ant"! n" f"rni5ea5a s"ficiente arg"+ente sa" $aca tip"ri!e n" s"nt ce!e specificate $e pri+"! arg"+ent. 7a este $e ase+enea nep rta*i!a si tre*"ie + $ificata pentr" $iferite ca!c"!at are. Recipr c6 $aca arg"+ente!e s"nt $e tip c"n sc"t6 este p si*i! sa +arca+ sfirsit"! !istei $e arg"+ente intr1"n + $ c resp"n5at r. De e4e+p!" c" 2a! are $e arg"+ent specia!a >a$resa#@ care specifica sfirsit"! !istei $e arg"+ente. %.%. )aria*i!e e4terne Un pr gra+ C c nsta $intr1 +"!ti+e $e *iecte e4terne6 care s"nt f"nctii sa" 2aria*i!e. 0$Fecti2"! ?e4tern? este f ! sit in pri+"! rin$ in c ntrast c" ?intern?6 care $escrie arg"+ente!e si 2aria*i!e!e a"t +ate $efinite in interi r"! f"nctii! r. )aria*i!e!e e4terne s"nt $efinite in afara ricarei f"nctii si s"nt astfe! $isp ni*i!e p tentia! pentr" +ai +"!te f"nctii. -"nctii!e insesi s"nt int $ea"na e4terne6 $e arece !i+*aF"! C n" per+ite $efinitii $e f"nctii in interi r"! a!t r f"nctii. I+p!icit 2aria*i!e!e e4terne s"nt $e ase+enea
105

?g! *a!e?6 astfe! incit t ate referinte!e !a astfe! $e 2aria*i!a printr1"n ace!asi n"+e >chiar si pentr" f"nctii!e c +pi!ate separat@ s"nt referinte !a "n ace!asi !"cr". In acest sens6 2araia*i!e!e e4terne s"nt ana! age c" COMMON $in -ORTR0N si c" 7DT7RN0C $in PCE&. ) + 2e$ea +ai inc ! c"+ se p t $efini 2aria*i!e si f"nctii e4terne care n" s"nt g! *a! $isp ni*i!e ci s"nt 2i5i*i!e 6in schi+*6 $ ar intr1"n sing"r fisier s"rsa. De arece 2aria*i!e!e e4terne s"nt g! *a! accesi*i!e6 e!e fera a!ternati2a !a arg"+ente $e f"nctii si 2a! ri ret"rnate pentr" c +"nicari $e $ate intre f"nctii. Orice f"nctie p ate acce$e 2aria*i!a e4terna prin referirea n"+e!"i ei6 $aca n"+e!e a f st $ec!arat "n$e2a sa" c"+2a. Daca "n n"+ar +are $e 2aria*i!e tre*"ie sa fie partaFat f ! site $e +ai +"!te f"nctii6 2aria*i!e!e e4terne s"nt +ai c n2ena*i!e si +ai eficiente $ecit !iste!e !"ngi $e arg"+ente. 0sa c"+ a+ preci5at in capit !"! &6 aceasta + $a!itate tre*"ie6 t t"si6 "ti!i5ata c" griFa6 $e arece ea p ate a2ea efecte negati2e as"pra str"ct"rii pr gra+"!"i si p ate c n$"ce !a pr gra+e c" +"!te c ne4i"ni $e $ate intre f"nctii. Un a! $ i!ea + ti2 pentr" f ! sirea 2aria*i!e! r e4terne pri2este initia!i5area. In partic"!ar6 ta*! "ri!e e4terne p t fi initia!i5ate $ar ta*! "ri!e a"t +ate n" p t. ) + trata initia!i5area apr ape $e sfirsit"! acest"i capit !. 0! trei!ea + ti2 pentr" f ! sirea 2araia*i!e! r e4terne este $ +eni"! si ti+p"! ! r $e 2iata. )aria*i!e!e a"t+ate s"nt interne "nei f"nctii= e!e capata 2iata at"nci cin$ r"tina este intr $"sa si $ispar at"nci cin$ r"tina se ter+ina. )aria*i!e!e e4terne6 pe $e a!ta parte6 s"nt per+anente. 7!e n" 2in si p!eaca6 asa ca e!e retin 2a! ri!e $e !a "n ape! $e f"nctie !a a!t"!. Deci6 $aca $ "a f"nctii tre*"ie sa1si partaFe5e niste $ate6 chiar nef ! site $e a!te f"nctii nici $ata6 este a$esea +ai c n2ena*i! $aca $ate!e partaFa*i!e s"nt pastrate in 2aria*i!e e4terne $ecit tri+ise 2ia arg"+ente. 8a e4a+ina+ aceasta chesti"ne +ai $eparte c" "n e4e+p!" +ai +are. Pr *!e+a c nsta in a scrie "n a!t pr gra+ ca!c"!at r6 +ai *"n $ecit ce! anteri r. 0ceasta 2a per+ite O616U6E si N >pentr" a tipari re5"!tat"!@. De arece este intr"cit2a +ai "s r $e i+p!e+entat6 ca!c"!at r"! 2a f ! si n tatia p ! ne5a in2ersa in ! c"! ce!ei ?infi4?. >N tatia p ! ne5a este sche+a f ! sita6 $e e4e+p!"6 $e ca!c"!at are!e $e *"5"nar Ie9!ett1Pac:ar$@. In n tatia p ! ne5a in2ersa6 fiecare perat r isi "r+ea5a peran5ii= e4presie ?infi4?6 $e tip"!J
106

(! & )) / (+ 6 ,) = se intr $"ce astfe!J ! ) & + , 6 / = Parante5e!e n" s"nt necesare. I+p!e+entarea este apr ape si+p!a. -iecare peran$ este $ep"s intr1 sti2a. Cin$ s seste "n perat r6 n"+ar"! $e peran5i >$ i pentr" perat rii !iniari@ s"nt sc si $in sti2a si !i se ap!ica perat r"! iar re5"!tat"! este $ep"s $in n " in sti2a. In e4e+p!"! $e +ai s"s6 & si ( s"nt $ep"si in sti2a6 ap i s"nt in! c"iti $e $iferenta ! r6 1& . 0p i % si . s"nt $ep"si in sti2a6 ap i s"nt in! c"iti $e s"+a ! r 63. Pr $"s"! !"i 1& c" 36 ii in! c"ieste ap i in sti2a. Operat r"! N tipareste e!e+ent"! $in 2irf"! sti2ei fara a1! $istr"ge >se p t face astfe! 2erificari inter+e$iare@. Operatii!e $e intr $"cere si e4tragere $in sti2a s"nt tri2ia!e $ar6 $aca se a$a"ga $etectia $e er ri $e ti+p si rec"perarea ! r6 c $"ri!e s"nt s"ficient $e !"ngi pentr" a fi +ai *ine sa !e p"ne+ in f"nctii separate $ecit sa repeta+ c $"! $e1a !"ng"! intreg"!"i pr gra+. Ca fe!6 2 + c nsi$era f"nctie separata pentr" a$"cerea "r+at r"!"i peran$ sa" perat r $e !a intrare. 0stfe!6 str"ct"ra pr gra+"!"i este 9hi!e >"r+at r"! perat r sa" peran$ n" este sfirsit"! $e fisier@ if (n$mar) p$ne&l in stiFa else if (operator) scoate operan3ii din stiFa eMec$ta operatia eMtra7e re3$ltat$l else eroare Deci5ia principa!a $e pr iectare care n" a f st inca $isc"tata este as"pra ! c"!"i sti2ei6 a$ica ce r"tina p ate acce$e $irect. O p si*i!itate este aceea $e a tine in +ain si sa trece+ sti2a si p 5itia ei c"renta r"tine! r care
107

f ! sesc pentr" intr $"cere si e4tragere $e $ate. Dar +ain n" are ne2 ie sa stie $espre 2aria*i!e!e care c ntr !ea5a sti2a= ea 2a tre*"i sa gin$easca n"+ai in ter+eni $e intr $"cere si e4tragere inE$in sti2a. 0sa ca a+ $ecis sa face+ sti2a si inf r+atii!e as ciate ei $rept 2aria*i!e e4terne accesi*i!e f"nctii! r $e intr $"cere si e4tractie6 $ar n" si !"i +ain. Tra$"cerea acestei schite in c $ este $est"! $e si+p!a. Pr gra+"! principa! este in pri+"! rin$ "n +are c +"tat r $"pa tip"! perat r"!"i sa" a! peran$"!"i= aceasta este pr *a*i! cea +ai tipica f ! sire a !"i s9itch pe care a+ $escris1 in Capit !"! 3. ;define OPQ=0 )% #/ marime maMima operand, operator /# ;define KAOT?@ I%I #/ semn$l pentr$ n$mar 7asit /# ;define C==TH[ I.I #/ semnal pentr$ sir prea l$n7 /# main() #/ calc$lator de biro$ c$ sir$l 0olone3 inFers /# { int tEpe ; char s OPQ=0"; do$ble op), atof(), pop(), p$sh(); while ((tEpe = 7etop(s, OPQ=0)) G= ?=1) switch (tEpe) { case KAOT?@: p$sh(atof(s)); break; case I6I: p$sh(pop() 6 pop()); break; case I/I: p$sh(pop() / pop()); break; case I&I : op)=pop(); p$sh(pop() & op)); break;
108

tEpe);

case I#I : op)=pop(); if (op) G= %.%) p$sh(pop() # op)) else printf("impartire c$ 3ero \n"); break; case I=I: printf("\t5f\n", p$sh(pop())); break; case IcI: clear(); break; case C==TH[: printf("5.)%s ... e prea l$n7 \n",s); break; defa$lt: prinf(" comanda nec$nosc$ta 5c\n", } break;

} ;define OPQ\P< !%% #/ marimea stiFei /# int sp = %; #/ pointer$l de stiFa /# do$ble Fal OPQ\P<"; #/ stiFa /# do$ble p$sh(f) #/ dep$ne pe f in stiFa /# do$ble f ; { if(sp 4 OPQ\P<) ret$rn(Fal sp66" = f); else { printf("eroare: stiFa plina\n"); clear(); ret$rn(%); } } do$ble pop() #/ eMtra7e element$l din Firf$l stiFei /#
109

{ if (sp > %) ret$rn(Fal &&sp"); else { printf("eroare: stiFa 7oala\n"); clear(); ret$rn(%); }

} clear() #/ c$rata stiFa /# { sp = % ; }

C +an$a c c"rata sti2a c" aF"t r"! f"nctiei c!ear care este f ! sita $e ase+enea si $e catre f"nctii!e p p si p"sh in ca5 $e er are. Ne 2 + int arce i+e$iat !a get p. 0sa c"+ a+ aratat in Capit !"! &6 2aria*i!a este e4terna $aca este $efinita in afara c rp"!"i ricarei f"nctii. 0stfe! sti2a si p inter"! $e sti2a care tre*"iesc partaFate $e catre p$sh6 pop si clear s"nt $efinite in afara acest r trei f"nctii. Dar +ain ins"si n" refera sti2a sa" p inter"! $e sti2a > repre5entarea este asc"nsa c" griFa@. 0stfe!6 c $"! pentr" perat r"! N tre*"ie sa se f ! seasca p$sh(pop())); pentr" a e4a+ina 2irf"! sti2ei fara a1! $istr"ge. 8a n ta+ $e ase+enea ca $e arece O si U s"nt perat ri c +"tati2i6 rinea in care se c +*ina peran5ii sc si $in sti2a este ire!e2anta6 $ar pentr" perat rii 1 si E tre*"ie sa $istinge+ intre peran5ii sting si $rept. 74erciti"! %.3. Dat sche!et"! $e *a5a6 este "s r sa e4tin$e+ pr gra+"! ca!c"!at r. 0$a"gati pr cent"! K si perat r"! "nar 1. 0$a"gati c +an$a $e stergere6 care sterge e!e+ent"! $in 2irf"! sti2ei. 0$a"gati c +en5i pentr" +in"irea $e 2aria*i!e >este "s r in ca5"! 2aria*i!e! r f r+ate $intr1 sing"ra !itera >(/@@.
110

%... Reg"!i $e $ +eni" -"nctii!e si 2aria*i!e!e e4terne care c +p"n "n pr gra+ C n" tre*"ie sa fie c +pi!ate t ate in ace!asi ti+p= te4t"! s"rsa a! pr gra+"!"i p ate fi pastrat in +ai +"!te fisiere iar r"tine!e c +pi!ate anteri r p t fi incarcate $in *i*!i teci. Ce!e $ "a intre*ari care pre5inta interes aici s"ntJ C"+ s"nt scrise $ec!aratii!e astfe! incit 2aria*i!e!e sa fie $ec!arate c"+ se c"2ine in ti+p"! c +pi!arii G C"+ s"nt fi4ate $ec!aratii!e astfe! incit t ate piese!e sa fie c nectate c"+ se c"2ine at"nci cin$ pr gra+"! este incarcat G D +eni"! "n"i n"+e este acea parte $e pr gra+ in care n"+e!e este $efinit. Pentr" 2aria*i!a a"t +ata $ec!arata !a incep"t"! "nei f"nctii6 $ +eni"! este f"nctia in care n"+e!e este $ec!arat si 2aria*i!e!e c" ace!asi n"+e in f"nctii $iferite s"nt fara !egat"ra "ne!e c" a!te!e. Ca fe! se inti+p!a si c" arg"+ente!e f"nctii! r . D +eni"! "nei 2aria*i!e e4terne $"rea5a $in p"nct"! in care ea este $eca!rata intr1"n fisier s"rsa pina !a sfirsit"! ace!"i fisier. De e4e+p!"6 $aca Fal6 sp6 p$sh6 pop6 clear s"nt $efinite intr"1"n fisier in r$inea $e +ai s"s6 a$icaJ int sp = %; do$ble Fal OPQ\P<"; do$ble p$sh(f) {...} do$ble pop() {...} clear() {...} at"nci 2aria*i!e!e Fal si sp p t fi f ! site in p$sh 6pop si clear p"r si si+p!" n"+in$"1!e= n" s"nt necesare $ec!aratii s"p!i+entare . Pe $e a!ta parte6 $aca 2aria*i!a e4terna tre*"ie sa fie referita inainte $e a fi $efinita
111

sa" este $efinita intr1"n a!t fisier s"rsa $ecit ce! in care este f ! sita6 ar"nci este necesara $ec!aratie ?e4tern?. 7ste i+p rtant sa $istinge+ intre $ec!aratia "nei 2aria*i!e e4terne si $efinitia sa. O $ec!aratie an"nta pr prietati!e "nei 2aria*i!e >tip"! +ari+ea6 etc@= $efinitie pr 2 aca in p!"s a! care $e +e+ rie. Daca !inii!eJ int sp; do$ble Fal OPQ\P<"; apar in afara ricarei f"nctii6 e!e $efinesc 2aria*i!e!e e4terne sp si Fal6 pr 2 aca a! care $e +e+ rie pentr" e!e si ser2esc in p!"s 6ca $ec!aratie pentr" rest"! fisier"!"i s"rsa. Pe $e a!ta parte !inii!e eMtern int sp; eMtern do$ble Fal "; $ec!ara pentr" rest"! fisier"!"i s"rsa ca sp este "n int si ca 2a! este "n ta*! " $ "*!e >a carei $i+ensi"ne este $eter+inata a!t"n$e2a @6$ar e!e n" crea5a 2aria*i!e!e si nici n" a! ca +e+ rie pentr" e!e . Tre*"ie sa e4iste sing"ra $efinitie pentr" 2aria*i!a e4terna in t ate fisiere!e care c +p"n pr gra+"! s"rsa= a!te fisiere p t c ntine $ec!aratii e4tern pentr" a acce$e. >P ate e4ista $ec!aratie e4tern si in fisier"! ce c ntine $efinitia@. Orice initia!i5are a "nei 2aria*i!e e4terne se face n"+ai in $efinitie. Di+ensi"ni!e $e ta*! "ri tre*"ie specificate c" $efinitia $ar s"nt pti na!e c" $ec!aratie e4terna. C" t ate ca n" este rgani5are a$ec2ata pentr" acest pr gra+ 6 Fal si sp p t fi $efinite si initia!i5ate intr1"n fisier iar f"nctii!e p$sh6 pop si clear $efinite intr1a!t"!. 0ceste $efinitii si $ec!aratii ar tre*"i !egate i+pre"na astfe!J In fisier"! &J int sp=%; #/ pointer$l de stiFa /# do$ble Fal OPQ\P<"; #/ Faloarea stiFei /#
112

Hn fisier$l ): eMtern int sp; eMtern do$ble Fal "; do$ble p$sh(f) {...} do$ble pop() {...} clear () {...} De arece $ec!aratii!e e4tern $in fisier"! ( se gasesc in fata si in afara ce! r trei f"nctii6 e!e se ap!ica t"t"r ra= "n set $e $ec!aratii este s"ficient pentr" t t fisier"! (. Pentr" pr gra+e +ai +ari6 faci!itatea $e inc!"$ere in fisier ";incl$de" care 2a fi $isc"tata +ai tir5i" in acest capit !6 per+ite "n"i "ti!i5at r sa pastre5e sing"ra c pie a $ec!aratii! r ?e4tern? pentr" pr gra+"! $at si sa insere5e in fiecare fisier s"rsa care tre*"ie c +pi!at. Ne 2 + int arce ac"+ !a i+p!e+entarea !"i 7etop6 f"nctia care a$"ce "r+at r"! perat r sa" peran$. C"crarea $e *a5a este "s araJ se sar *!anc"ri!e6 ta*"ri!e si !inii!e n i. Daca "r+at r"! caracter n" este cifra sa" p"nct"! 5eci+a!6 ret"rnea5a1!. 0stfe!6 c !ectea5a "n sir $e cifre >care p ate inc!"$e si p"nct"! 5eci+a!@ si ret"rnea5a NUMB7R6 care se+na!ea5a fapt"! ca s1a c !ectat "n n"+ar. R"tina este c +p!icata s"*stantia! $e incercarea $e a +in"i in + $ p tri2it sit"atia in care n"+ar"! $e intrare este prea !"ng 7etop citeste cifre!e >pr *a*i! si "n p"nct 5eci+a!@ atita ti+p cit !e gaseste $ar !e +e+ rea5a n"+ai pe ace!ea care incap. Daca n"+ar"! n" a f st prea !"ng >n" s1a pr $"s $epasire @ f"nctia ret"rnea5a NUMB7R si sir"! $e cifre. Daca n"+ar"! a f st prea !"ng t t"si 7etop e!i+ina rest"! !iniei $e intrare asa ca "ti!i5at r"! p ate retipari si+p!" !inia $in p"nct"! $e er are= f"nctia ret"rnea5a TOOBI; $rept se+na! pentr" $epasireJ 7etop(s, lim) #/ operator /# char s "; int lim; { int i, c; obtine $rmator$l operand sa$

113

while ((c = 7etch()) == I I LL c == I\tI LL c == I\nI) ; if(c G= I.I NN (c 4 I%I LL c>I.I)) ret$rn(c); s %" = c; for (i = !; c = 7etchar()) >= I%I NN c 4= I.I; i66) if (i 4 lim) s i" = c; if (c == I.I) { #/ fractia /# if (i 4 lim) s i" = c; for (i66; (c = 7etchar()) >= I%I NN c 4= I.I; i66) if (i 4 lim) s i" = c; } if (i 4 lim) { #/ n$mar$l este ok /# $n7etch(c); s i" = I\%I; ret$rn(KAOT?@); } else { #/ n$mar prea mare, se sare rest$l liniei /# while (c G= I\nI NN c G= ?=1) c = 7etchar(); s lim&!" = I\%I; ret$rn(C==TH[) } } Ce s"nt 7etch si $n7etch G 8e inti+p!a a$esea ca5"! ca "n pr gra+ care citeste $ate $e intrare n" p ate $eter+ina $aca a citit $est"! pina cin$ a aF"ns sa citeasca prea +"!t. Un e4e+p!" este c !ectarea $e caractere ce a!cat"iesc "n n"+arJ pina cin$ n" se inti!neste "n caracter necifra6 n"+ar"!
114

n" este c +p!et. Dar at"nci pr gra+"! a citit "n caracter +"!t +ai necesar6 caracter ce n" a f st pregatit pentr" aceasta. Pr *!e+a ar p"tea fi re5 !2ata $aca ar fi f st p si*i! sa ?n" citi+? caracter"! ne$ rit. 0p i6 $e fiecare $ata cin$ pr gra+"! citeste "n caracter prea +"!t6 e! i! p ate p"ne inap i in intrare6 asa ca rest"! c $"!"i se 2a c +p rta ca si cin$ n" a f st citit nici $ata. Din fericire este "s r $e si+"!at necitirea "n"i caracter6 scriin$ pereche $e f"nctii $e c perare. 7etch $esc pera "r+at r"! caracter $e intrare ce tre*"ie c nsi$erat= "ngetch p"ne caracter"! inap i in intrare6 asa ca "r+at r"! ape! a! !"i getch i! 2a ret"rna $in n ". M $"! in care !"crea5a aceste f"nctii i+pre"na este si+p!". $n7etch p"ne caracter"! intr1"n *"ffer partaFa*i! "n ta*! " $e caractere 67etch citeste $in b$ffer pentr" a 2e$ea $aca e4ista 2re"n caracter si ape!ea5a pe getchar $aca *"ffer"! este 2i$. Tre*"ie $e ase+enea sa e4iste 2aria*i!a in$e4 care inregistr9a5a p 5itia caracter"!"i c"rent $in *"ffer. De arece *"ffer"! si in$e4"! s"nt partaFate $e 7etch si $n7etch si tre*"ie sa1si retina 2a! ri!e ! r intre ape!"ri6 e!e tre*"ie sa fie e4terne a+*e! r r"tine. Deci p"te+ scrie 7etch si $n7etch prec"+ si 2aria*!e!e! r partaFate astfe!J ;define TA1BHU? !%% char b$f TA1BHU?"; #/ b$ffer$l pentr$ $n7etch

/#

int b$fp = % #/ $rmatoarea po3itie libera din b$ffer /# 7etch() #/ ia $n posibil caracter din b$ffer /# { ret$rn((b$fp > %) Z b$f &&b$fp" : 7etchar()); } $n7etch(c) #/ p$ne caracter$l la loc in intrare /# int c; { if (b$fp > TA1BHU?) printf("$n7etch: prea m$lte caractere\n"); else
115

b$f b$fp66" = c; } 0+ f ! sit "n ta*! " pentr" *"ffer si n" "n sing"r caracter $e arece genera!itatea pr gra+"!"i se 2a *ser2a +ai tir5i". 74erciti"! %.%. 8crieti r"tina $n7ets(s@ care 2a $ep"ne inap i in intrare "n sir intreg $e caractere. C"+ cre$eti ca ar fi +ai *ine 6 f ! sin$ $n7etch sa" f ! sin$ b$f si b$fp G 74erciti"! %... Pres"p"ne+ ca in *"ffer n"n2a fi nici $ata +ai +"!t $e "n caracter. M $ificati in c nsecinta 7etch si $n7etch. 74erciti"! %./. -"nctii!e n astre 7etch si $n7etch n" +in"iesc 7O-1 "! intr1"n + $ p rta*i!. Deci$eti ce pr prietati ar tre*"i sa ai*e acestea pentr" a +in"i "n 7O- ap i i+p!e+entati1!e. %./. )aria*i!e statice )aria*i!e!e statice s"nt a treia c!asa $e 2aria*i!e6 pe !inga ce!e e4terne si ce!e a"t +ate6 pe care !e1a+ inti!nit $eFa. )aria*i!e!e $e tip ? static? p t fi atit interne cit si e4terne. )aria*i!e!e statice s"nt ! ca!e "nei f"nctii partic"!are !a fe! ca ce!e a"t +ate $ar6 spre $e se*ire $e acestea6 e!e ra+in in e4istenta >e4ista@ t t ti+p"! si n" apar si $ispar $e fiecare $ata cin$ f"nctia este acti2a. 0ceasta insea+na ca 2aria*i!e!e statice interne fera "n +iF! c $e a! care per+anenta si pri2ata $e spati" intr1 f"nctie. 8ir"ri!e $e caractere care apar intr1 f"cntie6 ca $e e4e+p!" arg"+ente!e !"i printf6 s s"nt statice interne. O 2aria*i!a statica e4terna este rec"n sc"ta in rst"! fisier"!"i s"rsa in care este $ec!arata6 $ar n" intr1"n a!t fisier. )aria*i!e!e e4terne statice fera astfe! + $a!itate $e a asc"n$e n"+e ca b$f si b$fp in c +*inatia getch1 "ngetch6 care tre*"ie sa fie e4terne ca sa p ata fi partaFa*i!e si care t t"si n" s"nt 2i5i*i!e pentr" "ti!i5t rii !"igetch si "ngetch6 asa ca n" e4ista nici p si*i!itate $e c nf!ict. Daca ce!e $ "a r"tine si ce!e $ "a 2aria*i!e s"nt c +pi!ate intr1"n fisier6 cin
116

static char b$f TA1BHU?"; #/ b$fer pentr$ $n7etch # static int b$fp = %; # $rmatorea po3itie libera in b$f /# ... 7etch() {...} $n7etch(c) {...} at"nci nici a!ta r"tina n" 2a fi in stare sa accea$a b$f si b$fp= in fapt6 e!e n" intra in c nf!ict c" a!te 2aria*i!e c" ace!easi n"+e $in a!te fisiere a!e ace!"iasi pr gra+ . Me+ rarea statica6 atit cea interna cit si cea e4terna se specifica prefi4in$ $ec!aratia n r+a!a c" c"2int"! ?static?. )aria*i!a este e4terna $aca este $efinita in afara ricarei f"nctii si este interna $aca este $efinita intr1 f"nctie. In + $ n r+a!6 f"nctii!e s"nt *iecte e4terne= n"+e!e ! r s"nt c"n sc"te g! *a!. 7ste p si*i!6 t t"si6 ca f"nctie sa fie $ec!arata ?statica ?= acest !"cr" face n"+e!e ei sa fie nec"n sc"t inafara fisier"!"i in care este $ec!arat. In !i+*aF"! C6 ?static? c ntea5a n" n"+ai per+anenta $ar si "n gra$ $in ceea ce ar p"tea fi n"+it ?taina?. O*iecte!e interne statice s"nt c"n sc"te n"+ai in interi r"! "nei f"nctii = *iecte!e e4terne statice >2aria*i!e sa" f"nctii@ s"nt c"n sc"te n"+ai in fisier"! s"rsa in care apar6 iar n"+e!e ! r n" interferea5a c" 2aria*i!e sa" f"nctii c" ace!as si n"+e care apar in a!te fisiere. )aria*i!e!e statice e4terne si f"nctii!e s"nt + $a!itate $e a asc"n$e *iecte!e ?$ate? si rice r"tina interna care !e +anip"!ea5a astfe! incit rice a!ta r"tina sa" $ata n" p ate intra in c nf!ict c" e!e6 nici +acar $in gresea!a. De e4e+p!"6 7etch si $n7etch f r+ea5a "n ?+ $"!? pentr" intr $"cera si e4tragerea $e caractere= b$f si b$fp p t fi statice asa ca s"nt inaccesi*i!e $in afara. In ace!asi + $6 pish6 pop6 clear f r+ea5a "n + $"! pentr" !"cr"! c" sti2a= Fal si sp p t fi statice e4terneP %.'. )aria*i!e registr"

117

0 patra si "!ti+a c!asa $e st cari este $en"+ita registr". O $ec!aratie $e registr" a2erti5ea5a c +pi!at r"! ca 2aria*i!a in chesti"ne 2a fi f ! sita $in gre". Cin$ este p si*i!6 2aria*i!e!e registr" se p!asea5a in registrii ca!c"!at r"!"i= cea ce 2a genera pr gra+e +ai sc"rte si +ai rapi$e. Dec!aratia $e registr" este $e f r+aJ re7ister int M; re7ister char c; si asa +ai $eparte= partea ?int? p ate fi +isa. Dec!aratia $e registr" p ate fi ap!icata n"+ai 2aria*i!e! r a"t +ate si para+etri! r f r+a!i ai "nei f"nctii. In acest "!ti+ ca56 $ec!aratia este $e f r+aJ f(c,n) re7ister int c,n; { re7ister int i; ... } In practica e4ista an"+ite restrictii as"pra 2ria*i!e! r registr" 6 ref!ectin$ rea!itatea har$9are1"!"i $e s"p rt. N"+ai cite2a 2aria*i!e $in fiecare f"nctie p t fi pastrate in registri si n"+ai an"+ite tip"ri s"nt per+ise. C"2int"! ?register? este ign rat cin$ apare in e4ces sa" in $ec!aratii neper+ise. In p!"s6 n" este p si*i!a af!area a$resei "nei 2aria*i!e registr" > t pica ce 2a fi ac perita in capit !"! .@. Restrictii!e specifice 2aria5a $e !a "n ca!c"!at r !a a!t"!= $e e4e+p!" pentr" PDP&&6 n"+ai pri+e!e trei $ec!aratii $e registr" s"nt efecti2e intr1 f"nctie iar tip"ri!e ! r p t fi int6char6 sa" p inter. %.,. 8tr"ct"ra $e *! c Ci+*aF"! C n" este "n !i+*aF str"ct"rat pe *! c in sens"! !"i PCE& sa" 0C;OC6 a$ica f"nctii!e n" p t fi $efinite in a!te f"nctii. Pe $e a!ta parte6 2aria*i!e!e p t fi $efinite intr1 +aniera ?str"ct"ra $e *! c?. Dec!aratii!e $e 2aria*i!e >inc!"5in$ initia!i5ari!e@ p t "r+a $"pa parante5a stinga care
118

intr $"ce rice instr"cti"ne c +p"sa si n" n"+ai $"pa cea care incepe f"nctie. )aria*i!e!e $ec!arate in aceasta +aniera ac pera 2aria*i!e!e n"+ite i$entic in *! c"ri!e +ai $in afara si ra+in in e4istenta pina cin$ inti!nesc parante5a $reapta. De e4e+p!" if (n > %) { int i; #/ declara $n no$ i /# for (i = %; i 4 n; i66) ...

$ +eni"! 2aria*i!ei i este intreaga ra+"ra a !"i if= acest i n" are nici !egat"ra c" ricare a!t i $in pr gra+. 8tr"ct"ra $e *! c se ap!ica $e ase+enea 2aria*i!e! r e4terne. Date $ec!aratii!eJ int M; f() { do$ble M; ... } at"nci6 in ca$r"! f"nctiei f6 cc"rente!e !"i 4 se refera !a 2aria*i!a interna $ "*!e6 in afara !"i f6 e!e se refera !a e4tern"! integer. Ca fe! se inti+p!a !"cr"ri!e si c" n"+e!e $e para+etri f r+a!i J int 3; f(3) do$ble 3; { ... }
119

In ca$r"! f"nctiei f6 5 se refera !a para+etr"! f r+a!6 si n" !a 51"! e4tern. %.3. Initia!i5are Initia!i5area a f st +enti nata in trecere $e +ai +"!te ri pina ac"+6 $ar int $ea"na in trecere si in !egat"ra c" a!te s"*iecte. 0ceasta secti"ne re5"+a "ne!e $in reg"!i6 $at fiin$ fapt"! ca pina ac"+ a+ $isc"tat +ai +"!te c!ase $e tip"ri $e +e+ rari. In a*senta initia!i5arii e4p!icite6 2aria*i!e!e e4terne si statice se initia!i5ea5a pe 5er = 2aria*i!e!e a"t +ate si $e registr" s"nt ne$efinite >i.e. g"n i6 ra+asita@. )aria*i!e!e si+p!e > n" ta*! "ri!e sa" str"ct"ri!e @ p t fi initia!i5ate cin$ se $ec!ara6 p"nin$ in c ntin"area n"+e!"i ! r se+n"! ega! si e4presie c nstantaJ int M = !; char sV$ote = I\"; lon7 daE = *% / )+;

#/ min$te intr&o 3i /#

Pentr" 2aria*i!e!e e4terne si statice6 initia!i5area se face $ata 6!a c +pi!are. Pentr" 2aria*i!e!e a"t +ate si registr"6 initia!i5area se face $e fiecare $ata cin$ f"nctia sa" *! c"! se e4ec"ta . Pentr" 2aria*i!e!e a"t +ate si $e registr" 2a! area $e initia!i5are n" tre*"ie sa fie c nstantaJ p ate fi $e fapt rice e4presie 2a!i$a i+p!icin$ 2a! ri $efinite anteri r6 chiar si $e ape!"ri $e f"nctii. De e4e+p!" initia!i5ari!e $in pr gra+"! $e ca"tare *inara $in capit !"! 3 p t fi scrise astfe! J binarE (M, F, n) int M, F ", n; { int low = %; int hi7h = n & !; int mid; ... }
120

in ! c $eJ binarE (M, F, n) int M, F ", n; { int low, hi7h, mid; low = %; hi7h = n & !; ... } In fapt6 initia!i5ari!e $e 2aria*i!e a"t +ate s"nt presc"rtari pentr" instr"cti"ni!e $e asignare. Care f r+a este $e preferat este in "!ti+a instanta chesti"ne $e g"st. In genera! n i a+ preferat asignari!e e4p!icite6 $e arece initia!i5ari!e in $ec!aratii s"nt +ai gre" $e 2a5"t. Ta*! "ri!e a"t +ate n" p t fi initia!i5ate. Ta*! "ri!e e4terne si statice p t fi initia!i5ate p"nin$ $"pa $ec!aratie !ista $e 2a! ri $e initia!i5are inc!"sa intre parante5e si separate prin 2irg"!e. De e4e+p!" pr gra+"! $e c nt ri5are caractere $at in capit !"! &6 care incepea main() #/ contori3ea3a cifre, blanc$ri, altele /# { int c, nwhite, nother; int ndi7it !%"; nwhite = nother = %; for (i = %; i 4 !%; i66) ndi7it i" = %; ... } p ate fi scris si astfe!J int nwhite = %; int nother = %;
121

int ndi7it !%" = { %, %, %, %, %, %, %, %, %, % } ; /# main() #/ contori3ea3a cifre, blanc$ri, altele { int c, i; ... } 0ceste initia!i5ari s"nt $e fapt necesare $e arece s"nt t ate 5er $ar este *"na practica $e pr gra+are $e a !e $a e4p!icit. Daca 2a! ri!e $e initia!i5are specificate s"nt +ai p"tine $ecit +ari+ea specificata6 rest"! 2a! ri! r 2 r fi 5er . Daca e!e s"nt +ai +"!te se pr 2 aca er are . 7ste regreta*i! insa fapt"! ca n" p"te+ specifica nicic"+ repetitia "nei 2a! ri $e initia!i5are si nici sa initia!i5a+ "n e!e+ent $in +iF! c"! "n"i ta*! " fara a initia!i5a si t ate e!e+ente!e care1! prece$. Ta*! "ri!e $e caractere s"nt "n ca5 specia! $e initia!i5are. In ! c"! n tatiei c" parante5e si 2irg"!e se p ate f ! si "n sir $e caractereJ char pattern " = "the" 0ceasta este presc"rtare pentr" f r+a echi2a!enta $ar +ai !"ngaJ

char pattern " = { ItI, IhI, IeI, I\%I }; Cin$ +ari+ea "n"i ta*! " $e rice tip este +isa6 c +pi!at r"! 2a ca!c"!a !"ngi+ea c nt ri5in$ 2a! ri!e $e intia!i5are. In acest ca5 specific +ari+ea ta*! "!"i este % >trei caractere p!"s ter+inat r"! T#@ %.&# Rec"rsi2itate -"nctii!e $in C p t fi f ! site rec"rsi2. 0ceasta insea+na ca f"nctie se p ate ape!a pe insasi6 fie $irect fie in$irect. Un e4e+p!" tra$iti na! este ce! re!ati2 !a tiparirea "n"i n"+ar ca si sir $e caractere. 0sa c"+ a+ +enti nat +ai inainte6 cifre!e s"nt generate intr1 r$ine gresitaJ ce!e +ai p"tin
122

se+nificati2e s"nt $isp"se inaintea ce! r +ai se+nificati2e iar tiparirea ! r se face in2ers. 74ista $ "a s !"tii pentr" aceasta pr *!e+a. Una este $e a +e+ ra cifre!e intr1"n ta*! " asa c"+ a" f st generate6 ap i sa !e tipari+ in r$ine in2ersa asa c"+ a+ fac"t in cap 3 c" it a. Pri+a 2ersi"ne a !"i print$ f ! seste acest + $e!. printd(n) #/ print n in decimal /# int n; { char s !%"; int i; if (n 4 %) { p$tchar(I&I); n = &n; } i = %; do { s i66" = n 5 !% 6 I%I; #/ 7et

char /# /#

neMt

} while ((n #= !%) > %); #/ discard it while (&&i >= %) p$tchar(s i"); }

0!ternati2a este s !"tie rec"rsi2a6 in care fiecare ape!are !"i print$ intii se a"t ape!ea5a pentr" a trata cifre!e $in fata6 ap i tipareste cifra $in c a$a. printd(n) #/ print n in decimal(rec$rsiFe) /# int n; { int i; if (n 4 %) { p$tchar(I&I); n = &n;
123

} if ((i = n#!%) G= %) printd(i) p$tchar(n 5 !% 6 I%I);

Cin$ f"nctie se a"t ape!ea5a fiecare in2 care generea5a "n set pr aspat $e 2aria*i!e a"t +ate a*s !"t in$epen$ent $e set"! prece$ent. 0stfe! in print$>&(3@ pri+"! print$ are nN&(3. 0cesta trece &( ce!"i $e1a! $ i!ea print$6 ap i tipareste 3 cin$ acesta $in "r+a re2ine. In a4ce!asi fe!6 "r+at r"! printd trece & !a a! trei!ea ap i tipareste (. Rec"rsi2itatea n" $"ce in genera! !a ec n +ie $e +e+ rie atita ti+p cit tre*"ie +entin"ta sti2a c" 2a! ri!e ce "r+ea5a a fi pr cesate . C $"! rec"rsi2 este +ai c +pact si a$esea +ai "s r $e scris si inte!es. Rec"rsi2itatea este c n2ena*i!a in specia! pt str"ct"ri $e $ate rec"rsi2e prec"+ ar* rii= 2 + 2e$ea "n e4e+p!" $rag"t in capit !"! /. 74erciti"! %1' 0$aptati i$ei!e $e !a printd pentr" a scrie 2ersi"ne rec"rsi2a a !"i itoa= a$ica $e a c n2erti "n intreg intr1"n sir printr1 r"tina rec"rsi2a. 74erciti"! %1, 8crieti in2ersea5a sir"! s. %.&& Prepr ces r"! C C a$+ite "ne!e e4tensii $e !i+*aF c" aF"t r"! "n"i si+p!" +acr prepr ces r. P si*i!itati!e !"i ;define s"nt ce!e +ai *isn"ite e4e+p!e $espre aceste e4tensii= a!ta este p si*i!itatea $e a inc!"$e c ntin"t"! a!t r fisiere in ti+p"! c +pi!arii. Inc!"$erea fisiere! r Pentr" a "s"ra +anip"!area c !ectii $e ;define si $ec!aratii >printre a!te!e@ C a$+ite inc!"$erea fisiere! r. Orice !inie $e tip"!
124

2ersi"ne rec"rsi2a a f"nctiei reFerse(s) care

;incl$de "filename" este in! c"ita prin c ntin"t"! fisier"!"i ?fi!ena+e?. 0$esea !inie sa" $ "a $e aceasta f r+a apar !a incep"t"! fiecar"i fisier s"rsa pentr" a inc!"$e $ec!aratii!e ;define c +"ne si $ec!aratii!e e4tern pentr" 2aria*i!e!e g! *a!e. ;incl$de1"ri!e p t fi gr"pate. ;incl$de este ca!ea preferata pentr" a "ni $ec!aratii!e i+pre"na pt "n pr gra+ +ai +are. 0ceasta garantea5a ca t ate fisiere!e s"rsa 2 r fi a!i+entate c" ace!easi $efinitii si $ec!arari $e 2arai*i!e. Desig"r at"nci cin$ "n fisier inc!"s este schi+*at t ate fisiere!e $epen$ente tre*"iesc rec +pi!ate. Macr s"*stit"irea O $efinitie $e f r+a ;define J?B ! ape!ea5a +acr s"*stit"ire $e cea +ai si+p!a f r+a 1in! c"irea "n"i n"+e c" "n sir $e caractere. N"+e!e $in ;define a" aceasi f r+a ca si i$entificat rii $in ?C?= te4t"! $e in! c"ire este rest"! !iniei6 $efinitie !"nga se p ate c ntin"a prin p!asarea "n"i T !a sfirsit"! !iniei $e c ntin"at. D +eni"! "n"i n"+e $efinit prin ;define este $e !a ! c"! $efinirii pina !a sfirsit"! fisier"!"i s"rsa. N"+e!e p t fi re$efinite si $efinire p ate f ! si $efinirii prece$ente. 8"*stit"tii!e n" se p"n intre ghi!i+e!e6 astfe! $aca \78 este "n n"+e $efinit6 n" 2a a2ea ! c nici s"*stit"ire in printf >?\78?@. De arece i+p!e+entarea !"i W$efine n" este parte a c +pi!at r"!"i pr pri"5is6 s"nt f arte p"tine restrictii as"pra a ce p ate fi $efinit. De e4e+p!" a$eptii 0!g !"!"i p t sp"neJ ;define then ;define be7in { ;define end ;} si ap i sa scrieJ
125

if (i > %) then be7in a = !; b = ) end 7ste $e ase+enea p si*i! $e $efinit +acr "ri c" arg"+ente6 astfe! ca te4t"! $e in! c"ire $epin$e $efe!"! in care +acr "! este ape!at. De e4e+p!" sa $efini+ "n +acr n"+it +a4 astfe!J ;define maM(P, T) 0c"+ !inia M = maM(p6V, r6s); 2a fi in! c"ita $e !iniaJ M = ((p6V) > (r6s) Z (p6V) : (r6s)); 0ceasta a$+ite f"nctie +a4i+a care se e4pa$ea5a intr1"n c $ ?in!ine? si n" intr1 ape!are $e f"nctie. 0tita 2re+e cit arg"+ente!e s"nt tratat a$ec2at6 acest +acr 2a ser2i pt rice tip $e $ate= n" e4ista $iferite tip"ri $e +a4 pt $iferite tip"ri $e $ate6 asa c"+ se inti+p!a c" f"nctii!e. Desig"r6 $aca e4a+inati e4pansi"nea !"i +a4 $e +ai s"s 2eti *ser2a cite2a capcane. 74presii!e s"nt e2a!"ate $e $ "a ri= aceasta este ra" $aca s"nt i+picate efecte c !atera!e ca ape!ari $e f"nctii si perat ri $e incre+entare. Mas"ri $e pre2e$ere tre*"ie !"ate c" parante5e!e pentr" a fi sig"ri ca r$inea $e e2a!"are este respectata. >C nsi$erati +acr 1"! ;define sV$are(M) M / M cin$ se ape!ea5a ca sV$are(36!). ((P) > (T) Z (P) : (T))

126

74ista chiar pr *!e+e !e4ica!e= n" p t e4ista spatii intre n"+e!e +acr "!"i si parante5a stinga care intr $"ce !ista $e arg"+ente. Insa fara in$ ia!a6 +acr 1"ri!e s"nt s"ficient $e 2a! r ase. Un e4e+p!" practic este *i*!i teca stan$ar$ IEO care 2a fi $eschisa in capit !"! ' 6in care 7etchar si p$tchar s"nt $efinite ca +acr "ri6 pt a e2ita ape!area "nei f"nctii pentr" fiecare caracter pr cesat . 0!te p si*i!itati a!e +acr p ces r"!"i s"nt $escrise in 0pen$i4 0. 74erciti"! %.3 Definiti "n +acr swap(M,E) care schi+*a intre e!e t ate ce!e ( arg+ente int.

127

CAPITOLUL % POINT7RI `I T0BCOURI Un p inter este s"nt f arte +"!t re5 !2are a "nei a!cat"irea "n"i c 2aria*i!a care c ntine a$resa "nei a!te 2aria*i!e. P interii "ti!i5ati in C parte pentr" ca "ne ri s"nt sing"ra ca!e $e an"+ite pr *!e+e6 parte pentr" ca f ! sirea ! r $"ce !a $ +ai c +pact si +ai eficient $ecit a!t"! *tin"t in a!t + $.

P interii a" f st ?ingra+a$iti? !a cite2a instr"cti"ni 7oto ca "n +in"nat + $ $e a crea pr gra+e ?i+p si*i!? $e pricep"t. 0cest !"cr" $e2ine pe $ep!in a$e2arat at"nci cin$ p interii s"nt f ! siti neatent6 fiin$ "s r $e creat p interi care sa p inte5e in ! c"ri c" t t"! neasteptate. C" +et $a6 p interii se "ti!i5ea5a pt "n p!"s $e si+p!itate. 0ceasta este aspect"! pe care 2 + incerca sa1! i!"stra+. ..&. P interi si a$rese Din + +ent ce "n p inter s"stine a$resa "n"i *iect6 este p si*i!a a$resarea ace!"i *iect ?in$irect? prin inter+e$i"! p inter"!"i. 8a pres"p"ne+ ca 4 este 2aria*i!a6 sa sp"ne+ int si ca p4 este "n p inter creat intr1"n + $ nepreci5at. Operat r"! ^ $a a$resa "n"i *iect6 astfe! incit instr"cti"nea pM=NM asignea5a 2aria*i!ei p4 a$resa !"i 4 ac"+6 p4 insea+na ?p intea5a pe 4?. Operat r"! ^ p ate fi ap!icat n"+ai 2aria*i!e! r si e!e+ente! r "n"i ta*! "6 c nstr"ctii ca ^>4O&@ si ^3 s"nt inter5ise. 7ste $e ase+enea inter5isa pastrarea a$resei "nei 2aria*i!e registr". Operat r"! "nar U testea5a peran$"! sa" ca a$resa "!ti+"!"i se+na! si accesea5a aceasta a$resa pentr" a a$"ce c ntin"t"! ! catiei $e !a a$resa respecti2a. 0stfe!6 $aca A este t t "n int E = /pM

128

asignea5a !"i A6 ri $e cite ri este ca5"! c ntin"t"! ! catiei "n$e p intea5a p4. 0stfe! sec2enta pM = NM; E = /pM; asignea5a !"i A aceasi 2a! are ca si E = M T t $ata este necesara $ec!ararea 2aria*i!e! r care apar in sec2entaJ int M, E; int /pM; Dec!ararea !"i 4 si A este $eFa c"n sc"ta. N "a este $ec!ararea p inter"!"i p4 int /pM este interpretata ca +ne+ nica= aceasta insea+na ca Up4 este "n int6 a$ica in + +ent"! in care p4 apare in c nte4t s"* f r+a Up46 este echi2a!enta c" a inti!ni 2aria*i!a $e tip int. De fapt6 sinta4a $ec!ararii "nei 2arai*i!e i+ita sinta4a e4presii! r in care ar p"tea sa apara respecti2a 2aria*i!a. 0cest rati na+ent este "ti! in t ate ca5"ri!e care i+p!ica $ec!aratii c +p!icate. De e4e+p!"J do$ble atof(), /dp; sp"ne ca intr1 e4presie atof() si Udp a" 2a! are $e tip $ "*!e. De n tat $ec!aratia i+p!icita6 ceea ce 2rea sa inse+ne ca "n p inter este c nstrins sa p inte5e an"+ita categ rie $e *iecte. >-"nctie $e tip"! *iect"!"i p intat@. P interii p t aparea in e4presii. De e4e+p!"6 $aca pM p intea5a pe intreg"! 4 at"nci /pM p ate aprarea in rice c nte4t in care ar p"tea apare 4. E = /pM 6 !
129

$a !"i A

2a! are ega!a c" 4 p!"s &. printf("5d\n", /pM)

i+pri+a

2a! are c"renta a !"i 4 si d = sVrt((do$ble) /pM)

face ca $ N ra$ica! $in 46 care este f rtat $e tip"! $ "*!e inainte $e a fi trans+is !"i scrt >2e5i capit !"! (@. In e4presii ca E = /pM 6 ! perat rii "nari U si ^ a" pri ritate +ai +are $ecit cei arit+etici6 astfe! aceasta e4presie ri $e cite ri p inter"! p4 a2ansea5a6 a$"na & si asignea5a 2a! area !"i A. ) + re2eni pe sea+a as"pra a ceea ce insea+na E = /(pM 6 !) Referiri prin p inter p t apare si in partea stinga a asignari! r. Daca p4 p intea5a pe 4 at"nci /pM = % i! p"ne pe 4 pe 5er si /pM 6= ! i! incre+entea5a pe 46 ca si (/pM)66

130

In acest "!ti+ e4e+p!" parante5e!e s"nt necesare= fara e!e6 e4presia 2a incre+enta pe p4 in ! c sa incre+ente5e ceea ce p intea5a p4 $e arece perat rii "nari U si O s"nt e2a!"ati $e !a $reapta !a stinga. In sfirsit6 $aca p interii s"nt 2aria*i!e6 ei p t fi +anip"!ati ca rice a!ta 2aria*i!a. Daca pA este "n a!t p inter pe int6 at"nci pE = pM c pia5a c ntin"t"! !"i p4 in pA facin$ astfe! ca pA sa 2arie5e $ata c" p4. ..(. P interi si arg"+ente $e f"nctii Dat rita fapt"!"i ca in C este p si*i!a trans+iterea $e arg"+ente "nei f"nctii prin ?ape! prin 2a! are? n" e4ista + $a!itate $irecta pentr" f"nctia ape!ata $e a a!tera 2aria*i!a in f"nctia ape!anta. Ce este $e fac"t at"nci cin$ $e fapt6 se intenti nea5a schi+*area "n"i arg"+ent *isn"it G De e4e+p!"6 r"tina $e s rtare tre*"ie sa in2erse5e $ "a e!e+ente ne r$ nate c" f"nctie s9ap. N" este s"ficient sa se scrie swap(a, b); "n$e f"nctia s9ap este $efinita ca swap(M, E) int M, E; { int temp; temp = M; M = E; E = temp; } #/ [@?BHC /#

Din ca"5a ape!"!"i prin 2a! are6 swap n" p ate afecta arg"+ente!e a si * in r"tina care ape!ea5a. Din fericire6 e4ista + $a!itate $e a *tine efect"! $ rit. Pr gra+"! ape!ant tras+ite p interi pe 2a! ri!e care tre*"ie schi+*ate.
131

swap(Na, Nb); Din + +ent ce perat r"! N $a a$resa "nei 2aria*i!e6 Na este "n p inter pe a. In swap insasi6 arg"+ente!e s"nt $ec!arate ca fiin$ p interi iar a$e2aratii peran5i s"nt accesati prin ei >prin p interi@. swap(pM, pE) #/ interscimba /pM si /pE /# int /pM, /pE; { int temp; temp = /pM; /pM = /pE; /pE = temp; } O "ti!i5are c +"na a arg"+ente! r $e tip p inter se inti!neste in ca$r"! f"nctii! r care tre*"ie sa ret"rne5e +ai +"!t $ecit sing"ra 2a! are. >)eti p"tea *iecta ca swap ret"rnea5a $ "a 2a! ri6 n i!e 2a! ri a!e arg"+ente! r sa!e.@ Ca "n e4e+p!" sa !"a+ f"nctie 7etint care rea!i5ea5a in2ersia !a intrare prin transsf r+area "n"i sir $e caractere in 2a! ri intregi6 "n intreg !a fiecare ape!6 getint tre*"ie sa ret"rne5e 2a! area gasita sa" se+n"! $e sfirsit $e fisier at"nci cin$ s1a ter+inat sir"! $e caractere $e !a intrare. 0ceste 2a! ri tre*"ie sa fie ret"rnate ca *iecte separate6 pentr" in$iferent ce 2a! are este "ti!i5ata pentr" 7O- aceasta p"tin$ fi $e ase+enea 2a! area "n"i intreg1inp"t. O s !"tie6 care este *a5ata pe f"nctia inp"t scanf6 f"nctie care 2 + $escrie in cap'6 este $e a f ! si getint care sa ret"rne5e ca 2a! are f"nctie 7O-6 at"nci cin$ se inti!neste sfirsit"! $e fisier= rice a!ta 2a! are ret"rnata insea+na ca a f st pre!"crat "n intreg *isn"it )a! area n"+erica a intreg"!"i gasit este ret"rnata printr1"n arg"+ent care tre*"ie sa fie p inter pe "n intreg. 0ceasta rgani5are separa starea $e sfirsit $e fisier $e 2a! ri!e n"+erice. Ur+at area *"c!a c +p!etea5a "n ta*! " c" intergi prin ape!"ri !a get int.
132

int n, F, arraE BHU?" for (n = %; n 4 BHU? NN 7etint(NF) G= ?=1; n66) arraE n" = F; -iecare ape! p"ne pe A pe "r+at r"! intreg gasit !a intrare. De n tat fapt"! ca este esentia! a scrie ^A in ! c $e A6 ca arg a! !"i getint. 0 scrie $ ar A c nstit"ie er are $e a$resare6 getint s"stinin$ ca are $e a face c" "n p inter pr pri" 5is. Insasi getint este + $ificare e2i$enta a !"i at i tratata +ai inainte. 7etint(pn) #/ ia n$mar$l inter7 &inp$t /# int /pn; { int c, si7n; while ((c = 7etch() == I I LL c == I\nI LL c == I\tI); #/sare blanc$ri/# si7n = !; if (c == ItI LL c == I&I) { #/ semn$l /# si7n = (c == I6I Z ! : &!; c = 7etch(); } for (/pn = %; c >= I%I NN c 4= I.I; c = 7etch()) /pn = !% / /pn 6 c & I%I; /pn /= si7n; if (c G= ?=1) $n7etch(c); ret$rn(c); } Peste t t in getint6 Upn este "ti!i5at ca 2aria*i!a int r$inara. De ase+enea6 a+ "ti!i5at getch si "ngetch > $escrise in cap %@ in asa fe! incit caracter"! specia! > se+na!"! 7O-@ care tre*"ie citit sa p ata fi rest cata !a intrare.
133

74erciti"! ..& 8crieti getf! at pentr" 2irg"!a f! atnta ana! aga !"i getint. Ce tip $e 2a! are ret"rnea5a f"nctia getf! at. ..3. P interi si ta*! "ri In C6 e4ista re!atie strinsa intre p interi si ta*! "ri6 atit $e strinsa incit p interii si ta*! "ri!e p t fi tratate si+"!tan. Orice peratie care p ate fi re5 !2ata prin in$icierea ta*! "ri! r p ate fi re5 !2ata si c" aF"t r"! p interi! r. )ersi"nea c" p interi 2a fi in genera!6 +ai rapi$a $ar6 pentr" incepat ri6 +ai gre" $e inte!es i+e$iat. Dec!aratia int a !%" $efineste "n ta*! " $e $i+ensi"nea &#6 care este "n *! c $e &# *iecte c nsec"ti2e n"+ite aL#M6 aL&M6 ...6 aL3M n tatia aLiM $ese+nea5a e!e+ent"! $eci p 5itii!e6 a!e ta*! "!"i6 n"+arate $e !a incep"t"! acest"ia. Daca pa este "n p inter pe "n interg6 $eca!arat ca int /pa at"nci asignarea pa N ^aL#M face ca pa sa p inte5e pe a! ?5er 1"!ea? e!e+ent a! ta*! "!"i a= aceasta insea+na ca pa c ntine a$resa !"i aL#M. 0c"+ asignarea M = /pa 2a c pia c ntin"t"! !"i aL#M in 4. Daca pa p intea5a pe "n e!e+ent arecare a! !"i a at"nci prin $efinitie paO& p intea5a pe e!e++ent"! "r+at r si in genera! pa1i p intea5a c" i e!e+ente
134

inaintea e!e+ent"!"i p intat $e pa iar paOi p intea5a c" i e!e+ente $"pa e!e+ent"! p intat $e pa. 0stfe!6 $aca pa p intea5a pe aL#M /(pa 6 !) refera c ntin"t"! !"i aL&M6 pa O i este a$resa !"i aLiM si U>paOi@ este c ntin"t"! !"i aLiM. 0ceste re+arci s"nt a$e2arate in$iferent $e tip"! 2araia*i!e! r $in ta*e!"! a. Definitia ?a$"narii "nitatii !a "n p inter ? si prin e4tensie6 t ata arit+etica p interi! r este $e fapt ca!c"!area prin !"ngi+ea in +e+ rie a *iect"!"i p intat. 0stfe!6 in paOi i este in+"!tit c" !"ngi+ea *iecte! r pe care p intea5a pa inainte $e a fi a$"nate !a pa. C resp n$enta intre in$e4are si arit+etica p interi! r este e2i$ent f arte strinsa. De fapt6 referinta !a "n ta*! " este c n2ertita $e catre c +pi!at r intr1"n p inter pe incep"t"! ta*! "!"i. 7fect"! este ca n"+e!e "n"i ta*! " este e4presie p inter. 0ceasta are cite2a i+p!icatii "ti!e. Din + +ent ce n"+e!e "n"i ta*! " este sin ni+ c" ! catia e!e+ent"!"i sa" 5er 6 asignarea pa = Na %" p ate fi scrisa si pa = a Inca si +ai s"rprin5at r !a pri+a 2e$ere este fapt"! ca referinta !a aLiM p ate fi scrisa si ca U>aOi@. 72a!"in$ pe aLiM6 C i! c n2erteste in U>aOi@= ce!e $ "a f r+e s"nt echi2a!ente. 0p!icin$ perat r"! ^ a+*i! r ter+eni ai acestei echi2a!ente6 re5"!ta ca ^aLiM este i$entic c" aOiJ aOi a$resa e!e+ent"!"i a! i1!ea in ta*! "! a. Recipr cJ $aca pa este "n p inter e! p ate fi "ti!i5at in e4presii c" "n in$ice paLiM este i$entic c" U>paOi@. Pe sc"rt rice ta*! " si e4pri+are $e in$ice p t fi scrise ca "n p inter si ffset si rice a$resa chiar in aceeasi instr"cti"ne. Tre*"ie tin"t sea+a $e $ifernta ce e4ista intre n"+e!e ta*! " si "n p inter. Un p inter este 2aria*i!a6 astfe! ca paNa si paOO s"nt peratii. Dar6
135

"n n"+e $e ta*! " este c nstanta6 n" 2aria*i!aJ c nstr"ctii ca aNpa sa" aOO sa" pN^a s"nt inter5ise. 0t"nci cin$ se trans+ite "n n"+e $e ta*! " "nei f"nctii6 ceea ce se trans+ite este ! catia $e incep"t a ta*! "!"i. In ca$r"! f"nctiei ape!ate acest fapt arg"+ent este 2aria*i!a ca ricare a!ta astfe! incit "n arg"+ent n"+e $e ta*! " este "n 2erita*i! p inter6 a$ica 2aria*i!a c ntinin$ a$resa. Ne 2 + p"tea f ! si $e aceasta pentr" a scrie n "a 2ersi"ne a !"i str!en6 care ca!c"!ea5a !"ngi+ea "n"i sir. strlen(s) #/ ret$rnea3a l$n7imea sir$l$i s /# char /s { int n; for (n = %; /s G= I%I; s66) n66; ret$rn(n); } Incre+entarea !"i s este perfect !ega!a $e arece e! este 2aria*i!a p inter= sO O n" are efect pe sir"! $e caractere in f"nca care a ape!at1 pe str!en6 $ar incre+entea5a $ ar c pia a$resei. Ca para+etri f r+a!i in $efinirea "nei f"nctii char s " si char /s; s"nt echi2a!enti= a!egerea ce!"i care tre*"ie scris este $eter+inata in +are parte $e e4presii!e ce 2 r fi scrise in ca$r"! f"nctiei. 0t"nci cin$ "n n"+e $e ta*! " este trans+is "nei f"nctii6 aceasta p ate6 $"pa necesitati s1 interprete5e ca ta*! " sa" ca p inter si sa1! +anip"!e5e in c nsecinta. -"nctia p ate efect"a chiar a+*e!e tip"ri $e peratii $aca i se pare p tri2it si c rect.

136

7ste p si*i!a si trans+iterea catre f"nctie $ ar a "nei parti $intr1"n ta*! " prin trans+iterea "n"i p inter pe incep"t"! s"*ta*! "!"i. De e4e+p!"6 $aca a este "n ta*! "= f(Na )") si f(a 6 )) a+*e!e trans+it f"nctiei f a$resa e!e+ent"!"i aL(M $e arece ^aL(M si aO( s"nt e4presii p inter care refera a! trei!ea e!e+ent a! !"i a. In ca$r"! !"i f6 $ec!area arg"+ent"!"i p ate citi f(arr) int arr "; { ... } sa" f(arr) int /arr; { ... } 0stfe!6 $"pa c"+ a f st c ncep"ta f"nctia f fapt"! ca arg"+ent"! refera $e fapt parte a "n"i ta*! " +ai +are n" are c nsecinte. ..%. 0rit+etica a$rese! r Daca p este "n p inter6 at"nci pOO incre+entea5a pe p in asa fe! incit t acesta sa p inte5e pe e!e+ent"! "r+at r in$iferent $e tip"! *iecte! r
137

p intate6 iar pONi incre+entea5a pe p pentr" a p inta peste i e!e+ente $in ! c"! "n$e p p intea5a c"rent. C este c nsistent si c nstant c" arit+etica p interi! r= p interii6 ta*! "ri!e si arit+etica a$resarii c nstit"e p"nct"! f rte a! !i+*aF"!"i. 8a i!"stra+ cite2a $intre pr prietati!e !"i scriin$ "n pr gra+ pentr" a! care $e +e+ rie r"$i+entar >$ar este "ti! in ci"$a si+p!itatii sa!e e4ista $ "a r"tineJ a!! c>n@ ret"rnea5a "n p inter p pe n p 5itii caracter c nsec"ti2e care p ate fi "ti!i5at $e catre ape!ant"! !"i a!! c pentr" a! carea $e caractere= free>p@ e!i*erea5a +e+ ria facin$1 astfe! ref ! si*i!a +ai tir5i". R"tine!e s"nt ?r"$i+entare? $e arece ape!"ri!e !a free tre*"ie fac"te in r$ine in2ersa ape!"ri! r !a a!! c. 0ceasta insea+na ca +e+ ria gesti nata $e a!! c si free este sti2a sa" !ista pre!"cra*i!a in regi+ CI-P. Bi*!i teca stan$ar$ C este pre2a5"ta in f"nctii ana! age care n" a" atit $e +"!te restrictii iar in capit !"! , 2 + $a6 pentr" $e+ nstratie si a!te 2ersi"ni. Intre ti+p se 2 r i2i +"!te ap!icatii care a" rea!+ente ne2 ie $e cana!"! a!! c pentr" a $ispensa +ici p rti"ni $e +e+ rie6 $e !"ngi+i nepre2a5"te !a + +ente nepre2a5"te. Cea +ai si+p!a i+p!e+entare este $e a scrie a!! c pentr" $ec!ararea $e parti a!e "n"i ta*! " +are pe care i! 2 + n"+i a!! c*"f. 0cest ta*! " este pr pri" !"i a!! c si free. C"crin$ c" p interi6 n" c" in$ici in ta*! " n" este necesar ca 2re a!ta r"tina sa c"n asca n"+e!e ta*! "!"i6 care p ate fi $ec!arat static6 a$ica ! ca! fisier"!"i s"rsa care s"stine pe a!! c si free n"+e!e ta*! "!"i fiin$ in2i5i*i! in afara acest"i fisier. In i+p!e+entari!e practice ta*! "! p ate chiar sa n" ai*a nici "n n"+e e! p"tin$ fi *tin"t prin cererea catre siste+"! $e perare a "n"i p inter pe "n *! c $e +e+ rie fara n"+e. O a!ta inf r+atie necesara este !egata $e cit an"+e $in a!! c*"f a f st f ! sit. ) + "ti!i5a "n p inter pe "r+at r"! e!e+ent !i*er6 n"+it a!! cp. Cin$ este ape!at a!! c pentr" n caractere6 e! 2erifica $aca e4ista s"ficient ! c e!i*erat in a!! c*"f. Daca astfe! a!! c ret"rnea5a 2a! area c"renta a !"i a!! cp >a$ica incep"t"! *! c"!"i !i*er@ at"nci aceasta 2a! are esteincre+entata c" n in asa fe! incit a!! cp sa p inte5e pe incep"t"! "r+at arei 5 ne !i*ere. -ree>p@ p"ne p"r si si+p!" pe a!! cp pe p $aca p este in interi r"! !"i a!! c*"f. ;define KA<< % #/ eroare /# Fal pointer$l$i in ca3 de

138

;define P<<=2BHU? !%%% #/ l$n7 spati$l$i disponibil /# static char allocb$f P<<=2BHU?"; #/ memorie pentr$ alloc/# static char /allocp = allocb$f; #/memorarea parti libere/# char /alloc(n) #/ pointer de ret$rn pe n caractere /# int n; { if (allocp 6 n 4= allocb$f 6 P<<=2BHU?) { allocp 6= n; ret$rn(allocp & n); #/ Fechi$l p /# } else #/ n$&i dest$l loc /# ret$rn(KA<<) } free(p) #/ 3ona de memorie libera pointata de p /# char /p; { if (p >= allocb$f NN p 4 allocb$f 6 P<<=2BHU?) allocp = p; } Cite2a e4p!icatii. In genera! "n p inter p ate fi initia!i5at ca rice a!ta 2aria*i!a6 $esi in + $ n r+a! sing"re!e 2a! ri se+nificati2e s"nt NUCC sa" e4presie care perea5a a$rese a!e "n r $ate in prea!a*i! $efinite6 $e tip specificat. Dec!aratia static char /allocp = allocb$f;

139

$efineste pe a!! cp ca fiin$ "n p inter pe caractere si i! initia!i5ea5a pentr" a1 ! p inta pe a!! c*"f care este "r+at area p 5itie !i*era at"nci cin$ incepe pr gra+"!. 0ceasta stare ar p"tea fi scrisa si astfe! static char /allocp = Nallocb$f %"; $e ararece n"+e!e ta*! "!"i este a$resa e!e+ent"!"i 5er . Test"! if (allocp 6 n 4= allocb$f 6 P<<=2BHU?) 2erifica $aca este s"ficient ! c pentr" a satisface cererea pt n caractere. Daca e5ista ! c6 n "a 2a! are a !"i a!! cp 2a fi ce! +"!t +ai $inc ! $e sfirsit"! !"i a!! c*"f. Daca cererea p ate fi satisfac"ta6 a!! c ret"r nea5a "n p inter n r+a! > *ser2ati $ec!aratia f"nctiei@. Daca n"6 a!! c tre*"ie sa ret"rne5e "n se+na! care sa se+nifice ca n" e4ista spati" !i*er. Ci+*aF"! C garantea5a ca nici "n p inter care p intea5a $ata 2a!i$a n" 2a c ntine 5er 6 asa ca 2a! area 5er ret"rnata p ate fi "ti!i5ata ca se+na! $e e2eni+ent an r+a!6 n" e4ista spati" !i*er. 8e scrie NUCC in ! c $e 5er pt a in$ica +ai c!ar ca aceasta este 2a! are specia!a pt "n p inter. In genera! intregii n" p t fi asignati p interi! r= 5er este " ca5 specia!. Teste ca if (allocp 6 n 4= allocb$f 6 P<<=2BHU?) si if (p >= allocb$f NN p 4 allocb$f 6 P<<=2BHU?) re!e2a cite2a fatete i+p rtante a!e arit+eticii p interi! r. Mai intii ca in "ne!e sit"atii p interii p t fi separati. Daca p si c p intea5a pe e!e+ente a!e ace!"iasi ta*! "6 re!atii ca [6 Z6 N6 etc !"crea5a e4act. p 4 V
140

este a$e2arata6 $e e46 in ca5"! in care p p intea5a pe "n e!e+ent anteri r e!e+ent"!"i pe care p intea5a c. Re!atii!e cN si PN s"nt si e!e per+ise. Orice p inter p ate fi testat c" NUCC. Dar n" e4ista nici sansa in a c +para p interi in ta*! "ri $iferite. In ca5"! fericit se 2a *tine "n e2i$ent n nsens6 in$iferent $e +asina pe care se !"crea5a. Mai p ate sa apara sit"atia nefericita in care c $"! 2a +erge pe 2re +asina es"in$ ?+isteri s? pe a!te!e. In a! $ i!ea rin$6 t c+ai s1a *ser2at ca "n p inter si "n interg p t fi a$"nati sa" sca5"ti. Instr"cti"nea p 6 n $ese+nea5a a! n1!ea *iect $"pa ce! p intat c"rent $e p. 0cest !"cr" este a$e2arat in$iferent $e tip"! *iecte! r pe care p a f st $ec!arat ca p inter. C +pi!at r"! at"nci cin$ i! inti!neste pe n6 i! $e!a!ea5a in f"nctie $e !"ngi+ea *iecte! r pe care p intea5a p6 !"ngi+e $eter+inata prin $ec!aratia !"i p. De e4e+p!"6 pe PDP&& fact rii $e sca!are s"nt && pentr" char6 ( pentr" int si sh rt6 % pentr" ! ng si f! at si , pentr" $ "*!e. 7ste 2a!i$a si sca$erea p interi! rJ $aca p si c p intea5a pe e!e+ente!e ace!"iasi ta*! "6 p1c este n"+ar"! $e e!e+ente $intre p si c. 0cest fapt p ate fi "ti!i5at pentr" a scrie n "a 2ersi"ne a !"i str!en. strlen(s) #/ ret$rnea3a l$n7imea sir$l$i /# char /s; { char /p = s; while (/p G= I\%I) p66; ret$rn(p&s); } Prin $ec!arare6 p este initia!i5at pe s6 a$ica sa p inte5e pe pri+"! caracter $in s. In ca$r"! *"c!ei 9hi!e este e4a+inat pe care caracter pina se
141

inti!neste E# care se+nifica sfirsit"! iar $aca 9hi!e testea5a n"+ai $aca e4presia este 5er este p si*i!a +iterea test"!"i e4pi!cit iar astfe! $e *"c!e s"nt scrise a$esea while (/p) p66; De arece p p intea5a pe caractere6 pOO face ca p sa a2anse5e $e fiecare $ata pe caracter"! "r+at r6 iar p12 $a n"+ar"! $e caractere parc"rse6 a$ica !"ngi+ea sir"!"i. 0rit+etica p interi! r este c nsistentaJ $aca a+ fi !"crat c" f! at care c"pa +ai +"!ta +e+ rie $ecit char6 si $aca p ar fi "n p inter pe f! at6 pOO ar a2ansa pe "r+at r"! f! at. 0stfe!6 2 + p"tea scrie a!ta 2ersi"ne a !"i a!! c care pastrea5a sa 5ice+6 f! at in ! c $e char6 p"r si si+p!" prin schi+*area !"i char in f! at. in ca$r"! !"i a!! c si free. T ate +anip"!ari!e $e p interi ia" a"t +at in c nsi$erare !"ngi+ea *iect"!"i p intat in asa fe! incit tre*"ie sa n" fie a!terat. 0!te peratii in afara ce! r +enti nate $eFa >a$"narea sa" sca$erea "n"i p inter c" "n intreg6 sca$erea sa" c +apararea a $ i p interi@. T ate ce!e!a!te peratii arrrt+etice c" p interi s"nt i!ega!e. N" este per+isa a$"narea6 i+partirea6 $ep!asarea ! gica6 sa" a$"narea "n"i f! at sa" $ "*!e !a p inter. ... P interi pe caractere si f"nctii Un sir c nstant scris astfe! "H am a strin7 " este "n ta*! " $e caractere. In repre5entare interna6 c +pi!at r"! ter+ina "n ta*! " c" caracter"! T# in asa fe! incit pr gra+e!e sa p ata $etecta sfirsit"!. C"ngi+ea in +e+ rie este astfe! +ai +are c" & $ecit n"+ar"! $e caractere c"prinse intre ghi!i+e!e. P ate cea +ai c +"na aparitie a "n"i sir $e c nstante este ca arg"+ent a! f"nctiei c"+ ar fi in
142

char /messa7e; at"nci instr"cti"nea messa7e = "now is the time"; asignea5a !"i +esage "n p inter in f"nctie $e caractere!e rea!e. 0ceasta n" este c pie a sir"!"i= n" s"nt i+p!icati $ecit p interii. C n" este in5estrat c" a!ti perat ri care sa trate5e "n sir $e caractere ca "nitate. ) + i!"stra +ai +"!te aspecte in !egat"ra c" p interii si c" ta*! "ri!e stiin$ ca $ "a f"nctii c" a$e2arat "ti!e6 $in *i*!i teca stan$ar$ $e IEO6 s"*iect care 2a fi $isc"tat in capit !"! '. Pri+a f"nctie este strcpA>s6 t@ care c pia5a sir"! t in sir"! s. 0rg"+ente!e s"nt scrise in aceasta r$ine prin ana! gie c" aranFarea6 "n$e cine2a ar p"tea sp"ne s = t pentr" a asigna pe t !"i s. )ersi"nea ca ta*! "ri este +ai intii. strcpE(s, t) #/copia3a t in s /# char s ", t "; { int i; i = %; while ((s i" = t i" G= I\%I) i66; } Iata 2ersi"ne a !"i strcpA c" p interi Fersi$nea

strcpE(s, t) #/ copia3a t in s, pointeri !/# char /s, /t; { while ((/s = /t) G= I\%I) {
143

} }

s66; t66;

De arece arg"+ente!e s"nt trans+ise prin 2a! are6 strcpA p ate "ti!i5a s si t in rice fe! se $ reste. 0ici ei s"nt c n2enti na! "ti!i5ati ca p interi6 care parc"rg ta*! "ri!e pina in + +ent"! in care s1a c piat T# sfirsit"! !"i t6 in s. In practica6 strrcpA n" 2a fi scris asa c"+ s1a aratat +ai s"s. O a $ "a p si!itate ar fi strcpE(s, t) #/ copia3a t in s, Fersi$nea )/# char /s, /t; { while ((/s66 = /t66) G= I\%I) ; } In aceasta "!ti+a 2ersi"ne se i+ita incre+entarea !"i s si t in partea $e test. )a! area !"i UtOO este caracter"! pe care a p intat inainte ca t sa fi f st incre+entat= prefi4"! OO n"1! schi+*a pe t inainte ca acest caracter sa fi f st a$"s. In ace!asi fe!6 caracter"! este st cat in 2e$e a p 5itie s inainte ca s sa fie incre+entat. 0cest caracter este $e ase+enea 2a! area care se gr"pea5a c" T# pentr" si+* "! *"c!ei. 7fect"! net este ca6 caractere!e s"nt c piate $in t in s6 inc!"si2 sfirsit"! !"i T#. Ca "!ti+a a*re2iere 2 + *ser2a ca si gr"parea c" T# este re$"n$anta6 astfe! ca f"nctia este a$esea scrisa ca strcpE(s, t) #/ copia3a t pointeri - /# char /s, /t; { while (/s66 = /t66) ; }
144

in

s;

Fersi$nea

Desi aceasta 2ersi"ne p ate parea c +pi!cata !a pri+a 2e$ere6 aranFa+ent"! ca n tatie este c nsi$erat s"2eran $aca n" e4ista a!te rati"ni $e a schi+*a astfe! ca i! 2eti inti!ni frec2ent in pr gra+e!e C. 0 $ "a r"tina este strc+p>s6 t@ care c +para sir"ri!e $e caractere s si t si ret"rnea5a negati26 5er sa" p 5iti2 in f"nctie $e re!atia $intre s si t= care p ate fiJ s[t6 sNt sa" sZt. )a! area ret"rnata este *tin"ta prin sca$erea caracter"!"i $e pe pri+a p 5itie "n$e s $ifera $e t. strcmp(s, t) #/ ret$rnea3a 4% daca s4t, % daca s==t, >% daca s>t /# char s ", t "; { int i; i = %; while (s i" == t i") if (s i66" == I\%I) ret$rn(%); ret$rn(s i" & t i"); } )ersi"nea p interi a !"i strc+p. s==t, strcmp(s, t) #/ ret$rnea3a 4% daca s4t, % daca char /s, /t; { for ( ; /s == /t; s66, t66) if (/s == I\%I) ret$rn(%); ret$rn(/s & /t); }
145

>% daca s>t /#

Daca OO si 11 s"nt f ! siti a!tfe! $ecit perat ri prefi4 sa" p stfi4 p t apare a!te c +*inatii $e U si OO si 116 $esi +ai p"tin frec2ente. De e4e+p!"J /66p incre+entea5a pe p inainte $e a a$"ce caracter"! pe care p intea5a p. /&&p $ecre+entea5a pe p in ace!asi c n$itii. 74erciti"! ..(. 8crieti 2ersi"ne p interi pentr" f"nctie strcat e4p"sa in capit !"! (J strcat>s6 t@ c pia5a sir"! t !a sfirsit"! sir"!"i s. 74erciti"! ..3. 8crieti "n +acr pentr" strcpA. 74erciti"! ..%. Rescrieti 2ariante!e pr gra+e! r $in capit !e!e anteri are si e4ercitii c" p interi in ! c $e ta*! "ri in$e4ate. B"ne p si*i!itati feraJ get!ine6 at i6 it a si 2ariante!e ! r6 re2erse6 in$e46 get p. ../. P interii n" s"nt $e tip int 81a p"t"t *ser2a ca pr gra+e!e C +ai 2echi a" atit"$ine +ai t !eranta fata $e c pierea p interi! r. In genera! a f st a$e2arat ca pe +aF ritatea +asini! r "n p inter p ate fi asignat "n"i intreg si in2ers6 fara a1! schi+*a= n" are ! c nici sca!are sa" c n2ersie si n" se pier$ *iti. In + $ regreta*i! aceasta stare $e !"cr"ri a c n$"s !a as"+area "n r !i*ertati neper+ise $esi partea pr gra+at r"!"i in !"cr" c" r"tina ce ret"rnea5a p interi ce s"nt trans+isi ap i p"r si si+p!" a!t r r"tine 1 necesitatea $ec!ararii p inter"!"i fiin$ a$esea +isa. De e4e+p!"6 sa !"a+ f"nctie strsa2e care c pia5a sir"! s "n$e2a6 intr1 5 na *tin"ta printr1"n ape! !a a!! c6 ret"rnin$ ap i "n p inter pe ea. 8trsa2e se p ate scrie astfe! char /strsaFe(s) #/ salFea3a $ndeFa sir$l s /# char /s; {
146

} In practica6 e4ista

char /p, /alloc(); if ((p = alloc(strlen(s) 6 !)) G= KA<<) strcpE(p, s); ret$rn(p); ten$inta p"ternica $e a +ite $ec!arari!eJ

strsaFe(s) #/ salFea3a $ndeFa sir$l s /# { char /p; if ((p = alloc(strlen(s) 6 !)) G= KA<<) strcpE(p, s); ret$rn(p); } 0cest c $ s1ar p"tea sa +earga pe +"!te +asini $e arece tip"! i+p!icit a! f"nctii! r si a! arg"+ente! r este int iar atit int1"! cit si p inter"! p t fi asignati !a incep"t cit si !a sfirsit. C" t ate acestea6 acest gen $e c $ este inerent riscant $e arece e! $epin$e $e $eta!ii $e i+p!e+entare si $e arhitect"ra +asinii6 care n" p t fi re5 !2ate pentr" c +pi!at r"! partic"!ar "ti!i5at $e $2s. 7ste rec +an$a*i! sa se efect"e5e t ate $ec!arari!e necesare. >Pr gra+"! !int 2a a2erti5a in !egat"ra c" astfe! $e restrictii in ca5"! in care se 2 r strec"ra ina$2ertente@. ..'. Ta*! "ri +"!ti1$i+ensi na!e C este pre2a5"t c" pr *a*i!itatea $e a !"cra c" ta*! "ri +"!ti$i+ensi na!e6 c" t ate ca in practica e4ista ten$inta ca e!e sa fie +"!t +ai p"tin "ti!i5ate $ecit ta*! "ti!e $e p interi. In aceasta secti"ne 2 + $a cite2a $intre pr prietati!e ! r. 8a re!"a+ pr *!e+a $e c n2ersia $atei6 5i1in1!"na in 5i1in1an si 2ice2ersa. De e4e+p!"6 & +artie este a /#1a 5i $intr1"n an ne*isect si a /&1a $intr1"n an *isect. 8a $efini+ $ "a f"nctii care sa faca c n2ersia ?$aAa faAear? c n2erteste !"na si 5i"a in 5i"a $in an si !"na6 iar
147

?+ ntha$aA? c n2erteste 5i"a $in an in !"na si 5i"a. Daca aceasta $in "r+a f"nctie ret"rnea5a $ "a 2a! ri6 arg"+ente!e ?!"na si 5i"a? 2 r fi p interiJ month daE (!.'', *%, Nm, Nd) p"na pe + pe 3 si pe $ pe &. 0ceste f"nctii a" ne2 ie $e aceasi inf r+atie6 ta*e!a c" n"+ar"! 5i!e! r $in fiecare !"na >?3# 5i!e are septe+*rie?@. Din + +ent ce n"+ar"! $e 5i!E!"na $ifera in f"nctie $e an *isect sa" an ne*isect6 este +ai "s r sa separa+ aceste inf r+atii pe $ "a !inii a!e "n"i ta*! " *i$i+ensi na!= ap i sa incerca+ sa tine+ c nt $e ce se inti+p!a c" fe*r"arie in ti+p"! ca!c"!"i. Ta*! "! si f"nctia pentr" re5 !2area transf r+ari! r s"nt $"pa c"+ "r+ea5aJ static int daEDtab )" !-" = { {%, -!, )(, -!, -%, -!, -%, -!, -!, -%, -!, -%, -!}, {%, -!, )., -!, -%, -!, -%, -!, -!, -%, -!, -%, -!} }; daE&of&Eear(Eear, month, daE) #/ p$ne nr 3ilei in an /# int Eear, month, daE; #/ din l$na Nan /# { int i, leap; leap = Eear 5 + ==% NN Eear 5 !%% G=% LL Eear 5 +%% ==%; for (i = !; i 4 month; i66) daE 6= daEDtab leap" i"; ret$rn(daE); } monthDdaE(Eear, EeardaE, pmonth, pdaE) #/p$ne l$na, 3i /# int Eear, EeardaE, /pmo$nth, /pdaE; #/ din 3i$a in an /#
148

{ int i, leap; leap = Eear 5 + ==% NN Eear 5 !%% G=% LL Eear 5 +%% ==%; for (i = !; EeardaE > daEDtab leap" i"; i66) EeardaE &= daEDtab leap" i"; /pmonth=i; /pdaE=EeardaE; } Ta*! "! daE&ta* tre*"ie sa fie e4tern a+*e! r f"nctii "daEDofDEear" si "monthDdaE?6 in asa fe! incit a+*e!e sa1! p ata "ti!i5a. "daE&tab" este pri+"! ta*! " *i$i+ensi na! c" care a2e+ $e a face in C6 Prin $efinitie "n ta*! " *i$i+ensi na! este $e fapt "n ta*! " "ni$i+ensi na! a!ei carei e!e+ente s"nt fiecare in parte cite "n ta*! ". Prin "ra+re6 in$icii se scri" astfe! daEDtab i" :" in ! c $e daEDtab i, :" ca in +aF ritatea !i+*aFe! r in p!"s "n ta*! " *i$i+ensi na! pa te fi tratat in +ai +"!te + $"ri $ecit in a!te !i+*aFe. 7!e+ente!e s"nt +e+ rate pe !inii6 ceea ce insea+na ca in$ice!e $in $eapta 2araia5a pri+"! in asa fe! incit e!e+ente!e s"nt accesate in r$inea +e+ riei. Un ta*! " se initia!i5ea5a printr1 !ista $e initia!i5at ri scrisi intre ac !a$e= fiecare !iniea "n"i ta*! " *i$i+ensi na! este initia!i5ata printr1 s"*!ista c rsp n$enta. 0+ incep"t ta*! "! $aA1ta* c" c ! ana $e 5er 6 in asa fe! incit n"+er tarea !inii! r p ate fi fac"ta $e !a & !a &( in ! c $e & #1&&. Daca e4ista spati" s"ficient6 este +ai "s r sa se pr ce$e5e inn+ $"! +ai s"s aratat in ! c sa se aF"ste5e in$icii. In ca5"! in care "n ta*! " *i$i+ensi na! tre*"ie trans+is "nei f"nctii6 $ec!ararea arg"+ente! r in f"ntie tre*"ie sa inc!"$a $i+ensi"nea c ! anei6
149

$i+ensi"nea !iniei este ire!e2anta $e arece "nei f"nctii i se trans+ite ca si in ca5"ri!e anteri are6 "h p inter. In ca5"! $e fata este 2 r*a $e "n p inter care parc"rge *iecte care s"nt ta*! "ri $e cite &3 int. 0stfe! $aca tre*"ie trans+is ta*e!"! $aA1ta* "nei f"nctii f6 $ec!ararea !"i f 2a fi f(daEDtab) int daEDtab )" !-"; { ... } Dec!ararea arg"+ent"!"i in f 2a fi $e ase+enea int daE&tab " !-"; $in + +ent ce nr !inii! r este ire!e2ant6 sa" ar p"tea fi int (/daE&tab) !-"; care sp"ne ca arg"+ent"! este "n p inter pe "n ta*! " $e &3 intregi. 8"nt necesare parante5e!e pentr" ca cr sete!e a" pri ritate +ai +are $ecit U6 fara parante5e= $ec!ararea int /daE&tab !-"; este "n ta*! " $e &3 p interi pe intregi6 $"pa c"+ se 2a 2e$ea in secti"nea "r+at are. ..,. Ta*! "ri $e p interi6 p interi pe p interi Dat rita fapt"!"i ca p interii s"nt ei insisi 2aria*i!e6 este $e asteptat ca ei sa fie "ti!i5ati in ta*! "ri $e p interi. Deci6 se p"ne pr *!e+a $e a i!"stra prin scrierea "n"i pr gra+ care s rtea5a "n set $e !inii $e te4t in r$ine a!fa*etica6 2ersi"ne a s rt"!"i "ti!itar UNID. In capit !"! 3 a+ pre5entat f"nctie s rt she!! care s rta "n ta*! " $e intregi. ) + "ti!i5a ace!asi a!g rit+ c" e4ceptia fapt"!"i ca ac"+ 2 + a2ea
150

$e1a face c" !inii $e te4t $e !"ngi+i $iferite si care6 spre $e se*ire $e intregi6 n" p t fi c +parate sa" $ep!asate printr1 sing"ra peratie. 02e+ ne2 ie $e repre5entare a $ate! r care sa p ata face eficient si p tri2it reg"!i! r in gesti narea !ini! r $e te4t $e !"ngi+e $iferita. 0c"+ este + +ent"! p tri2it pt a intr $"ce ta*! "! $e p interi. Daca !inii!e $e s rtat s"nt +e+ rate cap !a cap intr1"n !"ng sir $e caractere >re5er2at prin a!! c6 sa5ice+@ at"nci fiecare !inie p ate fi accesata printr1"n p inter pe pri+"! sa" caracter. P interii insisi p t fi +e+ rati intr1"n ta*! ". D "a !inii p t fi c +parate prin trans+iterea p interi! r respecti2i !"i strc+p. Cin$ $ "a !inii ne r$ nate tre*"iesc in2ersate se in2ersea5a p interii ! r in ta*e!"! $e p interi6 n" !inii!e inse!e. 0cest + $ $e !"cr" e!i+ina c"p!"! $e pr *!e+e !egate $e gesti narea +e+ riei si6 ceea ce este +ai pres"s $e rice6 p ate $ep!asa !inii!e rea!e. Pr ces"! $e s rtare c nsta $in trei partiJ citirea t"t"r r !inii! r !a intrare s rtarea !inii! r tiparirea !inii! r in r$ine Ca $e *icei ce! +ai *ine este sa i+parti+ pr gra+"! in f"nctii care re5 !2a aceasta $efa!care6 c" r"tina principa!a care c ntr !ea5a t t"!. 8a a+ina+ pentr" "n + +ent pas"! $e s rtare si sa ne c ncentra+ as"pra str"ct"rii $e $ate si a IEO. R"tina $e incep"t tre*"ie sa c !ecte5e si sa sa!2e5e caractere!e $in fiecare !inie si sa c nstr"iasca "n ta*! " $e p interi pe !inii. )a tre*"i6 $e ase+enea sa se n"+ere !inii!e !a intrare6 $e arece aceasta inf r+stie este necesara pt s rtare si tiparire. De arece f"nctia $e intrare p ate pera $ ar c" "n n"+ar finit $e !iniiinp"t6 ea 2a ret"rna 2a! are6 c"+ ar fi 1&6 in ca5"! in care se 2 r pre5enta +ai +"!te !inii. RUtina $e "tp"t tre*"ie $ ar sa tipareasca !inii!e in r$inea in care apar i ta*! "! $e p interi. ;define KA<< % ;define <HK?B !%% #/ maMim$m de linii de sortat

/#

main() #/ sortarea liniilor de intrare /# { char /lineptr <HK?B";#/pointeri linii de teMt/#


151

pe

int nlines; #/ nr liniilor libere /# if ((nlines = readlines(lineptr, <HK?B)) >= %) sort(lineptr, nlines); writelines(lineptr, nlines);

} else printf("inp$t prea mare pt sort \n"); } ;define OPQ<?K !%%% readlines(lineptr, maMlines) #/ citeste linii inp$t /# char /lineptr "; int maMlines; { int len, nlines; char /p, /alloc(), line OPQ<?K"; nlines = % while ((len = 7etline(line, OPQ<?K)) > %) if (nlines >= maMlines) ret$rn(&!); else if ((p = alloc(len)) == KA<<) ret$rn(&!); else { line len&!" = I\%I; #/ 3ap newline /# strcpE(p, line); lineptr nlines66" = p; } ret$rn(nlines); } ?ne9!ine? $e !a sfirsit"! fiecarei !inii este sters astfe! incit n" 2a fi afectata r$inea in care s"nt s rtate !inii!e.

152

writelines(lineptr, nlines) #/ scrie linii la iesire /# char /lineptr "; int nlines; { int i; for (i = %; i 4 nlines; i66) printf("5s\n", lineptr i"); } Principa!a n "tate este $ec!arata pentr" ?!ineptr?J char /lineptr <HK?B"; sp"ne ca !ineptr este "n ta*! " $e e!e+ente CIN786 fiecare e!e+ent fiin$ "n p inter pechar. 0$ica6 !ineptrLiM este "n p inter pe caractere iar U!ineptrLiM accesea5a "n caracter. Daca !ineptr este e! ins"si "n ta*! " care este trans+is !"i 9rite!ines6 e! p ate fi tratat ca "n p inter in e4act aceeasi +aniera ca in e4e+p!"! n str" anteri r6 iar f"nctia p ate fi scrisa. writelines(lineptr, nlines) #/ scrie linii la iesire /# char /lineptr "; int nlines; { while (&&nlines >= %) printf("5s\n", /lineptr66); } U!ineptr p intea5a initia! pe pri+a !inie6 c" fiecare incre+entare e! a2ansea5a pe !inia "r+at are pina cin$ n!ines se ep"i5ea5a. Intrarea si iesirea fiin$ c ntr !ate6 se p ate $"ce !a s rtare. 8 rt"! 1she!! $in cap 3 2a s"feri + $ificariJ $ec!aratii!e tre*"ie + $ificate iar peratia $e gr"pare tre*"ie + ntata intr1 f"nctie separata. 0!g rit+"! $e *a5a ra+ine ace!asi ceea ce ne $a arecare speranta ca t t"! 2a +erge *ine inca
153

short(F, n) #/ sortea3a sir$rile F %". . . F n& !" /# char /F "; #/ in ordine crescatoare /# int n; { int 7ap, i, :; char /temp; for (7ap = n#)); 7ap>%; 7ap #= )) for (i = 7ap; i 4 n; i66) for (: = i & 7ap; : >= %; : &= { 4= %) if (strcmp(F :", F :67ap") break; temp = F :"; F :" = F :67ap"; F :67ap" = temp;

7ap)

} }

Daca rice e!e+ent in$i2i$"a! $in 2>a!ias !ineptr@ este "n p inter pe caractere6 te+p 2a fi si e! astfe! $e p inter6 asa incit cei $ i p t fi c piati "n"! in a!t"!. 0+ scris "n pr gra+ care6 in fc $e c"n stinte!e $in ace! + +ent a f st rapi$ pe cit p si*i!. 0cest pr gra+ p ate fi fac"t +ai rapi$6 $e e4e+p!" sa c pie5e !inii!e inp"t $irect intr1"n ta*! " +entin"t prin rea$!ines in ! c sa !e c pie5e in !ine pt ca ap i sa !e p!ase5e "n$e2a prin a!! c. Dar6 pentr" a faci!ita inte!egerea pr gra+"!"i sa int c+i+ +ai intii sche+a ! gica6 si a*ia $"pa aceea sa ne pre c"pa+ $e eficienta sa. M $a!itatea $e a face acest pr gra+ +ai eficeint n" 2i5ea5a neaparat e2itarea "nei c pii a !inii! r inp"t. In! c"irea s rt"!"i she!! prin ce2a +ai *"n c"+ ar fi s rt"! X"ic:s rt6 este pr *a*i! +ai +"!t $ecit a +arca si+p!a $iferenta. In capit !"! & a+ se+na!at acest !"cr" $e arece *"c!e!e 9hi!e si f r testea5a c n$itia fina!a inaintea e4ec"tarii chiar si pt pri+a $ata a c rp"!"i
154

*"c!ei= e!e aF"ta !a a ne asig"ra ca pr gra+e!e 2 r +erge chiar si !a !i+ita6 in partic"!ar fara inp"t. 7ste e$ificat r a "+*!a prin f"nctii!e pr gra+e! r $e s rtare pt a 2erifica ce se inti+p!a $aca n" e4ista $e! c te4t $e intrare. 74erciti"! .... Rescrieti rea$!ines pt a crea !inii intr1"n ta*! " "+p!"t c" +ain6 in ! c $e a ape!a pe a!! c pt re5er2area $e +e+ rie6 C" cit este +ai rapi$ acest pr gra+ G ..3. Initia!i5area ta*! "ri! r $e p interi 8a ne p"ne pr *!e+a scrierii "nei f"nctii + nthana+e>n@ care ret"rnea5a "n p inter pe "n sir $e caractere c ntinin$ n"+e!e a n !inii. 0ceasta este ap!icatie i$ea!a pentr" "n ta*! " static intern. + nth1na+e c ntine "n ta*! " pr pri" $e sir"ri $e caractere si ret"rnea5a "n p inter pe sir"! c n2ena*i! at"nci cin$ este ape!at. 8c p"! acestei secti"ni este $e a arata c"+ se initia!i5ea5a ta*! "! $e n"+e. 8inta4a este si+i!ara c" cea a initia!i5ari! r prece$enteJ char /month&name(n) #/ret$rnea3a n$mele celei de&a n&a l$ni/# int n; { static char /name " = { "l$na eronata", "ian$arie", "febr$arie", "martie", "aprilie", "mai", "i$nie", "i$lie", "P$7$st", "septembrie", "octombrie", "noiembrie",
155

"decembrie" }; ret$rn((n 4 ! LL n > !)) Z name %" : name n"); } Dec!ararea n"+e!"i6 care este "n ta*! " $e p interi pe caractere este aceeasi ca si !a !ineptr6 in e4 $e s rtare. )a! ri!e $e initia!i5are s"nt $e fapt !ista $e caractere= fiecare $intre acestea $in "r+a este asignat p 5itiei c resp"n5at are $in ta*! ". Mai precis6 caractere!e ce!"i $e1a! i1!ea s"nt p!asate "n$e2a iar p inter"! pe e!e este st cat in na+eLiM. Daca !"ngi+ea ta*! "!"i na+e n" este specificata6 c +pi!at r"! n"+ara 2a! ri!e $e intia!i5are si p"ne !"ngi+ea c recta. ..&#. C +aparatie p interi. Ta*! "ri +"!ti1$i+ensi na!e N " 2enitii in C s"nt "ne ri c nf"5i in !egat"ra c" $e se*irea $intre "n ta*! " *i$i+ensi na! si "n ta*! " $e p interi c"+ ar fi na+e $in e4e+p!"! $e +ai s"s. -iin$ $ate $ec!aratii!e int a !%" !%"; int /b !%"; "ti!i5ari!e !"i a si * p t fi si+i!are6 in sens"! ca aL.ML.M si *L.ML.M s"nt a+*e!e referinte !ega!e a!e ace!"iasi int. Dar a este "n ta*! " in t ata reg"!aJ t ate ce!e &## ce!"!e $e +e+ rie tre*"ie a! cate iar pentr" gasirea fiecar"i e!e+ent se face ca!c"!"! *isn"it a! in$ice!"i. Pentr" *6 ric"+ prin $ec!ararea se a! ca &# p interi= fiecare tre*"ie fac"t sa p inte5e "n ta*! " $e intregi. Pres"p"nin$ ca fiecare p intea5a cite &# e!e+ente $in ta*! "6 at"nci 2 + *tine &## ce!"!e $e +e+ rie re5er2ate6 p!"s ce!e &# ce!"!e pt p interi. 0stfe! ta*! "! $e p interi "ti!i5ea5a sensi*i! +ai +"!t spati" si p ate cere "n pr e4p!icit $e initia!i5are. Dar6 e4ista $ "a a2antaFeJ accesarea "n"i e!e+ent se face in$irect prin inter+e$i"! "n"i p inter6 in ! c sa se faca prin in+"!tire si a$"nare iar !inii!e ta*! "!"i p t fi $e !"ngi+i $iferite. 0ceasta inse+na ca n" rice e!e+ent a! !"i * este c nstrins sa p inte5e pe "n 2ect r $e &# e!e+ente6 "nii p t p inta pe cite ( e!e+ente6 a!tii pe cite (# si a!tii pe nici"n"!.
156

Desi a+ +ai $isc"tat acest !"cr" !a intregi6 $e $eparte6 cea +ai frec2enta "ti!i5are a ta*! "!"i $e p interi este cea i!"strata prin + "nth1 na+eJ sa st che5e !ant"ri $e caractere $e !"ngi+i $iferite. 74erciti"! ../. Rescrieti r"tine!e $aAa faAear si + "nth1$aA c" p interi in ! c $e in$e4are. ..&&. 0rg"+ente!e !iniei $e c +an$a Printre faci!itati!e ferite $e C e4ista + $a!itatea $e a trans+ite arg"+ente!e !iniei $e c +an$a sa" para+etrii "n"i pr gra+ at"nci cin$ e! incepe sa se e4ec"te. Pt inceperea e4ec"tiei este ape!at +ain prin $ "a arg"+ente. Pri+"! >n"+it c n2eti na! arge@ este n"+ar"! arg"+ente! r !iniei $e c +an$a prin care a f st ape!at pr gra+"!= a! $ i!ea >arg2@ este "n p inter pe "n ta*! " $e !ant"ri $e caractere care c ntine arg"+ente!e6 "n"! pentr" fiecare !ant. Manip"!area acest r !ant"ri $e caractere este "ti!i5are c +"na a ni2e!e! r +"!tip!e $e p interi. Cea +ai si+p!a i!"strare a $ec!aratii! r necesare si a ce! r $e +ai s"s a+intite este pr gra+"! ech 6 care p"ne p"r si si+p!" pe sing"ra !inie arg"+ente!e !iniei $e c +an$a6 separate prin *!anc"ri. 0stfe!6 $aca este $ata c +an$a echo hello, world iesirea este hello, world Prin c n2entie6 arg2L#M este n"+e!e prin care se rec"n aste pr gra+"!6 asa ca argc este &. In e4e+p!"! $e +ai s"s6 argc este 3 si arg2L#M6 arg2L&M si arg2L(M s"nt respecti2 ech 6 he!! si 9 r!$. 0ceasta este i!"strata in ech J main(ar7c, ar7F) #/ ar7. echo; prima Fersi$ne /# int ar7c; char /ar7F ";
157

{ int i; for (i = !; i 4 ar7c; i66) printf("5s5c", ar7F i", (i 4ar7c&!) Z I I : I\nI); 0rg fiin$ "n p inter pe "n ta*! " $e p interi6 e4ista cite2a + $a!itati $e a scrie acest pr gra+ care i+p!ica +anip"!area p inter"!"i +ai c"rin$ $ecit in$e4area ta*! "!"i. 8a 2e$e+ $ "a 2arianteJ /# main(ar7c, ar7F) #/ ar7 echo; a do$a Fersi$ne

int ar7c; char /ar7F "; { while (&&ar7c > %) printf("5s5c", /66ar7F, (ar7c >!) Z I I : I\I); } Daca arg2 este "n p inter pe incep"t"! ta*! "!"i care c ntine sir"ri $e arg"+ente6 a1! incre+enta c" i>OOarg2@ face ca e! sa p inte5e pe arg2L&M in ! c $e arg2L#M. -iecare incre+entare s"ccesi2a +"ta pe arg2 pe "r+at r"! arg"+ent= arg2 este $eci p inter"! pe ace! arg"+ent. 8i+"!tan argc este $ecre+entat= at"nci cin$ e! $e2ine 5er 6 n" +ai e4ista arg"+ente $e i+pri+at. main(ar7c, ra7F) #/ ar7 echo; a treia Fersi$ne /# int ar7c; char /ar7F "; { while (&&ar7c > %) printf((ar7c > !) Z "5s " : "5s\n", /66ar7F); }
158

0ceasta 2ersi"ne arata ca f r+at"! arg"+ent"!"i !"i printf p ate fi e4presie ca ricare a!ta. 0ceasta "ti!i5are n" este f arte frec2enta $ar este *ine sa fie retin"ta. Ca "n a! $ i!ea e4e+p!"6 sa face+ "ne!e + $ificari in c nfig"ratia pr gra+"!"i $e ca"tare $in cap%. In ca5"! "n"i ape! repetat6 c nfig"ratia ce ser2este $e + $e! 2a fi pre!"crata ca atare6 $e fiecare $ata $e catre pr gra+6 ceea ce ar $"ce !a "n aranFa+ent e2i$ent nesatisfacat r. Ur+in$ e4e+p!"! "ti!itar"!"i grep1UNID6 sa schi+*a+ pr gra+"! in asa fe! incit c nfig"ratia + $e! sa fie specificata prin pri+"! arg"+ent a! !iniei $e c +an$a. ;define OPQ<HK? !%%% main(ar7c, ar7F) #/ ca$tarea model specificat prin prim$l ar7$ment/# int ar7c; char /ar7F "; { char line OPQ<HK?"; if (ar7c G= )) printf("$sa7e: find pattern\n); else while (7etline(line, OPQ<HK?)>%) if (indeM(line, ar7F !" >= %) printf("5s", line); } 0c"+ p ate fi e!a* rat + $e!"! $e *a5a in asa fe! incit sa i!"stre5e 2iit are!e c nstr"ctii rea!i5ate c" aF"t r"! p interi! r. 8a pres"p"ne+ ca $ ri+ ca $ "a arg"+ente sa fie pti na!e. Un"! $intre e!e sp"ne ?tipareste t ate !inii!e c" e4ceptia ce! r care c ntin + $e!"! ?= a! $ i!ea cere ?fiecare !inie tiparita sa fie prece$ata $e n"+ar"! c"rent?. O c n2entie "5"a!a pt pr gra+e!e C este !egata $e arg"+ent"! care incepe c" "n se+n +in"s si care intr $"ce "n f!ag sa" "n para+entr"
159

pti na!. Daca se a!ege 14>pt ?e4ceptie?@ pt se+na!area in2ersarii6 si >?nr?@ pt a cere n"+ararea !inii! r6 at"nci c +an$a find &M &n the c" intrarea now is the time for all 7ood men to come to the aid of their partE 2a pr $"ce iesirea ): for all 7ood men 0rg"+ente!e pti na!e s"nt a$+ise in rice r$ine iar rest"! pr gra+"!"i 2a fi insensi*i! !a n"+ar"! arg"+ente! r care a" f st6 $e fapt6 pre5ente. In partic"!ar6 ape!"! !a in$e4 n" 2a referi pe arg2L(M at"nci cin$ a f st "n sing"r f!ag si nici !a arg2L&M $aca n1a e4istat nici "n arg"+ent f!ag. In p!"s6 este c n2ena*i! pt "ti!i5at ri $aca arg"+ente!e pti na!e p t fi a$"nate6 ca in find &nM the Iata pr gra+"! ;define OPQ<HK? !%%% main(ar7c, ar7F) #/7asirea confi7$ratiei prim$l ar7/# int ar7c; char /arF "; { char lim OPQ<HK?}, /s; lon7 lineno = %; int eMcept = %, n$mber = %;
160

din

while (&&ar7c > % NN (/66ar7F) %" == I&I) 6) for (s = ar7F %" 6 !; /s G= I\%I; s6 switch (/s) { case IMI: eMcept = !; break; case InI: n$mber = !; break; defa$lt: printf("fiind: ar7c = %; break;

ile7al

option

5c\n", /s);

} if (ar7c G= !) printf("$sa7e: pattern\n"); %) else while {

find

&M OPQ<HK?)

&n >

(7etline(lim,

lineno66; if

((indeM(line,/ar7F)>=%) G=eMcept) { if (n$mber) printf("5ld: lineno); printf("5s", line); } } }


161

",

arg2 este incre+entat inaintea fiecar"i arg"+ent pti na! si argc este $ecre+entat. Daca n" e4ista er ri6 !a sfirsit"! *"c!ei argc 2a fi & iar arg2 2a p inta pe c nfig"ratia $ata. De n tat ca UOOarg2 este "n p inter pe "n !ant $e caractere= >UOOarg2@L#M este pri+"! caracter. Parante5e!e s"nt necesare $e arece fara $e e4presia ar fi UOO>arg2L#M@6 ceea ce este c" t t"! a!tce2a >si er nat@. O f r+a c recta ar fi. //66ar7F 74erciti"! ..'. 8crieti pr gra+"! a$$ care e2a!"ea5a p ! ne5a in2ersata $in !inia $e c +an$a. De e4e+p!"6 add ) - + 6 / ca!c"!ea5a ( 4 >3 O %@ 74erciti"! ..,. M $ificati pr gra+e!e enta* si $eta* >scrise ca e4ercitii in cap &@ in asa fe! incit sa accepte ca arg"+ente !ista $e ta*1st p1"ri "ti!i5ati ta*1"ri!e n r+a!e $aca n" e4ista arg"+ente. 74erciti"! ..3. 74tin$eti enta* si $enta* in asa fe! incit sa accepte presc"rtarea. entab m 6n care insea+na ta*1st p $"pa fiecare n c ! ane6 incepin$ $e !a c ! ana +. 8crieti f"nctia arecare i+p!icita c n2ena*i!a pentr" "ti!i5at r. 74erciti"! ..&#. 8crieti pr gra+"! tai! care tipareste r"tine!e n !inii1 inp"t. Pres"p"ne+6 i+p!icit nN&#6 $ar e! p ate fi schi+*at "n arg"+ent pti na!6 astfe! tail &n i+pri+a "!ti+e!e n !inii. In + $ n r+a!6 pr gra+"! 2a f"ncti na in$iferent $e intrare >rati na!a sa" n"@6 sa" $e 2a! are !"i n. 8crieti pr gar+"! in asa
162

e4presie

fe! incit sa "ti!i5e5e in + $ pti+ +e+ riaJ !inii!e 2 r fi pastrate ca in sh rt6 n" intr1"n ta*! " *i$i+ensi na! $e !"ngi+e fi4ata. ..&(. P interi pe f"nctii In C f"nctia in sine n" este 2aria*i!a6 $ar e4ista p si*i!itatea $e a $efini "n p inter pe f"nctie6 care p ate fi +anip"!at6 trans+is f"nctii! r6 p!asat in ta*! "ri etc. ) + i!"stra aceasta + $ificin$ pr ce$"ra $e s rtare scrisa +ai anteri r in acest cap6 in asa fe! incit fiin$ $at arg"+ent"! pti na!1 n sa se s rte5e !inii!e inp"t +e+ rie6 n" !inii c piate. De *icei6 "n s rt c nsta in trei parti1 c +paratie care rea!i5ea5a r$ narea ricarei perechi $e *iecte6 schi+*are6 prin care se in2ersea5a ri$inea *iecte! r si "n a!g rit+ $e s rtare care face c +paratii si schi+*ari pina cin$ *iecte!e s"nt $efiniti2 r$ nate. 0!g rit+"! $e s rtare este in$epen$ent $e peratii!e $e c +parare si schi+*are6 astfe! incit prin trans+iterea f"nctiei $e c +parare si schi+*are catre e!6 se 2a p"tea rea!i5a s rtarea pe $iferite criterii. 0cest !"cr" ni1! pr p"ne+ in n "! s rt. C +pararea !e4ic grafica a $ "a !inii este rea!i5ata prin strc+p iar schi+*area prin s9ap= a2e+ ne2 ie $e r"tina n"+ec+p care c +para $ "a !inii pe *a5a 2a! ri! r n"+erice si ret"rnea5a "n in$ice $e c n$itie $e ace!asi fe! ca si strc+p. 0ceste trei f"nctii s"nt $ec!arate in +ain iar p interii pe e!e s"nt trans+isi !a s rt. 8 rt !a rin$"! sa" ape!ea5a f"nctii!e prin s rt6 !a rin$"! sa" ape!ea5a f"nctii!e prin p interi. 0+ sarit peste pr ces"! $e tratare a arg"ente! r er nate6 c ncentrin$"1ne astfe! pe re5 !2area pr *!e+e! r principa!e. ;define <HK?B !%%% #/ maMim$m de linii de sortat /# main(ar7c, ar7F) #/ sortarea linii inp$t /# int ar7c; char /ar7F "; { char /lineptr <HK?B"; #/ pointeri pe liniile de teMt /# int nlines; #/ nr linii&inp$t citire /#
163

== InI)

int strcmp(), n$mecmp(); #/ fc de comparare /# int swap(); #/ fc de schimbare /# int n$meric = %; #/ ! daca este sort n$meric /# if (ar7c > ! NN ar7F !" %" == I&I NN ar7F !" !" n$meric = !; if ((nlines = readlines(lineptr, <HK?B)) >= %) { if (n$meric) sort(lineptr, nlines, n$mecmp, sort(lineptr, nlines, strcmp, swap); writelines(lineptr, nlines); } else printf("intrare prea mare pentr$ sort\n"); $e f"nctii= $in + +ent ce e!e s"nt n" este necesar !a fe! c"+ e! n" este C +pi!at r"! este ce! care re5 !2a rtJ else

swap);

strc+p6 n"+ec+p si s9ap s"nt a$rese c"n sc"te ca fiin$ f"nctii6 perat r"! ^ necesar inaintea n"+e!"i "n"i ta*! ". trans+iterea a$resei f"nctie. 0! $ i!ea pas este + $ificarea !"i s

sort(F, n, comp, eMch) #/ sortea3a sir$rile F %". . . F n&!" /# char /s "; int n; int (/comp)(), (/eMch)(); { int 7ap, i, :; for (7ap = n#); 7ap > %; 7ap #= )) for (i = 7ap; i 4 n; i66) for (: = i & 7ap; : >= %; : &=
164

7ap)

{ 4= %) } if ((/comp)(F :", F :67ap") break; (/eMch)(NF :", NF :67ap"); }

Dec!aratii!e 2 r fi st"$iate c" griFa. int (/comp)() sp"ne ca c +p este "n p inter pe parante5e este necesar= fara e!e int /comp() ar sp"ne ca c+p este f"nctie ce ret"rnea5a "n p inter pe "n integer6 ceea ce este c" t t"! a!tce2a. Uti!i5area !"i c +p in !inia if ((/comp)(F :", F :67ap") 4= %) este c +para*i!a c" $ec!aratia p tri2it careia c+p este " p inter pe f"nctie= Uc +p este f"nctie6 iar (/comp)(F :", F :67ap") este ape!"! ei. Parante5e!e s"nt necesare pentr" as cierea c recta a c +p nente! r. 0+ i!"strat $eFa prin strc+p c +pararea a $ "a sir"ri. Iata n"+ec+p care c +para $ "a sir"ri n"+erice pe *a5a 2a! rii n"+ericeJ n$mcmp(s!, s)) #/ compara n$meric s! c$ s) /# char /s!, /s); { do$ble atof(), F!, F);
165

fc ce ret"rnea5a "n int. Pri+"! set $e

F! = atof(s!); F) = atof(s)); if (F! 4 F)) ret$rn(&!); else if (F! > F)) ret$rn(!); else ret$rn(%);

Pas"! fina! este a$a"garea f"nctiei s9ap care schi+*a $ i p interi. 0ceasta este a$ ptata $irect $in ceea ce a+ pre5entat +ai $e2re+e in acest capit !. swap(pM, pE) #/ interschimba /pM si /pE //# char /pM ", /pE "; { char /temp; temp = /pM; /pM = /pE; /pE = temp; } 74ista 2arietate $e a!te pti"ni care p t fi a$a"gate !a pr gra+"! $e s rtare= "ne!e $intre e!e p t fi reincercate ca e4erctii. 74erciti"! ..&&. M $ificati s rt in asa fe! incit sa gesti ne5e "n f!ag6 1r care in$ica s rtarea in r$ine in2ersa >$escrescat are@. Bineinte!es 1r tre*"ie sa fie c +pati*i! c" 1n. 74erciti"! ..&(. 0$a"gati pti"nea 1n pt a pre!"cra i+pre"na !itere!e +ari si !itere!e +ici a$ica sa n" se +ai faca $istinctia intre aceste $ "a tip"ri $e caractere grafice inti+p"! s rtarii= $ate!e c" !itere +ari si cee c" !itere +ici s"nt s rtate i+pre"na6 in asa fe! incit a si 0 apar a$iacent6 n" separate prin intreg"! a!fa*et a! !itere! r +ici sa" +ari.

166

74erciti"! ..&3. 0$a"gati pti"nea 1$ >? r$inea $in $icti nar?@ care rea!i5ea5a c +parari $ ar pentr" !itere6 n"+ere si f!anc"ri. 0sig"arti12a ca 1$ +erge i+pre"na c" 1f. 74erciti"! ..&%. 0$a"gati fac!itatea !egata $e gesti narea ci+p"ri! r6 in asa fe! incit s rtarea sa p ata fi fac"ta pe ci+p"ri si interi r"! !inii! r6 fiecare c resp"n5in$ "n"i set in$epen$ent $e pti"ni. >In$e4"! acestei carti f st s rtat c" 1$f pt r$inea a!fa*etica si c" 1n pentr" pagini! r.@

167

CAPITOLUL & 8TRUCTURI O str"ct"ra este c !ectie $e "na sa" +ai +"!te 2aria*i!e care p t fi $e tip"ri $iferite6 gr"pate i+pre"na s"* "n sing"r n"+e pentr" +anip"!are c n2ena*i!a. >8tr"ct"ri!e s"nt an"+ite ?inregistrari? in "ne!e !i+*aFe6 $e e4e+p!" in P08C0C.@ 74e+p!"! tra$iti na! $e str"ct"ra este inregistrarea pers na!aJ "n sa!ariat este $escris prin cite2a atri*"te ca+e!e6 a$resa6 sa!ari" etc. -iecare $in atri*"te !a rin$"! ! r p t fi str"ct"riJ n"+e!e are +ai +"!te c +p nente6 a$resa $e ase+enea6 sa!ari"! $e *a5a s.a.+.$. 8tr"ct"ri!e aF"ta !a rgani5area $ate! r c +p!icate6 +ai a!es in pr gra+e!e $e +ari $i+ensi"ni6 $e arece in +"!te sit"atii e!e per+it ca "n gr"p $e 2aria*i!e inr"$ite sa fie tratate "nitar si n" ca entitati separate. In acest capit ! 2 + incerca sa i!"stra+ c"+ s"nt "ti!i5ate str"ct"ri!e. Pr gra+e!e pe care !e 2 + f ! si in acest sc p s"nt +ai +ari $ecit +"!te a!te!e $in +an"a!"! acesta6 $ar inca $e $i+ensi"ni + $este. /.&. Ba5e!e 8a ne rea+inti+ r"tine!e $e c n2ersie a $atei $in capit !"! .. O $ata c nsista $in +ai +"!te parti6 prec"+ 5i"a6 !"na6 an"! si pr *a*i! 5i"a $in an si n"+e!e !"nii. 0ceste cinci 2aria*i!e p t fi t ate p!asate intr1 sing"ra str"ct"ra ca aceastaJ str$ct date { int daE; int month; int EeardaE; char monDname +"; }

168

C"2int"! cheie ?str$ct? intr $"ce str"ct"ra $e $ate6 care este !ista $e $ec!artii c"prinsa intre ac !a$e. Un n"+e pti na! >eticheta@ n"+it ?str$ct$re ta7?6 p ate sa "r+e5e c"2int"! cheie ?str"ct?>prec"+ $ate in e4e+p!"! $e +ai s"s@. 0ceasta eticheta $a "n n"+e acest"i gen $e str"ct"ra si p ate fi referita in c ntin"are ca presc"rtare $e $ec!aratie $eta!iata. 7!e+ente!e sa" 2aria*i!e!e +enti nate intr1 str"ct"ra s"nt n"+ite ?+e+*ri?. Un +e+*r" a! str"ct"rii sa" eticheta a "nei str"ct"ri sa" 2aria*i!a si+p!a p t a2ea ace!asi n"+e fara a+*ig"itate $e arece se $isting prin c nte4t. Desig"r se 2a "ti!i5a ace!asi n"+e $ ar pentr" a $efini *iecte in strinsa re!atie. 0c !a$a $in $reapta care inchi$e !ista +e+*ri! r str"ct"rii p ate fi "r+ata $e !ista $e 2aria*i!e ca in e4e+p!"! $e +ai F sJ str$ct {...} M, E, 3; ceea ce este sintactic ana! g c"J int M, E, 3; in sens"! ca fiecare $ec!aratie n"+este pe 46 A6 5 si 5 ca 2aria*i!e $e tip"! specificat si a! ca spati" pentr" fiecare $in e!e. O $ec!aratie $e str"ct"ra care n" este "r+ata $e !ista $e 2aria*i!e n" a! ca spati" $e +e+ rie ci $escrie $ ar f r+a sa" rgani5area str"ct"rii. Daca str"ct"ra este n +ina!i5ata6 n"+e!e p ate fi "ti!i5at in pr gra+ pentr" atri*"irea $e 2a! ri str"ct"rii. De e4e+p!"J str$ct date d; $efineste 2aria*i!a $ care are str"ct"ra $e tip $ata6 si p ate fi initia!i5ata !a "n + +ent $at c nf r+ $efinitiei sa!e c" !ista ca +ai F sJ str$ct date d ={+, ', !''*, !(*, "]$l" };
169

Un +e+*r" a "nei str"ct"ri partic"!are p ate fi referit intr1 printr1 c nstr"ctie $e f r+aJ "n$mestr$ct$ra.membr$"

e4presie

Operat r"! ?.? $in c nstr"ctia $e +ai F s !eaga n"+e!e +e+*r"!"i $e n"+e!e str"ct"rii. De e4e+p!" pentr" a af!a "n an *isect $in str"ct"ra $ se refera !a +e+*r"! ?Aear? astfe!J leap = d.Eear 5 + == % NN d.Eear 5 !%% G= % LL d.Eear 5 +%% == %; sa" pentr" a testa n"+e!e !iniei $in +e+*r"! ?+ n? if (strcmp(d.monDname, "P$7") == %) ... sa" pentr" a c n2erti n"+e!e !"nii !a !itere +ici d.monDname %" = lower(d.monDname %"); O str"ct"ra p ate sa c"prin$a str"ct"ri6 $e e4e+p!"J str$ct person { char name KPO?BHU?"; char address PR@BHU?"; lon7 3ipcode; lon7 ss&n$mber; do$ble salarE; str$ct date birthdate; str$ct date hiredate; }; 8tr"ct"ra ?pers n? c ntine $ "a str"ct"ri $e tip $ata >? birthdate? si ?hiredate?@. Daca $ec!ara+ ?p? astfe! str$ct person emp;
170

at"nci

c nstr"ctie emp.birthdate.month

se 2a referi !a !"na $in $ata nasterii. Operat r"! ?.? as cia5a partea stinga c" $reapta. /.(. 8tr"ct"ri si f"nctii 74ista "n n"+ar $e restrictii re!ati2e !a str"ct"ri!e in C. Reg"!i!e esentia!e s"nt ca n" p"teti face as"pra "nei str"ct"ri $ecit peratia $e *tinere a a$resei c" ^6 si $e accesare a "n"ia $intre +e+*rii str"ct"rii. 0cest !"cr" pres"p"ne ca str"ct"ri!e n" p t fi asignate sa" c piate ca "n t t "nitar6 si ca n" p t fi nici pasate sa" ret"rnate intre f"nctii. >0ceste restrictii 2 r fi ri$icate in 2ersi"ni!e 2iit are.@ P interii !a str"ct"ri n" se s"p"n insa acest r restricti6 si $e aceea str"ct"ri!e si f"nctii!e c perea5a c nf rta*i!. In fine6 str"ct"ri!e a"t +ate6 ca si ta*! "ri!e a"t +ate6 n" p t fi initia!i5ate= n" p t aceasta $ecit st"ct"ri!e statice. 8a 2e$e+ cite2a $in aceste pr *!e+e rescriin$ f"nctii!e $e c n2ersie $e $ata $in capit !"! prece$ent6 f ! sin$ str"ct"ri. De arece reg"!i!e inter5ic pasarea $e str"ct"ri $irect "nei f"nctii6 tre*"ie fie sa pasa+ c +p nente!e separat6 fie sa pasa+ "n p inter catre intreg"! *iect. Pri+a a!ternati2a se f ! seste $e $aAa faAear asa c"+ a+ scris in capit !"! .J d.daE); d.EeardaE = daEDofDEear(d.Eear, d.month,

Ce!a!a!t + $ este $e a pasa "n p inter. Daca a+ $ec!arat pe hire$ate caJ str$ct date hiredate; si a+ rescris pe $aAa faAear6 p"te+ ap i sp"neJ hiredate.EeardaE = daE&of&Eear(Nhiredate);
171

$eci p inter"! !"i ?hire$ate? trece !a ?$aA1 f1Aear?. 0c"+ f"nctia tre*"ie sa fie + $ificata $e arece arg"+ent"! sa" este "n p inter si n" !ista $e 2aria*i!e. daE&of&Eear(pd) #/ set daE of Eear from month, daE /# str$ct date /pd; { int i, daE, leap; daE = pd&>daE; leap = pd&>Eear 5 + == % NN pd&>Eear 5 !%% G= % LL pd& >Eear 5 +%% == %; for (i = !; i 4 pd&>month; i66) daE 6= daEDtab leap" i"; ret$rn(daE); } Dec!aratia ?str"ct $ate Up$=? sp"ne ca p$ este "n p inter !a str"ct"ra $e tip $ata. N tatia ?p$1ZAear? este n "a. Daca p este p inter !a str"ct"ra6 at"nci p&>member&of&str$ct$re refera "n +e+*r" partic"!ar. >Operat r"! 1Z este "n +in"s "r+at $e Z.@ C" aF"t r"! p inter"!"i p$ p ate referit si "n +e+*r" a! str"ct"rii6 $e e4e+p!" +e+*r"! ?Aear?J (/pd).Eear De arece p interii !a str"ct"ri s"nt $es "ti!i5ati este prefera*i!a f ! sirea perat r"!"i 1Z6 f r+a +ai sc"rta. In c nstr"ctia $e +ai s"s parante5e!e s"nt necesare $e arece perat r"! ?.? este pri ritar fata $e ?U?. 0tit ?1Z? cit si ?.? se as cia5a $e !a stinga !a $reapta astfe!J
172

p&>V&>memb emp.birthdate.month s"nt (p&>V)&>memb (emp.birthdate).month Pentr" c +p!etare $a+ str"ct"ri!e. Eear /# a!ta f"nctie ?+ nth1$aA? rescrisa f ! sin$

month&daE(pd) #/ set month and daE from daE of str$ct date /pd; { int i, leap; leap = pd&>Eear 5 + == NN pd&>Eear 5 !%% G= % LL pd&>Eear 5 +%% == %; pd&>daE = pd&>EeardaE; for (i = !; pd&>daE > daEDtab leap" i"; i66) pd&>daE &= daEDtab leap" i"; pd&>month = i; } Operat rii $e str"ct"ra ?1Z? si ?. ? i+pre"na c" ?>@? pentr" !iste si ?LM? pentr" in$ici in ierarhia pri ritati! r s"nt cei +ai p"ternici. De e4e+p!" !a $ec!aratiaJ str$ct { int M; int /E; } /p; at"nci OOp1Z4 incre+entea5a pe 4 si n" p6 $e arece r$inea i+p!icita este OO >p1Z4@. Parante5e!e p t fi "ti!i5ate pentr" a + $ifica pri ritati!eJ >OOp@1Z4
173

incre+entea5a p inainte $e a accesa 46 iar >pOO@1Z4 incre+entea5a p $"pa aceea. >0cest "!ti+ set $e parante5e n" este necesar. De ce G@ In ace!asi sens6 Up1ZA a$"ce ceea ce p intea5a A= Up1ZAOO incre+entea5a A $"pa ce se face acces"! !a ceea ce p intea5a A >!a fe! c" UsOO@= >Up1ZA@OO incre+entea5a ceea ce p intea5a A= si UpOO1ZA incre+entea5a p $"pa acces"! !a ceea ce p intea5a A. /.3. Ta*! "ri $e str"ct"ri 8tr"ct"ri!e s"nt in specia! "ti!e pentr" +ane2rarea ta*! "ri! r $e 2aria*i!e inr"$ite. Pentr" e4e+p!ificare sa c nsi$era+ "n pr gra+ pentr" a n"+ara fiecare aparitie a c"2int"!"i cheie C. 02e+ ne2 ie $e "n ta*! " $e sir"ri $e caractere pentr" a pastra n"+e!e si "n ta*! " $e intregi pentr" c nt are. O p si*i!itate este f ! sirea in para!e! a $ "a ta*! "ri "n"! pentr" c"2inte cheie si "n"! pentr" c nt are6 astfe! char /keEword KY?JB"; int keEco$nt KY?JB"; Dar insasi fapt"! ca se f ! sesc $ "a ta*! "ri para!e!e in$ica p si*i!itatea "nei a!te rgani5ari. -iecare acces $e c"2int cheie este $e fapt perecheJ char U:eA9 r$$ int :eAc "nt ceea ce $e fapt este "n ta*! " $e perechi. Ur+at area $ec!aratie $e str"ct"raJ str$ct keE { char /keEword; int keEco$nt; } keEtab KY?JB";

174

$efineste "n ta*! " ?:eAta*? $e str"ct"ri $e acest tip si ii a! ca +e+ rie.-iecare e!e+ent a! ta*! "!"i este str"ct"ra. 0ceasta se +ai p ate scrieJ str$ct keE { char /keEword; int keEco$nt; }; str$ct keE keEtab KY?JB"; De fapt str"ct"ra ?:eAta*? c ntine "n set c nstant $e n"+e care ce! +ai "s r se p ate initia!i5a sing"ra $ata cin$ este $efinita. Initia!i5area str"ct"rii este ana! aga c" initia!i5ari!e pre5entate +ai $e2re+e 1$efinitia este "r+ata $e !ista $e initia!i5at ri c"prinsi intre ac !a$eJ str$ct keE { char /keEword; int keEtab; } keEtab " ={ "break", %, "case", %, "char", %, "contin$e", %, "defa$lt", %, #/.../# "$nsi7ned", %, "while", % }; Initia!i5at rii s"nt !istati in perechi c resp"n5in$ +e+*ri! r str"ct"rii. 0r fi +ai precis ca initia!i5at rii pentr" fiecare ?sir? sa" str"ct"ra sa fie c"prinsi intre ac !a$eJ {"break", %}, {"case", %}, ...
175

$ar ac !a$e!e in interi r n" s"nt necesare at"nci cin$ initia!i5at rii s"nt si+p!e 2aria*i!e sa" sir"ri $e caractere si cin$ t ate s"nt pre5ente. Ca $e *icei c +pi!at r"! 2a ca!c"!a n"+ar"! $e intrari in ta*! "! ?:eAta*? $aca initia!i5at rii s"nt pre5enti iar ?LM? este !asat g !. Pr gra+"! $e n"+arare a c"2inte! r cheie incepe prin $efinirea !"i ?:eAta*?. R"tina principa!a citeste intrarea prin ape!"ri repetate a f"nctiei ?7etword? care !a ape!are citeste "n c"2int. -iecare c"2int este ca"tat in ?:eAta*? c" aF"t r"! "nei 2ersi"ni a f"nctiei $e ca"tare !inia ra $escrisa in capit !"! 3. >Bineinte!es !ista $e c"2inte cheie tre*"ie sa fie in r$ine crescat are pentr" ca trea*a sa +earga@. ;define OPQ>=@R )% main() #/ co$nt c keEwords /# { int n, t; char word OPQ>=@R"; while ((t = 7etword(word, OPQ>=@R)) G= ?=1) if (t == <?CC?@) if ((n = binarE(word, keEtab4KY?JB))

>= %)

keEtab n".keEco$nt66; for (n = %; n 4 KY?JB; n66) if (keEtab n", keEco$nt > %) printf("5+d 5s\n", keEtab n".keEco$nt, keEtab n".keEword); } binarE(word, tab, n) #/ find word in tab %"...tab n&!" /# char /word; str$ct keE tab "; int n; { int low, hi7h, mid, cond;
176

low = % hi7h = n & ! while (low 4= hi7h) { mid = (low 6 hi7h) # ); if ((cond = tab mid".keEword)) 4 %) hi7h = mid & !; else if (cond > %) low = mid 6 !; else ret$rn(mid); } ret$rn(&!); }

strcmp(word,

In c"rin$ 2 + pre5enta si f"nctia ?7etword?= pentr" + +ent este s"ficient sa sp"ne+ ca ea ret"rnea5a C7TT7R $e atitea ri cin$ gaseste "n c"2int si c pia5a c"2int"! in pri+"! ei arg"+ent. Cantitatea NK7\8 este n"+ar"! $e c"2inte cheie $in ? keEtab?. Desi a+ p"tea sa n"+ara+ acestea +an"a!6 este +"!t +ai "s r si +ai sig"r sa face+ aceasta c" aF"t r"! +asinii in specia! $aca !ista este s"*iect"! "nei p si*i!e schi+*ari. O p si*i!itatea ar fi sa incheie+ !ista $e initia!i5at ri c" "n p inter n"! si ap i sa *"c!a+ in ?keEtab? pina este $etectat sfirsit"!. Dar aceasta este +ai +"!t $ecit este necesar6 $e arece $i+ensi"nea ta*! "!"i este c +p!ect $eter+inata in + +ent"! c +pi!arii. N"+ar"! $e intrari esteJ dimensi$nea l$i keEtab#dimensi$nea l$i str$ct keE C *tine "n ti+p $e c +pi!are perat r "nar n"+it ?si3eof? care p ate fi f ! sit !a ca!c"!area $i+ensi"nii ricar"i *iect. 74presia si3eof(ob:ect)
177

!i2rea5a "n intreg ega! c" $i+ensi"nea *iect"!"i specificat Di+ensi"nea este $ata in "nitati nespecificate n"+ite ?bEtes?6 care a" aceeasi $i+ensi"ne ca si ?char?@ O*iect"! p ate 2aria*i!a act"a!a sa" ta*! " sa" str"ct"ra6 ri n"+e!e "n"i tip $e *a5a ca ? int? sa" ?do$ble? ri n"+e!e "n"i tip $eri2at ca str"ct"ra. In ca5"! n str" n"+ar"! $e c"2inte cheie se *tine prin i+partirea $i+ensi"nii ta*! "!"i !a $i+ensi"nea "n"i e!e+ent $eta*! ". 0cest ca!c"! se face "5in$ $ec!aratie ? ;define? setin$ 2a! area in NK7\8J ;define KY?JB (si3eof(keEtab) # si3eof(str$ct keE)) 8i ac"+ as"pra f"nctiei ?7etword?. De fapt n i a+ scris "n ? 7etword? +ai c +p!icat $ecit era necesar pentr" acest pr gra+6 $ar n" +"!t +ai c +p!icat. ?7etword? ret"rnea5a "r+at r"! ?word? $e !a intrare6 "n$e ?word? este fie "n sir $e !itere si cifre incepin$ c" !itera fie "n "n sing"r caracter. Tip"! *iect"!"i este ret"rnat ca 2a! are a "nei f"nctii= aceasta este C7TT7R $aca e 2 r*a $e "n c"2int6 7O- $aca este sfirsit"! fisier"!"i si este caracter"! ins"si $aca este "n caracter n na!fa*etic. 7etword(w, lim) #/ 7et neMt word from inp$t /# char /w; int lim; { int c, t; if (tEpe(c = /w66 =7etch()) G= <?CC?@) { /w = I\%I; ret$rn(c); } while (&&lim > %) { t = tEpe(c = /w66 = 7etch()); if (t G= <?CC?@ NN t G= RH[HC) { $n7etch(c); break; }
178

} /(w&!) = I\%I; ret$rn(<?CC?@); } ?7etword? "ti!i5ea5a r"tine!e ?7etch? si ?$n7etch? $espre care a+ scris in capit !"! %J cin$ c !ectia $e caractere a!fa*etice se ter+ina6 ?7etword? a $epasit $eFa c" "n caracter sir"!. 0pe!area !"i ? $n7etch? rep"ne "n caracter inap i !a intrare pentr" "r+at r"! acces. ?7etword? ape!ea5a ?tEpe? pentr" a $eter+ina tip"! fiecar"i caracter $e !a intrare. Iata 2ersi"ne n"+ai pentr" a!fa*et"! 08CII. tEpe(c) #/ ret$rn tEpe of ascii character /# int c; { if (c >= IaI NN c 4= I3I LL c >= IPI NN c 4= IUI) ret$rn(<?CC?@); else if (c >= I%I NN c 4= I.I) ret$rn(RH[HC); else ret$rn(c);

C nstante!e si+* !ice C7TT7R si DI;IT p t a2ea rice 2a! ri care n" s"nt in c nf!ict c" caractere!e n na!fa*etice si 7O-= 0Cegeri!e e2i$ente s"ntJ ;define <?CC?@ IaI ;define RH[HC%I ?7etword? p ate fi +ai rapi$ $aca ape!"ri!e !a f"nctia ? tEpe? s"nt in ! c"ite c" ape!"ri c resp"n5at are ta*! "ri! r6 tEpe ". Bi*!i teca stan$ar$ C c ntine +acr "ri n"+ite ?isalpha? si ?isdi7it? care perea5a $e aceasta +aniera.

179

74erciti"! /.&. -aceti aceste + $ificari !a ? 7etword? si $eter+inati + $ificari!e $e 2ite5a a!e pr gra+"!"i. 74erciti"! /.(. 8crieti $e caractere. 2ersi"ne $e ? tEpe? care este in$epen$enta $e set"!

74erciti"! /.3. 8crieti 2ersi"ne a pr gra+"!"i $e n"+arare a c"2inte care n" n"+ara aparitii!e c ntin"te intre ap str fi. /.%. P interi !a str"ct"ri Pentr" a i!"stra cite2a $in c nsi$eratii!e referit are !a p interi si ta*! "ri $e str"ct"ri sa rescrie+ pr gra+"! $e c nt ri5are a c"2inte! r cheie6 $e $ata aceasta f ! sin$ p interii in ! c $e in$ici. Dec!aratia e4terna ?keEtab? n" necesita + $ificari6 $ar ?main? si ?binarE? necesita. main() #/ co$nt keEwords; pointer Fersion /# { int t; char word OPQ>=@R"; str$ct keE /binarE() /p; while ((t = 7etword(word, OPQ>=@R)) G= ?=1) if (t == <?CC?@) if ((p = binarE(word, keEtab, KY?JB)) G= KA<<) p&>keEco$nt66; for (p = keEtab; p 4 keEtab 6 KY?JB; p66) if (p&>keEco$nt > %) printf("5+d 5s#n", p&>keEco$nt, p& >keEword); } str$ct keE /binarE(word, tab, n) #/ find word /#
180

char /word; #/ in tab %"...tab n&!" /# str$ct keE tab "; int n; { int cond; str$ct keE /low = detab %"; str$ct keE /hi7h = ftab n&!"; str$ct keE /mid; while (low 4= hi7h) { mid = low 6 (hi7h & low) # ); if ((cond = strcmp(word, mid& >keEword)) 4 %) hi7h = mid & !; else if (cond > %) low = mid 6 !; else ret$rn(mid); } ret$rn(KA<<); } 0ici s"nt +ai +"!te chesti"ni $e n tat. Pri+a6 $ec!aratia ? binarE? tre*"ie sa in$ice ca e ret"rnea5a "n p inter str"ct"rii tip ? keE? in ! c"! "n"i intreg. 0cesta este $ec!arat in ?main? cit si in ?binarE?. Daca ?binarE? gaseste c"2int"!6 ret"rnea5a "n p inter= $aca acesta !ipseste6 ret"rnea5a NUCC. 0 $ "a6 rice acces !a e!e+ente!e !"i ?keEtab? s"nt fac"te prin p interi. 0ceasta $eter+ina schi+*are se+nificati2a in ?*inarA ca!c"!"! p ate fi si+p!". mid = (low 6 hi7h) # ) $e arece a$"narea a $ i p interi n" 2a pr $"ce nici "n fe! $e rasp"ns "ti!i5a*i! si $e fapt este i!ega!a. 0ceasta tre*"ie schi+*ata in mid = low 6 (hi7h & low) # )
181

care setea5a ?mid? in p"nct"! $e !a F"+atatea intre ?low? si ?hi7h?. 0r tre*"i sa st"$iati si initia!i5at rii pentr" ? low? si ?hi7h? 7ste p si*i! sa se initia!i5e5e "n p inter !a a$resa "n"i *iect $efinit $inainte= aceasta a+ fac"t n i aici. In ?main? a+ scrisJ for (p = keEtab; p 4 keEtab 6 KY?JB; p66) Daca p este "n p inter !a str"ct"ra6 rice peratie arit+entica as"pra !"i p tine c nt $e $i+nesi"nea act"a!a a str"ct"rii6 astfe! pOO incre+entea5a p c" cantitatea c recta pentr" a *tine "r+at r"! e!e+ent a! ta*! "!"i $e str"ct"ri. Dar sa n" cre$eti ca $i+ensi"nea str"ct"rii este s"+a $i+ensi"ni! r +e+*ri! r sai $e arece a!inia+ent"! cer"t pentr" $iferiti +e+*ri p t $eter+ina aparitia $e ?ga"ri? in str"ct"ra. 8i in fina! c nsi$eratie as"pra f r+at"!"i pr gra+"!"i. Cin$ ret"rnea5a "n tip c +p!icat ca inJ str$ct keE /binarE(word, tab, n) n"+e!e f"nctiei este $ifici! $e 2a5"t si $e gasit c" "n e$it r $e te4te De aceea "n a!t sti! este cite $ata f ! sit. str$ct keE / binarE(word, tab, n) 0ceasta este +ai +"!t $ riti si tineti12a $e ea. chesti"ne $e g"st pers na!= !"ati f r+a pe care f"nctie f

/.. 8tr"ct"ri c" a"t referire

182

8a pres"p"ne+ ca 2re+ sa trata+ pr *!e+a n"+ararii aparitiei c"2inte! r in + $"! ce! ++ai genera! a$ica sa n"+ara+ fiecare aparitie a fiecar"i c"2int !a intrare. De arece !ista $e c"2inte n" este c"n sc"ta in a2ans n" p"te+ sa s rta+ c n2ena*i! si sa f ! si+ ca"tare !iniara. Inca n" p"te+ sa efect"a+ ca"tare !iniara pentr" fiecare c"2int in + +ent"! cin$ s seste pentr" a 2e$ea $aca a +ai apar"t $e arece per gra+"! ar $"ra f arte +"!t. >Mai precis6 ti+p"! $e r"!are ar creste c" patrat"! n"+ar"!"i $e c"2inte intr $"se. @ C"+ p"te+ rgani5a $ate!e pentr" a face fata in + $ eficient c" !ista $e c"2inte ar*itrareG O s !"tie ar fi sa pastra+ set"! $e c"2inte s rtat in rice + +ent p!asin$ fiecare c"2int in p 5itia a$ec2ata in + +ent"! s sirii !"i. 0ceasta n1ar tere*"i fac"t prin +"tarea c"2inte! r intr1"n ta*! " !inear $e arece si aceasta ia "n ti+p prea !"ng. In ! c 2 + "ti!i5a str"ct"ra $e $ate n"+ita ?binarE tree? a$ica ar* re!e *inar. 0r* re!e c ntine "n ?node? pentr" fiecare c"2int $istinct= fiecare n $ c ntineJ $n $n $n $n pointer la teMt$l c$Fint$l$i contor al n$mar$l$i de aparitii pointer la nod$l&copil din stin7a pointer la nod$l&copil din dreapta

Nici "n n $ n" p ate a2ea +ai +"!t $e $ i c pii. 0r tre*"i sa ai*a n"+ai 5er sa" "n". N $"ri!e s"nt astfe! +entin"te incit s"*ar* re!e $in stinga c ntine n"+ai c"2inte care s"nt +ai +ici $ecit c"2inte!e $in n $"! c nsi$erat6 iar s"*ar* re!e $in $reapta n"+ai c"2inte care s"nt +ai +ari. Pentr" a af!a $aca "n n " c"2int se af!a in ar* re se incepe c +paratia $e !a n $"! ra$acina. Daca e!e s"nt ega!e chesti"nea este re5 !2ata Daca n "! c"2int este +ai +ic $ecit c"2int"! $in n $"! ra$acina cercetarea c ntin"a !a n $"! c pi! $in stinga= a!tfe! este in2estigat n $"! c pi! $in $reapta. Daca n" gasete nici "n c pi! c" "n c ntin"t ega! n "!"i c"2int6 insea+na ca n "! c"2int n" se af!a in 2re"n n $ a! ar* re!"i si $eci tre*"ie creat "n"!. Pr ces"! $e ca"tare este
183

inerent rec"rsi2 $e a rece ca"tarea $in rice n $ este !egata $e ca"tarea $in "n"! $in n $"ri!e c pii. In c nsecinta r"tine!e pentr" insertie si tiparire 2 r fi ce!e +ai nat"ra!e. Int rcin$"1ne !a $escrierea "n"i n $6 este c!ar c +p nenteJ str"ct"ra c" patr"

str$ct tnode { #/ the basic node /# char /word; #/ points to the teMt /# int co$nt; #/ n$mber of occ$rrences /# str$ct tnode /left; #/ left child /# str$ct tnode /ri7ht; #/ ri7ht child /# }; In genera! este i!ega! ca str"ct"ra sa c ntina parte a ei ins"si6 $ar

str$ct tnode /left; $ec!ara ?!eft? ca fiin$ "n p inter a! n $"!"i si n" n $"! ins"si. C $"! pentr" intreg"! pr gra+ este s"rprin5at r $e sc"rt si f ! seste +"!ti+e $e r"tine aF"tat are pe care $eFa !e1a+ scris. 0cestea s"nt I7etwordI pentr" a a$"ce fiecare c"2int $e !a intrare si IallocI pentr" a *inte spati" pentr" c"2inte in a2ans. R"tina principa!a citeste c"2inte c" aF"t r"!!"i I7etwordI si !e insta!ea5a in ar* re c" aF"t r"! !"i ItreeI. ;define OPQ>=@R )% main() #/ word freV$encE co$nt /# { str$ct tnode /root, /tree(); char word OPQ>=@R"; int t; root = KA<<;
184

while ((t = 7etword(word, OPQ>=@R)) G= ?=1) if (t == <?CC?@) root = tree(root, word); treeprint(root); } Un c"2int este pre5entat $e catre r"tina ? main? !a ni2e!"! ce! +ai $e s"s >ra$acina@ ar* re!"i. Ca fiecare ni2e! c"2int"! este c +parat c" c"2int"! af!at $eFa in n $ si ap i este c * rit in ar* re fi e in s"*ar* re!e $in $reapta fie in ce! $in stinga printr1 ape!are rec"rsi2a !a ?tree?. C"2int"! n " fie are $eFa "n c resp n$ent in ar* re in care ca5 c nt r"! este incre+entat6 fie se aF"nge !a "n p inter n"! ceea ce in$ica necesitatea creearii "n"i n " n $ in ar* re. Daca este creat "n n " n $ ?tree? ret"rnea5a "n p inter care este insta!atin n $"! parinte. str$ct tnode /tree(p, w) #/ install w at or below p /# str$ct tnode /p; char /w; { str$ct tnode /talloc(); char /strsaFe(); int cond if (p == KA<<) { #/ a new word has arriFed /# p = talloc(); #/ make a new node /# p&>word = strsaFe(w); p&>co$nt = !; p&>left = p&>ri7ht = KA<<; } else if ((cond = strcmp(w, p&>word)) == %) p&>co$nt66; #/ repeated word /# else if (cond 4 %) #/ lower 7oes into left s$btree /# p&>left = tree(p&>left, w);
185

else s$btree /# }

#/

7reater

into

ri7ht

p&>ri7ht = tree(p&>ri7ht, w); ret$rn(p);

Me+ ria pentr" n "! n $ este *tin"ta $e r"tina ? talloc? care este a$aptare a r"tinei ?alloc? scrisa +ai $e2re+e. 0ceasta ret"rnea5a "n p inter a "n"i spati" !i*er "ti!i5a*i! pentr" "n n $. 0N "! c"2int este c piat in ! c"! pregatit $e catre ?strsaFe?6 c nt r"! este initia!i5at si cei $ i c pii s"nt fac"ti n"!i. 0ceasta parte a pr gra+"!"i este e4ec"tata n"+ai !a ?+arginea? c pac"!"i cin$ "n n " n $ este $e a$a"gat. 0+ +is intenti nat c ntr !"! er ri! r !a 2a! ri!e ret"rnate $e r"tine!e ?strsaFe? si ?talloc?. R"tina ?treprint? tipareste ar* re!e incepin$ in r$ine c" s"*ar* re!e $in stinga= in fiecare n $ tipareste s"*ar* re!e sting >t ate c"2inte!e +ai +ici $ecit ce! act"a! @6 ap i c"2int"! act"a!6 ap i s"*ar* re!e $rept >t ate c"2inte!e +ai +ari@. Daca 2a si+titi ca+ nesig"ri pe rec"rsi"ne i+aginati2a sing"ri "n ar* re si tipariti1! c" ?tree print?= este "na $intre ce!e +ai p"re r"tine rec"rsi2e pe care p"teti gasi. treeprint(p) #/ prnt tree p rec$rsinelE /# str$ct tnode /p; { if (p G= KA<<) { treeprint(p&>left); printf("5+d 5s\n", p&>co$nt, p&>word); treeprint(p&>ri7ht); } } O *ser2atie practica= $aca ar* re!e $e2ine $e5echi!i*rat $in ca"5a c"2inte! r care n" s sesc intr1 r$ine a!eat are6 ti+p"! $e r"!are a! pr gar+"!"i p ate sa creeasca prea repe$e. In ce! +ai ra" ca56 $aca c"2te!e s sesc $eFa s rtate acest pr gra+ $e2innnnn a!ternati2a neec n +ic asa a
186

ca"tarii !ineare. 74ista genera!i5ari a!e ar* re!"i care n" s"fera $e acest neaF"ns6 $ar pe care n" !e p"te+ $escrie aici. Inainte $e a parasi acest e4e+p!" +erita sc"rta $igresi"ne as"pra pr *!e+e! r !egate $e a! carea $e +e+ rie. C!ar6 este $e5ira*i! ca intr1"n pr gra+ sa fie f ! sit "n sing"r a! cat r $e +e+ rie chiar $aca a! ca $iferite fe!"ri $e *iecte. Dar $aca "n a! cat r tre*"ie sa satisfaca cereri pentr" p interi $e caractere ?char? sa" $e ?str"ct tn $e?6 $aca se p"n intre*ari. Pri+a6 c"+ se satisface cerinta ce! r +ai +"!te +asini rea!e ca *iecte!e $e $iferite tip"ri sa fie a!iniate !a a$rese satisfacat are>$e e4e+p!" intregii a$esea tre*"ie a!iniati pare@G 0 $ "a6 ce $ec!aratii p t satisface fapt"! ca ?alloc? in + $ necesar ret"rnea5a $iferite tip"ri $e p interi G Cereri!e $e a!inia+ent p t fi "s r satisfac"te6 c" pret"! "n r spatii ne"ti!i5ate6 asig"rin$"1ne ca a! cat r"! int $ea"na ret"rnea5a p interi care intr"nesc t ate restrictii!e $e a!inia+ent. De e4e+p!" pentr" PDP1&& este s"ficient ca ?alloc? int $ea"na sa ret"rne5e "n ?eFen? p int6 $in + +ent ce rice tip $e *iect p ate fi +e+ rat !a a$resa ? eFen?. Mas"ri ase+anat are se ia" pe a!te +asini. 0stfe! i+p!e+entarea "n"i ? alloc? p ate sa n" fie p rta*i!a@ $ar "saF"! este. ?0!! c?1"! $in capit !"! . " garantea5a nici "n a!inia+ent partic"!ar. In capit !"! , 2 + pre5enta + $"! $e a face c rect. In !egat"ra c" intre*area as"pra $ec!aratiei tip"!"i pentr" ? alloc?= i?c? cea +ai *"na +et $a este aceea $e a $ec!ara ca ? alloc? ret"rnea5a "n p inter !a ?char? si ap i sa se c n2erteasca p iner"! in tip"! $ rit. Daca p este $ec!arat astfe!J char /p; at"nci (str$ct tnode /)p i! c n2erteste intr1"n ?tnode? p inter $intr1 e4epresie.
187

0stfe! ?ta!! c? $e2ineJ str$ct tnode /talloc() { char /alloc(); ret$rn((str$ct tnode /) alloc(si3eof(str$sct tnode))); } 0ceasta este +ai +"!t $ecit este ne2 ie pentr" c +pi!ari!e c"rente $ar repre5inta ce! +ai sig"r + $ pentr" 2iit r. 74erciti"! /.%. 8crieti "n pr gra+ care citeste "n pr gra+ ?c? si tipareste in r$ine a!fa*etica fiecare gr"p a! n"+e! r $e 2ariai!e care s"nt i$entice in pri+e!e ' caractere $ar $iferite $"pa aceea. >0sig"rati2a ca ' este "n para+etr"@. 74erciti"! /... 8crieti "n p r gra+ care tipareste !ista a t"t"r r c"2inte! r $intr1"n te4t si pentr" fiecare c"2int !ista c" n"+ere!e !iniei in care apar. 74erciti"! /./. 8crieti "n pr gra+ care tipareste c"2inte!e $istincte6 care s"nt intr $"es6 in r$inea frec2entei ! r $e aparitie. -iecare c"2int sa fie prece$at $e n"+ar"! $e aparitii. /./ Ca"tare in ta*e!e In aceasta secti"ne 2 + $a c ntin"t"! "n"i pachet $e ca"tare in ta*e! ca i!"strare a +ai +"!t r aspecte !egate $e str"ct"ri. 0+cest pachet este tipic pentr" + $"! $e e4p! rare a "n"i ta*e! $e si+* !"ri pentr" r"tine!e $e +anage+ent a!e "n"i +acr pr ces r. De e4e+p!" sa c nsi$era+ $ec!aratia $in C6 ?W$efine?. Cin$ !inie ca ;define J?B !
188

este !"ata in c nsi$erare6 n"+e!e \78 si te4t"! c resp"n5at r & s"nt +e+ rate intr1"n ta*e!. Mai tir5i"6 cin$ n"+e!e \78 apare intr1 $ec!aratie ca inword = J?B; tre*"ie in! c"it c" &. 74ista $ "a r"tine +aF re care +anip"!ea5a n"+e!e si te4te!e $e in! c"ire c resp"n5at are. ?insta!!>s6 t@? inregistrea5a n"+e!e ?s? si te4t"! $e in! c"ire ?t? intr1 ta*e!a= ?s? si?t? s"nt sir"ri $e caractere. ?! :"p>s@? ca"ta n"+e!e ?s? intr1 ta*e!a si ret"rnea5a "n p inter !a ! c"! "n$e af st gasit ri NUCC $aca n" a f st gasit. 0!g rit+"! care se "ti!i5ea5a se *a5ea5a pe ca"tare frag+entara ?hash? "n n"+e care se intr $"ce este c n2ertit intr1"n intreg p 5iti2 care ap i este "ti!i5at ca in$e4 intr1"n ta*! "$e p interi. Un e!e+ent a! ta*!"!"i p intea5a pe incep"t"! "n"i !ant $e *a!nc"ri care $escrii" a2in$ respecti2a 2a! are $e frag+ent >?hash?@. 0cesta este NUCC $aca nici "n n"+e n" c resp"n$e acestei 2a! ri. Un *! c $in !ant este str"ct"ra care c ntineJ p interi6 !a n"+e6 te4t"! $e in! c"ire si "r+at r"! *! c $in !ant. Daca p inter"! pentr" "r+at r"! *! c este n"! +archea5a sfirsit"! !ant"!"i $e *! c"ri. str$ct nlist { #/ basic table entrE /# char /name; char /def; str$ct nlist /neMt; #/ neMt entrE in chain /# }; Ta*! "! $e p i"nteri esteJ ;define SPBSBHU? !%%
189

static str$ct pointer table /#

nlist

/hashtab SPBSBHU?";

#/

-"nctia $e frag+entare >?hashing?@6 care este "ti!i5ata $e a+*e!e r"tine ?! :"p? si ?insta!!?6 a$"na 2a! ri!e carctere! r $in sir"! n"+e si f r+ea5a rest"! + $"! $i+ensi"nea ta*! "!"i. >0ceasta n" este ce! +ai *"n a!g rit+ p si*i!6 $arare +erit"! si+p!itatii. @ hash(s) #/ form hash Fal$e for strin7 s /# char /s; { int hashFal; for (hashFal = %; /s G= I%I;) hashFal 6= /s66; ret$rn(hashFal 5 SPBSBHU?); } Pr ces"! $e frag+entare >?hashing?@ pr $"ce "n in$e4 $e ca"tare in ?hashta*?= sir"! $e carctere ca"tat se 2a gasi intr1"n *! c $in sir"! $e *! c"ri a car"i incep"t este p intat $e e!e+ent"! $in ta*e!"! ?hashta*?. Ca"tarea este efect"ata $e r"tina ?! :"p?. Daca ?! :"p? gaseste in ?hashta*? intrarea $eFa pre5enta6 ret"rnea5a "n p inter= $aca n"6 ret"rnea5a NUCC. str$ct nlist /look$p(s) #/ look for s in hashtab /# char /s { str$ct nlist /$p for ($p = hashtab hash(s)"; $p G= KA<<; $p = $p&>neMt) if (strcmp(s, $p&>name) == %) ret$rn($p); #/fo$nd it /# ret$rn(KA<<); #/ not fo$nd /# R"tina ?install? f ! seste ?look$p? pentr" a $eter+ina care $intre n"+e!e $e insta!at s"nt $eFa pre5ente= $aca n"6 n "a $efinire tre*"ie sa
190

s"ccea$a "neia 2echi. 0!tfe! sp"s6 intrare c +p!ect n "a este creeata. ?install? ret"rne5a NUCC $aca $intr1"n + ti2 arecare n" +ai este ! c pentr" n "a intrare. str$ct def) /# nlist /install(name, def) #/p$t(name,

char /name, /def; #/ in hashtab /# { str$ct nlist /np, /look$p(); char /strsaFe(), /alloc(); int hashFal; if ((np = look$p(name)) == KA<<) { #/ not fo$nd /# np = (str$ct nlist /) alloc(si3eof(/np)); if (np == KA<<) ret$rn(KA<<); if ((np&>name = strsaFe(name)) == KA<<) ret$rn(KA<<); hashFal = hash(np&>name); np&>neMt = hashtab hashFal"; hashtab hashFal" = np; } else #/ alreadE there /# free(np&>def); #/free preFio$s definition /# if ((np&>def = strsaFe(def)) == KA<< ret$rn(KA<<); ret$rn(np); } ?strsaFe? c pia5a sir"! f"rni5at $e catre arg"+ent"! sas" intr1"n ! c *tin"t c" "n ape! !a f"nctia ?alloc?. 0+ pre5entat c $"! in capit !"! . De arece ape!"ri!e !a ?alloc? si ?free? p t sa apara in rice r$ine si $e arece aici a!inia+ent"! c ntea5a6 2ersi"nea si+p!a a ?a!! c? $e !a capit !"! .6 n" este a$ec2ata aici 2e$eti capit !e!e ' si ,.
191

74erciti"! /.'. 8crieti r"tina care sa sc ata "n n"+e si $efinitia $intr1 ta*e!a +entin"ta c" ?! :"p? si ?insta!!?. 74erciti"! /.,. I+p!e+entati 2ersi"ne si+p!a a pr ces r"!"i ?W$efine? "ti!i5a*i!a in pr gra+e C6 f ! sin$ r"tine!e $in aceasta secti"ne. P"teti gasi $e aF"t r si ?getch? si ?"ngetch?. /.' Ci+p"ri 0t"nci cin$ spati"! $e +e+ rare estre !a +are pret6 p ate fi necesar ca +ai +"!te *iecte sa fie i+pachetate intr1"n sing"r c"2int +asina= "n ca5 a$esea f ! sit este c +pactarea fani ane! r $e "n sing"r *it necesare in ap!icatii cata*e!e!e $e si+* !"ri a!e c +pi!at are! r. - r+ate!e e4terne i+p"se $e interfete!e c" $i2erse!e echipa+ente e4terne6 a$esea i+p"n c +pactrea $ate! r pe "n c"2int. 8a ne i+agina+ "n frag+ent $intr1"n c +pi!at r care +anip"!ea5a ta*e!a $e si+* !"ri. -iecare i$entificat r $intr1"n pr gra+ are an"+ite inf r+atii as ciate6 $e e4e+p!"6 este sa" n" "n c"2int cheie6 e este sa" n" e4tern siEsa" static6 s. a. +. $. Ce! +ai c +pact + $ $e a c $a astfe! $e inf r+atii este "n set $e fani ane $e "n *it c"prinse intr1"n ?char? sa" ?int?. M $"! ce! +ai "5"a! este $e a $efini "n set $e +asti c resp"n5at are p 5itii! r c" *iti se+nificati2i6 ca in ;define Y?J>=@R %! ;define ?QC?@KP< %) ;define BCPCH2 %+ >N"+e!e tre*"ie sa fie p"teri a!e !"i $ i.@ 0p i acces"! !a *iti $e2ine "n s i $e ?*itarea!a? c" perat ri $e per+"tare6 +ascare si c +p!e+entare6 care a" f at $escrisi in capit !"! (. 0n"+ite i$i a+e apar frec2entJ
192

fla7s G= ?QC?@KP< G BCPCH2; 2a!i$ea5a *itii 7DT7RN0C si 8T0TIC ca fani ane6 in ti+p ce fla7s N= (?QC?@KP< G BCPCH2); ii in2a!i$ea5a. Desi aceste i$i a+e s"nt c" "s"rinta +ane2rate6 !i+*aF"! C6 +ai $egra*a fera capacitatea prefera*i!a $e a$efini si accesa ci+p"ri Un ci+p este "n set $e *iti a$iacenti c"prinsi intr1"n sing"r ?int?. 8inta4a $e $efinire si acces"! ci+p"ri! r este *a5ata pe str"ct"ri. De e4e+p!" ta*e!a $e si+* !"ri $efinita +ai s"s ar p"tea fi in! c"ita printr1 $efinire a trei ci+p"ri. str$ct { $nsi7ned isDkeEword: !; $nsi7ned isDeMtern: !; $nsi7ned isDstatic: !; }fla7s; 7ste astfe! $efinita 2aria*i!a n"+ita ?f!ags? care c ntine trei ci+p"ri $e cite "n *it. N"+ar"! $e $"pa ?J? repre5inta !"ngi+ea ci+p"!"i in *iti. Ci+p"ri!e s"nt $ec!arate fara se+n >"nsigne$@ t c+ai pentr" a accent"a ca s"nt cantitati fara se+n. Ci+p"ri!e in$i2i$"a!e s"nt referite ca ?f!ags.isa:eA9 r$?6 ?f!ags.isae4tern?6 etc6 !a fe! ca ricare a!ti +e6 *ri ai str"ct"rii. Ci+p"ri!e se c +p rta ca niste +ici intregi fara se+n si p t participa in e4presii arit+etice !a fe! ca ricare a!ti intregi. 74e+p!e!e $e +ai s"s p t fi rescrise +ai nat"ra! astfe! fla7s.isDeMtern = fla7s.isDstatic = !; p 5iti nea5a *itii pe "n"= fla7s.isDeMtern = fla7s.isDstatic = %;
193

p 5iti nea5a *itii pe 5er = if (fla7s.isDeMtern == % NN fla7s.isDstatic == %) ... pentr" a1i testa. Un ci+p p ate sa n" c resp"n$a c" !i+ite!e "n"i ? int?= in acest ca5 ci+p"! este a!inia! !a "r+at area +argine ?int?. Ci+p"ri!e n" tre*"ie sa ai*e "n n"+e= ci+p"ri!e fara n"+e>$ "a p"ncte si !"ngi+ea n"+ai@ s"nt f ! site ca "+p!"t"ra. C"ngi+ea specia!a # p ate fi f ! sita pentr" a!inierea !a "r+at area ?int? +argine. 74ista "n n"+ar $e reg"!i $e ap!icat ci+p"ri! r. Dintre ce!e +ai i+p rtante6 cip"ri!e s"nt asignate $e !a stinga !a $reapta in "ne!e +asini si $e !a $reapta !a stinga in a!te!e ceea ce ref!ecta nat"ra $iferita a har$9are"!"i insea+na ca6 $esi cip"ri!e s"nt "ti!i5a*i!e $e preferinta pentr" a intretine str"ct"ri!e $e a$te interne6 chesti"nea car"i sfirsit 2ine pri+"! tre*"ie c nsi$erata c" griFa pentr" pre!"crarea $ate! r $efinite e4tern. 0!te restrictii care tre*"ie a2"te in +inteJ ci+p"ri!e s"nt fara se+n e!e p t fi +e+ rate n"+ai in ?int?>sa" echi2a!ent"! ?$nsi7ned?@= e!e n" s"nt ta*! "ri= e!e n" a" a$rese6 astfe! ca perat r"! ?N? n" !e p ate fi ap!icat. /., Uni"ni O "ni"ne este 2arai*i!a care p ate pastra >!a + +ente $iferite@ *iecte $e $iferite tip"ri si $i+ensi"ni6 iar c +pi!at r"! tine sea+a $e cerinte!e $e $i+ensi"ne si a!inia+ent. Uni"ni!e per+it sa se +anip"!e5e $iferite fe!"ri $e $ate intr1 sing"ra 5 na $e +e+ rie6 fara sa se inc!"$a in pr gra+ nici "n fe! $e inf r+atii $epen$ente $e +asina. Ca $e e4e+p!"6 sa c nsi$era+ $in n " ta*e!a $e si+* !"ri a "n"i c +pi!at r. 8a pres"p"ne+ ca c nstante:!e p t fi ?int?6 ?f! at? sa" p interi
194

$e caractere. )a! area "nei c nstante partic"!are tre*"ie +e+ rata intr1 2aria*i!a $e tip"! c resp"n5at r6 $ar este ce! +ai c n2ena*i! pentr" rgani5area ta*e!ei $aca 2a! area c"pa aceasi $i+ensi"ne $e +e+ rie si ace!asi ! c in +e+ rie in f"nctie $e tip"! ei. 0ceasta este sc p"! "nei "ni"ni 1sa per+ita ca sing"ra 2aria*i!a care p ate sa c ntina ricare $in +ai +"!te tip"ri. Ca fe! ca !a ci+p"ri6 sinta4a se *a5ea5a pe str"ct"ri. $nion $&ta7{ int iFal; float fFal; char /pFal; } $Fal; O 2aria*i!a ?$Fal? 2a fi s"ficient $e +are ca sa pastre5e ricare $in ce!e trei tip"ri6 iar pri2it r !a +asina6 c $"! generat $e c +pi!at r este in$iferent $e caracteristici!e har$. Oricare $in aceste tip"ri p ate fi asignat !a ?"2a!? si ap i "ti!i5at in e4presii6 atita 2re+e cit "5aF"! este c nsi$erat6 a$ica tip"! "ti!i5at tre*"ie sa fie ce! +ai recent +e+ rat. 7ste resp nsa*i!itatea pr gra+at r"!"i sa tina sea+a $e tip"! $e $ata c"rent +e+ rat intr1 "ni"ne= re5"!tate!e s"nt $epen$ente $e +asina $aca ce2a este +e+ rat ca "n tip si este e4tras ca a!t"!. 8intactic6 +e+*ri "nei "ni"ni s"nt accesati ca $nion&name.member sa" $nion&pointer&>member !a fe! c" str"ct"ri!e. Daca 2aria*i!a ? $tEpe? este f ! sita pentr" a tine sea+a $e tip"! c"rent a! +ari+ii +e+ rate in ?"2a!?6 p ate scrie "n c $6 astfe!J if ($tEpe == HKC) printf("5d\n", $Fal.iFal);
195

$tEpe);

else if ($tEpe == 1<=PC) printf("5f\n", $Fal.fFal); else if ($tEpe == BC@HK[) printf("5s\n", $Fal.pFal); else printf("bad tEpe 5d in

$tEpe\n",

Uni"ni!e p t sa se gaseasca in str"ct"ri si ta*! "ri si 2ice2ersa. N tatia pentr" a accesa "n +e+*r" a "nei "ni"ni $intr1 str"ct"ra>sa" 2ice2ersa@ este i$entica c" aceea pentr" str"ct"ri!e in c"i*"ri. De e4e+p!" in str"ct"ra $efinita prin str$ct { char /name; int fla7s; int $tEpe; $nion { int iFal; float fFal; char /pFal; } $Fal; } sEmtab KBJO"; 2aria*i!a ?iFal? este referita astfe! sEmtab i".$Fal.iFal iar pri+"! caracter a! sir"!"i ?pFal? prin /sEmtab i".$Fal.pFal In f n$6 "ni"ne este str"ct"ra in care t ti +e+*ri a" $ep!asa+ent"! 5er 6 str"ct"ra este s"ficient $e +are ca sa c"prin$a ce! +ai +are +e+*r"6 iar a!inia+ent"! este p tri2it pentr" t ate tip"ri!e $in "ni"ne Ca si !a str"ct"ri sing"re!e peratii a$+ise c" "ni"ni!e s"nt $e a accesa "n +e+*r" si
196

*tinerea a$resei !"i="ni"ni!e n" p t fi asignate6 n" se p t ap!ica f"nctii as"pra ! r6 P interi !a "ni"ni p t fi "ti!i5ati $e +aniera i$entica pinteri! r !a str"ct"ri. In capit !"! , se arata c"+ a! cat r"! $e +e+ rie prin inter+e$i"! "nei "ni"ni $e +e+ rie prin inter+e$i"! "nei "ni"ni f rtea5a 2aria*i!a sa se a!inie5e !a rice fe! $e partic"!aritati $e +e+ rare. *... CEpedef C a$+ite faci!itate n"+ita tApe$ef pentr" a crea n"+e pentr" n i tip"ri $e $ate. De e4e+p!" $ec!aratiaJ tEpedef int <?K[CS; face n"+e!e C7N;TI sin ni+ pentr" ?int?. Tip"! C7N;TI p ate fi "ti!i5at in $ec!aratii e4act !a fe! ca intJ <?K[CS len, maMlen; <?K[CS /len7ths "; 8i+i!ar6 $ec!aratiaJ tEpedef char/BC@HK[; face ca 8TRIN; sa fie sin ni+ c" charU sa" p inter"! "n"i caracter6 care p ate fi "ti!i5at in $ec!aratii caJ BC@HK[ p, lineptr <HK?B", alloc(); O*ser2ati ca tip"! fiin$ $ec!arat printr1"n tApe$ef apare in p 5itia "n"i n"+e $e 2aria*i!a. 8intactic6 tApe$ef este ca c!asa $e +e+ rie6 e4tern6 static6 etc. In ca5"! $e +ai s"s a+ "ti!i5at !itere pentr" a accent"a n"+e!e.

197

Ca $e e4e+p!" +ai c +p!icat p"te+ f ! si tApe$ef pentr" n $"ri!e c pac"!"i pre5entat +ai inainte in acest capit !J tEpedef str$ct tnode { #/ the basic node /# char /word; #/ points to the teMt /# int co$nt; #/ n$mber of occ$rrences /# str$ct tnode /left; #/ left child /# str$ct tnode /ri7ht; #/ ri7ht child /# } C@??K=R?, /C@??0C@; 0ceasta creea5a $ "a n i tip"ri $e c"2inte cheie n"+ite TR77NOD7 > str"ct"ra@ si TR77PTR >"n p inter !a str"ct"ra@6 $"pa care r"tina ?ta!! c? p ate $e2eniJ C@??0C@ talloc() { char /alloc(); ret$rn((C@??0C@) alloc(si3eofC@??K=R?))); Tre*"ie sa specifica+ ca "n tApe$ef n" crea5a n i tip"ri= +ai $egra*a ren"+este tip"ri!e e4istente. )aria*i!e!e astfe! $ec!arate a" e4act ace!easi pr prietati ca si 2aria*i!e!e a car r $ec!aratii s"nt e4p!icite. In f n$6 tApe$ef este ca "n ;define6 e4ceptin$ ca6 $e cin$ este interpretat $e c pi!at r e! face fata c" s"*stit"tii!e in te4t care s"nt $inc ! $e capacitati!e C +acr pr ces r"!"i. De e4e+p!"J tEpedef int (/01H) (); crea5a tip"! P-I6 care p ate fi "ti!i5at intr1"n c nte4t ca 01H strcmpp, n$mcmp, swap; $in pr gra+"! $e s rt $in capit !"! .. 74ista $ "a + ti2e +ai i+p rtante pentr" a "ti!i5a $ec!aratii!e t3pe$ef. Pri+"! este $e a para+etri5a"n pr gra+ a!at"ri $e pr *!e+e!e $e
198

p rta*i!itate. Daca pse "ti!i5e5a tApe$ef pentr" $iferite tip"ri $e $ate care p t fi $epen$ente $e +asina6 n"+ai tApe$ef necesita + $ificari $aca pr gra+"! este +"tat pe a!ta +asina. O sit"atie *isn"ita este $e a f ! si tApe$ef pentr" cantitati intregi 2ariate6 cin$ se a!cat"ieste "n set a$ec2at $e ?short?6 ?int? si ?lon7? pentr" fiecare +asina. Un a! $ i!ea sc p a !"i tApe$ef este $e a $a +ai +are c!aritate "n"i pr gra+ n"+it TR77PTR este +ai "s r $e inte!es $ecit "n"! $ec!arat ca "n si+p!" p inter !a str"ct"ra c +p!icata. In fina!6 e4ista $eFa p si*i!itatea ca in 2iit r6 c +pi!at r"! sa" U "n a!t pr gra+ ca ?lint? sa faca "5 $e inf r+atia c ntin"ta in tApe$ef ca sa e4ec"te niste c ntr a!e in p!"s as"pra pr gra+"!"i.

199

C0PITOCUC ' I N T R d R I ` I I 7 8 I R I >I E O@ -aci!itati!e $e IEO n" s"nt parte a !i+*aF"!"i C $e aceea !e1a+ intr $"s intr1"n capit ! separat. Nici "n pr gra+ rea! n" interacti ne5a c" +e$i"! intr1"n +$ +ai c +p!icat $ecit a+ pre5entat pina ac"+. In acest capit ! 2 + $escrie *i*!i teca stan$ar$ $e IEO6 care este "n set $e f"nctii ce per+it IEO stan$ar$ pentr" pr gra+e!e C. -"nctii!e a" +enirea $e a pre5enta interfata pr gra+a*i!a c n2ena*i!a6 care sa per+ita peratii!e pre2a5"te $e ace!e +ai +"!te siste+e + $erne $e perare. R"tine!e $e IEO s"nt $est"! $e eficinte incit f arte rar pr gra+at r"! si+te ne2 ia $e a !e c !i chiar pentr" ap!icatii critice. In sfirsit6 r"tine!e s"nt fac"te pentr" a fi ? portabile? in sens"! ca e!e e4ista intr1 f r+a c +pati*i!a pentr" rice siste+ "n$e C e4ista si ca pr gra+e!e care "ti!i5ea5a *i*!i teca stan$ar$ $e IEO p t fi +"tate $e pe "n siste+ pe a!t"! fara + $ificari. N" 2 + incerca sa $escrie+ aici intreaga *i*!i teca $e IEO= s"nte+ +ai interesati $e a arata esentia!"! $espre scrierea pr gra+e! r C in interacti"ne c" siste+"! ! r $e perare. '.& 0cces"! !a *i*!i teca stan$ar$ -iecare fisier s"rsa care refera f"nctii!e *i*!i tecii stan$ar$ tre*"ie sa c ntina !inia ;incl$de 4stdio.h> apr ape $e incep"t. -isier"! st$i .h $efineste "ne!e +acr "ri si 2aria*i!e f ! site $e *i*!i teca IEO. - ! sirea se+ne! r 4 si > in ! c $e *isn"ite!e ghi!i+e!e $"*!e in$reapta c +pi!at r"! sa ca"te fisier"! intr1"n $irect r
200

c ntinin$ inf r+atii!e $e eticheta stan$ar$ >pentr" AKHQ tipic L$srL incl$de@. Mai $eparte6 ar p"tea fi necesar ca at"nci cin$ incarca pr gra+"! sa se specifice *i*!i teca in + $ e4p!icit= $e e4e+p!" pentr" PDP1&& UNID6 c +an$a pentr" c +pi!area "n"i pr gra+ ar fi cc so$rce files, etc&ls "n$e 1!s in$ica incarcarea $in *i*!i teca stan$ar$ >Caracter"! ! este !itera e!@. '.(. Intrari si iesiri stan$ar$ 1 7etchar si p$tchar Mecanis+"! ce! +ai si+p!" $e intrare este $e a citi "n caracter !a "n + +ent $at $e !a ?standard inp$t?6 care in genera! este ter+ina!"! "ti!i5at r"!"i6 c" getchar. 7etchar() ret"rnea5a "r+at r"! caracter $e intrare $e cite ri este ape!at. In ce!e +ai +"!te +e$ii care s"p rta C6 "n fisier p ate fi s"*stit"it ter+ina!"!"i "ti!i5in$ c n2entia [= $aca "n pr gra+ ?pro7? f ! seste getchar6 at"nci !inia $e c +an$aJ pro74infile $eter+ina ?pro7? sa citeasca ?infile? in ! c $e ter+ina!. C +"tarea intrarii este fac"ta $e astfe! $e +aniera incit ? pro7? ins"si n" si+te aceasta= in partic"!ar6 sir"! ?4infile>? n" este inc!"s in arg"+ente!e ?ar7F? a!e !iniei $e c +an$a. C +"tarea intrarii este asa$ar in2i5i*i!a $aca intrarea 2ine $e !a "n a!t pr gra+ 2ia "n ?pipe +ecanis+e?6 !inia $e c +an$a otherpro7rLpro7 e4ec"ta a+*e!e pr gra+e ?otherpro7r? si ?pro7r? si aranFea5a astfe! ca intrarea stan$ar$ pentr" ?pro7r? 2ine $e !a iesirea stan$ar$ a !"i ? therpr gr?.
201

?7etchar? ret"rne5a 2a! area 7O- cin$ inti!neste sfirsit"! fisier"!"i in$iferent $e ce este citit !a intrare. Bi*!i teca stan$ar$ $efineste c nstanta si+* !ica 7O- ca fiin$ 1& > c" "n ;define in fisier"! st$i .h@ $ar teste!e se fac c" 7O- n" c" 1&6 astfe! ca sa fie in$epen$ent $e 2a! area specifica. Pentr" iesire6 p$tchar(c) p"ne caracter"! c !a iesirea stan$ar$ care este ter+ina!"!. Iesirea p ate fi $irectata spre "n fisier f ! sin$ ?>? $aca ?pro7r? "ti!i5ea5a p$tchar6 pro7>a$file iesirea stan$ar$ 2a fi ?o$tfile? in ! c $e ter+ina!. In siste+"! UNID se p ate "ti!i5a c +"nicatie >pipe@ spre a!t pr gra+J pro7rLanotherpro7r c +"ta iesirea stan$ar$ a pr gra+"!"i ?pro7r? ca intrare stan$ar$ a pr gra+"!"i ?anotherpro7r?. 8i in aceste ca5"ri ?pro7r? n" are c"n stiinta $e re$irectare. Un n"+ar $est"! $e +are $e pr gra+e a" "n sing"r sir $e $ate ca intrare si "n sing"r sir ca iesire= pentr" astfe! $e pr gra+e IEO c" getchar p"tchar si printf p t fi in intregi+e a$ec2ate6 +ai a!es $aca f ! si+ faci!itati!e $e re$irectare si pipe pentr" c nectarea iesirii "n"i pr gra+ c" intrarea a!t"ia. De e4e+p!" sa c nsi$era+ pr gra+"! ?! 9er?J ;incl$de 4stdio.h> main() #/ conFert inp$t to lower case /# { int c; while((c=7etchar())G=?=1) p$tchar(is$pper(c)Ztolower(c):c); }
202

-"nctii!e ?is$pper? si ?tolower? s"nt $e fapt +acr "ri $efinite in st$i .h. Macr "ri!e ?is$pper? testea5a care $in arg"+ente!e sa!e este !itera +are6 ret"rnin$ in acest ca5 2a! are n n15er 6 sa" !itera +ica ret"rnin$ in acest ca5 5er . Macr "! tolower c n2erteste !itera +are in "na +ica. In$iferent $e c"+ aceste f"nctii s"nt i+p!e+entate pe $iferite +asini6 +e$i"! ! r e4tern este ace!asi6 astfe! ca prgra+e!e s"nt sc"tite $e c"n asterea set"!"i $e caractere. Pentr" c n2ertirea "n r fisiere +"!tip!e se p ate f ! si "n pr gra+ !a fe! ca "ti!itar"! ?cat? $in UNID pentr" c !ectarea fisiere! rJ cat file!file)...Llower>o$tp$t si aceasta ne per+ite sa in2ata+ c"+ se accesea5a fisiere!e $intr1"n pr gra+. >?cat? este pre5entat +ai tir5i" in acest capit !@. In *i*!i teca stan$ar$ IEO f"nctii!e getchar si p"tchar p t $e fapt sa fie +acr "ri6 si aceasta per+ite ca sa n" fie ape!ata f"nctie pentr" fiecare caracter> 2erhea$@. ) + arata aceasta in capit !"! ,. '.3. Iesirea f r+atata1printf Ce!e $ "a r"tine printf pentr" iesire si scanf pentr" intrare per+it trans!atarea in si $in repre5entarea caractere! r a cantitati! r n"+erice. 7!e $e ase+enea per+it generarea sa" interpretarea !inii! r f r+atate. 0+ f ! sit $eFa ?printf? in capit !e!e prece$ente = aici ii $a+ $escriere +ai precisa si c +p!ecta. printf(control, ar7!, ar7),....) printf c n2erteste6 f r+atea5a si tipareste arg"+ente!e sa!e !a iesirea stan$ar$ s"* c ntr !"! sir"!"i ?c ntr !?. 8ir"! $e c ntr ! c ntine $ "a tip"ri $e *iecteJ caractere r$inare6 care s"nt si+p!" c piate in sir"! $e iesire si se+nificatii $e c n2ersie $intre care fiecare ca"5ea5a c n2ersia si tiparirea a "r+at are! r arg"+ente s"ccesi2e a!e printf.
203

-iecare specificatie $e c n2ersie este intr $"sa prin caracter"! K si incheiata printr1"n caracter $e c n2ersie. Intre K si caracter"! $e c n2ersie p t fiJ Un se+n +in"s care specifica ca$rarea !a stinga in ci+p a arg"+ent"!"i c n2ertit. Un sir $e $igiti care specifica !"ngi+e +ini+a a ci+p"!"i. N"+ar"! c n2ertit 2a fi intr $"s in ci+p !a ce! p"tin aceasta !"ngi+e sa" +ai +are $aca este necesr. Daca arg"+ent"! are +ai p"tine caractere $ecit $i+ensi"nea ci+p"!"i e! 2a fi ca$rat !a $reapta sa" !a stinga >in f"ncite $e specificatie sa" +p!icit@ si 2a fi c +p!etatc" 5er sa" spatii pina !a !"ngi+ea ci+p"!"i. Caracter"! $e c +p!ectare este n r+a! *!an:6 iar $aca $i+ensi"nea ci+p"!"i a f st specificata prin ? leadin7? 5er 6 este 5er >aceasta n" i+p!ica ci+p"ri!e cta!e@. O 2irg"!a6 care separa !"ngi+ea ci+p"!"i $e "n a!t sir $e $igiti. Un sir $e $igiti >preci5ia@6 care specifica n"+ar"! +a4i+ $e caractere acceptate $intr1"n sir6 sa" n"+ar"! $e p 5itii $"pa 2irg"!a 5eci+a!a 2irg"!a f! tanta si $"*!a preci5ie. Caractere!e $e c n2ersie si se+nificatii!e ! r s"ntJ d1arg"+ent"! este c n2ertit in 5eci+a! o1arg"+ent"! este c n2ertit in cta! fara se+n M1arg"+ent"! este c n2ertit in he4a5eci+a! fara se+n $1arg"+ent"! este c n2ertit in 5eci+a! fara se+n c1arg"+ent"! este pre!"at ca "n sing"r caracter s1arg"+ent"! este "n sir =caractere!e $in sir s"nt intr $"se pina cin$ este inti!nit caracter"! n"! sa" pina cin$ este atinsa !"ngi+ea specificata.
204

e1arg"+ent"! este !"at ca 2irg"!a f! tanta sa" $"*!a preci5ie si c n2ertit in n tatia 5eci+a!a $e f r+a L1M+. nnnnnn7LOsa"1MDD "n$e !"ngi+ea sir"!"i $e n1"ri este specificata $e preci5ie. Preci5ia i+p!icita este /. f1arg"+ent"! este !"at ca 2irg"!a + *i!a sa" $"*!a preci5ie si c n2ertit t t intr1 n tatie 5eci+a!a $e f r+a L1M+++. nnnnnn "n$e !"ngi+ea sir"!"i $e n1"ri este specificat $e preci5ie6 i+p!icit este /. De *ser2at ca preci5ia n" $eter+ina n"+ar"! $e $igiti se+nificati2i in f r+at"! f. 71f ! seste K sa" K! 6 ricare este +ai sc"rt = 5er "ri!e nese+nificati2e n" apar. Daca caracter"! $e $"pa K n" este "n caracter $e c n2ersie acest caracter este tiparit chiar . p ate fi tiparit prin KK. Ce!e +ai +"!te f r+ate $e c n2ersie s"nt e2i$ente si a" f st i!"strate in capit !e!e prece$ente. O e4ceptie este preci5ia referit are !a sir"ri. Ta*e!a "r+at are arata efecte!e "nei 2arietati $e specificatii as"pra sir"!"i ?he!! 6 9 r!$? $e &( caractere. 0+ p"s $ "a p"ncte pentr" a p"tea "r+ari +ai *ine !"ngi+ea. ::5!%s: :hello, world: :,&!%s: :hello, world: :5)%s: : hello, world: :5&)%s: :hello, world : :5)%. !%s: : hello, wor: :5&)%. !% :hello, wor : :5. !%s: :hello, wor: 0tenti"neJ ?printf? f ! seste pri+"! sa" arg"+ent pentr" a $eci$e cite arg"+ente "r+ea5a si $e ce tip. Daca n" s"nt $est"!e arg"+ente sa" $e tip gresit 2eti *tine re5"!tate !ipsite $e sens. 74erciti"! '.& 8crieti "n pr gra+ care tipareste $iferentiat intrare ar*itrara. Ca c n$itie +ini+a tre*"ie sa tipareasca caractere!e n n1grafice in cta! sa" he4a>c nf r+ "5ante! r ! ca!e@.
205

'.%. Intrarea f r+atata1scanf -"nctia scanf este intrarea ana! g printf1iesirea6 a$+itin$ ace!easi c n2ersii in sens in2ers. scanf(control, ar7!, ar7),...) scanf citeste caractere $e !a intrarea stan$ar$6 !e interpretea5a c nf r+ f r+at"!"i specificat in ?c ntr !? si +e+ rea5a re5"!tate!e in ce!e!a!te arg"+ente6 care s"nt p intere ce in$ica "n$e 2 r fi $ep"se $ate!e c n2ertite. 8ir"! $e ?control? c ntine $e *iecei specificatii $e c n2ersie6 care s"nt "ti!i5ate pentr" interpretare $irecta a sec2ente! r $e intrare. 8ir"! $e c ntr ! p ate sa c ntinaJ 1*!anc"ri6 ta*"ri6 ne9!ines? care s"nt ign rate >s"nt n"+ite ?caractere a!*e?@ 1caractere r$inare >n"K@ 1specificatii $e c n2ersie c ntinin$ caracter"! K si pti na! caracter"! $e s"pri+are6 "n n"+ar pti na! $e specificare a !"ngi+ii +a4i+e a ci+p"!"i si "n caracter $e c n2ersie O specificatie $e c n2ersie $eter+ina c n2ersia "r+at r"!"i ci+p $e intrare. N r+a! re5"!tat"! este p!asat in 2aria*i!a p intata $e arg"+ent"! c resp"n5at r. Daca se in$ica s"pri+area prin caracter"! U ric"+ ci+p"! $e !a intrare este ign rat 3 se sare peste e!@ si n" se face nici retinere $e spati". Un ci+p $e !a intrare este $efinit ca "n sir $e n n ?caracter a!* ? fie pina !a !"ngi+ea specificata a ci+p"!"i. Caracter"! $e c n2ersie in$ica interpretarea ci+p"!"i $e !a intrare arg"+ent"! c resp"n5at r tre*"ie sa fie "n p inter asa c"+ este cer"t $e se+antica ?C? !i+*aF"!"i ?C?. Ur+at are!e caractere $e c n2ersie s"nt !ega!eJ
206

d1"n intreg 5eci+a! este asteptat !a intrare =arg"+ent"! c resp"n5at r tre*"ie sa n" fie p inter intreg. o1"n intrteg cta! este asteptat !a intrare =arg"+ent"! c resp"n5at r tre*"ie sa fie "n p inter $e intreg. M1"n intreg he4a5eci+a! este asteptat !a intrare= arg"+ent"! c resp"n5at r tre*"ie sa fie "n p inter $e intreg. h1"n intreg ?sh rt? este asteptat !a intrareJ arg"+ent"! tre*"ie sa fie "n p inter $e intreg ?sh rt? >?sc"rt?@. c1"n sing"r caracter este asteptat= arg"+ent"! c resp"n5at r tre*"ie sa fie "n p inter $e caracter. In acest ca5 ign rarea ?caractere! r a!*e ? este s"pri+ata= pentr" a citi "r+at r"! caracter a!t"! $e cit ?caractere!e a!*e? se f ! seste K&s. s1"n sir $e caractere este asteptat= arg"+ent"! c resp"n5at r tre*"ie sa fie "n p inter a! "n"i ta*! " $e caractere $est"! $e +are pentr" a incapea sir"! si n"n ter+inat r e# care 2a fi a$a"gat. f1"n n"+ar in 2irg"!a f! tanta este asteptat = arg"+ent"! c resp"n5at r tre*"ie sa fie "n p inter !a "n ci+p ?float?. Un caracter $e c n2ersie e este sin ni+ c" f. - r+at"! pre5entat !a intrare pentr" "n ?float? este a!cat"it $intr1"n se+n pti na!6 "n sir $e n"+ere care p t sa c ntina si "n p"nct 5eci+a! si "n ci+p $e e4p nent care este f r+at $in 7 sa" e "r+at $e "n intreg c" se+n. Caractere!e $e c n2ersie $6 2 si 4 p t fi prece$ate $e !itera ! pentr" a in$ica "n p inter !a ?lon7? +ai $egra*a $ecit ?int? care apare in !ist ta $e arg"+ente. 8i+i!ar !itera ! inainte $e 7 sa" f in$ica "n p inter !a ? do$ble? in !ista $e arg"+ente. De e4e+p!"J
207

int i; float M; char name ,%"; scanf("5d5f5s", Ri, RM, name); c" !inia $e intrare ), ,+. -)?&! Chompson 2a asigna 2a! area (. !"i i6 .. %3( !"i4 si p!asea5a sir"! ?Th +ps n? ter+inat prin e#in ?na+e?. Ce!e trei ci+p"ri $e !a intrare p t fi separate $e rice *!anc"ri6 ta*1"ri si ne9!ine1"ri. 0pe!areaJ int i; float M; char name ,%"; scanf("5)d5f5/d5)s, Ri, RM, name); c" intrarea ,*'(. %!)- +,a') 2a asigna !"i i6 ',3. # !"i 46 2a sari peste #&(3 si p!asea5a ?%.? in ?na+e?. Ur+at area ape!are !a rice r"tina $e intr $"cere 2a incepe ca"tarea c" !itera a. In aceste $ "a e4e+p!e ?na+e? este $eFa "n p inter si $e aceea n" tre*"ie prece$at $e D. Ca "n a!t e4e+p!"6 ca!c"!"! r"$i+entar $e !a capit !"! % p ate fi ac"+ rescris c" scanf pentr" a face c n2ersia $e intrare. ;incl$de4stdio.h> main() #/ r$dimentarE desk calc$lator /# { do$ble s$m, F; s$m=%; while(scanf("5lf", RF)G=?=1)
208

printf("^t5. )f^n", s$m6=F); } sscanf se p preste cin$ se ep"5ea5a sir"! $e c ntr ! ri cin$ $ata $e intrare $ifera prea +"!t $e specificatia $e c ntr !. 7ste ret"rnata 2a! are ega!a c" n"+ar"! $e $ate $e intrare intr $"se c" s"cces. Ca sfirsit"! fisier"!"i este ret"rnat 7O-= $e *ser2at ca acesta este $iferit $e # 6 ceea ce insea+na ca "r+at r"! caracter $e !a intrare n" se +ai c n2erteste prin pri+a specificatie $in sir"! $e c ntr !. Ur+at r"! ape! !a scanf se re5"+a sa ca"te i+e$iat $"pa "!ti+"! caracter $eFa ret"rnat. Un a2ertis+ent fina!J arg"+ente!e !"i scanf tre*"ie sa fie p interi. De $eparte cea +ai *isn"ita er are este sa scrii scanf("5d", n); in ! c $e scanf("5d", Rn); '... C n2ersii $e f r+at in +e+ rie -"nctii!e scanf si printf a" c resp n$ente f"nctii!e sscanf si sprintf care e4ec"ta ace!easi tip"ri $e c n2ersii6 $ar care perea5a as"pra "n"i sir n" as"pra "n"i fisier. - r+at"! genera! esteJ sprintf(strin7, control, ar7!, ar7),...) sscanf(strin7, control, ar7!, ar7),...) sprintf f r+atea5a arg"+ente!e arg&6 arg(6 etc6 c nf r+ sir"!"i ?c ntr !? ca +ai inainte6 $ar p!asea5a re5"!tate!e in ?string? in ! c $e iesirea stan$ar$. Desig"r ?string? tre*"ie sa fie s"ficient $e +are pentr" a pri+i re5"!tat"!. Ca e4e+p !"6 $aca ?na+e? este "n ta*! " $e caractere si n este "n intreg6 at"nciJ
209

sprintf(name, "temp5d", n); crea3a $n sir de forma tempnnn in "name", $nde nnn este Faloarea l$i n. sscanf face c n2ersia in2ersa 1i+parte sir"! ? strin7? c nf r+ f r+at"!"i $in ?c ntr !? si p!asea5a 2a! ri!e re5"!tate in arg&6 arg(6 etc. 0ceste arg"+ente tre*"ie sa fie p interi. 0stfe!J sscanf(name, "temp 5d", _n); n !a 2a! area $igiti! r $in sir care "r+ea5a $"pa temp in ?name?. 74erciti"! '.(. Rescrieti e4e+p!"! $e ca!c"!at r $in capit !"! % "ti!i5in$ scanf siEsa" sscanf pentr" a face intrarea si c n2ersia n"+ere! r. './ 0cces !a fisiere Pr gra+e!e scrise pina ac"+ t atecitesc intrarea stan$ar$ si scri" iesirea stan$ar$. Ur+at r"! pas in IEO este $e a scrie "n pr gra+ care acceea5a "n fisier care n" este $eFa c nectat pr gra+"!"i. Un pr gra+ care i!"strea5a necesitati!e pentr" astfe! $e peratii este ?cat?6 care c nectea5a "n set $e fisiere specificate spre iesirea stan$ar$. ?cat? este "ti!i5at pentr" tiparirea fisire! r !a ter+ina! si ca "n sc p genera! este "ti!i5at ca "n c !ect r $e intrare pentr" pr gra+e!e care n" a" capa*i!itatea $e a accesa fisire!e prin n"+e. De e4e+p!" c +an$aJ cat M. c E. c tipareste c ntin"t"! fisiere! r 4. c si A. c !a iesirea stan$ar$. Intre*area este c"+ sa aranFa+ ca fisiere!e specigficate sa fie citite a$ica c"+ sa c ntr !a+ n"+e!e e4terne c" $ec!aratii!e care $e fapt citesc $ate!e.

210

Reg"!i!e s"nt si+p!e. Inainte $e a se citi sa" scrie intr1"n fisier6 ! tre*"ie $eschis c" aF"t r"! f"nctiei f pen $in *i*!i teca stan$ar$. f pen ia "n n"+e e4tern >ca 4. c sa" A. c @6 face cite2a +anip"!ari si neg cieri c" siste+"! $e perare>$eta!ii care n" ne interesea5a@ si rer"nea5a "n n"+e intern care tre*"ie "ti!i5at "!teri r !a citiri!e si scrieri!e fisire"!"i. 0cest n"+e intern este $e fapt "n piFnter n"+it ?file pointer?6 !a str"ct"ra care c ntine inf r+atii $espre fisiere ca6 a$resa "n"i *"ffer p 5itia c"renta in *"fer6 $aca se citeste sa" se scrie in fisier6 s. a+. $. Uti!i5at rii n" tre*"ie sa c"n asca $eta!ii!e $e arece parte $in $efiniri!e stan$ar$ IEO *tin"te $e !a ?st$i .h? este $efinire $e str"ct"ra n"+ita -IC7. 8ing"ra $ec!aratie necesara pentr" "n p inter $e fisier >fi!e p inter@ este e4e+p!ificata $e 1H<?/fopen(), /fp; 0ceasta sp"ne ca fp este "n p inter !a -IC76 si f pen ret"rnea5a "n p inter !a -IC7. O*ser2ati ca -IC7 este "n n"+e $e tip6 !a fe! c" ? int? n" eticheta $e str"ct"raJ este i+p!e+entat ca "n tEpedef>Deta!ii in capit !"! ,@. 0ct"a!a ape!are a !"i f pen in pr gra+ esteJ fp=fopen(name, mode); Pri+"! arg"+ent a !"i f pen este n"+e!e >na+e@ fisier"!"i6 care este "n sir $e caractere. 0! $ i!ea arg"+ent este + $"! ?+ $e?6 $e ase+enea "n sir $e caractere care in$ica c"+ se intenti nea5a sa fie "ti!i5at fisier "!. M $"ri!e per+ise s"nt citire >rea$1?r?@6 scriere>9rite1?9?@ sa" a$a"gare >?a?@. Daca $eschi$eti "n fisier care n" e4istaJ pentr" scriere sa" a$a"gare6 e! este creat >$aca este p si*i!@. Daca se $eschi$e "n fisier e4istent in scriere6 acest fisier este sters. Incercarea $e a citi "n fisier care n" e4ista c nstit"ie er are. Mai e4ista si a!te +ane2re care ca"5ea er ri ca incercarea $e aciti "n fisier pt. care n" a2eti per+isi"nea. Daca e4ista 2re er are6 f pen
211

ret"rnea5a in p inter"! n"! 2a! area NUCC >care pt. c n2enienta este $e ase+enea $efinita in st$i .h@. Ur+at r"! pas este $e aciti sa" scrie fisier"! $ata $eschis. 0ici e4ista +ai +"!te p si*i!itati $intre care getc si p"tc s"nt ce!e +ai si+p!e. getc ret"rnea5a "r+at r"! caracter $in fisier =are ne2 ie $e fisier pentr" a1i specifica care fisier. 0stfe! c=7etc(fp) p!asea5a "r+at r"! caracter $in fisier"! referit prin fp in c si 7O- cin$ aF"nge !a sfirsit"! fiser"!"i. p$tc este inFers$l l$i 7etc: p$tc(c, fp) p"ne caracter"! c in fisier"! fp si ret"rnea5a c. Ca fe! c" 7etchar si p$char6 7etc si p$tc p t fi +acr "ri in ! c $e f"nctii. Cin$ este $e+arat "n pr gra+6 trei fisiere s"nt $eschise in + $ a"t +at si s"nt f"rni5ate p intere!e pentr" e!e. 0ceste fisiere s"nt intrarea stan$ar$6 iesirea stan$ar$6 si iesirea stan$ar$ pentr" er ri= p intere!e $e fisiere c resp"n5at are s"nt st$in6 st$ "t si st$err. N r+a! t ate acestea s"nt c nectate !a ter+ina!6 $ar st$in si st$ "t p t fi re$irectate asa c"+ s1a $escris in paragraf"! '.(. getchar si p"tchar p t fi $efinite c" aF"t r"! !"i 7etc si p$tc6 stdi$ si stdo$t astfe!J ;define 7etchar() 7etc(stdi$) ;define p$tchar(c)p$tc(c, stdo$t) Pentr" intrarea sa" iesirea f r+atata afisiere! r6 f"ncti"ni!e fscanf s si fprintf p t fi "ti!i5ate. 0cestea s"nt i$entice c" scanf si printf6 $e retin"t ca pri+"! arg"+ent6 este "n p inter $e fisier care specifica fisier"! $e citit sa" scris = sir"! $e c ntr ! este a! $ i!ea arg"+ent.

212

C" aceste pre!i+inarii6 s"nte+ ac"+ in p 5itia $e a rescrie pr gra+"! ?cat? $e c ncatenare a fisiere! r. Pre+isa $e *a5a este cea care a f st gasita c n2ena*i!a pentr" atitea pr gra+e pina ac"+J $acae4ista !inii $e c +an$a c" arg"+ente6 s"nt e4ec"tate in r$ine. Daca n" e4ista arg"+ente este pre!"ata intrarea stan$ar$. 8"* aceasta f r+a pr gra+"! p ate fi f ! sit $e sine statat r sa" ca parte a "n ra +ai +ari. ;incl$de 4stdio.h> main(ar7c, ar7F) #/ cat:concatenate files /# int ar7c; char /ar7F " { 1H<?/fp, /fopen(); if(ar7c==!) #/ no ar7s;copE standard filecopE(stdi$); else while(&&ar7c>%) if((fp=fopen(/66ar7F, "r"))==KA<<){ /ar7F); }else{ } /# printf("cat:canIt break; filecopE(fp); fclose(fp); open5s^n",

inp /#

} filecopE(fp) #/copE file fp to standard o$tp$t 1H<? /fp { int c: while((c=7etc(fp))G=?=1) p$tc(c, stand); }
213

P intere!e $e fisiere stdi$ si stdo$t s"nt pre$efinite in *i*!i teca stan$ar$ IEO ca iesirea si intrarea stan$ar$J e!e p t fi "ti!i5ate ri"n$e p ate fi "ti!i5at "n *iect $e tip"! -IC76 7!e s"nt c nstante 6 n" 2aria*i!e asa ca n" incercati sa !e asig"rati. -"nctia fclose este in2ers"! !"i fopen = ea intrer"pe c ne4i"nea intre p inter"! fisier"!"i si n"+e!e e4tern a! fisier"!"i6 care a f st sta*i!ita $e f pen6 e!i*erin$ p inter"! fisier"!"i pentr" "n a!t fisier. De arece ce!e +ai +"!te siste+e $e perare !i+itea5a n"+ar"! $e fisiere $echise si+"!tan $e "n pr gra+6 este i$ee *"na $e a !e e!i*era in + +ent"! cin$ n" +ai este ne2 ie $e e!e6 asa c"+ a+ fac"t in pr gra+"! cat. 74ista $e ase+enea "n a!t + ti2 pentr" a face fc! se pe "n a!t fisier in iesire 1c"rata *"ffer"! in care p"tc c !ectea5a iesirea. fc! se este ape!at a"t +at pentr" fiecare fisier $echis at"nci cin$ pr gra+"! se ter+ina n r+a!. '.' Tratarea er ri! r 1 stderr si eMit Trata+ent"! er ri! r in cat n" este i$ea!. Pr *!e+a este ca $aca "n"! $ $in fisiere n" p ate fi accesat $in 2re"n + ti2 arecare6 $iagn stic"! er rii este tiparit n"+ai !a sfirsit"! iesirii c ncatenate. 0ceasta este acepta*i! $acaiesirea se face pe "n ter+ina!6 $ar este ra" $aca iesirea este "n fisier sa" "n a!t pr gra+ 2ia pipe!ine. Pentr" a trata aceasta sit"atie +ai*ine6 "n a! $ i!ea fisier $e iesire n"+it st$err este asignat pr gra+"!"i6 !a fe! cast$in si st$ "t. Daca e este p si*i!6 st$err apare pe ter+ina!"! "ti!i5at r"!"i chiar $aca iesirea stan$ar$ este re$irectata. 8a re2i5"i+ pr gra+! cat in asa fe! ca +esaFe!e $e er are sa apara in fisier"! stan$ar$ $e er ri ;incl$de 4stdio.h> main(ar7c, ar7F) #/ cat: concatenate files /Z int ar7c:
214

/#

char /ar7F "; { 1H<?/fp, /fopen(); if(ar7c==!) #/ no ar7s: ; copE standard inp$t else filecopE(stdi$); while(&&ar7c>%) if((fp=fopen(/66ar7F, "r"))==KA<<){ fprintf(stderr, "cat:canIt open }else{ filecopE(fp);{ fclose(fp);

5s^n", /ar7F);

} eMit(%);

Pr gra+"! se+na!ea5a er ri!e in $ "a fe!"ri. Diagn stic"! $e iesire pr $"s $e catre fprintf +erge in st$err6 astfe! e! gaseste $r"+"! catre ter+ina!"! "ti!i5at r"!"i in ! c sa $ispara printr1"n pipe!ine sa" fisier $e iesire. Pr gra+"! $e ase+enea "ti!i5ea5a si f"nctia eMit $in *i*!i teca stan$ar$ care ter+ina e4ec"tia pr gra+"!"i cin$ este ape!ata. 0rg"+ent"! !"i e4it este "ti!i5a*i! $e catre rice pr ces care i! ape!ea5a6 astfe! s"cces"! sa" esec"! pr gra+"!"i p ate fi testat $e "n a!t pr gra+ pentr" care ce! $inainte este "n s"*pr gra+. Prin c n2entie ret"rnarea 2a! rii # se+na!ea5a ca t t"! ste OK6 iar $iferite 2a! ri n n5er se+nifica sit"atii an r+a!e. eMit ape!ea5a fc! se pentr" fiecare fisier $eschis in iesire pentr" a c"rata *"ffer"!6 ap i chea+a r"tina n"+ita 1e4it. -"nctia e4it $eter+ina ter+inarea i+e$iata fara c"ratarea *"ffer"!"i $esig"r e4it p ate fi ape!ata si $irect. '.,. Intr $"cerea si e4tragerea "nei !inii
215

Bi*!i teca stan$ar$ c ntine r"tina n"+ita fgets care este si+i!ara f"nctiei 7etline pe care a+ "ti!i5at1 pina ac"+. 0pe!areaJ f7ets(line, OPQ<HK?, fp) citeste "r+at area !inie $e !a intrare >inc!"5in$ ne9!ine@ $in fisier"! fp in ta*! "! $e caractere n"+it !ine = ce! +":!t M0DCIN71& caractere 2 r fi citite. Cinia re5"!tata este ter+inata prin T#. N r+a! fgets ret"rnea5a !inia = !a sfirsit"! fisier"!"i ret"rnea5a NUCC. >;et!ine ret"rnea5a !"ngi+ea !iniei si 5er pentr" sfirsit"! fisier"!"i@. Pentr" iesire6 f"nctia scrie "n sir >care n" tre*"ie sa c ntina ne9!ine@ intr1"n fisier. fp$ts(line, fp) Pentr" a arata ca n" e4ista ni+ic +agic c" f"nctii!e f7ets si fp$ts +ai F s s"nt c piate $in *i*!i teca stan$ar$ $e intrare Eiesire. ;incl$de 4stdio.h> char /f7ets(s, n, iop) #/ 7et at most n chars from iop /# char /s int n; re7ister 1H<?/iop; { re7ister int c; re7ister char /cs; cs=s while(&&n>%``(c=7etc(iop))G=?=1) if((/cs66=c)==I\nI) break /cs=I\%I; ret$rn((c==?=1``cs==s)ZKA<<:B); }
216

fp$ts(s, iop) #/ p$t strin7 s on file iop /# re7ister char /s; re7ister 1H<? /iop; { re7ister int c; while(c=/s66) p$tc(c, iop); } 74erciti"! '.3. 8crieti "n pr gra+ $e c +parare a $ "a fisiere6 si tipariti pri+a !inie si p 5itia caractere! r cin$ $ifera. 74erciti"! '.%. M $ificati pr gra+"! $e gasire a tip"!"i $in capit !"! . asa fe! incit sa ai*e intrarea $intr1"n set $e fisiere $e intrare n"+ite iar $aca n" s"nt n"+ite fisiere $e intrare6 $e !a intrarea stan$ar$. Tre*"ie tiparit n"+e!e fisier"!"i cin$ este $etectata !inie p tri2ita G 74erciti"! '... 8crieti "n pr gra+ $e tiparire a "n"i set $e fisiere6 in care fiecare sa inceapa pe pagina n "a c" "n tit!" si "n c nt r $e pagini pentr" fiecare fisier. '.3. Cite2a f"nctii a+estecate Bi*!i teca stan$ar$ p"ne !a $isp 5itie 2arietate $e f"nctii6 cite2a fiin$ $e se*it $e "ti!e. 0+ +enti nat $eFa "nctii!e c" sir"ri str!en6 strepA6 strcat si strc+p. Ur+ea5a a!te cite2a. Testarea c!asei caractere! r si c n2ersia ! r. Mai +"!te +acr "ri e4ec"ta teste as"pra caractere! r si c n2ersia ! rJ isalpha(c) non3ero $aca c este a!fa*etic si 5er $aca n". is$pper(c) non3ero $aca c este !itera +are >"pper case@si # $acan". islower &non3ero $aca c este caracter +ic >! 9er case@si # $aca n". isdi7it &non3ero $aca c este $igit si 5er $aca n".
217

isspace &non3ero $aca c ete *!anc6 ta* sa" ne9!ine si # $aca n". to$pper 1c n2erteste c in caracter +are >"pper case@ tolower(c) 1c n2erteste c in caracter +ic >! 9er case@. An7etc Bi*!i teca stan$ar$ c ntine 2ersi"ne restricti2a a f"nctiei "ngetch pe care a+ scris11 in capit !"! %= se n"+este "ngetch. $n7etch(c, fp) i+pinge caracter"! c inap i in fisier"! fp. N"+ai "n caracter $in fisierc p ate fi tratat astfe! "ngetc p ate fi "ti!i5at c" ricare $in f"nctii !e si +acr "r"i!e $e intr $"cere ca scanf6 getc sa" getchar. 0pe! sEstem 0pe!area f"nctiei sEstem(s) e4ec"ta c +an$a c ntin"ta in sir"! $e caractere s ap i reia pr gra+"! c"rent. C ntin"t"! !"i s $epin$e +"!t $e siste+"! $e perare. Ca "n e4e+p!" r$inar in UNID !inia sEstem("date"); $eter+ina r"!area par gra+"!"i $ate care tiparesete $ata si + +ent"! 5i!ei. Manage+ent"! +e+ riei -"nctia ca!! c este ase+anat are c" a!! c pe care a+ "ti!i5at1 capit !e!e prece$ente. calloc(n, si3eof(ob:ect)) ret"rnea5a "n p inter $aca este s"ficient spati" pentr" ce!e n *iecte $e $i+ensi"nea specificata si5e f sa" NUCC $aca cererea p ate fi satis fac"ta. Me+ ria este initia!i5ata c" 5er .
218

in

P inter"! are a!inia+ent"! a$ec2at intr $"s intr1"n tip c resp"n5at r.

*iecte! r respecti2e6 $ar e! tre*"ie

cfree(p) e!i*erea5a spati"! p intat prin p "n$e p este initia! *tin"t prin ape!area !"i ca!! c. N" e4ista restrictii as"pra r$inii in care spati"! este e!i*erat6 $ar este +are gresea!a sa e!i*ere5i ce2a ce n" ai *tin"t prin ape!area f"nctiei ca!! c. Capit !"! , pre5inta i+p!e+entarea "n"i a! cat r $e +e+ rie ca ca!! c6 in care *! c"ri!e a! cate p t fi e!i*erate in rice r$ine.

219

Ane'a A. Man"a! $e referinta C &. Intr $"cere 0cest +an"a! $escrie !i+*aF"! C i+p!e+entat pe PDP1&&6 I neA9e!e /###6 IBM 8Aste+T3'# si Inter$ata ,T3(. In *! c"ri!e "n$e e4ista $iferente >intre i+p!e+ntari@ e! se refera !a PDP1&&6 $ar se incearca p"nctarea $eta!ii! r $epen$ente $e i+p!e+entare. C" +ici $iferente6 aceste $epen$ente s"nt !egate $irect $e pr prietati!e har$9are >a!e +asini! r@= $i2erse!e! c +pi!at are s"nt in genera! c +pati*i!e. (. C n2entii !e4ica!e 74ista sase c!ase $e si+* !"riJ i$entificat ri6 c"2inte1cheie6 c nstante6 >in + $ c !ecti2 n"+ite ?spatii a!*e?@asa c"+ 2 r fi $escrise in c ntin"are. s"nt ign rate c" e4ceptia ca5"ri! r cin$ ser2esc !a repararea si+* !"ri! r. Une!e spatii a!*e s"nt necesare pentr" a separa i$entificat ri a$iacenti6 c"2int1cheie si c nstante. Daca sir"! $e intrare >pentr" c +pi!at r@ a f st ana!i5at >si transf r+at@ in si+* !"ri pina !a "n caracter $at6 "r+at r"! si+* ! 2a inc!"$e ce! +ai !"ng sir $e caractere care p ate c nstit"i "n si+* !. (. &. C +entarii Caractere!e EU incep "n c +entari"6 care se ter+ina c" caractere!eUE. C +entarii!e n" p t fi i+*ricate. (. ( I$entificat ri >n"+e@ Un i$entificat r este sec2enta $e !itere si cifre=pri+"! caracter tre*"ie sa fie !itera. 8"*!inierea >"n$ersc r@ este c nsi$erata !itera !itere!e +ari si +ici s"nt $iferite. $D ar pri+e!e , caractere s"nt se+nificati2e6 $esi p t fi
220

f ! site +ai +"!te. I$entificat rii e4terni care s"nt "ti!i5ati $e asa+*!are sa" incarcat are6 s"nt +ai restricti2iJ PDP1II ' caractere6 (ca5"ri6 casete >cases@ I +A9e!e /### /caractere6 &caset. IBM 3/#E3'# 'caractere6 &case Inter$ata ,E3( ,caractere6 ( cases (. 3. C"2inte cheie

serie $e

Ur+at rii i$enntificat ri s"nt re5er2ati pentr" a fi f ! siti ca si c"2inte cheie6 si n" p t fi f ! siti a!tfe!J int eMtern else char re7ister for float tEpedef do do$ble static while str$ct 7oto switch $nion ret$rn case lon7 si3eof defa$lt short break entrE $nsi7ned contin$e a$to if C"2int"! cheie ?entrE? n" este i+p!e+entat $e nici "n c +pi!at r6 $ar este re5er2at pentr" "ti!i5are "!teri ara. Une!e i+p!e+entari re5er2a si c"2inte!e ?fortran? si ?asm? (. %. C nstante 74ista serie $e c ntante $ecrise in c ntin"are. Caracteristici!e har$9are care afectea5a $i+ensi"ni!e s"nt re5"+ate in f(. /.
221

(. %. &. C nstante intregi O c nstanta intreaga c nstin$ $intr1 serie $e cifre 2a fi c nsi$erata in cta! $aca incepe c" # >cifra 5er @6 astfe! 2a fi c nsi$erata in 5eci+a!. O sec2anta $e cifre prece$ata $e 4 sa" OD >cifra 5er @ este c nsi$earata intreg he4a5eci+a!.Daca 2a! area "nei c nstante 5eci+a!e $epaseste p si*i!itati!e har$9are $e in+aga5inare a intregi! r ea 2a fi c nsi$erata $e tip ?! ng?. 0ce!si !"cr" se inti+p!a si pentr" c nstante!e cta!e sa" he4a5eci+a!e. (. %. (. C nstante!"ngi e4p!icite O c nstanta intreaga $e tip cta!6 5eci+a! sa" he4a5eci+a! "r+ata $e caracter"! ?!?sa"?C? este c nsi$erata c nsatnta !"nga. D"pa c"+ 2a fi $isc"tat !a "ne!e +asini intregii si 2a! ri!e ?! ng? p t fi c nsi$erate i$entice. (. %. 3. C nstante tip caracter O c nstanta tip carcter este "n caracter intre ghi!i+e!e si+p!e c"+ ar fi $e e4e+p!" YUY. )a! area "nei c nstante tip caracter este 2a! rea n"+erica a caracter"!"i c rep"n5at r set"!"i $e caractere a! +asinii. Une!e caractere negrafice6 c"+ s"nt ghi!i+ea"a si *ac:space p t fi repre5entate $"pa c"+ "r+ea5a6 c nf r+ "nei ta*e!e $e sec2ente ?escape?. newline K<(<0) horisontaltab SC backspace TB carria7eret$rn 2@ formfeed 11 backslash \ 7hilimea I modelbinar ddd \n \t \b \r \f \\ \I \ddd "bit pattern"

8ec2enta T$$$ c nsta $in caracter"! *ac:s!ash "ra+t $e &6 & sa" 3 cifre cta!e care 2 r specifica 2a! rea "n"i caracter $ rit. Un ca5 specia! $e c nstr"ctie este T# >ne"r+at $e nici cifra@ care in$ica "n caracter NUCC. Daca caracter"! care "r+ea5a $"pa T n" este $e tip"! specificat6 se ign ra T.
222

(. %. %. C nstante in 2irg"!a + *i!a O c nstanta in 2irg"!a + *i!a c nsta $intr1 parte intreaga6 p"nct 5eci+a! parte fracti nara "n ?e? sa" ?7? si pti na! s "n intreg c" se+n pe p st $e e4p nent. Intreg"! si partea fracti nara p t fi sec2ente $e cifre. 0tit intreg"! cit si partea fracti nara >$ar n" si+"!tan @ p t !ipsi= si p"nct"! 5eci+a! sa" ?e? si e4p nent"! >n" si+"!tan@ p t !ipsi. C nstante!e s"nt in $"*!a preci5ie repre5entate. (. .. 8ir"ri Un sir este sec2enta $e caractere intre ghi!i+e!e $"*!e6 $e e4e+p!" ?...? Un sir este $e tip"! ?ta*! "! $e caractere ? si in c!ase $e +e+ rare ?static? >2e5i ^%@ si se initia!i5ea5a c" caractere!e $ate. T ate sir"ri!e6 chiar $aca s"nt scrise i$entic6 s"nt $istincte. C +pi !at r"! p!asea5a caracter"! T# >*Ate n"!@ !a sfirsit"! fiecar"i sir astfe! ca pr gra+e!e care p t $etecta sfirsit"! sir"!"i. Intr1"n sir6 car acter"! ? tre*"ie prece$at $e T= in p!"s6 sec2ente!e $eschise pentr" c nstante tip caracter p t fi f ! site. In sfirsit 6 "n T si "n NC care "r+ea5a i+e$iat s"nt ign rate. (. /. Caracteristici har$9are Ta*e!"! care "r+ea5a re5"+a "ne!e pr prietati $e har$9are care 2aria5a $e !a +asina !a +asina. 0cestea afectea5a p rta*i!itatea pr gra+e!e r= in practica aceasta este pr *!e+a care tre*"ie pri2ita apri ric. R?2 0R0!! HKC?@RPCP(#-) PB2HH S=K?J>?<< PB2HH HTO-'%

?T2RH2 PB2HH

223

char int !* short !* lon7 float -) do$ble *+ 7ama repre3. 6

(biti -* -* -) H!%&-( -* ') 6

. -) !* -* H!%&-( -) *+

( -) !* -)

( -)

-) *+ H!%&'* H!%&'* 6 6

Pentr" aceste patr" tip"ri $e +asina6 n"+ere!e in )- a" e4p nent"! $e , *iti. 3. N tatii s"ntactice In +an"a! n tatii!e sintactice s"nt scrise c" tip"! ita!ic $e caracter c"2inte!e !itera!e s"nt caractere tip"! $rept. Categ rii!e a!ternati2e s"nt !istate pe !inii separate. Un si+* ! pti na! ter+ina! sa" n nter+ina! este in$icat prin s"*scrierea ? pt?6 astfe!J Re4presia ptS in$ica e4presie pti na!a intre ac !a$e. 8inta4a este re5"+ata in f&,. %. Ce este "n n"+e G C1"! isi *a5ea5a interpretarea "n"i i$entificat r $e $ "a atri*"te a!e i$entificat r"!"iJ ?c!asa $e +e+ rare ? si ?tip"!?. C!asa $e +e+ rare $eter+ina ! catia si $"rata $e 2iata a "nei ce!"!e $e +e+ rare as ciate "n"i i$entificat r= tip"! $eter+ina se+nificatia 2a! rii $ep"se in ce!"!a $e +e+ rare a i$entificat r"!"!i !C. 74ista patr" c!ase $e +e+ rare $ec!ara*i!eJ a"t +atic6 statice4terna si tip registr". )aria*i!e!e a"t +atice s"nt ! ca!e fiecarei ape!ari a "n"i *! c >2e5i f3. (@ si s"nt $ec!asate !a iesirea $in *! c"! respecti2. )aria*i!e!e statice s"nt ! ca!e "n"i *! c6 $ar retin 2a! area pina !a re2enirea in *! c"! respecit2 chiar $aca c ntr !"! a parasit *! c"!= 2aria*i!e!e e44terne e4ista si pastrea5a 2a! area! r in $ec"rs"! e4ec"tiei intreg"!"i pr gra+ si p t sa fie f ! site pentr" c +"nicare intre f"nctii chiar f"ncctii c +pi!ate separat. )aria*i!e!e
224

$e tip registr" s"nt n"+er tate >$aca este p si*i!@ in registrii rapi5i ai +asinii6 ca si 2aria*i!e!e a"t +ate s"nt ! ca!e *! c"!"i si $ispar !a iesirea $in *! c. C s"p rta cite2a tip"ri f"n$a+enta!e $e *iecteJ O*iecte!e $ec!arate ca si caractere >char@ s"nt s"fiecient $e +ari pentr" a s"f ca rice +e+*r" a set"!"i $e caractere a!e i+p!e+entarii6 si $aca "n caracter p"r $in acest set $e caractere este s"f cat intr1 2aria*i!a $e tip caracter6 2a! area sa este echi2a!enta c" c $"! intreg pentr" ace! caracter >c" 2a! area intreg"!"i care repre5inta caracter"! in repre5entarea interna >NI@@ 8i a!te cantitati p t fi s"f cate in 2aria*i!e tip caracter6 $ar i+p!e+entarea este $epen$enta $e +asina. 8"nt $isp ni*i!e 3 $i+ensi"ni $e intregi $ec!arati sh rt int6 int si ! ng int. Intregii !"ngi per+it starii +ai +ari $ecit cei sc"rti6 $ar i+p!e+entarea p ate face ca intregii sc"rti6 sa" cei !"ngi6 sa" a+*ii sa $e2ina echi2a!enti c" intregii $e *a5a. 0cestia a" $i+ensi"nea nat"ra!a $ec"rgin$ $in arhitect"ra +asinii6 ce!e!a!te tip"ri s"nt pre2a5"te pentr" cerinte specia!e. Intregii fara se+n6 $ec!arati "nsigne$ se s"p"n !egi! r arit+eticii + $"! (n "n$e n este n"+ar"! $e *it$in repre5entare. >Ca PDP&& cantitati!e !"ngi fara se+n n" s"nt s"p rtate@ Cantitati in )- si+p!a >f! at@ sa" $"*!a >$ "*!e@ p t sa fie sin ni+e in "ne!e i+p!e+entari. Pentr" ca cantitati!e $escrise p t fi interpretate ca n"+ere ce s"nt referite ca fiin$ $e tip ?arit+etic?. Tip"ri!e char si int $e t ate $i+ensi"ni!e 2 r fi in + $ c !ecti2 n"+ite $e tip ?intreg?. >f! at si $ "*!e 2 r fi $en"+ite $e tip ?f! tant?. In afara tip"ri! r arit+etice $e *a5a e4ista6 c ncept"a!6 tip"ri $eri2ate $in tip"ri!e $e *a5a in + $"! "r+at rJ 1ta*! "ri $e *iecte $e +"!te tip"ri
225

c!asa infinita $e

1f"nctii care $a" *iecte $e "n tip $at 1p interi !a *iecte $e "n tip $at 1str"ct"ri c nstit"in$ sec2nta $e *iecte $e tip"ri 2ariate 1+ari+i capa*i!e sa c ntina ricare "nitate $e *iecte $e tip"ri 2arai*ie In genera! aceste +et $e $e c nstr"ctie a *iecte! r p t fi ap!icate rec"rsi2. .. O*iecte si !2a! ri Un *iect este regi"ne +anip"!a*i!a $e +e+ rare= C)0CO0R7 este e4presie referit are !a "n *iect. Un e4 si+p!" $e e4presie C)0CO0R7 este "n i$entificat r. 74ista perat ri care crea5a >pr $"c@ !2a! riJ $e e46 $aca 7 este e4presie $e tip"! p inter6 at"nci U7 este e4presie !2a! are referit are !a *iect"! spre care p intea5a 7. N"+e!e ?!2a! are? 2ine $e !a e4presia $e asignare 7&N7( in care peran$"! sting 7& tre*"ie sa fie e4presie ?!2a! are?. Disc"tarea6 +ai F s6 a fiecar"i perat r in$ica cin$ se asteapta peran5i ?!2a! are ? si cin$ perat r"! pr $"ce ?!2a! are?. /. C n2ersii Un n"+ar $e perat ri $epin5in$ $e peran5ii ! r sa ca"5e5e c n2ersia "nei 2a! ri a peran$"!"i $intr1"n tip in a!t"!. 0ceasta secti"ne e4p!ica re5"!tat"! care se asteapta in "r+a "nei astfe! $e c n2ersii= ^/. / re5"+a c n2ersii!e cer"te $e +aF ritatea peratii! r c"rente > r$inare N. T@ ta*! "! 2a fi i+* gatit $"pa >prin@ $isc"tarea fiecar"i perat r. /. &. Caractere si intregi Un caracter sa" "n intreg sc"rt p t fi f ! site ri"n$e "n intreg se p ate f ! si. In t ate ca5"ri!e 2a! area este c n2ertita intr1"n intreg. C n2ersia "n"i intreg sc"rt intr1"n"! !"ng i+p!ica e4tensie $e se+n= intregii s"nt cantitati c" se+n. 74tensia $e se+n pt caractere $epin$e $e +asina6 $ar se garantea5a ca "n +e+*r" a! "n"i set $e caractere stan$ar$ este nenegati2. Dintre +asini!e $isc"tate aici $ar !a PDP1&& se e4tin$e se+n"!. Ca PDP1&& 2a! area 2aria*i!e! r tip caracter este in ga+a 1&(, !a O&('= caractere!e
226

a!fa*et"!"i 08CII s"nt t ate p 5iti2e. O c nstanta tip caracter specificata cta! s"fera e4tensie $e se+n si p ate apare negati2a $e e4e+p!" YT3''Y are 2a! area 1&. Cin$ "n intreg +ai !"ng este c n2ertit intr1"n"! +ai sc"rt sa" char e! este tr"nchiat !a stinga= *itii in e4ces s"nt $ep!asati >pier$"ti@. /. (. 1loat si do$ble T ata arit+etica in C este rea!i5ata in $"*!a preci5ie= cin$ apare "n f! at intr1 e4presie e! este ?!"ngit? >e4tins@ in $ "*!e prin intr $"cere $e 5er r"ri in partea sa fracti nara. Cin$ "n $ "*!e este c n2ertit in f! at6 $e e4e+p!" printr1 asignare6 $ "*!e1"! este r t"nFit inaintea $e tr"nchiere pe !"ngi+ea "n"i f! at. /. 3. -! tante si intregi C n2ersia "nei 2a! ri f! tante in tip intreg $e2ine $epen$enta $e +asina in partic"!ar $irectia $e tr"nchiere a n"+ere! r negati2e 2aria5a $e !a +asina !a +asina. Re5"!tat"! este ne$efi*nit $aca 2a! area n" incape in spati"! pre2a5"t >N.T. pt "n intreg@. C n2ersii!e $in intreg in f! tant s"nt rea!i5ate *ine. P ate apare pier$ere a preci5iei $aca $etinatia n" are "n n"+ar s"ficient $e *iti. /. %. P interi si intreg Un intreg sa" "n intreg !"ng p ate fi a$"nat sa" sca5"t $intr1"n p inter= in acest ca5 pri+"! este c n2ertit asa c"+ se specifica !a peratia $e a$"nare. D i p interi !a *iecte $e ace!asi tip p t fi sca5"ti= in acest ca5 re5"!tat"! este c n2ertit intr1"n intreg asa c"+ se 2a $isc"ta !a peratia $e sca$ere. /. .. -ara se+n Ori$ecite ri "n intreg fara se+n si "n intreg n r+a! >$e *a5a tipic@ s"nt c +*inati6 intreg"! tip este c n2ertit in intreg fara se+n si re5"!tat"! 2a
227

fi fara se+n. )a! area este ce! +ai +ic intreg fara se+n c ngr"ent intreg"!"i c" se+n > + $"! ( si !"ngi+ea caracter"!"i@. In repre5entarea in c +p!e+ent fata $e (6 c n2ersia este c ncept"a!a si n" se + $ifica ta*! "! >$istri*"tia@ *iti! r. Cin$ "n intreg fara se+n este c n2ertit in ! ng 6 2a! area re5"!tat"!"i este aceasi n"+eric6 ca si a intreg"!"i fara se+n. Deci c n2ersia este intr $"cere $e 5er "ri spre stinga. /. /. C n2ersii arit+etice M"!ti perat ri ca"5ea5a c n2ersii si pr $"c re5"!tate $e "n tip arecare6 intr1"n + $ si+i!ar. 0cest + $e! 2a fi n"+it ?c n2ersii arit+etice "5"a!e?. Intii6 ricare peran$ $e tip"! char sa" sh rt 2a fi c n2ertit in int6 iar ricare peran$ $e tip"! f! at este c n2ertit in tip"! $ "*!e. 0p i6 $aca "n peran$ este $e tip $ "*!e6 at"nci si ce!a!a!t este c n2ertit in $ "*!e si acesta 2a fi tip"! re5"!tat"!"i. 0stfe! $aca "n peran$ este ! ng6 ce!a!a!t este c n2ertit in ! ng si acesta 2a fi tip"! re5"!tat"!"i. 0stfe!6 $aca "n peran$ este "nsigne$6 ce!a!a!t este c n2ertit in "nsigne$ si acesta 2a fi tip"! re5"!tat"!"i. 0stfe!6 $aca a+*ii peran5i s"nt int6 acesta 2a fi tip"! re5"!tat"!"i. '. 74presii Prece$enta >pri ritatea@ perat ri! r $in e4presii este aceasi c" r$inea s"*secti"ni! r $in aceasta secti"ne6 priritatea +a4i+a fiin$ pri+a $aca $e e4e+p!" e4presii!e referite ca perat ri pentr" O>^'%@ s"nt e4presii!e $efiite in ^^'. &1'. 3. In fiecare s"*secti"ne perat rii a" aceeasi prece$eta. 0s ciati2itatea !a stinga sa" !a $reapta este specificata in fiecare $in perat rii $in perat rii $isc"tati in ca$r"! s"*secti"nii. Prece$enta si as ciati2itatea t"t"r r perat ri! r $in e4presii este re5"+ata in gra+atica $in ^&,. 0stfe! r$inea $e e2a!"are a e4presii! r este ne$efinita. In partic"!ar c +pi!at r"! se c nsi$era !i*er $e a ca!c"!a s"*e4presii!e $e +aniera pe care e! c nsi$era cea +ai eficienta6 chiar $aca s"*e4presii!e p t c n$"ce !a efecte sec"n$are. Or$inea $e aparatie a efecte! r sec"n$are este
228

nespecificata. 74presii!e care c ntin "n c +"tat r c +"tai2 si as ciati2 >U6 O6 ^6 ]6 V@ p t fi rearanFate ar*itrar6 chiar in pre5enta parante5e! r6 pentr" a se f rta r$ine partic"!ara $e e2a!"are e4p!icitare te+p rara $e2ine necesara. Pre!"crarea $epasiri! r s"peri are si 2erficarea i+partiri! r !a e2a!"area e4presii! r este $epen$enta $e +asina. T ate i+p!e+entari!e C1"!"i ign ra $epasiri!e s"peri are intregi= pre!"crarea i+partirii c" #6 si t ate e4ceptii!e )- 2aria5a intre +asini si s"nt "5"a! aF"sta*i!e printr1 f"nctie $e *i*!i teca. '. & 74presii pri+are 74presii!e pri+are care c ntin.6 1Z6 s"*scrieri6 si ape!"ri $e f"nctii se gr"pea5a $e !a stinga !a $reapta. primarE&eMpresion: identifier constant strin7 (eMpresion) primarE&eMpresion eMpresion" primarE&eMpresion(eMpresion&list opt) primarE&lFal$e. identifier primarE&eMpresion&>identifier eMpresion&list: eMpresion eMpresion&list, eMpresion Un i$etificat r este e4presie pri+ara6 c" garantia ca a f st $ec!arat asa c"+ se 2a $isc"ta. Tip"! sa" este specificat !a $ec!arare. Daca tip"! i$etificat r"!"i este ?ta*! "ri $e...? at"nci 2a! area e4presiei i$entificat r"!"i sa" este "n p inter !a pri+"! *iect $in ta*! "6 iar tip"! e4presiei este ?p inter !a...?. Mai +"!t6 "n i$etificat r $e ta*! " >+asi2@ n" este !2a! are. Ca fe! "n i$etificat r care e $ec!arat ?f"ncti n ret"rning...?
229

>f"nctie care ret"rnea5a @6 cin$ este f ! sit >c" e4ceptia ca5"!"i cin$ apare ca n"+e!e f"nctiei !a "n ape!@ este c n2ertit in ?p inter !a f"nctia ce ret"rnea5a...?. O c nstanta este e4presie pri+ara. Tip"! ei p ate fi int6 ! ng sa" $ "*!e6 $epin5in$ $e f r+a sa. C nstante!e tip caracter a" tip"! int= c nstante!e f! tante s"nt $ "*!e. Un sir este e4presie pri+ara. Tip"! sa" rigina! >!a rigine@ este ?ta*! " $e char?= "r+in$ insa aceeasi reg"!a $ata pentr" i$entificat ri6 acesta este + $ificat in ?p interi catre char? si re5"!tat"! este "n p inter catre pri+"! caracter a! sir"!"i >e4ista e4ceptie pt "ne!e initia!i5ari a se 2e$ea ^,./.@. O e4prsie in parante5e este e4presie pri+ara a car"i tip si 2a! are s"nt i$entice c" a!e e4presiei fara parante5e. Pre5enta parante5e! r n" are i+p!icari $aca e4presia este !2a! are. O e4presie pri+ara "r+ata $e e4presie in parante5e $repte este e4presie pri+ara. 8ens"! int"iti2 este ace!a a! "n"i in$ice. O*isn"it e4presia pri+ara are tip"! ?p inter catre...?6 e4presia in$ice!"i este int6 iar tip"! re5"!tat"!"i este ?...? >PPP N.T.@. 74presia 7&L7(M este i$entica >prin $efinitie@ c" U>>7&@O>7(@@. T ate reg"!"i!e necesare intie!egerii acestein tatii s"nt c ntin"te in aceasta secti"ne i+pre"na c" $isc"tii!e $in ^^'. &6 '. ( si '. %. as"pra i$entificat ri! r6 U6 si respecti2 O= ^&%. 3 re5"+a i+p!icatii!e. Un ape! $e f"nctie este e4presie pri+ara "r+ata $e parante5e c ntini$ "n p si*i! 2i$6 !ista $e e4presii separate prin 2irg"!e c nstit"in$ arg"+ente!e act"a!e a!e f"nctiei. 7Dpresia pri+ara tre*"ie sa fie $e tip"! ?f"nctie care ret"rnea5a.?6 si re5"!tat"! ape!"!"i f"nctiei este $e tip"! ?...?. C"+ se 2a in$ica6 "n i$entificat r ne2a5"t "r+at $e parante5a stinga este c nte4t"a! $ec!arat ca repre5entin$ f"nctie care ret"rnea5a "n intreg= $eci in +aF ritatea ca5"ri! r f"nctii!e car $a" ca re5"!tat 2a! re intreaga n" tre*"ie $ec!arate. Orice arg"+ent act"a! $e tip"! f! at este c n2ertit in $ "*!e inainte $e ape!= ricare arg"+ent $e tip"! char sa" sh rt este c n2ertit in int= si6 ca $e *iecei
230

n"+e!e $e ta*! "ri s"nt c n2ertit in p intere. Daca este necesara c n2ersie se 2a f ! si... >N. T. cast@ 2e5i ^'. (6 ,. '. Ca pregatirea "n"i ape! !a f"nctie se face c pie a fiecar"i para+etr" act"a! a$ica t ate treceri!e $e arg"+ente in C se fac prin 2a! are. O f"nctie p ate + $ifica 2a! rea para+etri! r sai f r+a!i6 $ar aceste + $ificari n" actea5a 2a! area para+etri! r act"a!i PMai +"!t se p ate trece "n p inter c" s"*inte!es"! f"nctia p ate + $ifica 2a! area *iect"!"i spre care p inter"! in$ica. Un n"+e $e ta*! " este e4presie p inter. Or$inea $e e2a!"are a arg"+ente! r este ne$efinita $e catre !i+*aF=a se n ta ca $ifera $e !a c +pi!er !a c +pi!er. 8"nt per+ise ape!"ri rec"rsi2e !a rice f"nctie. O e4presie pri+ara "r+ata $e "n p"nct "r+at $e "n i$entificat r este e4presie. Pri+a e4presie tre*"ie sa fie !2a! are "n signe$ a str"ct"rii sa" re"ni"ne iar i$entificat r"! tre*"ie sa fie "n +e+*r" a str"ct"rii sa" re"ni"nii. Re5"!tat"! este !2a! are referin$ +e+*r"! n"+it a! str"ct"rii sa" re"ni"nii. O e4presie pri+ara "r+ata $e sageata >care se c nstr"ieste $in 1si Z@ "r+ata $e "n i$entificat r este e4presie. Pri+a e4presie tre*"ie sa fie "n p inter !a str"ct"ra sa" !a re"ni"ne si i$entificat r"! tre*"ie sa n"+easca "n +e+*r" a! ace!ei str"ct"ri sa" re"ni"ni. Re5"!tat"! este !2a! are care referea5a +e+*r"! n"+it a! str"ct"rii sa" re"ni"nii catre care p inter"! e4presiei p"nctea5a. 0stfe! [e4presia 7&1ZMO8 este i$entica c" >U7&@. MO8. 8tr"ct"ri!e si re"ni"ni!e se $isc"ta in ^,. .. Reg"!i!e $ate aici pentr" "ti!i5area str"ct"ri! r si re"ni"ni! r n" n" s"nt stricte6 $e +aniera care per+ite sa se scape $e +ecanis+"! tip"ri! r. )e5i ^&%.&. '. (. Operat ri "nari 74presii!e c" perat ri "nari se gr"pea5a $e !a $reapta !a stinga. $narE&eMpression: /eMpression NlFal$e
231

&eMpression GeMpression &eMpression 66lFal$e &&lFal$e lFal$e66 lFal$e&& (tEpe&name)eMpression si3eof eMpression si3eof(tEpe&name) Operat r"! U insea+na in$irectJ e4presia tre*"ie sa fie "n p inter si re5"!tat"! este !2a! are care se refera !a *iect"! spre care p intea5a e4presia. Daca tip"! "nei e4presii este ?p inter catre...? tip"! re5"!tat"!"i este ?...?. Re5"!tat"! peratiei ^ este "n p inter catre *iect"! referit prin !2a! are. Daca tip"! !2a! rii este ? ? tip"! re5"!tat"!"i este ?p inter catre...?. Re5"!tat"! "nei peratii este negarea peran$"!"i. 8e rea!i5ea5a c n2ersii!e arit+etice *isn"ite. Negati2"! "nei cantitati este ca!c"!at prin sca$erea 2a! rii sa!e $in ( !a n 6 "n$e ?n? este nr $e *iti pe care se repre5inta "n int. N" e4ista perat r"! "nar O. Re5"!tat"! peratiei $e negare ! gica P este & $aca 2a! rea peran$"!"i a f st #6 si # $aca peran$"! este n n15er . Tip"! re5"!tat"!"i este int. Operatia este ap!ica*i!a ricar"i tip $e pernan$ arit+etic sa" p interi! r. O*iect"! referit prin peran$"! !2a! are prece$at $e OO este incre+entat. )a! area este n "a 2a! are a peran$"!"i $ar n" este !2a! are. 74presia O O4 este echi2a!enta c" 4ON&. 0 se 2e$ea a$"narea >^'. %@ si perat rii $e asignare >^'. &%@ pentr" inf r+atii as"pra c n2ersii! r. Operan$"! !2a! rii c" prefi4"! 11 este $ecre+entat ana! g c" OO.

232

Cin$ p stfi4"! OO este ap!icat "nei !2a! ri re5"!tat"! este 2a! rea *iect"!"i referit prin !2a! area. D"pa ce re5"!tat"! este n tat *iect"! este incre+entat in aceeasi +aniera ca pentr" perat r"! prefi4OO. Tip"! re5"!tat"!"i este ace!asi c" tip"! e4presiei !2a! are. Cin$ p stfi4"! 11 este ap!icat "nei !2a! ri re5"!tat"! este 2a! area *iect"!"i referit prin !2a! are. D"pa n tarea re5"!tat"!"i *iect"! este $ecre+entat in +aniera prefi4"!"i 11.Tip"! re5"!tat"!"i este ace!asi c" tip"! e4presiei !2a! are. O e4presie prece$ata $e "n n"+e $e tip $e $ata in parante5e ca"5ea5a c n2ersia 2a! rii e4presiei in tip"! $e $ata n"+it c nstr"ctia este $en"+ita "n cast >r ! $istri*"tie6 ...@. N"+e!e $e tip"ri $e $ate s"nt $escrise in ^,. '. Operat r"! si5e f pr $"ce +ari+ea in *Ates a pean$"!"i sa". >Un *Ate n" este $efinit $e !i+*aF $ecit in ter+en"! $e 2a! re a !"i si5e f@. Dar in t ate i+p!e+entari!e "n *Ate este spati"! necesar pastrarii "n"i char. 0p!icat "n"i ta*! " re5"!tat"! este n"+ar"! t ta! $e *Ates $in ta*! ". Mari+ea se $eter+ina $in $ec!aratii!e *iecte! r in e4presii. 74presia este se+natic c nstanta intreaga si p ate fi f ! sita ri"n$e este necesara c nstanta. 8e f ! seste !a c +"nicari!e c" s"*pr gra+e ca a! cat ri $e +e+ rie si siste+e $e EE#. Operat r"! si5e f p ate fi ap!icat "n"i n"+e $e tip $e $ata in parante5e. In acest ca5 2a $a +ari+ea in *Ates6 a "n"i *iect $e tip"! in$icat. C nstr"ctia si5e f >tApe@ este & $eci e4presia si5e f>tApe@ 1( este aceeasi c" >si5e f>tApe@@ 1(. '. 3. Operat ri $e in+"!tire Operat rii $e in+"!tire U6 E6 K gr"pea5a $e !a stinga !a $reapta. 8e rea!i5ea5a c n2ersii!e arit+etice "5"a!e. m$ltiplicatiFe&eMpression: eMpression/eMpression
233

eMpression#eMpression eMpression5eMpression Operat r"! *inarU in$ica in+"!tire. Operat r"! U este as ciati2 si e4presii!e c" +ai +"!te in+"!tiri $e ace!asi ni2e! p t fi rearanFate $e c +pi!at r. Operat r"! Ein$ica i+partire. Cin$ se i+part intregi p 5iti2i se face tr"nchiere spre #6 $ar f r+a tr"nchierii este $epen$enta $e +asina $aca "n"! $in peran5i este negati2. Pe t ate +asini!e $isc"tate in acest +an"a! rest"! are se+n"! i+partit r"!"i. T $ea"na este a$e2arat ca >aE*@ U*OaK* este ega! c" a >$aca * e $iferit $e 5er @. Operat r"! K pr $"ce rest"! i+partirii pri+ei e4presii !a a $ "a. 8e rea!i5ea5a c n2ersii!e arit+etice "5"a!e. Operan5ii tre*"ie sa n" fie f! at. '. %. Operat ri a$iti2i Operat rii a$iti2i O si1 gr"pea5a $e !a stinga !a $reapta. 8e rea!i5ea5a c n2ersii!e arit+etice "5"a!e. 74ista cite2a p si*i!itati $e tip a$iti na!e pentr" fiecare perat r. aditiFe&eMpression: eMpression6eMpression eMpression&eMpression Re5"!tat"! peratiei O este s"+a peran5i! r. Un p inter catre "n *iect $intr1"n ta*! " si 2a!are $e rice tip intreg p t fi a$"nate. U!ti+a este in t ate ca5"ri!e c n2ertita intr1"n $ep!asa+ent $e a$resa >N. T. a$$ress ffset@ prin in+"!tirea c" !"ngi+ea *iect"!"i spre care in$ica p inter"!. Re5"!tat"! este "n p inter $e ace!asi tip c" p inter"! rigina! si care in$ica "n a!t *iect $in ace!asi ta*! "6 c resp"n5at r $ep!asat fata $e *iect"! rigina!. Deci $aca P este "n p inter catre "n p inter $intr1"n ta*! " >N. T. arraA@ e4presia PO& este "n p inter catre "r+at r"! e!e+ent > *iect@ $in ta*! ". N" este per+isa a!ta f r+a $e c +*inatie $e tip"ri pentr" p interi.
234

Operat r"! O este as ciati2 si e4presii!e c" a$"nari +"!tip!e !a ace!asi ni2e! p t fi rearanFate $e c +pi!er. Re5"!tat"! perat r"!"i 1 este $ifernta $intre peran5i. 8e rea!i5ea5a c n2ersi arit+etice "5"a!e. In p!"s 2a! re $e rice tip $e intreg p ate fi sca5"ta $intr1"n p inter c" aceeasi c n2ersie ca !a a$"nare. Daca $ i p interi catre *icte $e ace!asi ta*! " s"nt sca5"ti re5"!tat"! este c n2ertit >prin i+partire c" !"ngi+ea *iect!"i@ intr1"n int care repre5inta n"+ar"! $e *icte care separa *icte!e in$icate >p inte$1t @. C n2ersia p ate $a re5"!tate neasteptate6 $aca p interii n" in$ica ecte!e ace!"iasi ta*! " intr"cit p interii chiar spre *iecte $e ace!asi tip n" $ifera printr1"n +"!tip!" a! !"ngi+ii *iecte! r. '. .. Operat ri $e $ep!asare Operat rii $e $ep!asare [[ si ZZ gr"pea5a stinga !a $reapta. 0+*ii fac c n2ersii!e "5"a!e as"pra peran5i! r fiecare tre*"in$ sa fie "n intreg. 0p i peran$"! $in $reapta se cp n2erteste in int= tip"! re5"!tat"!"i este aceea a! peran$"!"i $in stinga. Re5"!tat"! este ne$efinit $aca peran$"! $in $reapta este negati2 sa" Z sa" N c" !"ngi+ea *iect"!"i in *iti. shift&eMpression: eMpression44eMpression eMpression>>eMpression )a! area !"i 7&[[7( este 7& >interpretat ca f r+a $e *iti@ $ep!asat !a stinga= *iti e!i+inati s"nt "+p!"ti c" 5er . )a! area !"i 7&ZZ7( este 7& $ep!asat $reapta c" 7( p 5itii *inare. Dep!asarea !a $reapta este garantat a fi ! gica >c" "+p!ere $e 5er "ri@ $aca 7& n" are se+n= a!tfe! p ate fi >si este !a PDP&&@ arit+etica >c" "+p!erea *it"!"i se+n@. '. /. Operat ri re!ati na!i

235

Operat rii re!ati na!i gr"pea5a stinga !a $reapta $ar acest fapt n" este f arte f ! sit r= a[*[c n" insea+na ceea ce pare. relational&eMpression: eMpression4eMpression eMpression>eMpression eMpression4=eMpression eMpression>=eMpression Operat rii [6 Z6 [N6 ZN $a" # $aca re!atia este fa!sa si & $aca este a$e2arata. Tip"! re5"!tat"!"i este int. 8e fac c n2ersii!e "5"a!e. D i p interi se p t c +para re5"!tat"! $epin$e $e ! catii!e re!ati2e in spati"! $e a$rese a *iecte! r p inate. C +paratia p interi! r este p rta*i!a n"+ai cin$ p interii in$ica spre *iecte $in ace!asi ta*! ".

'. '. Operat ri $e ega!itate eV$alitE&eMpression: eMpression==eMpression eMpressionG=eMpression 8e+n"! NN >ega! c"@ si PN>inega! c" @ s"nt ana! gi perat ri! r re!ati na!i $ar n" a" pri ritate +ai +ica. >a$ica a[*NNc[$ este & $aca a[* si c[$ a" 2a! are a$e2arat@. Un p inter p ate fi c +parat c" "n intreg $ar re5"!tat"! 2a fi $epen$ent $e +asina. C" e4ceptia ca5"!"i cin$ intreg"! este c nstanta #. Un p inter car"ia i s1a asig"rat 2a! rea # se garantea5a ca n" 2a p inta spre nici "n *iect si 2a apare a fi ega! c" #=in "ti!i5area c n2enti na!a "n astfe! $e p inter este c nsi$erat n"!. '. ,. Operat rii si pe *itiJ
236

and eMpression: eMpressionNeMpresion perat r"! ^ este as ciati2 si e4presii!e c ntinin$ ^ p t fi rearanFate 8e rea!i5ea5a c n2ersii!e arit+etice "5"a!e= re5"!tat"! este f"nctia 8I pe *iti6 a ce! r $ i peran5i. Operat r"! se ap!ica n"+ai peran5i! r intregi. '. 3. Operat r"! sa" e4c!"si2 pe *iti eMcl$siFe&or&eMpression: eMpressionWeMpression Operat r"! V este as ciati2 si e4presii!e care c ntin V p t fi rearanFate. 8e rea!i5ea5a c n2ersii!e arit+etice "5"a!e= re5"!tat"! este 80U e4c!"si2 a! ce! r $ i peran5i !a ni2e! $e *it. Operat r"! se ap!ica $ ar peran5i! r intregi. '. &# Operat r"! sa" inc!"si2 incl$siF&or&eMpression: eMpressionLeMpression Operat r"! ] este as ciati2 e4presii!e care1! c ntin p t fi rearanFate. 8e rea!i5ea5a c n2ersii arit+etice "5"a!e= re5"!tat"! este f"nctie 80U inc!"si2 a peran5i! r !a ni2e! $e *it. Operat r"! se ap!ica $ ar peran5i! r intregi. '. &&. Operat r"! si ! gic lo7ical&and&eMpression: eMpressionNNeMpression
237

Operat r"! ^^ gr"pea5a $e !a stinga !a $reapta. 7! $a & $aca a+*ii peran5i s"nt $iferiti $e # a!tfe! $a #. N" ca ^6 ^^ garantea5a e2a!"are $e !a stinga !a $reapta= a! $ i!ea peran$ n" este e2a!"at $aca pri+"! este ega! c" #. Operan5ii p t fi $e tip"ri $iferite $ar fiecare tre*"ie sa fie "n"! $in tip"ri!e f"n$a+enta!e sa" "n p inter. Re5"!tat"! este int $ea"na int. '. &( Operat r"! sa" ! gic lo7ical&or&eMpression: eMpressionLLeMpression Operat r"! ]] perea5a $e !a stinga !a $reapta. 7! $a & $aca "n"! $in peran5i este $iferit $e # si a!tfe! $a #. N" ca ]6 ]] face e2a!"are !a stinga 1Z $reapta6 a! $ i!ea peran$ n" +ai este e2a!"at $aca pri+"! este $iferit $e #. Operan5ii p t fi $e tip"ri $iferite $ar $e tip"ri!e $e *a5a >f"n$a+enta!e@ sa" p interi. Re5"!tat"! este t t$ea"na int. '. &3 Operat r c n$iti na! conditional&eMpression: eMpressionZeMpression:eMpression perea5a $e !a $reaptspre stinga. Pri+a e4presie este e2a!"ata si $aca este n n 5er re5"!tat"! este 2a! area ce!ei $e a $ "a e4presii. 0!tfe! este a! ce!ei $ea treia e4presii. Daca este p si*i! c n2ersii!e arti+etice "5"a!e se fac pentr" a a$"ce a $ "a si a treia e4presie !a "n tip c +"n= se p ate ca "n"! sa fie p inter si ce!a!at 5er 6 si re5"!tat"! are tip"! p inter"!"i. N"+ai e4presii!e a $ "a si a treia s"nt e2a!"ate. '. &%. Operat ri $e atri*"ire
238

Operat rii $e atri*"ire perea5a $e !a $reapta spre stinga. T ate s !icita !2a! are ca pern$ stinga6 iar tip"! "nei e4pesii $e asig"rare este ace!a a! peran$"!"i $in stinga. )a! area este 2a! area st cata in peran$"! $in stinga $"pa ce asig"rarea s1a fac"t. Ce!e $ "a parti a!e "n"i perat r $e asig"rare c +p"s s"nt e!e+ente sintactice >at +i@separati. assi7nement&eMpression: lFal$e=eMpression lFal$e6=eMpression lFal$e&=eMpression lFal$e/=eMpression lFal$e#=eMpression lFal$e5=eMpression lFal$e>>=eMpression lFal$e44=eMpression lFal$eN=eMpression lFal$eW=eMpression lFal$eL=eMpression Ca asig"rarea si+p!a c" N 2a! area e4presiei in! c"ieste pe cea a *iect"!"i referit prin !2a! are. Daca a+*ii peran5i s"nt $e tip arit+etic peran$"! $rept se c n2erteste in tip"! ce!"i sting inainte $e asig"rare. C +p rtarea "nei e4presii $f r+a 7& pN7( p ate fi inferre$ !"in$ ca echi2a!ent a! ei 7&N7& p>7(@= ric"+ 7& este e2a!"ata $ ar $ata. Ca ON si 1N peran$"! sting p ate fi "n p ninter in care perna$"! $in $reapta >intreg@ este c n2ertit $"pa c"+ se e4p!ica in ^'. %= t ti perna5ii $in $reapta si t ti perna5ii stingi n n p interi tre*"ie sa fie $e tip arit+etic. C +pi!at are!e per+it ca "n p inter sa fie asignat "n"i intreg6 "n intreg sa fie asignat "n"i p inter si "n p inter sa fie asignat "n"i p inter $e a!t tip. 0signarea este peratia $e c piere p"ra fara c n2ersii. 0ceasta "ti!i5are este nep rta*i!a si p ate pr $"ce p interi care p t ca"5a e4ceptii $e a$resare !a "ti!i5are. 7ste garantata asignarea c nstantei 5er !a "n p inter aceasta pr $"cin$ "n p inter n"! $istinct $e rice p inter spre rice *iect.
239

'. &. Operat r"! 2irg"!a com$nn&eMpression: eMpression, eMpression O pereche $e e4presii separate prin 2irg"!a este e2a!"ata $e !a stinga !a $reapta si 2a! rea e4presiei $in stinga este $ec!asata. Tip"! si 2a! area re5"!tat"!"i s"nt tip"! si 2a! rea peran$"!"i $in $reapta. Operat r"! !"crea5a $e !a stinga !a $reapta. In c nte4t"! "n$e 2irg"!ei i se $a "n inte!es specia!6 $e 4e+p!" intr1 !ista $e arg"+ente pt fc. >^'. &@ sa" !iste $e initia!i5are >^,. /@6 perat r"! 1 2irg"!a $escrisa aici p ate apare $ ar in parante5e6 $e e4e+p!"J f(a, (t=-, t6)), c) are trei arg"+ente6 a! $ i!ea a2in$ 2a! area ..

240

C0PITOCUC , D7CC0R0II Dec!aratii!e s"nt f ! site pentr" a specifica interpretarea pe care C $a fiecar"i i$entificat r= n" fac in + $ necesar si re5er2area $e +e+ rie pt respecti2"! i$entificat r. Dec!aratii!e a" f r+aJ declaration: decl&specifiers declarator&list opt; Dec!arat rii $in !ista $e $ec!arat ri c ntin i$entificat rii $e $ec!arat. 8pecificat rii $e $ec!aratii c nstit"ie sec2enta $e specificat ri $e tip si c!ase $e +e+ rareJ decl&specifiers: tEpe&specifier decl&specifiers opt sc&specifier decl&specifiers opt !ista tre*"ie sa fie "nica >se!f c nsistent@ in e4e+p!"! $escris +ai F s. >N.T. 1scNst rage c!ass@ ,. &. 8pecificat ri $e c!ase $e +e+ rare 0cestia s"ntJ sc&specifier: a$to static eMtern re7ister tEpedef
241

specificat r"! ?tEpedef? n" re5er2a +e+ rie si este n"+it ?specificat r? $e c!asa $e +e+ rie ? $ ar $in + ti2e sintactice= se $iac"ta !a ^,. , sens"ri!e $i2erse! r c!ase! r $e +e+ rare s1a" $isc"tat in ^%. Dec!aratii!e a"t 6 static si register ser2esc ca $efinitii pt ca ca"5ea5a re5er2are $e +e+ rie. Ca e4tern tre*"ie sa e4iste $efinire e4terna >2e5i ^&#@ pt i$entificat ri $ati "n$e2a in afara f"nctiei "n$e ei a" f st $ec!arati. Dec!aratia register este +ai $es 2a5"ta ca $ec!aratie a"t i+pre"na c" a!ertare a c +pi!at r"!"i ca aceste 2arai*i!e 2 r fi "ti!i5ate $es. D ar cite2a $ec!aratii $e acest tip s"nt efecti2e. Mai +"!t $ ar 2arai*i!e!e $e an"+ite tip"ri 2 r fi st cate in registre= !a PDP&& acestea s"nt int6 char si p interi. O a!ta restrictie se refera !a 2aria*i!e!e registr". Operat r"! ^ >care !"crea5a c" a$rese@ n" !i se p ate ap!ica pr gra+e!e create p t $e2eni +ai +ici +ai rapi$e $intr1 "ti!i5are $e $ec!aratii register f ! site c resp"n5at r6 $ar in*"natatiri 2iit are !ae generarii $e c $ p t sa !e faca necesare. Ce! p"tin "n specificat r $e tip +e+ rare p ate fi $at intr1 $ec!arare. Daca !ipseste e! este c nsi$erat a"t in interi r"! f"nctiei6 si e4tern in afara ei. 74ceptieJ f"nctii!e n" s"nt nici $ata a"t +atic. ,. (. 8pecificat ri $e tip tEpe&specifier: char short int lon7 $nsi7ned float do$ble str$ct&or&$nion&specifier
242

tEpedef&name. C"2inte!e ! ng6 sh rt si "nsigne$ p t fi pri2ite ca si a$Fecti2e= "r+at are!e c +*inatii s"nt acepta*i!e. short int lon7 int $nsi7ned int lon7 float 8ens"! "!ti+ei c nstr"ctii este ace!asi c" $ "*!e. 0!tfe! ce! +"!t "n specificat r $e tip p ate fi $at intr1 $ec!aratie. Daca specificat r"! $e tip !ipseste e! este c nsi$erat int. 8pecificat rii $e str"ct"ri si re"ni"ni 2 r fi $isc"tati in ^,. .6 $ec!aratii!e c" tApe$ef s"nt $isc"tate in ^,. ,. ,. 3. Dec!arat ri Cista $e $ec!arat ri care apare intr1 $ec!aratie este sec2enta separata prin 2irg"!a $e $ec!arat ri6 fiecare tre*"in$ sa ai*a initia!i5are. declarator&list: init&declarator init&declarator, declarator&list int&declarator: declarator initialiser opt. Initia!i5at rii s"nt $isc"tati in ^,. /. 8pecificat rii $intr1 $ec!arattie in$ica tip"ri si c!ase $e +e+ rare a *iecte! r !a care se refera $ec!arat rii. Dec!arat rii a" sinta4aJ
243

declarator: identifier (declarator) /declarator declarator() declarator constant&eMpression opt" ;r"parea este ca !a e4presii. ,. %. 8ens"! $ec!arart ri! r -iecare $ec!arat r este afir+atie $e gen"! ca at"nci cin$ c nstr"ctie $e aceeasi f r+a ca si $ec!arat r"! apare intr1 e4presie6 2a pr $"ce "n *iect $e tip"! si c!asa in$icata. -iecare $ec!arat r c ntine $ ar "n i$entificat r=acest i$entificat r se $ec!ara. Daca $ ar "n i$entificat r apare ca $ec!arat r6 at"nci e! 2a a2ea tip"! in$icat $e specificat r"! $e !a incep"t"! $ec!aratiei. Un $ec!arat r in parante5e este i$entic c" "n $ec!arat r fara atri*"te6 $ar a+estecarea $ec!arat ri! r c +p!ecsi p ate fi a!terat prin parante5e. )e5i e4e+p!e!e $e $ec!aratie. 0c"+ sa ne i+agina+ $ec!aratie

C R! "n$e T este "n specificat r $e tip >ca int@ si D& este "n $ec!arat r. 8a pres"p"ne+ ca aceasta $ec!aratie face ca i$entificat r"! >N. T. $in $ec!arat r@ sa ai*e tip"! ?...?"n$e ? ? este g ! $aca D& este $ ar "n i$entificat r p"r si sip+p!" >asa ca tip"! !"i D $in ?int D? este $ ar int @. Daca D& are f r+aJ /R
244

tip"! i$entificat r"!"i c ntin"t este ?...p inter !a T?. Daca D& are f r+a R() at"nci i$entificat r"! c ntin"t are tip"! ?... f"nctie ce ret"rnea5a T. ? Daca D& are f r+a DLc nstant1e4pressi nM... sa" DLM6 at"nci i$entificat r"! c ntin"t are tip"! ?...ta*! " $e T?. In pri+"! ca5 e4presia c nstantei este e4presie a carei 2a! are este $eter+ina*i!a in + +ent"! c +pi!arii si care are tip"! int >e4presii!e c nstanta s"nt $efinite precis in ^&.@. Cin$ +ai +"!te specificatii $e ta*! " s"nt a$iacente se crea5a "n ta*! " +"!ti$i+ensi na!= e4presii!e c nstanta care specifica !i+ite!e ta*! "ri! r p t sa !ipseasca $ ar pentr" pri+"! +e+*r" a! sec2entei. 0ceasta f ra+a este f ! sit are $aca ta*! "! e e4tern si $efinitia act"a!a6 care a! ca spati"6 este t t"si $ata. Pri+a e4presie c ntanta p ate fi +isa $aca $ec!arat r"! este "r+at $e initia!i5are. In acest ca5 +ari+ea se ca!c"!ea5a $in nr e!e+ente preci5ate. Un ta*! " p ate fi c nstit"it $in "n"! $in tip"ri!e $e *a5a prin p interi $intr1 str"ct"ra sa" re"ni"ne6 sa" $in a!t ta*! " >pt a genera ta*! "ri c" $i+ensi"ni +"!tip!e@. N" t ate p si*i!itati!e $ate $e sinta4a s"nt per+ise. Restrictii!e s"nt "r+at are!eJ f"nctii!e n" p t ret"rna ta*! "ri6 str"ct"ri sa" re"ni"ni $ar p t ret"rna p interi spre asa ce 2a= n" e4ista ta*! "ri $e f"nctii $ar p t e4ista ta*! "ri $e p interi spre f"nctii. O str"ct"ra sa" re"ni"ne n" p ate c ntine f"nctie6 $ar p ate c ntine "n p inter !a f"nctie. 74e+p!eJ int i; /ip, f(), /fip(), (/pfi)(); $eca!ara
245

"n intreg i "n p inter ip !a "n intreg f"nctie f care ret"rne5a "n intreg f"nctie fip care ret"rnea5a "n p inter !a "n intreg "n p inter pfi !a f"nctie care re"rnea5a "n intreg 8e c +para "!ti+e!e. Ufip>@ este U>fip>@@ $ec!aratia s"gerea5a si aceiasi c nstr"ctie intr1 e4presie necesita ape!"! f"nctiei fip si ap i in$irectarea spre re5"!tat >p inter@ se pr $"ce "n intreg. >Upfi@>@ in $ec!aratie parante5e!e s"nt necesare ca si intr1 e4presie ca sa in$ice ca in$irectarea prin p interi !a f"nctie pr $"ce f"nctie care este ap i che+ata= 2a ret"rna "n intreg. 0!t e4e+p!"J float fa !'", /afp !'" $ec!ara "n ta*! " $e f! tante si "n ta*! " $e p intere spre n"+ere f! tante. In fina!J static int M-d -" ," '"; $ec!ara "n ta*! " $e intregi6 static6 c" $i+ensi"ni!e 34.4'. In $eta!i" D3$ este "n ta*! " $e 3 artic !e= fiecare artic ! este "n ta*! " $e . ta*! "ri= si fiecare $in "!ti+"! este "n ta*! " $e ' intregi. Oricare $in e4presii!e M-d6 M-d i"6 M-d i" :"6 M-d i" :" k" p ate apare intr1 e4presie. Pri+e!e trei s"nt $e tip ?ta*! "?6 "!ti+a are tip"! int. ,. .. Dec!arat rii $e str"ct"ri si re"ni"ni O str"ct"ra este "n *iect c nstin$ $intr1 sec2enta $e +e+ rii c" n"+e. -iecare +e+*r" p ate a2ea rice tip. O re"ni"ne este "n *iect care6 !a "n + +ent $at6 p ate c ntine pe ricare $in +ai +"!ti +e+*ri. 8pecificat rii $e str"ct"ri si re"ni"ni a" aceeasi f r+aJ
246

str$ct&or&$nion&specifier: str$ct&or&$nion{str$ct&decl&list} str$ct&or&$nion identifier{str$ct&decl&lisBH str$ct&or $nion identifier str$ct&or&$nion str$ct $nion !ista str"ct1$ec!1!ist este sa" "ni"nii. sec2enta $e $ec!arare pentr" +e+*rii str"ct"rii

str$ct&decl&list: str$ct&declaration str$ct&declaration str$ct&decl&list str$ct&declaration: tEpe&specifier str$ct&declarator&list; str$ct&declarator&list: str$ct&declarator str$ct&declarator, str$ct&declarator&list in ca5"! "5"a!6 "n str"ct1$ec!arat r este n"+ai "n $ec!arat r pentr" "n +e+*r" a! "nei str"ct"ri sa" "ni"ni. Un +e+*r" $in str"ct"ra p ate c nsta $intr1"n n"+ar $e *iti. Un astfe! $e +e+*r" se n"+este ci+p >NT fie!$@ !"ngi+ea sa este $espartita $e n"+e!e ci+p"!"i prin ( p"ncteJ str$ctt&declarator: declarator
247

declarator:constant&eMprression :constant&eMpression Intr1 str"ct"ra *iecte!e $ec!arate a" a$rese care cresc pe +as"ra ce $ec!ararea ! r se citeste $e !a stinga !a $reapta. -iecare +e+*r" a! "nei str"ct"ri >care n" e ci+p@ incepe !a !i+ite $e a$rese c resp"n5at are tip"!"i sa"= $ar p t fi ga"ri fara n"+e intr1 str"ctt"ra. M+e*rii $e tip ci++p s"nt i+pachetati in intregi >NT repreentare pe +asina intregi! r @ ei n" stra$!e c"2inte. Un ci+p care n" incape intr1"n c"2int $e +e+ rie se c ntin"a pe "r+at r"!. Un ci+p n" tre*"ie sa $epaseasca "n c"2int >NT ca !"ngi+e G@ Ci+p"ri!e s"nt asig"rate $e !a $reapta !a stinga !a PDP si $e !a stinga !a $reapta pe a!te +asini. Un str"ct1$ec!arat r fara $ec!arat r c ntinin$ $ "a p"ncte si !"ngi+e in$ica "n ci+p fara n"+e f ! sit r pentr" c nf r+ate c" f r+ate!e e4terne6 care se i+p"n. Ca "n ca5 specia!6 "n ci+p c" !"ngi+e# specifica e!i+inarea "r+at r"!"i ci+p !a granita $e c"2int. ?Ur+at r"! ci+p ? este "n ci+p si n" "n +e+*r" r$inar a! str"ct"rii pentr" ca pentr" acest ca5 a!inierea se face a"t +at. Ci+*aF"! n" face restrictie as"pra tip"ri! r $e !"cr"ri care se $ec!ara ca si ci+p"ri6 $ar i+p!e+entari!e n" s"p rta $ecit ci+p"ri $e tip intreg. Chiar si ci+p"ri!e int s"nt c nsi$erate ca fara se+n. Ca PDP ci+p"ri!e n" a" se+n si a" n"+ai 2a! ri intregi. In t ate i+p!e+entari!e n" e4issta ta*! "ri $e ci+p"ri6 astfe! ca perat r"! ^ n" se p ate ap!ica6 nee4istin$ p interi spre ci+p"ri. O "ni"ne p ate fi gin$ita ca str"ct"ra a car r +e+*rii incep c" $ep!aasa+ent"! # si $e $i+ensi"ne s"ficienta pentr" a c ntine pe ricare $in +e+*rii. Ca "n ++ +ent $at $ ar "n +e+*r" este st cat. Un specificat r $e str"ct"ra sa" "ni"ne $e f r+a a (1a6 a$ica str$ct identifier{str$ct&decl&listt} $nion identifier{str$ct&decl&list}
248

$ec!ara i$entificat r"! ca eticheta >+arcaF@ $e str"ct"ra >sa" "ni"ne@ a str"ctt"rii specificate $e !ista. O $ec!aratie $e a treia f r+a str$ct identifier $nion identifier 7tichete!e $e str"ct"ra per+it $efinirea $e str"ct"ri a"t referi*i!e e!e per+it ca partea !"nga a "nei str"ct"ri sa fie $ata $ata si f ! sita $e +ai +"!te ri. 7ste i!ega! a $ec!ara str"ct"ra sa" "ni"ne care face ape! !a ea insasi6 $ar str"ct"ra sa" "ni"ne p ate c ntine "n p inter !a "n ape! spre ea insasi. N"+e!e +e+*ri! r si etichete!e s"nt !a fe! ca pentr" 2aria*i!e!e r$inare $ar sa fie $istincte +"t"a!. D "a str"ct"ri p t f ! si in c +"n sec2enta initia!a $e +e+*ri= a$ica ace!asi +e+*r" apare in $ "a str"ct"ri $iferite $aca a" ace!asi tip in a+*e!e si $aca +e+*rii anteri ri s"nt acesasi in a+*e!e>In + +ent"! $e fata6 c +pi!at r"! 2erfica n"+ai $aca in "n"! $in $ "a str"ct"ri $iferite are ace!asi tip si $ep!asa+ent in a+*e!e6 $ar $aca +e+*rii prece$enti $ifera6 c nstr"cttia este nep rta*i!a @. 74e+p!" si+p!" $e $ec!arare $e str"ct"raJ str$ct tnode{ char tword )%"; int co$nt; str$ct tnode /left; str$ct tnode /ri7ht; }; c ntine 1"n ta*! " $e (# caractere 1"n intreg 1( p interi catre str"ct"ri si+i!are O$ata aceasta $ec!aratie fac"ta6 $ec!aratia
249

str$ct tnode s, /sp; $ec!ara 8 ca fiin$ tip"! $at. str"ct"ra $e tip"! $at si sp "n p inter !a str"ct"ra $e

C" aceste $ec!aratii e4presiaJ sp&>co$nt 8e refera !a ci+p"! c "nt spre care p intea5a sp= s. left 8e refera !a p inter"! s"*ar* re!"i stinga s. ri7ht&>tword %" 8e refera !a pri+"! caracter a! s"*ar* re!"i t9 r$ $in ar* re!"i $rept a! !"i 8. ,./. Initia!i5are Un $ec!arat r p ate specifica 2a! are initia!a pt i$entificat r"! $ec!arat. Initia!i5at r"! este prece$at $e N si c nsta $intr1 e4presie sa" !ista $e 2a! ri in ac !a$e. initiali3er: =eMpression ={initiali3er&list} ={initiali3er&list, } initiali3er&list: eMpression
250

initiali3er&list, initiali3er&list {initiali3er&list} T ate e4presii!e pentr" initia!i5area "nei 2aria*i!e statice sa" e4terne tre*"ie sa fie e4presii $e c nstanta6 $escrise in ^&.6 sa" e4presii care se re$"c !a a$resa 2aria*i!ei $ec!arate anteri r6 c" p si*i!itatea $e a fi $ep!asate printr1 c nstanta. )aria*i!a a"t +atic si register p t fi initia!i5ate c" e4presii ar*itrare care p t c ntine c nstante6 2aria*i!e $ec!arate anteri r si f"nctii. )aria*i!e!e statice si e4terne neinitia!i5ate !a start pri+esc 2a! area 5er . Ce!e a"t +atic si register a" c ntin"t nespecificat >pr *a*i! ?g"n i?@. Cin$ intr1"n initia!i5at r se ap!ica "n"i sca!ar >p inter sa" "n *iect $e tip arit+etic@ e! c nsta $in e4presie sing"!ara p si*i! in parante5e. )a! area initia!a a *iect"!"i se *tine $in e4presie= ace!easi c n2ersii ca pentr" atri*"ire se f ! sesc. Cin$ 2aria*i!a $ec!arata este "n agregat > str"ct"ra sa" ta*! "@ at"nci initia!i5at r"! c nsta $intr1 !ista $e initai!i5at ri separati prin 2irg"!e in parant5e >ac !a$e@ scri si in $inea in care cresc in$icii sa" in rinea +e+*ri! r. Daca n"+ar"! $e initia!i5at ri este +ai +ic $ecit a! +e+*ri! r se i+p"ne rest"! c" #. N" se initia!i5ea5a "ni"ni sa" agregate $e tip a"t +atic. 0c !a$e!e se p t e!i+ina. Daca "n initi!i5at r incepe c" ac !a$e stinga at"nci 2a "r+a !ista $e initia!i5are c" initia!i5at ri $espartiti stinga prin 2irg"!e pentr" +e+*rii agregat"!"i= este er nat sa e4iste +ai +"!ti initia!i5at ri $ecit +e+*ri. Daca initia!i5at r"! n" incepe c" ac !a$a stinga at"nci se ia" $in !ista n"+ar"! necesar $e e!e+ente pentr" agregat"! c"rent6 rest"! !asati !a $isp 5itia agrgat"!"i "r+at r. De e4e+p!"J int M "={!, -, ,}; 4 este $ec!arat si initia!i5at c" "n ta*! " c" +e+*ri.
251

$i+ensi"ne care are trei

}; E -" se inittiali3ea3a c$ %. 0ce!asi efect se *tine c"J float E +" -"={ !, -, ,, ), +, *, -, ,, ' }; Initia!i5area pentr" A incepe c" ac !a$a stinga6 $ar pentr" AL#M n"6 $e ci se f ! sesc trei e!e+ente $in !ista. Ur+at re!e trei s"nt !"ate pentr" AL&M si AL(M. DeciJ float E +" -"={ {!}, {)}, {-}, {+} }; initia!i5ea5a pri+a c ! ana a !"i A >pri2it ca "n ta*! " c" $ "a $i+ensi"ni@ si !asa rest"! pe 5er . 8iJ char ms7 "="sEntaM error on line 5s#n";

float E {!, {), )" {-, si E )"

+" -"={ -, ,}, initiali3ea3a prima linie adica E(%) +, *}, care este E %" %", E %" !" si E %, ,, '}, apoi se initiali3ea3a liniile E !"

arata "n ta*! " $e caractere a car"i +e+*ri s"nt initia!i5ati c" "n sir. ,. '. N"+e $e tip"ri In $ "a c nte4te >pt a se specifica e4p!icit e4presie c" aF"t r"! "nei $istri*"tii >N. T. cast@ si ca si arg"+ent pt si5e f@ este $e $ rit a se specifica
252

n"+e!e "n"i tip $e $ata. 0ceasta se rea!i5ea5a f ! sin$ ?n"+e $e tip? care este in esenta $ec!aratie pt "n *iect $e tip"! respecti2 care +ite n"+e!e *iect"!"i. tEpe&name: tEpe&specifier abstract&declarator. abstract&declarator: emptE (abstract&declarator) /abstract&declarator abstract&declarator() abstract&declarator constant&eMpression opt" Pentr" a se e2ita a+*ig"itatea in c nstr"ctia (abstract&declarator), a*stract1$ec!arat r"! n" tre*"ie sa fie 2i$. C" aceasta restrictie se p ate i$entifica "nic ! catia $in a*stract1$ec!arat r "n$e 2a apare $ec!arat r"! $aca c nstr"ctia a f st "n $ec!arat r intr1 $ec!aratie. Tip"! $e n"+e este ace!asi c" tip"! "n"i i$entificat r ip tetic $e e4e+p!"J int tip&>intre7 int/ pointer la (catre) intre7 int/ -" tablo$ de - pointeri la intre7i int(/) -" pointer la $n tablo$ format din - intre7i int/() f$nctie care ret$rnea3a $n pointer la $n intre7 int(/)() pointer la o f$nctie care ret$rnea3a $n intre7 ,. ,. TApe$ef
253

Dec!aratii!e a car r ?c!asa $e +e+ rare? este tApe$ef n" $efinesc +e+ rie ci $efinesc i$entificat ri care 2 r fi "ti!i5ati "!teri r ca si c"+ ar fi c"2inte cheie $e tip $en"+in$ tip"ri f"n$a+enta!e sa" $eri2ate. tEpedef&name: identifier R r"! "nei $ec!aratii c ntinin$ tApe$ef este ca rice i$entificat r care apare ca parte a ricar"i $ec!arat r $in interi r"! >$ec!aratiei@ $e2ine sintactic echi2a!enta c" c"2inte!e cheie $e tip n"+in$ c"2inte!e $e tip as ciat i$entificat r"!"i in + $"! $esis in ^,..De e4e+p!"6 $"paJ tEpedef int OH<?B, /Y<H2YB0; tEpedef str$ct{do$ble, int;}compleM; C nstr"ctii!e OH<?B distance; eMtern Y<H2YB0 metricp; compleM ), /3p; s"nt $ec!aratii !ega!e= tip"! !"i $istance este int6 a! !"i +etricp este ?p inter !a "n int?6 si a! !"i 5 este str"ct"ra specificata= 5p este p inter !a respecti2a str"ct"ra. tApe$ef n" intr $"ce tip"ri n i6 n"+ai sin ni+e pt tip"ri care se p t specifica si a!tfe!. In e4e+p!"! $istance este c nsi$erat a a2ea e4act ace!asi tip ca rice a!t *iect int.

254

3. 7n"nt"ri C" e4ceptii!e ce 2 r fi in$icate6 en"nt"ri!e se e4ec"ta in sec2enta. 3. &. 7n"nt e4presie M"!te en"nt"ri s"nt en"nt"ri e4presie6 care a" f r+aJ eMpression; In genera! en"nt"ri!e e4presie s"nt asignari sa" ape!"ri $e f"nctie.

3. (. 7n"nt"! c +p"s sa" *! c: 8e pre2e$e en"nt"! c +p"s intr"cit se p t f ! si +ai +"!te en"nt"ri ac ! "n$e este asteptat $ ar "n"!J compo$nd&statement; {declaration&list opt statement&list opt} declaration&list: declaration declaration, declaration&list statement&list statement statement statement&list

255

Daca "n"! $in i$entificat rii $in !ista $e $ec!aratii a f st $ec!arat anteri r6 $ec!aratia e4terna este $eca5"ta pentr" $"rata "n"i *! c6 $"pa care isi ep"i5ea5a f rta. Orice initia!i5are $e 2aria*i!e a"t sa" register se rea!i5ea5a $e fiecare $ata cin$ se intra in *! c !a 2irf"! sa". 7ste p si*i!> $ar este practica rea @ $e a face transfer"! in *! c= in acest ca5 n" se face initia!i5area. Initia!i5area 2aria*i!e! r static se face $ ar $ata6 !a incep"t"! e4ec"tiei pr gra+"!"i. In *! c6 $ec!aratii!e e4tern n" re5er2a +e+ rie astfe! ca initia!i5area n" este per+isa. 3. 3. 7n"nt"ri c n$iti na!e 8"nt ( f r+e $e en"nt"ri c n$iti na!eJ if(eMpresie) statement if(eMpresie) statement else statement In a+*e!e ca5"ri se e2a!"ea5a e4presia si $aca n" s"nt 5er se e4ec"ta pri+"! en"nt. In a! (1!ea ca5 se e4ec"ta a (1a instr"ctie $aca pri+a este ega!a c" 5er . 0+*ig"itatea !"i ?e!se? este re5 !2ata prin c nectarea "n"i ?e!se? c" "!ti+"! ?e!se1!ess if? inti!nit. 3. %. Instr"ctii 9hi!e - r+aJ while(eMpression)statement Instr"ctia $in 9hi!e este e4ec"tat repetat atita ti+p cit 2a! area e4preie ra+ine $iferita $e 5er . Test"! se face inainte $e e4ec"tia instr"ctiei. 3. .. Instr"ctia $ 0re f r+a
256

do statement while(eMpression); Instr"ctia este e4ec"tata repetat pina cin$ 2a! rea e4presiei $e2ine 5er . Test"! se face $"pa fiecare e4ec"tie a instr"ctiei. 3. /. Instr"ctia f r 0re f r+aJ for(eMpression&!opt;eMpression&)opt;eMpression& opt)statement 7ste echi2a!enta c"J eMpression&!; while(eMpression&)){ statement eMpression&-; } Deci pri+a e4presie specifica initia!i5area *"c!ei= a $ "a specifica "n test6 fac"t inaintea fiecarei iteratii6 astfe! ca $in *"c!a se iese cin$ e4presia $e2ine 5er = a 31a e4presie specifica incre+entare care este rea!i5ata $"pa fiecare iteratie. Oricare sa" t ate e4presii!e p t !ipsi. Daca !ipseste a $ "a instr"ctie 9hi!e i+p!icata $e2ine echi2a!enta c" 9hi!e>&@= ce!e!a!te e4presii 2 r !ipsi $in c nstr"ctia $ata. 3. '. Instr"ctia s9itch

257

Instr"ctia s9itch face ca c ntr !"! sa fie transferat !a "na $in +ai +"!te instr"ctii f"nctie $e 2a! area e4presiei. 0re f r+aJ switch(eMpression)statement 8e e4ec"ta c n2ersii!e necesare6 $ar re5"!tat"! tre*"ie sa fie int. Instr"ctia este c +p"sa. Orice instr"ctie $in *! c pate fi etichetata c" "n prefi4 tip case case constant&eMpression "n$e e4presia $e c nstanta 2a fi "n intreg>int@. 7ste inter5isa aparitia a $ "a c nstante pentr" case in aceasi instr"ctie s9itch c" aceeasi 2a! are. C nstante!e se $efinesc precis in ^%. .. P ate e4ista "n prefi4 $e instr"ctie $e f r+a defa$lt: Cin$ se e4ec"ta instr"ctia s9itch6 e4presia se e2a!"ea5a si se c +para c" c nstante!e case. Daca "na este ega!a c" 2a! rea e4presiei6 c ntr !"! se 2a $a !a instr"ctia "r+in$ prefi4"! gasit. Daca n" e4ista instr"ctii c" case1"! ca"tat6 $ar e4ista prefi4"! $efaa"!t6 c ntr !"! se $a !a instr"ctia prefi4ata. In !ipsa prefi4"!"i $efa"!t n" se e4ec"ta nici "na $in instr"cti"ni. case si $efa"!t6 in sine6 n" a!terea5a +ers"! pr gra+"!"i. Iesirea $in s9itch se face c" *rea: >2e5i ^3. ,@ In genera! instr"ctia a! car"i s"*iect este s9itch este "n *! c. Dec!aratii p t apare !a incep"t"! instr"ctiei6 $ar initia!i5area 2aria*i!e! r a"t +atic si register s"nt inefecti2e. 3. ,. Instr"ctia *rea:

258

0re f r+aJ *rea:= si face sa se ter+ine cic!"! ce! +ai intern 9hi!e6 $ 6 f r sa" s9itch. C ntr !"! trece !a instr"ctia care "r+ea5a $"pa instr"cctia $e ter+inare. 3. 3 Instr"ctia c ntin"e 0re f r+aJ contin$e; si face sa se treaca !a c ntin"area in *"c!a a ce!"i +ai intern 9hi!e6 $ sa" f r= a$ica se sare !a sfirsit"! *"c!ei. Mai precis6 in fiecare $in instr"ctii!e while(...) do{ for(...){ ... ... ... contin: ; contin: ; contin: ; } }while(...); } O instrc"tie c ntin"e este echi2a!enta c" g t instr"ctie g a!a@ 3. &#. Instr"ctia ret"rn O f"nctie re2ine !a ape!ant c" instr"ctia ret"rn care are f r+e!eJ ret$rn; ret$rn eMpression; In pri+"! ca5 2a! area ret"rnata n" e $efinita. In a! $ i!ea ca5 2a! area e4presiei este ret"rnata ape!ant"!"i. Daca se cere6 e4presia este cn2ertita6 ca !a asignare6 in ti+p"! f"nctiei in care apare. Oc !irea fina!"!"i "nei f"nctii este echi2a!enta c" neret"rnarea $e 2a! are !a ape!ant. c ntin>D"pa c ntinJ

259

3. &&. Instr"ctia g t C ntr !"! se p ate transfera nec n$iti nat c" aF"t r"! instr"ctieiJ 7oto identifier; I$entificat r"! tre*"ie sa fie 3. &( Instr"ctii etichetate Oricare instr"ctie p ate fi prece$ata $e "n prefi4 eticheta $e f r+a identifier: care ser2este pentr" $ec!ararea i$entificat r"!"i ca si eticheta. Unica "ti!i5are a etichetei este $e tinta a "n"i g t . Bataia "nei etichete este f"nctia c"renta6 e4c!"5in$ s"* *! c"ri!e in care ace!asi i$entificat r p ate fi re$ec!arat. )e5i ^&&. 3. &3 Instr"ctia n"!a 0re f r+a ; 7ste f ! sita pentr" ca p ate p"rta eticheta chiar inainte $e S>N. T. ac !a$a fina!a@ a "nei instr"ctii c +p"se sa" ser2in$ ca si c rp $e instr"ctii n"! "nei instr"ctii $e *"c!are gen 9hi!e. eticheta >2e5i 3. &(@ $in f"nctia c"renta.

260

&#. Definitii e4terne Un pr gra+ C c nsta $intr1 sec2enta $e $efinitii e4terne. O $efinitie e4terna $ec!ara "n i$entificat r ca a2in$ c!asa $e +e+ rare e4tern >in !ipsa specificat r"!"i sa" static6 si "n tip specificatn tip specificat. 8pecificat r"! $e tip >2e5i ,. (@ p ate fi 2i$6 in care ca5 tip"! 2a fi !"at ca si int. Intin$erea "nei $efinitii e4terne persista pina !a sfirsit"! fisier"!"i in care a f st $ec!arata asa c"+ efect"! "nei $ec!aratii persista pina !a sfirsit"! "n"i *! c. 8inta4a $efintii! r e4tern este aceeasi ca a t"t"r r $ec!arat ri! r6 c" e4ceptia ca n"+ai a acest ni2e! p ate fi $at c $"! pentr" f"nctii. &#. &. $efinitii $ef"nctie e4terne Definitii!e $e f"nctii a" f r+aJ f$nction&definition: decl&specifiersopt bodE f$nction&declarator f$nction&

8ing"rii specificat ri $e c!asa $e +e+ rare per+isa in ca$r"! specificat ri! r $e $ec!aratii s"nt e4tern sa" static= a se 2e$ea ^&&. ( pentr" $istinctia $intre e!e. Un $ec!arat r $e f"nctie este si+i!ar c" "n $ec!arat r pentr" ?f"nctie care ret"rnea5a...? c" e4ceptia ca e! !istea5a para+etrii f r+a!i ai f"nctiei $e $efinit. f$nction&declarator: declarator(parameter&listopt) parameter&list: identifier identifier, parameter&list
261

C rp"! f"nctiei are f r+aJ f$nction&bodE: declaration&list compo$nd&statement I$entificat rii $in !ista $e para+etrii6 si n"+ai acesti i$entificat ri6 p t fi $ec!arati in !ista $e $ec!aratii. Orice i$entificat r a! car"i tip n" este $at se c nsi$era a fi $e tip int. 8ing"r"! tip $e c!asa $e +e+ rare care p ate fi specificata este register= $aca aceasta e specificata6 para+etr"! act"a! c resp"n5at r 2a fi c piat6 $aca este p si*i!6 intr1 "n registr" in c $"! c $"!"i f"nctiei. Un e4e+p!" si+p!" $e $efinitie c +p!eta $e f"nctie esteJ int maM(a, b, c) int a, b, c; { int m; m=(a>b)Za:b; ret$rn((m>p)Zm:c); } 0ici int este specificat r $e tip=+a4>a6 *6 c@ este $ec!arat r"! $e f"nctie int a6 *6 c= este !ista $e $ec!aratii pentr" para+etrii f r+a!i= R...S este *! c"! care $a c $"! pentr" instr"ctie. ?C?c n2erteste para+etrii act"a!i $e tip f! at in $ "*!e6 astfe! ca para+etrii f r+a!i $ec!arati f! at isi 2 r a2ea $ec!aratii!e aF"state pentr" a se citi $ "*!e. 0stfe!6 $aca referinta !a "n ta*! " in rice c nte4t >in partic"!ar c" "n para+etr" act"a!@este c nsi$erata a a2ea sens"! "n"i p inter !a pri+"! e!e+ent a! "n"i ta*! "6 $ec!aratii!epara+etri! r f r+a!i $e gen"! ?ta*! " $e...? s"nt aF"state in ?p interi catre...?. In fina!6 intr"cit str"ct"ri!e6 "ni"ni!e si f"nctii!e n" p t fi trec"te "nei f"nctii6 este fara "ti!i5are $ec!ararea ca para+etri f r+a!i a "nei str"ct"ri6 "ni"ni sa" f"nctii >p interii !a astfe! $e *iecte s"nt per+isi@.

262

&#. (. Definitii $e $ate e4terne O $efinitie $e $ata e4terna are f r+aJ data definition: declaration C!asa $e +e+ rare a "nei astfe! $e $ate p ate fi e4tern >in !ipsa@ sa" static $ar n" a"t sa" register.

263

&&. Reg"!i $espre $ +enii Un pr gra+ in C p ate sa n" fie c +pi!at t t $e $ataJ te4t"! s"rsa a! pr gar+"!"i p ate fi pastrat in +ai +"!te fisiere si r"tine prec +pi!ate p t fi incaracte $in *i*!i teci. C +"nicatii!e intre f"nctii!e "n"i pr gra+ p t fi ape!"ri e4p!icite sa" "ti!itare $e $ate e4terne. 74ista ( fe!"riJ pri+"!6 ce ar p"tea fi n"+it *iecti2"! !e4ica! a! "n"i i$entificat r6 care este in esenta regi"nea "n"i pr gra+ in ti+p"! car"ia e! p ate fi f ! sit fara a apare er area $e ?i$entificat r ne$efinit?= si a! (1!ea *iecti2"! as ciat c" i$entificat ri e4terni care se caracteri5ea5a prin reg"!a ca referinta !a ace!asi i$entificat r e4tern s"nt referinte !a ace!asi *iect. &&. & D +eni" !e4ica! O*iecti2"! !e4ica! a! i$entificat ri! r $ec!arati in $efinitii!e e4terne se intin$e $e !a $efinitie pina !a sfirsit"! fisier"!"i s"rsa in care apare. Intin$erea !e4ica!a a in$entificat ri! r care s"nt para+etri f r+a!i persista in f"nctia c" care s"nt as ciati. 8c p"! !e4ica! a! i$entificat ri! r $ec!arati !a incep"t $e *! c tine pina !a sfirsit"! *! c"!"i. Intentia !e4ica!a a etichete! r este in f"nctia in care apar. Intr"cit t ate referinte!e !a ace!asi i$entificat r e4tern se refera !a ace!asi *iect>2e5i &&. (@c +pi!at r"! 2erifica t ate $ec!aratii!e ace!"iasi i$entificat r e4tern pt c +pati*i!itate= $e fapt p"terea ! r se intin$e as"pra intreg"!"i fisier pe care apar. In t ate ca5"ri!e6 $aca "n i$entificat r este e4p!icit $ec!arat !a incep"t"! "n"i *! c6 inc!"5in$ *! c"! care c nstit"e f"nctie6 rice $ec!aratie a! ace!"i i$entificat r in afara *! c"!"i este s"spen$ata pina !a sfirsit"! * c"!"i. De rea+intit >2e5i ,. .@ ca i$entificat rii as ciati c" 2arai*i!e r$inare pe $e parte si acei as ciati c" +e+*rii ai "n r str"ct"ri sa" re"ni"ni pe $e a!ta parte6 f r+ea5a $ "a c!ase $isF"ncte fara c nf!ict intre e!e. Me+*rii >$e re"ni"ni sa" str"ct"ri n. t. @ si etichete!e "r+ea5a ace!easi reg"!i *iect"a!e
264

ca si i$entificat rii= n"+e!e $ec!arate c" tApe$ef s"nt $e aceasi c!asa c" i$entificat rii r$inari. 7i p t fi re$ec!arati in *! c"ri!e interne6 $ar "n tip e4p!icit se 2a $a in $ec!aratia interi ara. tEpedef float distance; ... { a$to int distance; Dec!aratia int tre*"ie sa fie pre5enta in a $ "a $ec!aratie= in ca5 c ntrar 2a fi c nsi$erata fara $ec!arat ri si $e tip"! $istance. &&. (. D +eni"! e4terni! r Daca f"nctie se refera !a "n i$entificat r ca fiin$ e4tern at"nci "n$e2a intre fisiere!e si *i*!i teci!e $in care se c nstit"ie pr gra+"! c +p!et tre*"ie sa fie $ec!aratie e4terna pt ace! i$entificat r ca fiin$ e4terne6 at"nci "n$e2a intre fisiere!e *i*!i teci! r $in care se c nstit"ie pr gra+"! c +p!et tre*"ie sa fie $ec!aratie e4terna pt ace! i$entificat r. T ate f"nctii!e $intr1"n pr gra+ care se refera !a ace!asi i$entificat r e4tern se refera !a ace!asi *iect6 $eci tre*"ie griFa ca tip"! si $i+ensi"nea specificate in $efinitie sa fie c +pati*i!e c" ace!ea specificate $e fiecare f"nctie care face referire !a $ata respecti2a. 0paritia c"2int"!"i cheie e4tern intr1 $efinitie e4terna in$ica ca +e+ ria pt i$entificat rii care se $ec!ara 2a fi a! cata in a!t fisier. D7ci intr1"n pr gra+ +"!tifisier6 $efinitie !a $ate e4terne fara specificat r"! e4tern tre*"ie sa apara e4act intr1"n"! $in fisiere. Oricare a!te fisiere care $ resc sa $ea $efinitie e4terna pt i$entificat r tre*"ie sa inc!"$a e4tern in $efinitie. I$entificat r"! p ate fi initia!i5at n"+ai in $ec!aratia "n$e +e+ ria este a! cata. I$entificat rii $ec!arati static !a ni2e!"! s"peri r $in $efinitii!e e4terne n" s"nt 2i5i*i!e in a!te fisiere. -"nctii!e tre*"ie $ec!arate static.
265

266

&(. Cinii $e c +an$a pt c +pi!at r C +pi!at r"! C c ntine "n prepr ces r capa*i! sa faca +acr s"*stit"tii c +pi!ari c n$iti na!e si inc!"$eri $e fisiere n"+ite. Cinii!e care incep c" W c +"nica c" acest prepr ces r. 0ceste !inii a" sinta4a in$epen$enta $e rest"! !i+*aF"!"i= e!e p t apare ri"n$e si a" efecte c" re+anenta pina !a sfirsit"! fisier"!"i s"rsa. &(. &. In! c"ire $e at +i >N.T. at + e!e+ent sintactic in$epen$ent. 87ns"! n" p ate fi preci5at !a $ata tra$"cerii @ O !inie $e c +an$a $e f r+aJ ;define identifier token&strin7 >$e n tat J fara p"nct 2irg"!a fina!@ face ca prepr ces r"! sa in! c"iasca i$entificat r"! c" sir"! $at $e at +i. O !inie $e f r+a ;define identifier identifier)token&strin7 (identifier, ...,

"n$e n" e4ista spati" intre pri+"! i$entificat r si >6 este +acr $efinitie c" arg"+ente. 74pri+ari!e ce "r+ea5a pri+"!"i i$entificat r "r+at $e >s"nt in! c"ite $e e!e+ente!e sir"!"i specificat in $efinitie. Oricare aparitie a "n"i i$entificat r +enti nat in !ista $e para+etri f r+a!i ai $efinitiei este in! c"it $e sir"! $e e!e+ente >at +i@ $e !a ape!. 0rg"+ente!e $in ape! s"nt sir"ri $e at +i separati prin 2irg"!e= $ar 2irg"!e!e $in sir"ri!e intre ap str afe6 sa" care s"nt pr teFate prin parante5e n" separa arg"+ente. N"+ar"! $e arg"+ente f r+a!e si act"a!e tre*"ie sa fie ace!easi. Te4t"! $intr1"n sir sa" c nstanta caracter n" se in! c"ieste.

267

In a+*e!e f r+e sir"! c" care se face in! c"irea este riscant pentr" i$entificat rii +ai $efiniti. O $efinitie !"nga p ate fi c ntin"ata si pe a!ta !inie scriin$ T !a sfirsit"! !iniei $e c ntin"at. -aci!itatea este 2a! r asa pt $efinirea ?c nstante! r +anifeste ? ;define CPTBHU? !%% int table CPTBHU?"; !inie $e c +an$a $e f r+aJ ;$ndef identifier face ca $efintia pt pr ces r a i$entificat r"!"i sa fie n tata.

&(. (. Inc!"$eri $e fisiere O !inie $e f r+aJ ;incl$de "filename" face ca sa in! c"iasca !inia c" intreg"! c ntin"t a! fisier"!"i ?fi!ena+e ?. N"+e!e este ca"ata +ai intii in $irect r"! fisier"!"i s"ra rigina! si ap i in a!te ! c"ri >*i*!i teci N.T@ stan$ar$. 0!ternati2a este ;incl$de 4filename> ca"ta n"+ai in ! c"ri!e stan$ar$ n" in $irect r"! $in care face parte fisier"! s"rsa. Winc!"$e p ate fi i+*ricat. &(. 3. C +pi!area c n$iti na!a O !inie $e c +an$a $e f r+aJ
268

;if constant&eMpression 2erifica $aca c nstanta >2e5i ^&.@ este n n5er . O !inie $e f r+aJ ;if def identifier 2erifica $aca i$entificat r"! este $efinit in pr ces r6 $eci $aca a f st sa" n" s"*iect"! "nei !inii W$efine. O !inie $e f r+aJ ;ifndef identifier 2erifica $aca i$entificat r"! n" e $efinit in pr ces r. T ate ce!e 3 f r+e s"nt "r+ate $e "n n"+ar $e !inii ar*itrare si p t c ntine !inie $e c +an$a. ;else si ap i !inie $e c +an$a ;endif Daca c n$itia este a$e2arata at"nci !inii!e intre ;else Bi ;end if s"nt ign rate. Daca c n$itia este fa!sa at"nci !inii!e intre test si ;else sa" in !ipsa !"i ;else, ;en$ if s"nt ign rate. &(. %. C ntr !"! !iniei Pentr" *enefici"! a!t r prepr ces are care generea5a pr gar+"! C ;line constnat identifier face ca n"+ar"! !iniei c"rente sa $e2ina ega! c" 2a! area c nstantei iar fisier"! $e intrare c"rent este $en"+it $e i$entificat r. Daca i$entificat r"! este a*sent n"+e!e fisier"!"i +e+ rat n" se schi+*a.
269

270

&3. Dec!aratii i+p!icite N" este t $ea"na necesar sa se specifice atit c!asa $e +e+ rare cit si tip"! i$entificat r"!"i in $ec!aratie. C!asa $e +e+ are se e4trage $in c nte4t"! $efinitii! r e4terne si $in $ec!aratii!e para+etri! r f r+a!i si ai +e+*ri! r $e str"ct"ri. Intr1 $ec!aratie $in interi r"! "nei f"nctii $aca n" se $a c!asa $e +e+ rare sa" tip"!6 i$entificat r"! se pres"p"ne $e tip"! int= $aca se in$ica tip"! $ar n" se in$ica c!asa $e +e+ rare i$entificat r"! se pres"p"ne a fi a"t . O e4ceptie a "!ti+ei reg"!i se face pt f"nctii6 f"nctii!e $e tip a"t nea2in$ sens >C n" e capa*i! sa c +pi!e5e c $"! intr1 sti2a @= $aca tip"! i$entificat r"!"i este ? f"nctia care ret"rnea5a...? e! este i+p!icit $ec!arat e4tern. Intr1 e4presie "n i$entificat r "r+at $e > si ne$ec!arat inca este c nte4t"a! $ec!arat ca fiin$ ?f"nctie care ret"rnea5a "n int ?.

271

&%. Re2e$ere as"pra tip"ri! r 0ceasta secti"ne re5"+a peratii!e care p t fi rea!i5ate as"pra *iecte! r $e $i2erse tip"ri. &%. &. 8tr"ct"ri si "ni"ni 0s"pra "nei str"ct"ri sa" +ari+i se p t face $ "a !"cr"riJ n"+irea >N. T. ape!area@ "nia $in +e+*rii sai > c" aF"t r"! perat r"!"i . @ sa" *tinerea a$resei sa!e >c" aF"t r"! perat r"!"i ^@. 0!te peratii6 c"+ ar fi asig"rarea 2a! rii sa!e sa" "nei 2a! ri sa" trans+iterea !"i ca si para+etr" c n$"c !a "n +esaF $e er are. In 2iit r se prec ni5ea5a ca aceste peratii $ar nenecesar a!te!e sa fie per+ise. ^'. & arata ca intr1 referinta $irecta sa" in$irecta !a str"ct"ra >c" aF"t r"! !"i 1sa" 1Z @ n"+e!e $in $reapta tre*"ie sa fie +e+*r" a! str"ct"rii n"+ite sa" sa fie in$icat >p intat @$e e4presia $in stinga. Ca iesire $in reg"!i!e pri2in$ tip"ri!e aceasta reg"!a pri2in$ restrictia n" este strict restricti2a. De fapt inainte $e. se per+ite !2a! are si acea !2a! are se pres"p"ne a a2ea f r+a str"ct"rii $in care face parte n"+e!e p"s in $reapta > perat r"!"i @. Deci e4presia $in fata !"i 1Z p ate fi p inter sa" intreg. Daca este p inter se pres"p"ne ca in$ica str"ct"ra $in care face parte +e+*r"! $rept. Daca e "n intreg e! 2a fi e4presie $e a$resa a*s !"ta in "nitati $e +e+ rie ai +asinii a! str"ct"rii c resp"n5at are. 0stfe! $e c nstr"ctii n" s"nt p rta*i!e. &%. (. -"nctii C" f"nctie se p t face $ "a !"cr"riJ ape!"! ei sa" *tinirea a$resei ei. Daca n"+e!e "nei f"nctii apare intr1 e4presie si n" in ape!"! $e f"nctie se generea5a "n p inter !a f"nctia respecti2a. Trecerea "nei f"nctii a!teiaJ int f(); . .
272

. 7(f) Definitia !"i 7 2a fiJ 7(f$nctia) int (/f$ncp)(); {... (/f$ncp)(); } De n tat ca f tre*"ie $ec!arata e4p!icit in r"tina ape!anta pt ca aparitia sa in g>f@ n" este "r+ata $e >. &%. 3. Ta*! "ri6 p interi si in$ici De fiecare $ata cin$ "n i$entificat r $e tip"! ta*! " apare intr1 e4presie e! este c n2ertit intr1"n p inter catre pri+"! e!e+ent a! ta*! "!"i. Din ca"5a acestei c n2ersii ta*! "ri!e n" s"nt !a2! ri. Prin $efinitie perat r"! in$ice LM este interpretat $e asa +aniera incit 7&L7(M e i$entic c" U>>7&@O>7(@@. Din ca"5a reg"!i! r $e c n2ersie care se ap!ica !"i O6 $aca 7& este ta*! " si 7( intreg at"nci 7&>7(@ se refera !a a! 7(1!ea +e+*r" a! !"i 7&. Darin ci"$a acestei aparente asi+etrii6 in$icii f r+ea5a peratie c +"tati2a. O reg"!a s ! i$a se ap!ica in ca5"! ta*! "ri! r +"!ti$i+ensi na!e. Daca 7 este "n ta*! " $e r$in"! ?n? si in$ici i4F4...4: at"nci cin$ 7 apare intr1 e4presie e! 2a fi c n2ertit intr1"n p inter !a "n ta*! " c" ?n1&? $i+ensi"ni c" in$ici F4...4:. Daca se ap!ica perat r"! U6 e4p!icit sa" i+p!icit ca re5"!tat a! "ti!i5arii in$ici! r6 re5"!tat"! este "n ta*! " p intat $e n1& $i+ensi"ni6 care este i+e$iat c n2ertit intr1"n p inter. De e4e+p!"J int M -" ,";

273

Un$e 4 este "n ta*! " $e intregi c" 3D. e!e+ente. Cin$ 4 apare intr1 e4presie6 este c n2ertit intr1"n p inter catre>pri+"! $in ce!e 3@ ta*! "! $e . +e+*rii intregi. In e4presia 4LiM6 care e echi2a!enta c" U>4Oi@6 D este +ai intii c n2ertit intr1"n p inter asa c"+ s1a $escris=i este ap i c n2ertit in tip"! !"i 46 care i+p!ica in+"!tirea !"i i c" !"ngi+ea *iect"!"i spre care p intea5a6 a$ica . *iecte intregi.Re5"!tat"! se a$"na si se ap!ica in$irectarea pr $"cin$ "n ta*! ">$e intregi@ care este !a rin$"! sa" transf r+at intr1"n p inter !a pri+"! $intre intregi. Daca +ai este "n in$ice ace!asi pr ce$e" se ap!ica $in n "= ac"+ re5"!tat"! 2a fi "n intreg. Re5"!ta ca in C ta*! "ri!e s"nt st cate pe !inii >"!ti+"! in$ice 2aria5a ce! +ai repe$e @ si ca pri+"! in$ice $in $ec!aratie per+ite sa se $e ter+ine necesar"! $e +e+ rie $ar n" are a!t r ! in ca!c"!"! in$ici! r. &%. %. C n2ersii $e p interi e4p!icite Une!e c n2ersii $e p interi s"nt per+ise $ ar a" aspecte $epen$ente $e i+p!e+entare. T ate se specificaprin c n2ersii e4p!icite $e tip ca in ^'. ( si ^,. '. Un p inter se p ate c n2erti in ricare tip $e intreg s"ficient $e +are pentr" a1! pastra. Dar a "ti!i5a int sa" ! ng este $epen$ent $e +asina. -"nctii!e $e +apare s"nt $epen$ente $e6 $ar n" 2 r s"rprin$e pe aceea care c"n sc str"ct"ra $e a$resare a +asinii. Deta!ii se $a" +ai F s. Un *iect $e tip intreg p ate fi c n2ertit e4p!icit in p interi. Maparea face ca "n intreg c n2ertit $in p inter sa $ea ace!asi p inter6 $epin5in$ $e +asina. Un p inter catre "n tip p ate fi c n2ertit intr1"n p inter !a a!t tip. P inter"! re5"!tat $a e4ceptii $e a$resare !a f ! sire $aca p inter"! s"*iect n" se refera !a "n *iect a!iniat c resp"n5at r in +e+ rie. 8e garantea5a ca "n p inter !a "n *iect $e +ari+e $ata p ate fi c n2ertit intr1"n p inter catre "n *iect +ai +ic in $i+ensi"ne si inap i fara + $ificari.

274

De e4e+p!"6 r"tina $e a! care $e +e+ rie p ate accepta +ari+e >in *iti6 a "n"i *iect $e a! cat si sa ret"rne5e "n p inter char= acesta p"tin$ fi f ! sit c nf r+ sc p"!"i. eMtern char /alloc(); do$ble /dp; dp=(do$ble/)alloc(si3eof(do$ble)); /dp=)). %#'. %; a!! c tre*"ie sa asig"re >$e +aniera $epen$enta $e +asina@ ca 2a! area pe care ret"rnea5a este c resp"n5at are c nn2ersiei intr1"n p inter catre $ "*!e [ at"nci "ti!i5area f"nctiei este p rta*i!a. Repre5entarea p inter"!"i !a PDP1&& este "n intreg $e &/ *iti si se +as ara in *Ates= chars n" necesita a!iniere specia!a= rice a!tce2a tre*"ie sa ai*a a$resa para. Pe I neA9e!! "n p inter are 3/ $e *iti si e intreg= a$resa $e c"2int e pe cei &, *iti $in stinga6 iar *itii care se!ectea5a caracter"! $in c"2int in partea $reapta= $eci p interii char s"nt +as"rati in "nitati $e ( !a &/ *Ates= rice a!tce2a in "nitati $e ( !a &, c"2inte= $ "*!e si agregate!e care !e c ntin tre*"ie sa fie !a a$resa $e c"2int para. IBM 3'# si Inter$ata ,E3( s"nt si+i!are. Ca a+*e!e a$rese!e se +as ara in *Ates= *iecte!e e!e+entare s"nt a!iniate !a !i+ite ega!e c" !"ngi+ea ! r= p interi catre sh rt sint# + $ (6 catre int sa" f! at # + $ % si !a $ "*!e # + $ ,. 0gregate!e s"nt a!iniate !a !i+ite!e stricte necesitate $e c nstit"enti.

275

&.. 74presii ?c nstante? In +"!te ! c"ri C necesita e4presii care $a" c nstantaJ $"pa case6 ca !i+ite $e ta*! "ri6 !a initia!i5ari. In pri+e!e (6 e4presii!e p t c"prin$e $ ar c nstante intregi6 c nstante caracter6 e4presii tip si5e f c nectate !a perat rii *inariJ 6 & / # 5 N \ W 44 >> == G= 4> 4= >= 8a" prin perat rii "nariJ & X 8a" prin perat r"! ternarJ Z : Parante5e!e s"nt f ! site pt gr"pare6 n" pt ape!"ri $e f"nctii. O !atit"$ine +ai +are per+it initia!i5ari!e= in afara $e e4presii!e c nstante se p ate ap!ica perat r"! "nar ^ !a *iecte e4terne sa" statice6 sa" !a ta*! "ri e4terne sa" statice a2in$ ca in$ici e4presii c nstante. Operat r"! "nar ^ p ate fi ap!icat i+p!icit prin aaparitia $e ta*! "ri fara in$ici sa" f"nctii. Reg"!a $e *a5a este ca initia!i5ari!e c n$"c !a c nstanta sa" !a a$resa a "n"i *iect e4tern sa" static p!"s sa" +in"s c nstanta.

276

&/. C nsi$eratii $e p rta*i!itate Une!e parti $in C s"nt inerent $epen$ente $e +asina. Cista care "r+ea5a c ntine s"rse!e $e pr r*!e+e ce!e +ai i+p rtanteJ C"ngi+ea c"2int"!"i $e +e+ rie si pr prietatea arit+eticei in )- sa" i+partirea intregi! r a" $ 2e$it in practica ca n" s"nt pr *!e+a. 0!te fatete a!e har$9are1"!"i s"nt ref!ectate in $i2erse!e i+p!e+entari. Une!e $in e!e6 ca e4tensia $e se+n > c n2ertirea "n"i caracter negati2 intr1"n inttreg@ si r$inea *Ate! r in c"2int6 s"nt nep!aceri care tre*"ie *ser2ate atent. 0!te!e s"nt pr *!e+e +in re. N"+ar"! $e 2aria*i!e register care p t fi p!asate efecti2 in registre $epin$ $e !a +asina !a +asina6 ca si set"ri $e tip"ri 2a!i$e. C +pi!at are!e fac !"cr"ri!e c resp"n5at r pr priei +asini= $ec!aratii!e register e4cesi2e sa" in2a!i$e s"nt ign rate. Une!e $ific"!tati cresc cin$ se f ! sesc practici $e c $ificare $"*i ase. N" este rec +an$at a se scrie pr gra+e care $epin$ $e aceasta pr prietate. Or$inea $e e2a!"are a arg"+ente! r f"nctii! r n" este specifi cata $e !i+*aF. Ca PDP1&& este $e !a $reapta !a stinga6 !a a!te!e $e !a stinga !a $reapta. Or$inea $e aparitie a efecte! r sec"n$are n" e specificata. Daca c nstante!e caracter s"nt *iecte $e tip"! int6 c nstante!e caracter +"!ticaracter sin per+ise. I+p!e+entarea specifica $epin$e $e +asina pt ca r$inea in care caractere!e s"nt p!asate in c"2int 2aria5a $e !a +asina !a a!ta. Ci+p"ri!e apar in c"2int si caractere!e in intregi $e !a $reapta !a stinga in PDP si $e !a stinga !a $reapta in a!te +asini. 0ceste $iferente s"nt in2i5i*i!e in pr gra+e i5 !ate care n" fac ape! !a $epen$ente $e tip >$e e4e+p!" c n2ersia $in p inter int in p inter char si i+p!e+entarea +e+ riei p intate@ $ar tre*"ie c nsi$erate $aca se $ reste c nf r+area c" + $a!itati!e $e +e+ rare e4terna.

277

Ci+*aF"! acceptat $e $i2erse!e c +pi!at are $ifera p"tin. Dar6 c +pi!at r"! pt PDPN&& f ! sit c"rent n" initia!i5ea5a str"ct"ri $e ci+p"ri $e *iti6 n" accepta perat ri $e asignare in "ne!e c nte4te in care se f ! seste 2a! area asignarii.

278

&'. 0nacr nis+e C este "n !i+*aF in e2 !"tie6 "ne!e c nstr"ctii in2echite p t fi inti!nite in pr gra+e +ai 2echi. Une!e c +pi!at are s"p rta aceste anacr nis+e6 e!e fiin$ pe ca!e $e $isparitie6 ra+inin$ $ ar pr *!e+a p rta*i!itatii. )ersi"ni!e +ai 2echi $e C per+itea" f r+a N p in ! c"! !"i pN pt asignare. 0cestea $"cea" !a a+*ig"itati6 c"+ ar fi M=&! care ac"+ insea+na sca$erea "n"i & $in 46 N si 1 fiin$ a$iacente6 $ar care p ate inse+na si asignarea !"i 1& !"i 4. 8inta4a initia!i5ari! r s1a schi+*at= !a incep"t se+n"! N care an"nta "n initia!i5at r n" era pre5ent6 a$ica in ! c $e int M = !; se f ! sea int M !; + $ificarea s1a fac"t pentr" ca initia!i5area int f(!6)) se+ana c" $ec!aratie $e f"nctie atit $e +"!t incit $eranFa c +pi!at are!e.

279

&,. 8"+ar a! sinta4ei 0cest n"+ar a! sinta4ei C1"!"i are sc p"! $e a aF"ta inte!egerea sa +ai +"!t $ecit $e a $efini e4act !i+*aF"!. &,. &. 74presii 74presii $e *a5a s"ntJ eMpression: primarE /eMpression NeMpression &eMpression GeMpression XeMpression 66lFal$e &&lFal$e lFal$e66 lFal$e&& si3eof eMpression (tEpe&name)eMpression eMpression binop eMpression eMpressionZeMpression:eMpression lFal$e as7nop eMpression eMprerssion, eMpression primarE: identifier constant strin7 (eMpression) primarE(eMpression&listopt)
280

primarE eMpression" lFal$e. identifier primarE&>identifier lFal$e: identifier primarE eMpression" lFal$e. identifier primarE&>identifier /eMpression (lFal$e) Operat rii e4presii! r pri+are () ". &>

a" cea +ai +are pri ritate si gr"pea5a stinga !a $reapta. Operat rii "nariJ / N & G X 66 && si3eof(tEpe&name) a" pri ritatea s"* cea a perat ri! r pri+ari $ar +ai +are $ecit a perat ri! r *inari si gr"pea5a $e !a $reapta !a stinga. Operat rii *inari si perat r"! c n$iti na! gr"pea5a stinga !a $reapta si a" pri rtatea $escrescin$ asa c"+ e in$icat binop: / 6 >> 4 == N W # & 44 G= > 5 4= >=

281

L NN LL ZG Operat rii $e asignare a" aceeasi pri ritate as7nop: = 6= &= /= #=, 5= >>= 44= N= W= \= Operat r"!6 a" cea +ai +ica pri ritate6 gr"pea5a stinga spre $reapta &,. (. Dec!aratii declaration: decl&specifiers init&declarator&listopt; decl&specifiers: tEpe&specifier decl&specifiersopt &specifier decl&specifiersopt sc&specifier: a$to static eMtern re7ister tEpedef tEpe&specifier: char short
282

int lon7 $nsi7ned float do$ble str$ct&or&$nion&specifier tEpedef&name init&declaration&list: init&declarator init&declarator, init&declarator&list init&declarator: declarator initiali3eropt declarator: identifier (declarator) /declarator declarator() declarator constant&eMpressionopt" str$ct&or&$nion&specifier: str$ct{str$ct&decl&list} str$ct identifier{str$ct&decl&list} str$ct identifier $nion{str$ct&decl&list} $nion identifier{str$ct&decl&list} $nion identifier str$ct&decl&list: str$ct&declaration str$ct&declaration str$ct&decl&list
283

str$ct&declaration: tEpe&specifier str$ct&declarator&list; str$ct&declarato&list: str$ct&declarator str$ct&declarator, str$ct&declarator&list str$ct&declarator: declarator declarator:constant&eMpression :constant&eMpression initiali3er: =eMpression ={initiali3er&list} ={initiali3er&list, } initiali3er&list: eMpression initiali3er&list, initiali3er&list {initiali3er&list} tEpe&name: tEpe&specifier abstract&declarator abstract&declarator: emptE (abstract&declarator) /abstract&declarator
284

abstract&declarator() abstract&declarator constant&eMpressionopt" tEpedef&name: identifier &,. 3. 7n"nt"ri compo$nd&statement: {declaration&listopt statement&listopt} declaration&list: declaration declaration declaration&list statement&list statement statement statement&list statement: compo$nd&statement eMpression; if(eMpression)statement if(eMpression)statement else statement while(eMpression)stament do statement while(eMpression); for(eMpression&!opt;eMpression&)opt;eMpression& -opt)statement switch(eMpression)statement case constant&eMpression:statement
285

defa$lt:statement break; contin$e; ret$rn; ret$rn eMpression; 7oto identifier; identifier:statement ; &,. %. Definitii e4terne pro7ram: eMternal&definition eMternal&definition pro7ram eMternal&definition: f$nction&definition data&definition f$nction&definition tEpe&specifieropt f$nction&declarator f$nction&bodE f$nction&declarator declarator(parameter&listopt) parameter&list identifier identifier, parameter&list f$nction&bodE:
286

tEpe&decl&list f$nction&statement f$nction&statement {declaration&listopt statement&list} data&definition eMternopt tEpe&specifieropt init&declarator&listopt staticopt tEpe&specifieropt init&declarator&listopt

&,. .. Prepr ces r ;define identifier token&strin7 ;define identifier(identifier, identifier)token&strin7 ;$ndef identifier ;incl$de "filname" ;incl$de 4filname> ;if constant&eMpression" ;ifdef identifier ;ifndef identifier ;else ;endif ;line constant identifier ...,

287

S-ar putea să vă placă și