You are on page 1of 294

MC LC

Sessions
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Nhng khi nim c bn v ngn ng C Bin v Kiu d liu - L thuyt Bin, Ton t v Kiu d liu Thc hnh Ton t v Biu thc - L thuyt Ton t v Biu thc - Thc hnh Nhp v Xut trong C L thuyt iu kin L thuyt iu kin Thc hnh Vng lp L thuyt Vng lp Thc hnh Mng L thuyt Mng Thc hnh Con tr L thuyt Con tr Thc hnh Hm L thuyt Hm Thc hnh Chui L thuyt Chui Thc hnh Cc Kiu d liu Nng cao v Sp xp L thuyt Cc Kiu d liu Nng cao v Sp xp Thc hnh Qun L Tp Tin L thuyt Qun L Tp Tin Thc hnh

Bi 1
Mc tiu: Kt thc bi hc ny, bn c th:

Nhng khi nim c bn v ngn ng C

Phn bit s khc nhau gia Cu lnh, Chng trnh v Phn mm Bit c qu trnh hnh thnh C Nn dng C khi no v ti sao Nm c cu trc mt chng trnh C Hiu r khi nim gii thut (algorithms) V lu (flowchart) Lit k cc k hiu dng trong lu Gii thiu Ngy nay, khoa hc my tnh thm nhp vo mi lnh vc. T ng ha hin ang l ngnh ch cht iu hng s pht trin th gii. Bt c ngnh ngh no cng cn phi hiu bit t nhiu v Cng ngh Thng tin v lp trnh ni chung. C th, C l mt ngn ng lp trnh cp cao m mi lp trnh vin cn phi bit. V th, trong gio trnh ny, chng ta s nghin cu chi tit cu trc ngn ng C. u tin chng ta tm hiu s khc nhau ca nhng khi nim: Lnh (Command), Chng trnh (Program) v Phn mm (Software). 1.1 Ra lnh cho my tnh lm vic Khi mt my tnh c khi ng, n s t ng thc thi mt s tin trnh v xut kt qu ra mn hnh. iu ny din ra th no? Cu tr li n gin l nh vo H iu hnh ci t bn trong my tnh. H iu hnh (operating system) c xem nh phn mm h thng. Phn mm ny khi ng my tnh v thit lp cc thng s ban u trc khi trao quyn cho ngi dng. lm c iu ny, h iu hnh phi c cu to t mt tp hp cc chng trnh. Mi chng trnh u c gng a ra li gii cho mt hay nhiu bi ton no Mi chng trnh c gng a ra gii php cho mt hay nhiu vn . Mi chng trnh l tp hp cc cu lnh gii quyt mt bi ton c th. Mt nhm lnh to thnh mt chng trnh v mt nhm cc chng trnh to thnh mt phn mm. r hn, chng ta hy xem xt mt th d : Mt ngi bn n nh chng ta chi v c mi mn sa du. Anh ta thy ngon ming v mun xin cng thc lm. Chng ta hng dn cho anh ta lm nh sau : 1. Ly mt t sa. 2. nc p du vo. 3. Trn hn hp ny v lm lnh. By gi nu bn ca chng ta theo nhng ch dn ny, h cng c th to ra mn sa du tuyt vi. Chng ta hy phn tch ch th (lnh) trn Lnh u tin : Lnh ny hon chnh cha ? N c tr li c cu hi ly sa u ?. Lnh th hai : Mt ln na, lnh ny khng ni r nc p du u.

Nhng khi nim c bn ca ngn ng C

May mn l bn ca chng ta thng minh hiu c cng thc pha ch ni trn, d rng cn nhiu im cha r rng. Do vy nu chng ta mun ph bin cch lm, chng ta cn b sung cc bc nh sau : 1. Rt mt ly sa vo my trn. 2. thm vo mt t nc du p. 3. ng np my trn 4. M in v bt u trn 5. Dng my trn li 6. Nu trn u th tt my, ngc li th trn tip. 7. Khi trn xong, rt hn hp vo t v t vo t lnh. 8. lnh mt lc ri ly ra dng. So snh hai cch hng dn nu trn, hng dn th hai chc chn hon chnh, r rng hn, ai cng c th c v hiu c. Tng t, my tnh cng x l d liu da vo tp lnh m n nhn c. ng nhin cc ch th a cho my vi tnh cng cn phi hon chnh v c ngha r rng. Nhng ch th ny cn phi tun th cc quy tc: 1. Tun t 2. C gii hn 3. Chnh xc. Mi ch th trong tp ch th c gi l cu lnh v tp cc cu lnh c gi l chng trnh. Chng ta hy xt trng hp chng trnh hng dn my tnh cng hai s. Cc lnh trong chng trnh c th l : 1. 2. 3. 4. 5. Nhp s th nht v nh n. Nhp s th hai v nh n. Thc hin php cng gia s th nht v s th hai, nh kt qu php cng. Hin th kt qu. Kt thc.

Tp lnh trn tun th tt c cc quy tc cp. V vy, tp lnh ny l mt chng trnh v n s thc hin thnh cng vic cng hai s trn my tnh.

Ghi ch: Kh nng nh ca con ngi c bit n nh l tr nh, kh nng nh d liu c a vo my tnh c gi l b nh. My tnh nhn d liu ti mt thi im v lm vic vi d liu vo thi im khc, ngha l my tnh ghi d liu vo trong b nh ri sau c ra truy xut cc gi tr d liu v lm vic vi chng. Khi khi lng cng vic giao cho my tnh ngy cng nn nhiu v phc tp th tt c cc cu lnh khng th c a vo mt chng trnh, chng cn c chia ra thnh mt s chng trnh nh hn. Tt c cc chng trnh ny cui cng c tch hp li chng c th lm vic vi nhau. Mt tp hp cc chng trnh nh th c gi l phn mm.

Lp trnh c bn C

Mi quan h gia ba khi nim cu lnh, chng trnh v phn mm c th c biu din bng s trong hnh 1.1:

Software

Program 1

Program 2

Commands

Commands

Commands

Hnh 1.1: Phn mm, chng trnh v cu lnh 1.2 Ngn ng C

Vo u nhng nm 70 ti phng th nghim Bell, Dennis Ritchie pht trin ngn ng C. C c s dng ln u trn mt h thng ci t h iu hnh UNIX. C c ngun gc t ngn ng BCPL do Martin Richards pht trin. BCPL sau c Ken Thompson pht trin thnh ngn ng B, y l ngi khi thy ra C. Trong khi BCPL v B khng h tr kiu d liu, th C c nhiu kiu d liu khc nhau. Nhng kiu d liu chnh gm : kiu k t (character), kiu s nguyn (interger) v kiu s thc (float). C lin kt cht ch vi h thng UNIX nhng khng b tri buc vo bt c mt my tnh hay h iu hnh no. C rt hiu qu vit cc chng trnh thuc nhiu nhng lnh vc khc nhau. C cng c dng lp trnh h thng. Mt chng trnh h thng c ngha lin quan n h iu hnh ca my tnh hay nhng tin ch h tr n. H iu hnh (OS), trnh thng dch (Interpreters), trnh son tho (Editors), chng trnh Hp Ng (Assembly) l cc chng trnh h thng. H iu hnh UNIX c pht trin da vo C. C ang c s dng rng ri bi v tnh hiu qu v linh hot. Trnh bin dch (compiler) C c sn cho hu ht cc my tnh. M lnh vit bng C trn my ny c th c bin dch v chy trn my khc ch cn thay i rt t hoc khng thay i g c. Trnh bin dch C dch nhanh v cho ra m i tng khng li. C khi thc thi cng rt nhanh nh hp ng (Assembly). Lp trnh vin c th to ra v bo tr th vin hm m chng s c ti s dng cho chng trnh khc. Do , nhng d n ln c th c qun l d dng m tn rt t cng sc. 1.2.1 C Ngn ng bc trung C c hiu l ngn ng bc trung bi v n kt hp nhng yu t ca nhng ngn ng cp cao v nhng chc nng ca hp ng (ngn ng cp thp). C cho php thao tc trn nhng thnh phn c bn ca my tnh nh bits, bytes, a ch. Hn na, m C rt d di chuyn ngha l phn mm vit cho loi my tnh ny c th chy trn mt loi my tnh khc. Mc d C c nm kiu d liu c bn, nhng n khng c xem ngang hng vi ngn ng cao cp v mt kiu d liu. C cho php chuyn kiu d liu. N cho php thao tc trc tip trn bits, bytes, word v con tr (pointer). V vy, n c dng cho lp trnh mc h thng. 1.2.2 C - Ngn ng cu trc

Nhng khi nim c bn ca ngn ng C

Thut ng ngn ng cu trc khi (block-structured language) khng p dng vi C. Ngn ng cu trc khi cho php th tc (procedures) hay hm (functions) c khai bo bn trong cc th tc v hm khc. C khng cho php vic to hm trong hm nn n khng phi l ngn ng cu trc khi. Tuy nhin, n c xem l ngn ng cu trc v n c nhiu im ging vi ngn ng cu trc ALGOL, Pascal v mt s ngn ng tng t khc. C cho php c s tng hp ca m lnh v d liu. iu ny l mt c im ring bit ca ngn ng cu trc. N lin quan n kh nng tp hp cng nh n du tt c thng tin v cc lnh khi phn cn li ca chng trnh dng cho nhng tc v ring bit. iu ny c th thc hin qua vic dng cc hm hay cc khi m lnh (Code Block). Cc hm c dng nh ngha hay tch ri nhng tc v c yu cu trong chng trnh. iu ny cho php nhng chng trnh hot ng nh trong mt n v thng nht. Khi m lnh l mt nhm cc cu lnh chng trnh c ni kt vi nhau theo mt trt t logic no v cng c xem nh mt n v thng nht. Mt khi m lnh c to bi mt tp hp nhiu cu lnh tun t gia du ngoc m v ng xon nh di y: do { i = i + 1; . . . } while (i < 40); Ngn ng cu trc h tr nhiu cu trc dng cho vng lp (loop) nh l while, do-while, v for. Nhng cu trc lp ny gip lp trnh vin iu khin hng thc thi trong chng trnh. 1.3 Cu trc chng trnh C

C c mt s t kha, chnh xc l 32. Nhng t kha ny kt hp vi c php ca C hnh thnh ngn ng C. Nhng nhiu trnh bin dch cho C thm vo nhng t kha dng cho vic t chc b nh nhng giai on tin x l nht nh. Vi quy tc khi lp trnh C nh sau : Tt c t kha l ch thng (khng in hoa) on m trong chng trnh C c phn bit ch thng v ch hoa. V d : do while th khc vi DO WHILE T kha khng th dng cho cc mc ch khc nh t tn bin (variable name) hoc tn hm (function name) Hm main() lun l hm u tin c gi n khi mt chng trnh bt u chy (chng ta s xem xt k hn phn sau)

Xem xt on m chng trnh: main () { /* This is a sample program */ int i = 0; i = i + 1; . . }

Lp trnh c bn C

Ghi ch: Nhng kha cnh khc nhau ca chng trnh C c xem xt qua on m trn. on m ny xem nh l on m mu, n s c dng li trong sut phn cn li ca gio trnh ny.

1.3.1 nh ngha Hm Chng trnh C c chia thnh tng n v gi l hm. on m mu ch c duy nht mt hm main(). H iu hnh lun trao quyn iu khin cho hm main() khi mt chng trnh C c thc thi. Tn hm lun c theo sau l cp du ngoc n (). Trong du ngoc n c th c hay khng c nhng tham s (parameters). 1.3.2 Du phn cch (Delimiters) Sau nh ngha hm s l du ngoc xon m {. N thng bo im bt u ca hm. Tng t, du ngoc xon ng } sau cu lnh cui trong hm ch ra im kt thc ca hm. Du ngoc xon m nh du im bt u ca mt khi m lnh, du ngoc xon ng nh du im kt thc ca khi m lnh . Trong on m mu c 2 cu lnh gia 2 du ngoc xon. Hn na, i vi hm, du ngoc xon cng dng phn nh nhng on m trong trng hp dng cho cu trc vng lp v lnh iu kin.. 1.3.3 Du kt thc cu lnh (Terminator) Dng int i = 0; trong on m mu l mt cu lnh (statement). Mt cu lnh trong C th c kt thc bng du chm phy (;). C khng hiu vic xung dng dng phm Enter, khong trng dng phm spacebar hay mt khong cch do dng phm tab. C th c nhiu hn mt cu lnh trn cng mt hng nhng mi cu lnh phi c kt thc bng du chm phy. Mt cu lnh khng c kt thc bng du chm phy c xem nh mt cu lnh sai. 1.3.4 Dng ch thch (Comment) Nhng ch thch thng c vit m t cng vic ca mt lnh c bit, mt hm hay ton b chng trnh. Trnh bin dch s khng dch chng. Trong C, ch thch bt u bng k hiu /* v kt thc bng */. Trng hp ch thch c nhiu dng, ta phi ch k hiu kt thc (*/), nu thiu k hiu ny, ton b chng trnh s b coi nh l mt ch thch. Trong on m mu dng ch "This is a sample program" l dng ch thch. Trong trng hp ch thch ch trn mt dng ta c th dng //. V d: int a = 0; // Bin a c khai bo nh l mt kiu s nguyn (interger) 1.3.5 Th vin C (Library) Tt c trnh bin dch C cha mt th vin hm chun dng cho nhng tc v chung. Mt vi b ci t C t th vin trong mt tp tin (file) ln trong khi a s cn li cha n trong nhiu tp tin nh. Khi lp trnh, nhng hm c cha trong th vin c th c dng cho nhiu loi tc v khc nhau. Mt hm (c vit bi mt lp trnh vin) c th c t trong th vin v c dng bi nhiu chng trnh khi c yu cu. Vi trnh bin dch cho php hm c thm vo th vin chun trong khi s khc li yu cu to mt th vin ring. 1.4 Bin dch v thc thi mt chng trnh (Compiling and Running)

Nhng bc khc nhau ca vic dch mt chng trnh C t m ngun thnh m thc thi c thc hin nh sau : Son tho/X l t

Nhng khi nim c bn ca ngn ng C

Ta dng mt trnh x l t (word processor) hay trnh son tho (editor) vit m ngun (source code). C ch chp nhn loi m ngun vit di dng tp tin vn bn chun. Vi trnh bin dch (compiler) cung cp mi trng lp trnh (xem ph lc) gm trnh son tho. M ngun y l on vn bn ca chng trnh m ngi dng c th c. N l u vo ca trnh bin dch C. B tin x l C T m ngun, bc u tin l chuyn n qua b tin x l ca C. B tin x l ny s xem xt nhng cu lnh bt u bng du #. Nhng cu lnh ny gi l cc ch th tin bin dch (directives). iu ny s c gii thch sau. Ch th tin bin dch thng c t ni bt u chng trnh mc d n c th c t bt c ni no khc. Ch th tin bin dch l nhng tn ngn gn c gn cho mt tp m lnh. M ngun m rng C B tin x l ca C khai trin cc ch th tin bin dch v a ra kt qu. y gi l m ngun C m rng, sau n c chuyn cho trnh bin dch C. Trnh bin dch C (Compiler) Trnh bin dch C dch m ngun m rng thnh ngn ng my my tnh hiu c. Nu chng trnh qu ln n c th c chia thnh nhng tp tin ring bit v mi tp tin c th c bin dch ring r. iu ny gip ch khi m mt tp tin b thay i, ton chng trnh khng phi bin dch li. B lin kt (Linker) M i tng cng vi nhng th tc h tr trong th vin chun v nhng hm c dch ring l khc kt ni li bi B lin kt cho ra m c th thc thi c.

Lp trnh c bn C

B np (Loader) M thc thi c thi hnh bi b np ca h thng. Tin trnh trn c m t qua lu 1.2 sau :

# include file
Tp tin thm vo

Source file
Chng trnh gc

Library File
Th vin

Compiler
Trnh bin dch

Other Usergenerated Object File


Cc tp tin thc thi khc ca ngi dng

Object File
Tp tin i tng

Linker
B lin kt

Executable File
Tp tin thc thi

Hnh 1.2: Bin dch v thc thi mt chng trnh

1.5

Cc bc lp trnh gii quyt vn

Chng ta thng gp phi nhng bi ton. gii quyt nhng bi ton , chng ta cn hiu chng trc ri sau mi hoch nh cc bc cn lm . Gi s chng ta mun i t phng hc n qun n t phc v tng hm. thc hin vic ny chng ta cn hiu n ri tm ra cc bc gii quyt trc khi thc thi cc bc : BC 1 : Ri phng BC 2 : n cu thang BC 3 : Xung tng hm BC 4 : i tip n qun n t phc v Th tc trn lit k tp hp cc bc thc hin c xc nh r rng cho vic gii quyt vn . Mt tp hp cc bc nh vy gi l gii thut (Algorithm hay gi vn tt l algo ). Mt gii thut (cn gi l thut ton) c th c nh ngha nh l mt th tc, cng thc hay cch gii quyt vn . N gm mt tp hp cc bc gip t c li gii. Qua phn trn, chng ta thy r rng gii quyt c mt bi ton, trc tin ta phi hiu bi ton , k n chng ta cn tp hp tt c nhng thng tin lin quan ti n. Bc k s l x l nhng mu thng tin . Cui cng, chng ta cho ra li gii ca bi ton .

Nhng khi nim c bn ca ngn ng C

Gii thut chng ta c l mt tp hp cc bc c lit k di dng ngn ng n gin. Rt c th rng cc bc trn do hai ngi khc nhau vit vn tng t nhau nhng ngn ng dng din t cc bc c th khc nhau. Do , cn thit c nhng phng php chun mc cho vic vit gii thut mi ngi d dng hiu n. Chnh v vy , gii thut c vit bng cch dng hai phng php chun l m gi (pseudo code) v lu (flowchart). C hai phng php ny u dng xc nh mt tp hp cc bc cn c thi hnh c c li gii. Lin h ti vn i n qun n t phc v trn, chng ta vch ra mt k hoch (thut ton) n ch. Tuy nhin, n ni, chng ta phi cn thi hnh nhng bc ny tht s. Tng t, m gi v lu ch a ra nhng bc cn lm. Lp trnh vin phi vit m cho vic thc thi nhng bc ny qua vic dng mt ngn ng no . Chi tit v v m gi v lu c trnh by di y. 1.5.1 M gi (pseudo code)

Nh rng m gi khng phi l m tht. M gi s dng mt tp hp nhng t tng t nh m tht nhng n khng th c bin dch v thc thi nh m tht. Chng ta hy xem xt m gi qua v d sau.V d ny s hin th cu 'Hello World!'. V d 1: BEGIN DISPLAY 'Hello World!' END Qua v d trn, mi on m gi phi bt u vi t BEGIN hoc START, v kt thc vi t END hay STOP. hin th gi tr no , t DISPLAY hoc WRITE c dng. Khi gi tr c hin th l mt gi tr hng (khng i), trong trng hp ny l (Hello World), n c t bn trong du nhy. Tng t, nhn mt gi tr ca ngi dng, t INPUT hay READ c dng. hiu iu ny r hn, chng ta xem xt v d 2, v d ny ta s nhp hai s v my s hin th tng ca hai s. V d 2: BEGIN INPUT A, B DISPLAY A + B END Trong on m gi ny, ngi dng nhp vo hai gi tr, hai gi tr ny c lu trong b nh v c th c truy xut nh l A v B theo th t. Nhng v tr c t tn nh vy trong b nh gi l bin. Chi tit v bin s c gii thch trong phn sau ca chng ny. Bc k tip trong on m gi s hin th tng ca hai gi tr trong bin A v B. Tuy nhin, cng on m trn, ta c th b sung lu tng ca hai bin trong mt bin th ba ri hin th gi tr bin ny nh trong v d 3 sau y. V d 3: BEGIN INPUT A, B
8 Lp trnh c bn C

C = A + B DISPLAY C END Mt tp hp nhng ch th hay cc bc trong m gi th c gi chung l mt cu trc. C ba loi cu trc : tun t, chn la v lp li. Trong on m gi ta vit trn,chng ta dng cu trc tun t. Chng c gi nh vy v nhng ch th c thi hnh tun t, ci ny sau ci khc v bt u t im u tin. Hai loi cu trc cn li s c cp trong nhng chng sau. 1.5.2 Lu (Flowcharts)

Mt lu l mt hnh nh minh ho cho gii thut. N v ra biu ca lung ch th hay nhng hot ng trong mt tin trnh. Mi hot ng nh vy c biu din qua nhng k hiu. hiu iu ny r hn, chng ta xem lu trong hnh 1.3 dng hin th thng ip truyn thng Hello World!.
S TA R T

DIS P L AY 'H e ll o W o rld !'

STO P

Hnh 1.3: Lu Lu ging vi on m gi l cng bt u vi t BEGIN hoc START, v kt thc vi t END hay STOP. Tng t, t kha DISPLAY c dng hin th gi tr no n ngi dng. Tuy nhin, y, mi t kha th nm trong nhng k hiu. Nhng k hiu khc nhau mang mt ngha tng ng c trnh by bng trong Hnh 1.4.

Hnh 1.4: K hiu trong lu

Nhng khi nim c bn ca ngn ng C

Ta hy xt lu cho v d 3 nh Hnh 1.5 di y.

K hiu bt u: Dng y bt u lu K hiu xut/nhp: Dng y nhp hai s A, B K hiu x l: Dng y cng hai s K hiu xut/nhp: Dng y hin th tng C K hiu kt thc: Dng y kt thc lu
Hnh 1.5: Lu cng hai s Ti bc m gi tr ca hai bin c cng v gn cho bin th ba th xem nh l mt x l v c trnh by bng mt hnh ch nht. Lu m chng ta xt y l n gin.Thng thng, lu tri rng trn nhiu trang giy. Trong trng hp nh th, biu tng b ni c dng ch im ni ca hai phn trong mt chng trnh nm hai trang k tip nhau. Vng trn ch s ni kt v phi cha k t hoc s nh hnh 1.6. Nh th, chng ta c th to lin kt gia hai lu cha hon chnh.

Hnh 1.6: B ni Bi v lu c s dng vit chng trnh, chng cn c trnh by sao cho mi lp trnh vin hiu chng d dng. Nu c ba lp trnh vin dng ba ngn ng lp trnh khc nhau vit m, bi ton h cn gii quyt phi nh nhau. Trong trng hp ny, m gi a cho lp trnh vin c th ging nhau mc d ngn ng lp trnh h dng v tt nhin l c php c th khc nhau. Nhng kt qu cui cng l mt. Do , cn thit phi hiu r bi ton v m gi phi c vit cn thn. Chng ta cng kt lun rng m gi c lp vi ngn ng lp trnh. Vi im cn thit khc phi ch khi v mt lu : Lc u ch tp trung vo kha cnh logic ca bi ton v v cc lung x l chnh ca lu Mt lu phi c duy nht mt im bt u (START) v mt im kt thc (STOP).

10

Lp trnh c bn C

Khng cn thit phi m t tng bc ca chng trnh trong lu m ch cn cc bc chnh v c ngha cn thit. Chng ta tun theo nhng cu trc tun t, m trong lung thc thi chng trnh i qua tt c cc ch th bt u t ch th u tin. Chng ta c th bt gp cc iu kin trong chng trnh, da trn cc iu kin ny hng thc thi ca chng trnh c th r nhnh. Nhng cu trc cho vic r nhnh nh l cu trc chn la, cu trc iu kin hay r nhnh. Nhng cu trc ny c cp chi tit sau y: Cu trc IF (Nu) Cu trc chn la c bn l cu trc IF. hiu cu trc ny chng ta hy xem xt v d trong khch hng c gim gi nu mua trn 100 ng. Mi ln khch hng tr tin, mt on m chng trnh s kim tra xem lng tin tr c qu 100 ng khng?. Nu ng th th s gim gi 10% ca tng s tin tr, ngc li th khng gim gi. iu ny c minh ha s lc qua m gi nh sau: IF khch hng mua trn 100 th gim gi 10% Cu trc dng y l cu lnh IF. Hnh thc chung cho cu lnh IF (cu trc IF) nh sau: IF iu kin Cc cu lnh END IF Mt cu trc IF bt u l IF theo sau l iu kin. Nu iu kin l ng (tha iu kin) th quyn iu khin s c chuyn n cc cu lnh trong phn thn thc thi. Nu iu kin sai (khng tha iu kin), nhng cu lnh phn thn khng c thc thi v chng trnh nhy n cu lnh sau END IF (chm dt cu trc IF). Cu trc IF phi c kt thc bng END IF. Chng ta xem v d 4 cho cu trc IF. V d 4: Yu cu: Kim xem mt s l chn hay khng v hin th thng ip bo nu ng l s chn, ta x l nh sau : BEGIN INPUT num r = num MOD 2 IF r=0 Display Number is even END IF END on m trn nhp mt s t ngi dng, thc hin ton t MOD (ly phn d) v kim tra xem phn d c bng 0 hay khng. Nu bng 0 hin th thng ip, ngc li thot ra. Lu cho on m gi trn th hin qua hnh 1.7. Phn thn ca cu trc IF

Nhng khi nim c bn ca ngn ng C

11

S TAR T

IN P U T nu m

r = n u m M OD 2

r =0

No

Yes
D IS P LAY "N u m b e r i s E ve n "

S TOP

Hnh 1.7 : Kim tra s chn C php ca lnh IF trong C nh sau: if (iu kin) { Cu lnh } Cu trc IFELSE Trong v d 4, s hay hn nu ta cho ra thng ip bo rng s khng l s chn tc l s l thay v ch thot ra. lm iu ny ta c th thm cu lnh IF khc kim tra xem trng hp s khng chia ht cho 2. Ta xem v d 5. Example 5: BEGIN INPUT num r = num MOD 2 IF r=0 DISPLAY Even number END IF IF r<>0 DISPLAY Odd number END IF END Ngn ng lp trnh cung cp cho chng ta cu trc IFELSE. Dng cu trc ny s hiu qu v tt hn gii quyt vn . Cu trc IF ELSE gip lp trnh vin ch lm mt php so snh v sau thc thi cc bc ty theo kt qu ca php so snh l True (ng) hay False (sai). Cu trc chung ca cu lnh IFELSE nh sau: IF iu kin
12 Lp trnh c bn C

Cu lnh 1 ELSE Cu lnh 2 END IF C php ca cu trc ifelse trong C nh sau: if(iu kin) { Cu lnh 1 } else { Cu lnh 2 } Nu iu kin tha (True), cu lnh 1 c thc thi. Ngc li, cu lnh 2 c thc thi. Khng bao gi c hai c thc thi cng lc. V vy, on m ti u hn cho v d tm s chn c vit ra nh v d 6. V d 6: BEGIN INPUT num r = num MOD 2 IF r = 0 DISPLAY Even Number ELSE DISPLAY Odd Number END IF END Lu cho on m gi trn th hin qua Hnh 1.8.

Nhng khi nim c bn ca ngn ng C

13

S TA R T

IN P U T n u m

r = n um M O D 2

Yes
r = 0

No

D IS P L AY "N u m b e r i s E ve n "

D IS PL A Y " N u m b er is O d d "

S TOP

Hnh 1.8: S chn hay s l a iu kin s dng AND/OR Cu trc IFELSE lm gim phc tp, gia tng tnh hu hiu. mt mc no , n cng nng cao tnh d c ca m. Cc th d IF chng ta cp n thi im ny th kh n gin. Chng ch c mt iu kin trong IF nh gi. Thnh thong chng ta phi kim tra cho hn mt iu kin, th d: xem xt nh cung cp c t MVS (nh cung cp quan trng nht) khng?, mt cng ty s kim tra xem nh cung cp c lm vic vi cng ty t nht 10 nm khng? v c tng doanh thu t nht 5,000,000 khng?. Hai iu kin tha mn th nh cung cp c xem nh l mt MVS. Do ton t AND c th c dng trong cu lnh IF nh trong v d 7 sau: V d 7: BEGIN INPUT yearsWithUs INPUT bizDone IF yearsWithUs >= 10 AND bizDone >=5000000 DISPLAY Classified as an MVS ELSE DISPLAY A little more effort required! END IF END V d 7 cng kh n gin, v n ch c 2 iu kin. tnh hung thc t, chng ta c th c nhiu iu kin cn c kim tra. Nhng chng ta c th d dng dng ton t AND ni nhng iu kin li ging nh ta lm trn. By gi, gi s cng ty trong v d trn i quy nh, h quyt nh a ra iu kin d dng hn. Nh l : Hoc lm vic vi cng ty trn 10 nm hoc c doanh s (gi tr thng mi,giao dch)

14

Lp trnh c bn C

t 5,000,000 tr ln. V v, ta thay th ton t AND bng ton t OR. Nh rng ton t OR cho ra gi tr True (ng) nu ch cn mt iu kin l True. Cu trc IF lng nhau Mt cch khc thc hin v d 7 l s dng cu trc IF lng nhau. Cu trc IF lng nhau l cu lnh IF ny nm trong trong cu lnh IF khc. Chng ta vit li v d 7 s dng cu trc IF lng nhau v d 8 nh sau:

V d 8:
BEGIN INPUT yearsWithUs INPUT bizDone IF yearsWithUs >= 10 IF bizDone >=5000000 DISPLAY Classified as an MVS ELSE DISPLAY A little more effort required! END IF ELSE DISPLAY A little more effort required! END IF END on m trn thc hin cng nhim v nhng khng c AND. Tuy nhin, chng ta c mt lnh IF (kim tra xem bizDone ln hn hoc bng 5,000,000 hay khng?) bn trong lnh IF khc (kim tra xem yearsWithUs ln hn hoc bng 10 hay khng?). Cu lnh IF u tin kim tra iu kin thi gian nh cung cp lm vic vi cng ty c ln hn 10 nm hay khng. Nu di 10 nm (kt qu tr v l False), n s khng cng nhn nh cung cp l mt MVS; Nu tha iu kin n xt cu lnh IF th hai, n s kim tra ti iu kin bizDone ln hn hoc bng 5,000,000 hay khng. Nu tha iu kin (kt qu tr v l True) lc nh cung cp c xem l mt MVS, nu khng th mt thng ip bo rng khng l mt MVS. Lu cho m gi ca v d 8 c trnh by qua hnh 1.9.

Nhng khi nim c bn ca ngn ng C

15

START

INPUT yearsWithUs

INPUT bizDone

Yes
yearsWithUs >= 10

No

Yes
bzDone > 5000000

No

DISPLAY "A little more effort required!"

DISPLAY "Classified as an MVS"

DISPLAY "A little more effort required!"

STOP

Hnh 1.9: Cu lnh IF lng nhau M gi trong trng hp ny ca cu trc IF lng nhau ti v d 8 cha hiu qu. Cu lnh thng bo khng tha iu kin MVS phi vit hai ln. Hn na lp trnh vin phi vit thm m nn trnh bin dch phi xt hai iu kin ca lnh IF, do lng ph thi gian. Ngc li, nu dng ton t AND ch xt ti iu kin ca cu lnh IF mt ln. iu ny khng c ngha l cu trc IF lng nhau ni chung l khng hiu qu. N ty theo tnh hung c th m ta dng n. C khi dng ton t AND hiu qu hn, c khi dng cu trc IF lng nhau hiu qu hn. Chng ta s xt mt v d m dng cu trc IF lng nhau hiu qu hn dng ton t AND. Mt cng ty nh phn lng c bn cho cng nhn da trn tiu chun nh trong bng 1.1.

Grade E E M M

Experience 2 3 2 3
Bng 1.1: Lng c bn

Salary 2000 3000 3000 4000

V vy, nu mt cng nhn c xp loi l E v c hai nm kinh nghim th lng l 2000, nu ba nm kinh nghim th lng l 3000. M gi dng ton t AND cho vn trn nh v d 9:

16

Lp trnh c bn C

V d 9: BEGIN INPUT grade INPUT exp IF grade =E AND exp =2 salary=2000 ELSE IF grade = E AND exp=3 salary=3000 END IF END IF IF grade =M AND exp =2 salary=3000 ELSE IF grade = M AND exp=3 salary=4000 END IF END IF END Cu lnh IF u tin kim tra xp loi v kinh nghim ca cng nhn. Nu xp loi l E v kinh nghim l 2 nm th lng l 2000, ngoi ra nu xp loi E, nhng c 3 nm kinh nghim th lng l 3000. Nu c 2 iu kin khng tha th cu lnh IF th hai cng tng t s kim iu kin xp loi v kinh nghim cho cng nhn phn nh lng. Gi s xp loi ca mt cng nhn l E v c hai nm kinh nghim. Lng ngi s c tnh theo mnh IF u tin. Phn cn li ca cu lnh IF th nht c b qua. Tuy nhin, iu kin ti mnh IF th hai s c xt v tt nhin l khng tha, do n kim tra mnh ELSE ca cu lnh IF th 2 v kt qu cng l False. y qu l nhng bc tha m chng trnh xt qua. Trong v d, ta ch c hai cu lnh IF bi v ta ch xt c hai loi l E v M. Nu c khong 15 loi th s tn thi gian v ti nguyn my tnh cho vic tnh ton tha mc d lng xc nh ti cu lnh IF u tin. y dt khot khng phi l m ngun hiu qu. By gi chng ta xt m gi dng cu trc IF lng nhau c sa i trong v d 10.

Nhng khi nim c bn ca ngn ng C

17

V d 10: BEGIN INPUT grade INPUT exp IF grade=E IF exp=2 salary = 2000 ELSE IF exp=3 salary=3000 END IF END IF ELSE IF grade=M IF exp=2 Salary=3000 ELSE IF exp=3 Salary=4000 END IF END IF END IF END IF END on m trn nhn kh c. Tuy nhin, n em li hiu sut cao hn. Chng ta xt cng v d nh trn. Nu cng nhn c xp loi l E v kinh nghim l 2 nm th lng c tnh l 2000 ngay trong bc u ca cu lnh IF. Sau , chng trnh s thot ra v khng cn thc thi thm bt c lnh ELSE no. Do , khng c s lng ph v on m ny mang li hiu sut cho chng trnh v chng trnh chy nhanh hn. Vng lp Mt chng trnh my tnh l mt tp cc cu lnh s c thc hin tun t. N c th lp li mt s bc vi s ln lp xc nh theo yu cu ca bi ton hoc n khi mt s iu kin nht nh c tha. Chng hn, ta mun vit chng trnh hin th tn ca ta 5 ln. Ta xt m gi di y. V d 11: BEGIN DISPLAY DISPLAY DISPLAY DISPLAY DISPLAY END

Scooby Scooby Scooby Scooby Scooby

Nu hin th tn ta 1000 ln, nu ta vit DISPLAY Scooby 1000 ln th rt tn cng sc. Ta c th tinh gin vn bng cch vit cu lnh DISPLAY ch mt ln, sau t n trong cu trc vng lp, v ch th my tnh thc hin lp 1000 ln cho cu lnh trn.

18

Lp trnh c bn C

Ta xem m gi ca cu trc vng lp trong v d 12 nh sau: V d 12: Do loop 1000 times DISPLAY Scooby End loop Nhng cu lnh nm gia Do loop v End loop (trong v d trn l lnh DISPLAY) c thc thi 1000 ln. Nhng cu lnh ny cng vi cc lnh do loop v end loop c gi l cu trc vng lp. Cu trc vng lp gip lp trnh vin pht trin thnh nhng chng trnh ln trong c th yu cu thc thi hng ngn cu lnh. Do loopend loop l mt dng thc tng qut ca vng lp. V d sau l cch vit khc nhng cng dng cu trc vng lp. V d 13: BEGIN cnt=0 WHILE (cnt < 1000) DO DISPLAY Scooby cnt=cnt+1 END DO END

Lu cho m gi trong v d 13 c v trong Hnh 1.10.

S TA R T

cn t = 0

cn t < 1 0 0 0

Yes

No
D I S P L A Y " S c o ob y "

cn t = c n t + 1

S TO P

Hnh 1.10: Cu trc vng lp Ch rng Hnh 1.10 khng c k hiu c bit no biu din cho vng lp. Chng ta dng k hiu phn nhnh kim tra iu kin v qun l hng i ca ca chng trnh bng cc dng chy (flow_lines).

Nhng khi nim c bn ca ngn ng C

19

Tm tt bi hc Phn mm l mt tp hp cc chng trnh. Mt chng trnh l mt tp hp cc ch th (lnh). Nhng on m lnh l c s cho bt k mt chng trnh C no. Ngn ng C c 32 t kha. Cc bc cn thit gii quyt mt bi ton l nghin cu chi tit bi ton , thu thp thng tin thch hp, x l thng tin v i n kt qu. Mt gii thut l mt danh sch rt gn v logic cc bc gii quyt vn . Gii thut c vit bng m gi hoc lu . M gi l s trnh by ca gii thut trong ngn ng tng t nh m tht Mt lu l s trnh by di dng biu ca mt gii thut. Lu c th chia nh thnh nhiu phn v u ni dng cho vic ni chng li ti ni chng b chia ct. Mt chng trnh c th gp mt iu kin da theo vic thc thi c th c phn theo cc nhnh r khc nhau. Cu trc lnh nh vy gi l cu trc chn la, iu kin hay cu trc r nhnh. Cu trc chn c bn l cu trc IF. Cu trc IF ELSE gip lp trnh vin ch lm so snh n v sau thc thi cc bc ty theo kt qu ca php so snh l True (ng) hay False (sai). Cu trc IF lng nhau l cu lnh IF ny nm trong cu lnh IF khc. Thng thng ta cn lp li mt s bc vi s ln lp xc nh theo yu cu ca bi ton hoc n khi mt s iu kin nht nh c tha. Nhng cu trc gip lm vic ny gi l cu trc vng lp.

20

Lp trnh c bn C

Kim tra tin hc tp 1. C cho php ____________ ca m v d liu. 2. Mt l mt s trnh by dng biu minh ha tnh tun t ca nhng hot ng c thc thi nhm t c mt li gii. 3. Lu gip chng ta xem xt li v g ri chng trnh mt cch d dng. 4. Mt lu c th c tu s im bt u v s im kt thc. (True / False) (True / False)

5. Mt ____ c bn l vic thc thi tun t nhng cu lnh n khi mt iu kin c th no l ng (True) hay sai (False).

Nhng khi nim c bn ca ngn ng C

21

Bi tp t lm 1. Vit mt on m gi v v mt lu nhp mt gi tr l 0 C (Celsius) v chuyn n sang 0F (Fahrenheit). [Hng dn: C/5 = (F-32)/9] 2. Vit mt on m gi v v mt lu nhp im ca mt sinh vin cho cc mn : Vt l, Ha hc, v Sinh hc. Sau hin th im trung bnh v tng ca nhng im ny.

22

Lp trnh c bn C

Bi 2
Mc tiu: Kt thc bi hc ny, bn c th: Hiu v s dng c bin (variables) Phn bit s khc nhau gia bin v hng (constants)

Bin v Kiu d liu

Nm vng v s dng cc kiu d liu khc nhau trong chng trnh C Hiu v s dng cc ton t s hc. Gii thiu Bt c chng trnh ng dng no cn x l d liu cng cn c ni lu tr tm thi d liu y. Ni m d liu c lu tr gi l b nh. Nhng v tr khc nhau trong b nh c th c xc nh bi cc a ch duy nht. Nhng ngn ng lp trnh trc y yu cu lp trnh vin qun l mi v tr nh thng qua a ch, cng nh gi tr lu trong n. Cc lp trnh vin dng nhng a ch ny truy cp hoc thay i ni dung ca cc nh. Khi ngn ng lp trnh pht trin, vic truy cp hay thay i gi tr nh c n gin ho nh s ra i ca khi nim bin . 2.1 Bin (variable) Mt chng trnh ng dng c th qun l nhiu loi d liu. Trong trng hp ny, chng trnh phi ch nh b nh cho mi n v d liu. Khi ch nh b nh, c hai im cn lu nh sau : 1. Bao nhiu b nh s c gn 2. Mi n v d liu c lu tr u trong b nh. Trc y, cc lp trnh vin phi vit chng trnh theo ngn ng my gm cc m 1 v 0. Nu mun lu tr mt gi tr tm thi, v tr chnh xc ni m d liu c lu tr trong b nh my tnh phi c ch nh. V tr ny l mt con s c th, gi l a ch b nh. Cc ngn ng lp trnh hin i cho php chng ta s dng cc tn tng trng gi l bin (variable), ch n mt vng b nh ni m cc gi tr c th c lu tr. Kiu d liu quyt nh tng s b nh c ch nh. Nhng tn c gn cho bin gip chng ta s dng li d liu khi cn n. Chng ta quen vi cch s dng cc k t i din trong mt cng thc. V d, din tch hnh ch nht c tnh bi : Din tch = A = chiu di x chiu rng = L x B Cch tnh li sut n gin c cho nh sau: Tin li = I = S tin ban u x Thi gian x T l/100 = P x T x R /100 Cc k t A, L, B, I, P, T, R l cc bin v l cc k t vit tt i din cho cc gi tr khc nhau.

Bin v Kiu d liu

Xem v d sau y : Tnh tng im cho 5 sinh vin v hin th kt qu. Vic tnh tng c thc hin theo hng dn sau. Hin th gi tr tng ca 24, 56, 72, 36 v 82 Khi gi tr tng c hin th, gi tr ny khng cn c lu trong b nh my tnh. Gi s, nu chng ta mun tnh im trung bnh, th gi tr tng phi c tnh mt ln na. Tt hn l chng ta s lu kt qu vo b nh my tnh, v s ly li n khi cn n. sum = 24 + 56 + 72 + 36 + 82 y, sum l bin c dng cha tng ca 5 s. Khi cn tnh im trung bnh, c th thc hin nh sau: Avg = sum / 5 Trong C, tt c bin cn phi c khai bo trc khi dng chng. Chng ta hy xt v d nhp hai s v hin th tng ca chng trong v d 1. V d 1: BEGIN DISPLAY Enter 2 numbers INPUT A, B C=A+B DISPLAY C END A, B v C trong on m trn l cc bin. Tn bin gip chng ta trnh phi nh a ch ca v tr b nh. Khi on m c vit v thc thi, h iu hnh m nhim vic cp khng gian nh cn trng cho nhng bin ny. H iu hnh nh x mt tn bin n mt v tr xc nh trong b nh ( nh). V tham chiu ti mt gi tr ring bit trong b nh, chng ta ch cn ch ra tn ca bin. Trong v d trn, gi tr ca hai bin c nhp t ngi dng v chng c lu tr ni no trong b nh. Nhng v tr ny c th c truy cp thng qua cc tn bin A v B. Trong bc k tip, gi tr ca hai bin c cng v kt qu c lu trong bin th 3 l bin C. Cui cng, gi tr bin C c hin th. Trong khi mt vi ngn ng lp trnh cho php h iu hnh xa ni dung trong nh v cp pht b nh ny dng li th nhng ngn ng khc nh C yu cu lp trnh vin xa vng nh khng s dng thng qua m chng trnh. Trong c hai trng hp, h iu hnh u lo vic cp pht v thu hi nh. H iu hnh hot ng nh mt giao din gia cc nh v lp trnh vin. Lp trnh vin khng cn lu tm v v tr nh m cho h iu hnh m nhim. Vy vic iu khin b nh (v tr m d liu thch hp lu tr) s do h iu hnh m trch, ch khng phi lp trnh vin. 2.2 Hng (constant)

Trong trng hp ta dng bin, gi tr c lu s thay i. Mt bin tn ti t lc khai bo n khi thot khi phm vi dng n. Nhng cu lnh trong phm vi khi m ny c th truy cp gi tr ca

Lp trnh c bn C

bin, v thm ch c th thay i gi tr ca bin. Trong thc t, i khi cn s dng mt vi khon mc m gi tr ca chng khng bao gi b thay i. Mt hng l mt gi tr khng bao gi b thay i. V d, 5 l mt hng, m gi tr ton hc lun l 5 v khng th b thay i bi bt c ai. Tng t, Black l mt hng, n biu th cho mu en. Khi , 5 c gi l hng s (numeric constant), Black c gi l hng chui (string constant). 2.3 nh danh (Identifier)

Tn ca cc bin (variables), cc hm (functions), cc nhn (labels) v cc i tng khc nhau do ngi dng nh ngha gi l nh danh. Nhng nh danh ny c th cha mt hay nhiu k t. K t u tin ca nh danh phi l mt ch ci hay mt du gch di ( _ ). Cc k t tip theo c th l cc ch ci, cc con s hay du gch di. Arena, s_count, marks40, v class_one l nhng nh danh ng. Cc v d v cc nh danh sai l 1sttest, oh!god, v start... end. Cc nh danh c th c chiu di tu , nhng s k t trong mt bin c nhn din bi trnh bin dch th thay i theo trnh bin dch. V d, nu mt trnh bin dch nhn din 31 con s c ngha u tin cho mt tn nh danh th cc cu sau s hin th cng mt kt qu: y l bin testing.... testing y l bin testing.... testing ... testing Cc nh danh trong C c phn bit ch hoa v ch thng, c th, arena th khc ARENA. 2.3.1 Cc nguyn tc cho vic ch t tn

Cc quy tc t tn bin khc nhau tu ngn ng lp trnh. Tuy nhin, vi quy c chun c tun theo nh : Tn bin phi bt u bng mt k t ch ci. Cc k t theo sau k t u bng mt chui cc ch ci hoc con s v cng c th bao gm k t c bit nh du gch di. Trnh dng k t O ti nhng v tr m c th gy lm ln vi s khng (0) v tng t ch ci l (ch thng ca ch hoa L) c th lm ln vi s 1. Tn ring nn trnh t tn cho bin. Theo tiu chun C cc ch ci thng v hoa th xem nh khc nhau v d. bin ADD, add v Add l khc nhau. Vic phn bit ch hoa v ch thng khc nhau tu theo ngn ng lp trnh. Do , tt nht nn t tn cho bin theo cch thc chun. Tn mt bin nn c ngha, gi t v m t r kiu d liu ca n. V d, nu tm tng ca hai s th tn bin lu tr tng nn t l sum (tng). Nu t tn l s hay ab12 th khng hay lm.

Bin v Kiu d liu

2.3.2

T kha (Keywords)

Tt c cc ngn ng dnh mt s t nht nh cho mc ch ring. Nhng t ny c mt ngha c bit trong ng cnh ca tng ngn ng, v c xem l t kha. Khi t tn cho cc bin, chng ta cn bo m rng khng dng bt c t kha no lm tn bin. Tn kiu d liu tt c c coi l t kha. Do vy, t tn cho mt bin l int s pht sinh mt li, nhng t tn cho bin l integer th khng. Vi ngn ng lp trnh yu cu lp trnh vin ch ra tn ca cc bin cng nh kiu d liu ca n trc khi dng bin tht s. Bc ny c gi l khai bo bin. Ta s ni r bc ny trong phn tip theo khi tho lun v cc kiu d liu. iu quan trng cn nh by gi l bc ny gip h iu hnh tht s cp pht mt khong khng gian vng nh cho bin trc khi bt u s dng n. 2.4 Cc kiu d liu (Data types)

Cc loi d liu khc nhau c lu tr trong bin l : S (Numbers) Cc s nguyn. V d : 10 hay 178993455. Cc s thc. V d : 15.22 hay 15463452.25. Cc s dng. Cc s m.

Tn. V d : John. Gi tr lun l. V d : Y hay N. Khi d liu c lu tr trong cc bin c kiu d liu khc nhau, n yu cu dung lng b nh s khc nhau. Dung lng b nh c ch nh cho mt bin ty thuc vo kiu d liu ca n. ch nh b nh cho mt n v d liu, chng ta phi khai bo mt bin vi mt kiu d liu c th. Khai bo mt bin c ngha l mt vng nh no c gn cho bin. Vng b nh sau ny s c tham chiu thng qua tn ca bin. Dung lng b nh c cp cho bin bi h iu hnh ph thuc vo kiu d liu c lu tr trong bin. V vy, mt kiu d liu s m t loi d liu ph hp vi bin. Dng thc chung cho vic khai bo mt bin: Kiu d liu (Tn bin) Kiu d liu thng c dng trong cc cng c lp trnh c th c phn chia thnh: 1 Kiu d liu s - lu tr gi tr s.
4 Lp trnh c bn C

2 Kiu d liu k t lu tr thng tin m t Nhng kiu d liu ny c th c tn khc nhau trong cc ngn ng lp trnh khc nhau. V d, mt kiu d liu s c gi trong C l int trong khi ti Visual Basic c gi l integer. Tng t, mt kiu d liu k t c t tn l char trong C trong khi trong Visual Basic n c t tn l string. Trong bt c trng hp no, cc d liu c lu tr lun ging nhau. im khc duy nht l cc bin c dng trong mt cng c phi c khai bo theo tn ca kiu d liu c h tr bi chnh cng c . C c 5 kiu d liu c bn. Tt c nhng kiu d liu khc da vo mt trong s nhng kiu ny. 5 kiu d liu l: int l mt s nguyn, v c bn n biu th kch c t nhin ca cc s nguyn (integers). float v double c dng cho cc s c du chm ng. Kiu float (s thc) chim 4 byte v c th c ti 6 con s phn sau du thp phn, trong khi double chim 8 bytes v c th c ti 10 con s phn thp phn. char chim 1 byte v c kh nng lu mt k t n (character). void c dng in hnh khai bo mt hm khng tr v gi tr. iu ny s c ni r hn trong phn hm. Dung lng nh v phm vi gi tr ca nhng kiu ny thay i theo mi loi b x l v vic ci t cc trnh bin dch C khc nhau. Lu : Cc con s du chm ng c dng biu th cc gi tr cn c chnh xc phn thp phn. Kiu d liu int L kiu d liu lu tr d liu s v l mt trong nhng kiu d liu c bn trong bt c ngn ng lp trnh no. N bao gm mt chui ca mt hay nhiu con s. Th d trong C, lu tr mt gi tr s nguyn trong mt bin tn l num, ta khai bo nh sau: int num; Bin num khng th lu tr bt c kiu d liu no nh Alan hay abc. Kiu d liu s ny cho php cc s nguyn trong phm vi -32768 ti 32767 c lu tr. H iu hnh cp pht 16 bit (2 byte) cho mt bin c khai bo kiu int. V d: 12322, 0, -232. Nu chng ta gn gi tr 12322 cho num th bin ny l bin kiu s nguyn v 12322 l hng s nguyn. Kiu d liu s thc (float) Mt bin c kiu d liu s thc c dng lu tr cc gi tr cha phn thp phn. Trnh bin dch phn bit cc kiu d liu float v int. im khc nhau chnh ca chng l kiu d liu int ch bao gm cc s nguyn, trong khi kiu d liu float c th lu gi thm c cc phn s. V d, trong C, lu tr mt gi tr float trong mt bin tn gi l num, vic khai bo s nh sau : float num;

Bin v Kiu d liu

Bin khai bo l kiu d liu float c th lu gi tr thp phn c chnh xc ti 6 con s. Bin ny c cp pht 32 bit (4 byte) ca b nh. V d: 23.05, 56.5, 32. Nu chng ta gn gi tr 23.5 cho num, th bin num l bin s thc v 23.5 l mt hng s thc. Kiu d liu double Kiu d liu double c dng khi gi tr c lu tr vt qu gii hn v dung lng ca kiu d liu float. Bin c kiu d liu l double c th lu tr nhiu hn khong hai ln s cc ch s ca kiu float. S cc ch s chnh xc m kiu d liu float hoc double c th lu tr ty thuc vo h iu hnh c th ca my tnh. Cc con s c lu tr trong kiu d liu float hay double c xem nh nhau trong h thng tnh ton. Tuy nhin, s dng kiu d liu float tit kim b nh mt na so vi kiu d liu double. Kiu d liu double cho php chnh xc cao hn (ti 10 con s). Mt bin khai bo kiu d liu double chim 64 bit (8 byte) trong b nh. Th d trong C, lu tr mt gi tr double cho mt bin tn num, khai bo s nh sau: double num; Nu chng ta gn gi tr 23.34232324 cho num, th bin num l bin kiu double v 23.34232324 l mt hng kiu double. Kiu d liu char Kiu d liu char c dng lu tr mt k t n. Mt kiu d liu char c th lu mt k t n c bao ng trong hai du nhy n (). Th d kiu d liu char nh: a, m, $ %. Ta c th lu tr nhng ch s nh nhng k t bng cch bao chng bn trong cp du nhy n. Khng nn nhm ln chng vi nhng gi tr s. V d, 1, 5 v 9 s khng c nhm ln vi nhng s 1, 5 v 9. Xem xt nhng cu lnh ca m C di y: char gender; gender='M'; Hng u tin khai bo bin gender ca kiu d liu char. Hng th hai lu gi mt gi tr khi to cho n l M. Bin gender l mt bin k t v M l mt hng k t. Bin ny c cp pht 8 bit (1 byte) trong b nh. Kiu d liu void C c mt kiu d liu c bit gi l void. Kiu d liu ny ch cho trnh bin dch C bit rng khng c d liu ca bt c kiu no. Trong C, cc hm s thng tr v d liu thuc mt kiu
6 Lp trnh c bn C

no . Tuy nhin, khi mt hm khng c g tr v, kiu d liu void c s dng ch ra iu ny. 2.4.1 Nhng kiu d liu c bn v dn xut Bn kiu d liu (char, int, float v double) m chng ta tho lun trn c s dng cho vic trnh by d liu thc s trong b nh ca my tnh. Nhng kiu d liu ny c th c sa i sao cho ph hp vi nhng tnh hung khc nhau mt cch chnh xc. Kt qu, chng ta c c cc kiu d liu dn xut t nhng kiu c bn ny. Mt b t (modifier) c s dng thay i kiu d liu c bn nhm ph hp vi cc tnh hung a dng. Ngoi tr kiu void, tt c cc kiu d liu khc c th cho php nhng b t ng trc chng. B t c s dng vi C l signed, unsigned, long v short. Tt c chng c th c p dng cho d liu kiu k t v kiu s nguyn. B t long cng c th c p dng cho double. Mt vi b t nh : 1. unsigned 2. long 3. short khai bo mt bin kiu dn xut, chng ta cn t trc khai bo bin thng thng mt trong nhng t kha ca b t. Mt gii thch chi tit v cc b t ny v cch thc s dng chng c trnh by bn di. Cc kiu c du (signed) v khng du(unsigned) Khi khai bo mt s nguyn, mc nh l mt s nguyn c du. Tnh quan trng nht ca vic dng signed l b sung cho kiu d liu char, v char l kiu khng du theo mc nh. Kiu unsigned ch r rng mt bin ch c th c gi tr dng. B t ny c th c s dng vi kiu d liu int v kiu d liu float. Kiu unsigned c th p dng cho kiu d liu float trong vi trng hp nhng iu ny gim bt tnh kh chuyn (portability) ca m lnh. Vi vic thm t unsigned vo trc kiu d liu int, min gi tr cho nhng s dng c th c tng ln gp i. Ta xem nhng cu lnh ca m C cung cp bn di, n khai bo mt bin theo kiu unsigned int v khi to bin ny c gi tr 23123. unsigned int varNum; varNum = 23123; Ch rng khng gian cp pht cho kiu bin ny vn gi nguyn. Ngha l, bin varNum c cp pht 2 byte nh khi n dng kiu int. Tuy nhin, nhng gi tr m mt kiu unsgned int h tr s nm trong khong t 0 n 65535, thay v l -32768 ti 32767 m kiu int h tr. Theo mc nh, int l mt kiu d liu c du. Cc kiu long v short Chng c s dng khi mt s nguyn c chiu di ngn hn hoc di hn chiu di bnh thng. Mt b t short c p dng cho kiu d liu khi chiu di yu cu ngn hn chiu di s nguyn bnh thng v mt b t long c dng khi chiu di yu cu di hn chiu di s nguyn bnh thng.

Bin v Kiu d liu

B t short c s dng vi kiu d liu int. N sa i kiu d liu int theo hng chim t v tr b nh hn. Bi vy, trong khi mt bin kiu int chim gi 16 bit (2 byte) th mt bin kiu short int (hoc ch l short), chim gi 8 bit (1 byte) v cho php nhng s c trong phm vi t 128 ti 127. B t long c s dng tng ng mt min gi tr rng hn. N c th c s dng vi int cng nh vi kiu d liu double. Khi c s dng vi kiu d liu int, bin chp nhn nhng gi tr s trong khong t -2,147,483,648 n 2,147,483,647 v chim gi 32 bit ( 4 byte). Tng t, kiu long double ca mt bin chim gi 128 bit (16 byte). Mt bin long int c khai bo nh sau: long int varNum; N cng c th c khai bo n gin nh long varNum. Mt s long integer c th c khai bo nh long int hay ch l long. Tng t, ta c short int hay short. Bng di y trnh by phm vi gi tr cho cc kiu d liu khc nhau v s bit n chim gi da theo tiu chun ANSI. Kiu char unsigned signed char int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int float double long double Dung lng xp x (n v l bit) 8 8 8 16 16 16 16 16 16 32 32 32 32 64 128 Phm vi -128 ti 127 0 ti 255 -128 ti 127 -32,768 ti 32,767 0 ti 65,535 Ging nh kiu int -128 ti 127 0 ti 65, 535 Ging nh kiu short int -2,147,483,648 ti 2,147,483,647 Ging nh kiu long int 0 ti 4,294,967,295 6 con s thp phn 10 con s thp phn 10 con s thp phn

Table 2.1: Cc kiu d liu v phm vi Th d sau trnh by cch khai bo nhng kiu d liu trn. V d 2: main() { char abc; int xyz; float length; double area; long liteyrs; short arm; }

/*abc of type character */ /*xyz of type integer */ /*length of type float */ /* area of type double */ /*liteyrs of type long int */ /*arm of type short integer*/

Chng ta xem li v d cng hai s v hin th tng chng trc. M gi nh sau :


8 Lp trnh c bn C

V d 3: BEGIN INPUT A, B C = A + B DISPLAY C END Trong v d ny, cc gi tr cho hai bin A v B c nhp. Cc gi tr c cng v tng c lu cho bin C bng cch dng cu lnh C = A + B. Trong cu lnh ny, A v B l nhng bin v k hiu + gi l ton t. Chng ta s ni v ton t s hc ca C phn sau y. Tuy nhin, c nhng loi ton t khc trong C s c bn ti phn k tip. 2.5 Cc ton t s hc (Arithmetic Operators)

Nhng ton t s hc c s dng thc hin nhng thao tc mang tnh s hc. Chng c chia thnh hai lp : Ton t s hc mt ngi (unary) v ton t s hc hai ngi (binary). Bng 2.2 lit k nhng ton t s hc v chc nng ca chng. Cc ton t mt ngi ++ -Chc nng Ly i s Tng mt gi tr Gim mt gi tr Cc ton t hai ngi + * % / ^ Chc nng Cng Tr Nhn Ly phn d Chia Ly s m

Bng 2.2: Cc ton t s hc v chc nng Cc ton t hai ngi Trong C, cc ton t hai ngi c chc nng ging nh trong cc ngn ng khc. Nhng ton t nh +, -, * v / c th c p dng cho hu ht kiu d liu c sn trong C. Khi ton t / c p dng cho mt s nguyn hoc k t, bt k phn d no s c ct b. V d, 5/2 s bng 2 trong php chia s nguyn. Ton t % s cho ra kt qu l s d ca php chia s nguyn. V d: 5%2 s c kt qu l 1. Tuy nhin, % khng th c s dng vi nhng kiu c du chm ng. Chng ta hy xem xt mt v d ca ton t s m. 9^2 y 9 l c s v 2 l s m. S bn tri ca ^ l c s v s bn phi ^ l s m. Kt qu ca 9^2 l 9*9 = 81. Thm v d khc: 5^3 C ngha l:

Bin v Kiu d liu

5*5*5 Do : 5 ^ 3 = 5 * 5 * 5 = 125. Ghi ch: Nhng ngn ng lp trnh nh Basic, h tr ton t m. Tuy nhin, ANSI C khng h tr k hiu ^ cho php tnh ly tha. Ta c th dng cch khc tnh ly tha trong C l dng hm pow() c nh ngha trong math.h. C php ca n th hin qua v d sau: ... #include<math.h> void main(void) { . /* the following function will calculate x to the power y. */ z = pow(x, y); . } V d sau trnh by tt c ton t hai ngi c dng trong C. Ch rng ta cha ni v hm printf() v getchar(). Chng ta s bn trong nhng phn sau. V d 4: #include<stdio.h> main() { int x,y; x = 5; y = 2; printf("The integers are printf("The addition gives printf("The subtraction gives printf("The multiplication gives printf("The division gives printf("The modulus gives getchar(); } Kt qu l: The The The The The The integers are : addition gives : subtraction gives : multiplication gives : division gives : modulus gives : 5 & 2 7 3 10 2 1

: : : : : :

%d & %d\n", x, y); %d\n", x + y); %d\n", x - y); %d\n", x * y); %d\n", x / y); %d\n", x % y);

Cc ton t mt ngi (unary) Cc ton t mt ngi l ton t tr mt ngi -, ton t tng ++ v ton t gim -- Ton t tr mt ngi

10

Lp trnh c bn C

K hiu ging nh php tr hai ngi. Ly i s ch ra hay thay i du i s ca mt gi tr. V d: a = -75; b = -a; Kt qu ca vic gn trn l a c gn gi tr -75 v b c gn cho gi tr 75 (-(- 75)). Du tr c s dng nh th gi l ton t mt ngi v n ch c mt ton hng. Ni mt cch chnh xc, khng c ton t mt ngi + trong C. V vy, mt lnh gn nh. invld_pls = +50; khi m invld_pls l mt bin s nguyn l khng hp l trong chun ca C. Tuy nhin, nhiu trnh bin dch khng phn i cch dng nh vy. Cc ton t Tng v Gim C bao cha hai ton t hu ch m ta khng tm thy c trong nhng ngn ng my tnh khc. Chng l ++ v --. Ton t ++ thm vo ton hng ca n mt n v, trong khi ton t - gim i ton hng ca n mt n v. C th: x = x + 1; c th c vit l: x++; v: x = x - 1; c th c vit l: x--; C hai ton t ny c th ng trc hoc sau ton hng, chng hn: x = x + 1; c th c vit li l x++ hay ++x; V cng tng t cho ton t --. S khc nhau gia vic x l trc hay sau trong ton t mt ngi tht s c ch khi n c dng trong mt biu thc. Khi ton t ng trc ton hng, C thc hin vic tng hoc gim gi tr trc khi s dng gi tr ca ton hng. y l tin x l (pre-fixing). Nu ton t i sau ton hng, th gi tr ca ton hng c s dng trc khi tng hoc gim gi tr ca n. y l hu x l (post-fixing). Xem xt v d sau :
a = 10; b = 5; c = a * b++;

Bin v Kiu d liu

11

Trong biu thc trn, gi tr hin thi ca b c s dng cho tnh ton v sau gi tr ca b s tng sau. Tc l, c c gn 50 v sau gi tr ca b c tng ln thnh 6. Tuy nhin, nu biu thc trn l: c = a * ++b; th gi tr ca c s l 60, v b s l 6 bi v b c tng 1 trc khi thc hin php nhn vi a, sau gi tr c gn vo c. Trong trng hp m tc ng ca vic tng hay gim l ring l th ton t c th ng trc hoc sau ton hng u c. Hu ht trnh bin dch C sinh m rt nhanh v hiu qu i vi vic tng v gim gi tr. M ny s tt hn so vi khi ta dng ton t gn. V vy, cc ton t tng v gim nn c dng bt c khi no c th.

12

Lp trnh c bn C

Tm tt bi hc Thng thng, khi chng trnh ng dng cn x l d liu, n cn c ni no lu tr tm thi d liu ny. Ni m d liu c lu tr gi l b nh. Cc ngn ng lp trnh hin i ngy nay cho php chng ta s dng cc tn tng trng gi l bin (variable), dng ch n mt vng trong b nh ni m cc gi tr c th c lu tr. Khng c gii hn v s v tr b nh m mt chng trnh c th dng. Mt hng (constant) l mt gi tr khng bao gi b thay i. Tn ca cc bin (variable), cc hm (function), cc nhn (label) v cc i tng khc nhau do ngi dng nh ngha gi l nh danh. Tt c ngn ng dnh mt s t nht nh cho mc ch ring. Nhng t ny c gi l l t kha (keywords). Cc kiu d liu chnh ca C l character, integer, float, double v void. Mt b t c s dng thay i kiu d liu c bn sao cho ph hp vi nhiu tnh hung a dng. Cc b t c s dng trong C l signed, unsigned, long v short. C h tr hai loi ton t s hc: mt ngi v hai ngi. Ton t tng ++ v ton t gim -- l nhng ton t mt ngi. N ch hot ng trn bin kiu s. Ton t hai ngi s hc l +, -, *, /, %, n ch tc ng ln nhng hng s, bin hay biu thc. Ton t phn d % ch p dng trn cc s nguyn v cho kt qu l phn d ca php chia s nguyn.

Bin v Kiu d liu

13

Kim tra tin hc tp 1 2 3 4 5 C c phn bit ch thng v hoa. S 10 l mt _______________. K t u ca nh danh c th l mt s. (True / False) (True / False)

Dng kiu _________ s tit kim b nh do n chim ch na khng gian nh so vi _________. Kiu d liu _______ c dng ch cho trnh bin dch C bit rng khng c gi tr c tr v. _______ v _______ l hai nhm ton t s hc. A. Bitwise & v | C. Lun l AND B. Mt ngi v hai ngi D. Khng cu tr li no c no

Cc ton t mt ngi s hc l __ v __. A. ++ v -C. ^ v $ B. % v ^ D. Khng cu tr li no c

14

Lp trnh c bn C

Bi tp t lm 1. Chn tng ng cho ct A v B: Ct A 8 10.34 ABC abc 23 12112134.86868686886 _A1 $abc A Tn nh danh sai Hng s nguyn Hng k t Double S chm ng Tn nh danh ng Ct B

Hng dn : Nhiu mc trn ct A c th tng ng ti mt mc n ti ct B. 2. Tnh gi tr ca cc bin sau mi cu lnh di y: a. int a = 4^4 b. int a = 23.34 c. a = 10 b = a + a++ d. a = -5 b = -a

Bin v Kiu d liu

15

Bi 3
Mc tiu: Kt thc bi hc ny, bn c th: S dng bin, kiu d liu v biu thc s hc. Phn I Trong thi gian 1 gi 30 pht u: 3.1 Bin

Bin, Ton t v Kiu d liu

Nh chng ta bit, Bin l tn t cho v tr b nh my tnh, c th dng lu tr cc gi tr khc nhau ti nhng thi im khc nhau. Trong chng ny, ch yu chng ta s hc cch to v s dng bin. 3.1.1 To bin To bin bao gm vic to kiu d liu v tn hp l cho bin, v d: int currentVal; Trong v d trn, tn bin l currentVal c kiu d liu l s nguyn (integer). 3.2 Kiu d liu Kiu d liu nh ngha loi gi tr m s c lu trong mt bin no , v d: int currentVal; Trong v d trn int ch rng bin currentVal s lu gi tr kiu s nguyn (integer). 3.3 Biu thc s hc Mt biu thc s hc trong C bao gm mt tn bin nm pha bn tri ca du =, tn bin hoc hng nm bn phi du =. Bin v hng nm bn phi ca du = c ni vi nhau bi nhng ton t s hc nh +, -, *, v /. Th d, delta = alpha * beta / gamma + 3.2 * 2 / 5;

By gi chng ta xt mt chng trnh tnh tin li n gin nh sau V d 1: 1. Gi trnh son tho nhp nhng cu lnh cho chng trnh C. 2. To ra mt tp tin mi. 3. Nhp vo on m sau: #include <stdio.h> void main()

Bin,Ton t v Kiu d liu

41

{ int principal, period; float rate, si; principal = 1000; period = 3; rate = 8.5; si = principal * period * rate / 100; printf(%f, si); } thy kt qu u ra, thc hin tip cc bc sau: 4. Lu tp tin vi tn myprogramI.C. 5. Bin dch tp tin myprogramI.C. 6. Thc thi chng trnh myprogramI.C. 7. Tr v trnh son tho. Mu kt xut cho chng trnh trn nh hnh sau:

Hnh 3.1: Kt qu ca myprogramI.C

V d 2: 1. To mt tp tin mi. 2. G vo m sau: #include <stdio.h> void main() { int a, b, c, sum; printf(\nEnter any three numbers: ); scanf(%d %d %d, &a, &b, &c); sum = a + b + c;

42

Lp trnh c bn C

printf(\n Sum = %d, sum); } 3. Lu tp tin vi tn myprogramII.C. 4. Bin dch tp tin myprogramII.C. 5. Thc thi chng trnh myprogramII.C. 6. Tr v trnh son tho. Mu kt qu u ra ca chng trnh trn nh hnh sau:

Hnh 3.2: Kt qu ca myprogramII.C

Bin,Ton t v Kiu d liu

43

Phn II Trong thi gian 30 pht k tip: 1. Vit mt chng trnh nhp vo mt s v tnh bnh phng ca s . Hng dn: Thc hin theo cc bc sau: a. Nhp vo mt s. b. Nhn s vi chnh n v hin th kt qu .

44

Lp trnh c bn C

Bi tp t lm 1. Vit chng trnh tnh din tch v chu vi ca mt vng trn. 2. Vit chng trnh nhp lng v tui ca mt ngi v hin th cc s va nhp ra mn hnh.

Bin,Ton t v Kiu d liu

45

46

Lp trnh c bn C

Bi 4
Mc tiu: Kt thc bi hc ny, bn c th:

Ton t v Biu thc

Hiu c Ton t gn Hiu c biu thc s hc Nm c ton t quan h (Relational Operators) v ton t lun l (Logical Operators) Hiu ton t lun l nh phn (Bitwise Logical Operators) v biu thc (Expressions) Hiu khi nim p kiu Hiu u tin ca cc ton t.

Kt thc bi hc ny, cc hc vin c th: Nm c Ton t gn Hiu c biu thc s hc Nm c ton t quan h (ton t so snh-Relational Operators) v ton t lun l (Logical Operators) Hiu ton t lun l nh phn( ton t lun l nh phn-Bitwise Logical Operators) v biu thc Nm c v p kiu qua Cast Hiu v u tin ca cc ton t Gii thiu C c mt tp cc ton t phong ph. Ton t l cng c dng thao tc d liu. Mt ton t l mt k hiu dng i din cho mt thao tc c th no c thc hin trn d liu. C nh ngha bn loi ton t: ton t s hc (arithmetic), quan h (relational), lun l (logical), v ton t lun l nh phn (bitwise). Bn cnh , C cn c mt s ton t c bit. Ton t thao tc trn hng hoc bin. Hng hoc bin ny c gi l ton hng (operands). Bin c cp cc chng trc. Hng l nhng gi tr c nh m chng trnh khng th thay i. Hng trong C c th l bt c kiu d liu c bn no. Ton t c phn loi: ton t mt ngi, hai ngi hoc ba ngi. Ton t mt ngi ch thao tc trn mt phn t d liu, ton t hai ngi trn hai phn t d liu v ba ngi trn ba phn t d liu. V d 4.1: c = a + b; y a, b, c l nhng ton hng, du = v du + l nhng ton t. 4.1 Biu thc (Expressions)
Formatted: Bullets and Numbering

Mt biu thc l t hp cc ton t v ton hng. Ton t thc hin cc thao tc nh cng, tr, so snh v.v... Ton hng l nhng bin hay nhng gi tr m cc php ton c thc hin trn n. Trong v d a + b, a v b l ton hng v + l ton t. Tt c kt hp li l mt biu thc.
Trong qu trnh thc thi chng trnh, gi tr thc s ca bin (nu c) s c s dng cng vi cc hng c mt trong biu thc. Vic nh gi biu thc c thc hin nh cc ton t. V vy, mi biu thc trong C u c mt gi tr.

Ton t v Biu thc

47

Cc v d v biu thc l: 2 x 3+7 2y+5 2 + 6 (4 - 2) z + 3 (8 - z)

48

Lp trnh c bn C

V d 4.2: Roland nng 70 kilograms, v Mark nng k kilograms. Vit mt biu thc cho tng cn nng ca h. Tng cn nng ca hai ngi tnh bng kilograms l 70 + k. V d 4.3: Tnh gi tr biu thc 4 z + 12 vi z = 15. Chng ta thay th mi z vi gi tr 15, v n gin ha biu thc theo quy tc: thi hnh php ton trong du ngoc trc tin, k n ly tha, php nhn v chia ri php cng v tr. 4 z + 12 tr thnh 4 15 + 12 = 60 + 12 = 72 Ton t gn (Assignment Operator) Trc khi nghin cu cc ton t khc, ta hy xt ton t gn (=). y l ton t thng dng nht cho mi ngn ng v mi ngi u bit. Trong C, ton t gn c th c dng cho bt k biu thc C hp l. Dng thc chung cho ton t gn l: Tn bin = biu thc; Gn lin tip Nhiu bin c th c gn cng mt gi tr trong mt cu lnh n. Vic ny thc hin qua c php gn lin tip. V d: a = b = c =10; Dng m trn gn gi tr 10 cho a, b,v c. Tuy nhin, vic ny khng th thc hin lc khai bo bin. V d, int a = int b = int c= 0; Cu lnh trn pht sinh li v sai c php. Biu thc s hc (Arithmetic Expressions) Cc php ton thng c thc hin theo mt th t c th (hoc ring bit) cho ra gi tr cui cng. Th t ny gi l u tin (s ni n sau). Cc biu thc ton hc trong C c biu din bng cch s dng ton t s hc cng vi cc ton hng dng s v k t. Nhng biu thc ny gi l biu thc s hc (Arithmetic Expressions). V d v biu thc s hc l : a * (b+c/d)/22; ++i % 7; 5 + (c = 3+8); (php nhn thc hin trc php cng)

Ton t v Biu thc

49

Nh chng ta thy trn, ton hng c th l hng, bin hay kt hp c hai. Hn na, mt biu thc c th l s kt hp ca nhiu biu thc con. Chng hn, trong biu thc u, c/d l mt biu thc con, v trong biu thc th ba c = 3+8 cng l mt biu thc con. 4.2 Ton t quan h (Relational Operators)

Ton t quan h c dng kim tra mi quan h gia hai bin , hay gia mt bin v mt hng. V d, vic xt s ln hn ca hai s, a v b, c thc hin thng qua du ln hn (>) gia hai ton hng a v b (a > b).

Trong C, true (ng) l bt c gi tr no khc khng (0), v false (sai) l bt c gi tr no bng khng (0). Biu thc dng ton t quan h tr v 0 cho false v 1 cho true. V d biu thc sau : a == 14 ; Biu thc ny kim tra xem gi tr ca a c bng 14 hay khng. Gi tr ca biu thc s l 0 (false) nu a c gi tr khc 14 v 1 (true) nu n l 14. Bng sau m t ngha ca cc ton t quan h. Ton t > >= < <= == != ngha ln hn ln hn hoc bng nh hn nh hn hoc bng bng khng bng Bng 4.1: Ton t quan h v ngha 4.3 Ton t lun l (Logical Operators) v biu thc

Ton t lun l l cc k hiu dng kt hp hay ph nh biu thc c cha cc ton t quan h. Nhng biu thc dng ton t lun l tr v 0 cho false v 1 cho true. Bng sau m t ngha ca cc ton t lun l. Ton t
&& || !

ngha AND: tr v kt qu l true khi c 2 ton hng u true OR : tr v kt qu l true khi ch mt trong hai ton hng u true NOT: Chuyn i gi tr ca ton hng duy nht t true thnh false v ngc li. Table 4.2: Ton t lun l v ngha

Lu : Bt c ton t lun l no c k hiu l hai k t th khng c c khong trng gia hai k t , v d : == s khng ng nu vit l = =.

50

Lp trnh c bn C

Gi s mt chng trnh phi thc thi nhng bc nht nh nu iu kin a < 10 v b == 7 c tho mn. iu kin ny c vit ra bng cch dng ton t quan h kt hp vi ton t lun l AND. Ton t AND c vit l &&. Ta s c iu kin kim tra nh sau : (a < 10) && (b == 7); Tng t, ton t OR dng kim tra xem c mt trong s cc iu kin kim tra l ng hay khng. N c dng l du (||). Cng v d trn nhng iu kin cn kim tra l: ch cn mt trong hai cu lnh l ng th ta c m sau : (a < 10) || (b == 7); Ton t lun l th ba l NOT c biu din bng k hiu du chm than !. Ton t ny o ngc gi tr lun l ca biu thc. V d, kim tra xem bin s c b hn 10 hay khng, ta vit u kin kim tra nh sau: (s < 10); hay l (! (s >= 10)) /* s khng ln hn hay bng 10 */

C ton t quan h v lun l c quyn u tin thp hn ton t s hc. V d, 5 > 4 + 3 c tnh tng ng vi 5 > (4 + 3), ngha l 4+3 s c tnh trc v sau ton t quan h s c thc hin. Kt qu s l false, tc l tr v 0. Cu lnh sau: printf("%d", 5> 4 + 3); s cho ra: 0 v 5 b hn (4 + 3) .

4.4

Ton t lun l nh phn (Bitwise Logical Operators) v biu thc

V d xt ton hng c gi tr l 12, ton t lun l nh phn s coi s 12 ny nh 1100. Ton t lun l nh phn xem xt cc ton hng di dng chui bit ch khng l gi tr s thng thng. Gi tr s c th thuc cc c s: thp phn (decimal), bt phn (octal) hay thp lc phn (hexadecimal). Ring ton t lun l nh phn s chuyn i ton hng m n thao tc thnh biu din nh phn tng ng, l dy s 1 hoc l 0. Ton t lun l nh phn gm &, | , ^ , ~ , vv c tng kt qua bng sau:.

Ton t Bitwise AND ( x & y)

M t Mi v tr ca bit tr v kt qu l 1 nu bit ti v tr tng ng ca hai ton hng u l 1.

Ton t v Biu thc

51

Bitwise OR ( x | y) Bitwise NOT ( ~ x) Bitwise XOR ( x ^ y)

Mi v tr ca bit tr v kt qu l 1 nu bit ti v tr tng ng ca mt trong hai ton hng l 1. o ngc gi tr cc bit ca ton hng (1 thnh 0 v ngc li). Mi v tr ca bit tr v kt qu l 1 nu bit ti v tr tng ng ca mt trong hai ton hng l 1 ch khng phi c hai cng l 1. Bng 4.3: Ton t lun l nh phn

Ton t lun l nh phn xem kiu d liu s nh l s nh phn 32-bit, gi tr s c i thnh gi tr bit tnh ton trc ri sau s tr v kt qu dng s ban u. V d: Biu thc 10 & 15 c ngha l (1010 & 1111) tr v gi tr 1010 c ngha l 10. Biu thc 10 | 15 c ngha l (1010 | 1111) tr v gi tr 1111 c ngha l 15. Biu thc 10 ^ 15 c ngha l (1010 ^ 1111) tr v gi tr 0101 c ngha l 5. Biu thc ~10 c ngha l ( ~1010 ) tr v gi tr 1111.1111.1111.1111.1111.1111.1111.0101 c ngha l -11. 4.5 Biu thc dng hn hp & Chuyn i kiu

Mt biu thc dng hn hp l mt biu thc m trong cc ton hng ca mt ton t thuc v nhiu kiu d liu khc nhau. Nhng ton hng ny thng thng c chuyn v cng kiu vi ton hng c kiu d liu ln nht. iu ny c gi l tng cp kiu. S pht trin v kiu d liu theo th t sau :

char < int <long <float <double Chuyn i kiu t ng c trnh by di y nhm xc nh gi tr ca biu thc: a. b. c. d. e. char v short c chuyn thnh int v float c chuyn thnh double. Nu c mt ton hng l double, ton hng cn li s c chuyn thnh double, v kt qu l double. Nu c mt ton hng l long, ton hng cn li s c chuyn thnh long, v kt qu l long. Nu c mt ton hng l unsigned, ton hng cn li s c chuyn thnh unsigned v kt qu cng l unsigned. Nu tt c ton hng kiu int, kt qu l int.

Ngoi ra nu mt ton hng l long v ton hng khc l unsigned v gi tr ca kiu unsigned khng th biu din bng kiu long. Do vy, c hai ton hng c chuyn thnh unsigned long. Sau khi p dng nhng quy tc trn, mi cp ton hng c cng kiu v kt qu ca mi php tnh s cng kiu vi hai ton hng.
Formatted: Font color: Red

52

Lp trnh c bn C

char ch; int i; float f; double d; result = (ch/i) + (f*d) (f+i);

int

double float

double

double Trong v d trn, trc tin, ch c kiu k t c chuyn thnh integer v float f c chuyn thnh double. Sau , kt qu ca ch/i c chuyn thnh double bi v f*d l double. Kt qu cui cng l double bi v cc ton hng lc ny u l double.

4.5.1

p kiu (Casts)

Thng thng, ta nn i tt c hng s nguyn sang kiu float nu biu thc bao gm nhng php tnh s hc da trn s thc, nu khng th vi biu thc c th mt i gi tr tht ca n.Ta xem v d: int x = y = z = x,y,z; 10; 100; x/y;

Trong trng hp ny, z s c gn 0 khi php chia din ra v phn thp phn (0.10) s b ct b. Do mt biu thc c th c p thnh mt kiu nht nh. C php chung ca cast l: (kiu d liu) biu thc V d, m bo rng biu thc a/b, vi a v b l s nguyn, cho kt qu l kiu float, dng m sau c vit: (float) a/b; p kiu c th p dng cho cc gi tr hng, biu thc hay bin, v d: (int) 17.487; (double) (5 * 4 / 8); (float) (a + 7); Trong v d th hai, ton t p kiu khng t mc ch ca n bi v n ch thc thi sau khi ton biu thc trong du ngoc c tnh. Biu thc 5 * 4 / 8 cho ra gi tr l 2 (v n c kiu l s nguyn nn ct i phn thp phn), v vy, gi tr kt qu vi kiu double cng l 2.0. V d:

Ton t v Biu thc

53

int i = 1, j = 3; x = i / j; /* x = 0.0 */ x = (float) i/(float) j; /* x = 0.33 */

4.6

u tin ca ton t (Precedence)

u tin ca ton t thit lp th t u tin tnh ton khi mt biu thc s hc cn c c lng. Tm li, u tin cp n th t m C thc thi cc ton t. Th t u tin ca ton t s hc c th hin nh bng di y. Loi ton t Mt ngi Hai ngi Ton t - , ++, -^ *, /, % +, = Tnh kt hp Phi sang tri Tri sang phi

Phi sang tri

Bng 4.4: Th t u tin ca ton t s hc Nhng ton t nm cng mt hng bng trn c cng quyn u tin. Vic tnh ton ca mt biu thc s hc s c thc hin t tri sang phi cho cc ton t cng u tin. Ton t *, /, v % c cng u tin v cao hn + v - (hai ngi). u tin ca nhng ton t ny c th c thay i bng cch s dng du ngoc n. Mt biu thc trong ngoc lun lun c tnh ton trc. Mt cp du ngoc n ny c th c bao trong cp khc. y l s lng nhau ca nhng du ngoc n. Trong trng hp , vic tnh ton trc tin c thc hin ti cp du ngoc n trong cng nht ri n du ngoc n bn ngoi. Nu c nhiu b du ngoc n th vic thc thi s theo th t t tri sang phi. Tnh kt hp cho bit cch thc cc ton t kt hp vi cc ton hng ca chng. V d, i vi ton t mt ngi: ton hng nm bn phi c tnh trc, trong php chia th ton hng bn tri c chia cho ton hng bn phi. i vi ton t gn th biu thc bn phi c tnh trc ri gn gi tr cho bin bn tri ton t. Tnh kt hp cng cho bit th t m theo C nh gi cc ton t trong biu thc c cng u tin. Cc ton t nh vy c th tnh ton t tri sang phi hoc ngc li nh thy trong bng 4.5. V d: a = b = 10/2; Gi tr 5 s gn cho b xong ri gn cho a. V vy th t u tin s l phi sang tri. Hn na, -8 * 4 % 2 3 c tnh theo trnh t sau: Trnh t 1. 2. 3. 4. Thao tc - 8 (php tr mt ngi) -8*4 - 32 % 2 0-3 Kt qu s m ca 8 - 32 0 -3
Formatted: Font color: Red

54

Lp trnh c bn C

Theo trn th ton t mt ngi (du - ) c quyn u tin cao nht c tnh trc tin. Gia * v % th c tnh t tri sang phi. Tip n s l php tr hai ngi. Th t u tin ca cc biu thc con Nhng biu thc phc tp c th cha nhng biu thc nh hn gi l biu thc con. C khng xc nh th t m cc biu thc con c lng gi. Mt biu thc sau: a * b /c + d *c; bo m rng biu thc con a * b/c v d*c s c tnh trc php cng. Hn na, quy tc t tri sang phi cho php ton nhn v chia bo m rng a s c nhn vi b v sau s chia cho c. Nhng khng c quy tc xc nh hoc a*b /c c tnh trc hay sau d*c. Ty chn ny l ngi thit k trnh bin dch quyt nh. Quy tc tri sang phi hay ngc li ch p dng cho mt chui ton t cng u tin. C th, n p dng cho php nhn v chia trong a*b/c. Nhng n khng p dng cho ton t + v khc cp. Bi v khng th xc nh th t tnh ton cc biu thc con, do vy, ta khng nn dng cc biu thc nu gi tr biu thc ph thuc vo th t tnh ton cc biu thc con . Xt v d sau: a * b + c * b++ ; C th trnh bin dch ny tnh gi tr mc bn tri trc v dng cng gi tr b cho c hai biu thc con. Nhng trnh bin dch khc li tnh gi tr mc bn phi v tng gi tr b trc khi tnh gi tr mc bn tri. Ta khng nn dng ton t tng hay gim cho mt bin m n xut hin nhiu hn mt ln trong mt biu thc.
Formatted: Font color: Red

Th t u tin gia nhng ton t so snh (ton t quan h) Ta thy trong phn trc mt s ton t s hc c u tin cao hn cc ton t s hc khc. Ring vi ton t so snh, khng c th t u tin gia cc ton t v chng c c lng t tri sang phi. Th t u tin gia nhng ton t lun l Bng di y trnh by th t u tin cho ton t lun l. Th t 1 2 3 Ton t NOT AND OR

Bng 4.5: Th t u tin cho ton t lun l Khi c nhiu ton t lun l trong mt iu kin, chng c lng gi t phi sang tri. V d, xt iu kin sau: False OR True AND NOT False AND True

Ton t v Biu thc

55

iu kin ny c tnh nh sau: 1. False OR True AND [NOT False] AND True NOT c u tin cao nht. 2. False OR True AND [True AND True] y, AND l ton t c u tin cao nht v nhng ton t c cng u tin c tnh t phi sang tri. 3. False OR [True AND True] 4. [False OR True]

5. True Th t u tin gia cc kiu ton t khc nhau Khi mt biu thc c nhiu hn mt kiu ton t th th t u tin phi c thit lp gia cc kiu ton t vi nhau. Bng di y cho bit th t u tin gia cc kiu ton t khc nhau.

Th t 1 2 3

Kiu ton t S hc So snh (Quan h) Lun l

Bng 4.6. Th t u tin gia cc kiu ton t khc nhau Do vy, trong mt biu thc gm c ba kiu ton t, cc ton t s hc c tnh trc, k n l ton t so snh v sau l ton t lun l. Th t u tin ca cc ton t trong cng mt kiu th c ni ti nhng phn trc. Xt v d sau: 2*3+4/2 > 3 AND 3<5 OR 10<9 Vic thc hin tnh ton s nh sau: 1. [2*3+4/2] > 3 AND 3<5 OR 10<9 u tin ton t s hc s c tnh theo th t u tin nh bng 4.4. 2. [[2*3]+[4/2]] > 3 AND 3<5 OR 10<9 3. [6+2] >3 AND 3<5 OR 10<9 4. [8 >3] AND [3<5] OR [10<9] K n s tnh tt c nhng ton t so snh c cng u tin theo quy tc tnh t tri sang phi.

56

Lp trnh c bn C

5. True AND True OR False Cui cng tnh ton cc ton t kiu lun l. AND s c u tin cao hn OR. 6. [True AND True]OR False 7. True OR False 8. True Du ngoc n Th t u tin ca cc ton t c th thay i bi cc du ngoc n. Khi , chng trnh s tnh ton cc phn d liu trong du ngoc n trc. Khi mt cp du ngoc n ny c bao trong cp khc, vic tnh ton thc hin trc tin ti cp du ngoc n trong cng nht, ri n du ngoc n bn ngoi.

Nu c nhiu b du ngoc n th vic thc hin s theo th t t tri sang phi. Xt v d sau: 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (2<6 AND 10>11)) Cch tnh s l: 1. 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (True AND False)) Du ngoc n trong cng s c tnh trc tt c cc ton t khc v p dng quy tc c bn trong bng 4.6 cho tnh ton bn trong cp du ngoc ny. 2. 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR False) 3. 5+9*3^2-4 > 10 AND (2+16-8/4 > 6 OR False) K n du ngoc n ngoi c xt n. Xem li cc bng ni v th t u tin ca cc ton t. 4. 5+9*3^2-4 > 10 AND (2+16-2 > 6 OR False) 5. 5+9*3^2-4 > 10 AND (18-2 > 6 OR False) 6. 5+9*3^2-4 > 10 AND (16 > 6 OR False) 7. 5+9*3^2-4 > 10 AND (True OR False) 8. 5+9*3^2-4 > 10 AND True 9. 5+9*9-4>10 AND True Ta tnh biu thc bn tri trc theo cc quy tc 10. 5+81-4>10 AND True 11. 86-4>10 AND True 12. 82>10 AND True

Ton t v Biu thc

57

13. True AND True 14. True.

58

Lp trnh c bn C

Tm tt bi hc C nh ngha bn loi ton t: s hc, quan h (so snh), lun l v lun l nh phn. Tt c ton t trong C c tnh ton theo th t u tin. Ton t quan h c dng kim tra mi quan h gia hai bin hay gia mt bin v mt hng. Ton t lun l l nhng k hiu dng kt hp hay ph nh nhng biu thc cha cc ton t quan h. Ton t lun l nh phn xt cc ton hng nh l bit nh phn ch khng phi l cc gi tr s thp phn. Php gn (=) c xem nh l mt ton t c tnh kt hp t phi sang tri. u tin thit lp s phn cp ca mt tp cc ton t so vi tp cc ton t khc khi c lng mt biu thc.

Ton t v Biu thc

59

Kim tra tin hc tp 1. ______ l nhng cng c thao tc d liu. A. Nhng ton t C. Nhng biu thc B. Nhng ton hng D. Khng cu no ng

2.

Mt _______ bao gm s kt hp ca cc ton t v cc ton hng. A. Biu thc C. Con tr B. Hm D. Khng cu no ng

3. ________ thit lp s phn cp ca mt tp cc ton t so vi tp cc ton t khc khi c lng mt biu thc. A. Nhng ton hng C. Ton t B. u tin D. Khng cu no ng

4. ____________ l mt biu thc c cc ton hng thuc nhiu kiu d liu khc nhau . A. Biu thc n C. Quyn u tin B. Biu thc hn hp D. Khng cu no ng

5. Mt biu thc c p thnh mt kiu nht nh bng cch dng ____. A. p kiu C. Ton t B. Quyn u tin D. Khng cu no ng

6. _________ c dng kt hp hay ph nh biu thc cha cc ton t quan h. A. Nhng ton t lun l C. Nhng ton t phc B. Nhng ton t lun l nh phn D. Khng cu no ng

7. Nhng ton t lun l nh phn l __, ___, __ v __ . A. % , ^ , * and @ C. !,],& and * B. &,|,~ and ^ D. Khng cu no ng

8. u tin ca cc ton t c th c thay i bng cch t cc phn t c yu cu ca biu thc trong _________ . A. Du ngoc xon ({ }) C. Nhng du ngoc n (()) B. K hiu m ( ^) D. Khng cu no ng

60

Lp trnh c bn C

Bi tp t lm 1. Vit mt chng trnh nhp v cng ba s. 2. Vit mt chng trnh tnh gi tr ca biu thc vi cc gi tr sau: z = a*b+(c/d)-e*f ; a = 10 b=7 c = 15.75 d=4 e=2 f = 5.6 3. Vit mt chng trnh tnh din tch v chu vi ca hnh ch nht. 4. Vit mt chng trnh tnh th tch ca mt hnh tr. 5. Vit mt chng trnh tnh lng thc lnh ca mt nhn vin theo cng thc di y Lng c bn : $ 12000 DA : 12% lng c bn HRA : $150 TA : $120 Cc mc khc : $450 Thu : PF :14% lng c bn v IT: 15% lng c bn Lng thc lnh = Lng c bn + DA + HRA + TA + Cc mc khc (PF + IT)

Ton t v Biu thc

61

Bi 5
Mc tiu: Kt thc bi hc ny, bn c th: S dng c cc ton t s hc, so snh v lun l Chuyn i cc kiu d liu Nm c th t u tin gia cc ton t.

Ton t v Biu thc

Cc bc trong chng ny c nghin cu k v gii thch chi tit chng ta c th hiu r v p dng chng mt cch hon chnh.Ta hy theo cc bc cn thn. Phn I - Trong thi gian 1 gi 30 pht u: V d 1: Trong chng ny, ta s vit mt chng trnh tnh ton tin li n gin (li thun cha tnh tin vn vo) khi ta vay tin. Cng thc tnh ton l p * n * r /100. y p c ngha l tin vn, n l s nm v r c ngha l t l li sut. Chng trnh khai bo ba bin s thc float c tn l p, n v r. Ch rng, cc bin c khai bo trn cng mt dng m th ta dng du phy (,) phn chia chng vi nhau. Mi bin trn c gn mt gi tr. Xt dng m sau: printf(\nAmount is: %f, p*n*r/100);

Trong printf() trn, chng ta dng %f hin th gi tr ca bin kiu float (s thc), gi tr bin ny l p*n*r/100, cng thc dng tnh li n gin c a vo trong printf(). l p, n v r c nhn vi nhau v kt qu c chia cho 100. Nh vy printf() s hin th li n. Gi Borland C. 5.1 Tnh li n

1. To ra mt tp tin mi. 2. G on m sau trong Edit window: #include <stdio.h> #include <conio.h> void main() { float p, n, r; clrscr(); p = 1000; n = 2.5;

Ton t v biu thc

61

r = 10.5; printf(\n Amount is: %f, p*n*r/100); } 3. Lu tp tin vi tn simple.c. 4. Bin dch tp tin simple.c. 5. Thc thi chng trnh simple.c. 6. Tr v trnh son tho. Kt qu: The Amount is: 262.500000

5.2 Dng ton t s hc Trong phn ny ta s vit mt chng trnh c s dng ton t s hc. Chng trnh ny khai bo bn bin s nguyn tn l a, b, c v d. Gi tr s gn cho cc bin a, b v c l: a = 50, b = 24, c = 68 Xt dng m sau: d = a*b+c/2; a nhn vi b. c chia cho 2. Kt qu ca a*b c cng vi thng s ca c/2. Gi tr ny s gn cho d qua ton t (=). Biu thc c tnh nh sau: 1. 2. 3. 4. 50 * 24 = 1200 68 / 2 = 34 1200 + 34 = 1234 d = 1234

printf( ) : hin th gi tr ca bin d. Xt biu thc: d = a*(b+c+(a-c)*b); y du ngoc n trong cng c u tin cao nht. Do vy, (a-c) c tnh trc. Sau , tnh ti cc du ngoc n ngoi. Kt qu ca (a-c) c nhn cho b bi v * c u tin cao hn - v +. Biu thc c tnh nh di y:

1. 2. 3. 4. 5.
62

d d d d d

= = = = =

50 * (24 + 68 + (50 - 68) * 24) 50 * (24 + 68 + (-18) * 24) 50 * (24 + 68 + (-432)) 50 * (92 - 432) 50 * (-340)
Lp trnh c bn C

6. d = -17000 Cc biu thc khc c tnh ty vo cc ton t c dng. Kt qu c hin th bi lnh printf(). 1.To mi mt tp tin. 2. G on m sau trong Edit window: #include <stdio.h> #include <conio.h> void main() { int a,b,c,d; clrscr(); a = 50; b = 24; c = 68; d = a*b+c/2; printf(\n The d = a%b; printf(\n The d = a*b-c; printf(\n The d = a/b+c; printf(\n The

value after a*b+c/2 is: %d, d); value after a mod b is: %d, d); value after a*b-c is: %d, d); value after a/b+c is: %d, d);

d = a+b*c; printf(\n The value after a+b*c is: %d, d); d = (a+b)*c; printf(\n The value after (a+b)*c is: %d, d); d = a*(b+c+(a-c)*b); printf(\n The value after a*(b+c+(a-c)*b) is: %d, d); } 3. Lu tp tin vi tn arith.c. 4. Bin dch tp tin arith.c. 5. Thc thi chng trnh arith.c. 6. Tr v trnh son tho. Kt qu xut:

The The The The The The

value value value value value value

after after after after after after

a*b+c/2 is: 1234 a mod b is: 2 a*b-c is: 1132 a/b+c is: 70 a+b*c is: 1682 (a+b)*c is: 5032

Ton t v biu thc

63

The value after a*(b+c+(a-c)+b) is: -17000

5.3 Dng ton t so snh v lun l Trong phn ny chng ta s vit mt chng trnh s dng ton t so snh v ton t lun l. Ba bin s nguyn tn l a, b v c c khai bo trong chng trnh ny. Cc gi tr gn cho bin nh sau: a = 5, b = 6 & c = 7. Xt nhng dng m sau: 1. a + b >= c; u tin, a+b s c tnh (ton t s hc c u tin cao hn ton t so snh), kt qu l 11. K n gi tr 11 c so snh vi c. Kt qu l 1(true) bi v 11 > 7. 2. Xt biu thc khc: a > 10 && b <5;

Tnh ton u tin s l a> 10 v b<5, bi v ton t so snh (> <) c quyn u tin cao hn ton t lun l AND (&&). Tnh ton theo sau: 1. 5 > 10 && 6<5 2. FALSE && FALSE 3. FALSE tc l, 0 1. To mt tp tin mi. 2. G on m sau vo Edit window: #include <stdio.h> #include <conio.h> void main() { int a = 5, b = 6, c = 7; printf ("int a = 5, b = 6, c = 7;\n"); printf("The value of a > b is \t%i\n\n", a > b); printf("The value of b < c is \t%i\n\n", b < c); printf("The value of a + b >= c is \t%i\n\n", a + b >= c); printf("The value of a - b <= b - c is \t%i\n\n", a-b <= b-c); printf("The value of b-a == b - c is \t%i\n\n", b - a == b - c); printf("The value of a*b != c * c is \t%i\n\n", a * b < c * c); printf(Result of a>10 && b<5 = %d\n\n, a>10 && b<5); printf(Result of a > 100 || b < 50 = %d\n\n, a>100 || b<50); } 3. Lu tp tin vi tn compare.c. 4. Bin dch tp tin compare.c. 5. Thc thi chng trnh compare.c.
64 Lp trnh c bn C

6. Tr v trnh son tho.

Kt qu xut: int a = 5, b = 6, c = 7; The value of a > b is The value of The value of The value of The value of The value of b < c is is is is is 0 0 1 1 1 0 1

a + b >= c

a - b <= b - c b - a == b - c a * b != c * c

Result of a > 10 && b < 5 =

Result of a > 100 || b < 50 = 1

5.4

Chuyn i kiu d liu

Trong phn ny, ta s vit mt chng trnh hiu r vic chuyn i kiu d liu. Trong biu thc u tin, tt c u l s nguyn int 40 / 17 * 13 / 3 s c kt qu l 8 (40 / 17 lm trn ra 2, 2 * 13 = 26, 26 / 3 lm trn ra 8) Biu thc th hai nh sau:
1. 2. 3. 4.

nh gi tr: 40 / 17 * 13 / 3.0 40 / 17 lm trn kt qu l 2 2 * 13 = 26 Nhng v c s 3.0 p kiu php chia cui cng thnh s kiu double, v vy 26.0 / 3.0 = 8.666667

Trong biu thc th ba: Nu chng ta di chuyn du chm thp phn sang s 13 (40 / 17 * 13.0 / 3), kt qu vn s l 8.666667 bi v:
1. 2.

40 / 17 lm trn l 2 S 13.0 p kiu d liu php nhn thnh double nhng kt qu vn l 26 v 2.0 * 13.0 = 26.0 V 26.0 p php chia cui cng thnh kiu double, v vy 26.0 / 3.0 = 8.666667

3.

Ton t v biu thc

65

Trong biu thc cui: nu chng ta di chuyn du chm thp phn sang s 17 (40 / 17.0 * 13 / 3), kt qu by gi s l 10.196078 bi v: 1. 17.0 p kiu ca php chia u thnh kiu double v 40.0 / 17.0 = 2.352941 2. 2.352941 * 13.0 = 30.588233 3. v 30.588233 / 3.0 = 10.196078 1. To mt tp tin mi. 2. G on m sau vo Edit window: #include <stdio.h> #include <conio.h> void main() { clrscr(); printf(40/17*13/3 = %d, 40/17*13/3); printf(\n\n40/17*13/3.0 = %lf, 40/17*13/3.0); printf(\n\n40/17*13.0/3 = %lf, 40/17*13.0/3); printf(\n\n40/17.0*13/3 = %lf, 40/17.0*13/3); } 3. Lu tp tin vi tn type.c. 4. Bin dch tp tin type.c. 5. Thc thi chng trnh type.c. 6. Tr v trnh son tho. Kt qu xut: 40/17*13/3 = 8 40/17*13/3.0 = 8.666667 40/17*13.0/3 = 8.666667 40/17.0*13/3 = 10.196078

5.5 Th t u tin ca cc ton t


Trong phn ny chng ta s vit mt chng trnh tm hiu th t u tin gia cc ton t. Biu thc sau y s c tnh nh sau: (4-2*9/6<=3 && (10*2/4-3>3|| (1<5 && 8>10)))
66 Lp trnh c bn C

Hy theo cc quy tc chng ta hc trong chng Ton t v Biu thc (Ch rng biu thc c in m di y s c tnh trc)

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

(4-2*9/6<=3 && (10*2/4-3>3|| (1<5 && 8>10))) (4-2*9/6<=3 && (10*2/4-3>3|| ( 1 && 0 ))) (4-2*9/6<=3 && (10*2/4-3>3|| 0)) (4-2*9/6<=3 && (20/4-3>3|| 0)) (4-2*9/6<=3 && (5-3>3|| 0)) (4-2*9/6<=3 && (2>3|| 0)) (4-2*9/6<=3 && (0|| 0)) (4-2*9/6<=3 && 0) (4-18/6<=3 && 0) (4-3<=3 && 0) (1<=3 && 0) ( 1 && 0)

13. 0 (False)
1. To mt tp tin mi. 2. G on m sau vo ca s son tho: #include <stdio.h> #include <conio.h> void main() { clrscr(); printf(Result = %d,(4-2*9/6<=3 && (10*2/4-3 > 3 || (1 < 5 && 8>10))));
}

3. Lu tp tin vi tn precede.c. 4. Bin dch tp tin precede.c. 5. Thc thi chng trnh precede.c. 6. Tr v trnh son tho. Kt qu xut: Result = 0

Ton t v biu thc

67

Phn II - Trong thi gian 30 pht k tip: 1. Tnh gi tr biu thc sau: 10 * 3 ^ 6 * 6 + 5 2 AND (2 * 2 + 6 /3 > 1 OR 2 >8) Thc hin nh sau: G vo biu thc trn s dng cu lnh printf(). AND c thay th bi && v OR c thay th bi ||. 2. Gi s tt c bin c kiu l int. Tm gi tr cho mi bin sau: a. b. c. d. e. f. g. h. x = (2 + 3) * 6; x = (12 + 6) / 2 * 3; y = x = (2 + 3) / 4; y = 3 + 2 * (x = 7 / 2); x = (int) 3.8 + 3.3; x = (2 + 3) * 10.5; x = 3 / 5 * 22.0; x = 22.0 * 3 / 5;

68

Lp trnh c bn C

Bi tp t lm 1. Tnh gi tr c gn (nm pha bn tri) cho mi trng hp sau: int s, m = 3, n = 5, r, t; float x = 3.0, y; t = n/m; r = n%m; y = n/m; t = x*y-m/2; x = x*2.0; s = (m+n)/r; y = --n;

2. Vit mt chng trnh nhp vo mt s thc. n v tnh cho s ny l centimet (cm). Hy in ra s


tng ng tnh bng foot (s thc, c 1 s l thp phn) v inch (s thc, c 1 s l thp phn). chnh xc ca foot v inch l mt s l thp phn. Hng dn: 2.54 centimeters = 1 inch, v 12 inches = 1 foot. Nu gi tr nhp vo l 333.3, kt qu l:

333.3 centimeters tng ng 10.9 feet. 333.3 centimeters tng ng 131.2 inches.

3. Tm gi tr ca iResult cho nhng cu lnh sau:


int iResult, a = 10, b = 8, c = 6, d = 5, e = 2; iResult iResult iResult iResult iResult iResult iResult iResult iResult iResult iResult iResult iResult iResult = = = = = = = = = = = = = = a - b - c - d; a - b + c - d; a + b / c / d; a + b / c * d; a / b * c * d; a % b / c * d; a % b % c % d; a - (b - c) - d; (a - (b - c)) - d; a - ((b - c) - d); a % (b % c) * d * e; a + (b - c) * d - e; (a + b) * c + d * e; (a + b) * (c / d) % e;

Ton t v biu thc

69

Bi 6
Mc tiu: Kt thc bi hc ny, bn c th: Hiu cc hm nhp xut c nh dng scanf() v printf() S dng cc hm nhp xut k t getchar() v putchar().

Nhp v Xut trong C

Gii thiu Trong bt k ngn ng lp trnh no, vic nhp gi tr cho cc bin v in chng ra sau khi x l c th c lm theo hai cch: 1. Thng qua phng tin nhp/xut chun (I / O). 2. Thng qua nhng tp tin. Trong phn ny ta s ni v chc nng nhp v xut c bn. Nhp v xut (I/O) lun l cc thnh phn quan trng ca bt k chng trnh no. to tnh hu ch, chng trnh ca bn cn c kh nng nhp d liu vo v hin th li nhng kt qu ca n. Trong C, th vin chun cung cp nhng th tc cho vic nhp v xut. Th vin chun c nhng hm qun l cc thao tc nhp/xut cng nh cc thao tc trn k t v chui. Trong bi hc ny, tt c nhng hm nhp dng c d liu vo t thit b nhp chun v tt c nhng hm xut dng vit kt qu ra thit b xut chun. Thit b nhp chun thng thng l bn phm. Thit b xut chun thng thng l mn hnh (console). Nhp v xut ra c th c nh hng n tp tin hay t tp tin thay v thit b chun. Nhng tp tin c th c lu trn a hay trn bt c thit b lu tr no khc. D liu u ra cng c th c gi n my in. 6.1 Tp tin tiu <stdio.h>

Trong cc v d trc, ta tng vit dng m sau: #include <stdio.h> y l lnh tin x l (preprocessor command). Trong C chun, k hiu # nn t ti ct u tin. stdio.h l mt tp tin v c gi l tp tin tiu (header). N cha cc macro cho nhiu hm nhp v xut c dng trong C. Hm printf(), scanf(), putchar() v getchar() c thit k theo cch gi cc macro trong tp tin stdio.h thc thi cc cng vic tng ng. 6.2 Nhp v xut trong C (Input and Output)

Th vin chun trong C cung cp hai hm thc hin cc yu cu nhp v xut c nh dng. Chng l: printf() Hm xut c nh dng. scanf() Hm nhp c nh dng. Nhng hm ny gi l nhng hm c nh dng v chng c th c v in d liu ra theo cc nh dng khc nhau c iu khin bi ngi dng. B nh dng qui nh dng thc m theo gi tr ca bin s c nhp vo v in ra.

Nhp v Xut trong C

71

6.2.1 printf() Chng ta quen thuc vi hm ny qua cc phn trc. y, chng ta s xem chng chi tit hn. Hm printf() c dng hin th d liu trn thit b xut chun console (mn hnh). Dng mu chung ca hm ny nh sau: printf(control string, argument list); Danh sch tham s (argument list) bao gm cc hng, bin, biu thc hay hm v c phn cch bi du phy. Cn phi c mt lnh nh dng nm trong chui iu khin (control string) cho mi tham s trong danh sch. Nhng lnh nh dng phi tng ng vi danh sch cc tham s v s lng, kiu d liu v th t. Chui iu khin phi lun c t bn trong cp du nhy kp, y l du phn cch (delimiters). Chui iu khin cha mt hay nhiu hn ba thnh phn di y : K t vn bn (Text characters) Bao gm cc k t c th in ra c v s c in ging nh ta nhn thy. Cc khong trng thng c dng trong vic phn chia cc trng (field) c xut ra. Lnh nh dng - nh ngha cch thc cc mc d liu trong danh sch tham s s c hin th. Mt lnh nh dng bt u vi mt k hiu % v theo sau l mt m nh dng tng ng cho mc d liu. Du % c dng trong hm printf() ch ra cc c t chuyn i. Cc lnh nh dng v cc mc d liu tng thch nhau theo th t v kiu t tri sang phi. Mt m nh dng th cn thit cho mi mc d liu cn in ra. Cc k t khng in c Bao gm phm tab, du khong trng v du xung dng.

Mi lnh nh dng gm mt hay nhiu m nh dng. Mt m nh dng bao gm k hiu % v mt b nh kiu. Bng 6.1 lit k cc m nh dng khc nhau c h tr bi cu lnh printf(): nh dng K t n (Single Character) Chui (String) S nguyn c du (Signed decimal integer) S thp phn c du chm ng (Floating point) S thp phn c du chm ng - Biu din phn thp phn S thp phn c du chm ng - Biu din dng s m S thp phn c du chm ng (%f hoc %e, con s no t hn) S nguyn khng du (Unsigned decimal integer) S thp lc phn khng du (Dng ABCDEF) (Unsigned hexadecimal integer) S bt phn khng du (Unsigned octal integer) Bng 6.1: M nh dng trong printf () Trong bng trn, c, d, f, lf, e, g, u, s, o v x l b nh kiu. Cc quy c in cho cc m nh dng khc nhau c tng kt trong Bng 6.2: M nh dng %d Quy c in n Cc con s trong s nguyn. printf() %c %s %d %f %lf %e %g %u %x %o scanf() %c %s %d %f hoc %e %lf %f hoc %e %u %x %o

72

Lp trnh c bn C

%f

%e

Phn s nguyn ca s s c in nguyn dng. Phn thp phn s cha 6 con s. Nu phn thp phn ca con s t hn 6 s, n s c thm cc s khng (0) bn phi hay gi l lm trn pha bn phi. Mt con s bn tri du chm thp phn v 6 con s bn phi ging nh %f. Bng 6.2: Quy c in

Bi v cc k hiu %,\ v c dng c bit trong chui iu khin, nu chng ta cn in cc k hiu ny ln mn hnh, chng phi c dng nh trong Bng 6.3: \\ In k t \ \ In k t %% In k t % Bng 6.3: Cc k t c bit trong chui iu khin Bng di y a ra vi v d s dng chui iu khin v m nh dng khc nhau. Chui iu khin %d %d Good Morning Mr. Lee. %d \nhello Ni dung m chui iu khin cha ng Ch cha lnh nh dng Ch cha lnh nh dng Ch l cc k t vn bn Danh sch tham s 300 10 + 5 Khng c (Nil) Gii thch danh sch tham s Hng s Biu thc Khng c Hin th trn mn hnh 300 15 Good Morning Mr. Lee. 100 Hello (Trn dng mi)

S 1. 2. 3.

Cu lnh printf(%d, 300); printf(%d, 10+5); printf(Good Morning Mr. Lee.); int count = 100; printf(%d, count); printf(\nhello);

4. 5.

Ch cha lnh Count nh dng Ch l cc k t Khng c vn bn v k t khng in c. Ch cha nh dng lnh Str

Bin Khng c

6.

7.

#define str Good %s Apple .. printf(%s, str); .. %d %d int count,stud_num; count = 0; stud_num = 100; printf(%d %d\n, count, stud_num);

Hng chui

Good Apple

Ch cha lnh count, nh dng v trnh stud_num t thot ra

Hai bin

0, 100

Bng 6.4 : Chui iu khin v m nh dng V d 6.1 : y l mt chng trnh n gin dng minh ha cho mt chui c th c in theo lnh nh dng. Chng trnh ny cng hin th mt k t n, s nguyn v s thc (a single character, integer, v float). #include <stdio.h> void main()

Nhp v Xut trong C

73

{ int a = 10; float b = 24.67892345; char ch = A; printf(\nInteger data = %d, a); printf(\nFloat Data = %f, b); printf(\nCharacter = %c, ch); printf(\nThis prints the string); printf(%s, \nThis also prints a string); }

Kt qu chng trnh nh sau: Integer data = 10 Float Data = 24.678923 Character = A This prints the string This also prints a string

B t (Modifier) cho cc lnh nh dng trong printf() Cc lnh nh dng c th c b t (modifier), thay i cc c t chuyn i gc. Sau y l cc b t c chp nhn trong cu lnh printf(). Nu c nhiu b t c dng th chng tun theo trnh t sau : B t - D liu s c canh tri bn trong khng gian dnh cho n, chng s c in bt u t v tr ngoi cng bn tri. B t xc nh rng Chng c th c dng vi kiu: float, double hay char array (chui-string). B t xc nh rng l mt s nguyn xc nh rng nh nht ca trng d liu. Cc d liu c rng nh hn s cho kt qu canh phi trong trng d liu. Cc d liu c kch thc ln hn s c in bng cch dng thm nhng v tr cho yu cu.V d, %10f l lnh nh dng cho cc mc d liu kiu s thc vi rng trng d liu thp nht l 10. B t xc nh chnh xc Chng c th c dng vi kiu float, double hay mng k t (char array, string). B t xc nh rng chnh xc c vit di dng .m vi m l mt s nguyn. Nu s dng vi kiu float v double, chui s ch ra s con s ti a c th c in ra pha bn phi du chm thp phn. Nu phn phn s ca cc mc d liu kiu float hay double vt qu rng con s ch trong b t, th s s c lm trn. Nu chiu di chui vt qu chiu di ch nh th chui s c ct b phn d ra pha cui. Mt vi s khng (0) s c thm vo nu s con s thc s trong mt mc d liu t hn c ch nh trong b t. Tng t, cc khong trng s c thm vo cho chui k t. V d, %10.3f l lnh nh dng cho mc d liu kiu float, vi rng ti thiu cho trng d liu l 10 v 3 v tr sau phn thp phn.

74

Lp trnh c bn C

B t 0 Theo mc nh, vic thm vo mt trng c thc hin vi cc khong trng. Nu ngi dng mun thm vo trng vi s khng (0), b t ny phi c dng. B t l B t ny c th c dng hin th s nguyn nh: long int hay mt tham s kiu double. M nh dng tng ng cho n l %ld. B t h B t ny c dng hin th kiu short integer. M nh dng tng ng cho n l %hd. B t * B t ny c dng khi ngi dng khng mun ch trc rng ca trng m mun chng trnh xc nh n. Nhng khi i vi b t ny, mt tham s c yu cu phi ch ra rng trng c th. Chng ta hy xem nhng b t ny hot ng th no. u tin, chng ta xem xt tc ng ca n i vi nhng d liu kiu s nguyn. V d 6.2: /* Chng trnh ny trnh by cch dng b t trong printf() */ #include <stdio.h> void main() { printf(The number 555 in various forms:\n); printf(Without any modifier: \n); printf([%d]\n, 555); printf(With - modifier:\n); printf([%-d]\n, 555); printf(With digit string 10 as modifier:\n); printf([%10d]\n, 555); printf(With 0 as modifier: \n); printf([%0d]\n, 555); printf(With 0 and digit string 10 as modifiers:\n); printf([%010d]\n, 555); printf(With -, 0 and digit string 10 as modifiers:\n); printf([%-010d]\n, 555); } Kt qu nh di y: The number 555 in various forms:

Nhp v Xut trong C

75

Without any modifier: [555] With - modifier: [555] With digit string 10 as modifier: [ 555] With 0 as modifier: [555] With 0 and digit string 10 as modifiers: [0000000555] With -, 0 and digit string 10 as modifiers: [555 ] Chng ta dng k hiu [ v ] ch ra ni trng bt u v ni kt thc. Khi chng ta dng %d m khng c b t, chng ta thy rng n dng cho mt trng c cng rng vi s nguyn. Khi dng %10d chng ta thy rng n dng 10 khong trng cho trng v s c canh l phi theo mc nh. Nu ta dng b t , s s c canh tri trong trng . Nu dng b t 0, chng ta thy rng s s thm vo 0 thay v l khong trng. By gi chng ta hy xem b t dng vi s thc. V d 6.3: /* Chng trnh ny trnh by cch dng b t trong printf() */ #include <stdio.h> void main() { printf(The number 555.55 in various forms:\n); printf(In float form without modifiers:\n); printf([%f]\n, 555.55); printf(In exponential form without any modifier:\n); printf([%e]\n, 555.55); printf(In float form with - modifier:\n); printf([%-f]\n, 555.55); printf(In float form with digit string 10.3 as modifier\n); printf([%10.3f]\n, 555.55); printf(In float form with 0 as modifier:\n); printf([%0f]\n, 555.55); printf(In float form with 0 and digit string 10.3); printf(as modifiers:\n); printf([%010.3f]\n, 555.55); printf(In float form with -, 0 );
76 Lp trnh c bn C

printf(and digit string 10.3 as modifiers:\n); printf([%-010.3f]\n, 555.55); printf(In exponential form with 0); printf( and digit string 10.3 as modifiers:\n); printf([%010.3e]\n, 555.55); printf(In exponential form with -, 0); printf( and digit string 10.3 as modifiers:\n); printf([%-010.3e]\n\n, 555.55); } Kt qu nh sau: The number 555.55 in various forms: In float form without modifiers: [555.550000] In exponential form without any modifier: [5.555500e+02] In float form with - modifier: [555.550000] In float form with digit string 10.3 as [ 555.550] modifier

In float form with 0 as modifier: [555.550000] In float form with 0 and digit string 10.3 as modifiers: [000555.550] In float form with -, 0 and digit string 10.3 as modifiers: [555.550 ]

In exponential form with 0 and digit string 10.3 as modifiers: [05.555e+02] In exponential form with -,0 and digit string 10.3 as modifiers: [5.555e+02] Theo mc nh cho %f, chng ta c th thy rng c 6 con s cho phn thp phn v mc nh cho %e l mt con s ti phn nguyn v 6 con s phn bn phi du chm thp phn. Ch cch th hin 2

Nhp v Xut trong C

77

s cui cng trong v d trn, s cc con s bn phi du chm thp phn l 3, dn n kt qu khng c lm trn. By gi, chng ta hy xem b t dng vi chui s. Ch cch m rng trng cha ton b chui. Hn na, ch cch c t chnh xc .4 trong vic gii hn s k t c in. V d 6.4: /* Chng trnh trnh by cch dng b t vi chui*/ #include <stdio.h> void main() { printf(A string in various forms:\n); printf(Without any format command:\n); printf(Good day Mr. Lee. \n); printf(With format command but without any modifier:\n); printf([%s]\n, Good day Mr. Lee.); printf(With digit string 4 as modifier:\n); printf([%4s]\n, Good day Mr. Lee.); printf(With digit string 19 as modifier: \n); printf([%19s]\n, Good day Mr. Lee.); printf(With digit string 23 as modifier: \n); printf([%23s]\n, Good day Mr. Lee.); printf(With digit string 25.4 as modifier: \n); printf([%25.4s]\n, Good day Mr.Lee.); printf(With and digit string 25.4 as modifiers:\n); printf([%-25.4s]\n, Good day Mr.shroff.); } Kt qu nh sau: A string in various forms: Without any format command: Good day Mr. Lee. With format command but without any modifier: [Good day Mr. Lee.] With digit string 4 as modifier: [Good day Mr. Lee.]
78 Lp trnh c bn C

With digit string 19 as modifier: [ Good day Mr. Lee.]

With digit string 23 as modifier: [ Good day Mr. Lee.]

With digit string 25.4 as modifier: [ Good]

With - and digit string 25.4 as modifiers: [Good ]

Nhng k t ta nhp ti bn phm khng c lu dng cc k t. Tht s chng lu theo dng cc s di dng m ASCII (B m chun M cho vic trao i thng tin - American Standard Code for Information Interchange). Cc gi tr ca mt bin c thng dch di dng k t hay mt s ty vo kiu ca bin . V d sau m t iu ny: V d 6.5: #include <stdio.h> void main() { int a = 80; char b= C; printf(\nThis is the number stored in a %d,a); printf(\nThis is a character interpreted from a %c,a); printf(\nThis is also a character stored in b %c,b); printf(\nHey! The character of b is printed as a number! %d, b); } Kt qu nh di y: This is the number stored in `a 80 This is a character interpreted from `a P This is also a character stored in `b C Hey! The character of `b' is printed as a number!67

Kt qu ny m t vic dng cc c t nh dng v vic thng dch ca m ASCII. Mc d cc bin a v b c khai bo l cc bin kiu int v char, nhng chng c in nh l k t v s nh vo vic dng cc b nh dng khc nhau. c im ny ca C gip vic x l d liu c linh hot.

Nhp v Xut trong C

79

Khi dng cu lnh printf() cho ra mt chui di hn 80 k t trn mt dng, khi xung dng ta phi ngt mi dng bi k hiu \ nh c trnh by trong v d di y: V d 6.6: /* Chng trnh trnh by cch dng mt chui di cc k t*/ #include <stdio.h> void main() { printf(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaaaaaa aaaaaaaaaaaaa);

}
Kt qu nh sau: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa Trong v d trn, chui trong cu lnh printf() c 252 k t. Trong khi mt dng vn bn cha 80 k t, do chui c m rng thnh 3 hng trong kt qu nh trn. 6.2.2 scanf() Hm scanf() c s dng nhp d liu. Khun dng chung ca hm scanf() nh sau: scanf(<Chui cc nh dng>, <Danh sch cc tham s>); nh dng c s dng bn trong cu lnh printf() cng c s dng cng c php trong cc cu lnh scanf(). Nhng lnh nh dng, bao gm b t v danh sch tham s c bn lun cho printf() th cng hp l cho scanf(), chng tun theo mt s im khc bit sau: S khc nhau trong danh sch tham s gia printf() v scanf()

Hm printf() dng cc tn bin, hng s, hng chui v cc biu thc, nhng scanf() s dng nhng con tr ti cc bin. Mt con tr ti mt bin l mt mc d liu cha ng a ch ca ni m bin c ct gi trong b nh. Nhng con tr s c bn lun chi tit chng sau. Khi s dng scanf() cn tun theo nhng quy tc cho danh sch tham s: Nu ta mun nhp gi tr cho mt bin c kiu d liu c bn, g vo tn bin cng vi k hiu & trc n. Khi nhp gi tr cho mt bin thuc kiu d liu dn xut (khng phi thuc bn kiu c bn char, int, float, double), khng s dng & trc tn bin.
80 Lp trnh c bn C

S khc nhau trong lnh nh dng gia printf() v scanf()

1. Khng c ty chn %g. 2. M nh dng %f v %e c cng hiu qu tc ng. C hai nhn mt k hiu ty chn, mt chui cc con s c hay khng c du chm thp phn v mt trng s m ty chn. Cch thc hot ng ca scanf() scanf() s dng nhng k t khng c in nh k t khong trng, k t phn cch (tab), k t xung dng quyt nh khi no mt trng nhp kt thc v bt u. C s tng ng gia lnh nh dng vi nhng trng trong danh sch tham s theo mt th t xc nh, b qua nhng k t khong trng bn trong. Do , u vo c th c tri ra hn mt dng, min l chng ta c t nht mt k t phn cch, khong trng hay hng mi gia cc trng nhp vo. N b qua nhng khong trng v ranh gii hng thu c d liu. V d 6.7: Chng trnh sau m t vic dng hm scanf(). #include <stdio.h> void main() { int a; float d; char ch, name[40]; printf(Please enter the data\n); scanf(%d %f %c %s, &a, &d, &ch, name); printf(\nThe values accepted are: %d, %f, %c, %s, a, d, ch, name); } Kt qu nh sau: Please enter the data 12 67.9 F MARK The values accepted are:12, 67.900002, F, MARK

D liu u vo c th l: 12 67.9 F MARK hoc nh: 12 67.9 F MARK cng c nhn vo cc bin a, d, ch, v name. Xem v d khc:

Nhp v Xut trong C

81

V d 6.8: #include <stdio.h> void main() { int i; float x; char c; ......... scanf(%3d %5f %c, &i, &x, &c); } Nu d liu nhp vo l: 21 10.345 F Khi chng trnh c thc thi, th 21 s gn ti i, 10.34 s gn ti x v k t 5 s c gn cho c. Cn li l c tnh F s b b qua. Khi ta ch r mt chiu rng trng bn trong scanf(), th d %10s, ri sau scanf() ch thu nhn ti a 10 k t hoc ti k t khong trng u tin (bt c k t no u tin). iu ny cng p dng cho cc kiu int, float v double. V d di y m t vic s dng hm scanf() nhp vo mt chui gm c nhng k t vit hoa v khong trng. Chui s c chiu di khng xc nh nhng n b gii hn trong 79 k t (tht ra, 80 k t bao gm k t trng (null) c thm vo ni cui chui). V d 6.9: #include <stdio.h> void main() { char line[80]; /* line[80] l mt mng lu 80 k t */ .......... scanf(%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ], line); .......... } M khun dng %[] c ngha nhng k t c nh ngha bn trong [] c th c chp nhn nh nhng k t chui hp l. Nu chui BEIJING CITY c nhp vo t thit b nhp chun, khi chng trnh c thc thi, ton b chui s c gn cho mng mt khi chui ch ton l k t vit hoa v khong trng. Nu chui c vit l Beijing city, ch k t n B c gn cho mng, khi th k t vit thng u tin (trong trng hp ny l e) c thng dch nh k t u tin bn ngoi chui. chp nhn bt k k t no n khi gp k t xung dng, chng ta s dng m nh dng %[^\n], iu ny ng rng chui s chp nhn bt k k t no tr \n (k t xung dng). Du m (^) ng rng tt c cc k t tr nhng k t nm sau du m s c chp nhn nh k t hp l. V d 6.10: #include <stdio.h>
82 Lp trnh c bn C

void main() { char line[80]; .. scanf(%[^\n], line); .. } Khi hm scanf() c thc thi, mt chui c chiu di khng xc nh (nhng khng qu 79 k t) s c nhp vo t thit b nhp chun v c gn cho mng. S khng c gii hn no trn cc k t ca chui, ngoi tr tt c chng ch nm trn mt hng. V d chui sau: Alls well that ends well! C th c nhp vo t bn phm v c gn cho mng. B t * cho kt qu khc nhau trong scanf(). Du * c dng ch rng mt trng s c b qua lun hay tm b qua. V d xt chng trnh: #include <stdio.h> void main() { char item[20]; int partno; float cost; ......... scanf(%s %*d %f, item, &partno, &cost); ......... } Nu cc mc d liu tng ng l: battery 12345 0.05

th battery s c gn cho item v 0.05 s c gn cho cost nhng 12345 s khng c gn cho partno bi v du * ngn chn vic gn. Bt c k t khc trong scanf() m khng l m nh dng trong chui iu khin phi c nhp vo chnh xc nu khng s pht sinh li. c im ny c dng chp nhn du phn cch phy (,). V d chui d liu 10, 15, 17 v lnh nhp vo scanf(%d, %f, %c, &intgr, &flt, &ch); Ch rng du phy trong chui chuyn i tng ng du phy trong chui nhp v v vy n s c chc nng nh du phn cch.

Nhp v Xut trong C

83

K t khong trng trong chui iu khin thng c b qua mc d n s pht sinh tr ngi khi dng vi m nh dng %c. Nu chng ta dng b nh dng %c th mt khong trng c xem nh l mt k t hp l. Xt on m sau: int x, y; char ch; scanf(%2d %c %d,&x, &ch, &y); printf(%d %d %d\n,x, ch, y); ta nhp vo: 14 c 5

14 s c gn cho x, k t ch nhn k t khong trng (s 32 trong h thp phn), do vy y c gn gi tr ca k t c tc l s 99 trong h thp phn. Xt on m sau: #include <stdio.h> void main() { char c1, c2, c3; .. scanf(%c%c%c,&c1, &c2, &c3); .. } Nu d liu nhp vo l: a b c (vi khong trng gia cc k t), th kt qu ca php gn: c1 = a, c2 = <Khong trng>, c3 = b

y chng ta c th thy c2 cha mt khong trng v chui nhp c cha k t khong trng. b qua cc k t khong trng ny v c k t tip theo khng phi l k t khong trng, ta nn dng tp chuyn i %1s. scanf(%c%1s%1s,&c1, &c2, &c3); Khi kt qu s khc i vi cng d liu nhp vo nh trc v kt qu ng nh nh ca ta: c1 = a, c2 = b, c3 = c 6.3 B nh m Nhp v Xut (Buffered I/O)

84

Lp trnh c bn C

Ngn ng C bn thn n khng nh ngha cc thao tc nhp v xut. Tt c thao tc nhp v xut c thc hin bi cc hm c sn trong th vin hm ca C. Th vin hm C cha mt h thng hm ring m n iu khin cc thao tc ny. l: B nh m Nhp v Xut c dng c v vit cc k t ASCII

Mt vng m l ni lu tr tm thi, nm trn b nh my tnh hoc trn th nh ca b iu khin thit b (controller card). Cc k t nhp vo t bn phm c a vo b nh v i n khi ngi dng nhn phm return hay enter th chng s c thu nhn nh mt khi v cung cp cho chng trnh. B nh m nhp v xut c th c phn thnh: Thit b nhp/xut chun (Console I/O) Tp tin m nhp/xut (Buffered File I/O)

Thit b nhp/xut chun lin quan n nhng hot ng ca bn phm v mn hnh ca my tnh. Tp tin m nhp/xut lin quan n nhng hot ng thc hin c v vit d liu vo tp tin. Chng ta s ni v Thit b nhp/xut. Trong C, Thit b nhp/xut chun l mt thit b lung. Cc hm trong Thit b nhp/xut chun hng cc thao tc n thit b nhp v xut chun ca h thng. Cc hm n gin nht ca Thit b nhp/xut chun l: getchar() c mt v ch mt k t t bn phm. putchar() Xut mt k t n ra mn hnh.

6.3.1 getchar() Hm getchar() c dng c d liu nhp vo, ch mt k t ti mt thi im t bn phm.Trong hu ht vic thc thi ca C, khi dng getchar(), cc k t nm trong vng m cho n khi ngi dng nhn phm xung dng. V vy n s i cho n khi phm Enter c g. Hm getchar() khng c tham s, nhng vn phi c cp du ngoc n. N n gin ly v k t tip theo v sn sng a ra cho chng trnh. Chng ta ni rng hm ny tr v mt gi tr c kiu k t. Chng trnh sau trnh by cch dng hm getchar(). V d 6.11: /* Chng trnh trnh by cch dng getchar() */ #include <stdio.h> void main() { char letter; printf(\nPlease enter any character: ); letter = getchar(); printf(\nThe character entered by you is %c. , letter); }

Kt qu nh sau:

Nhp v Xut trong C

85

Please enter any character: S The character entered by you is S. Trong chng trnh trn letter l mt bin c khai bo l kiu char do vy n s nhn vo k t. Mt thng bo: Please enter any character: s xut hin trn mn hnh. Ta nhp vo mt k t, trong v d l S, qua bn phm v nhn Enter. Hm getchar() nhn k t v gn cho bin c tn l letter. Sau n c hin th trn mn hnh v ta c c thng bo. The character entered by you is S. 6.3.2 putchar()

putchar() l hm xut k t trong C, n s xut mt k t ln mn hnh ti v tr con tr mn hnh. Hm ny yu cu mt tham s. Tham s ca hm putchar() c th thuc cc loi sau: Hng k t n nh dng (Escape sequence) Mt bin k t.

Nu tham s l mt hng n phi c bao ng trong du nhy n. Bng 6.5 trnh by vi ty chn cho putchar() v tc ng ca chng.

Tham s Bin k t Hng bin k t Hng s nh dng (escape sequence) nh dng (escape sequence)

Hm putchar(c) putchar(A) putchar(5) putchar(\t)

Tc dng Hin th ni dung ca bin k t c Hin th k t A Hin th con s 5 Chn mt k t khong cch (tab) ti v tr con tr mn hnh Chn mt m xung dng ti v tr con tr mn hnh

putchar(\n)

Bng 6.5: Nhng ty chn cho putchar() v tc dng ca chng Chng trnh sau trnh by v hm putchar():

86

Lp trnh c bn C

V d 6.12: /* Chng trnh ny trnh by vic s dng hng v nh dng trong hm putchar() */ #include <stdio.h> void main() { putchar(H); putchar(\n); putchar(\t); putchar(E); putchar(\n); putchar(\t); putchar(\t); putchar(L); putchar(\n); putchar(\t); putchar(\t); putchar(\t); putchar(L); putchar(\n); putchar(\t); putchar(\t); putchar(\t); putchar(\t); putchar(O); } Kt qu nh sau: H E L L O Khc nhau gia getchar() v putchar() l putchar() yu cu mt tham s trong khi getchar() th khng. V d 6.13: /* Chng trnh trnh by getchar() v putchar() */ #include <stdio.h> void main() { char letter; printf(You can enter a character now: ); letter = getchar(); putchar(letter); } Kt qu nh sau: You can enter a character now: F F

Nhp v Xut trong C

87

Tm tt bi hc Trong C, Nhp v Xut c thc hin bng cch dng cc hm. Bt c chng trnh no trong C u c quyn truy cp ti ba tp tin chun. Chng l tp tin nhp chun (stdin), tp tin xut chun (stdout) v b li chun (stderr). Thng thng tp tin nhp chun l bn phm (keyboard), tp tin xut chun l mn hnh (screen) v tp tin li chun cng l mn hnh. Tp tin tiu <stdio.h> cha cc macro ca nhiu hm nhp v xut (input/output function) c dng trong C. Thit b nhp/xut chun (Console I/O) lin quan n nhng hot ng ca bn phm v mn hnh ca my tnh. N cha cc hm nh dng v khng nh dng. Hm nhp xut nh dng l printf() v scanf(). Hm nhp xut khng nh dng l getchar() v putchar(). Hm scanf() c dng cho d liu nhp vo c nh dng, trong khi hm printf() c dng xut ra d liu theo mt nh dng c th. Chui iu khin ca printf() v scanf() phi lun tn ti bn trong du nhy kp . Chui ny s cha mt tp cc lnh nh dng. Mi lnh nh dng cha k hiu %, mt ty chn cc b t v cc dng kiu d liu xc nh. S khc nhau chnh gia printf() v scanf() l hm scanf() dng a ch ca bin ch khng phi l tn bin. Hm getchar() c mt k t t bn phm. Hm putchar(ch) gi k t ch ra mn hnh. S khc nhau gia getchar() v putchar() l putchar() c mt tham s trong khi getchar() th khng.

88

Lp trnh c bn C

Kim tra tin hc tp


1. Cc hm nhp v xut c nh dng l _________ v ________. A. printf() v scanf() C. puts() v gets() B. getchar() v putchar() D. Khng cu no ng

2. Hm scanf() dng _________ ti cc bin ch khng dng tn bin. A. Hm C. Mng


3.

B. Con tr D. Khng cu no ng

___________ xc nh nh dng cho cc gi tr ca bin s c nhp v in. A. Vn bn C. Tham s B. B nh dng D. Khng cu no ng

4.

_______ c dng bi hm printf() xc nh cc c t chuyn i. A. % C. * B. & D. Khng cu no ng

5. getchar() l mt hm khng c bt c tham s no. 6. Mt ___________ l mt ni lu tr tm trong b nh. A. ROM (B nh ch c) C. Vng m B. Thanh ghi D. Khng cu no ng

(True/False)

7. nh dng (Escape sequence) c th c t bn ngoi chui iu khin ca printf().

(True/False)

Nhp v Xut trong C

89

Bi tp t lm 1. A. Hy dng cu lnh printf() : a) Xut ra gi tr ca bin s nguyn sum. b) Xut ra chui vn bn "Welcome", tip theo l mt dng mi. c) Xut ra bin k t letter. d) Xut ra bin s thc discount. e) Xut ra bin s thc dump c 2 v tr phn thp phn. 1. B. Dng cu lnh scanf() v thc hin: a) c gi tr thp phn t bn phm vo bin s nguyn sum. b) c mt gi tr s thc vo bin discount_rate. 2 Vit mt chng trnh xut ra gi tr ASCII ca cc k t A v b.

3. Xt chng trnh sau: #include <stdio.h> void main() { int breadth; float length, height; scanf(%d%f%6.2f, breadth, &length, height); printf(%d %f %e, &breadth, length, height); } Sa li chng trnh trn. 4. Vit mt chng trnh nhp vo name, basic, daper (phn trm ca D.A), bonper (phn trm li tc) v loandet (tin vay b khu tr) cho mt nhn vin. Tnh lng nh sau:
salary = basic + basic * daper/100 + bonper * basic/100 - loandet

Bng d liu: name MARK basic 2500 daper 55 bonper 33.33 loandet 250.00

Tnh salary v xut ra kt qu di cc u sau (Lng c in ra gn du la ($)): Name Basic Salary

Vit mt chng trnh yu cu nhp vo tn, h ca bn v sau xut ra tn, h theo dng l h, tn.

90

Lp trnh c bn C

Bi 7
Mc tiu: Kt thc bi hc ny, bn c th: Gii thch v Cu trc la chn Cu lnh if Cu lnh if else Cu lnh vi nhiu lnh if Cu lnh if lng nhau Cu lnh switch. Gii thiu

iu kin

Cc vn c cp t u n nay cho php chng ta vit nhiu chng trnh. Tuy nhin cc chng trnh c nhc im l bt c khi no c chy, chng lun thc hin mt chuI cc thao tc ging nhau, theo cch thc ging nhau. Trong khi , chng ta thng xuyn ch cho php thc hin cc thao tc nht nh nu n tha mn iu kin t ra.
Cc yu t lp trnh C c tho lun nhng chng trc c th gip bn vit hu ht cc chng trnh. Tuy nhin, vn l khi c thc thi, cc chng trnh dng ny lun thc hin mt chui cc hnh ng ging nhau, theo cng mt cch thc, ng mt ln. Trong khi lp trnh, chng ta thng xuyn cn thc hin mt s hnh ng ch khi mt iu kin no c tha mn. 7.1. Cu lnh iu kin l g ?

Cc cu lnh iu kin cho php chng ta thay I lung chng trnh. Da trn mt iu kin no , mt cu lnh hay mt chuI cc cu lnh c th c thc hin hoc khng. Hu ht cc ngn ng lp trnh u s dng lnh if a ra iu kin. Nguyn tc thc hin nh sau nu iu kin a ra l ng (true), chng trnh s thc hin mt cng vic no , nu iu kin a ra l sai (false), chng trnh s thc hin mt cng vic khc.
Cc cu lnh iu kin cho php chng ta thay i hng thc hin ca chng trnh. Da vo mt iu kin, mt lnh hoc mt chui cc cu lnh s thc hin cc hnh ng la chn. Hu ht cc ngn ng lp trnh s dng cu lnh if to ra cc quyt nh. Mt trong nhng khi nim c bn ca ngnh khoa hc my tnh l nu iu kin xc nh l ng (true), my tnh c nh hng nhn mt hnh ng, v nu iu kin l sai (false), n c nh hng thc hin mt hnh ng khc. V d 7.1: xc nh mt s l s chn hay s l, ta thc hin nh sau: 1. Nhp vo mt s. 2. Chia s cho 2 xc nh s d. 3. Nu s d ca php chia l 0, l s Chn. HOC Nu s d ca php chia khc 0, l s L.

iu kin

Bc 2 trong giI thut trn kim tra phn d ca s khi chia cho 2 c bng 0 khng? Nu ng, ta thc hin vic hin th thng bo l s chn. Nu s d khc 0, ta thc hin vic hin th thng bo l s l.
Bc 2 trong gii thut kim tra xem kt qu s d ca php chia 2 c l 0 khng ? Trong trng hp ny, chng ta nhn mt hnh ng xc nh l hin th s c nhp vo l mt s chn. Nu kt qu ca php chia ly s d khc 0, mt hng hnh ng khc c thc hin, hin th l mt s l. Trong C mt iu kin c coi l ng (true) khi n c gi tr khc 0, l sai (false) khi n c gi tr bng 0. Mt im cn ch . Trong ngn ng C mt cu lnh iu kin c nh gi l true (ng) tng ng gi tr khc 0 v false (sai) tng ng gi tr l 0.

Lp trnh c bn C

7.2. Cc cu lnh la chn: C cung cp hai dng cu lnh la chn: Cu lnh if Cu lnh switch Chng ta hy tm hiu hai cu lnh la chn ny. 7.2.1 Cu lnh if: Cu lnh if cho php ta a ra cc quyt nh da trn vic kim tra mt iu kin no l ng (true) hay sai (false). Cu lnh if cho php cc quyt nh c thc hin bi vic kim tra iu kin c a ra l ng (true) hay sai (false). Cc iu kin gm cc ton t so snh v logic m chng ta tho lun bi 4. Dng tng qut ca cu lnh if: if (biu thc) Cc cu lnh; Biu thc phi lun c t trong cp du ngoc (). Mnh theo sau t kho if l mt iu kin (hoc mt biu thc iu kin) cn c kim tra. Tip n l mt lnh hay mt tp cc lnh s c thc thi khi iu kin (hoc biu thc iu kin) c kt qu true. V d 7.2: #include <stdio.h> void main() { int x, y; char a = y; x = y = 0; if (a == y) { x += 5; printf(The numbers are %d and \t%d, x, y); } } Kt qu ca chng trnh nh sau: The numbers are 5 and 0 C kt qu ny l do bin a c gn gi tr 'y'. Ch rng, khi lnh sau lnh if c t trong cp ngoc nhn {}. Khi c nhiu lnh cn c thc hin, cc cu lnh c coi nh mt block (khI lnh) v phI c t trong cp du {}. Nu trong v d trn ta khng a vo du ngoc nhn cu lnh if, ch c cu lnh u tin (x += 5) c thc hin khi iu kin trong cu lnh if l ng. Ch rng, khi cc cu lnh theo sau lnh if c t trong cp ngoc xon { }. Hy nh rng, nu cc cu trc c nhiu hn mt cu lnh theo sau n, cc cu lnh phi c xem nh mt khi v phi c t gia cp ngoc xon. Nu trong v d trn khng tn ti cp ngoc xon th ch c cu lnh u tin (x += 5) c thc thi khi lnh if c gi tr true.

Formatted: French (France)

iu kin

V d di y s kim tra mt nm c phi l nm nhun hay khng. Nm nhun l nm chia ht cho 4 hoc 400 nhng khng chia ht cho 100. Chng ta s dng lnh if kim tra iu kin. V d 7.3: /* To test for a leap year */ #include <stdio.h> void main() { int year; printf(\nPlease enter a year:); scanf(%d, &year); if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) printf(\n%d is a leap year!, year); }

Chng trnh trn cho ra kt qu nh sau: Please enter a year: 1988 1988 is a leap year! iu kin year % 4 == 0 && year % 100 != 0 || year % 400 == 0 tr v gi tr 1 nu nm l nm nhun. Khi , chng trnh hin th thng bo gm bin year v dng ch is a leap year. Nu iu kin trn khng tha mn, chng trnh khng hin th thng bo no.iu kin year % 4 == 0 && year % 100 != 0 || year % 400 == 0 cho kt qu mang gi tr 1 nu bin year c nhp vo l mt nm nhun. Trong trng hp ny, gi tr bin year theo sau bi dng is a leap year c xut ra mn hnh. Nu iu kin khng t, khng c dng thng tin no c xut ra mn hnh. 7.2.2 Cu lnh if else: trn chng ta bit dng n gin nht ca cu lnh if, cho php ta la chn thc hin hay khng mt cu lnh hoc mt chuI cc lnh. C cng cho php ta la chn trong hai khI lnh thc hin bng cch dng cu trc if else. C php nh sau: trn chng ta bit n dng n gin nht ca mt lnh if, a ra cho chng ta mt s la chn thc thi mt lnh, mt khi cc lnh hoc b qua chng. C cng cho php chng ta la chn gia hai lnh bng cch s dng cu trc if else. C php nh sau: if (biu thc) cu_lnh 1; else cu_lnh 2; Nu biu thc iu kin trn l ng (khc 0), cu lnh 1 c thc hin. Nu n sai (khc 0) cu lnh 2 c thc hin. Cu lnh sau if v else c th l lnh n hoc lnh phc. Cc cu lnh nn c li vo trong dng mc d khng bt buc. Cch vit gip ta nhn thy ngay nhng lnh no s c thc hin ty theo kt qu ca biu thc iu kin.Biu thc c xc nh gi tr, nu n mang gi tr true (khc 0), cu_lnh 1 c thc thi. Nu biu thc mang gi tr false (0) th cu_lnh 2 c thc thi. Nhng cu lnh theo sau if v else c th l lnh n hoc lnh ghp. S canh l cc dng lnh l khng i hi, tuy nhin l mt phong cch vit chng trnh tt. N cho bit nhng cu lnh thc thi thuc vo s kim sot no.

Lp trnh c bn C

By gi chng ta vit mt chng trnh kim tra mt s l s chn hay s l. Nu sau khi em chia s cho 2 s c d l 0 chng trnh s hin th dng ch The number is Even, ngc li s hin th dng ch The number is Odd. V d 7.4: #include <stdio.h> void main() { int num, res; printf(Enter a number: ); scanf(%d, &num); res = num % 2; if (res == 0) printf(The number is Even); else printf(The number is Odd); } Xem mt v d khc, v d s i mt k t hoa thnh k t thng. Nu k t khng phi l mt k t hoa, n s c in ra m khng cn thay i. Chng trnh s dng cu trc if-else kim tra xem mt k t c phi l k t hoa khng, v sau s la chn gia hai hng sn crI thc hin cc thao tc tng ng. V d 7.5: /* Doi mot ky tu hoa thanh ky tu thuong */ #include <stdio.h> void main() { char c; printf(Please enter a character: ); scanf(%c, &c); if (c >= A && c <= Z) printf(Lowercase character = %c, c + a A); else printf(Character Entered is = %c, c); } Biu thc c >= A && c <= Z kim tra k t nhp vo c l k t hoa khng. Nu biu thc c kt qutr v true, k t xut s c i thnh k t thng bng cch s dng biu thc c + a A, v c in ra mn hnh qua s dng hm printf() xut ra mn hnh. Nu gi tr ca biu thc l false, cu lnh sau else c chy v chng trnh hin th k t ra mn hnh m khng cn thc hin bt c s thay I no. lnh theo sau else c thc thi v k t c hin th ra mn hnh m khng cn bt c s thay i no c.
Formatted: French (France) Formatted: French (France)

7.2.3 Nhiu la chn Cc cu lnh if else:


Cu lnh if cho php ta la chn thc hin mt hnh ng no hay khng. Cu lnh if else cho php ta la chn thc hin gia hai hnh ng. C cho php ta c th a ra nhiu la chn hn. Chng

iu kin

ta m rng cu trc if else bng cch thm vo cu trc else if thc hin iu . Ngha l mnh else trong mt cu lnh if else lI cha mt cu lnh if else khc. Do nhiu iu kin hn c kim tra v to ra nhiu la chn hn. Lnh if cho chng ta chn thc hin hoc khng thc hin hnh ng no . Lnh if-else cho chng ta chn gia hai hnh ng. C cng cho php chng ta thc hin hn hai la chn bng cch m rng cu trc if-else vi else-if. Ngha l, mnh else ca mt lnh if-else cha mt lnh if-else khc. iu ny cho php nhiu iu kin c kim tra v v vy a ra c nhiu la chn. C php tng qut trong trng hp ny nh sau: if (biu thc) cu_lnh; else if (biu thc) cu_lnh; else cu_lnh; Cu trc ny gI l ifelseif ladder hay if-else-if staircase.Cu trc ny cn c gi l cu trc nc thang if-else-if (if-else-if ladder).

Cch canh l (li vo trong) nh trn gip ta nhn chng trnh mt cch d dng khi c mt hoc hai lnh if. Tuy nhin khi c nhiu lnh if hn cch vit d gy ra nhm ln v nhiu cu lnh s phi li vo qu su. V vy, lnh if-else-if thng c canh l theo dng:
S canh l (tht dng) trn th d hiu i vi mt hoc hai lnh if. Nhng n c th gy kh hiu khi s lng lnh if tng ln bi v chng ta phi tht dng qu su. V vy, lnh if-else-if thng c canh l theo dng: if (biu thc) cu_lnh; else if (biu thc) cu_lnh; else if (biu thc) cu_lnh; . else cu_lnh;
Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold

Cc iu kin c kim tra t trn xung di. Khi c mt iu kin no l true, cc cu lnh gn vi n s c thc hin v cc lnh cn li s c b qua. Nu khng c iu kin no l true, cc cu lnh gn vi else cui cng s c thc hin. Nu mnh else khng tn ti, s khng c lnh no c thc hin do tt c cc iu kin u false.
Cc iu kin c xt t trn xung. Ngay khi mt iu kin true c tm thy, cu lnh kt hp vi n (cu lnh theo ngay sau) c thc thi, v phn cc nc thang cn li c b qua. Nu khng mt iu kin no c gi tr true, th cu_lnh ca mnh else cui cng c thc thi. Nu khng c mnh else cui, s khng c hnh ng no c thc hin khi tt c cc iu kin u mang gi tr false.

V d di y nhn mt s t ngi dng. Nu s c gi tr t 1 n 3, chng trnh s in ra s , ngc li chng trnh in ra thng bo Invalid choice.
V d di y s nhn mt con s t ngi dng. Nu s ny nm gia 1 v 3, chng trnh s in s ny ln mn hnh. Ngc li s in dng thng bo Invalid Choice. V d 7.6: #include <stdio.h> main() { int x; x = 0; clrscr();
Comment [ndd1]: S la chn sai

Lp trnh c bn C

printf(Enter Choice (1 - 3): ); scanf(%d, &x); if (x == 1) printf(\nChoice is 1); else if ( x == 2) printf(\nChoice is 2); else if ( x == 3) printf(\nChoice is 3); else printf(\nInvalid Choice: Invalid Choice); } Trong chng trnh trn, Nu x = 1, hin th dng ch Choice is 1. c hin th. Nu x = 2, hin th dng ch Choice is 2 c hin th. Nu x = 3, hin th dng ch Choice is 3 c hin th. Nu x l bt k mt s no khc 1, 2, hoc 3, Invalid Choice c hin th.

Nu chng ta mun thc hin nhiu hn mt lnh sau mi cu lnh if hay else, ta phi t cc cu lnh vo trong cp du ngoc nhn {}. Cc cu lnh to thnh mt nhm gi l lnh phc hay mt khi lnh.
Nu chng ta mun c nhiu hn mt cu lnh theo sau lnh if hay else, cc cu lnh ny phi c nhm li vi nhau bng cp ngoc xon { }. Cc cu lnh c nhm li nh vy c gi l mt cu lnh ghp hoc mt khi lnh. if (result >= 45) { printf("Passed\n"); printf("Congratulations\n"); } else { printf("Failed\n"); printf("Good luck next time\n"); } 7.2.4 Cc cu trc if lng nhau:

Formatted: Font: Bold Formatted: Font: Bold

Mt cu trc if lng nhau l mt lnh if c t bn trong mt lnh if hoc else khc. Trong C, lnh else lun gn vi lnh if khng c else gn n nht, v nm trong cng mt khi lnh vi n. V d:
Mt cu trc if lng nhau (nested if) l mt lnh if c t bn trong mt if hoc else khc. Trong C, mt mnh else lun c kt hp vi mnh if gn nht trong cng mt khi vi iu kin lnh else ny phi cha c kt hp vi bt c mt lnh if no khc. V d: if (biu thc1) { if (biu thc2) cu_lnh1; if (biu thc3)

iu kin

cu_lnh2; else cu_lnh3; } else cu_lnh4; /* vi if (biu thc1) */


Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold

/* vi if (biu thc3) */

Trong on lnh minh ha trn, nu gi tr ca biu thc-1 l true th lnh if th hai s c kim tra. Nu biu thc-2 l true th lnh cu_lnh1 s c thc hin. Nu biu thu-3 l true,
cu_lnh2 s c thc hin nu khng cu_lnh3 c thc hin. Nu biu thc-1 l false th cu_lnh4 c thc hin. Trong on trn, s iu khin s chuyn n lnh if th 2 nu gi tr ca biu thc1 l true. Nu biu thc2 l true th cu_lnh1 c thc thi. Cu_lnh2 c thc thi khi biu thc-3 l true, ngc li th cu_lnh3 s c thc thi. Nu biu thc-1 to ra gi tr false th cu_lnh 4 c thc thi.

V lnh else trong cu trc else-if l khng bt buc, nn c th c mt cu trc khc nh dng di y:
V mnh else ca if l mt ty chn (khng bt buc), nn c th c cc cu trc tng t nh sau: if (iu kin-1) if (iu kin-2) cu_lnh1; else cu_lnh2; cu lnh k tip;

Formatted: Font: Bold Formatted: Font: Bold

Trong on m trn, nu iu kin-1 l true, chng trnh s chuyn n thc hin lnh if th hai v iu kin-2 c kim tra. Nu iu kin l true, cu_lnh1 c thc hin, nu khng cu_lnh2 c thc hin, sau chng trnh thc hin nhng lnh trong cu lnh k tip. Nu iu kin-1 l false, chng trnh s chuyn n thc hin nhng lnh trong
cu lnh k tip. Trong on m trn, nu iu kin-1 tr v gi tr true, th s iu khin c chuyn n lnh if th 2 v iu kin-2 c xc nh gi tr. Nu n mang gi tr true, th cu_lnh1 c thc thi, ngc li cu_lnh2 s c thc thi, v sau cu lnh k tip s c thc thi. Nu iu kin-1 l false, th s iu khin s c chuyn ngay n cu lnh k tip.

V d, marks1 v marks2 l im hai mn hc ca mt sinh vin. im marks2 s c cng thm 5 im nu n nh hn 50 v marks1 ln hn 50. Nu marks2 ln hn hoc bng 50 th sinh vin t loi A. iu ny c th c biu din bi on if c cu trc nh sau:
Xt mt v d marks1 v marks2 l cc im t c ca mt sinh vin trong hai mn hc. Cng thm 5 im vo mark2 nu marks1 ln hn 50 nhng marks2 nh hn 50. Nu marks2 ln hn hoc bng 50 th sinh vin t c loi A. iu kin ny c th c biu din thnh an m lnh s dng cu trc if nh sau: if (marks1 > 50 && marks2 < 50) marks2 = marks2 + 5; if (marks2 >= 50) grade = A; Mt s ngi c th vit nh saua ra on code nh sau: if (marks1 > 50) if (marks2 < 50)

Lp trnh c bn C

marks2 = marks2 + 5; else grade = A; Trong on lnh ny, A c gn cho bin grace ch khi marks1 ln hn 50 v marks2 ln hn hoc bng 50. Nhng theo nh yu cu ca bi ton, bn grace c gn gi tr A sau khi thc hin vic kim tra cng im v kim tra gi tr ca marks2. Hn na, gi tr ca bin grace khng ph thuc vo marks1. Trong on lnh ny, A s c gn cho bin grade ch khi gi tr bin marks1 ln hn 50 v gi tr bin marks2 ln hn hoc bng 50. Nhng, theo nh yu cu, bin grade phi c gn gi tr A sau khi kim tra v cng thm im vo bin marks2. Ngoi ra gi tr ca bin grade l c lp vi gi tr ca bin marks1.

V lnh else trong cu trc if-else l khng bt buc, nn khi c lnh else no khng c a vo trong chui cu trc if lng nhau chng trnh s trng khng r rng. Mt lnh else lun c gn vi lnh if gn n nht m lnh if ny cha c kt hp vi mt lnh else no.
Bi v phn else ca mt if l ty chn, nn s khng r rng trong trng hp thiu mt else trong mt chui if lng nhau. iu ny c gii quyt bng qui tc: mt else c kt hp vi mt if gn nht ngay pha trc n m if ny cha c kt hp vi mt else no. V d : if (n >0) if ( a > b) z = a; else z = b; Lnh else i vi lnh if bn trong. Vic vit li vo trong dng l mt cch th hin mi quan h . Tuy nhin canh l khng c chc nng gn else vi lnh if. Cp du ngoc nhn {} gip chng ta thc hin chc nng mt cch chnh xc. Lnh else i vi lnh if bn trong. S canh l tht vo l mt cch biu din mi quan h . Tuy nhin s canh l ny khng phi kt hp mt else vi mt if. Nu khng phi l nh lp trnh ca bn, cp du ngoc xon { } phi c dng to s kt hp thch hp. if (n > 0) { if ( a > b) z = a; } else z = b; Hnh bn di biu din s kt hp gia if v else trong mt chui cc lnh if lng nhau.

iu kin

if (n >0) if ( a > b) z = a; else z = b;

if (n > 0) { if ( a > b) z = a; } else z = b; else kt hp vi if u tin, bi v cp du ngoc xon nhn t lnh if bn trong.

else kt hp vi if gn nht

Theo chun ANSI, t nht l 15 cp lng nhau c h trc th lng nhau n 15 mc. Tuy nhin, hu ht trnh bin dch cho php nhiu hn th. Mt v d v if lng nhau c cho bn di: V d 7.7: #include <stdio.h> void main() { int x, y; x = y = 0; clrscr(); printf(Enter Choice (1 - 3): ); scanf(%d, &x); if(x == 1) { printf(\nEnter value for y (1 - 5): ); scanf (%d, &y); if (y <= 5) printf(\nThe value for y is: %d, y); else printf(\nThe value of y exceeds 5); } else printf (\nChoice entered was not 1); } Trong chng trnh trn, nu gi tr ca x c nhp l 1, ngi dng c yu cu nhp tip gi tr ca y. Ngc li, dng ch Choice entered was not 1 c hin th. Lnh if u tin c lng mt if lng trong hin th gi tr ca y nu ngi dng nhp vo mt gi tr nh hn 5 cho y, hoc ngc li s hin th dng ch The value of y exceeds 5.

Formatted: French (France)

Chng trnh di y a ra cch s dng ca if lng nhau.


Mt chng trnh hon thin di y th hin s hu ch ca lnh if lng nhau. V d 7.8: Mt cng ty sn xut 3 loi sn phm c tn gi: vn phng phm cho my tnh (computer stationery), a cng (fixed disks) v my tnh (computer). Sn phm Computer Stationery Fixed Disks M 1 2

10

Lp trnh c bn C

Computers Cng ty c chnh sch gim gi nh sau: Sn phm Computer Stationery Computer Stationery Computer Stationery Fixed Disks Fixed Disks Computers Computer Di y l chng trnh tnh gim gi. V d 7.9: #include <stdio.h> void main() {

Gi tr t hng $500/- hoc hn $300/- hoc hn di $300/$2000/- hoc hn $1500/- hoc hn $5000/- hoc hn $2500/- hoc hn

T l gim gi 12% 8% 2% 10% 5% 10% 5%

int productcode; float orderamount, rate = 0.0; printf(\nPlease enter the product code: ); scanf(%d, &productcode); printf(Please enter the order amount: ); scanf(%f, &orderamount); if (productcode == 1) { if (orderamount >= 500) rate = 0.12; else if (orderamount >= 300) rate = 0.08; else rate = 0.02; } else if (productcode == 2) { if (orderamount >= 2000) rate = 0.10; else if (orderamount >= 1500) rate = 0.05; }

iu kin

11

else if (productcode == 3) { if (orderamount >= 5000) rate = 0.10; else if (orderamount >= 2500) rate = 0.05; } orderamount -= orderamount * rate; printf( The net order amount is % .2f \n, orderamount); }

Kt qu ca chng trnh c minh ho nh sau:


V d v kt qu thc thi chng trnh :

Please enter the product code: 3 Please enter the order amount: 6000 The net order amount is 5400 trn, else sau cng trong chui cc else-if khng cn kim tra bt k iu kin no. V d, nu m sn phm c nhp vo l 1 v gi tr t hng nh hn $300, th khng cn phi kim tra iu kin, v tt c cc kh nng c kim sot. Kt qu thc thi chng trnh vi m sn phm l 3 v gi tr t hng l $6000 c trnh by trn. Sa i chng trnh trn ch n trng hp d liu nhp l mt m sn phm khng hp l. iu ny c th d dng t c bng cch thm mt lnh else vo chui lnh if dng kim tra m sn phm. Nu gp mt m sn phm khng hp l, chng trnh phi kt thc m khng cn tnh gi tr thc ca n t hng. 7.2.5 Cu lnh switch:

Cu lnh switch cho php ta a ra quyt nh c nhiu cch la chn, n kim tra gi tr ca mt
biu thc trn mt danh sch cc hng s nguyn hoc k t. Khi n tm thy mt gi tr trong danh sch trng vi gi tr ca biu thc iu kin, cc cu lnh gn vi gi tr s c thc hin. C php tng qut ca lnh switch nh sau: Lnh switch kim tra gi tr ca mt biu thc da vo mt danh sch cc hng s nguyn (integer) hoc k t (character). Khi mt s so snh khp c tm thy, cc cu lnh kt hp vi hng ny s c thc thi. C php tng qut ca lnh switch nh sau: switch (biu_thc) { case hng_1: chui_cu_lnh; break; case hng_2: chui_cu_lnh; break; case hng_3: chui_cu_lnh; break;

12

Lp trnh c bn C

default: chui_cu_lnh; } , switch, case v default l cc t kho, chui_cu_lnh c th l lnh n hoc lnh ghp v khng cn t trong cp du ngoc. Biu_thc theo sau t kha switch phi c t trong du ngoc ( ), v ton b phn thn ca lnh switch phi c t trong cp ngoc xon nhn { }. Kiu d liu kt qu ca biu_thc v kiu d liu ca cc hng theo sau t kho case phi ng nht. Ch , hng s sau nhn case (hng theo sau case) ch c th l mt hng s nguyn hoc hng k t. N cng c th l cc hng biu thc ngha l nhng biu thc khng cha bt k mt tn bin no. Tt c cc nhn gi tr ca case phi khc nhau.

Trong cu lnh switch, biu thc c xc nh gi tr, gi tr ca n c so snh vi tng gi tr gn vi tng case theo th t ch ra. Nu mt gi tr trong mt case trng vi gi tr ca biu thc, cc lnh gn vi case s c thc hin. Lnh break (s ni phn sau) cho php thot ra khi switch. Nu khng dng lnh break, cc cu lnh gn vi case bn di s c thc hin khng k gi tr ca n c trng vi gi tr ca biu thc iu kin hay khng. Chng trnh c tip tc thc hin nh vy cho n khi gp mt lnh break. Chnh v th, lnh break c coi l lnh quan trng nht khi dng switch.
Trong lnh switch, biu_thc c nh gi tr, v gi tr c so snh vi cc nhn case theo th t a ra. Nu mt nhn so khp vi gi tr ca biu thc, cc lnh kt hp vi nhn case s c thc thi. Lnh break (c tho lun phn sau) ch nh thot ngay khi lnh switch. Nu lnh break khng c dng, cc cu lnh trong cc nhn case theo sau cng c thc thi bt chp gi tr case c tho hay khng. S thc thi s tip tc cho n khi gp mt lnh break. V vy, break c xem l mt lnh quan trng khi s dng lnh switch.

Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold Formatted: Font: Bold

Cc cu lnh gn vi default s c thc hin nu khng c case no tha mn. Lnh default l ty chn. Nu khng c lnh default v khng c case no tha mn, khng c hnh ng no c thc hin. C th thay i th t ca case v default.
Cc cu lnh c kt hp vi t kho default s c thc thi, nu khng c mt nhn case no tho. Lnh default l mt tu chn (khng bt buc). Nu khng c lnh default, v gi tr ca biu thc khng so khp vi bt k gi tr nhn case no, th khng hnh ng no c thc hin. Th t ca cc nhn case v default c th thay i. Xt mt v d. V d 7.10: #include <stdio.h> main () { char ch; clrscr (); printf(\nEnter a lower cased alphabet (a - z): ); scanf(%c, &ch); if (ch < a || ch > z) printf(\nCharacter not a lower cased alphabet); else switch (ch) { case a: case e: case i:

iu kin

13

case o: case u: printf(\nCharacter is a vowel); break; case z: printf (\nLast Alphabet (z) was entered); break; default: printf(\nCharacter is a consonant); break; } }

Chng trnh trn nhn vo mt k t dng ch thng v hin th thng bo k t l nguyn m, l ch z hay l mt ph m. Nu n khng phi ba loi trn, chng trnh hin th thng bo Character not a lower cased alphabet.
Chng trnh s nhn mt k t thng t bn phm v hin th n nh l mt nguyn m, hoc l k t cui cng, hoc l mt k t bt k khc. Nu bt k mt phm no khc, khng phi l mt k t thng c nhp vo, thng bo Character not a lower cased alphabet c hin th.

Nn s dng lnh break trong c case cui cng hoc default mc d v mt logic l khng cn thit. Nhng iu rt c ch nu sau ny chng ta a thm case vo cui.
Nn s dng t kho break, thm ch sau case cui cng hoc default tuy rng iu ny khng cn thit. iu ny hu ch khi mt case mi c thm vo cui. Di y l mt v d, biu thc ca switch l mt bin kiu s nguyn v gi tr ca mi nhn case l mt s nguyn. V d 7.11: /* Integer constants as case labels */ #include <stdio.h> void main() { int basic; printf(\n Please enter your basic: ); scanf(%d, &basic); switch (basic) { case 200: printf(\n Bonus is dollar %d\n, 50); break; case 300: printf(\n Bonus is dollar %d\n, 125); break; case 400: printf(\n Bonus is dollar %d\n, 140);

14

Lp trnh c bn C

break; case 500: printf(\n Bonus is dollar %d\n, 175); break; default: printf(\n Invalid entry); break; } }

T v d trn, lnh switch rt thun li khi chng ta mun kim tra mt biu thc da trn mt danh sch gi tr ring bit. Nhng n khng th dng kim tra mt gi tr c nm trong mt min no hay khng. V d, khng th dng switch kim tra xem basic c nm trong khong t 200 n 300 hay khng, t xc nh mc tin thng. Trong nhng trng hp nh vy, ta phi s dng if-else.
T v d trn, r rng l lnh switch hu dng nu biu thc so khp vi mt trong cc nhn case. Nhng n khng th c s dng kim tra mt gi tr thuc mt min xc nh hay khng. V d, khng th kim tra nu gi tr ca basic nm trong khong 200 v 300 xc nh tin thng (bonus). Trong nhng trng hp nh vy, chng ta phi s dng chui lnh if-else.

Formatted: Font: Bold

Formatted: Font: Bold

iu kin

15

Tm tt bi hc Cc lnh iu kin cho php chng ta thay i hng thc thilung thc hin ca chng trnh. C h tr hai dng cu lnh la chn : if v switch. Sau y l mt vi cu lnh iu kin: Lnh if khi mt iu kin c kim tra; nu kt qu l true, cc cu lnh theo sau n s c thc thi v sau thc hin lnh tip theo trong chng trnh chnh. Ngc li, nu kt qu l false, s thc hin ngay lnh tip theo trong chng trnh chnh. Lnh if else khi mt iu kin c kim tra; nu kt qu l true, cc cu lnh theo sau if c thc thi. Nu kt qu l false, th cc lnh theo sau else c thc thi. Cc lnh if lng nhau l lnh if bn trong mt lnh if khc. Lnh switch l mt lnh c bit cho php chn nhiu hng thi hnh. Lnh ny kim tra mt biu thc c khp vi mt trong s cc gi tr hng xc nh v r nhnh chng trnh mt cc ph hpLnh switch cho php a ra quyt nh c nhiu la chn, n kim tra gi tr ca biu thc iu kin trong mt danh sch cc hng. Nu c, chng trnh chuyn n phn thc hin..

16

Lp trnh c bn C

Kim tra tin hc tp 1. Cc lnh cho php chng ta thay i hng lung thc hin ca chng trnh. A. iu kin B. Vng lp C. Tun t D. Tt c u sai 2. Lnh else l mt tu chn. 3. l lnh if c t bn trong mt lnh if hoc else. A. Nhiu lnh if B. Lnh if lng nhau C. Lnh if o D. Tt c u sai 4. Lnh l mt lnh cho php chn nhiu hng thi hnh. Lnh ny kim tra gi tr ca mt biu thc da vo mt danh sch cc hng s nguyn hoc hng k t. A. Tun t B. if C. switch D. Tt c u sai 5. if (biu_thc) cu_lnh1; else cu_lnh2; Cu lnh no s c thc thi khi gi tr ca biu_thc l false? A. cu_lnh1 B. cu_lnh2 (ng / Sai)
Formatted: French (France)

iu kin

17

Bi tp t lm 1. Vit chng trnh nhp vo hai s a v b, v kim tra xem a c chia ht cho b hay khng. 2. Vit chng trnh nhp vo hai s v kim tra xem tch ca hai s ny bng hay ln hn 1000. 3. Vit chng trnh nhp vo hai s. Tnh hiu ca hai s ny. Nu hiu s ny bng vi mt trong hai s nhp th hin th thng tin: Hiu bng gi tri <gi tr ca s nhp vo> Nu hiu khng bng vi mt trong hai gi tr nhp, hin th thng tin: Hiu khng bng bt k gi tr no c nhp 4. Cng ty Montek a ra cc mc tr cp cho nhn vin ng vi tng loi nhn vin nh sau: Loi nhn vin A B Nhng loi khc Mc tr cp 300 250 100

Tnh lng cui thng ca nhn vin (Mc lng v loi nhn vin c nhp t ngi dng). 5. Vit chng trnh xp loi sinh vin theo cc qui lut di y: Nu im => 75 Nu 60 <= im < 75 Nu 45 <= im < 60 Nu 35 <= im < 45 Nu im < 35 Loi A Loi B Loi C Loi D Loi E

18

Lp trnh c bn C

Bi 8
Mc tiu: Kt thc bi hc ny, bn c th: S dng: Cu lnh if Cu lnh if else Cu lnh vi nhiu if Cu lnh if lng nhau Cu lnh switch.

iu kin

Cc bc trong bi hc ny c trnh by chi tit, r rng v cn thn. iu ny gip ta hiu r v cng c lp trnh. Thc hin theo cc bc sau tht cn thn. Phn I - Trong thi gian 1 gi 30 pht u: 8.1 Lnh if: V d 1: Trong phn ny chng ta s vit mt chng trnh tnh tin hoa hng phi tr cho ngi bn hng da vo s lng hng h bn c. Bi ton: Cng ty SARA s tr 10% tin hoa hng cho nhn vin bn hng ca cng ty nu doanh s bn hng ca nhn vin t $10,000 hoc hn. Tnh tin hoa hng phi tr cui mi thnng. Bi ton khai bo hai bin kiu float l sales_amt v com. Ch , cc bin c khai bo trong cng mt dng trong chng trnh th s dng du phy (,) phn cch gia cc bin. Theo di on m lnh di y: printf(Enter the Sales Amount: ); scanf(%f,&sales_amt); Trong hm printf(), chng ta hin th thng ip yu cu nhp doanh s bn hng, v trong hm scanf() s dng %f nhn mt gi tr t ngi dng. Gi tr nhp vo s c gn cho bin sales_amt. if (sales_amt >= 10000) com = sales_amt * 0.1;

Cu lnh trn c dng kim tra gi tr ca bin sales_amt c ln hn hoc bng 10000 khng. >= l ton t so snh, s tr v gi tr ng hoc sai. Trong trng hp, nu bn nhp vo gi tri 15000, iu kin (sales_amt >= 10000) c kt qu l ng. Nu ng, n s thc thi cu lnh com = sales_amt * 0.1. By gi gi tr ca bin com s l 1500. Nu iu kin l sai, n s in ra gi tr tin hoa hng l 0. y chng ta thy, iu kin if ch c mt lnh duy nht. Nu c nhiu hn mt lnh cho iu kin if, cc lnh phi c t trong cp du ngoc {}. printf(\n Commission = %f, com); Cu lnh trn c s dng hin th gi tr tin hoa hng. %f c s dng hin th gi tr ca mt bin float c a ra sau du phy cui ca hm printf(). V vy, printf() y hin th tin hoa hng tnh c.
iu kin 1

8.1.1 Tnh tin hoa hng: 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { float com = 0, sales_amt; clrscr(); printf(Enter the Sales Amount: ); scanf(%f, &sales_amt); if (sales_amt >= 10000) com = sales_amt * 0.1; printf(\n Commission = %f, com); } 3. Lu tp tin vi tn comm.C. 4. Bin dch tp tin comm.C. 5. Thc thi chng trinh comm.C. 6. Tr v ca s Edit Window. KT QU: Enter the Sales Amount: 15000 Commission = 1500.000 8.2 Lnh if-else: Trong phn ny chng ta s vit mt chng trnh s dng lnh if-else. Chng trnh hin th s ln hn trong hai s. Theo di cc dng m lnh sau: if (num1 > num2) printf(\n The greater number is: %d, num1); else printf(\ The greater number is: %d, num2); Trong on m lnh ny hm printf() u tin ch c thc thi nu gi tr ca bin num1 ln hn gi tr ca bin num2, khi phn else c b qua. Nu gi tr ca bin num1 khng ln hn gi tr ca bin num2, hm printf() c b qua. Trong trng hp ny hm printf() th hai, lnh theo sau else, c thc thi. Trong chng trnh sau, bi v gi tr ca bin num1 ln hn num2, hm printf() u tin c thc thi. 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { int Num1, Num2; clrscr();

Lp trnh c bn C

Num1 = 540; Num2 = 243; if (Num1 > Num2) printf(\n The Greater Number Is: %d, Num1); else printf(\n The Greater Number Is: %d, Num2); } 1. 2. 3. 4. Lu tp tin vi tn ifelse.C. Bin dch chng trnh ifelse.C. Thc thi chng trnh ifelse.C. Tr v ca s Edit Window.

KT QU: The greater number is: 540 8.3 Lnh if-else-if: Trong phn ny chng ta s vit mt chng trnh s dng lnh if else if. Chng trnh s hin th s ln hn trong hai s, hoc s hin th cc s l bng nhau. Trong chng trnh phn trc, c hai bin s nguyn num1 v num2 c khai bo. Cc bin c gn gi tr. Quan st cc dng m lnh sau: if (num1 == num2) printf(\nNumbers are Equal); else if (num1 < num2) printf(\nThe Larger Number is: %d, num2); else printf(\nThe Larger Number is: %d, num1); Trong on m lnh trn, iu kin if u tin (num1 == num2) kim tra xem gi tr ca bin num1 c bng bin num2 khng. Trong C, k hiu == c s dng kim tra hai ton hng c bng nhau khng. Nu iu kin u tin (num1 == num2) c gi tr true th hm printf() theo ngay sau s c thc thi. Nu iu kin u tin khng ng, iu kin ca else-if s c kim tra. Trong trng hp iu kin ny (num1 < num2) tha, hm printf() theo sau n s c thc thi. Nu c hai iu kin ca if v else if u khng tha mn, th cu lnh sau else cui cng s c thc thi. Trong chng trnh di y, v gi tr ca num1 nh hn num2, lnh printf() th hai s c thc thi. 1. To mt tp tin mi. 2. Nhp on m lnh sau trong ca s Edit Window. #include <stdio.h> #include <conio.h> void main() { int num1, num2; num1 = 77; num2 = 90; if (num1 == num2) printf(\nThe Numbers are equal); else if (num1 < num2)
iu kin 3

printf(\n The Larger Number is: %d, num2); else printf(\n The Larger Number is: %d, num1); } 1. 2. 3. 4. Lu tp tin vi tn ifelseif.C. Bin dch tp tin ifelseif.C. Thc thi chng trnh ifelseif.C. Tr v ca s Edit Window.

KT QU: The Larger Number is: 90 8.4 Lnh if lng nhau: Trong phn ny chng ta s vit mt chng trnh hiu r v lnh if lng nhau. Bi ton: Cng ty MONTEK ra quyt nh chi tin hoa hng cho b phn bn hng ty thuc vo doanh thu bn sn phm. T l hoa hng c tnh nh sau: Doanh thu bn > 10,000$ <= 10,000 Tnh tin hoa hng cui mi thng. Loi sn phm A --Hoa hng 10% 8% 5%

Trong chng trnh ny chng ta tnh tin hoa hng da vo loi sn phm v lng sn phm bn c. Quan st cc dng m lnh sau: printf(\Enter the Sales Amount: ); scanf(%f,&sales_amt); printf(\n Enter the Grade: ); scanf(%c,&grade); Hm scanf() u tin c dng nhp doanh thu bn hng, v hm scanf() th hai c s dng nhp loi sn phm. nh dng %c c s dng nhn mt k t t ngi dng. if (sales_amt > 10000) if (grade == A) com = sales_amt * 0.1; else come = sales_amt * 0.08; else com = sales_amt * 0.05; Gi s chng ta nhp doanh thu bn hng l 15000 v loi sn phm l A. Chng trnh s kim tra iu kin if (sales_amt > 10000); v iu kin ny c kt qu ng, chng trnh s tip tc lnh if th hai (grade == A). iu kin ny cng tha, v vy tin hoa hng c tnh com = sales_amt * 0.1. Chng ta xem mt tnh hung khc vi doanh thu bn hng l 15000 v loi sn phm l B. Chng trnh s kim tra iu kin if u tin (sales_amt > 10000), iu kin ny tha. V chng trnh thc

Lp trnh c bn C

hin tip lnh if th hai, trong trng hp ny iu kin khng tha mn, chng trnh s chuyn n lnh else tng ng, ... else com = sales_amt * 0.08; Nu chng ta nhp gi tr 10000 hoc nh hn, chng trnh s chuyn n iu kin else sau cng v tnh tin hoa hng theo cng thc: com = sales_amt * 0.05; 1. To mt tp tin mi. 2. Nhp on m lnh sau trong ca s Edit Window. #include <stdio.h> #include <conio.h> void main() { float com = 0, sales_amt; char grade; clrscr(); printf(\Enter the Sales Amount: ); scanf(%f, &sales_amt); printf(\n Enter the Grade: ); scanf(%c, &grade); if (sales_amt > 10000) if (grade == A) com = sales_amt * 0.1; else com = sales_amt * 0.08; else com = sales_amt * 0.05; printf(\n Commission = %f, com); } 1. Lu tp tin vi tn nestif.C. 2. Bin dch tp tin nestif.C. 3. Thc thi chng trnh nestif.C. 4. Tr v ca s Edit Window. KT QU: Enter the Sales Amount: 15000 Enter the grade: A Commission = 1500 8.5 S dng lnh switch: Trong phn ny chng ta s s dng lnh switch. Chng trnh hin th kt qu ty vo ton t ton hc c s dng. Trong chng trnh ny c hai bin s nguyn l num1 v num2 v mt bin k t op c khai bo. Cc bin c gn gi tr. Mt php ton s hc c lu trong bin op.

iu kin

Bin op c truyn vo biu thc sau switch. case u tin so snh gi tr ca bin op vi +. Nu nhn (+) so khp vi gi tr trong op, th cc dng m lnh sau c thc thi: res = num1 + num2; printf(\n The sum is: %d, res); break; Tng ca num1 v num2 c lu trong bin res. Lnh printf() hin th gi tr ca bin res. Lnh break thot khi lnh switch. Trong case th hai, gi tr ca op c so snh vi -, v sau biu thc num1 num2 c thc thi. Tng t, nu gi tr ca op l * v /, num1 * num2 v num1 / num2 c thc thi. Nu khng c trng hp no trn tha mn, th lnh printf() ca default s c thc thi. 1. To mt tp tin mi. 2. Nhp on m lnh sau trong ca s Edit Window. #include <stdio.h> #include <conio.h> void main() { int num1, num2, res; char op; num1 = 90; num2 = 33; op = -; clrscr(); switch (op) { case +:
res = num1 + num2; printf(\nThe Sum is: %d, res); break; case -: res = num1 - num2; printf(\nNumber after Subtraction: %d, res); break; case /: res = num1 / num2; printf(\n nNumber after Division: %d, res); break; case *: res = num1 * num2; printf(\n nNumber after multiplication: %d, res); break; default: printf(\nInvalid); break; } }

1. 2. 3. 4.

Lu tp tin vi tn case.C. Bin dch tp tin case..C. Thc thi chng trnh case.C. Tr v ca s Edit Window.

KT QU: Number after Subtraction: 57

Lp trnh c bn C

Phn II - Trong thi gian 30 pht k tip: 1. Mt hc vin c kim tra 3 mn hc. Mi bi kim tra ti a l 100 im. im trung bnh ca hc vin c tnh, v hc vin c xp loi ty thuc vo kt qu ca im trung bnh theo qui lut sau: im trung bnh >= 90 80 - < 90 70 - < 80 60 - < 70 50 - < 60 < 50 thc hin: a. b. c. d. Nhp vo im ca 3 mn hc v lu trong 3 bin khc nhau l M1, M2 v M3. Tnh im trung bnh (avg = (M1 + M2 + M3)/3). Xc nh loi ca hc vin da trn im trung bnh tnh. Hin th loi. Loi E+ E A+ A B+ RT

iu kin

Bi tp t lm 1. Khai bo hai bin x v y. Gn tr cho cc bin ny. S x c in ra mn hnh ch khi x nh hn 2000 v ln hn 3000, v s y ch c in ra mn hnh khi y nm gia 100 v 500. 2. Vit chng trnh trnh by kh nng ca my tnh ca bn. Ngi dng nhp v mt k t trong bng ch ci v chng trnh hin th ngn ng lp trnh tng ng. Mt vi v d nhp v xut nh sau: Nhp A hoc a B hoc b C hoc c D hoc d F hoc f P hoc p V hoc v Xut Ada Basic COBOL dBASE III Fortran Pascal Visual C++

S dng lnh switch chn v hin th thng ip thch hp. S dng nhn default hin th thng ip nu k t nhp khng nm trong danh sch lit k trn. 3. Nhp gi tr vo ba bin v in ra mn hnh gi tr ln nht.

Lp trnh c bn C

Bi 9
Mc tiu: Kt thc bi hc ny, bn c th: Hiu c vng lp for trong C Lm vic vi ton t phy Hiu cc vng lp lng nhau Hiu vng lp while v vng lp do-while Lm vic vi lnh break v lnh continue Hiu hm exit().

Vng lp

Gii thiu: Mt trong nhng im mnh ln nht ca my tnh l kh nng thc hin mt chui cc lnh lp i lp li. iu c c l do s dng cc cu trc lp trong ngn ng lp trnh. Trong bi ny bn s tm hiu cc loi vng lp khc nhau trong C. Mt trong nhng u im ln nht ca my tnh l kh nng thc thi mt chui cc ch th lp di lp li. iu ny c c l nh vo cc cu trc lp trong ngn ng lp trnh. Trong bi ny chng ta s tm hiu cc cu trc vng lp khc nhau trong C. 9.1 Cu trc lpVng lp: Vng lp l mt on m lnh trong chng trnh c thc hin lp i lp li cho n khi tha mn mt iu kin no . Vng lp l mt khi nim c bn trong lp trnh cu trc. Mt vng lp l phn m lnh trong mt chng trnh c thc hin lp i lp li mi cho n khi mt iu kin xc nh c tha. Khi nim vng lp l nn tn ca lp trnh cu trc. Trong C c cc loi vng lp sau: Vng lp for Vng lp while Vng lp dowhile Ta s dng cc ton t quan h v ton t logic trong cc biu thc iu kin iu khin s thc hin ca vng lp. Cc cu trc lp sn c trong C l: Lp for. Lp while. Lp do while Trong C, iu kin iu khin s thc thi ca vng lp c to ra bng vic s dng cc ton t Quan h v Logic. 9.2 Vng lp for: C php tng qut ca vng lp for nh sau: for(khi to gi tr cho bin iu khin; biu kin;biu thc thay i gi tr ca bin iu khin) { Cu lnh (cc cu lnh); }

thc

iu

Vng lp

Khi to gi tr cho bin iu khin l mt cu lnh gn gi tr ban u cho bin iu khin trc khi thc hin vng lp. Lnh ny ch c thc hin duy nht mt ln. Biu thc iu kin l mt biu thc quan h, xc nh iu kin thot cho vng lp. Biu thc thay i gi tr ca bin iu khin xc nh bin iu khin s b thay i nh th no sau mi ln vng lp c lp li (thng l tng hoc gim gi tr ca bin iu khin). Ba phn trn c phn cch bi du chm phy. Cu lnh trong thn vng lp c th l mt lnh duy nht (lnh n) hoc lnh phc (nhiu lnh). Vng lp for s tip tc c thc hin chng no m biu thc iu kin cn ng (true). Khi biu thc iu kin l sai (false), chng trnh s thot ra khi vng lp for. C php tng qut ca vng lp for nh sau: for(khi to b m;iu kin kim tra;nh li gi tr tham s) { Cc cu lnh; } khi to b m l mt lnh gn thit lp bin iu khin ca vng lp trc khi bt u vng lp. Cu lnh ny ch c thc thi mt ln. iu kin kim tra l mt biu thc quan h, xc nh khi no vng lp s kt thc . nh li gi tr tham s nh ngha cch thay i gi tr ca bin iu khin vng lp (thng thng, bin ny s tng hoc gim gi tr thit lp ti thi im bt u) mi khi vng lp c lp li. Ba phn ny ca vng lp for c phn cch bi du chm phy (;). Cc cu lnh, phn thn ca vng lp, c th l mt cu lnh n hoc mt lnh ghp (nhiu cu lnh). Vng lp for tip tc c thc thi khi iu kin kim tra c kt qu true. Ngc li, khi iu kin c kt qu false, chng trnh tip tc cu lnh sau vng lp for. Xem v d sau: /* y l chng trnh minh ha vng lp for trong chng trnh C*/ #include <stdio.h> main() { int count; printf(\t This is a \n); for (count = 1; count <= 6; count++) printf(\n \t \t nice); printf(\n\t\t world. \n); } Kt qu ca chng trnh trn c minh ha nh sau: Kt qu ca chng trnh hin th nh sau: This is a nice nice nice nice nice nice world. Chng ta s xem xt k on vng lp for trong chng trnh trn: 1. Khi to gi tr cho bin iu khin: count = 1.

Formatted: Bullets and Numbering

Lp trnh c bn C

Lnh ny c thc hin duy nht mt ln khi vng lp bt u c thc hin, v bin count c t gi tr l 1. 2. Biu thc iu kin: count < = 6. Chng trnh kim tra xem gi tr hin ti ca bin count c nh hn hay bng 6 hay khng. Nu ng, cc cu lnh trong thn vng lp s c thc hin. 3. Thn ca vng lp c duy nht mt lnh printf(\n \t \t nice); Cu lnh ny c th t trong cp du ngoc nhn {} cho d nhn. 4. Biu thc thay i gi tr ca bin iu khin count++, tng gi tr ca bin count ln 1 cho ln lp k tip. Cc bc 2, 3, 4 c lp li cho n khi biu thc iu kin l sai. Vng lp trn s c thc hin 6 ln vi gi tr ca count thay i t 1 n 6. V vy, t nice xut hin 6 ln trn mn hnh. Sau , count tng ln 7. Do gi tr ny ln hn 6, vng lp kt thc v cu lnh sau vng lp c thc hin. Quan st vng lp for trong chng trnh: 1.Khi to b m count = 1. c thc thi ch mt ln khi bt u vng lp, v bin count c thit lp gi tr l 1. 2.iu kin kim tra l count < = 6. Mt s kim tra c thc hin xc nh gi tr hin hnh ca bin count c nh hn hay bng 6 khng. Nu kt qu l true, th thn ca vng lp c thc thi. 3.Phn thn ca vng lp cha mt cu lnh n. printf(\n \t \t nice); Cu lnh ny c th t trong cp du ngoc {} gip d nhn hn. 4.Phn nh li gi tr tham s l count++, tng gi tr ca bin count ln 1 cho ln lp k tip. Cc bc 2, 3, 4 c lp li cho n khi iu kin kim tra tr thnh false. Vng lp s c thc hin 6 ln vi gi tr ca count chy t 1 n 6. V vy, t nice xut hin 6 ln trn mn hnh. ln lp k tip, count tng ln 7. Do gi tr ny ln hn 6, vng lp kt thc v cu lnh sau vng lp c thc thi. Chng trnh sau in ra cc s chn t 1 n 25. V d 9.2: #include <stdio.h> main() { int num; printf(The even numbers from 1 to 25 are: \n\n); for (num2; num <= 25; num+=2) printf(%d\n, num); } Kt qu ca chng trnh trn nh sau:
Formatted: Bullets and Numbering Formatted: Bullets and Numbering Formatted: Bullets and Numbering Formatted: Bullets and Numbering

Formatted: Bullets and Numbering

Formatted: Bullets and Numbering

Formatted: Bullets and Numbering

Vng lp

The even numbers from 1 to 25 are: 2 4 6 8 10 12 14 16 18 20 22 24 Vng lp for trn khi to gi tr ca bin nguyn num l 2 ( ly mt s chn) v tng gi tr ca n ln 2 mi ln vng lp c lp li.
Vng lp for trn khi to bin s nguyn num l 2 ( ly mt s chn) v mi khi vng lp c thc thi gi tr ca n s c tng 2.

Trong cc vng lp for, biu thc iu kin lun c kim tra ngay khi bt u vng lp. Do cc lnh trong thn vng lp s khng c thc hin nu ngay t ban u iu kin l sai. Trong cc vng lp for, iu kin kim tra lun lun c thc hin ti u vng lp. iu ny c ngha rng, on m lnh bn trong vng lp khng c thc thi nu iu kin l false khi bt u ln lp . Ton t phy (comma): Phn biu thc trong ton t for c th c m rng thm vo cc lnh khi to hay cc lnh thay i gi tr ca bin. C php nh sau: Phm vi ca vng lp for c th c m rng bng s thm vo nhiu hn mt biu thc khi to hoc biu thc tng tr trong phn c t ca vng lp for. nh dng nh sau: biu_thc1 , biu_thc2 Cc biu thc trn c phn cch bi ton t phy ( , ), v c thc hin t tri sang phi. Th t ca cc biu thc l quan trng trong trng hp gi tr ca biu thc th hai ph thuc vo gi tr ca biu thc th nht. Ton t ny c u tin thp nht trong cc ton t ca C. Cc biu thc c phn cch bi ton t phy v c nh tr t tri sang phi. Th t nh tr biu thc l quan trng nu gi tr ca biu_thc2 l thuc vo gi tr mi c tnh ton ca biu_thc1. Ton t ny c u tin thp nht trong cc ton t ca C. V d di y in ra mt bng cc php cng vi kt qu khng i minh ha khi nim v ton t phy r rng hn. V d sau y s in ra mt bng php cng vi kt qu l mt hng s, nhm minh ha khi nim v ton t phy r rng hn: V d 9.3: #include <stdio.h> main() { int i, j, max; printf(Please enter the maxinum value \n); printf(for which a table can be printed: ); scanf(%d, &max);

Lp trnh c bn C

for (i = 0, j = max; i < = max; i++, j--) printf(\n%d + %d = %d, i, j, i + j); } Kt qu ca chng trnh trn c minh ha nh sau: Mt v d thc thi chng trnh trn nh sau: Please enter the maxinum value for which a table can be printed: 5 0 + 5 = 5 1 + 4 = 5 2 + 3 = 5 3 + 2 = 5 4 + 1 = 5 5 + 0 = 5 Ch trong vng lp for, phn khi to gi tr l:
i = 0, j = max

Khi vng lp bt u chy, i c gn gi tr 0 v j c gn gi tr ca max. Phn thay i gi tr ca bin iu khin gm hai biu thc:
i++, j

sau mi ln thc hin thn vng lp, i c tng ln 1 v j gim i 1. Tng ca hai bin lun bng max v c in ra mn hnh: Ch , trong vng lp for, khi to tham s l: i = 0 , j = max Khi c thc thi, i c gn gi tr 0 v j c gn gi tr ca max.. Biu thc nh li tr tham s (tng tr) cng cha hai biu thc: i ++ , j-sau mi ln lp, i c tng ln 1 v j c gim xung 1. Tng ca hai bin lun lun bng gi tr max c in ra mn hnh. Vng lp for lng nhau: Mt vng lp for c gi l lng nhau vo khi n nm bn trong mt vng lp for khc. M lnh s c dng tng t nh sau:N s c dng tng t nh sau: for (i = 1; i < max1; i++) { . . for (j = 0; j < max2 ; j++) { .. } . } Xem v d sau: V d 9.4: #include <stdio.h>

Vng lp

main() { int i, j, k; i = 0; printf(Enter no. of row: ); scanf(%d, &i); printf(\n); for (j = 0; j < i; j++) { printf(\n); for (k = 0; k <= j; k++) printf(*); } }

/*vng lp for bn trong*/

Chng trnh trn s hin th k t * trn mi dng v s k t * trn mi dng s tng thm 1. Chng trnh s nhn vo s dng, t k t * s c in ra. V d, nu nhp vo s 5, kt qu nh sau

Lp trnh c bn C

Chng trnh trn s hin th * trn mi dng v s * trn mi dng s tng 1. Chng trnh s nhn vo s dng, t * s c in ra. V d, nu nhp vo s 5, kt qu nh sau: * ** *** **** ***** Cc trng hp khc ca vng lp for: Vng lp for c th c s dng m khng cn phi c y cc thnh phn ca n. V d, for (num = 0; num != 255;) { printf(Enter no. ); scanf(%d,&num); } on m trn s yu cu nhp gi tr cho bin num cho n khi nhp vo 255. Vng lp khng c phn thay i gi tr ca bin iu khin. Vng lp s kt thc khi bin num c gi tr 255. on m trn s nhp mt gi tr cho bin num cho n khi nhp vo gi tr 255. Vng lp ny khng c biu thc nh tr li tham s. Vng lp s kt thc khi num c gi tr 255. Tng t, xt v d sau: . . printf("Enter value for checking :"); scanf("%d", &num); for(; num < 100; ) { . . } Vng lp trn khng c phn khi to tham s v phn thay i gi tr ca tham s. Vng lp ny khng c biu thc khi to v biu thc nh tr li tham s. Vng lp for khi c s dng khng c bt k thnh phn no s l mt vng lp v tn for ( ; ; ) printf(This loop will go on and on and on \n); Tuy nhin, lnh break bn trong vng lp s cho php thot khi vng lp. Tuy nhin, mt lnh break c s dng trong vng lp s gip thot ra khi vng lp. for ( ; ; ) { printf(This will go on and on); i = getchar(); if (i == X || i == x); break; }

Vng lp

Vng lp trn s thc thic thc hin cho n khi ngi dng nhp vo x hoc X. Vng lp for (hay vng lp bt k) c th khng c bt k lnh no trong phn thn ca n. K thut ny gip tng tnh hiu qu trong mt vi gii thut v to ra tr v mt thi gian. Vng lp for (hay vng lp bt k) cng c th c s dng khng cn phn thn (cc lnh) ca vng lp. iu ny gip tng tnh hiu qu ca mt vi gii thut v to cc vng lp tr hon.thi gian. for (i = 0; i < xyz_value; i++); l mt v d ca vng lp tr hon thi gian to ra tr v thi gian. 9.1.2 Vng lp while: Cu trc lp th hai trong C l vng lp while. C php tng qut nh sau: while (iu_kin l ng) cu_lnh; , cu_lnh c th l rng, hay mt lnh n, hay mt khi lnh. Nu vng lp while cha mt tp cc lnh th chng phi c t trong cp ngoc xon {}. iu_kin c th l biu thc bt k. Vng lp s c thc hin lp i lp li khi iu kin trn l ng (true). Chng trnh s chuyn n thc hin lnh tip sau vng lp khi iu kin trn l sai (false). Vng lp s lp trong khi iu_kin l true. iu khin chng trnh s chuyn n cu lnh sau vng lp khi iu_kin tr thnh false. Vng lp for c th c s dng khi s ln thc hin vng lp c xc nh trc. Khi s ln lp khng bit trc, vng lp while c th c s dng. Vng lp for c th c s dng trong trng hp s ln lp c bit trc khi vng lp thc thi. Khi s ln lp khng c bit trc thi vng lp while c th c s dng. V d 9.5: /* A simple program using the while loop*/ #include <stdio.h> main() { int count = 1; while (count <= 10) { printf(\n This is iteration %d\n, count); count++; } printf(\nThe loop is completed. \n); } Kt qu ca chng trnh trn c minh ha nh sau: Kt qu c trnh by bn di: This is iteration This is iteration This is iteration This is iteration This is iteration This is iteration This is iteration This is iteration This is iteration

1 2 3 4 5 6 7 8 9

Lp trnh c bn C

This is iteration 10 The loop is completed. u tin chng trnh gn gi tr ca count l 1 ngay trong cu lnh khai bo n. Sau chng trnh chuyn n thc hin lnh while. Phn biu thc iu kin c kim tra. Gi tr hin ti ca count l 1, nh hn 10. Kt qu kim tra iu kin l ng (true) nn cc lnh trong thn vng lp while c thc hin. Cc lnh ny c t trong cp du ngoc nhn {}. Gi tr ca bin count l 2 sau ln lp u tin. Sau biu thc iu kin li c kim tra ln na. Qu trnh ny c lp i lp li cho n khi gi tr ca count ln hn 10. Khi vng lp kt thc, lnh printf() th hai c thc hin. Bt u chng trnh thit lp gi tr ca count l 1 ngay trong cu lnh khai bo. Lnh k tip c thc thi l lnh while. Trc tin iu kin c kim tra. Gi tr hin hnh ca bin count l 1, nh hn 10. Kt qu kim tra iu kin l true, v v vy cc lnh trong phn thn ca vng lp while c thc thi. Bi v cc lnh c t trong cp du ngoc {}, gi tr ca bin count tr thnh 2 sau ln lp th nht. iu kin li c kim tra ln na. Qu trnh ny c lp li cho n khi gi tr ca bin count ln hn 10. Khi vng lp c kt thc, lnh printf() th hai c thc thi. Ging nh vng lp for, vng lp while kim tra iu kin ngay khi bt u thc hin vng lp. Do cc lnh trong thn vng lp s khng c thc hin nu ngay t ban u iu kin l sai Ging nh cc vng lp for, cc vng lp while kim tra iu kin ti nh ca vng lp. iu ny c ngha l on m lnh ca vng lp s khng c thc thi nu iu kin l false ngay lc bt u. Biu thc iu kin trong vng lp c th phc tp ty theo yu cu ca bi ton. Cc bin trong biu thc iu kin c th b thay i gi tr trong thn vng lp, nhng cui cng iu kin phi sai (false) nu khng vng lp s khng bao gi kt thc. Sau y l v d v mt vng lp while v hn. Biu thc kim tra iu kin trong vng lp c th phc tp khi c yu cu. Cc bin trong biu thc kim tra iu kin c th c gn tr li bn trong vng lp, nhng im cn lu l sau cng biu thc kim tra iu kin phi tr thnh false, nu khng vng lp s khng bao gi kt thc. Sau y l v d v mt vng lp while v hn. V d 9.6: #include <stdio.h> main() { int count = 0; while (count < 100) { printf(This goes on forever, HELP!!!\n); count += 10; printf(\t%d, count); count -= 10; printf(\t%d, count); printf(\Ctrl - C will help); } } trn, count lun lun bng 0, ngha l lun nh hn 100 v v vy biu thc lun lun tr v gi tr true. Nn vng lp khng bao gi kt thc. Nu c hn mt iu kin c kim tra kt thc vng lp, vng lp s kt thc khi c t nht mt iu kin trong cc iu kin l false. V d sau s minh ha iu ny. #include <stdio.h> main() { int i, j; i = 0;

Vng lp

j = 10; while (i < 100 && j > 5) { ... i++; j -= 2; } ... } Vng lp ny s thc hin 3 ln, ln lp th nht j s l 10, ln lp k tip j bng 8 v ln lp th ba j s bng 6. Sau Khi i vn nh hn 100 (i bng 3), j nhn gi tr 4 v iu kin j > 5 tr thnh false, v vy vng lp kt thc. Chng ta hy vit mt chng trnh nhn d liu t bn phm v in ra mn hnh. Chng trnh kt thc khi bn nhn phm ^Z (Ctrl + Z). V d 9.7: /* ECHO PROGRAM */ /* A program to accept input data from the console and print it on the screen */ /* End of input data is indicated by pressing ^Z*/ #include <stdio.h> main() { char ch; while ((ch = getchar()) != EOF) { putchar(ch) } } Kt qu ca chng trnh trn c minh ha nh sau: V d mt kt qu thc thi nh sau: Have Have a a good good day day ^Z D liu ngi dng nhp vo c in m. Chng trnh lm vic nh th no ? Sau khi nhp vo mt tp hp cc k t, ni dung ca n s c in hai ln lln mn hnh ch khi bn nhn <ReturnEnter>. iu ny l do cc k t bn nhp vo t bn phm c lu tr trong b m bn phm. V lnh putchar() s ly n t b m sau khi bn nhn phm <ReturnEnter>. Ch cch thc kt thc qu trnh nhp de liu bng t hp phm ^Z, y l k t kt thc file tront DOS. Ch , lm th no vic nhp d liu c kt thc vi ^Z, y l k t kt thc tp tin trong h iu hnh MS DOS. 9.1.3 Vng lp do ... while: Vng lp do ... while cn c gi l vng lp do trong C. Khng ging nh vng lp for v while, vng lp ny kim tra iu kin ti cui vng lp. iu ny c ngha l vng lp do ... while s c thc hin t nht mt ln, ngay c khi iu kin l sai (false) ln chy u tin.

10

Lp trnh c bn C

Vng lp do ... while cn c gi l vng lp do trong C. Khng ging nh vng lp for v while, vng lp ny kim tra iu kin ti cui vng lp. iu ny c ngha l vng lp do ... while s c thc hin t nht mt ln, ngay c khi iu kin l false ngay ln kim tra u tin. C php tng qut ca vng lp do ... while nh sau: do{ cu_lnh; } while (iu_kin); Cp du ngoc {} l khng cn thit khi ch c mt cu lnh hin din trong vng lp, nhng vic s dng du ngoc {} l mt thi quen tt. Vng lp do ... while lp n khi iu_kin mang gi tr false. Trong vng lp do ... while, cu_lnh (khi cc cu lnh) s c thc thi trc, v sau iu_kin c kim tra. Nu iu kin l true, chng trnh s quay li thc hin lnh do. Nu iu kin l false, chng trnh chuyn n thc hin lnh nm sau vng lp. Nu iu_kin l true, iu khin c chuyn n lnh do. Khi iu_kin tr thnh false, iu khin chuyn n cu lnh sau vng lp. Xt chng trnh sau: V d 9.8:
/* accept only int value */ #include <stdio.h> void main() { int num1, num2; num2 = 0; do{ printf(\nEnter a number: ); scanf(%d,&num1); printf(No. is %d, num1); num2++; }while (num1 != 0); printf(\nThe total numbers entered were %d,--num2); /* num2 is decremented before printing because count for last integer (0) is not to be considered */ }

Mt v d thc thi chng trnh trn nh sau:Kt qu ca chng trnh c minh ha nh sau: Enter a number: 10 No. is 10 Enter a number: 300 No. is 300 Enter a number: 45 No. is 45 Enter a number: 0 No. is 0 The total numbers entered were 3 on chng trnh trn s nhn cc s nguyn v hin th chng cho n khi mt s 0 c nhp vo. V sau chng trnh s thot khi vng lp do ... while v s lng cc s nguyn c nhp vo. Cc vng lp while lng nhau v do ... while Cng ging nh vng lp for, cc vng lp while v do ... while cng c th c lng vo nhau. Hy xem mt v d c a ra di y. Mt v d c cho di y.

Vng lp

11

V d 9.9: #include <stdio.h> void main() { int x; char i, ans; i = ''; do{ clrscr(); x = 0; ans = y; printf(\nEnter sequence of character: ); do{ i = getchar(); x++; }while (i != \n); i = ''; printf(\nNumber of characters entered is:%d, --x); printf(\nMore sequences (Y/N)?); ans = getch(); }while (ans == Y || ans == y); } Mt v d thc thi chng trnh trn nh sau:Kt qu ca chng trnh c minh ha nh sau: Enter sequence of character: Good Morning! Number of character entered is: 14 More sequences (Y/N)? N Chng trnh trn yu cu ngi dng nhp vo mt chui k t cho n khi nhn phm enter (vng lp while bn trong). Khi , chng trnh thot khi vng lp dowhile bn trong. Sau chng trnh hi ngi dng c mun nhp tip na hay thi. Chng trnh ny trc ht yu cu ngi dng nhp vo mt chui cc k t n khi phm enter c kch hot (do...while). Mt khi phm Enter c nhn, chng trnh thot khi vng lp do ... while bn trong. Sau chng trnh hi ngi dng c nhp tip cc chui k t na khng. Nu ngi dng nhn phm y hoc Y, iu kin cho vng while bn ngoi l true v chng trnh nhc ngi dng nhp vo chui k t khc. Chng trnh c tip tc cho n khi ngi dng nhn bt k mt phm no khc vi phm y hoc Y. V chng trnh kt thc. 9.2 Lnh chuyn iu khinCc lnh nhy: C c bn cu lnh thc hin s r nhnh khng iu kin: return, goto, break, v continue. S r nhnh khng iu kin ngha l s chuyn iu khin t mt im n mt lnh xc nh. Trong cc lnh chuyn iu khin trn, return v goto c th dng bt k v tr no trong chng trnh, trong khi lnh break v continue c s dng kt hp vi cc cu lnh vng lp. 9.2.1 Lnh return:

Lnh return dng quay li v tr gi hm sau khi cc lnh trong hm c thc thi xong. Trong lnh return c th c mt gi tr gn vi n, gi tr s c tr v cho chng trnh. C php tng qut ca cu lnh return nh sau:
Lnh return c dng tr v t mt hm. N khin s thc thi tr v v tr gi thc thi hm. Lnh return c th c mt gi tr i km vi n, gi tr ny s tr v cho chng trnh. C php tng qut ca lnh return nh sau:

12

Lp trnh c bn C

return biu_thc; Biu_thc l mt ty chn (khng bt buc). C th c hn mt lnh return c s dng trong mt hm. Tuy nhin, hm s quay tr v v tr gi hm tr v khi gp lnh return u tin. Lnh return s c lm r hn sau khi hc v hm. 9.2.2 Lnh goto:

C l mt ngn ng lp trnh c cu trc, tuy vy n vn cha mt s cu lnh lm ph v cu trc ca chng trnh:


Mc d C l mt ngn ng lp trnh cu trc, nhng n c mt vi hnh thc iu khin chng trnh khng cu trc: goto label

Lnh goto cho php chuyn quyn iu khin ti mt lnh bt k nm trong cng khi lnh hay khc khi lnh bn trong hm . V vy n vi phm cc qui tc ca mt ngn ng lp trnh c cu trc.
Trong chng trnh C, mt lnh goto cho php chuyn iu khin khng ch n bt k mt cu lnh no khc trong cng mt hm, m cn cho php nhy ra khi v nhy n cc khi lnh. V vy n vi phm qui lut ca mt ngn ng lp trnh cu trc. C php tng qut ca mt cu lnh goto l: goto label;

Trong label l mt nh danh phi xut hin nh l tin t (prefix) ca mt cu lnh khc trong cng mt hm. Du chm phy (;) sau label nh du s kt thc ca lnh goto. Cc lnh goto
lm cho chng trnh kh c. Chng lm gim tin cy v lm cho chng trnh kh bo tr. Tuy nhin, chng vn c dng v chng cung cp cc cch thc hu dng thot ra khi nhng vng lp lng nhau qu nhiu mc. label l mt nh danh phi xut hin trc (tip u ng) mt cu lnh C khc trong cng mt hm. Du chm phy (;) sau label nh du s kt thc ca lnh goto. Cc lnh goto trong chng trnh to nn s kh c. Chng lm gim tin cy v lm chng trnh kh bo tr. Tuy nhin, chng c s dng v chng cung cp cch thc hu dng thot ra khi nhng vng lp lng nhau qu su. Xt on m sau: for (...) { for(...) { for(...) { while(...) { if (...) goto error1; ... } } } } error1: printf(Error !!!); Nh thy, label xut hin nh l mt tip u ng tin t ca mt cu lnh khc trong chng trnh. label: cu_lnh

Vng lp

13

hoc label: { Chui cc cu lnh; } V d 9.10: #include <stdio.h> #include <conio.h> void main() { int num clrscr(); label1: printf(\nEnter a number (1): ); scanf(%d, &num); if (num == 1) goto Test; else goto label1; Test: printf(All done...); } Mt v d v kt qu ca chng trnh nh sauKt qu ca chng trnh trn c minh ha nh sau: Enter a number: 4 Enter a number: 5 Enter a number: 1 All done... 9.2.3 Lnh break: Cu lnh break c hai cch dng. N c th c s dng kt thc mt case trong cu lnh switch v/hoc kt thc ngay mt vng lp, m b quakhng cn s kim tra iu kin vng lp thng thng. Khi chng trnh gp lnh break c gp bn trong mt vng lp, ngay lp tc vng lp c kt thc v quyn iu khin chng trnh c chuyn n cu lnh theo sau vng lp. V d, V d 9.11: #include <stdio.h> void main() { int count1, count2; for (count1= 1,count2 = 0; count1 <= 100; count1++) { printf(Enter %d Count2: count1); scanf(%d,count2); if (count2==100) break; } } Kt qu ca chng trnh trn c minh ha nh sau:Mt v d v kt qu thc thi chng trnh trn nh sau:

14

Lp trnh c bn C

Enter 1 count2: 10 Enter 2 count2: 20 Enter 3 count2: 100 Trong on m lnh trn, ngi dng c th nhp gi tr 100 cho jcount2. Tuy nhin, nu 100 c nhp vo, vng lp kt thc v iu khin c chuyn n cu lnh k tip. Mt im khc cn lu l vic s dng cu lnh break trong cc lnh lp lng nhau. Khi chng trnh thc thi n mt lnh break nm trong mt vng lp for lng bn trong mt vng lp for khc, quyn iu khin c chuyn tr v vng lp for bn ngoi.Mt im khc cn lu trong khi s dng break l n to ra s thot khi mt vng lp bn trong. iu ny c ngha l nu mt vng lp for lng bn trong mt vng lp for khc, v mt lnh break c bt gp vng lp bn trong, iu khin c chuyn tr v vng lp bn ngoi. 9.2.4 Lnh continue: Lnh continue kt thc ln lp hin hnh v bt u ln lp k tip. Khi gp lnh ny trong chng trnh, cc cu lnh cn li trong thn ca vng lp c b qua v quyn iu khin c chuyn n bc u ca vng lp trong ln lp k tipLnh continue kt thc ln lp hin hnh v bt u ln lp k tip. Khi lnh ny c gp trong chng trnh, cc cu lnh cn li trong thn ca vng lp c b qua v iu khin c chuyn n bc u ca vng lp trong ln lp k tip. Trong trng hp vng lp for, continue thc hin biu thc thay i gi tr ca bin iu khin v sau kim tra biu thc iu kin. Trong trng hp ca lnh while v dowhile, quyn iu khin chng trnh c chuyn n biu thc kim tra iu kin. V dTrong trng hp vng lp for, continue thc thi biu thc nh tr li tham s ca vng lp v sau biu thc kim tra iu kin c thc thi. Trong trng hp ca lnh while v do while, iu khin chng trnh c chuyn n biu thc kim tra iu kin. V d: V d 9.12: #include <stdio.h> void main() { int num; for (num = 1; num <= 100; num++) { if (num % 9 == 0) countinue; printf(%d\t, num); } } Chng trnh trn in ra tt c cc s t 1 n 100 khng chia ht cho 9. Kt qu chng trnh c trnh by nh sau: 1 14 28 40 53 66 79 93 2 15 29 41 55 67 80 94 3 16 30 42 56 68 82 95 4 17 31 43 57 69 83 96 5 19 32 44 58 70 84 97 6 20 33 46 59 71 85 98 7 21 34 47 60 73 86 100 8 22 35 48 61 74 87 10 23 36 49 62 75 88 11 24 37 50 63 76 89 12 25 38 51 64 77 91 13 26 39 52 65 78 92

Vng lp

15

9.3 Hm exit(): Hm exit() l mt hm trong th vin chun ca C. N lm vic tng t nh mt lnh chuyn quyn iu khin, im khc nhau chnh l cc lnh chuyn quyn iu khin thng c s dng thot khi mt vng lp, trong khi exit() c s dng thot khi chng trnh. Hm ny s ngay lp tc kt thc chng trnh v quyn iu khin c chuyn tr tr v cho h iu hnh. Hm exit() thng c dng kim tra mt iu kin bt buc cho vic thc thi ca mt chng trnh c c tho mn hay khng. C php tng qut ca hm exit() nh sauHm exit() thng c dng kim tra mt iu kin bt buc cho s thc thi ca mt chng trnh c tho hay khng. C php tng qut ca hm exit() nh sau: exit (int m_tr_v); m_tr_v l mt ty chn. S 0 thng c dng nh mt m_tr_v xc nh s kt thc chng trnh mt cch bnh thng. Nhng gi tr khc xc nh mt vi loi li.

16

Lp trnh c bn C

Tm tt bi hc Cc cu trc vng lp sn c trong C: Vng lp for. Vng lp while. Vng lp do while. Trong C, vng lp for cho php s thc thi cc cu lnh c lp li. N dng ba biu thc, phn cch bi du chm phy, iu khin qu trnh lp. Phn thn ca vng lp c th l mt lnh n hoc lnh ghp. Ton t du phy i khi hu dng trong cc lnh for. Trong C, y l ton t c u tin thp nht. Phn thn ca lnh do c thc hin t nht mt ln. Trong C c bn lnh thc hin s r nhnh khng iu kin: return, goto, break, v continue. Lnh break cho php nhanh chng thoat khi mt vng lp n hoc mt vng lp lng nhau. Cu lnh continue bt u ln lp k tip ca vng lp. Mt lnh goto chuyn iu khin mt cu lnh bt k trong cng mt hm trong chng trnh C, n cho php nhy vo v ra khi cc khi lnh. Hm exit() kt thc ngay chng trnh v iu khin c chuyn tr v cho h iu hnh.

Vng lp

17

Kim tra tin hc tp 1. cho php mt tp cc ch th c thc thi cho n khi mt iu kin xc nh t c. A. Vng lp C. Ton t B. Cu trc D. Tt c u sai.

2. Cc vng lp kim tra iu kin tai nh ca vng lp, iu ny c ngha l on m lnh ca vng lp khng c thc thi nu iu kin l sai ti im bt u. A. vng lp while C. vng lp do while B. vng lp for D. Tt c u sai.

3. Mt c s dng phn cch ba phn ca biu thc trong mt vng lp for. A. du phy C. du gnh ni B. du chm phy D. Tt c u sai

4. Vng lp kim tra iu kin ti cui vng lp, ngha l sau khi vng lp c thc thi. A. while C. do while B. for D. Tt c u sai

5. Lnh thc hin s tr v mt v tr m ti hm c gi. A. exit C. goto B. return D. Tt c u sai

6. Lnh vi phm qui lut ca mt ngn ng lp trnh cu trc. A. exit C. goto B. return D. Tt c u sai

7. Hm kt thc ngay chng trnh v iu khin c chuyn tr v cho h iu hnh. A. exit C. goto B. return D. Tt c u sai

18

Lp trnh c bn C

Bi tp t lm 1. Vit chng trnh in ra dy s 100, 95, 90, 85, .., 5. 2. Nhp vo hai s num1 v num2. Tm tng ca tt c cc s l nm gia hai s c nhp. 3. Vit chng trnh in ra chui Fibonaci (1, 1, 2, 3, 5, 8, 13,) 4. Vit chng trnh hin th theo mu di y: (a) 1 12 123 1234 12345 (b) 12345 1234 123 12 1

5. Vit chng trnh in ln mn hnh nh sau: ******* ****** ***** **** *** ** *

Vng lp

19

Bi 10
Mc tiu: Kt thc bi hc ny, bn c th: S dng cu trc vng lp Vit mt vi chng trnh: S dng vng lp for S dng vng lp while S dng vng lp do...while.

Vng lp

Cc bc trong bi hc ny c trnh by chi tit, r rng v cn thn. iu ny gip ta hiu r v cng c lp trnh. Thc hin theo cc bc sau tht cn thn. Phn I - Trong thi gian 1 gi 30 pht u: 10.1 S dng vng lp for: Trong phn ny chng ta s vit mt chng trnh s dng vng lp for. Chng trnh hin th cc s chn t 1 n 30. Trong chng trnh, mt bin s nguyn, num, c khai bo. Vng lp for c s dng hin th cc s chn n 30. i s u tin ca vng lp for, khi to bin num l 2. i s th hai ca vng lp for, kim tra gi tr ca bin c nh hn hoc bng 30 khng. Nu iu kin ny tha, lnh trong vng lp c thc hin. Lnh printf() c s dng hin th gi tr ca bin num. Trong i s th ba, gi tr ca bin num c tng ln 2. Trong C, num +=2 ging nh num = num + 2. Lnh printf c thc thi khi i s th hai vn tha. Mt khi gi tr ca bin tr nn ln hn 30, iu kin khng tha na v v vy vng lp khng c thc thi. Du ngoc nhn {} khng cn thit khi ch c mt cu lnh hin din trong vng lp, nhng vic s dng cp du ngoc {} l mt thi quen lp trnh tt. 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { int num; clrscr(); printf(The even Numbers from 1 to 30 are \n ); for (num = 2; num <= 30; num +=2) printf(%d\n, num); } 3. Lu tp tin vi tn for.C. 4. Bin dch tp tin for.C. 5. Thc thi chng trinh for.C . 6. Tr v ca s Edit Window. KT QU:

Vng lp

The even Numbers from 1 to 30 are 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 10.2 S dng vng lp while: Trong phn ny chng ta s vit mt chng trnh s dng vng lp while. Chng trnh hin th cc s t 10 n 0 theo th t o ngc. Trong chng trnh c mt bin s nguyn num. Bin c khi to. Xt dng m lnh sau: while (num >= 0) { printf(\n%d, num); num--; } Lnh while kim tra, gi tr ca bin num c ln hn 0 hay khng. Nu iu kin tha lnh printf() c thc thi v gi tr ca bin num gim 1. Trong C, num--lm vic ging nhu num = num 1. Vng lp while vn tip tc khi gi tr ca bin ln hn 1 hoc bng 0. 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { int num; clrscr(); num = 10; printf(\n Countdown); while (num >= 0) { printf(\n%d, num); num--; } } 3. Lu tp tin vi tn while.C. 4. Bin dch tp tin while.C.

Lp trnh c bn C

5. Thc thi chng trinh while.C. 6. Tr v ca s Edit Window. KT QU: Countdown 10 9 8 7 6 5 4 3 2 1 0 10.3 S dng vng lp do...while: Trong phn ny chng ta s vit mt chng trnh s dng vng lp do...while. Vng lp do... while khc vi vng lp while l n thc thi lnh trc khi nh gi biu thc. Mt iu quan trng cn phi nh l, khng ging nh vng lp while, phn thn ca vng lp do s c thc hin t nht mt ln. Bi v vng lp while nh gi biu thc trc khi thc thi lnh, nu iu kin l sai (0) ngay lc bt u, phn lnh s khng bao gi c thc thi. Chng trnh s nhn vo cc s nguyn v hin th chng cho n khi s 0 c nhp vo. Sau n s thot khi vng lp do...while v in ra cc s nguyn c nhp. Chng trnh khai bo hai bin cnt v cnt1. Bn trong vng lp do while chng ta s nhp s bng cch s dng m lnh sau: printf(\nEnter a Number: ); scanf(%d,&cnt); Lnh bn di s hin th s nhp. printf(No. is %d, cnt); cnt1++ s tng gi tr bin cnt1 ln 1. Gi s nu chng ta nhp vo s 0, trc ht n s in gi tr v sau kim tra iu kin. Trong trng hp ny iu kin l sai. N s thot khi vng lp v in gi tr ca bin cnt1. Bin cnt1 c gim mt n v trc khi in ra bi v s nguyn cui cng (0) khng c m. 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { int cnt = 0, num; clrscr();

Vng lp

do { printf(\n Enter a Number: ); scanf(%d, &num); printf(No. is %d, num); cnt++; } while (num != 0); printf(\n The total numbers entered were %d, --cnt); } 3. Lu tp tin vi tn dowhile.C. 4. Bin dch tp tin dowhile.C. 5. Thc thi chng trinh dowhile.C. 6. Tr v ca s Edit Window. KT QU: Enter a number 11 No is 11 Enter a number 50 No is 50 Enter a number 0 No is 0 The total numbers entered were 2 10.4 S dng lnh break: Lnh break gip thot ra khi vng lp for, while, do-while hay lnh switch ngay lp tc. Chng trnh sau minh ha cc dng ca lnh break. Quan st on m lnh sau: for (cnt = 1; cnt <= 10; cnt++) { if (cnt == 5) break; printf(%d\n, cnt); } on m lnh trn s dng mt vng lp for in ra cc gi tr t 1 n 10. Gi tr ca bin cnt c khi to l 1, v sau n s kim tra iu kin. Nu iu kin l ng, n s thc thi cc cu lnh bn trong vng lp. Trong trng hp ny, chng trnh ch in ra 1, 2, 3, 4. Khi gi tr ca bin cnt l 5, iu kin if tr nn ng, v iu khin s thot khi vng lp. 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { int cnt; clrscr();

Lp trnh c bn C

for (cnt = 1; cnt <= 10; cnt ++) { if (cnt == 5) break; printf(%d\t, cnt); } } 3. Lu tp tin vi tn breakex.C. 4. Bin dch tp tin breakex.C. 5. Thc thi chng trinh breakex.C. 6. Tr v ca s Edit Window. KT QU: 1 2 3 4

10.4 S dng lnh continue: Lnh continue khi c dng trong mt vng lp while, for, hoc do-while s b qua tt c cc cu lnh pha sau v ln lp k tip c thc thi. Chng trnh sau minh ha cch s dng ca lnh continue. Xem on m lnh sau: for ( cnt = 1; cnt <=10; cnt++) { if (cnt ==5) continue; printf(%d\t, cnt); } on m lnh s dng mt vng lp for in ra cc gi tr t 1 n 10. Gi tr ca bin cnt c khi to l 1, sau iu kin s c kim tra. Nu iu kin l ng,cc lnh trong vng lp s c thc thi. Trong trng hp ny, chng trnh ch in ra cc s 1, 2, 3, 4, 6, 7, 8, 9 v 10. Khi gi tr ca bin cnt l 5, iu kin if tr nn ng v iu khin tr v u vng lp for m khng in ra gi tr 5. 1. To mt tp tin mi. 2. Nhp vo on m lnh sau y trong ca s Edit Window: #include <stdio.h> #include <conio.h> void main() { int cnt; clrscr(); for (cnt = 1; cnt <= 10; cnt++) { if (cnt == 5) continue; printf(%d\t, cnt); }

Vng lp

} 3. Lu tp tin vi tn continueex.C. 4. Bin dch tp tin continueex.C. 5. Thc thi chng trinh continueex.C. 6. Tr v ca s Edit Window. KT QU: 1 2 3 4 6 7 8 9 10

Lp trnh c bn C

Phn II: Trong thi gian 30 pht k tip: 1. Tm giai tha ca mt s. Gi : Xem cng thc tnh giai tha ca mt s : n! = n * (n-1) * (n-2) * ... * 1 4! = 4 * 3 * 2 * 1 1! = 1 0! = 1 Gi : Nhp vo mt s. Khi u, thit t giai tha ca mt s l 1. Trong khi s cn ln hn 1. Tnh giai tha ca mt s bng giai tha nhn vi s . Gim s xung mt n v. In ra giai tha.

Vng lp

Bi tp t lm 1. Khai bo mt bin lu tui ca mt ngi. In ra tn ca ngi vi s ln in bng s tui. 2. Vit chng trnh sinh dy s theo dng sau: 1 12 123 1234 12345 123456 1234567 12345678 123456789 3. Vit chng trnh in ra bng cu chng ca mt s c nhp vo.

Lp trnh c bn C

Bi 11
Mc tiu: Kt thc bi hc ny, bn c th: Hiu c cc phn t ca mng v cc ch s mng Khai bo mt mng Hiu cch qun l mng trong C Hiu mt mng c khi to nh th no Hiu mng chui/ k t Hiu mng hai chiu Hiu cch khi to mng nhiu chiu.

Mng

Gii thiu: C th bn s gp kh khn khi lu tr mt tp hp cc phn t d liu ging nhau trong cc bin khc nhau. V d, im cho tt c 11 cu th ca mt i bng phi c ghi nhn trong mt trn u. S lu tr im ca mi cu th trong cc bin c tn khc nhau th chc chn phin h hn dng mt bin chung cho chng. Vi mng mi vic s c thc hin n gin hn. Mt mng l mt tp hp cc phn t d liu c cng kiu. Mi phn t c lu tr cc v tr k tip nhau trong b nh chnh. Nhng phn t ny c gi l phn t mng. 11.1 Cc phn t mng v cc ch mc: Mi phn t ca mng c nh danh bng mt ch mc hoc ch s gn cho n. Chiu ca mng c xc nh bng s ch s cn thit nh danh duy nht mi phn t. Mt ch s l mt s nguyn dng c bao bng du ngoc vung [ ] t ngay sau tn mng, khng c khong trng gia. Mt ch s cha cc gi tr nguyn bt u bng 0. V vy, mt mng player vi 11 phn t c biu din nh sau: player[0], player[1], player[2], ... , player[10]. Nh thy, phn t mng bt u vi player[0], v v vy phn t cui cng l player[10] khng phi l player[11]. iu ny l do bi trong C, ch s mng bt u t 0; do trong mng N phn t, phn t cui cng c ch s l N-1. Phm vi cho php ca cc gi tr ch s c gi l min gii hn ca ch s mng, gii hn di v gii hn trn. Mt ch s mng hp l phi c mt gi tr nguyn nm trong nim gii hn. Thut ng hp l c s dng cho mt nguyn nhn rt c trng. Trong C, nu ngi dng c gng truy xut mt phn t nm ngoi dy ch s hp l (nh player[11] trong v d trn ca mng), trnh bin dch C s khng pht sinh ra li. Tuy nhin, c th n truy xut mt gi tr no dn n kt qu khng on c. Cng c nguy c vit chng ln d liu hoc m lnh chng trnh. V vy, ngi lp trnh phi m bo rng tt c cc ch s l nm trong min gii hn hp l. Khai bo mt mng: Mt mng c mt vi c tnh ring bit v phi c khai bo khi s dng chng. Nhng c tnh ny bao gm: Lp lu tr Kiu d liu ca cc phn t mng. Tn mng xc nh v tr phn t u tin ca mng. Kch thc mng - mt hng s c gi tr nguyn dng.

Mng

Mt mng c khai bo ging nh cch khai bo mt bin, ngoi tr tn mng c theo sau bi mt hoc nhiu biu thc, c t trong du ngoc vung [] xc nh chiu di ca mng. C php tng qut khai bo mt mng nh sau: lp_lu_tr kiu_d_liu tn_mng[biu_thc_kch_thc]

y, biu_thc_kch_thc l mt biu thc xc nh s phn t trong mng v phi nh ra mt tr nguyn dng. Lp_lu_tr l mt ty chn. Mc nh lp automatic c dng cho mng khai bo bn trong mt hm hoc mt khi lnh, v lp external c dng cho mng khai bo bn ngoi mt hm. V vy mng player c khai bo nh sau: int player[11]; Nn nh rng, trong khi khai bo mng, kch thc ca mng s l 11, tuy nhin cc ch s ca tng phn t bn trong mng s l t 0 n 10. Cc qui tc t tn mng l ging vi qui tc t tn bin. Mt tn mng v mt tn bin khng c ging nhau, n dn n s nhp nhng. Nu mt s khai bo nh vy xut hin trong chng trnh, trnh bin dch s hin th thng bo li. Mt vi qui tc vi mng: Tt c cc phn t ca mt mng c cng kiu. iu ny c ngha l, nu mt mng c khai bo kiu int, n khng th cha cc phn t c kiu khc. Mi phn t ca mng c th c s dng bt c ni no m mt bin c cho php hay c yu cu. Mt phn t ca mng c th c tham chiu n bng cch s dng mt bin hoc mt biu thc nguyn. Sau y l cc tham chiu hp l: player[i]; /* i l mt bin, tuy nhin cn phi ch rng i nm trong min gii hn ca ch s c khai bo cho mng player*/ player[3] = player[2] + 5; player[0] += 2; player[i / 2 + 1]; Kiu d liu ca mng c th l int, char, float, hoc double.

11.2 Vic qun l mng trong C: Mt mng c i x khc vi mt bin trong C. Thm ch hai mng c cng kiu v kch thc cng khng th tng ng nhau. Hn na, khng th gn mt mng trc tip cho mt mng khc. Thay v th, mi phn t mng phi c gn ring l tng ng vi tng phn t ca mng khc. Cc gi tr khng th c gn cho ton b mt mng, ngoi tr ti thi im khi to. Tuy nhin, tng phn t khng ch c th c gn tr m cn c th c so snh. int player1[11], player2[11]; for (i = 0; i < 11; i++) player1[i] = player2[i]; Tng t, cng c th c kt qu nh vy bng vic s dng cc lnh gn ring l nh sau: player1[0] = player2[0]; player1[1] = player2[1]; ... player1[10] = player2[10];

Lp trnh c bn C

Cu trc for l cch l tng thao tc cc mng. V d 11.1: /* Program demonstrates a single dimensional array */ #include <stdio.h> void main() { int num[5]; int i; num[0] = 10; num[1] = 70; num[2] = 60; num[3] = 40; num[4] = 50; for (i = 0; i < 5; i++) pirntf(\n Number at [%d] is %d, i, num[i]); } Kt qu ca chng trnh c trnh by bn di: Number Number Number Number Number at at at at at [0] [1] [2] [3] [4] is is is is is 10 70 60 40 50

V d bn di nhp cc gi tr vo mt mng c kch thc 10 phn t, hin th gi tr ln nht v gi tr trung bnh. V d 11.2: /*Input values are accepted from the user into the array ary[10]*/ #include <stdio.h> void main() { int ary[10]; int i, total, high; for (i = 0; i < 10; i++) { printf(\nEnter value: %d: , i + 1); scanf(%d, &ary[i]); } /* Displays highest of the entered values */ high = ary[0]; for (i = 1; i < 10; i++) { if (ary[i] > high) high = ary[i]; } printf(\n Highest value entered was %d, high); /* Prints average of value entered for ary[10] */ for (i = 0, total = 0; i < 10; i++)

Mng

total = total + ary[i]; printf(\nThe average of the element of ary is %d, total/i); } Mt v d v kt qu c trnh by di y: Enter value: 1: 10 Enter value: 2: 20 Enter value: 3: 30 Enter value: 4: 40 Enter value: 5: 50 Enter value: 6: 60 Enter value: 7: 70 Enter value: 8: 80 Enter value: 9: 90 Enter value: 10: 10 Highest value entered was 90 The average of the element of ary is 46 Vic khi to mng: Cc mng khng c khi to t ng, tr khi mi phn t mng c gn mt gi tr ring l. Khng nn dng cc mng trc khi c s khi to thch hp. iu ny l bi v khng gian lu tr ca mng khng c khi to t ng, do d gy ra kt qu khng lng trc. Mi khi cc phn t ca mt mng cha khi to c s dng trong cc biu thc ton hc, cc gi tr tn ti sn trong nh s c s dng, cc gi tr ny khng m bo rng c cng kiu nh khai bo ca mng, tr khi cc phn t ca mng c khi to mt cch r rng. iu ny ng khng ch cho cc mng m cn cho cc bin thng thng. Trong on m lnh sau, cc phn t ca mng c gn gi tr bng cc dng vng lp for. int ary[20], i; for(i=0; i<20; i++) ary[i] = 0; Khi to mt mng s dng vng lp for c th c thc hin vi mt hng gi tr, hoc cc gi tr c sinh ra t mt cp s cng. Mt vng lp for cng c th c s dng khi to mt mng cc k t nh sau: V d 11.3: #include <stdio.h> void main() { char alpha[26]; int i, j; for(i = 65, j = 0; i < 91; i++, j++) { alpha[j] = i; printf(The character now assigned is %c\n, alpha[j]); } getchar(); }

Lp trnh c bn C

Mt phn kt qu ca chng trnh trn nh sau: The character now assigned is A The character now assigned is B The character now assigned is C . . . Chng trnh trn gn cc m k t ASCII cho cc phn t ca mng alpha. Kt qu l khi in vi nh dng %c, mt chui cc k t c xut ra mn hnh. Cc mng cng c th c khi to khi khai bo. iu ny c thc hin bng vic gn tn mng vi mt danh sch cc gi tr phn cch nhau bng du phy (,) t trong cp du ngoc nhn {}. Cc gi tr trong cp du ngoc nhn {} c gn cho cc phn t trong mng theo ng th t xut hin. V d: int deci[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; static float rates[4] = {0.0, -2.5, 13.75, 18.0}; char company[5] = {A, P, P, L, E}; int marks[100] = {15, 13, 11, 9} Cc gi tr khi to ca mng phi l cc hng, khng th l bin hoc cc biu thc. Mt vi phn t u tin ca mng s c khi to nu s lng gi tr khi to l t hn s phn t mng c khai bo. Cc phn t cn li s c khi to gi tr 0. V d, trong mng marks sau khi c s khi to nh trn, bn phn t u tin (t 0 n 3) tng ng c khi to l 15, 13, 11 v 9. Cc phn t cn li c gi tr 0. Khng th ch khi to cc phn t t 1 n 4, hoc t 2 n 4, hay t 2 n 5 khi s khi to c thc hin ti thi im khai bo. Trong C khng c kh nng lp li s khi to gi tr. Trong trng hp s khi to l tng minh, lp extern hoc static, cc phn t ca mng c m bo khi to l 0 (khng ging lp auto). Khng cn thit khai bo kch thc ca mng ang c khi to. Nu kch thc ca mng c b qua khi khai bo, trnh bin dch s xc nh kch thc ca mng bng cch m cc gi tr ang c khi to. V d, s khai bo mng external sau y s ch nh kch thc ca mng ary l 5 v c 5 gi tr khi to. int ary[] = {1, 2, 3, 4, 5}; Cc mng chui/k t: Mt chui c th c khai bo nh l mt mng k t, v c kt thc bi mt k t NULL. Mi k t ca chui chim 1 byte, v k t cui cng ca chui lun lun l k t \0. K t \0 c gi l k t null. N l mt m thot (escape sequence) tng t nh \n, thay th cho k t c gi tr 0. V \0 lun l k t cui cng ca mt chui, nn cc mng k t phi c nhiu hn mt k t so vi chiu di ti a m chng qun l. V d, mt mng ary qun l mt chui 10 k t phi c khai bo nh sau: char ary[11]; V tr thm vo c s dng lu tr k t null. Nn nh rng k t kt thc (k t null) l rt quan trng.

Mng

Cc gi tr chui c th c nhp vo bng cch s dng hm scanf(). Vi chui ary c khai bo trn, m lnh nhp s nh sau: scanf(%s, ary); Trong lnh trn, ary xc nh v tr ni m ln lt cc k t ca mng s c lu tr. V d 11.4: #include <stdio.h> void main() { char ary[5]; int i; printf(\n Enter string: ); scanf(%s, ary); printf(\n The string is %s \n\n, ary); for (i = 0; i < 5; i++) printf(\t%d, ary[i]); } Cc kt qu thc thi chng trnh vi nhng d liu nhp khc nhau nh sau: Nu chui c nhp l appl, kt qu s l: The string is appl 97 112 112 108 0

Kt qu nh trn l ca 4 k t (appl) v k t th 5 l k t null. iu ny c thy r vi m ASCII cho cc k t c in ra dng th hai. K t th nm c in la 0, l gi tr ca k t null. Nu chui nhp vo l apple, kt qu s l: The string is apple 97 112 112 108 101 Kt qu trn ca l mt d liu u vo c 5 k t a, p, p, l v e. N khng c xem l mt chui bi v k t th 5 ca mng khng phi l \0. Mt ln na, iu ny c thy r bng dng in ra m ASCII ca cc k t a, p, p, l, e. Nu chui c nhp vo l ap, th kt qu s l: The string is ap 97 112 0 6 100

Trong v d trn, khi ch c hai k t c nhp, k t th ba s l k t null. iu ny cho bit l chui c kt thc. Nhng k t cn li l nhng k t khng d on c. Trong trng hp trn, tnh quan trng ca k t null tr nn r rng. K t null xc nh s kt thc ca chui v l cch duy nht cc hm lm vic vi chui s bit u l im kt thc ca chui. Mc d C khng c kiu d liu chui, nhng n cho php cc hng chui. Mt hng chui l mt dy cc k t c t trong du nhy i (). Khng ging nh cc hng khc, n khng th c sa i trong chng trnh. V d nh:

Lp trnh c bn C

Hi Aptechite! Trnh bin dch C s t ng thm vo k t null cui chui. C h tr nhiu hm cho chui, cc hm ny nm trong th vin chun string.h. Mt vi hm c a ra trong bng 11.1. Cch lm vic ca cc hm ny s c tho lun trong bi 17. Tn hm strcpy(s1, s2) strcat(s1, s2) strlen(s1) strcmp(s1, s2) strchr(s1, ch) strstr(s1, s2) Chc nng Sao chp s2 vo s1 Ni s2 vo cui ca s1 Tr v chiu di ca s1 Tr v 0 nu s1 v s2 l ging nhau; nh hn 0 nu s1<s2; ln hn 0 nu s1> s2 Tr v mt con tr tr n v tr xut hin u tin ca ch trong s1 Tr v mt con tr tr n v tr xut hin u tin ca chui s2 trong chui s1 Bng 11.1

11.3 Mng hai chiu: Chng ta bit th no l mng mt chiu. iu ny c ngha l cc mng ch c mt ch s. Cc mng c th c nhiu hn mt chiu. Cc mng a chiu gip d dng trnh by cc i tng a chiu, chng hn mt th vi cc dng v ct hay ta mn hnh ca my tnh. Cc mng a chiu c khai bo ging nh cc mng mt chiu, ngoi tr c thm mt cp du ngoc vung [] trong trng hp mng hai chiu. Mt mng ba chiu s cn ba cp du ngoc vung,... Mt cch tng qut, mt mng a chiu c th c biu din nh sau: storage_class data_type ary[exp1][exp2]....[expN]; , ary l mt mng c lp l storage_class, kiu d liu l data_type, v exp1, exp2,..... , expN l cc biu thc nguyn dng xc nh s phn t ca mng c kt hp vi mi chiu. Dng n gin nht v thng c s dng nht ca cc mng a chiu l mng hai chiu. Mt mng hai chiu c th xem nh l mt mng ca hai mng mt chiu. Mt mng hai chiu c trng nh bng lch trnh ca my bay, xe la. xc nh thng tin, ta s ch nh dng v ct cn thit, v thng tin c c ra t v tr (dng v ct) c tm thy. Tng t nh vy, mt mng hai chiu l mt khung li cha cc dng v ct trong mi phn t c xc nh duy nht bng to dng v ct ca n. Mt mng hai chiu tmp c kiu int vi 2 dng v 3 ct c th c khai bo nh sau, int tmp[2][3]; Mng ny s cha 2 x 3 (6) phn t, v chng c th c biu din nh sau: Dng Ct 0 1 0 1 2

e1 e4

e2 e5

e3 e6

e1 e6 biu din cho cc phn t ca mng. C dng v ct c nh s t 0. Phn t e6 c xc nh bng dng 1 v ct 2. Truy xut n phn t ny nh sau: tmp[1][2];

Mng

Khi to mng a chiu: Khai bo mng a chiu c th kt hp vi vic gn cc gi tr khi to. Cn phi cn thn lu n th t cc gi tr khi to c gn cho cc phn t ca mng (ch c mng external v static c th c khi to). Cc phn t trong dng u tin ca mng hai chiu s c gn gi tr trc, sau n cc phn t ca dng th hai, Hy xem s khai bo mng sau: int ary[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12}; Kt qu ca php khai bo trn s nh sau: ary[0][0] = 1 ary[1][0] = 5 ary[2][0] = 9 ary[0][1] = 2 ary[1][1] = 6 ary[2][1] = 10 ary[0][2] = 3 ary[1][2] = 7 ary[2][2] = 11 ary[0][3]= 4 ary[1][3] = 8 ary[2][3] = 12

Ch rng ch s th 1 chy t 0 n 2 v ch s th hai chy t 0 n 3. Mt im cn nh l cc phn t ca mng s c lu tr nhng v tr k tip nhau trong b nh. Mng ary trn c th xem nh l mt mng ca 3 phn t, mi phn t l mt mng ca 4 s nguyn, v s xut hin nh sau: Dng 0 3 Dng 1 7 Dng 2 11

10

12

Th t t nhin m cc gi tr khi to c gn c th thay i bng hnh thc nhm cc gi tr khi to li trong cc du ngoc nhn {}. Quan st s khi to sau: int ary [3][4] ={ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; Mng s c khi to nh sau:
ary[0][0]=1 ary[1][0]=4 ary[2][0]=7 ary[0][1]=2 ary[1][1]=5 ary[2][1]=8 ary[0][2]=3 ary[1][2]=6 ary[2][2]=9 ary[0][3]=0 ary[1][3]=0 ary[2][3]=0

Mt phn t ca mng a chiu c th c s dng nh mt bin trong C bng cch dng cc ch s xc nh phn t ca mng. V d 11.5: /* Chng trnh nhp cc s vo mt mng hai chiu. */ #include <stdio.h> void main() { int arr[2][3]; int row, col; for(row = 0; row < 2; row++) { for(col = 0; col < 3; col++) { printf(\nEnter a Number at [%d][%d]: , row, col);

Lp trnh c bn C

scanf(%d, &arr[row][col]); } } for(row = 0; row < 2; row++) { for(col = 0; col < 3; col++) { printf(\nThe Number at [%d][%d] is %d, row, col, arr[row][col]); } } } Mt v d v kt qu thc thi chng trnh trn nh sau: Enter Enter Enter Enter Enter Enter The The The The The The a a a a a a Number Number Number Number Number Number at at at at at at at at at at at at [0][0]: [0][1]: [0][2]: [1][0]: [1][1]: [1][2]: is is is is is is 10 100 45 67 45 230

Number Number Number Number Number Number

[0][0] [0][1] [0][2] [1][0] [1][1] [1][2]

10 100 45 67 45 230

Mng hai chiu v chui: Nh chng ta bit phn trc, mt chui c th c biu din bng mng mt chiu, kiu k t. Mi k t trong chui c lu tr trong mt phn t ca mng. Mng ca chui c th c to bng cch s dng mng k t hai chiu. Ch s bn tri xc nh s lng chui, v ch s bn phi xc nh chiu di ti a ca mi chui. V d bn di khai bo mt mng cha 25 chui v mi chui c di ti a 80 k t k c k t null. char str_ary[25][80]; V d minh ho cch s dng ca mt mng hai chiu: V d bn di minh ho cch dng ca mng hai chiu nh cc chui. Xt bi ton t chc mt danh sch tn theo th t bng ch ci. V d sau y nhp mt danh sch cc tn v sau sp xp chng theo th t bng ch ci. V d 11.6 #include <stdio.h> #include <string.h> #include <conio.h> void main() { int i, n = 0;

Mng

int item; char x[10][12]; char temp[12]; clrscr(); printf(Enter each string on a separate line \n\n); printf(Type END when over \n\n); /* Read in the list of strings */ do { printf(String %d: , n + 1); scanf(%s, x[n]); } while (strcmp(x[n++], END)); /*Reorder the list of strings */ n = n 1; for(item = 0; item < n - 1; ++item) { /* Find lowest of remaining strings */ for(i = item + 1; i < n; ++i) { if(strcmp(x[item], x[i]) > 0) { /*Interchange two strings*/ strcpy(temp, x[item]); strcpy(x[item], x[i]); strcpy(x[i], temp); } } } /* Display the arranged list of strings */ printf(Recorded list of strings: \n); for(i = 0; i < n; ++i) { printf("\nString %d is %s", i + 1, x[i]); } } Chng trnh trn nhp vo cc chui n khi ngi dng nhp vo t END. Khi END c nhp vo, chng trnh s sp xp danh sch cc chui v in ra theo th t sp xp. Chng trnh kim tra hai phn t k tip nhau. Nu th t ca chng khng thch hp, th hai phn t s c i ch. S so snh hai chui c thc hin vi s tr gip ca hm strcmp() v s i ch c thc hin vi hmg strcpy(). Mt v d v kt qu thc thi ca chng trnh nh sau: Enter each string on a separate line Type END when over String 1: has

10

Lp trnh c bn C

String String String String Record String String String String

2: 3: 4: 5: list 1 is 2 is 3 is 4 is

seen alice wonderland END of strings: alice has seen wonderland

Mng

11

Tm tt bi hc Mt mng l mt tp hp cc phn t d liu c cng kiu c tham chiu bi cng mt tn. Mi phn t ca mng c cng kiu d liu, cng lp lu tr v c cng cc c tnh. Mi phn t c lu tr v tr k tip nhau trong b nh chnh. Cc phn t d liu c bit nh l cc phn t mng. Chiu ca mng c xc nh bi s cc ch s cn thit nh danh duy nht mi phn t. Cc mng c th c cc kiu d liu nh int, char, float, hoc double. Phn t ca mng c th c tham chiu bng cch s dng mt bin hoc mt biu thc s nguyn. Mt mng khng th c khi to, tr khi mi phn t c gn mt gi tr ring l. Cc mng extern v static c th c khi to khi khai bo. Mng hai chiu c th xem nh l mt mng ca cc mng mt chiu.

12

Lp trnh c bn C

Kim tra tin hc tp 1. Mt ________ l mt tp hp cc phn t d liu cng kiu v c tham chiu bi cng mt tn. A. Vng lp C. Cu trc B. Mng D. Tt c u sai

2. Mi phn t ca mng c nh danh bng ________ duy nht hoc ________ c gn ti n. A. Ch mc, Ch s C. Tt c u sai 3. Mt tn mng v mt tn bin c th ging nhau B. Min gi tr, Ch s

(ng/Sai)

4. Mt phn t ca mng c th c s dng bt k v tr no m mt bin c cho php v yu cu. (ng/Sai) 5. Hai mng, ngay c khi chng c cng kiu v kch thc, khng th c xem l _________. A. iu kin C. Bng nhau B. S ph nh D. Tt c u sai

6. Mt chui c khai bo nh l mt mng kiu k t, c kt thc bi k t _________. A. chm phy C. NULL 7. Cc mng c th c nhiu hn mt chiu. B. phy D. Tt c u sai (ng/Sai)

8. S so snh hai chui c thc hin vi s gip ca ________ v s i v tr c thc hin bng _________. A. strcmp, strcpy C. strlen, strcat B. strcat, strcpy D. Tt c u sai

Mng

13

Bi tp t lm 1. Vit mt chng trnh sp xp cc tn sau y theo th t abc. George Albert Tina Xavier Roger Tim William 2. Vit mt chng trnh m s k t nguyn m trong mt dng vn bn. 3. Vit mt chng trnh nhp cc s sau y vo mt mng v o ngc mng 34 45 56 67 89

14

Lp trnh c bn C

Bi 12
Mc tiu: Kt thc bi hc ny, bn c th: S dng mng mt chiu S dng mng hai chiu.

Mng

Cc bc trong bi hc ny c trnh by chi tit, r rng v cn thn. iu ny gip ta hiu r v cng c lp trnh. Thc hin theo cc bc sau tht cn thn. Phn I Trong thi gian 1 gi 30 pht u: 12.1 Mng

Cc mng c th c phn lm hai dng da vo chiu ca mng: Mng mt chiu v mng a chiu. Trong bi ny, chng ta s tp trung vo cch to v s dng cc mng. 12.1.1 S sp xp mt mng mt chiu Mng mt chiu c th c s dng lu tr mt tp cc gi tr c cng kiu d liu. Xt mt tp im ca sinh vin trong mt mn hc. Chng ta s sp xp cc im ny theo th t gim dn. Cc bc sp xp mng mt chiu theo th t gim nh sau: 1. Nhp vo s lng cc im. thc hin iu ny, mt bin phi c khai bo v gi tr ca bin phi c nhp. M lnh nh sau: int n; printf(\n Enter the total number of marks to be scanf(%d, &n); 2. Nhp vo tp cc im. nhp vo tp cc gi tr cho mt mng, mng phi c khai bo. M lnh nh sau, int num[100]; S phn t ca mng c xc nh bng gi tr nhp vo bin n. n phn t ca mng phi c khi to gi tr. nhp n gi tr, s dng vng lp for. Mt bin nguyn cn c khai bo s dng nh l ch s ca mng. Bin ny gip truy xut tng phn t ca mng. Sau gi tr ca cc phn t mng c khi to bng cch nhn cc gi tr nhp vo t ngi dng. M lnh nh sau: int l; for(l = 0; l < n; l++) { printf(\n Enter the marks of student %d : , l + 1); scanf(%d, &num[l]); }

entered : );

Mng

169

V cc ch s ca mng lun bt u t 0 nn chng ta cn khi to bin l l 0. Mi khi vng lp c thc thi, mt gi tr nguyn c gn n mt phn t ca mng. 3. To mt bn sao ca mng. Trc khi sp xp mng, tt hn l nn gi li mng gc. V vy mt mng khc c khai bo v cc phn t ca mng th nht c th c sao chp vo mng mi ny. Cc dng m lnh sau c s dng thc hin iu ny: int desnum[100], k; for(k = 0; k < n; k++) desnum[k] = num[k]; 4. Sp xp mng theo th t gim dn. sp xp mt mng, cc phn t trong mng cn phi c so snh vi nhng phn t cn li. Cch tt nht sp xp mt mng, theo th t gim dn, l chn ra gi tr ln nht trong mng v hon v n vi phn t u tin. Mt khi iu ny c thc hin xong, gi tr ln th hai trong mng c th c hon v vi phn t th hai ca mng, phn t u tin ca mng c b qua v n l phn t ln nht. Tng t, cc phn t ca mng c loi ra tun t n khi phn t ln th n c tm thy. Trong trng hp mng cn sp xp theo th t tng dn gi tr ln nht s c hon v vi phn t cui cng ca mng. Quan st v d mt dy s hiu c gii thut. Hnh 12.1 trnh by mt mng s nguyn cn c sp xp.

num

10
i=0

40

90

60

70
i=4

Hnh 12.1: Mng num vi ch s i (5 phn t) sp xp mng ny theo th t gim dn, a. Chng ta cn tm phn t ln nht v hon v n vo v tr phn t u tin. Xem nh y l ln thc hin th nht. a gi tr ln nht v v tr u tin, chng ta cn so snh phn t th nht vi cc phn t cn li. Khi phn t ang c so snh ln hn phn t u tin th hai phn t ny cn phi c hon v. Khi u, ln thc hin u tin, phn t v tr th nht c so snh vi phn t v tr th hai. Hnh 12.2 biu din s hon v ti v tr th nht. 10 40 10 90 60 70
i=4

num

40
i=0

Hnh 12.2: o v tr phn t th nht vi phn t th hai Tip , phn t th nht c so snh vi phn t th ba. Hnh 12.3 biu din s hon v gia phn t th nht v phn t th ba. 40 90 10 40 60 70
Lp trnh c bn C

num
170

90

i=0

i=4

Hnh 12.3 o v tr phn t th nht vi phn t th ba Qu trnh ny c lp li cho n khi phn t th nht c so snh vi phn t cui cng ca mng. Mng kt qu sau ln thc hin u tin c trnh by trong hnh 12.4 bn di.

num

90
i=0

40

10

60

70
i=4

Hnh 12.4: Mng sau ln thc hin u tin b. B qua phn t u tin, chng ta cn tm phn t ln th hai v hon v n vi phn t th hai ca mng. Hnh 12.5 biu din mng sau khi c thc hin ln hai.

num

90
i=0

70

10

60

40
i=4

Hnh 12.5: Mng sau ln thc hin th hai c. Phn t th ba phi c hon v vi phn t ln th ba ca mng. Hnh 12.6 biu din mng sau khi hon v phn t ln th ba.

num

90
i=0

70

60

10

40
i=4

Hnh 12.6: Mng sau ln thc hin th ba d. Phn t th t phi c hon v vi phn t ln th t ca mng. Hnh 12.7 biu din mng sau khi hon v phn t ln th t.

num

90
i=0

70

60

40

10
i=4

Hnh 12.7: Mng sau ln thc hin th t e. Hnh 12.7 cng biu din mng c sp xp. lp trnh cho bi ton ny, chng ta cn hai vng lp, mt tm phn t ln nht trong mng v mt vng lp kia lp qu trnh thc hin n ln. Thc cht qu trnh phi lp n-1 ln cho mt phn t ca mng bi v phn t cui cng s khng cn phn t no so snh vi n. V vy, chng ta khai bo hai bin i v j thao tc vi hai vng lp for. Vng lp for vi ch s i c dng lp li qu trnh xc nh phn t ln nht trong phn cn li ca mng. Vng lp for vi ch s j c dng tm phn t ln th i ca mng trong cc phn t t phn t th i+1 n phn t cui cng ca mng. Theo cch , phn t ln th nht th i trong phn cn li ca mng s c a vo v tr th i. on m lnh khai bo ch s v vng lp thc hin n - 1 ln vi i nh l ch s: int i,j; for(i = 0; i < n - 1; i++) { on m lnh cho vng lp t phn t th i + 1 n phn t th n ca mng:

Mng

171

for(j = i + 1; j < n; j++) { hon v hai phn t trong mng chng ta cn s dng mt bin tm. Bi v y l thi im mt phn t ca mng c sao chp thnh mt phn t khc, gi tr trong phn t th hai s b mt. trnh mt gi tr ca phn t th hai, gi tr cn phi c lu li trong mt bin tm. on m lnh hon v phn t th i vi phn t ln nht trong phn cn li ca mng l: if(desnum[i] < desnum[j]) { temp = desnum[i]; desnum[i] = desnum[j]; desnum[j] = temp; } } } Cc vng lp for cn c ng li v v vy hai du ngoc ng xut hin trong on m lnh trn. 5. Hin th mng c sp xp. Ch s i c th c dng hin th cc gi tr ca mng nh cc cu lnh trnh by bn di: for(i = 0; i < n; i++) printf("\n Number at [%d] is %d", i, desnum[i]); Theo cch cc phn t ca mt mng c sp xp. Hy xem chng trnh hon thin di y. 1. Gi trnh son tho m bn c th vit chong trnh C. 2. To mt tp tin mi. 3. a vo m lnh sau: void main() { int n; int num[100]; int l; int desnum[100], k; int i, j, temp; printf("\nEnter the total number of marks to be entered : ); scanf(%d, &n); clrscr(); for (l = 0; l < n; l++) { printf(\n Enter the marks of student %d : , l + 1); scanf(%d, &num[l]); } for(k = 0; k < n; k++) desnum[k] = num[k]; for(i = 0; i < n - 1; i++) { for(j = i + 1; j < n; j++) { if(desnum[i] < desnum[j]) {
172 Lp trnh c bn C

temp = desnum[i]; desnum[i] = desnum[j]; desnum[j] = temp; } } } for(i = 0; i < n; i++) printf("\n Number at [%d] is %d", i, desnum[i]); } xem kt qu, thc hin theo cc bc lit k di y: 4. 5. 6. 7. Lu tp tin vi tn arrayI.C. Bin dch tp tin, arrayI.C. Thc thi chng trnh, arrayI.C. Tr v trnh son tho.

V d v kt qu thc thi ca chng trnh trn c trnh by trong hnh 12.8 v 12.9.

Hnh 12.8: Kt qu xut I ca arrayI.C - Nhp vo cc gi tr

Hnh 12.9 : Kt qu xut II ca arrayI.C Xut ra cc gi tr 12.1.2 Cng ma trn s dng cc mng hai chiu Cc mng c th c nhiu chiu. Mt v d tiu biu ca mng hai chiu l ma trn. Mt ma trn c to bi cc dng v cc ct. Giao im ca mi dng v ct c mt gi tr. Hnh 12.10 biu din mt ma trn. A(1,1) Dng 2

Mng

173

Ct

1 2 3

1 8 3

2 5 6 Hnh 12.10 : Ma trn A

1 1 9 A(3,3)

S dng v ct trong ma trn khi c biu din dng (s dng) x (s ct) c gi l kch thc ca ma trn. Kch thc ca ma trn trong hnh 12.10 l 3x3. Chng ta hy xem v d cng ma trn hiu cch s dng ca mng hai chiu. Quan st hai ma trn A v B trong hnh 12.11. A 1 2 3 1 1 8 3 2 2 5 6 3 1 1 9 B 1 2 3 1 2 3 8 2 1 4 9 3 4 2 0

Hnh 12.11 : Ma trn A v B Tng ca hai ma trn ny l mt ma trn khc. N c to t vic cng cc gi tr ti mi dng v ct tng ng. V d. phn t u tin C(1,1) trong ma trn C s l tng ca A(1,1) v B(1,1). Phn t th hai C(1,2) s l tng ca A(1,2) v B(1,2) ... Mt qui lut quan trng trong vic cng cc ma trn l kch thc ca cc ma trn phi ging nhau. Ngha l, mt ma trn 2x3 ch c th c cng vi mt ma trn 2x3. Hnh 12.12 Biu din ma trn A, B v C. A 1 2 3 1 1 8 3 2 2 5 6 3 1 1 9 B 1 2 3 1 2 3 8 2 1 4 9 3 4 2 0 C 1 2 3 1 3 11 11 2 3 9 15 3 5 3 9

Hnh 12.12 : Ma trn A, B v C lp trnh cng vic ny, 1. Khai bo hai mng. M lnh nh sau, int A[10][10], B[10][10], C[10][10]; 2. Nhp vo kch thc ca cc ma trn. M lnh l, int row,col; printf(\n Enter the dimension of the matrix : ); scanf(%d %d,&row,&col); 3. Nhp cc gi tr cho ma trn A v B. Cc gi tr ca ma trn c nhp theo dng. Trc tin cc gi tr ca dng th nht c nhp vo. K n cc gi tr ca dng th hai c nhp, ... Bn trong mt dng, cc gi tr ca ct c nhp tun t. V vy cn hai vng lp nhp cc gi tr ca mt ma trn. Vng lp th nht i qua tng dng mt, trong khi vng lp bn trong s i qua tng ct. on m lnh nh sau: printf(\n Enter the values of the matrix A and B : \n);
174 Lp trnh c bn C

int i, j; for(i = 0; i < row; i++) for(j = 0; j < col; j++) { print(A[%d,%d], B[%d,%d]:, row, col, row, col); scanf(%d %d, &A[i][j], &B[i][j]); } 4. Cng hai ma trn. Hai ma trn c th c cng bng cch s dng on m lnh sau, C[i][j] = A[i][j] + B[i][j]; Ch , dng lnh ny cn t vng lp bn trong ca on lnh ni trn. Mt cch khc, hai vng lp c th c vit li cng ma trn. 5. Hin th ba ma trn. M lnh s nh sau, for(i = 0; i < row; i++) for(j = 0;j < col; j++) { printf(\nA[%d,%d]=%d, B[%d,%d] = %d, C[%d,%d]=%d \n, i, j, A[i][j], i, j, B[i][j], i, j, C[i][j]); } Bn di l chng trnh hon chnh. 1. To mt tp tin mi. 2. a vo m lnh sau: void main() { int A[10][10], B[10][10], C[10][10]; int row, col; int i,j; printf(\n Enter the dimension of the matrix : ); scanf(%d %d, &row, &col); printf(\nEnter the values of the matrix A and B: \n); for(i = 0; i < row; i++) for(j = 0; j < col; j++) { printf(\n A[%d,%d], B[%d,%d]: , i, j, i, j); scanf(%d %d, &A[i][j], &B[i][j]); C[i][j] = A[i][j] + B[i][j]; } for(i = 0; i < row; i++) for(j = 0; j < col; j++) { printf(\nA[%d,%d]=%d, B[%d,%d]=%d, C[%d,%d]=%d\n, i, j, A[i][j], i, j, B[i][j], i, j, C[i][j]); } } 3. Lu tp tin vi tn arrayII.C. 4. Bin dch tp tin, arrayII.C.

Mng

175

5. Thc thi chng trnh arrayII.C. 6. Tr v trnh son tho. Mt v d v kt qu thc thi ca chng trnh trn c trnh by trong hnh 12.13.

Hnh 12.13 : Kt qu I ca arrayII.C Nhp cc gi tr

176

Lp trnh c bn C

Phn II Trong thi gian 30 pht k tip: 1. Vit mt chng trnh C nhp mt tp hp s vo trong mt mng v o ngc mng. thc hin iu ny: a. Khai bo hai mng. b. Nhp cc gi tr vo mt mng. c. Thc hin vng lp theo th t ngc trn mng ny sao chp cc gi tr vo mng th hai. Dng mt ch s khc cho mng th hai, ch s ny chy t 0.

Mng

177

Bi tp t lm 1. Vit mt chng trnh C tm gi tr nh nht v gi tr ln nht trong mt mng. 2. Vit mt chng trnh m s lng nguyn m v ph m trong mt t.

178

Lp trnh c bn C

Bi 13
Mc tiu: Kt thc bi hc ny, bn c th: Hiu con tr l g, v con tr c s dng u Bit cch s dng bin con tr v cc ton t con tr Gn gi tr cho con tr Hiu cc php ton s hc con tr Hiu cc php ton so snh con tr Bit cch truyn tham s con tr cho hm Hiu cch s dng con tr kt hp vi mng mt chiu Hiu cch s dng con tr kt hp vi mng a chiu Hiu cch cp pht b nh c thc hin nh th no Gii thiu

Con tr

Con tr cung cp mt cch thc truy xut bin m khng tham chiu trc tip n bin. N cung cp cch thc s dng a ch. Bi ny s cp n cc khi nim v con tr v cch s dng chng trong C. 13.1 Con tr l g? Mt con tr l mt bin, n cha a ch vng nh ca mt bin khc, ch khng lu tr gi tr ca bin . Nu mt bin cha a ch ca mt bin khc, th bin ny c gi l con tr n bin th hai kia. Mt con tr cung cp phng thc gin tip truy xut gi tr ca cc phn t d liu. Xt hai bin var1 v var2, var1 c gi tr 500 v c lu ti a ch 1000 trong b nh. Nu var2 c khai bo nh l mt con tr ti bin var1, s biu din s nh sau: V tr B nh 1000 1001 1002 . . 1108 Gi tr lu tr 500 Tn bin var1

1000

var2

y, var2 cha gi tr 1000, l a ch ca bin var1. Cc con tr c th tr n cc bin ca cc kiu d liu c s nh int, char, hay double hoc d liu c cu trc nh mng.

Con tr

181

13.1.2 Ti sao con tr c dng? Con tr c th c s dng trong mt s trng hp sau: tr v nhiu hn mt gi tr t mt hm Thun tin hn trong vic truyn cc mng v chui t mt hm n mt hm khc S dng con tr lm vic vi cc phn t ca mng thay v truy xut trc tip vo cc phn t ny cp pht b nh ng v truy xut vo vng nh c cp pht ny (dynamic memory allocation) 13.2 Cc bin con tr Nu mt bin c s dng nh mt con tr, n phi c khai bo trc. Cu lnh khai bo con tr bao gm mt kiu d liu c bn, mt du *, v mt tn bin. C php tng qut khai bo mt bin con tr nh sau:

type *name; type l mt kiu d liu hp l bt k, v name l tn ca bin con tr. Cu lnh khai bo trn ni vi trnh bin dch l name c s dng lu a ch ca mt bin c kiu d liu type. Trong cu lnh khai bo, * xc nh rng mt bin con tr ang c khai bo. Trong v d ca var1 v var2 trn, v var2 l mt con tr gi a ch ca bin var1 c kiu int, n s c khai bo nh sau: int *var2; By gi, var2 c th c s dng trong mt chng trnh trc tip truy xut gi tr ca var1. Nh rng, var2 khng phi c kiu d liu int nhng n l mt con tr tr n mt bin c kiu d liu int. Kiu d liu c s ca con tr xc nh kiu ca bin m con tr tr n. V mt k thut, mt con tr c kiu bt k c th tr n bt k v tr no trong b nh. Tuy nhin, tt c cc php ton s hc trn con tr u c lin quan n kiu c s ca n, v vy khai bo kiu d liu ca con tr mt cch r rng l iu rt quan trng. 13.3 Cc ton t con tr C hai ton t c bit c dng vi con tr: * v &. Ton t & l mt ton t mt ngi v n tr v a ch ca ton hng. V d, var2 = &var1; ly a ch vng nh ca bin var1 gn cho var2. a ch ny l v tr nh bn trong my tnh ca bin var1 v n khng lm g vi gi tr ca var1. Ton t & c th hiu l tr v a ch ca. V vy, php gn trn c ngha l var2 nhn a ch ca var1. Tr li, gi tr ca var1 l 500 v n dng vng nh 1000 lu gi tr ny. Sau php gn trn, var2 s c gi tr 1000. Ton t th hai, ton t *, c dng vi con tr l phn bb xung ca ton t &, ton t *. N l mt ton t mt ngi v tr v gi tr cha trong vng nh c tr bi gi tr ca bin con tr. Xem v d trc, var1 c gi tr 500 v c lu trong vng nh 1000, sau cu lnh

182

Lp trnh c bn C

var2 = &var1; var12 cha gi tr 1000, v sau lnh gn temp = *var2; temp s cha 500 khng phi l 1000. Ton t * c th c hiu l ti a ch. C hai ton t * v & c u tin cao hn tt c cc ton t ton hc ngoi tr ton t ly gi tr m. Chng c cng u tin vi ton t ly gi tr m (-). Chng trnh di y in ra gi tr ca mt bin kiu s nguyn, a ch ca n c lu trong mt bin con tr, v chng trnh cng in ra a ch ca bin con tr. #include <stdio.h> void main() { int var = 500, *ptr_var; /* var is declared as an integer and ptr_var as a pointer pointing to an integer */

ptr_var = &var; /*stores address of var in ptr_var*/ /* Prints value of variable (var) and address where var is stored */ printf(The value %d is stored at address %u:, var, &var); /* Prints value stored in ptr variable (ptr_var) and address where ptr_var is stored */ printf(\nThe value %u is stored at address: %u, ptr_var, &ptr_var); /* Prints value of variable (var) and address where var is stored, using pointer to variable */

printf(\nThe value %d is stored at address:%u, *ptr_var, ptr_var); } Kt qu ca v d trn c hin th ra nh sau:Mt v d v kt qu thc thi chng trnh nh sau: The value 500 is stored at address: 65500 The value 65500 is stored at address: 65502 The value 500 is stored at address: 65500 Trong v d trn, ptr_var cha a ch 65500, l a ch vng nh lu tr gi tr ca var. Ni dung nh 65500 ny c th ly c bng cch s dng ton t *, nh *ptr_var. Lc ny *ptr_var trnh bytng ng vi gi tr 500, l gi tr ca var. Bi v ptr_var cng l mt bin, nn a ch ca n c th c in ra bng ton t &. Trong v d trn, ptr_var c lu ti a ch 65502. M quy cch %u ch nh cch in gi tr cc tham s theo kiu s nguyn khng du (unsigned int).

Con tr

183

Nh li l, mt bin kiu s nguyn chim 2 bytes b nh. V vy, gi tr ca var c lu tr ti a ch 65500 v trnh bin dch cp pht nh k tip 65502 cho ptr_var. Tng t, mt s thp phn kiu float yu cu 4 bytes v kiu double yu cu 8 bytes. Cc bin con tr lu tr mt gi tr nguyn. Vi hu ht cc chng trnh s dng con tr, kiu con tr c th xem nh mt gi tr 16-bit chim 2 bytes b nh. Ch rng hai cu lnh sau cho ra cng mt kt qu. printf(The value is %d, var); printf(The value is %d, *(&var)); Gn gi tr cho con tr Cc gi tr c th c gn cho bin con tr thng qua ton t &. Cu lnh gn s l: ptr_var = &var; Lc ny a ch ca var c lu trong bin ptr_var. Cng c th gn gi tr cho con tr thng qua mt bin con tr khc tr n mt phn t d liu c cng kiu. ptr_var = &var; ptr_var2 = ptr_var; Gi tr NULL cng c th c gn n mt con tr bng s 0 nh sau: ptr_var = 0; Cc bin cng c th c gn gi tr thng qua con tr ca chng. *ptr_var = 10;

s gn 10 cho bin var nu ptr_var tr n var. Ni chung, cc biu thc c cha con tr cng theo cng qui lut nh cc biu thc khc trong C. iu quan trng cn ch phi gn gi tr cho bin con tr trc khi s dng chng; nu khng chng c th tr n mt gi tr khng xc nh no . Php ton s hc con tr Ch php cng v tr l cc ton t c th thc hin trn cc con tr. V d sau minh ha iu ny: int var, *ptr_var; ptr_var = &var; var = 500; Trong v d trn, chng ta gi s rng var c lu ti a ch 1000. Sau , gi tr 1000 s c lu vo ptr_var. V kiu s nguyn chim 2 bytes, nn sau biu thc: ptr_var++ ; ptr_var s cha 1002 m KHNG phi l 1001. iu ny c ngha l ptr_var by gi tr n mt s nguyn c lu ti a ch 1002. Mi khi ptr_var c tng ln, n s tr n s nguyn k tip v bi v cc s nguyn l 2 bytes, ptr_var s c tng tr l 2. iu ny cng tng t vi php ton gim tr.

184

Lp trnh c bn C

y l mt vi v d. ++ptr_var or ptr_var++ --ptr_var or ptr_var-ptr_var + i ptr_var - i ++*ptr_var or (*ptr_var)++ *ptr_var++ Tr n s nguyn k tip ng sau var Tr n s nguyn ng trc var Tr n s nguyn th i sau var Tr n s nguyn th i trc var S tng tr var bi 1 S tc ng n gi tr ca s nguyn k tip sau var

Mi khi mt con tr c tng gi tr, n s tr n nh ca phn t k tip. Mi khi n c gim gi tr, n s tr n v tr ca phn t ng trc n. Vi nhng con tr tr ti cc k t, n xut hin bnh thng, bi v mi k t chim 1 byte. Tuy nhin, tt c nhng con tr khc s tng hoc gim tr tu thuc vo di kiu d liu m chng tr ti. Nh thy trong cc v d trn, ngoi cc ton t tng tr v gim tr, cc s nguyn cng c th c cng vo v tr ra vi con tr. Ngoi php cng v tr mt con tr vi mt s nguyn, khng c mt php ton no khc c th thc hin c trn cc con tr. Ni r hn, cc con tr khng th c nhn hoc chia. Cng nh kiu float v double khng th c cng hoc tr vi con tr. So snh con tr. Hai con tr c th c so snh trong mt biu thc quan h. Tuy nhin, iu ny ch c th nu c hai bin ny u tr n cc bin c cng kiu d liu. ptr_a v ptr_b l hai bin con tr tr n cc phn t d liu a v b. Trong trng hp ny, cc php so snh sau y l c th thc hin: ptr_a < ptr_b ptr_a > ptr_b ptr_a <= ptr_b ptr_a >= ptr_b ptr_a == ptr_b ptr_a != ptr_b ptr_a == NULL Tr v gi tr true nu a c lu tr v tr trc b Tr v gi tr true nu a c lu tr v tr sau b Tr v gi tr true nu a c lu tr v tr trc b hoc ptr_a v ptr_b tr n cng mt v tr Tr v gi tr true nu a c lu tr v tr sau b hoc ptr_a v ptr_b tr n cng mt v tr Tr v gi tr true nu c hai con tr ptr_a v ptr_b tr n cng mt phn t d liu. Tr v gi tr true nu c hai con tr ptr_a v ptr_b tr n cc phn t d liu khc nhau nhng c cng kiu d liu. Tr v gi tr true nu ptr_a c gn gi tr NULL (0)

Tng t, nu ptr_begin v ptr_end tr n cc phn t ca cng mt mng th, ptr_end - ptr_begin s tr v s bytes cch bit gi hai v tr m chng tr n. 13.4 Con tr v mng mt chiu Tn ca mt mng tht ra l mt con tr tr n phn t u tin ca mng . V vy, nu ary l mt mng mt chiu, th a ch ca phn t u tin trong mng c th c biu din l &ary[0] hoc n gin ch l ary. Tng t, a ch ca phn t mng th hai c th c vit nh &ary[1] hoc ary+1,... Tng qut, a ch ca phn t mng th (i + 1) c th c biu din l &ary[i] hay (ary+i). Nh vy, a ch ca mt phn t mng bt k c th c biu din theo hai cch: S dng k hiu & trc mt phn t mng S dng mt biu thc trong ch s c cng vo tn ca mng.

Con tr

185

Ghi nh rng trong biu thc (ary + i), ary tng trng cho mt a ch, trong khi i biu din s nguyn. Hn th na, ary l tn ca mt mng m cc phn t c th l c c kiu s nguyn, k t, s thp phn, (d nhin, tt c cc phn t ca mng phi c cng kiu d liu). V vy, biu thc trn khng ch l mt php cng; n tht ra l xc nh mt a ch, mt s xc nh ca cc nh . Biu thc (ary + i) l mt s trnh by cho mt a ch ch khng phi l mt biu thc ton hc. Nh ni trc, s lng nh c kt hp vi mt mng s ty thuc vo kiu d liu ca mng cng nh l kin trc ca my tnh. Tuy nhin, ngi lp trnh ch c th xc nh a ch ca phn t mng u tin, l tn ca mng (trong trng hp ny l ary) v s cc phn t tip sau phn t u tin, l, mt gi tr ch s. Gi tr ca i i khi c xem nh l mt di khi c dng theo cch ny. Cc biu thc &ary[i] v (ary+i) biu din a ch phn t th i ca ary, v nh vy mt cch logic l c ary[i] v *(ary + i) u biu din ni dung ca a ch , ngha l, gi tr ca phn t th i trong mng ary. C hai cch c th thay th cho nhau v c s dng trong bt k ng dng no khi ngi lp trnh mong mun. Chng trnh sau y biu din mi quan h gia cc phn t mng v a ch ca chng. #include<stdio.h> void main() { static int ary[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i; for (i = 0; i < 10; i ++) { printf(\n i = %d , ary[i] = %d , *(ary+i)= %d , i, ary[i], *(ary + i)); printf(&ary[i] = %X , ary + i = %X, &ary[i], ary + i); /* %X gives unsigned hexadecimal */ } } Chng trnh trn nh ngha mng mt chiu ary, c 10 phn t kiu s nguyn, cc phn t mng c gn gi tr tng ng l 1, 2, ..10. Vng lp for c dng hin th gi tr v a ch tng ng ca mi phn t mng. Ch rng, gi tr ca mi phn t c xc nh theo hai cch khc nhau, ary[i] v *(ary + i), nhm minh ha s tng ng ca chng. Tng t, a ch ca mi phn t mng cng c hin th theo hai cch. Kt qu thc thi ca chng trnh trn nh sau: i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 ary[i]=1 ary[i]=2 ary[i]=3 ary[i]=4 ary[i]=5 ary[i]=6 ary[i]=7 ary[i]=8 ary[i]=9 ary[i]=10 *(ary+i)=1 *(ary+i)=2 *(ary+i)=3 *(ary+i)=4 *(ary+i)=5 *(ary+i)=6 *(ary+i)=7 *(ary+i)=8 *(ary+i)=9 *(ary+i)=10 &ary[i]=194 &ary[i]=196 &ary[i]=198 &ary[i]=19A &ary[i]=19C &ary[i]=19E &ary[i]=1A0 &ary[i]=1A2 &ary[i]=1A4 &ary[i]=1A6 ary+i ary+i ary+i ary+i ary+i ary+i ary+i ary+i ary+i ary+i = = = = = = = = = = 194 196 198 19A 19C 19E 1A0 1A2 1A4 1A6

Kt qu ny trnh by r rng s khc nhau gia ary[i] - biu din gi tr ca phn t th i trong mng, v &ary[i] - biu din a ch ca n.

186

Lp trnh c bn C

Khi gn mt gi tr cho mt phn t mng nh ary[i], v tri ca lnh gn c th c vit l ary[i] hoc *(ary + i). V vy, mt gi tr c th c gn trc tip n mt phn t mng hoc n c th c gn n vng nh m a ch ca n l phn t mng. i khi cn thit phi gn mt a ch n mt nh danh. Trong nhng trng hp nh vy, mt con tr phi xut hin trong v tri ca cu lnh gn. Khng th gn mt a ch ty cho mt tn mng hoc mt phn t ca mng. V vy, cc biu thc nh ary, (ary + i) v &ary[i] khng th xut hin trong v tri ca mt cu lnh gn. Hn th na, a ch ca mt mng khng th thay i mt cch ty , v th cc biu thc nh ary++ l khng c php. L do l v: ary l a ch ca mng ary. Khi mng c khai bo, b lin kt quyt nh mng c bt u u, v d, bt u a ch 1002. Mt khi a ch ny c a ra, mng s . Vic c gng tng a ch ny ln l iu v ngha, ging nh khi ni x = 5++; Bi v hng khng th c tng tr, trnh bin dch s a ra thng bo li. Trong trng hp mng ary, ary cng c xem nh l mt hng con tr. Nh rng, (ary + 1) khng di chuyn mng ary n v tr (ary + 1), n ch tr n v tr , trong khi ary++ c gng di ary sang 1 v tr. a ch ca mt phn t khng th c gn cho mt phn t mng khc, mc d gi tr ca mt phn t mng c th c gn cho mt phn t khc thng qua con tr. &ary[2] ary[2] = &ary[3]; = ary[3]; /* khng cho php*/ /* cho php*/

Nh li rng trong hm scanf(), tn cc tham bin kiu d liu c bn phi t sau du (&), trong khi tn tham bin mng l ngoi l. iu ny cng d hiu. V scanf() i hi a ch b nh ca tng bin d liu trong danh sch tham s, trong khi ton t & tr v a ch b nh ca bin, do trc tn bin phi c du &. Tuy nhin du & khng c yu cu i vi tn mng, bi v tn mng t biu din a ch ca n.Tuy nhin, nu mt phn t trong mng c c, du & cn phi s dng. scanf(%d, *ary) /* scanf(%d, &ary[2]) /* 13.4.1 Con tr v mng nhiu chiu Mt mng nhiu chiu cng c th c biu din di dng con tr ca mng mt chiu (tn ca mng) v mt di (ch s). Thc hin c iu ny l bi v mt mng nhiu chiu l mt tp hp ca cc mng mt chiu.V d, mt mng hai chiu c th c nh ngha nh l mt con tr n mt nhm cc mng mt chiu k tip nhau. C php bo mng hai chiu c th vit nh sau: data_type (*ptr_var)[expr 2]; thay v data_type array[expr 1][expr 2]; Khi nim ny c th c tng qut ha cho cc mng nhiu chiu, l, data_type (*ptr_var)[exp 2] .... [exp N]; thay v data_type array[exp 1][exp 2] ... [exp N]; i vi phn t u tin */ i vi phn t bt k */

Con tr

187

Trong cc khai bo trn, data_type l kiu d liu ca mng, ptr_var l tn ca bin con tr, array l tn mng, v exp 1, exp 2, exp 3, ... exp N l cc gi tr nguyn dng xc nh s lng ti a cc phn t mng c kt hp vi mi ch s. Ch du ngoc () bao quanh tn mng v du * pha trc tn mng trong cch khai bo theo dng con tr. Cp du ngoc () l khng th thiu, ngc li c php khai bo s khai bo mt mng ca cc con tr ch khng phi mt con tr ca mt nhm cc mng. V d, nu ary l mt mng hai chiu c 10 dng v 20 ct, n c th c khai bo nh sau: int (*ary)[20]; thay v int ary[10][20]; Trong s khai bo th nht, ary c nh ngha l mt con tr tr ti mt nhm cc mng mt chiu lin tip nhau, mi mng c 20 phn t kiu s nguyn. V vy, ary tr n phn t u tin ca mng, l dng u tin (dng 0) ca mng hai chiu. Tng t, (ary + 1) tr n dng th hai ca mng hai chiu, ... Mt mng thp phn ba chiu fl_ary c th c khai bo nh: float (*fl_ary)[20][30]; thay v float fl_ary[10][20][30]; Trong khai bo u, fl_ary c nh ngha nh l mt nhm cc mng thp phn hai chiu c kch thc 20 x 30 lin tip nhau. V vy, fl_ary tr n mng 20 x 30 u tin, (fl_ary + 1) tr n mng 20 x 30 th hai,... Trong mng hai chiu ary, phn t ti dng 4 v ct 9 c th c truy xut s dng cu lnh: ary[3][8]; hoc *(*(ary + 3) + 8); Cch th nht l cch thng c dng. Trong cch th hai, (ary + 3) l mt con tr tr n dng th 4. V vy, i tng ca con tr ny, *(ary + 3), tham chiu n ton b dng. V dng 3 l mt mng mt chiu, *(ary + 3) l mt con tr tr n phn t u tin trong dng 3, sau 8 c cng vo con tr. V vy, *(*(ary + 3) + 8) l mt con tr tr n phn t 8 (phn t th 9) trong dng th 4. V vy i tng ca con tr ny, *(*(ary + 3) + 8), tham chiu n tham chiu n phn t trong ct th 9 ca dng th 4, l ary [3][8]. C nhiu cch thc nh ngha mng, v c nhiu cch x l cc phn t mng. La chn cch thc no ty thuc vo ngi dng. Tuy nhin, trong cc ng dng c cc mng dng s, nh ngha mng theo cch thng thng s d dng hn. Con tr v chui Chui n gin ch l mt mng mt chiu c kiu k t. Mng v con tr c mi lin h mt thit, v nh vy, mt cch t nhin chui cng s c mi lin h mt thit vi con tr. Xem trng hp hm

188

Lp trnh c bn C

strchr(). Hm ny nhn cc tham s l mt chui v mt k t tm kim k t trong mng, ngha l, ptr_str = strchr(strl, a); bin con tr ptr_str s c gn a ch ca k t a u tin xut hin trong chui str. y khng phi l v tr trong chui, t 0 n cui chui, m l a ch, t a ch bt u chui n a ch kt thc ca chui. Chng trnh sau s dng hm strchr(), y l chng trnh cho php ngi dng nhp vo mt chui v mt k t tm kim. Chng trnh in ra a ch bt u ca chui, a ch ca k t, v v tr tng i ca k t trong chui (0 l v tr ca k t u tin, 1 l v tr ca k t th hai,...). V tr tng i ny l hiu s gia hai a ch, a ch bt u ca chui v a ch ni m k t cn tm u tin xut hin. #include <stdio.h> #include <string.h> void main () { char a, str[81], *ptr; printf(\nEnter a sentence:); gets(str); printf(\nEnter character to search for:); a = getche(); ptr = strchr(str, a); /* return pointer to char*/ printf(\nString starts at address: %u, str); printf(\nFirst occurrence of the character is at address: %u, ptr); printf(\nPosition of first occurrence (starting from 0)is: %d, ptr-str); } Kt qu ca v d trn c hin th ra nh sau:Mt v d v kt qu thc hin chng trnh nh sau: Enter a sentence: We all live in a yellow submarine Enter character to search for: Y String starts at address: 65420. First occurrence of the character is at address: 65437. Position of first occurrence (starting from 0) is: 17 Trong cu lnh khai bo, bin con tr ptr c thit t cha a ch tr v t hm strchr(), v vy y l mt a ch ca mt k t (ptr c kiu char). Hm strchr() khng cn thit phi khai bo nu th vin string.h c khai bo. 13.5 Cp pht b nh Cho n thi im ny th chng ta bit l tn ca mt mng tht ra l mt con tr tr ti phn t u tin ca mng. Hn na, ngoi cch nh ngha mt mng thng thng c th nh ngha mt mng nh l mt bin con tr. Tuy nhin, nu mt mng c khai bo mt cch bnh thng, kt qu l mt khi b nh c nh c dnh sn ti thi im bt u thc thi chng trnh, trong khi iu ny khng xy ra nu mng c khai bo nh l mt bin con tr. S dng mt bin con tr biu

Con tr

189

din mt mng i hi vic gn mt vi nh khi to trc khi cc phn t mng c x l. S cp pht b nh nh vy thng thng c thc hin bng cch s dng hm th vin malloc(). Xem v d sau. Mt mng s nguyn mt chiu ary c 20 phn t c th c khai bo nh sau: int *ary; thay v int ary[20]; Tuy nhin, ary s khng c t ng gn mt khi b nh khi n c khai bo nh l mt bin con tr, trong khi mt khi nh cha 10 s nguyn s c dnh sn nu ary c khai bo nh l mt mng. Nu ary c khai bo nh l mt con tr, s lng b nh c th c gn nh sau: ary = malloc(20 *sizeof(int)); S dnh mt khi b nh c kch thc (tnh theo bytes) tng ng vi kch thc ca mt s nguyn. y, mt khi b nh cho 20 s nguyn c cp pht. 20 con s gn vi 20 bytes (mt byte cho mt s nguyn) v c nhn vi sizeof(int), sizeof(int) s tr v kt qu 2, nu my tnh dng 2 bytes lu tr mt s nguyn. Nu mt my tnh s dng 1 byte lu mt s nguyn, hm sizeof() khng i hi y. Tuy nhin, s dng n s to kh nng uyn chuyn cho m lnh. Hm malloc() tr v mt con tr cha a ch v tr bt u ca vng nh c cp pht. Nu khng gian b nh yu cu khng c, malloc() tr v gi tr NULL. S cp pht b nh theo cch ny, ngha l, khi c yu cu trong mt chng trnh c gi l Cp pht b nh ng. Trc khi tip tc xa hn, chng ta hy tho lun v khi nim Cp pht b nh ng. Mt chng trnh C c th lu tr cc thng tin trong b nh ca my tnh theo hai cch chnh. Phng php th nht bao gm cc bin ton cc v cc b bao gm cc mng. Trong trng hp cc bin ton cc v bin tnh, s lu tr l c nh sut thi gian thc thi chng trnh. Cc bin ny i hi ngi lp trnh phi bit trc tng s dung lng b nh cn thit cho mi trng hp. Phng php th hai, thng tin c th c lu tr thng qua H thng cp pht ng ca C. Trong phng php ny, s lu tr thng tin c cp pht t vng nh cn t do v khi cn thit. Hm malloc() l mt trong cc hm thng c dng nht, n cho php thc hin vic cp pht b nh t vng nh cn t do. Tham s cho malloc() l mt s nguyn xc nh s bytes cn thit. Mt v d khc, xt mng k t hai chiu ch_ary c 10 dng v 20 ct. S khai bo v cp pht b nh trong trng hp ny phi nh sau: char (*ch_ary)[20]; ch_ary = (char*)malloc(10*20*sizeof(char)); Nh ni trn, malloc() tr v mt con tr tr n kiu rng (void). Tuy nhin, v ch_ary l mt con tr kiu char, s chuyn i kiu l cn thit. Trong cu lnh trn, (char*) i kiu tr v ca malloc() thnh mt con tr tr n kiu char. Tuy nhin, nu s khai bo ca mng phi cha php gn cc gi tr khi to th mng phi c khai bo theo cch bnh thng, khng th dng mt bin con tr: int ary[10] = {1,2,3,4,5,6,7,8,9,10}; hoc int ary[] = {1,2,3,4,5,6,7,8,9,10};

190

Lp trnh c bn C

V d sau y to mt mng mt chiu v sp xp mng theo th t tng dn. Chng trnh s dng con tr v hm malloc() gn b nh.

#include<stdio.h> #include<malloc.h> void main() { int *p, n, i, j, temp; printf("\n Enter number of elements in the array: "); scanf("%d", &n); p = (int*) malloc(n * sizeof(int)); for(i = 0; i < n; ++i) { printf("\nEnter element no. %d:", i + 1); scanf("%d", p + i); } for(i = 0; i < n - 1; ++i) for(j = i + 1; j < n; ++j) if(*(p + i) > *(p + j)) { temp = *(p + i); *(p + i) = *(p + j); *(p + j) = temp; } for(i = 0; i < n; ++i) printf("%d\n", *(p + i)); } Ch lnh malloc(): p = (int*)malloc(n*sizeof(int)); y, p c khai bo nh mt con tr tr n mt mng v c gn b nh s dng malloc(). D liu c c vo s dng lnh scanf(). scanf("%d",p+i); Trong scanf(), bin con tr c s dng lu d liu vo trong mng. Cc phn t mng lu tr c hin th bng printf(). printf("%d\n", *(p + i)); Ch du * trong trng hp ny, v gi tr lu trong v tr phi c hin th. Khng c du *, printf() s hin th a ch. free()

Con tr

191

Hm ny c th c s dng gii phng b nh khi n khng cn cn thit. Dng tng qut ca hm free(): void free( void *ptr ); Hm free() gii phng khng gian c tr bi ptr, khng gian c gii phng ny c th s dng trong tng lai. ptr s dng trc bng cch gi n malloc(), calloc(), hoc realloc(), calloc() v realloc() (s c tho lun sau). V d bn di s hi bn c bao nhiu s nguyn s c bn lu vo trong mt mng. Sau s cp pht b nh ng bng cch s dng malloc v lu s lng s nguyn, in chng ra, v sau xa b nh cp pht bng cch s dng free. #include <stdio.h> #include <stdlib.h> /* required for the malloc and free functions */ int main() { int number; int *ptr; int i; printf("How many ints would you like store? "); scanf("%d", &number); ptr = (int *) malloc (number * sizeof(int)); /*allocate memory*/ if(ptr != NULL) { for(i = 0 ; i < number ; i++) { *(ptr+i) = i; } for(i=number ; i>0 ; i--) { printf("%d\n", *(ptr+(i-1))); /*print out in reverse order*/ } free(ptr); /* free allocated memory */ return 0; } else { printf("\nMemory allocation failed - not enough memory.\n"); return 1; } } Kt qu nh sau nu gi tr c nhp vo 3: How many ints would you like store? 3 2 1 0 calloc()

192

Lp trnh c bn C

calloc tng t nh malloc, nhng khc bit chnh l mc nhin cc gi tr c lu trong khng gian b nh cp pht l 0. Vi malloc, cp pht b nh c th c gi tr bt k. calloc i hi hai i s. i s th nht l s cc bin m bn mun cp pht b nh cho. i s th hai l kch thc ca mi bin. void *calloc( size_t num, size_t size ); Ging nh malloc, calloc s tr v mt con tr rng (void) nu s cp pht b nh l thnh cng, ngc li n s tr v mt con tr NULL. V d bn di ch ra cho bn gi hm calloc nh th no v tham chiu n nh cp pht s dng mt ch s mng. Gi tr khi to ca vng nh cp pht c in ra trong vng lp for. #include <stdio.h> #include <stdlib.h> int main() { float *calloc1, *calloc2; int i; calloc1 = (float *) calloc(3, sizeof(float)); calloc2 = (float *) calloc(3, sizeof(float)); if(calloc1 != NULL && calloc2 != NULL) { for(i = 0; i < 3; i++) { printf("\ncalloc1[%d] holds %05.5f ", i, calloc1[i]); printf("\ncalloc2[%d] holds %05.5f", i, *(calloc2 + i)); } free(calloc1); free(calloc2); return 0; } else { printf("Not enough memory\n"); return 1; } } Kt qu: calloc1[0] calloc2[0] calloc1[1] calloc2[1] calloc1[2] calloc2[2] holds holds holds holds holds holds 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000

Trong tt c cc my, cc mng calloc1 v calloc2 phi cha cc gi tr 0. calloc c bit hu dng khi bn ang s dng mng a chiu. y l mt v d khc minh ha cch dng ca hm calloc().

Con tr

193

/* This program gets the number of elements, allocates spaces for the elements, gets a value for each element, sum the values of the elements, and print the number of the elements and the sum. */ #include <stdio.h> #include <stdlib.h> main() { int *a, i, n, sum = 0; printf(\n%s%s, An array will be created dynamically. \n\n, Input an array size n followed by integers: ); scanf( %d, &n); /* get the number of elements */ a = (int *) calloc (n, sizeof(int)); /* get a value for each element */ for( i = 0; i < n; i++ ) { printf(Enter %d values: , n); scanf(%d, a + i); } /* sum the values */ for(i = 0; i < n; i++ ) sum += a[i]; free(a); /* free the space */ /* allocate space */

/* print the number and the sum */ printf(\n%s%7d\n%s%7d\n\n, Number of elements: , n, Sum of the elements: , sum); }

realloc()
Gi s chng ta cp pht mt s bytes cho mt mng nhng sau nhn ra l bn mun thm cc gi tr. Bn c th sao chp mi th vo mt mng ln hn, cch ny khng hiu qu. Hoc bn c th cp pht thm cc bytes s dng bng cch gi hm realloc, m d liu ca bn khng b mt i. realloc() nhn hai i s. i s th nht l mt con tr tham chiu n b nh. i s th hai l tng s bytes bn mun cp pht thm. void *realloc( void *ptr, size_t size ); Truyn 0 nh l i s th hai th tng ng vi vic gi hm free. Mt ln, realloc tr v mt con tr rng (void) nu thnh cng, ngc li mt con tr NULL c tr v. V d ny s dng calloc cp pht b nh cho mt mng int c nm phn t. Sau realloc c gi m rng mng c th cha by phn t.

194

Lp trnh c bn C

#include<stdio.h> #include <stdlib.h> int main() { int *ptr; int i; ptr = (int *)calloc(5, sizeof(int *)); if(ptr!=NULL) { *ptr = 1; *(ptr + 1) = 2; ptr[2] = 4; ptr[3] = 8; ptr[4] = 16; /* ptr[5] = 32; wouldn't assign anything */ ptr = (int *)realloc(ptr, 7 * sizeof(int)); if(ptr!=NULL) { printf("Now allocating more memory... \n"); ptr[5] = 32; /* now it's legal! */ ptr[6] = 64; for(i = 0;i < 7; i++) { printf("ptr[%d] holds %d\n", i, ptr[i]); } realloc(ptr, 0); /* same as free(ptr); - just fancier! */ return 0; } else { printf("Not enough memory - realloc failed.\n"); return 1; } } else { printf("Not enough memory - calloc failed.\n"); return 1; } } Kt qu: Now allocating more memory... ptr[0] holds 1 ptr[1] holds 2 ptr[2] holds 4 ptr[3] holds 8

Con tr

195

ptr[4] holds 16 ptr[5] holds 32 ptr[6] holds 64 Ch hai cch khc nhau c s dng khi khi to mng: ptr[2] = 4 l tng ng vi *(ptr + 2) = 4 (ch d c hn!). Trc khi s dng realloc, vic gn mt gi tr n phn t ptr[5] khng gy ra li cho trnh bin dch. Chng trnh vn thc thi, nhng ptr[5] khng cha gi tr m bn gn.

196

Lp trnh c bn C

Tm tt bi hc Mt con tr cung cp mt phng thc truy xut mt bin m khng cn tham chiu trc tip n bin. Mt con tr l mt bin, cha a ch vng nh ca mt bin khc. S khai bo con tr bao gm mt kiu d liu c s, mt du *, v mt tn bin. C hai ton t c bit c dng vi con tr: * v &. Ton t & tr v a ch b nh ca ton hng.

Ton t th hai, *, l phn b xung ca ton t &. N tr v gi tr c cha trong v tr b nh c tr bi con tr. Ch c php cng v php tr l c th c thc thi vi con tr.

Hai con tr c th c so snh trong mt biu thc quan h ch khi c hai bin ny cng tr n cc bin c cng kiu d liu. Cc con tr c truyn ti hm nh cc i s. Mt tn mng tht ra l mt con tr tr n phn t u tin ca mng. Mt hng con tr l mt a ch; mt bin con tr l mt ni lu a ch.

B nh c th c cp pht khi cn dng bng cch dng cc hm malloc(),calloc(),realloc(). S cp pht b nh theo cch ny c gi l s cp pht b nh ng.

Con tr

197

Kim tra tin hc tp 1. Mt _________ cung cp mt phng thc truy xut mt bin m khng tham chiu trc tip n bin. A. Mng C. Cu trc B. Con tr D. Tt c u sai

2. Cc con tr khng th tr n cc mng. 3. __________ ca con tr xc nh kiu ca cc bin m con tr c th tr n. A. Kiu C. Ni dung B. Kch thc D. Tt c u sai

(ng/Sai)

4. C hai ton t c bit c dng vi con tr l ____ v _____. A. ^ v % C. * v & B. ; v ? D. Tt c u sai

5. Ch c ________ v __________ l nhng php ton c th c thc hin trn cc con tr. A. Cng, Tr C. Chia, Cng B.Nhn, Chia D. Tt c u sai

6. Hai con tr c th c so snh ch khi c hai bin ny ang tr n cc kiu d liu khc nhau. 7. S cp pht b nh theo cch ny, ngha l, khi trong chng trnh c yu cu c gi l __________ . A. Cp pht b nh ng C. Cp pht b nh ni dung B. Cp pht b nh tnh D. Tt c u sai

198

Lp trnh c bn C

Bi tp t lm 1. Vit mt chng trnh nhn vo mt chui v in ra n nu l chui c xui ngc u ging nhau. 2. Vit mt chng trnh s dng con tr tr n cc chui nhn tn ca mt con th v mt con chim v tr v cc tn theo dng s nhiu.

Con tr

199

Bi 14
Mc tiu: Kt thc bi hc ny, bn c th: S dng con tr S dng con tr vi mng.

Con tr

Cc bc trong bi hc ny c trnh by chi tit, r rng v cn thn. iu ny gip ta hiu r v cng c lp trnh. Thc hin theo cc bc sau tht cn thn. Phn I Trong thi gian 1 gi 30 pht u: 14.1 Con tr Cc bin con tr trong C cha a ch ca mt bin c bt k kiu no. Ngha l, cc con tr c th l kiu d liu s nguyn hoc k t. Mt bin con tr s nguyn s cha a ch ca mt bin s nguyn. Mt con tr k t s cha a ch ca mt bin kiu k t. 14.1.1 m s nguyn m trong mt chui s dng con tr Cc con tr c th c s dng thay cho cc ch s duyt cc phn t trong mt mng. V d, mt con tr kiu chui c th c dng tr n a ch bt u ca mt t. V vy mt con tr c s dng c cc k t trong t . minh ha iu ny, chng ta vit mt chng trnh C m s nguyn m trong mt t bng cch s dng con tr. Cc bc c lit k nh sau: 1. Khai bo mt bin con tr kiu k t. M lnh nh sau, char *ptr; 2. Khai bo mt mng k t v nhp vo cng gi tr. M lnh nh sau, char word[10]; printf(\n Enter a word : ); scanf(%s, word); 3. Gn con tr k t ti chui. M lnh nh sau, ptr = &word[0]; a ch ca k t u tin ca mng k t, word, s c lu trong bin con tr, ptr. Ni cch khc, con tr ptr s tr ti k t u tin trong mng k t word. 4. Ln lt duyt cc k t trong t xc nh l nguyn m hay khng. Trong trng hp mt nguyn m c tm thy, tng gi tr bin m nguyn m. on m lnh nh sau, int i, vowcnt; for(i = 0; i < strlen(word); i++) {

Con tr

201

if((*ptr==a) || (*ptr==e) || (*ptr==i) || (*ptr ==o) || (*ptr==u) || (*ptr==A) || (*ptr==E) || (*ptr ==I) || (*ptr==O) || (*ptr==U)) vowcnt++; ptr++; } 5. Hin th t v s lng nguyn m trong t. on m lnh s nh sau, printf(\n The word is : %s \n The number of the word is: %d , word,vowcnt); Di y l chng trnh hon chnh. 1. Gi trnh son tho chng trnh C. 2. To tp tin mi. 3. a vo on m lnh sau: void main() { char *ptr; char word[10]; int i, vowcnt=0; printf(\n Enter a word: ); scanf(%s, word); ptr = &word[0]; for(i = 0; i < strlen(word); i++) { if((*ptr==a) || (*ptr==e) || (*ptr==i) || (*ptr==o) || (*ptr==u) || (*ptr==A) || (*ptr==E) || (*ptr==I) || (*ptr==O) || (*ptr==U)) vowcnt++; ptr++; } printf(\n The word is: %s \n The number of vowels in the word is: %d , word, vowcnt); } vowels in

Xem kt qu, theo nhng bc sau:

4. Lu tp tin vi tn pointerI.C. 5. Bin dch tp tin, pointerI.C. 6. Chy chng trnh, pointerI.C. 7. Tr v trnh son tho. Kt qu ca chng trnh trn c th hin nh trong hnh 14.1.

202

Lp trnh c bn C

Hnh 14.1 : Kt qu ca chng trnh pointerI.C 14.1.2 Sp xp mt mng theo th t abc s dng con tr Cc con tr c th c s dng hon v ni dung ca hai nh. minh ha iu ny, chng ta vit mt chng trnh C sp xp mt tp cc chui theo th t abc. C nhiu cch gii quyt chng trnh ny. Chng ta hy dng mt mng ca con tr k t hiu cch dng mng ca con tr. thc hin chng trnh ny, 1. khai bo mng con tr k t cha 5 chui. M lnh nh sau, char *ptr[5]; Mng c m t trong hnh 14.2. ptr[0] ptr[1] ptr[2] Ptr[3] ptr[4]

Hnh 14.2: Mng con tr k t 2. Nhp 5 chui v gn cc con tr trong mng con tr n cc chui. on m lnh nh sau, int i; char cpyptr1[5][10]; for (i=0;i<5;i++) { printf(\n Enter a string : ); scanf(%s,cpyptr1[i]); ptr[i]=cpyptr1[i]; } Mng c m t nh hnh 14.3. ptr[0] cpyptr1[0] ptr[1] cpyptr1[1] ptr[2] cpyptr1[2] ptr[3] cpyptr1[3] ptr[4] cpyptr1[4] Hnh 14.3 : Mng con tr k t, ptr ang tr n mng k t cpyptr1

Con tr

203

Mi chui s c c vo b nh v mt bin con tr s c gn n v tr . Mng c m t nh trong hnh 14.4. ptr[0] ptr[1] ptr[2] ptr[3] ptr[4] John Samuel Ritcha Jim Young

Hnh 14.4 : Mng sau khi c nhp cc gi tr 3. Lu tr mng ca cc chui trc khi sp xp. thc hin iu ny, chng ta cn to mt bn sao ca mng cc chui. on m lnh nh sau, char cpyptr2[5][10]; for(i = 0; i < 5; i++) strcpy(cpyptr2[i], cpyptr1ptr[i]); y hmg strcpy() c s dng sao chp cc chui vo mt mng khc. 4. Sp xp mng cc chui theo th t abc. M lnh l, char *temp; for(i = 0; i < 4; i++) { for(j = i + 1; j < 5; i++) { if (strcmp(ptr[i], ptr[j]) > 0) { temp = ptr[i]; ptr[i] = ptr[j]; ptr[j] = temp; } } } 5. Hin th cc chui ban u v cc chui c sp xp. on m lnh l, print(\nThe Original list is ); for(i = 0; i < 5; i++) printf(\n%s, cpyptr2[i]); printf(\nThe Sorted list is ); for(i = 0; i < 5; i++) printf(\n%s, ptr[i]); Di y l chng trnh hon thin. 1. To tp tin mi. 2. a vo on m lnh sau:

204

Lp trnh c bn C

void main() { char *ptr[5]; int i; int j; char cpyptr1[5][10],cpyptr2[5][10]; char *temp; for(i = 0; i < 5; i++) { printf(\nEnter a string: ); scanf(%s, cpyptr1[i]); ptr[i] = cpyptr1[i]; } for(i = 0; i < 5; i++) strcpy(cpyptr2[i], cpyptr1[i]); for(i = 0; i < 4; i++) { for(j = i + 1; j < 5; j++) { if (strcmp(ptr[i], ptr[j]) > 0) { temp = ptr[i]; ptr[i] = ptr[j]; ptr[j] = temp; } } printf(\n The Original list is ); for(i = 0; i < 5; i++) printf(\n%s, cpyptr2[i]); printf(\n The Sorted list is ); for(i = 0; i < 5; i++) printf(\n%s, ptr[i]); } } xem kt qu, thc hin theo cc bc sau: 3. Lu tp tin vi tn pointII.C 4. Bin dch tp tin, pointII.C 5. Chy chng trnh, pointII.C 6. Tr v trnh son tho.

Kt qu ca v d trn c hin th ra nh trong hnh 14.5.

Con tr

205

Figure 14.5: Kt qu ca chng trnh pointII.C

206

Lp trnh c bn C

Phn II Trong thi gian 30 pht k tip: 1. Vit mt chng trnh C ni hai chui bng cch s dng cc con tr. thc hin iu ny, a. Khai bo ba bin chui. b. Khai bo ba con tr kiu k t. c. Nhp cc gi tr ca hai chui. d. To ba con tr tr n ba bin chui. Chui th ba hin ti khng c bt k gi tr g. e. Lp qua chui th nht v sao chp ni dung ca chui vo chui th ba. S dng cc bin con tr sao chp cc gi tr. f. Sau khi sao chp chui th nht, lp qua chui th hai v chp ni dung ca chui vo cui chui ba. S dng cc bin con tr sao chp gi tr. g. In ra chui th ba.

Con tr

207

Bi tp t lm 1. Vit mt chng trnh C o mt mng k t bng cch s dng con tr. 2. Vit mt chng trnh cng hai ma trn s dng cc con tr.

208

Lp trnh c bn C

Bi 15
Mc tiu: Kt thc bi hc ny, bn c th: Tm hiu v cch s dng cc hm Tm hiu v cu trc ca mt hm Khai bo hm v cc nguyn mu hm Tho lun cc kiu khc nhau ca bin Tm hiu cch gi cc hm: Gi bng gi tr Gi bng tham chiu

Hm

Tm hiu v cc qui tc v phm vi ca hm Tm hiu cc hm trong cc chng trnh c nhiu tp tin Tm hiu v cc lp lu tr Tm hiu v con tr hm. Gii thiu Mt hm l mt on chng trnh thc hin mt tc v c nh ngha c th. Chng thc cht l nhng on chng trnh nh gip gii quyt mt vn ln. 15.1 S dng cc hm Ni chung, cc hm c s dng trong C thc thi mt chui cc lnh lin tip. Tuy nhin, cch s dng cc hm th khng ging vi cc vng lp. Cc vng lp c th lp li mt chui cc ch th vi cc ln lp lin tip nhau. Nhng vic gi mt hm s sinh ra mt chui cc ch th c thc thi ti v tr bt k trong chng trnh. Cc hm c th c gi nhiu ln khi c yu cu. Gi s mt phn ca m lnh trong mt chng trnh dng tnh t l phn trm cho mt vi con s. Nu sau , trong cng chng trnh, vic tnh ton nh vy cn phi thc hin trn nhng con s khc, thay v phi vit li cc ch th ging nh trn, mt hm c th c vit ra tnh t l phn trm ca bt k cc con s. Sau chng trnh c th nhy n hm , thc hin vic tnh ton (trong hm) v tr v ni n c gi. iu ny s c gii thch r rng hn khi tho lun v cch hot ng ca cc hm. Mt im quan trng khc l cc hm th d vit v d hiu. Cc hm n gin c th c vit thc hin cc tc v xc nh. Vic g ri chng trnh cng d dng hn khi cu trc chng trnh d c, nh vo s n gin ha hnh thc ca n. Mi hm c th c kim tra mt cch c lp vi cc d liu u vo, vi d liu hp l cng nh khng hp l. Cc chng trnh cha cc hm cng d bo tr hn, bi v nhng sa i, nu yu cu, c th c gii hn trong cc hm ca chng trnh. Mt hm khng ch c gi t cc v tr bn trong chng trnh, m cc hm cn c th t vo mt th vin v c s dng bi nhiu chng trnh khc, v vy tit kim c thi gian vit chng trnh. 15.2 Cu trc hm C php tng qut ca mt hm trong C l:

Hm

209

type_specifier function_name (arguments) { body of the function return statement } type_specifier xc nh kiu d liu ca gi tr s c tr v bi hm. Nu khng c kiu c a ra, hm cho rng tr v mt kt qu s nguyn. Cc i s c phn cch bi du phy. Mt cp du ngoc rng () vn phi xut hin sau tn hm ngay c khi nu hm khng cha bt k i s no. Cc tham s xut hin trong cp du ngoc () c gi l tham s hnh thc hoc i s hnh thc. Phn thn ca hm c th cha mt hoc nhiu cu lnh. Mt hm nn tr v mt gi tr v v vy t nht mt lnh return phi c trong hm. 15.2.1 Cc i s ca mt hm Trc khi tho lun chi tit v cc i s, xem v d sau, #include <stdio.h> main() { int i; for(i =1; i <=10; i++) printf(\nSquare of %d is %d , i,squarer (i)); } squarer(int x) /* int x; */ { int j; j = x * x; return(j); } Chng trnh trn tnh tnh bnh phng cc s t 1 n 10. iu ny c thc hin bng vic gi hm squarer. D liu c truyn t th tc gi (trong trng hp trn l hm main()) n hm c gi squarer thng qua cc i s. Trong th tc gi, cc i s c bit nh l cc i s thc v trong nh ngha ca hm c gi (squarer()) cc i s c gi l cc i s hnh thc. Kiu d liu ca cc i s thc phi cng kiu vi cc i s hnh thc. Hn na, s lng v th t ca cc tham s thc phi ging nh ca cc tham s hnh thc. Khi mt hm c gi, quyn iu khin s c chuyn n cho n, cc i s hnh thc c thay th bi cc i s thc. Sau hm c thc thi v khi bt gp cu lnh return, n s chuyn quyn iu khin cho chng trnh gi n. Hm squarer() c gi bng cch truyn s cn c tnh bnh phng. i s x c th c khai bo theo mt trong cc cch sau khi nh ngha hm. Phng php 1 squarer(int x) /* x c nh ngha cng vi kiu d liu trong cp du ngoc ()*/ Phng php 2 squarer(x)

210

Lp trnh c bn C

int x; /* x c t trong cp du ngoc (), v kiu ca n c khai bo ngay sau tn hm */ Ch , trong trng hp sau, x phi c nh ngha ngay sau tn hm, trc khi lnh. iu ny tht tin li khi c nhiu tham s c cng kiu d liu c truyn. Trong trng hp nh vy, ch phi ch r kiu mt ln duy nht ti im bt u. Khi cc i s c khai bo trong cp du ngoc (), mi i s phi c nh ngha ring l, cho d chng c cng kiu d liu. V d, nu x v y l hai i s ca mt hm abc(), th abc(char x, char y) l mt khai bo ng v abc(char x, y) l sai. 15.2.2 S tr v t hm Lnh return c hai mc ch: Ngay lp tc tr iu khin t hm v chng trnh gi Bt k ci g bn trong cp du ngoc () theo sau return c tr v nh l mt gi tr cho chng trnh gi. Trong hm squarer(), mt bin j kiu int c nh ngha lu gi tr bnh phng ca i s truyn vo. Gi tr ca bin ny c tr v cho hm gi thng qua lnh return. Mt hm c th thc hin mt tc v xc nh v tr quyn iu khin v cho th tc gi n m khng cn tr v bt k gi tr no. Trong trng hp nh vy, lnh return c th c vit dng return(0) hoc return. Ch rng, nu mt hm cung cp mt gi tr tr v v n khng lm iu th n s tr v gi tr khng thch hp. Trong chng trnh tnh bnh phng ca cc s, chng trnh truyn d liu ti hm squarer thng qua cc i s. C th c cc hm c gi m khng cn bt k i s no. y, hm thc hin mt chui cc lnh v tr v gi tr, nu c yu cu Ch rng, hm squarer() cng c th c vit nh sau squarer(int x) { return(x*x); } y mt biu thc hp l c xem nh mt i s trong cu lnh return. Trong thc t, lnh return c th c s dng theo mt trong cc cch sau y: return; return(hng); return(bin); return(biu thc); return(cu lnh nh gi); v d: return(a>b?a:b); Tuy nhin, gii hn ca lnh return l n ch c th tr v mt gi tr duy nht. 15.2.3 Kiu ca mt hm type-specifier c s dng xc nh kiu d liu tr v ca mt hm. Trong v d trn, typespecifier khng c vit bn cnh hm squarer(), v squarer() tr v mt gi tr kiu int. typespecifier l khng bt buc nu mt gi tr kiu s nguyn c tr v hoc nu khng c gi tr no

Hm

211

c tr v. . Tuy nhin, tt hn nn ch ra kiu d liu tr v l int nu mt gi tr s nguyn c tr v v tng t dng void nu hm khng tr v gi tr no. 15.3 Gi hm C th gi mt hm t chng trnh chnh bng cch s dng tn ca hm, theo sau l cp du ngoc (). Cp du ngoc l cn thit ni vi trnh bin dch l y l mt li gi hm. Khi mt tn hm c s dng trong chng trnh gi, tn hm c th l mt phn ca mt mt lnh hoc chnh n l mt cu lnh. M ta bit mt cu lnh lun kt thc vi mt du chm phy (;). Tuy nhin, khi nh ngha hm, khng c dng du chm phy cui phn nh ngha. S vng mt ca du chm phy ni vi trnh bin dch y l phn nh ngha ca hm v khng c gi hm. Mt s im cn nh: Mt du chm phy c dng cui cu lnh khi mt hm c gi, nhng n khng c dng sau mt s nh ngha hm. Cp du ngoc () l bt buc theo sau tn hm, cho d hm c i s hay khng. Hm gi n mt hm khc c gi l hm gi hay th tc gi. V hm c gi n cn c gi l hm c gi hay th tc c gi. Cc hm khng tr v mt gi tr s nguyn cn phi xc nh kiu ca gi tr c tr v. Ch mt gi tr c th c tr v bi mt hm. Mt chng trnh c th c mt hoc nhiu hm. 15.4 Khai bo hm Nu mMt hm nn c gikhai bo trong hm main() trc khi n c nh ngha hoc s dng. iu ny phi c thc hin trong trng hp hm c gi trc khi n c nh ngha.thi hm phi c khai bo trong hm main() trc khi n c s dng. Xem v d, #include <stdio.h> main() { . . address(); . . }

address() { . . . } Hm main() gi hm address() v hm address() c gi trc khi n c nh ngha. Mc d, n khng c khai bo trong hm main() th iu ny c th thc hin c trong mt s trnh bin dch C, hm address() c gi m khng cn khai bo g thm c. y l s khai bo khng tng minh ca mt hm.

212

Lp trnh c bn C

15.5 Cc nguyn mu hm Mt nguyn mu hm l mt khai bo hm trong xc nh r kiu d liu ca cc i s v tr tr v. Thng thng, cc hm c khai bo bng cch xc nh kiu ca gi tr c tr v bi hm, v tn hm. Tuy nhin, chun ANSI C cho php s lng v kiu d liu ca cc i s hm c khai bo. Mt hm abc() c hai i s kiu int l x v y, v tr v mt gi tr kiu char, c th c khai bo nh sau: char abc(); hoc char abc(int x, nt y); Cch nh ngha sau c gi l nguyn mu hm. Khi cc nguyn mu c s dng, C c th tm v thng bo bt k kiu d liu khng hp l khi chuyn i gia cc i s c dng gi mt hm vi s nh ngha kiu ca cc tham s. Mt li s c thng bo ngay khi c s khc nhau gia s lng cc i s c s dng gi hm v s lng cc tham s khi nh ngha hm. C php tng qut ca mt nguyn mu hm: type function_name(type parm_namel,type parm_name2,..type parm_nameN); Khi hm c khai bo khng c cc thng tin nguyn mu, trnh bin dch cho rng khng c thng tin v cc tham s c a ra. Mt hm khng c i s c th gy ra li khi khai bo khng c thng tin nguyn mu. trnh iu ny, khi mt hm khng c tham s, nguyn mu ca n s dng void trong cp du ngoc (). Nh ni trn, void cng c s dng khai bo tng minh mt hm khng c gi tr tr v. V d, nu mt hm noparam() tr v kiu d liu char v khng c cc tham s c gi, c th c khai bo nh sau char noparam(void); Khai bo trn ch ra rng hm khng c tham s, v bt k li gi c truyn tham s n hm l khng ng. Khi mt hm khng nguyn mu c gi tt c cc kiu char c i thnh kiu int v tt c kiu float c i thnh kiu double. Tuy nhin, nu mt hnghm l nguyn mu, th cc kiu a ra trong nguyn mu c gi nguyn v khng c s tng cp kiu xy ra. 15.6 Cc bin Nh tho lun, cc bin l nhng v tr c t tn trong b nh, c s dng cha gi tr c th hoc khng th c sa i bi mt chng trnh hoc mt hm. C ba loi bin c bn: bin cc b, tham s hnh thc, v bin ton cc. 1. Bin cc b l nhng bin c khai bo bn trong mt hm. 2. Tham s hnh thc c khai bo trong mt nh ngha hm nh l cc tham s. 3. Bin ton cc c khai bo bn ngoi cc hm. 15.6.1 Bin cc b Bin cc b cn c gi l bin ng, t kho auto c s dng khai bo chng. Chng ch c tham chiu n bi cc lnh bn trong ca khi lnh m bin c khai bo. r hn, mt bin

Hm

213

cc b c to ra trong lc vo mt khi v b hu trong lc i ra khi khi . Khi lnh thng thng nht m trong mt bin cc b c khai bo chnh l hm. Xem on m lnh sau: void blkl(void) { char ch; ch = a; . . } void blk2(void) { char ch; ch = b; . . } /* void denotes no value returned*/

Bin ch c khai bo hai ln, trong blk1() v blk2(). ch trong blk1() khng c lin quan n ch trong blk2() bi v mi ch ch c bit n trong khi lnh m n c khai bo. V cc bin cc b c to ra v hu i trong mt khi m chng c khai bo, nn ni dung ca chng b mt bn ngoi phm vi ca khi. iu ny c ngha l chng khng th duy tr gi tr ca chng gia cc ln gi hm. T kha auto c th c dng khai bo cc bin cc b, nhng thng n khng c dng v mc nhin cc bin khng ton cc c xem nh l bin cc b. Cc bin cc b c s dng bi cc hm thng c khai bo ngay sau du ngoc m { ca hm v trc tt c cc cu lnh. Tuy nhin, cc khai bo c th bn trong mt khi ca mt hm. V d, void blk1(void) { int t; t = 1; if(t > 5) { char ch; . . } . } Trong v d trn bin ch c to ra v ch hp l bn trong khi m lnh if. N khng th c tham chiu n trong mt phn khc ca hm blk1(). Mt trong nhng thun li ca s khai bo mt bin theo cch ny l b nh s ch c cp pht cho n khi nu iu kin i vo khi lnh if c tho. iu ny l bi v cc bin cc b ch c khai bo khi i vo khi lnh m cc bin c nh ngha trong . Ch : iu quan trng cn nh l tt c cc bin cc b phi c khai bo ti im bt u ca khi m trong chng c nh ngha, v trc tt c cc cu lnh thc thi.

214

Lp trnh c bn C

V d sau c th khng lm vic vi mt s cc trnh bin dch. void blk1(void) { int len; len = 1; char ch; /* This will cause an error */ ch = a; . . } 15.6.2 Tham s hnh thc Mt hm s dng cc i s phi khai bo cc bin nhn cc gi tr ca cc i s. Cc bin ny c gi l tham s hnh thc ca hm v hot ng ging nh bt k mt bin cc b bn trong hm. Cc bin ny c khai bo bn trong cp du ngoc () theo sau tn hm. Xem v d sau: blk1(char ch, int i) { if(i > 5) ch = a; else i = i +1; return; } Hm blk1() c hai tham s: ch v i. Cc tham s hnh thc phi c khai bo cng vi kiu ca chng. Nh trong v d trn, ch c kiu char v i c kiu int. Cc bin ny c th c s dng bn trong hm nh cc bin cc b bnh thng. Chng b hu i khi ra khi hm. Cn ch l cc tham s hnh thc khai bo c cng kiu d liu vi cc i s c s dng khi gi hm. Trong trng hp c sai, C c th khng hin th li nhng c th a ra mt kt qu khng mong mun. iu ny l v, C vn a ra mt vi kt qu trong cc tnh hung khc thng. Ngi lp trnh phi m bo rng khng c cc li v sai kiu. Cng ging nh vi cc bin cc b, cc php gn cng c th c thc hin vi tham s hnh thc ca hm v chng cng c th c s dng bt k biu thc no m C cho php. 15.6.3 Bin ton cc Cc bin ton cc l bin c thy bi ton b chng trnh, v c th c s dng bi mt m lnh bt k. Chng c khai bo bn ngoi cc hm ca chng trnh v lu gi tr ca chng trong sut s thc thi ca chng trnh. Cc bin ny c th c khai bo bn ngoi main() hoc khai bo bt k ni u trc ln s dng u tin. Tuy nhin, tt nht khai bo cc bin ton cc l ti u chng trnh, ngha l trc hm main(). int ctr; /* ctr is global */ void blk1(void); void blk2(void); void main(void) {

Hm

215

ctr = 10; blk1 (); . . } void blk1(void) { int rtc; if (ctr > 8) { rtc = rtc + 1; blk2(); } } void blk2(void) { int ctr; ctr = 0; } Trong on m lnh trn, ctr l mt bin ton cc v c khai bo bn ngoi hm main() v blk1(), n c th c tham chiu n trong cc hm. Bin ctr trong blk2(), l mt bin cc b v khng c lin quan vi bin ton cc ctr. Nu mt bin ton cc v cc b c cng tn, tt c cc tham chiu n tn bn trong khi cha nh ngha bin cc b s c kt hp vi bin cc b m khng phi l bin ton cc. Cc bin ton cc c lu tr trong cc vng c nh ca b nh. Cc bin ton cc hu dng khi nhiu hm trong chng trnh s dng cng d liu. Tuy nhin, nn trnh s dng bin ton cc nu khng cn thit, v chng gi b nh trong sut thi gian thc hin chng trnh. V vy vic s dng mt bin ton cc ni m mt bin cc b c kh nng p ng cho hm s dng l khng hiu qu. V d sau s gip lm r hn iu ny: void addgen(int i, int j) { return(i + j); } int i, j; void addspe(void) { return(i + j); } C hai hm addgen() v addspe() u tr v tng ca cc bin i v j. Tuy nhin, hm addgen() c s dng tr v tng ca hai s bt k; trong khi hm addspe() ch tr v tng ca cc bin ton cc i v j. 15.7 Lp lu tr (Storage Class) Mi bin trong C c mt c trng c gi l lp lu tr. Lp lu tr xc nh hai kha cnh ca bin: thi gian sng ca bin v phm vi ca bin. Thi gian sng ca mt bin l thi gian m gi tr ca bin tn ti. Phm viS thy c ca mt bin xc nh cc phn ca mt chng trnh s c th nhn ra bin. Mt bin c th c tm nhn trong mt khi, mt hm, mt tp tin, mt nhm cc tp tin, hoc ton b chng trnh.Mt bin c th xut hin trong mt khi, mt hm, mt tp tin, mt nhm cc tp tin, hoc ton b chng trnh

216

Lp trnh c bn C

Theo cch nhn ca trnh bin dch C, mt tn bin xc nh mt vi v tr vt l bn trong my tnh, mt chui cc bit biu din gi tr c lu tr ca bin. C hai loi v tr trong my tnh m gi tr ca bin c th c lu tr: b nh hoc thanh ghi CPU. Lp lu tr ca bin xc nh v tr bin c lu tr l trong b nh hay trong mt thanh ghi. C c bn lp lu tr. l: auto external static register

l cc t kho. C php tng qut cho khai bo bin nh sau: storage_specifier type var_name; 15.7.1 Bin t ng Bin t ng tht ra l bin cc b m chng ta ni trn. Phm vi ca mt bin t ng c th nh hn hm, nu n c khai bo bn trong mt cu lnh ghp: phm vi ca n b gii hn trong cu lnh ghp . Chng c th c khai bo bng t kha auto, nhng s khai bo ny l khng cn thit. Bt k mt bin c khai bo bn trong mt hm hoc mt khi lnh th mc nhin l thuc lp auto v h thng cung cp vng b nh c yu cu cho bin . 15.7.2 Bin ngoi Trong C, mt chng trnh ln c th c chia thnh cc module nh hn, cc module ny c th c bin dch ring l v c lin kt li vi nhau. iu ny c thc hin nhm tng tc qu trnh bin dch cc chng trnh ln. Tuy nhin, khi cc module c lin kt, cc tp tin phi c chng trnh thng bo cho bit v cc bin ton cc c yu cu. Mt bin ton cc ch c th c khai bo mt ln. Nu hai bin ton cc c cng tn c khai bo trong cng mt tp tin, mt thng ip li duplicate variable name (tn bin trng) c th c hin th hoc n gin trnh bin dch C chn mt bin khc. Mt li tng t xy ra nu tt c cc bin ton cc c yu cu bi chng trnh c cha trong mi tp tin. Mc d trnh bin dch khng a ra bt k mt thng bo li no trong khi bin dch, nhng s tht cc bn sao ca cng mt bin ang c to ra. Ti thi im lin kt cc tp tin, b lin kt s hin th mt thng bo li nh sau duplicate label (nhn trng nhau) v n khng bit s dng bin no. Lp extern c dng trong trng hp ny. Tt c cc bin ton cc c khai bo trong mt tp tin v cc bin ging nhau c khai bo nh l bin ngoi ngoi trong tt c cc tp tin. Xem on m lnh sau: Filel int i,j; char a; main() { . . . } abc() { i = 123; . . } File2 extern int i,j; extern char a; xyz() { i = j * 5 . . } pqr() { j = 50; . . }

Hm

217

File2 c cc bin ton cc ging nh File1, ngoi tr mt im l cc bin ny c t kha extern c thm vo s khai bo ca chng. T kha ny ni vi trnh bin dch l tn v kiu ca bin ton cc c s dng m khng cn phi to li s lu tr cho chng. Khi hai module c lin kt, cc tham chiu n cc bin ngoi c gii quyt. Nu mt bin khng c khai bo trong mt hm, trnh bin dch s kim tra n c so khp vi bt k bin ton cc no khng. Nu khp vi mt bin ton cc, th trnh bin dch s xem nh mt bin ton cc ang c tham chiu n.

15.7.3 Bin tnh Cc bin tnh l cc bin c nh bn trong cc hm v cc tp tin. Khng ging nh cc bin ton cc, chng khng c bit n bn ngoi hm hoc tp tin ca chng, nhng chng gi c gi tr ca chng gia cc ln gi. iu ny c ngha l, nu mt hm kt thc v sau c gi li, cc bin tnh nh ngha trong hm vn gi c gi tr ca chng. S khai bo bin tnh c bt u vi t kha static. C th nh ngha cc bin tnh c cng tn nh hng dn vi cc bin ngoi. Cc bin cc b (bin tnh cng nh bin ng) c u tin cao hn cc bin ngoi v gi tr ca cc bin ngoi s khng nh hng bi bt k s thay i no cc bin cc b. Cc bin ngoi c cng tn vi cc bin ni trong mt hm khng th c truy xut trc tip bn trong hm . Cc gi tr khi to c th c gn cho cc bin trong s khai bo cc bin tnh, nhng cc gi tr ny phi l cc hng hoc cc biu thc. Trnh bin dch t ng gn mt gi tr mc nhin 0 n cc bin tnh khng c khi to. S khi to thc hin u chng trnh. Xem hai chng trnh sau. S khc nhau gia bin cc b: t ng v tnh s c lm r. V d v bin t ng: #include <stdio.h> main() { incre(); incre(); incre(); } incre() { char var = 65; /* var is automatic variable*/ printf(\nThe character stored in var is %c, var++); } kKt qu thc thi ca chng trnh trn s l: The character stored in var is A The character stored in var is A The character stored in var is A V d v bin tnh: #include<stdio.h> main()

218

Lp trnh c bn C

{ incre(); incre(): incre(): } incre() { static char var = 65; /* var is static variable */ printf(nThe character stored in var is %c, var++); } kKt qu thc thi ca chng trnh trn s l: The character stored in var is A The character stored in var is B The character stored in var is C C hai chng trnh gi incre() ba ln. Trong chng trnh th nht, mi ln incre() c gi, bin var vi lp lu tr auto (lp lu tr mc nh) c khi to li l 65 (l m ASCII tng ng ca k t A). V vy khi kt thc hm, gi tr mi ca var (66) b mt i (ASCII ng vi k t B). Trong chng trnh th hai, var l ca lp lu tr static. y var c khi to l 65 ch mt ln duy nht khi bin dch chng trnh. Cui ln gi hm u tin, var c gi tr 66 (ASCII B) v tng t ln gi k tip var c gi tr 67 (ASCII C). Sau ln gi hm cui cng, var c tng gi tr theo s thc thithi hnh ca lnh printf(). Gi tr ny b mt khi chng trnh kt thc. 15.7.4 Bin thanh ghi Cc my tnh c cc thanh ghi trong b s hc logic - Arithmetic Logic Unit (ALU), cc thanh ghi ny c s dng tm thi lu tr d liu c truy xut thng xuyn. Kt qu tc thi ca php tnh ton cng c lu vo cc thanh ghi. Cc thao tc thc hin trn d liu lu tr trong cc thanh ghi th nhanh hn d liu trong b nh. Trong ngn ng assembly (hp ng), ngi lp trnh phi truy xut n cc thanh ghi ny v s dng chng gip chng trnh chy nhanh hn. Cc ngn ng lp trnh bc cao thng khng truy xut n cc thanh ghi ca my tnh. Trong C, vic la chn v tr lu tr cho mt gi tr ty thuc vo ngi lp trnh. Nu mt gi tr c bit c dng thng xuyn (v d gi tr iu khin ca mt vng lp), lp lu tr ca n c th khai bo l register. Sau nu trnh bin dch tm thy mt thanh ghi cn trng, v cc thanh ghi ca my tnh ln cha bin, bin s c t vo thanh ghi . Ngc li, trnh bin dch s xem cc bin thanh ghi nh cc bin ng khc, ngha l lu tr chng trong b nh. T kha register c dng khi nh ngha cc bin thanh ghi. Phm vi v s khi to ca cc bin thanh ghi l ging nh cc bin ng, ngoi tr v tr lu tr. Cc bin thanh ghi l cc b trong mt hm. Ngha l, chng tn ti khi hm c gi v gi tr b mt i mt khi thot khi hm. S khi to cc bin ny c thc hin bi ngi lp trnh. V s lng cc thanh ghi l c hn, lp trnh vin cn xc nh cc bin no trong chng trnh c s dng thng xuyn khai bo chng l cc bin thanh ghi. S hu dng ca cc bin thanh ghi thay i t my ny n mt my khc v t mt trnh bin dch C ny n mt trnh bin dch khc. i khi cc bin thanh ghi khng c h tr bi tt c t kha register vn c chp nhn nhng c xem ging nh l t kha auto. Trong cc trng hp khc, nu bin thanh ghi c h tr v nu lp trnh vin s dng chng mt cch hp l, chng trnh s c thc thi nhanh hn gp i.

Hm

219

Cc bin thanh ghi c khai bo nh bn di: register int x; register char c; S khai bo thanh ghi ch c th gn vo cc bin ng v tham s hnh thc. Trong trng hp sau, s khai bo s ging nh sau: f(c,n) register int c, n; { register int i; . . . } Xt mt v d, chng trnh hin th tng lp phng cc s thnh phn ca mt s bng chnh s . V d 370 l mt s nh vy, v: 33 + 73 + 03 = 27 + 343 + 0 = 370 Chng trnh sau in ra cc con s nh vy trong khong 1 n 999. #include <stdio.h> main() { register int i; int no, digit, sum; printf(\nThe numbers whose Sum of Cubes of Digits is Equal to the number itself are:\n\n); for(i = 1; i < 999; i++) { sum = 0; no = i; while(no) { digit = no%10; no = no/10; sum = sum + digit * digit * digit; } if (sum == i) printf(t%d\n, i); } } Kt qu thc thi ca chng trnh trn nh sau: The numbers whose Sum of Cubes of Digits is Equal to the number itself are: 1 153 370 371

220

Lp trnh c bn C

407 Trong chng trnh trn, gi tr ca i , thay i t 1 n 999. Vi mi gi tr ny, lp phng ca tng con s ring l c cng v kt qu tng c so snh vi i. Nu hai gi tr ny l bng nahunhau, i c hin th. V i c s dng iu khin s lp, (phn chnh ca chng trnh), n c khai bo l ca lp lu tr thanh ghi. S khai bo ny lm tng hiu qu ca chng trnh. 15.8 Cc qui lut v phm vi ca mt hm Qui lut v phm vi l nhng qui lut quyt nh mt on m lnh c th truy xut n mt on m lnh khc hayhoc d liu hay khng. Trong C, mi hm ca chng trnh l cc khi lnh ring l. M lnh bn trong mt hm l cc b vi hm v khng th c truy xut bi bt k lnh no ngoi hm, ngoi tr li gi hm. M lnh bn trong mt hm l n i vi phn cn li ca chng trnh, v tr khi n s dng bin hoc d liu ton cc, n c th tc ng hoc b tc ng bi cc phn khc ca chng trnh. r hn, m lnh v d liu c nh ngha bn trong mt hm khng th tng tc vi m lnh hay d liu c nh ngha trong hm khc bi v hai hm c phm vi khc nhau. Trong C, tt c cc hm c cng mc phm vi. Ngha l, mt hm khng th c nh ngha bn trong mt hm khc. Chnh v l do ny m C khng phi l mt ngn ng cu trc khi v mt k thut. 15.9 Gi hm Mt cch tng qut, cc hm giao tip vi nhau bng cch truyn tham s. Cc tham s c truyn theo mt trong hai cch sau: Truyn bng gi tr Truyn bng tham chiu. 15.9.1 Truyn bng gi tr Mc nhin trong C, tt c cc i s ca hm c truyn bng gi tr. iu ny c ngha l, khi cc i s c truyn n hm c gi, cc gi tr c truyn thng qua cc bin tm. Mi s thao tc ch c thc hin trn cc bin tm ny. Hm c gi khng th thay i gi tr ca chng. Xem v d sau, #include <stdio.h> main() { int a, b, c; a = b = c = 0; printf(\nEnter 1st integer: ); scanf(%d, &a); printf(\nEnter 2nd integer: ); scanf(%d, &b); c = adder(a, b); printf(\n\na & b in main() are: %d, % d, a, b); printf(\n\nc in main() is: %d, c); /* c gives the addition of a and b */ } adder(int a, int b) { int c;

Hm

221

c = a + b; a *= a; b += 5; printf(\n\na & b within adder function are: %d, %d , a, b); printf(\nc within adder function is : %d,c); return(c); } V d v kt qu thc thi khi nhp vo 2 v 4: a c a c & b in main() are: 2, 4 in main() is: 6 & b within adder function are: 4, 9 within adder function is : 6

Chng trnh trn nhn hai s nguyn, hai s ny c truyn n hm adder(). Hm adder() thc hin nh sau: n nhn hai s nguyn nh l cc i s ca n, cng chng li, tnh bnh phng cho s nguyn th nht, v cng 5 vo s nguyn th hai, in kt qu v tr v tng ca cc i s thc. Cc bin c s dng trong hm main() v adder() c cng tn. Tuy nhin, khng c g l chung gia chng. Chng c lu tr trong cc v tr b nh khc nhau. iu ny c thy r t kt qu ca chng trnh trn. Cc bin a v b trong hm adder() c thay i t 2 v 4 thnh 4 v 9. Tuy nhin, s thay i ny khng nh hng n cc gi tr ca a v b trong hm main(). Cc bin c lu nhng v tr b nh khc nhau. Bin c trong main() th khc vi bin c trong adder(). V vy, cc i s c gi l truyn bng gi tr khi gi tr ca cc bin c truyn n hm c gi v bt k s thay i tren gi tr ny cng khng nh hng n gi tr gc ca bin truyn. 15.9.2 Truyn bng tham chiu Khi cc i s c truyn bng gi tr, cc gi tr ca i s ca hm ang gi l khng b thay i. Tuy nhin, c th c trng hp, gi tr ca cc i s phi c thay i. Trong nhng trng hp nh vy, truyn bng tham chiu c dng. Truyn bng tham chiu, hm c php truy xut n vng b nh thc ca cc i s v v vy c th thay i gi tr ca cc i s ca hm gi. V d, xt mt hm, hm ny nhn hai i s, hon v gi tr ca chng v tr v cc gi tr ca chng. Nu mt chng trnh ging nh chng trnh di y c vit gii quyt mc ch ny, th s khng bao gi thc hin c. #include <stdio.h> main() { int x, y; x = 15; y = 20; printf(x = %d, y = %d\n, x, y); swap(x, y); printf(\nAfter interchanging x = %d, y = %d\n, x, y); } swap(int u, int v) { int temp; temp = u; u = v; v = temp; return;

222

Lp trnh c bn C

} Kt qu thc thi ca chng trnh trn nh sau: x = 15, y = 20 After interchanging x = 15, y = 20 Hm swap() hon v cc gi tr ca u v v, nhng cc gi tr ny khng c truyn tr v hm main(). iu ny l bi v cc bin u v v trong swap() l khc vi cc bin u v v c dng trong main(). Truyn bng tham chiu c th c s dng trong trng hp ny t c kt qu mong mun, bi v n s thay i cc gi tr ca cc i s thc. Cc con tr c dng khi thc hin truyn bng tham chiu. Cc con tr c truyn n mt hm nh l cc i s cho php hm c gi ca chng trnh truy xut cc bin m phm vi ca n khng vt ra khi hm gi. Khi mt con tr c truyn n mt hm, a ch ca d liu c truyn n hm nn hm c th t do truy xut ni dung ca a ch . Cc hm gi nhn ra bt k thay i trong ni dung ca a ch. Theo cch ny, i s hm cho php d liu c thay i trong hm gi, cho php truyn d liu hai chiu gia hm gi v hm c gi. Khi cc i s ca hm l cc con tr hoc mng, truyn bng tham chiu c to ra i nghch vi cch truyn bng gi tr. Cc i s hnh thc ca mt hm l cc con tr th phi c mt du * pha trc, ging nh s khai bo bin con tr, xc nh chng l cc con tr. Cc i s thc kiu con tr trong li gi hm c th c khai bo l mt bin con tr hoc mt bin c tham chiu n (&var). V d, nh ngha hm getstr(char *ptr_str, int *ptr_int) i s ptr_str tr n kiu char v ptr_int tr n kiu int. Hm c th c gi bng cu lnh, getstr(pstr, &var) pstr c khai bo l mt con tr v a ch ca bin var c truyn. Gn gi tr thng qua, *ptr_int = var; Hm by gi c th gn cc gi tr n bin var trong hm gi, cho php truyn theo hai chiu n v t hm. char *pstr; Quan st v d sau ca hm swap(). Bi ton ny s gii quyt c khi con tr c truyn thay v dng bin. M lnh tng t nh sau: #include <stdio.h> void main() { int x, y, *px, *py; /* Storing address of x in px */ px = &x; /* Storing address of y in py */ py = &y;

Hm

223

x = 15; y = 20; printf(x = %d, y = %d \n, x, y); swap (px, py); /* Passing addresses of x and y */ printf(\n After interchanging x = %d, y = %d\n, x, y); } swap(int *u, int *v) /* Accept the values of px and py into u and v */ { int temp; temp = *u; *u = *v; *v = temp; return; } Kt qu thc thi ca chng trnh trn nh sau: x = 15, y = 20 After interchanging x = 20, y = 15 Hai bin kiu con tr px v py c khai bo, v a ch ca bin x v y c gn n chng. Sau cc bin con tr c truyn n hm swap(), hm ny hon v cc gi tr lu trong x v y thng qua cc con tr. 15.10 S lng nhau ca li gi hm Li gi mt hm t mt hm khc c gi l s lng nhau ca li gi hm. Mt chng trnh kim tra mt chui c phi l chui c xui - c ngc nh nhau hay khng, l mt v d cho cc li gi hm lng nhau. T c xui - ngc ging nhau l mt chui cc k t i xng. Xem on m lnh theo sau y: main() { . . palindrome(); . . } palindrome() { . . getstr(); reverse(); cmp(); . . }

224

Lp trnh c bn C

Trong chng trnh trn, hm main() gi hm palindrome(). Hm palindrome() gi n ba hm khc getstr(), reverse() v cmp(). Hm getstr() nhn mt chui k t t ngi dng, hm reverse() o ngc chui v hm cmp() so snh chui c nhp vo v chui c o. V main() gi palindrome(), hm palindrome() ln lt gi cc hm getstr(), reverse() v cmp(), cc li gi hm ny c gi l c lng bn trong palindrome(). S lng nhau ca cc li gi hm nh trn l c php, trong khi nh ngha mt hm bn trong mt hm khc l khng c chp nhn trong C.

15.11 Hm trong chng trnh nhiu tp tin Cc chng trnh c th c to bi nhiu tp tin. Nhng chng trnh nh vy c to bi cc hm ln, mi hm c th chim mt tp tin. Cng nh cc bin trong cc chng trnh nhiu tp tin, cc hm cng c th c nh ngha l static hoc external. Phm vi ca hm external c th c s dng trong tt c cc tp tin ca chng trnh, v l cch lu tr mc nh cho cc tp tin. Cc hm static ch c nhn bit bn trong tp tin chng trnh v phm vi ca n khng vt khi tp tin chng trnh. Phn tiu (header) ca hm nh sau, static fn _type fn_name (argument list) hoc extern fn_type fn_name (argument list) T kha extern l mt tu chn (khng bt buc) v n l lp lu tr mc nh. 15.12 Con tr n hm

Mt c tnh mnh m ca C vn cha c cp, chnh l con tr hm. D rng mt hm khng phi l mt bin, nhng n c a ch vt l trong b nh ni c th gn cho mt con tr. Mt a ch hm l im bt ui vo ca hm v con tr hm c th c s dng gi hm. hiu cc con tr hm lm vic nh th no, tht s cn phi hiu tht r mt hm c bin dch v c gi nh th no trong C. Khi mi hm c bin dch, m ngun c chuyn thnh m i tng v mt im bt ui vo ca hm c thit lp. Khi mt li gi c thc hin n mt hm, mt li gi ngn ng my c thc hin chuyn iu khin n im bt ui vo ca hm. V vy, nu mt con tr cha a ch ca im bt ui vo ca hm, n c th c dng gi hm . a ch ca mt hm c th ly c bng cch s dng tn hm khng c du ngoc () hay bt k i s no. Chng trnh sau s minh ha khi nim ca con tr hm. #include <stdio.h> #include <string.h> void check(char *a, char *b, int (*cmp)()); main() { char s1[80], s2[80]; int (*p)(); p = strcmp; gets(s1); gets(s2); check(s1, s2, p); }

Hm

225

void check(char *a, char *b, int (*cmp)()) { printf(Testing for equality \n); if(!(*cmp)(a, b)) printf(Equal); else printf(Not Equal); } Hm check() c gi bng cch truyn hai con tr k t v mt con tr hm. Trong hm check(), cc i s c khai bo l cc con tr k t v mt hm con tr. Ch cch khai bo mt hm con tr c khai bo. C php tng t c dng khi khai bo cc hm con tr khc bt lun l kiu tr v ca hm. Cp du ngoc () bao quanh *cmp l cn thit chng trnh bin dch hiu cu lnh ny mt cch r rng.

226

Lp trnh c bn C

Tm tt bi hc Trong C, cc hm c dng thc thi mt chui cc ch th nhiu hn mt ln. type_specifier xc nh kiu d liu ca gi tr s c tr v bi hm. Cc i s ti hm c th l cc hng, bin, biu thc hay cc hm. Cc i s cn c gi l cc i s thc trong hm gi v i s hnh thc trong hm c gi. Mt hm phi c khai bo trong hm main(), trc khi n c nh ngha hay s dng. Trong C, mc nh, tt c cc i s ca hm c truyn bng gi tr. C ba loi bin c bn: bin cc b, tham s hnh thc v bin ton cc. Bin cc b c khai bo bn trong mt hm. Tham s hnh thc c khai bo trong nh ngha ca tham s hm. Bin ton cc c khai bo bn ngoi tt c cc hm. Lp lu tr nh ngha hai c tnh ca bin; thi gian sng ca bin v tm nhn hay phm vi. Cc bin t ng ging nh cc bin cc b. Tt c cc bin ton cc c khai bo trong mt tp tin v ging vi cc bin c khai bo extern trong tt c cc tp tin. Cc bin static l cc bin c nh bn trong cc hm hoc tp tin ca chng. Khng ging cc bin ton cc, cc bin tnh khng c nhn bit bn ngoi hm hoc tp tin ca n, nhng chng duy tr c cc gi tr ca chng gia cc ln gi. Nu mt gi tr c bit c s dng thng xuyn, c th dng lp lu tr register cho n. Cng ging nh cc bin trong cc chng trnh c nhiu tp tin, cc hm cng c th c nh ngha l static hay external. M lnh v d liu c nh ngha bn trong mt hm khng th tng tc vi m lnh hay d liu c nh ngha trong hm khc bi v hai hm c phm vi khc nhau. Mt hm khng th c nh ngha bn trong mt hm khc. Mt nguyn mu hm l mt s khai bo hm xc nh ch ra cc kiu d liu ca cc i s. Li gi mt hm t bn trong mt hm khc c gi l s lm t ca li gi hm. Mt con tr hm c th c dng gi mt hm.

Hm

227

Kim tra tin hc tp 1. Mt_________ l mt on chng trnh cha chnh n v thc hin mt tc v xc nhc th.
2.

Cc i s xut hin trong cp du ngoc () cn c gi l _____________.

3. Nu khng c lnh return, iu khin chuyn n chng trnh gi khi gp du ngoc ng } ca khi m lnh. iu ny c gi l ____________.
4.

Hm gi n mt hm khc c tn l ________ v hm ang c gi n c tn l ________.

5. Mt __________ l mt s khai bo hm xc nhch ra kiu d liu ca cc i s. 6.6. _________ ch c th c tham chiu n bi cc lnh bn trong khi lnh khai bo chng.
7.7. ________ c nhn thy bi ton b chng trnh, v c th c s dng bt k m lnh
Formatted: Bullets and Numbering Formatted: Bullets and Numbering

no.
8.8.

_________ quyt nh mt on m lnh c th truy xut n mt on m lnh khc hayhoc d liu hay khng.

Formatted: Bullets and Numbering

9.9. Cc i s c gi l truyn ________ khi gi tr ca cc bin c truyn n hm c gi 10.10. Trong_________, hm c php truy xut v tr b nh tht ca cc i s.

Formatted: Bullets and Numbering Formatted: Bullets and Numbering

228

Lp trnh c bn C

Bi 16
Mc tiu: Kt thc bi hc ny, bn c th: nh ngha v gi hm S dng cc tham s trong hm.

Hm

Phn I Trong thi gian 1 gi 30 pht u: 16.1 Hm Nh chng ta bit, mt hm l mt khi cc lnh thc hin mt tc v xc nh. Trong bi ny, chng ta tp trung vo cch to v s dng hm. 16.1.1 nh ngha hm Mt hm c nh ngha vi mt tn hm, theo sau bi cp du ngoc nhn{} bn trong cha mt hay nhiu cu lnh. V d, argentina() { statement 1; statement 2; statement 3; } 16.1.2 Gi mt hm Mt hm c th c gi t chng trnh chnh bng cch a ra tn ca hm theo sau theo sau bi cp du ngoc () v mt du chm phy. V d, argentina(); By gi, xem chng trnh hon thin. 1. Gi trnh son tho chng trnh C. 2. To tp tin mi. 3. a vo on m lnh sau: #include<stdio.h> void main() { printf(\nI am in main); italy(); brazil(); argentina(); }

Hm

231

italy() { printf(\nI am in italy); } brazil() { printf(\nI am in brazil); } argentina() { printf(\nI am in argentina); }

xem kt qu, thc hin cc bc sau: 4. Lu tp tin vi tn functionI.C. 5. Bin dch tp tin, functionI.C. 6. Thc thi chng trnh, functionI.C. 7. Tr v trnh son tho. Mt kt qu v kt qu thc thi ca chng trnh trn c ch ra trong hnh 16.1.Kt qu ca chng trnh trn c minh ha nh hnh 16.1

Hnh 16.1: Kt qu ca functionI.C 1.2 S dng cc tham s trong hm Cc tham s c s dng chuyn truyn thng tin n hm. Cc chui nh dng v danh sch cc bin c t bn trong cp du ngoc () ca hm l cc tham s. 16.2.1 nh ngha mt hm c tham s Mt hm c nh ngha vi mt tn hm theo sau l du ngoc m (, sau l cc tham s v cui cng l du ngoc ng ). Bn trong hm, c th c mt hoc nhiu cu lnh. V d, calculatesum (int x, int y, int z) { statement 1; statement 2; statement 3;

232

Lp trnh c bn C

} Xem chng trnh hon thin sau. 1. To mt tp tin mi. 2. Nhp vo m lnh sau: #include<stdio.h> void main() { int a, b, c, sum; printf(\nEnter any three numbers: ); scanf(%d %d %d, &a, &b, &c); sum = calculatesum(a, b, c); printf(\nSum = %d, sum); } calculatesum(int x, int y, int z) { int d; d = x + y + z; return (d); } 3. Lu tp tin vi tn functionII.C. 4. Bin dch tp tin, functionII.C. 5. Thc thi chng trnh, functionII.C. 6. Tr v trnh son tho. Kt qu ca chng trnh trn c minh ha nh hnh 16.2 Mt v d ca kt qu thc thi chng trnh c trnh by trong hnh 16.2.

Hnh 16.2: Kt qu I ca functionII.C

Hm

233

Phn II Trong thi gian 30 k tip: 1. Vit mt chng trnh C nhp vo mt s v tnh bnh phng ca s vi s tr gip cabng cch s dng hm. thc hin iu ny, a. Khai bo mt hm. b. Nhp vo mt s. c. Truyn s n hm v hm s tr v bnh phng ca s .

234

Lp trnh c bn C

Bi tp t lm 1. Vit mt chng trnh C tnh din tch v chu vi hnh trn. 2. Vit mt chng trnh in ra giai tha ca mt s nguyn.

Hm

235

Bi 17
Mc tiu: Kt thc bi hc ny, bn c th: Gii thch cc bin v hng kiu chui Gii thch con tr tr n chui Thc hin cc thao tc nhp/xut chui Gii thch cc hm thao tc chui Gii thch cch thc truyn mng vo hm nh tham s M t cch thc s dng chui nh cc i stham s ca hm. Gii thiu

Chui

Cc chui trong C c ci t nh l cc mng k t kt thc bi k t NULL (\0). Bi ny s tho lun v cng dng v thao tc trn chui. 17.1 Cc bin v hng kiu chui Cc bin chui c s dng lu tr mt chui cc k t. Nh cc bin khc, cc bin ny phi c khai bo trc khi s dng. V d khai bo mt bin chui: Mt cu khai bo bin chui in hnh l: char str[10]; str l mt bin mng cc k t c th lu gi ti a 10 k t. Gi s str c gn mt hng chui, WELL DONE Mt hng chui l mt dy cc k t nm trong du nhy kp. Mi k t trong mt chui c lu tr nh l mt phn t ca mng. Trong b nh, chui c lu tr nh sau: W E L L D O N E \0

K t \0 (null) c t ng thm vo trong cch biu din bn trong ca chui nh du im kt thc chui. K t \0 (null) c t ng thm vo trong cch biu din bn trong ca chui chng trnh c th nh v c ni kt thc chui. V vy, khi khai bo mt chui, phi tng kch thc ca n thm mt phn t cha k hiu kt thc null. V vy, khi khai bo mt bin chui, nh dnh mt phn t trng cho k hiu kt thc null. 17.1.1 Con tr tr n chui Chui c th c lu v truy cp bng cch s dng con tr kiu k t. Mt con tr kiu k t tr n mt chui c khai bo nh sau: char *pstr = WELCOME; pstr l mt con tr c khi to tr n mt hng chui. Con tr pstr c th thay i tr n bt k mt chui no khc. Khi , s khng th no truy xut n chui WELCOME m pstr ang

Chui

237

tr n. Mc d khi con tr pstr tr n mt chui khc th ta khng th truy xut n chui WELCOMEc na. pstr l mt con tr c khi to tr n mt hng chui. Con tr c th thay i tr n mt ni khc. Tuy nhin, s thay i s lm cho chui tr nn khng th truy cp c na.

Formatted

17.1.2 Cc thao tc nhp xut chui Cc thao tc nhp/xut (I/O) chui trong C c thc hin bng cch gi cc hm. Cc hm ny l mt phn ca th vin nhp/xut chun tn stdio.h. Mt chng trnh mun s dng cc hm nhp/xut chui phi c cu lnh khai bo sau u chng trnh: #include <stdio.h>; Khi chng trnh c cha cu lnh ny c bin dch, th ni dung ca tp tin stdio.h s tr thnh mt phn ca chng trnh. Cc thao tc nhp/xut chui n gin S dng Hhm gets() l cch n gin nht nhp mt chui thng qua thit b nhp chun. Cc k t s c nhp vo cho n khi nhn phm Enter. Hm gets() thay th k t kt thc tr v u dng \n bng k t \0. C php hm ny nh sau: gets(str); Trong str l mt mng k t c khai bo. Tng t, hm puts() c s dng hin th mt chui ra thit b xut chun. K t xung dng s kt thc vic xut chui. C php hm nh sau: puts(str); Trong str l mt mng k t c khai bo v khi to. Chng trnh sau y nhn vo mt tn v hin th mt thng ipthng bo. V d 1: #include <stdio.h> void main() { char name[20]; /* name is declared as a single dimensional character array */ clrscr(); puts("Enter your name:"); gets(name); puts("Hi there: "); puts(name); getch(); /* Clears the screen */ /* Displays a message */ /* Accepts the input */

/* Displays the input */

238

Lp trnh c bn C

} Nu tn Lisa c nhp vo, chng trnh trn cho ra kt qu: Enter your name: Lisa Hi there: Lisa Cc thao tc Nhp/Xut chui c nh dng C th s ng cc hm scanf() v printf() nhp v hin th cc gi tr chui. Cc hm ny c dng nhp v hin th cc kiu d liu hn hp trong mt cu lnh duy nht. C php nhp mt chui nh sau: scanf(%s, str); Trong k hiu nh dng %s cho bit rng mt gi tr chui s c nhp vo. str l mt mng k t c khai bo. Tng t, hin th chui, c php s l: printf(%s, str); tTrong k hiu nh dng %s cho bit rng mt gi tr chui s c hin th v str l mt mng k t c khai bo v khi to. Hm printf() c th c s dng khng km theo k t nh dng hin th cc thng bo.Hm printf() c th dng hin th ra cc thng bo m khng cn k t nh dng. C th sa i chng trnh bn trn nhp vo v hin th mt tn, s dng hm scanf() v printf(). V d 2: #include <stdio.h> void main() { char name[20]; /* name is declared as a single dimensional character array */ clrscr(); printf("Enter your name: "); scanf(%s, name); printf("Hi there: %s", name); getch(); } Nu nhp vo tn Brendan , chng trnh trn cho ra kt qu: Enter your name: Brendan Hi there: Brendan /* Clears the screen */ /* Displays a message */ /* Accepts the input */ /* Displays the input */

Chui

239

17.2 Cc hm v chui C h tr rt nhiu hm v chui. Cc hm ny c th tm thy trong tp tin string.h. Mt s thao tc m cc hm ny thc hin l: Ni kt chui So snh chui nh v mt k t trong chui Sao chp mt chui sang chui khc TnhXc nh chiu di ca chui.

17.2.1 Hm strcat() Hm strcat() c s dng ni hai gi tr chui vo mt chuinhau. C php hm l: strcat(str1, str2); trong str1 v str2 l hai mng k tchui c khai bo v khi to. Gi tr trong str2 c gn vo cui chui str1.Hm ny s thc hin ni Cchui str2 c ni vo sau chui str1 Chng trnh sau y nhn vo h v tn,. N s ni chng vi nhau v hin th ra h tn y . Chng trnh sau y nhn vo h v tn. N s ni tn vo h v hin th tn c ni. V d 3: #include<stdio.h> #include<string.h> void { main() char firstname[15]; char lastname[15]; clrscr(); printf("Enter your first name: "); scanf("%s", firstname); printf("Enter your last name:"); scanf("%s", lastname); strcat(firstname, lastname); /* Attaches the contents of lastname at the end of firstname */ printf("%s", firstname); getch(); } Kt qu ca chng trnh trn c minh ha nh sau: Mt mu xut ra mn hnh ca chng trnh trn s l: Enter your first name: Carla Enter your last name: Johnson CarlaJohnson

240

Lp trnh c bn C

17.2.2 Hm strcmp() Vic so snh hai chuis (bng nhau hay khng bng nhau) c th thc hin bng cch s dng cc ton t quan h. Tuy nhin, so snh hai chui k t, phi dng mt hm. Hm strcmp() so snh hai chui vi nhau v tr v mt s nguyn ph thuc vo kt qu so snh. C php ca hm strcmp() nh sau: S bng nhau (hay khng bng nhau) ca hai s c th c chng thc bng cch s dng cc ton t quan h. Tuy nhin, so snh cc chui, phi dng mt li gi hm. Hm strcmp() so snh hai chui v tr v mt gi tr s nguyn da trn kt qu ca s so snh. C php hm l: strcmp(str1, str2); trong str1 v str2 l hai mng k tchui c khai bo v khi to.Hm tr v gi tr: Nh hn 0 nu str1<str2 0 nu str1 = str2 Ln hn 0 nu str1>str2 Chng trnh sau y so snh bin name1 vi cc bin name2, name3, name4 v hin th kt qu ca php so snh: Chng trnh sau y so snh mt tn vi ba tn khc v hin th kt qu ca php so snh. V d 4: #include <stdio.h> #include<string.h> void { main() char name1[15] char name2[15] char name3[15] char name4[15] int i; clrscr(); i = strcmp(name1,name2); printf("%s compared with %s returned %d\n", name1, name2, i); i=strcmp(name1, name3); printf("%s compared with %s returned %d\n", name1, name3, i); i=strcmp(name1,name4); printf("%s compared with %s returned %d\n", name1, name4, i); getch(); } Kt qu ca chng trnh trn c minh ha nh sau: Mu xut ra mn hnh ca chng trnh trn s l: Geena compared with Dorothy returned 3 Geena compared with Shania returned -12 Geena compared with Geena returned 0 = = = = "Geena"; "Dorothy"; "Shania"; "Geena";

Chui

241

Lu gi tr tr v trong mi php so snh v d trn. l s khc nhau v m ASCII ca hai k t khc nhau u tin tm thy trong hai chui. Lu gi tr tr v cho mi php so snh. N l s khc bit gia cc gi tr ASCII ca hai k t khc nhau u tin tm gp trong hai chui. 17.2.3 Hm strchr() Hm strchr() xc nh v tr xut hin ca mt k t trong mt chui. C php hm l: strchr(str, chr); trong str l mt mng k t hay chui. chr l mt bin k t cha gi tr cn tm. Hm tr v con tr tr n gi tr tm c u tin trong chui, hoc NULL nu khng tm gpthy. Chng trnh sau y xc nh liu k t a c xut hin trong hai tn thnh ph c nu ratn hai thnh ph hay khng.

242

Lp trnh c bn C

V d 5: #include <stdio.h> #include<string.h> void { main() char str1[15] = "New York"; char str2[15] = "Washington"; char chr = 'a', *loc; clrscr(); loc = strchr(str1, chr); /* Checks for the occurrence of the character value held by chr in the first city name */ if(loc != NULL) printf("%c occurs in %s\n", chr, str1); else printf("%c does not occur in %s\n", chr, str1); loc = strchr(str2, chr); /* Checks for the occurrence of the character in the second city name */ if(loc != NULL) printf("%c occurs in %s\n", chr, str2); else printf("%c does not occur in %s\n", chr, str2); getch(); } Kt qu ca chng trnh trn c minh ha nh sau: Kt qu xut ra mn hnh ca chng trnh trn l: a does not occur in New York a occurs in Washington 17.2.4 Hm strcpy() Trong C khng c ton t no x l mt chui nh l mt n v duy nht. V vy, php gn mt gi tr chui ny cho mt chui khc i hi phi s dng hm strcpy(). C php hm l: strcpy(str1, str2); trong str1 v str2 l hai mng k t c khai bo v khi to. Hm sao chp gi tr str2 vo str1 v tr v chui str1. Chng trnh sau y minh ha vic s dng hm strcpy(). N thay i tn ca mt khch sn v hin th tn mi. V d 6:

Chui

243

#include <stdio.h> #include<string.h> void { main() char hotelname1[15] = "Sea View"; char hotelname2[15] = "Sea Breeze"; clrscr(); printf("The old name is %s\n", hotelname1); strcpy(hotelname1, hotelname2); /*Changes the hotel name*/ printf("The new name is %s\n", hotelname1); /*Displays the new name*/ getch(); }

Kt qu ca chng trnh trn c minh ha nh sau: Kt qu xut ra mn hnh ca chng trnh trn l: The old name is Sea View The new name is Sea Breeze 17.2.5 Hm strlen() Hm strlen() tr v chiu di ca chui. Chiu di ca chui rt hay c s dng trong cc vng lp truy cp tng k t ca chui. C php ca hm l: Hm strlen() tr v di chui. di chui c th hu dng trong cc chng trnh truy cp n tng k t ca chui trong mt vng lp. C php hm l: strlen(str); trong str l mng k t c khai bo v khi to. Hm tr v di chuichiu di ca chui str. Chng trnh sau y a ra v d n gin s dng hm strlen(). N tm chiu di ca tn mt cng ty v hin th tn cng ty vi cc k t c phn cch nhau bi k t *.hin th tn ra mn hnh cng vi mt s cc k t khc.
Chng trnh sau y cho thy thao tc n gin ca hm strlen(). N xc nh di chui ca mt tn cng ty v hin th tn cng vi mt s k t thm vo.

Formatted

V d 7: #include<stdio.h> #include<string.h> void { main() char compname[20] = "Microsoft"; int len, ctr;

244

Lp trnh c bn C

clrscr(); len = strlen(compname); /* Determines the length of the string */ for(ctr = 0; ctr < len; ctr++) /* Accesses and displays each character of the string*/ printf("%c * ", compname[ctr]); getch(); }
Kt qu ca chng trnh trn c minh ha nh sau:

Kt qu xut ra mn hnh ca chng trnh trn l: M * i * c * r * o * s * o * f * t * 17.3 Truyn mng vo hm Trong C, khi mt mng c truyn vo hm nh mt itham s, th ch c a ch ca mng c truyn vo. Tn mng khng km theo ch s l a ch ca mng. on m di y m t cch truyn a ch ca mng ary cho hm fn_ary(): on trch m lnh sau y truyn a ch ca mng ary vo hm fn_ary(): void main() { int ary[10]; . . fn_ary(ary); . . } Nu itham s ca hm l mt mng mt chiu, th tham s hnh thc c th c khai bo theo mt trong cc cch sau: Nu mt hm nhn mt mng mt chiu, cc tham s hnh thc c th c khai bo theo mt trong cc cch sau y: fn_ary (int ary [10]) { : } hoc fn_arry (int ary []) { : } /*unsized array */ /* sized array */

C hai khai bo trn u cho cng kt qu. Kiu th nht s dng cch khai bo mng chun, ch r ra kch thc ca mng. Kiu th hai, ch ra rng tham s l mt mng kiu int c kch thc bt k. C hai khai bo trn u cho cng kt qu. Kiu u tin s dng cch khai bo mng chun. kiu th hai, khai bo mng n gin ch m t rng cn a vo mt mng kiu int vi mt di no .

Chui

245

Chng trnh sau y nhn cc s vo mt mng s nguyn. Sau mng ny s c truyn vo hm sum_arr(). Hm s tnh ton v tr v tng ca cc s nguyn trong mng. V d 8: #include <stdio.h> void main() { int num[5], ctr, sum = 0; int sum_arr(int num_arr[]); /* Function declaration */ clrscr(); for(ctr = 0; ctr < 5; ctr++) /*Accepts numbers into the array*/ { printf("\nEnter number %d: ", ctr+1); scanf("%d", &num[ctr]); } sum = sum_arr(num); /* Invokes the function */ printf("\nThe sum of the array is %d", sum); getch(); } int sum_arr(int num_arr[]) /* Function definition */ { int i, total; for(i = 0, total = 0; i < 5; i++) /* Calculates the sum */ total += num_arr[i]; return total; /* Returns the sum to main() */ } Kt qu ca chng trnh trn c minh ha nh sau: Mt mu kt xut ra mn hnh ca chng trnh trn l: Enter number 1: 5 Enter number 2: 10 Enter number 3: 13 Enter number 4: 26 Enter number 5: 21 The sum of the array is 75 17.4 Truyn chui vo hm

246

Lp trnh c bn C

Chui, hay mng k t, c th c truyn vo hm. V d, chng trnh sau y s nhn vo cc chui v a vo lu trong mt mng k t hai chiu. Sau , mng ny s c truyn vo trong mt hm dng xc nhtm chui di nht trong mng . V d 9: #include <stdio.h> void { main() char lines[5][20]; int ctr, longctr = 0; int longest(char lines_arr[][20]); /* Function declaration */ clrscr(); for(ctr = 0; ctr < 5; ctr++) /* Accepts string values into the array */ { printf("\nEnter string %d: ", ctr + 1); scanf("%s", lines[ctr]); } longctr = longest(lines); /* Passes the array to the function */ printf("\nThe longest string is %s", lines[longctr]); getch(); } int longest(char lines_arr[][20]) /* Function definition */ { int i = 0, l_ctr = 0, prev_len, new_len; prev_len = strlen(lines_arr[i]); /* Determines the length of the first element */ for(i++; i < 5; i++) { new_len = strlen(lines_arr[i]); /* Determines the length of the next element */ if(new_len > prev_len) l_ctr = i; /* Stores the subscript of the longer string */ prev_len = new_len; } return l_ctr; /* Returns the subscript of the longest string */ }

Chui

247

Kt qu ca chng trnh trn c minh ha nh sau: Mt mu kt xut ra mn hnh ca chng trnh trn l: Enter string 1: The Enter string 2: Sigma Enter string 3: Protocol Enter string 4: Robert Enter string 5: Ludlum The longest string is Protocol

248

Lp trnh c bn C

Tm tt bi hc Chui trong C c ci t nh mng cc k t kt thc bng k t NULL (\0). Cc bin chui c s dng lu tr mt dy cc k t. Mt hng chui l mt dy cc k t bao bi du nhy kp. Cc chui c th c lu tr v truy cp bng cch s dng cc con tr k t. Cc thao thc nhp/xut chui trong C c thc hin bng cc hm thuc th vin nhp/xut chun stdio.h. Hm gets() v puts() l cch n gin nht nhp vo v hin th chui. Hm scanf() v printf() c th c s dng nhp vo v hin th chui i cng vi cc kiu d liu khc. C h tr rt nhiu hm v chui, m chng ta c th tm thy trong tp tinth vin chun header string.h. Hm strcat() c s dng ni hai gi tr chui vo mt. Hm strcmp() so snh hai chui v tr v mt s nguyn da vo kt qu ca php so snh. Hm strchr() xc nh v tr xut hin ca mt k t trong mt chui. Hm strcpy() sao chp ni dung ca mt chui vo mt chui khc. Hm strlen() tr v di ca chui. Trong C, khi mt mng c truyn vo hm nh mt itham s, ch c a ch ca mng c truyn vo. Tn mng khng i km vi ch s l a ch ca mng.

Chui

249

Kim tra tin hc tp 1. Cc chui c kt thc bi k t __________. 2. S lng k t c th nhp vo char_arr[15] l _________. 3. S thay i gi tr ca con tr kiu chui c th dn n mt d liu. 4. K t __ c s dng sang dng mi trong printf(). 5. s dng hm strcat(), tp tin header ________ phi c bao gm trong chng trnh. 6. Hai con tr c th so snh c ch khi c hai bin ang tr n cc bin c kiu khc nhau. (ng / Sai) 7. strcmp() tr v _______ nu hai chui hon ton ging nhau. 8. Khi mt mng c truyn vo mt hm, ch c _______ ca n c truyn. (ng / Sai)

250

Lp trnh c bn C

Bi tp t lm 1. Vit mt chng trnh nhp vo hai chui. Chng trnh s xc nh liu chui th nht c xut hin cui chui th hai khng. 2. Vit mt chng trnh nhp vo mt mng cc s v hin th gi tr trung bnh. S dng hm tnh gi tr trung bnh.

Chui

251

Bi 18
Mc tiu: Kt thc bi hc ny, bn c th: S dng cc hm v chui Truyn mng vo hm Truyn chui vo hm.

Chui

Cc bc trong bi ny c gii thch chi tit, y . Mc ch l nm c nhng ni dung trong bi l thuyt v s dng thnh tho c cng c. Hy lm theo cc bc di y mt cch cn thn.
Cc bc c cho trong bi ny c gii thch cn k, d hiu v c t duy cn thn t u n cui. Bi c vit p ng c mc tiu hc v c th hiu hon ton v cng c. Xin hy thc hin theo cc bc mt cch cn thn. Phn I Trong thi gian 1 gi 30 pht u: 18.1 Cc hm v chui

Cc hm x l chui trong C nm trong trong th vin chunfile string.h. Do bt k chng trnh no c s dng n cc hm x l chui phi a file th vin ny vo bng lnh include.
Cc hm v chui trong C c tm thy trong tp tin header chun string.h. Tp tin ny phi c bao gm (include) trong mi chng trnh s dng cc hm v chui. 18.1.1 Sp xp chui s dng cc hm trong th vin Lu chui s dng cc hm trong th vin Cc hm v chui c dng thao tc trn cc mng k t. Chng hn nh, chiu di ca mt chui c th c xc nh bng hm strlen(). Chng ta hy vit mt chng trnh C sp xp 5 chui theo di gim dn. Cc bc thc hin c lit k nh sau: 1. Nh chng ta hc trong bi l thuyt, trong C, s dng cc hm v chui t th vin, chng ta cn phi bao gma vo hai tp tin headerhai th vin chun: stdio.h, string.h. Cu lnh s l: #include <stdio.h> #include <string.h> 2. Khai bo mt mng k t lu 5 chui. Cu lnh s l: char str_arr[5][20]; 3. Nhp vo 5 chui trong vng lp for. Cu lnh s l: for(i = 0; i < 5; i++) { printf("\nEnter string %d: ", i + 1); scanf("%s", str_arr[i]);

Chui

251

} 4. So snh chiu di ca mi chui vi cc chui khc, nu chiu di ca chui ny nh hn chiu di ca mt chui ng v tr pha sau n trong mng, ta s thc hin i ch 2 chui cho nhau. i ch nu chiu di ca chuica n nh hn chui kia. Cu lnh s l: for(i = 0; i < 4; i++) for(j = i + 1; j < 5; j++) { if(strlen(str_arr[i]) < strlen(str_arr[j])) { strcpy(str, str_arr[i]); strcpy(str_arr[i], str_arr[j]); strcpy(str_arr[j], str); } }

Chui str c s dng trong thao tc hon i hai chui.


Mt mng str c s dng gip cho thao tc i ch. 5. Hin th cc chui theo th t sp xp. Cu lnh s l: printf("\nThe strings in descending order of length are:"); for(i = 0; i < 5; i++) printf("\n%s", str_arr[i]); Chng ta hy nhn voxem chng trnh hon chnh. 1. M chng trnh son tho m bn dng g chng trnh C. 2. To mt tp tin mi. 3. G vo cc dng lnh sau y: #include <stdio.h> #include <string.h> void { main() int i, j; char str_arr[5][20], str[20]; clrscr(); for(i = 0; i < 5; i++) { printf("\nEnter string %d: ", i + 1); scanf("%s", str_arr[i]); } for(i = 0; i < 4; i++) for(j = i + 1; j < 5; j++) { if(strlen(str_arr[i]) < strlen(str_arr[j])) { strcpy(str, str_arr[i]); strcpy(str_arr[i], str_arr[j]);
252 Elementary Programming with C

strcpy(str_arr[j], str); } } printf("\nThe strings in descending order of length are:"); for(i = 0; i < 5; i++) printf("\n%s", str_arr[i]); getch();
}

xem kt qu, thc hin cc bc sau y: 4. 5. 6. 7. Lu tp tin vi tn stringI.C. Bin dch tp tin, stringI.C. Thc thi chng trnh, stringI.C. Tr v chng trnh son tho.

Kt qu ca chng trnh trn c minh ha nh sau:


Mt v d thc thi chng trnh trn nh sau: Enter string 1: This Enter string 2: sentence Enter string 3: is Enter string 4: not Enter string 5: sorted The strings in descending order of length are: sentence sorted This not is 18.1.2 S dng hm chuyn mt mng k t v dngkiu in ch hoa Cc chui c th c truyn vo hm thao tc. Khi chui, hay mng cc k t, c truyn vo hm, thc ra l ta truyn a ch ca n . minh ha iu ny, chng ta hy vit mt chng trnh C chuyn mt tp hp cc chui v dngkiu in ch hoa. Vic chuyn i v dngkiu in ch hoa s c thc hin bng mt hm. Cc bc c lit k nh sau: 1. Bao gma vo cc tp tin header th vin cn thit. Cu lnh s l: #include <stdio.h> #include <string.h> 2. Khai bo mt mng lu tr 5 chui. Cu lnh s l: char names[5][20]; 3. Khai bo mt hm nhn vo mt chui nh l mt i s. Cu lnh s l:

Chui

253

void uppername(char name_arr[]); 4. Nhp 5 chui a vo mng. Cu lnh s l: for(i = 0; i < 5; i++) { printf("\nEnter string %d: ", i + 1); scanf("%s", names[i]); } 5. Truyn mi chui vo hm chuyn thnh in hoa. Sau khi chuyn i, hin th

chui thay i. Cu lnh s l:


for(i = 0; i < 5; i++) { uppername(names[i]); printf("\nNew string %d: %s", i + 1, names[i]); } 6. nh ngha hm. Cu lnh s l: void uppername(char name_arr[]) { int x; for(x = 0; name_arr[x] != '\0'; x++) { if(name_arr[x] >= 97 && name_arr[x] <= 122) name_arr[x] = name_arr[x] - 32; } } Cu lnh iu kin bn trong vng lp kim tra gi tr ASCII ca tng k t trong chui. Nu k t dng ch thng, n s c chuyn v dng ch hoa. Lu rng gi tr ASCII ca A l 65 v a l 97. iu kin kim tra gi tr ASCII ca mi k t trong chui. Nu k t ang l ch thng, n s c chuyn i v dng in hoa. Lu rng gi tr ASCII ca A l 65 v a l 97.

Chng ta hy nhn xem vo chng trnh hon chnh.


1. To mt tp tin mi. 2. G vo cc dng lnh sau y: #include <stdio.h> #include <string.h> void main() { int i; char names[5][20]; void uppername(char name_arr[]); clrscr();

254

Elementary Programming with C

for(i = 0; i < 5; i++) { printf("\nEnter string %d: ", i + 1); scanf("%s", names[i]); } for(i = 0; i < 5; i++) { uppername(names[i]); printf("\nNew string %d: %s", i + 1, names[i]); } getch(); }

void uppername(char name_arr[]) { int x; for(x = 0; name_arr[x] != '\0'; x++) { if(name_arr[x] >= 97 && name_arr[x] <= 122) name_arr[x] = name_arr[x] - 32; } }

xem kt qu, thc hin cc bc sau y: 3. Lu tp tin vi tn stringII.C. 4. Bin dch tp tin stringII.C. 5. Thc thi chng trnh stringII.C. 6. Tr v chng trnh son tho.

Kt qu ca chng trnh trn c minh ha nh sau:


Mu kt qu ca chng trnh nh sau: Enter string 1: Sharon Enter string 2: Christina Enter string 3: Joanne Enter string 4: Joel Enter string 5: Joshua New string 1: SHARON New string 2: CHRISTINA New string 3: JOANNE New string 4: JOEL New string 5: JOSHUA

Chui

255

Phn II Trong thi gian 30 pht k tip: 1. Vit mt chng trnh C hin th s ln xut hin ca mt k t no trong mt chui. t Dng mt vng lp thc hin thao tc ny 5 ln.

lm iu ny,
a. Khai bo mt bin k t v mt mng k t. b. Khai bo mt hm nhn vo mt mng k t v mt bin k t, v tr v mt gi tr nguyn. c. t Dng mt vng lp nhp vo mt chui v mt k t 5 ln. d. Nhn vo mt chui v mt k t. e. Truyn chui v k t vo hm v nhn gi tr tr v bng mt bin nguyn. f. In gi tr tr v. g. Vit code cho hm trn. Hm trn thc hin Sso snh tng k t trong chui vi k t cn tm. Tng bin m ln mt mi khi tm thy k t trong chui. Cui cng, tr v gi tr ca bin m cho hm main(). g.Vit nh ngha hm. So snh mi k t trong chui vi k t a vo. Tng mt bin nguyn mi khi k t a vo xut hin trong chui. Cui cng, tr v bin nguyn cho hm main().

Formatted: Bullets and Numbering

256

Elementary Programming with C

Bi tp t lm 1. Vit mt chng trnh C nhp vo 5 tn v mt chc danh. Xen Chn chc danh vo phn vo u mi tn trong mng. Hin th cc tn sa i. 2. Vit mt chng trnh C nhp vo nhit trung bnh hng nm ca 5 nm qua, cho 5 thnh ph. Hin th nhit ln nht v nh nht ca mi thnh ph. S dng hm xc nh cc nhit ln nht v nh nht.

Chui

257

Bi 19
Mc tiu: Kt thc bi hc ny, bn c th:

Cc Kiu d liu Nng cao v Sp xp

Gii thch Tm hiu cu trc (structure) v cng dng ca chng nh ngha cu trc Khai bo cc bin kiu cu trc Gii thchTm hiu cch truy cp vo cc phn t ca cu trc Gii thchTm hiu cch khi to cu trc Gii thchTm hiu cch s dng cu trc vi cu lnh gn Gii thch cch truyn cu trc vo hm nh cc i sGii thchTm hiu cch truyn itham s kiu kiu cu trc vo hm S dng mng cc cu trc Gii thchTm hiu s cch khi to ca cc mng cu trc Gii thchTm hiu con tr n cu trc Gii thchTm hiu cch truyn cc i s kiu con tr cu trc vo hm nh cc i s. Gii thchTm hiu t kha typedef Gii thchTm hiu vic sp xp mng vi hai thut ton sp xp mng l Insertion sort v Bubble sort. Gii thiu Cc chng trnh ng dng trong bi cnh ca th gii thctrong thc t i hi lu tr cc kiu d liu khc nhau. C th cc kiu d liu c nh ngha trc ca C t ra l khng trong nhng trng hp nh vy. Tuy nhin, cc kiu d liu ca C m chng ta c hc c th khng trong cc trng hp . V vy, C cho php to ra cc kiu d liu ty do ngi dng nh ngha. Mt trong nhng kiu nh vy l cu trc (structure). Mt cu trc l mt nhm tp cc bin c gom nhm li vi nhau cdi cng mt tn. Mt kiu d liu cng c th c t tn mi bng cch s dng t kha typedef. Cc ng dng thng lu tr mt s lng d liu rt ln. Trong nhng trng hp ny, vic nh v mt mc d liu no c th tn nhiu thi gian. Sp xp cc gi tr theo mt trt t no s lm cho cng vic tm kim nhanh chng v d dng hn. Trong chng ny, chng ta cng s xem mt s gii thut dng sp xp cc mng. 19.1 Cu trc

Cc bBin c th c s dng lu gi mt mu d liu ti mt thi im v cc mng c th c s dng lu gi mt s mud liu c cng kiu. Tuy nhin, mt chng trnh c th yu cu x l cc mc d liu c kiu khc nhau trong cng mt n v chung. trng hp ny, c bin v mng u khng thch hp s dng. V d, mt chng trnh c vit lu tr d liu trong v mt danh mc sch. Chng trnh i hi phi nhp v lu tr tn ca mi quyn sch (mt mng chui), tn ca tc gi (mt mng chui khc), ln xut bn (mt s nguyn), gi ca quyn sch (mt s thc). Mt mng a chiu khng th

Cc Kiu d liu Nng cao v Sp xp

259

s dng lm iu ny, v cc phn t ca mt mng phi c cng kiu. y chnh l lc m Trong trng hp ny, vic s dng cu trc s lm cho mi vic tr nn n gin hn. Mt cu trc bao gm mt s mumc d liu, khng cn phi cng kiu, c nhm li vi nhau. Trong v d trn, mt cu trc s bao gm tn sch, tn tc gi, ln xut bn, v gi ca quyn sch. Cu trc c th lu gi bao nhiu mcmu d liu cng c. Hnh 19.1 mMinh ha s khc bit gia mt bin, mt mng v mt cu trc. I L L U S I O N S B A C H 1 Cu trc

Tn sch

1 Bin

I L L U S I O N S Mng

Tn tc gi Ln xut bn

Hnh 19.1. S khc nhau gia mt bin, mt mng v mt cu trc. 19.1.1 nh ngha mt cu trc Mt cu trc c nh ngha chnh l mt khun mu ca bin cu trc. Cc bin trong cu trc c gi l cc phn t ca cu trc hay thnh phn ca cu trcMt nh ngha cu trc hnh thnh mt khun mu to ra cc bin cu trc. Cc bin trong cu trc c gi l cc phn t ca cu trc hay thnh vin ca cu trc. Vic nh ngha cu trc s to ra kiu d liu mi cho php ngi dng s dng chng khai bo cc bin kiu cu trc. Cc bin trong cu trc c gi l cc phn t hay cc thnh phn ca cu trc. Mt cch tng qut, cc phn t ca mt cu trc quan h vi nhau mt cch logic v chng lin quan n mt thc th duy nht. V d, v mt danh mc sch c th c biu din nh sau: struct cat { char bk_name [25]; char author [20]; int edn; float price; }; Cu lnh trn nh ngha mt kiu d liu mi gic tn l struct cat. Mi bin ca kiu ny bao gm bn phn t - bk_name, author, edn, v price. Cu lnh khng khai bo bt k bin no v v vy chng trnh khng dnh bt k vng nh no trong b nh. N ch nh ngha cu trc ca cat. T kha struct bo cho trnh bin dch bit rng mt structure ang c nh ngha. Nhn cat khng

260

Lp trnh c bn C

phi l tn bin, v khng phi ta ang khai bo bin. N l mt tn kiu. Cc phn t ca cu trc c nh ngha trong du mc, v kt thc ton b cu lnh bng mt du chm phy. 19.1.2 Khai bo bin kiu cu trc Mt Kkhi mt cu trc c nh ngha, chng mt hay nhiu bin kiu ny c th c khai bota c th khai bo mt hoc nhiu bin kiu ny. iu ny c th thc hin nh sauV d: struct cat books1; Cu lnh ny s dnh vng nh lu gi tt c cc mc trong mt cu trc. Khai bo trn thc hin chc nng tng t nh cc khai bo bin: int xyz v float ans. N bo vi trnh bin dch dnh ra mt vng lu tr cho mt bin vi kiu no v gn tn cho bin. Cng nh vi int, float v cc kiu d liu khc, ta c th c mt s bt k cc bin c kiu cu trc cho. Trong mt chng trnh, c th khai bo hai bin books1 v books2 c kiu cu trc cat . iu ny c th thc hin c theo nhiu cch. struct cat { char bk_name[25]; char author[20]; int edn; float price; } books1, books2; hoc struct cat books1, books2; hoc struct cat books1; struct cat books2; Cc khai bo ny s dnh vng nh cho c hai bin books1 v books2. Cc phn t ca cu trc c truy cp thng qua vic s dng ton t chm (.), ton t ny cn c gi l ton t thnh vin membership. C php tng qut dng truy cp mt phn t ca cu trc l: structure_name.element_name V d nh, m lnh sau y lin htruy cp n trng bk_name ca bin kiu cu trc books1 khai bo bn trn. books1.bk_name c vo tn ca quyn sch, cu lnh s l: scanf(%s, books1.bk_name); in ra tn sch, cu lnh s l: printf(The name of the book is %s, books1.bk_name);

Cc Kiu d liu Nng cao v Sp xp

261

19.1.3 Khi to cc bin cu trc Ging nh cc bin v mng, cc bin kiu cu trc c th c khi to ti thi im khai bo. Hnh thc tng t nh cch khi to mng. Xt cu trc sau dng lu s th t v tn nhn vin: struct employee { int no; char name[20]; }; Cc bin emp1 v emp2 c kiu employee c th c khai bo v khi to nh sau: struct employee emp1 = {346, Abraham}; struct employee emp2 = {347, John}; y, sau khi khai bo kiu cu trc nh thng l, hai bin cu trc emp1 v emp2 c khai bo v khi to. SVic khai bo v khi to ca chng xy rac thc hin cng mt lc trong mt dng bi mt cu lnh duy nht. SVic khi to ca cu trc tng t nh khi to mng kiu bin, tn bin, v ton t gn, cui cng l danh sch cc gi tr c t trong cp mc v c phn cch bi du phy. theo sau bi du mc cha danh sch cc gi tr, phn cch nhau bi du phy. 19.1.4 Cu lnh gn s dng cc cu trcThc hin cu lnh gn vi cc bin cu trc C th gn gi tr ca mt bin cu trc cho mt bin khc cng kiu bng cch s dng cu lnh gn n gin. Chng hn, nu books1 v books2 l cc bin cu trc c cng kiu, th cu lnh sau l hp l. books2 = books1; Cng c nhng trng hp, ni m khng th dng cu lnh gn trc tip, th c th s dng hm to snsn memcpy(). Nguyn mu ca hm ny l: memcpy (char * destn, char &source, int nbytes); Hm ny thc hin sao chp nbytes c lu tr bt u t a ch source n mt vng nh khc c a ch bt u t destn. Hm i hi ngi s dng phi m t ch ra kch c ca cu trc (nbytes), kch c ny c th t c bng cch s dng ton t sizeof(). S dng hm memcpy(), c th sao chp ni dung ca books1 sang books2 nh sau: memcpy (&books2, &books1, sizeof(struct cat)); 19.1.5 Cu trc lng trong cu trc Mt cu trc c th lng trong mt cu trc khc. Tuy nhin, mt cu trc khng th lng trong chnh n. Rt nhiu trng hp thc t i hi c mt cu trc nm trong mt cu trc khc. Xt v d, mt mu tin v lu tr thng tin v nhng ngi mn sch v chi tit ca quyn sch c mn cng phi c lu tr. Cu trc sau y c th c s dng: ta c th s dng cu trc sau: struct issue { char borrower [20]; char dt_of_issue[8];

262

Lp trnh c bn C

struct cat books; }issl; Cu lnh ny khai bo books l mt thnh phn ca cu trc issue. Bn thn thnh phn ny l mt cu trc kiu struct cat c kiu cu trc. Bin Ccu trc trn c th c khi to nh sau: struct issue issl = {Jane, 04/22/03, {Illusions, Richard Bach, 2, 150.00}}; Cc du ngoc lng nhau c s dng khi to mt cu trc nm trong mt cu trc. truy cp vo cc phn t ca cu trc, hnh thc tng t nh cch s dng vi cc cu trc bnh thng, chng hn truy cp vo tn ca ngi mn, m lnh s l: i vi bin cu trc c thnh phn l mt cu trc khc, vic truy cp cc thnh phn ca bin ny hon ton tng t i vi mt bin cu trc thng thng. Chng hn, truy cp vo tn ca ngi mn ta dng lnh l: issl.borrower Tuy nhin truy cp vo phn t ca cu trc cat, chnh l mt phn ca cu trc issue, biu thc sau y s c s dng: Tuy nhin, truy cp thnh phn author ca bin cu trc cat m bin cu trc ny li l thnh phn ca mt bin cu trc issl ta s dng lnh sau: issl.books.author Biu thc ny lin h n phn t author ca cu trc books trong cu trc issl. Mc lng ca cc cu trc ch b gii hn bi dung lng hin thi ca b nh ang c. C th c mt cu trc lng trong mt cu trc ri lng trong mt cu trc khc v v.vCc tn bin s dng thng t m t v hnh dng ca n. Tn ca cc bin thng c t theo cch thc gi nh ni dung thng tin m n lu tr. V d nh: company.division.employee.salary Cng cn nh rng nu mt cu trc c lng trong mt cu trc khc, n phi c khai bo trc cu trc khc s dng n. 19.1.6 Truyn cu trc nh l cc i s ca hm tham s kiu cu trc Mt bin cu trc c th c truyn vo mt hm nh l mt i sKiu tham s ca mt hm c th l cu trc. y l mt phng tin hu dng v n c s dng truyn mt nhm cc mc d liu c lin quan logic vi nhau thay v phi truyn tng mc mt. y l mt phng tin hu dng khi ta mun truyn mt nhm cc thnh phn d liu c quan h logic vi nhau thng qua mt bin thay v phi truyn tng thnh phn mt. Tuy nhin, khi mt cu trc c s dng nh mt i stham s, cn phi lu rng kiu ca i stham s thc phi trng vi kiu ca tham s hnh thc. Chng hn nh, mt cu trc c khai bo lu tr tn, m s khch hng v s tin gi gc vo ti khon ca khch hng. D liu c nhp trong hm main() v cu trc c truyn vo hm intcal()-hm tnh ton s tin li phi tr, vic ton s tin li phi tr c thc hin bng cch gi hm intcal() c mt tham s kiu cu trc. on lnh nh sau: V d 1: #include <stdio.h>

Cc Kiu d liu Nng cao v Sp xp

263

struct strucintcal /* Defines the structure */ { char name[20]; int numb; float amt; }; void main() { struct strucintcal xyz; /* Declares a variable */ void intcal(struct strucintcal); clrscr(); /* Accepts data into the structure */ printf("\nEnter Customer name: "); gets(xyz.name); printf("\nEnter Customer number: "); scanf("%d", &xyz.numb); printf("\nEnter Principal amount: "); scanf("%f", &xyz.amt); intcal(xyz); /* Passes the structure to a function */ getch(); } void intcal(struct strucintcal abc) { float si, rate = 5.5, yrs = 2.5; /* Computes the interest */ si = (abc.amt * rate * yrs) / 100; printf ("\nThe customer name is %s", abc.name); printf("\nThe customer number is %d", abc.numb); printf("\nThe amount is %f", abc.amt); printf("\nThe interest is %f", si); return; } Kt qu ca chng trnh trn c minh ha nh sau: Mt kt xut mu ca chng trnh trn nh sau:

Enter Customer name: Jane Enter Customer number: 6001 Enter Principal Amount: 30000 The customer name is Jane The customer number is 6001 The amount is 30000.000000

264

Lp trnh c bn C

The interest is 4125.000000 C th nh ngha mt cu trc m khng c nhn. iu ny hu dng khi mt bin c khai bo cng lc vi nh ngha cu trc ca n. Nhn s khng cn thit trong trng hp ny. 19.1.7 Mng cc cu trc Mt trong nhng cch s dng thng thng ca cu trc l mng cu trc. khai bo mt mng cc cu trc, mt cu trc s c nh ngha trc, v sau mt bin mng c kiu s c khai bo. V d nh, khai bo mt mng cc cu trc c kiu cat, cu lnh s l: struct cat books[50]; Ging nh tt c cc bin, mng cc cu trc bt u ti ch s 0. Tn mng theo sau bi ch s nm trong du mc vung i din cho mt phn t ca mng Tn mng v ch s nm trong cp du ngoc vung theo sau tn mng i din cho mt phn t ca mng. Sau lnh khai bo trn, phn t ny l mt cu trc theo nh ngha ca n. V vy tt c cc qui tc dng truy xut n cc phn t ca cu trc u c p dng trn phn t mng nylut dng lin h n cc trng (hay cc phn t) ca cu trc u p dng c v sau. Sau khi mng cu trc books c khai bo, books[4].author s lin h n bin tng ng l thnh phn author ca phn t th t ca trong mng books.

Cc Kiu d liu Nng cao v Sp xp

265

19.1.8 Khi to cc mng cu trc Mt mng kiu bt k c khi to bng cch lit k danh sch gi tr ca cc phn t trong mt cp du mc. Lut ny cngvn ng thm ch khi cc phn t mng l cc cu trc. Mt khi to hiu qu l cha cc du mc lng nhauV mi phn t ca mng l mt cu trc, m gi tr khi to ca mt cu trc c t trong cp du mc, nn ta phi s dng cc cp du mc lng nhau khi khi to mng cc cu trc. Xt v d sau: struct unit { char ch; int i; };

struct unit series[3] = { {a, 100}, {b, 200}, {c, 300}, }; on lnh ny khai bo series l mt mng cu trc gm 3 phn t, mi phn t c kiu unit. Khi khi to, v mi phn t c khi to l mt cu trc nn gi tr ca n c t trong cp du mc., V v vy ton b danh schgi tr cc phn t c ng trong du mc cho bit ang khi to mt mng.

266

Lp trnh c bn C

19.1.9 Con tr n cu trc

C h tr con tr n cu trc, nhng c mt s kha cnh c bit i vi con tr cu trc. Ging nh cc kiu con tr khc, con tr cu trc c khai bo bng cch t du * trc tn ca bin cu trc. V d, cu lnh sau y khai bo con tr ptr_bk ca kiu cu trc cat. struct cat *ptr_bk; By gi gn a ch ca bin cu trc books kiu cat cho ptr_bk, cu lnh s nh sau: ptr_bk = &books; Ton t -> c dng truy cp von phn t ca mt cu trc s dng mt con tr cu trc. Ton t ny l mt t hp ca du tr (-) v du ln hn (>) v n c bit n nh mt ton t t hp. V d nh, trng author c th c truy cp theo mt trong cc cch sau y: ptr_bk->author hoc books.author hoc (*ptr_bk).author Trong biu thc cui cng, du ngoc l bt buc v ton t chm (.) c u tin cao hn ton t v hng (*). Khng c du ngoc, trnh bin dch s sinh ra mt li, v ptr_bk (mt con tr) th khng tng thch trc tip vi ton t chmv ton t chm khng c p dng trn bin con tr ptr_bk. Cng nh tt c cc khai bo con tr khc, vic khai bo mt con tr ch cp pht khng gian cho con tr m khng cp pht cho ni m n tr n. V vy, khi mt con tr cu trc c khai bo, khng gian c cp pht l dnh cho a ch ca cu trc ch khng phi l bn thn cu trc. 19.1.10 Truyn con tr cu trc nh l cc i tham s C th s dng cc con tr cu trc nh l i stham s ca hm. Ti thi im gi hm, mt con tr cu trc hoc a ch tng minh ca mt bin cu trc c truyn vo hm. iu ny cho php mt hm c th sa i cc phn t ca cu trc mt cch trc tip. 19.2 T kha typedef

Formatted

Mt kiu d liu mi c th c nh ngha bng cch s dng t kha typedef. T kha ny khng to ra mt kiu d liu mi, m nh ngha mt tn mi cho mt kiu c. C php tng qut ca cu lnh typedef l: typedef type name; trong type l mt kiu d liu cho php bt k v name l mt tn mi cho kiu d liu ny. Tn mi c nh ngha, l mt tn thm vo, ch khng phi l tn thay th, cho kiu d liu c. V d nh, mt tn mi cho float c th c nh ngha theo cch sau: typedef float deci;

Cc Kiu d liu Nng cao v Sp xp

267

Cu lnh ny s bo cho trnh bin dch bit nhn dng deci l mt tn khc ca float. Mt bin float c th c nh ngha s dng deci nh sau: deci amt; y, amt l mt bin s thc kiu deci, chnh l mt tn khc ca float. Sau khi c nh ngha, deci c th c s dng nh mt kiu d liu trong cu lnh typedef gn mt tn khc cho kiu float. Chng hn, typedef deci point; Cu lnh trn bo cho trnh bin dch bit nhn dng point nh l mt tn khc ca deci, cng chnh l mt tn khc ca float. c tnh typedef c bit tin li khi nh ngha cc cu trc, v ta khng cn nhc li nhn struct mi khi mt s dng cu trc. V vy, cu trc c th c lin h mt cch chnh xc hnKhi vic s dng cu trc s thun tin hn. Thm vo , tn cho mt kiu cu trc do ngi dng nh ngha thng gi nh n mc ch ca cu trc trong chng trnh. Mt cch tng qut, mt cu trc do ngi dng nh ngha c th c vit nh sau: typedef struct new_type { type var1; type var2; } y, new_type l kiu cu trc do ngi dng nh ngha v n khng phi l mt bin cu trc. By gi, cc bin kiu cu trc c th c nh ngha theo kiu d liu mi. Mt v d nh sau:V d: typedef { int int int } date; struct day; month; year;

date due_date; y, date l mt kiu d liu mi v due_date l mt bin kiu date. Cn nh rng typedef khng th s dng vi storage classes. 19.3 Sp xp mng (Sorting Arrays)

Sp xp c ngha l xp mng d liu theo mt th t xc nh nh tng dn hay gim dn. D liu trong mt mng s d dng tm c nu mng c sp xpKhi mng c sp xp, vic tm kim trn mng tr nn d dng hn. C mt s phng php sp xp mng. Chng ta s xem xt hai phng php sau y: Bubble Sort Insertion Sort Cc phng php c trnh by sau y p dng i vi mng sp xp theo th t tng dn 19.3.1 Bubble Sort

268

Lp trnh c bn C

Tn Bn thn tn ca qu trnh sp xp ny m t cch thc n lm vic. y, vic so snh bt u t phn t di cng v phn t c gi tr nh hn s ni bt dn ln trn nh. Qu trnh sp xp mt mng 5-phn t theo th t tng dn c cho nh sau: So snh gi tr trong phn t th 5 vi gi tr trong phn t th 4. Nu gi tr trong phn t th 5 nh hn gi tr trong phn t th 4, th gi tr trong hai phn t s c hontrao i. K tip, so snh gi tr trong phn t th 4 vi gi tr trong phn t th 3, v theo cch tng t, cc gi tr s c traohon i nu gi tr trong phn t disau l nh hn gi tr ca phn t trcn. So snh gi tr trong phn t th 3 vi gi tr trong phn t th 2, v qu trnh so snh v traohon i ny c th tip tc. Sau mt lt, gi tr nh nht s c dit vo n phn t u tin. Mt cch nm na, c th pht biu rng gi tr nh nht ni ln. Trong lt k tip, vic so snh li bt u vi phn t thp nhtcui cng, v so snh dn ln n phn t th 2. V phn t th nht cha phn tgi tr nh nht, khng cn thit phi so snh n na. Vi cch nh vy, cui qu trnh sp xp, cc phn t nh hn s ni bt dn ln nhtrn, trong khi cc gi tr ln hn s chm xung. Hnh 19.2 minh ha cho phng php buble sort.
23 90 9 25 16 23 90 9 16 25 23 90 9 16 25 23 9 90 16 25 9 23 90 16 25

9 23 90 16 25

9 23 90 16 25

9 23 16 90 25

9 16 23 90 25

9 16 23 90 25

9 16 23 25 90

9 16 23 25 90

9 16 23 25 90

9 16 23 25 90

Cc Kiu d liu Nng cao v Sp xp

269

9 16 23 25 90

Figure 19.2: Bubble Sort Chng trnh thc hin sp xp mng theo phng php bubble sort c cho nh sau: V d 2: #include <stdio.h> void main() { int i, j, temp, arr_num[5] = { 23, 90, 9, 25, 16}; clrscr(); for(i = 3; i >= 0; i--) /* Tracks every pass */ for(j = 4; j >= 4 - i; j--) /* Compares elements */ { if(arr_num[j] < arr_num[j - 1]) { temp = arr_num[j]; arr_num[j] = arr_num[j - 1]; arr_num[j - 1] = temp; } } printf("\nThe sorted array"); for(i = 0; i < 5; i++) printf("\n%d", arr_num[i]); getch(); }
Formatted

270

Lp trnh c bn C

19.3.2 Insertion Sort Trong phng php Insertion sort, mi phn t trong mng c xem xt,ta xt mi phn t ca mng v t vo v tr ng ca n gia cc phn t c sp xp. Khi phn t cui cng c t vo v tr ng ca n, th mng c sp xp. V d, xt mt mng c 5 phn t, Gi tr trong phn t th nht c xem nh l ng th t. So snh gi tr trong phn t th hai vi phn mng sp xp, m hin ti ch c phn t th nht. Nu gi tr trong phn t th hai nh hn, n c xen trc phn t th nht. By gi, hai phn t u tin to thnh phn danh sch sp xp v phn cn li to thnhl danh sch cha sp xp. Phn t k tip trong danh sch cha sp xp, phn t th 3, c so snh vi danh sch sp xp. Nu gi tr trong phn t th 3 nh hn phn t th 1, gi tr trong phn t th 3 c xen trc phn t th 1. Ngc li, nu gi tr trong phn t th 3 nh hn phn t th 2, gi tr trong phn t th 3 c xen trc phn t th 2. By gi, phn sp xp ca mng chagm 3 phn t, trong khi phn cha sp xp chagm 2 phn t cn li. Qu trnh so snh cc phn t trong danh sch cha sp xp vi cc phn t trong danh sch sp xp tip tc cho n khi phn t cui cng trong mng c so snh v t vo v tr ng ca n. cui qu trnh sp xp, mi phn t c xen vo ng v tr ca n. Hnh 19.3 minh ha cch lm vic ca insertion sort.
23 90 9 25 16 23 90 9 25 16 9 23 90 25 16 9 23 25 90 23 90 9 25 16 9 23 90 25 16 9 23 90 25 16 9 23 25 90 9 23 90 25 16 9 16 23 25 9 23 25 90 16
Formatted

Formatted

Cc Kiu d liu Nng cao v Sp xp

271

16

16

90

Figure 19.3: Insertion Sort Chng trnh thc hin sp xp mng theo phng php insertion sort c cho nh sau: V d 3:
Formatted

#include<stdio.h> void main() { int i, j, arr[5] = { 23, 90, 9, 25, 16 }; char flag; clrscr(); /*Loop to compare each element of the unsorted part of the array*/ for(i = 1; i < 5; i++) /*Loop for each element in the sorted part of the array*/ for(j = 0, flag = 'n'; j < i && flag == 'n'; j++) { if(arr[j] > arr[i]) { /*Invoke the function to insert the number*/ insertnum(arr, i, j); flag = 'y'; } } printf("\n\nThe sorted array\n"); for(i = 0; i < 5; i++) printf("%d\t", arr[i]); getch(); }

insertnum(int arrnum[], int x, int y) { int temp; /*Store the number to be inserted*/ temp = arrnum[x]; /*Loop to push the sorted part of the array down from the position where the number has to inserted*/ for(; x > y; x--) arrnum[x] = arrnum[x - 1]; /*Insert the number*/ arrnum[x] = temp;

272

Lp trnh c bn C

Cc Kiu d liu Nng cao v Sp xp

273

Tm tt Mt cu trc l mt nhm cc bin c kiu d liu khc nhau c gom li di cng mt tn.Mt cu trc l tp cc bin c th c kiu d liu khc nhau c nhm li vi nhau di cng mt tn. Mt nh ngha cu trc to thnh mt khun mu, khun mu ny c th c s dng to ra cc bin cu trc.Vic nh ngha cu trc s to ra kiu d liu mi cho php ngi dng s dng chng khai bo cc bin kiu cu trc Cc phn t c lp ca cu trc c tham chiu ntruy cp bng cch s dng ton t chm (.), hay cn c gi l ton t thnh vin. Cc gi tr ca mt bin cu trc c th c gn cho mt bin khc c cng kiu bng cch s dng cu lnh gn n gin. C th c mt cu trc nm trong mt cu trc khc. Tuy nhin mt cu trc khng th lng trong chnh n. Mt bin cu trc c th c truyn vo mt hm nh l mt itham s. Cch ci ts dng thng dng nht ca cu trc l di hnh thc cc mng cu trc. Ton t -> c s dng truy cp vo cc phn t ca mt cu trc thng qua mt con tr tr n cu trc . Mt kiu d liu mi c th c nh ngha bng t kha typedef. Hai k thutphng php dng sp xp mt mng l bubble sort v insertion sort. Trong bubble sort, gi tr ca cc phn t c so snh vi gi tr ca phn t k tip. Trong phng php ny, cc phn t nh hn ni ln dn, v cui cng mng s c sp xp. Trong insertion sort, ta xt mi phn t trong mng s c xem xt, v chn vo v tr ng ca n gia cc phn t c sp xp.

Formatted

274

Lp trnh c bn C

Kim tra tin hc tp 1. Mt __________ nhm mt s mcu d liu li vi nhau, cc mcu d liu ny khng cnnht thit phi c cng kiu.
2. 3.

Cc phn t ca cu trc c tham chiutruy cp n thng qua vic s dng _________. Cc gi tr ca mt bin cu trc c th c gn cho mt bin khc c cng kiu bng cch s dng cu lnh gn n gin. (ng / Sai) Khng th c mt cu trc nm trong mt cu trc khc. Mt kiu d liu mi c th c nh ngha s dng t kha _________. (ng / Sai)

4. 5.

6. Trong bubble sort, cc phn t ______________ c so snh.


7.

Trong insertion sort, nu mt phn t cha c sp xp phi c t vo mt v tr c sp xp no , th cc gi tr ny s c trao i vi nhau. (ng / Sai)

Cc Kiu d liu Nng cao v Sp xp

275

Bi tp t lm 1. Vit mt chng trnh C ci t mt h thng qun l kho. Hy lu tr m s, tn hng, gi c v s lng ang c ca mi mn hng trong mt cu trc. Nhp chi tit ca 5 mn hng vo mt mng cc cu trc v hin th tn tng mn hng v tng gi tr ca n. cui chng trnh , hy hin th tng gi tr ca kho hng. 2. Vit mt chng trnh C lu tr cc tn v im s ca 5 sinh vin trong mt mng cu trc. Hy sp xp mng cu trc theo th t im s gim dn. Hin th 3 im s cao nht.

276

Lp trnh c bn C

Bi 20
Mc tiu: Kt thc bi hc ny, bn c th: S dng cu trc v cc mng cu trc Truyn tham s cu trc vo hm Sp xp mng.

Cc kiu d liu nng cao v Sp xp

Cc bc trong bi ny c gii thch chi tit, y . Mc ch l nm c nhng ni dung trong bi l thuyt v s dng thnh tho c cng c. Hy lm theo cc bc di y mt cch cn thn.Cc bc c cho trong bi ny c gii thch cn k, d hiu v t duy cn thn t u n cui. Bi c vit p ng c mc tiu hc v c th hiu hon ton v cng c. Xin hy thc hin theo cc bc mt cch cn thn. Phn I Trong thi gian 1 gi 3901 gi 30 pht u: 20.1 Cu trc Mt cu trc l mt nhm cc mcu d liu c th c kiu khc nhau. Mi cu trc phi c nh ngha trc khi n c s dng trong khai bo bin. Mt nh ngha cu trc c th bao gm mt thnh phn l mt cu trc khc. Vic Kkhi to cu trc tng t nh vic khi to mng.

20.1.1 Cc mng cu trc v sp xp Trong C, c th to mng cu trc. Cng nh vi mng, d liu trong cc mng cu trc c th c sp xp s dngtheo hai phng php Selection sort v Bubble sort. Chng ta hy vit mt chng trnh C ci t mt h thng qun l th vin c bn. H thng duy tr lu tr mt danh schmc sch v mt b phn ghi nhn cc giao dch mn v tr sch. S dng h thng ny, ta c th thm vo thng tin chi tit ca mt sch, ghi nhn cc giao dch mn/tr sch v sp xp cc ghi nhn ny. Cc bc to h thng c lit k nh sau: 1. nh ngha mt cu trc lu tr chi tit sch. Cu lnh s l: struct book_st{ int book_cd; char book_nm[30]; char author[30]; int copies; }; 2. nh ngha mt cu trc lu tr cc giao dchghi nhn mn/tr sch. Lu rng ngy mn/tr cng s l mt cu trc, v cng phi c nh ngha. Cu lnh s l: struct date_st { int month; int day; int year;}; struct tran_st { int book_code;

Cc Kiu d liu Nng cao v Sp xp

277

char tran_type; struct date_st tran_dt; }; 3. Khai bo cc bin c hai kiu cu trc trn. thc hnh, ta gi s rng cn lu tr chi tit ca 5 quyn sch v 10 giao dch. Cu lnh s l: struct book_st books[5]; struct tran_st trans[10]; 4. tVit mt vng lp hin th danh mc menu cc thao tc m chng trnh c th thc hin.. Cu lnh s l: while(choice != 4) { clrscr(); printf("\nSelect from Menu\n1. Add book names\n2. Record Issue/Return\n3. Sort Transactions\n4. Exit\n\nEnter choice: "); scanf("%d", &choice); . . . } 5. Nu thao tc c chn l thm chi tit sch, th nhp cc thng tin chi tit ca sch trong mt vng lp. Cu lnh s l: for(i = 0; i < 5 && addflag == 'y'; i++) { books[i].book_cd = i + 1; printf("\n\nBook code: %d\n\nBook name: ", i + 1); scanf("%s", books[i].book_nm); printf("\nAuthor: "); scanf("%s", books[i].author); printf("\nNumber of copies: "); scanf("%d", &books[i].copies); printf("\n\nContinue? (y/n): "); scanf(" %c", &addflag); } 6. Nu thao tc c chn l thm cc giao dch, t mt vng lp nhp cc thng tin chi tit ca giao dch. Cu lnh s l: for(i = 0; i < 10 && addflag == 'y'; i++) { printf("\n\nBook code: "); scanf("%d", &trans[i].book_code); printf("\nIssue or Return?(I/R): "); scanf(" %c", &trans[i].tran_type); printf("\nDate: "); scanf("%d %d %d", &trans[i].tran_dt.month,&trans[i].tran_dt.day, &trans[i].tran_dt.year); printf("\n\nContinue? (y/n): "); scanf("%c", &addflag); }

278

Lp trnh c bn C

7. Nu thao tc c chn l sp xp cc giao dch, th truyn tham s mng cu trc vo hm. Hm s sp xp mng theo m sch s dng phng php buble sort. Cu lnh s l: for(i = 0; i < 10; i++) for(j = i + 1; j < 10; j++) { if(tran[i].book_code > tran[j].book_code) { temptran=tran[i]; tran[i]=tran[j]; tran[j]=temptran; } } 8. Hin th s giao dch cho mi quyn sach trong hm sp xp. Cu lnh s l: for(i = 0, j = 0; i < 10; j = 0) { tempcode = tran[i].book_code; while(tran[i].book_code == tempcode && i < 10) { j++; i++; } printf("\nBook code %d had %d transactions", tempcode, j); } Chng ta hy nhn vo chng trnh hon chnh.Tin hnh thc hin cc bc sau y c chng trnh hon chnh 1. M chng trnh son tho m bn dng g chng trnh C. 2. To mt tp tin mi 3. G vo cc dng lnh sau y: #include<stdio.h> struct book_st { int book_cd; char book_nm[30]; char author[30]; int copies; }; struct date_st { int month; int day; int year; }; struct tran_st { int book_code; char tran_type; struct date_st tran_dt; }; void main() { int choice = 1, i; char addflag;

Cc Kiu d liu Nng cao v Sp xp

279

struct book_st books[5]; struct tran_st trans[10]; while(choice != 4) { clrscr(); printf("\nSelect from Menu\n1. Add book names\n2. Record Issue/Return\n3. Sort Transactions\n4. Exit\n\nEnter choice: "); scanf("%d", &choice); if(choice == 1) { addflag = 'y'; clrscr(); for(i = 0; i < 5 && addflag == 'y'; i++) { books[i].book_cd = i + 1; printf("\n\nBook code: %d\n\nBook name:", i+1); scanf("%s", books[i].book_nm); printf("\nAuthor: "); scanf("%s", books[i].author); printf("\nNumber of copies: "); scanf("%d", &books[i].copies); printf("\n\nContinue? (y/n): "); scanf(" %c", &addflag); } } else if(choice == 2) { addflag = 'y'; clrscr(); for(i = 0; i < 10 && addflag == 'y'; i++) { printf("\n\nBook code: "); scanf("%d", &trans[i].book_code); printf("\nIssue or Return?(I/R): "); scanf(" %c", &trans[i].tran_type); printf("\nDate: "); scanf("%d %d %d", &trans[i].tran_dt.month, &trans[i].tran_dt.day, &trans[i].tran_dt.year); printf("\n\nContinue? (y/n): "); scanf(" %c", &addflag); } } else if(choice == 3) { sorttran(trans); } } } sorttran(struct tran_st tran[10]) { int i, j, tempcode;
280 Lp trnh c bn C

struct tran_st temptran; clrscr(); for(i = 0; i < 10; i++) for(j = i + 1; j < 10; j++) { if(tran[i].book_code > tran[j].book_code) { temptran = tran[i]; tran[i] = tran[j]; tran[j] = temptran; } } for(i = 0, j = 0; i < 10; j = 0) { tempcode = tran[i].book_code; while(tran[i].book_code == tempcode && i < 10) { j++; i++; } printf("\nBook code %d had %d transactions", tempcode, j); } getch(); } xem kt qu, thc hin cc bc sau y: 4. Lu tp tin vi tn structI.C. 5. Bin dch tp tin, structI.C. 6. Thc thi chng trnh, structI.C. 7. Tr v chng trnh son tho. Mu kt qu ca chng trnh nh sau: Select from Menu 1. Add book names 2. Record Issue/Return 3. Sort Transactions 4. Exit Enter choice: Nu nhp vo 1, mu kt xut ca chng trnh s l: Book code: 1 Book name: Detective Author: Hailey Number of copies: 3 Continue? (y/n): y

Cc Kiu d liu Nng cao v Sp xp

281

Nu nhp vo 2, mu kt xut ca chng trnh s l: Book code: 1 Issue or Return? (I/R): I Date: 2 22 03 Continue? (y/n): y Nu nhp vo 3, mu kt xut ca chng trnh s l: Book code 1 had 3 transactions Book code 2 had 1 transactions Book code 3 had 2 transactions Book code 4 had 0 transactions Book code 5 had 4 transactions

282

Lp trnh c bn C

Phn II Trong thi gian 30 pht k tip: 1. Vit mt chng trnh C lu tr d liu cc thng tinh v sinh vin trong mt cu trc. D liu phi bao gm m sinh vin, tn sinh vin, kha hc ng k v nm ng k. Vit mt hm hin th cc thng tin chi tit ca cc sinh vin nhp hc trong mt nm hc no . Vit mt hm khc nh vxc nh v hin th thng tin chi tit ca mt sinh vin da vo mt m sinh vin chokhi bit m ca sinh vin . lm iu ny: Yu cu: a. nh ngha mt cu trc lu tr thng tin chi tit ca sinh vin. b. Khai bo v khi to bin cu trc vi thng tin chi tit ca 10 sinh vin. c. t mtVit vng lp hin th mt danh mc chomenu cc thao tc m chng trnh c th thc hin. d. Nhn vo la chn danh mc v gi hm thch hp vi tham s l mng cu trc. e. Trong hm dng hin th thng tin chi tit ca cc sinh vin nhp hc trong cho mt nm, cho nhp vo nm. t mt vng lp kim tra nm nhp hc ca mi sinh vin, v hin th nu n trng. cui hm, cho php ngi dng nhp vo mt nm hc khc vit chng trnh thc hin nhp vo nm hc cn c hin th thng tin, sau s dng vng lp kim tra nm nhp hc ca tng sinh vin, nu trng vi nm cn hin th thng tin yu cu th hin th thng tin ca sinh vin . Ngoi ra, hm ny cn cho php ngi dng c th tip tc thc hin vic hin th thng tin ca nhng nm khc cho n khi h khng mun s dng chc nng ny na. f. Trong hHm dng nh v hin th thng tin chi tit ca sinh vin, cho php nhp vo m ca sinh vin,. tdng mt vng lp kim tra m ca mi sinh vin, v hin th nu n trngnu m ca sinh vin no trng vi m c nhp th hin th thng tin chi tit ca sinh vin . cui hm, cho php ngi dng nhp vo mt m sinh vin khc.. Ngoi ra, hm ny cn cho php ngi dng c th tip tc thc hin vic hin th thng tin ca nhng sinh vin khc cho n khi h khng mun s dng chc nng ny na

Cc Kiu d liu Nng cao v Sp xp

283

Bi tp t lm 1. Vit mt chng trnh C lu tr 5 di trong mt mng cu trc. Cc Mi di phi lu dngbao gm 3 thng tin v yards, feet v inches. Sp xp v hin th cc di. 2. Vit mt chng trnh C lu tr thng tin chi tit ca nhn vin trong mt mng cu trc. D liuThng tin ca mt nhn vin phi bao gm m nhn vin, tn, lng v ngy vo lm. Ngy vo lm phi c lu trong mt cu trc khc. Chng trnh phi thc hin cc thao tc sau y da trn s la chn trong mt danh mcmenu cc chc nng ca chng trnh: a. Tng lng theo cc lut sau: Salary Range Percentage increase <= 2000 15% > 2000 and <= 5000 10% >5000 No increase b. Hin th thng tin chi tit ca cc nhn vin lm vic trong cng ty t 10 nm tr ln.

284

Lp trnh c bn C

Bi 21
Mc tiu: Kt thc bi hc ny, bn c th: Gii thch khi nim lung (streams) v tp tin (files) Tho lun cc lung vn bn v cc lung nh phn Gii thch cc hm x l tp tin Gii thch con tr tp tin Tho lun con tr kch hot hin hnh Gii thch cc i s t dng nhc lnh (command-line). Gii thiu

Qun l tp tin

Hu ht cc chng trnh u yu cu c v ghi d liu vo cc h thng lu tr trn a. Cc chng trnh x l vn bn cn lu cc tp tin vn bn, chng trnh x l bng tnh cn lu ni dung ca cc , chng trnh c s d liu cn lu cc mu tin. Bi ny s khm ph cc tin ch trong C dnh cho cc thao tc nhp/xut (I/O) a h thng. Ngn ng C khng cha bt k cu lnh nhp/xut no mt cch tng minh. Tt c cc thao tc nhp/xut u thc hin thng qua cc hm th vin chun ca C. Tip cn ny lm cho h thng qun l tp tin ca C rt mnh v uyn chuyn. Nhp/xut trong C l tuyt vi v d liu c th truyn dng nh phn hay dng vn bn m con ngi c th c c. iu ny lm cho vic to tp tin p ng mi nhu cu mt cch d dng. Vic hiu r s khc bit gia stream v tp tin l rt quan trng. H thng nhp/xut ca C cung cp cho ngi dng mt giao din c lp vi thit b tht s ang truy cp. Giao din ny khng phi l mt tp tin tht s m l mt s biu din tru tng ca thit b. Giao din tru tng ny c gi l mt stream v thit b tht s c gi l tp tin. 21.1 File Streams

H thng tp tin ca C lm vic c vi rt nhiu thit b khc nhau bao gm my in, a, bng t v cc thit b u cui. Mc d tt c cc thit b u khc nhau, nhng h thng tp tin c vng m s chuyn mi thit b v mt thit b logic gi l mt stream. V mi streams hot ng tng t, nn vic qun l cc thit b l rt d dng. C hai loi streams vn bn (text) v nh phn (binary). 21.1.1 Streams vn bn

Mt streams vn bn l mt chui cc k t. Cc streams vn bn c th c t chc thnh cc dng, mi dng kt thc bng mt k t sang dng mi. Tuy nhin, k t sang dng mi l ty chn trong dng cui v c quyt nh khi ci t. Hu ht cc trnh bin dch C khng kt thc stream vn bn vi k t sang dng mi. Trong mt stream vn bn, c th xy ra mt vi s chuyn i k t khi mi trng yu cu. Chng hn nh, k t sang dng mi c th c chuyn thnh mt cp k t v u dng/nhy n dng k. V vy, mi quan h gia cc k t c ghi (hay c) v nhng k t thit b ngoi vi c th khng phi l mi quan h mt-mt. V cng v s chuyn i c th xy ra ny, s lng k t c ghi (hay c) c th khng ging nh s lng k t nhn thy thit b ngoi vi.

Qun l tp tin

285

21.1.2

Streams nh phn

Mt streams nh phn l mt chui cc byte vi s tng ng mt-mt vi thit b ngoi vi, ngha l, khng c s chuyn i k t. Cng v vy, s lng byte c (hay ghi) cng s ging nh s lng byte thit b ngoi vi. Cc stream nh phn l cc chui byte thun ty, m khng c bt k k hiu no c dng ch ra im kt thc ca tp tin hay kt thc ca record. Kt thc ca tp tin c xc nh bng ln ca tp tin. 21.2 Cc hm v tp tin v structure FILE

Mt tp tin c th tham chiu n bt c ci g: t mt tp tin trn a n mt thit b u cui hay mt my in. Tuy nhin, tt c cc tp tin u khng c cng kh nng. V d nh, mt tp tin trn a c th h tr truy cp ngu nhin trong khi mt bn phm th khng. Mt tp tin s kt hp vi mt stream bng cch thc hin thao tc m. Tng t, n s thi kt hp vi mt stream bng thao tc ng. Khi mt chng trnh kt thc bnh thng, tt c cc tp tin u t ng ng. Tuy nhin, khi mt chng trnh b treo hoc kt thc bt thng, cc tp tin vn cn m. 21.2.1 Cc hm c bn v tp tin

Mt h thng qun l tp tin theo chun ANSI bao gm mt s hm lin quan vi nhau. Cc hm thng dng nht c lit k trong bng 21.1. Name fopen() fclose() fputc() fgetc() fread() fwrite() fseek() fprintf() fscanf() feof() ferror() rewind() remove() fflush() Function M mt tp tin ng mt tp tin Ghi mt k t vo mt tp tin c mt k t t mt tp tin c t mt tp tin vo mt vng m Ghi t mt vng m vo tp tin Tm mt v tr no trong tp tin Hot ng ging nh printf(), nhng trn mt tp tin Hot ng ging nh scanf(), nhng trn mt tp tin Tr v true nu n cui tp tin (end-of-file) Tr v true nu xy ra mt li t li con tr nh v tr (position locator) bn trong tp tin v u tp tin Xa mt tp tin Ghi d liu t mt vng m bn trong vo mt tp tin xc nh Bng 21.1: Cc hm c bn v tp tin Cc hm trn cha trong tp tin header stdio.h. Tp tin header ny phi c bao gm vo chng trnh c s dng cc hm ny. Hu ht cc hm ny tng t nh cc hm nhp/xut t thit b nhp xut chun. Tp tin header stdio.h cn nh ngha mt s macro s dng trong qu trnh x l tp tin. V d nh, macro EOF c nh ngha l -1, cha gi tr tr v khi mt hm c c tip khi n cui tp tin.

21.2.2

Con tr tp tin

Mt con tr tp tin (file pointer) rt cn thit cho vic c v ghi cc tp tin. N l mt con tr n mt structure cha thng tin v tp tin. Thng tin bao gm: tn tp tin, v tr hin ti ca tp tin, tp tin ang c c hay ghi, c bt k li no xut hin hay n cui tp tin. Ngi dng khng cn thit phi bit chi tit, v cc nh ngha ly t studio.h c bao gm mt khai bo structure tn l FILE. Cu lnh khai bo duy nht cn thit cho mt con tr tp tin l:
286 Lp trnh c bn C

FILE *fp; Khai bo ny cho bit fp l mt con tr tr n mt FILE. 21.3 Cc tp tin vn bn

C nhiu hm khc nhau qun l tp tin vn bn. Chng ta s tho lun trong cc on bn di: 21.3.1 M mt tp tin vn bn Hm fopen() m mt stream s dng v lin kt mt tp tin vi stream . Con tr kt hp vi tp tin c tr v t hm fopen(). Trong hu ht cc trng hp, tp tin ang m l mt tp tin trn a. Nguyn mu ca hm fopen() l: FILE *fopen(const char *filename, const char *mode);

trong filename l mt con tr tr n chui k t cha mt tn tp tin hp l v cng c th cha c phn m t ng dn. Chui c tr n bi con tr mode xc nh cch thc tp tin c m. Bng 21.2 lit k cc ch hp l m mt tp tin c th m. Ch r w a r+ w+ a+f ngha M mt tp tin vn bn c To mt tp tin vn bn ghi Ni vo mt tp tin vn bn M mt tp tin vn bn c/ghi To mt tp tin vn bn c/ghi Ni hoc to mt tp tin vn bn c/ghi

Bng 21.2: Cc ch m tp tin vn bn. Bng 21.2 cho thy cc tp tin c th c m nhiu ch khc nhau. Mt con tr null c tr v nu xy ra li khi hm fopen() m tp tin. Lu rng cc chui nh a+f c th c biu din nh af+. Nu phi m mt tp tin xyz ghi, cu lnh s l: FILE *fp; fp = fopen ("xyz", "w"); Tuy nhin, mt tp tin ni chung c m bng cch s dng mt tp hp cc cu lnh tng t nh sau: FILE *fp; if ((fp = fopen ("xyz", "w")) == NULL) { printf("Cannot open file"); exit (1); } Macro NULL c nh ngha trong stdio.h l \0. Nu s dng phng php trn m mt tp tin, th hm fopen() s pht hin ra li nu c, chng hn nh a ang ch cm ghi (write-protected) hay a y, trc khi bt u ghi a.

Qun l tp tin

287

Nu mt tp tin c m ghi, bt k mt tp tin no c cng tn v ang m s b vit chng ln. V khi mt tp tin c m ch ghi, th mt tp tin mi c to ra. Nu mun ni thm cc mu tin vo tp tin c, th n phi c m vi ch a. Nu mt tp tin c m ch c v n khng tn ti, hm s tr v li. Nu mt tp tin c m c/ghi, n s khng b xa nu tn ti. Tuy nhin, nu n khng tn ti, th n s c to ra. Theo chun ANSI, tm tp tin c th c m ti mt thi im. Tuy vy, hu ht cc trnh bin dch C v mi trng u cho php m nhiu hn tm tp tin. 21.3.2 ng mt tp tin vn bn

V s lng tp tin c th m ti mt thi im b gii hn, vic ng mt tp tin khi khng cn s dng l mt iu quan trng. Thao tc ny s gii phng ti nguyn v lm gim nguy c vt qu gii hn nh. ng mt stream cng s lm sch v chp vng m kt hp ca n ra ngoi (mt thao tc quan trng trnh mt d liu) khi ghi ra a. Hm fclose() ng mt stream c m bng hm fopen(). N ghi bt k d liu no cn li trong vng m ca a vo tp tin. Nguyn mu ca hm fclose() l: int fclose(FILE *fp);

trong fp l mt con tr tp tin. Hm fclose() tr v 0 nu ng thnh cng. Bt k gi tr tr v no khc 0 u cho thy c li xy ra. Hm fclose() s tht bi nu a sm c g ra khi a hoc a b y. Mt hm khc dng ng stream l hm fcloseall(). Hm ny hu dng khi phi ng cng mt lc nhiu stream ang m. N s ng tt c cc stream v tr v s stream ng hoc EOF nu c pht hin li. N c th c s dng theo cch nh sau: fcl = fcloseall(); if (fcl == EOF) printf("Error closing files"); else printf("%d file(s) closed", fcl);

21.3.3 Ghi mt k t Streams c th c ghi vo tp tin theo tng k t mt hoc theo tng chui. Trc ht chng ta hy tho lun v cch ghi cc k t vo tp tin. Hm fputc() c s dng ghi cc k t vo tp tin c m trc bng hm fopen(). Nguyn mu ca hm ny nh sau: int fputc(int ch, FILE *fp); trong fp l mt con tr tp tin tr v bi hm fopen() v ch l k t cn ghi. Mc d ch c khai bo l kiu int, nhng n c hm fputc() chuyn i thnh kiu unsigned char. Hm fputc() ghi mt k t vo stream nh ti v tr hin hnh ca con tr nh v tr bn trong tp tin v sau tng con tr ny ln. Nu fputc() thnh cng, n tr v k t ghi, ngc li n tr v EOF. 21.3.4 c mt k t

Hm fgetc() c dng c cc k t t mt tp tin c m ch c, s dng hm fopen(). Nguyn mu ca hm l: int fgetc (FILE *fp); trong fp l mt con tr tp tin kiu FILE tr v bi hm fopen(). Hm fgetc() tr v k t k tip ca v tr hin hnh trong stream input, v tng con tr nh v tr bn trong tp tin ln. K t c c
288 Lp trnh c bn C

l mt k t kiu unsigned char v c chuyn thnh kiu int. Nu n cui tp tin, fgetc() tr v EOF. c mt tp tin vn bn t u cho n cui, cu lnh s l: do { } ch = fgetc(fp); while (ch != EOF);

Chng trnh sau y nhn cc k t t bn phm v ghi chng vo mt tp tin cho n khi ngi dng nhp k t @. Sau khi ngi dng nhp thng tin vo, chng trnh s hin th ni dung ra mn hnh. V d 1: #include <stdio.h> main() { FILE *fp; char ch= ' '; /* Writing to file JAK */ if ((fp=fopen("jak", "w"))==NULL) { printf("Cannot open file \n\n"); exit(1); } clrscr(); printf("Enter characters (type @ to terminate): \n"); ch = getche(); while (ch !='@') { fputc(ch, fp) ; ch = getche(); } fclose(fp); /* Reading from file JAK */ printf("\n\nDisplaying contents of file JAK\n\n"); if((fp=fopen("jak", "r"))==NULL) { printf("Cannot open file\n\n"); exit(1); } do { ch = fgetc (fp); putchar(ch) ; while (ch!=EOF);

getch(); fclose(fp); }

Qun l tp tin

289

Mt mu chy cho chng trnh trn l: Enter Characters (type @ to terminate): This is the first input to the File JAK@ Displaying Contents of File JAK This is the first input to the File JAK 21.3.5 Nhp xut chui Ngoi fgetc() v fputc(), C cn h tr cc hm fputs() v fgets() ghi vo v c ra cc chui k t t tp tin trn a. Nguyn mu cho hai hm ny nh sau: int fputs(const char *str, FILE *fp); char *fgets(char *str, int length, FILE *fp); Hm fputs() lm vic ging nh hm fputc(), ngoi tr l n vit ton b chui vo stream. N tr v EOF nu xy ra li. Hm fgets() c mt chui t stream cho cho n khi c c mt k t sang dng mi hoc sau khi c c length-1 k t. Nu c c mt k t sang dng mi, k t ny c xem nh l mt phn ca chui (khng ging nh hm gets()). Chui kt qu s kt thc bng k t null. Hm tr v mt con tr tr n chui nu thnh cng v null nu xy ra li. 21.4 Cc tp tin nh phn

Cc hm dng x l cc tp tin nh phn cng ging nh cc hm s dng qun l tp tin vn bn. Tuy nhin, ch m tp tin ca hm fopen() th khc i trong trng hp cc tp tin nh phn. 21.4.1 M mt tp tin nh phn Bng sau y lit k cc ch khc nhau ca hm fopen() trong trng hp m tp tin nh phn. Ch rb wb ab r+b w+b a+b ngha M mt tp tin nh phn c To mt tp tin nh phn ghi Ni vo mt tp tin nh phn M mt tp tin nh phn c/ghi To mt tp tin nh phn c/ghi Ni vo mt tp tin nh phn c/ghi

Bng 21.3: Cc ch m tp tin nh phn. Nu mt tp tin xyz c m ghi, cu lnh s l: FILE *fp; fp = fopen ("xyz", "wb"); 21.4.2 ng mt tp tin nh phn

290

Lp trnh c bn C

Ngoi tp tin vn bn, hm fclose() cng c th c dng ng mt tp tin nh phn. Nguyn mu ca fclose nh sau: int fclose(FILE *fp); trong fp l mt con tr tp tin tr n mt tp tin ang m. 21.4.3 Ghi mt tp tin nh phn Mt s ng dng lin quan n vic s dng cc tp tin d liu lu tr cc khi d liu, trong mi khi bao gm cc byte lin tc. Mi khi ni chung s biu din mt cu trc d liu phc tp hoc mt mng. Chng hn nh, mt tp tin d liu c th bao gm nhiu cu trc c cng thnh phn cu to, hoc n c th cha nhiu mng c cng kiu v kch thc. V vi nhng ng dng nh vy thng i hi c ton b khi d liu t tp tin d liu hoc ghi ton b khi vo tp tin d liu hn l c hay ghi cc thnh phn c lp (ngha l cc thnh vin ca cu trc hay cc phn t ca mng) trong mi khi ring bit. Hm fwrite() c dng ghi d liu vo tp tin d liu trong nhng tnh hung nh vy. Hm ny c th dng ghi bt k kiu d liu no. Nguyn mu ca fwrite() l: size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);

Kiu d liu size_t c thm vo C chun tng tnh tng thch ca chng trnh vi nhiu h thng. N c nh ngha trc nh l mt kiu s nguyn ln lu gi kt qu ca hm sizeof(). i vi hu ht cc h thng, n c th c dng nh mt s nguyn dng.. Buffer l mt con tr tr n thng tin s c ghi vo tp tin. S byte phi c hoc ghi c cho bi num_bytes. i s count xc nh c bao nhiu mc (mi mc di num_bytes) c c hoc ghi. Cui cng, fp l mt con tr tp tin tr n mt stream c m trc . Cc tp tin m cho nhng thao tc ny phi m ch nh phn. Hm ny tr v s lng cc i tng ghi vo tp tin nu thao tc ghi thnh cng. Nu gi tr ny nh hn count th xy ra li. Hm ferror() (s c tho lun trong phn ti) c th c dng xc nh li. 21.4.4 c mt tp tin nh phn Hm fread() c th c dng c bt k kiu d liu no. Nguyn mu ca hm l: size_t fread(void *buffer, size_t num_bytes, size_t count FILE *fp); buffer l mt con tr tr n vng nh s nhn d liu t tp tin. S byte phi c hoc ghi c cho bi num_bytes. i s count xc nh c bao nhiu mc (mi mc di num_bytes) c c hoc ghi. Cui cng, fp l mt con tr tp tin tr n mt stream c m trc . Cc tp tin m cho nhng thao tc ny phi m ch nh phn. Hm ny tr v s lng cc i tng c nu thao tc c thnh cng. N tr v 0 nu c n cui tp tin hoc xy ra li. Hm feof() v hm ferror() (s c tho lun trong phn ti) c th c dng xc nh nguyn nhn.

Qun l tp tin

291

Cc hm fread() v fwrite() thng c gi l cc hm c hoc ghi khng nh dng. Min l tp tin c m cho cc thao tc nh phn, hm fread() v fwrite() c th c v ghi bt k kiu thng tin no. V d, chng trnh sau y ghi vo v sau c ngc ra mt s kiu double, mt s kiu int v mt s kiu long t tp tin trn a. Lu rng n s dng hm sizeof() xc nh di ca mi kiu d liu. V d 2: #include <stdio.h> main () { FILE *fp; double d = 23.31 ; int i = 13; long li = 1234567L; clrscr(); if ((fp = fopen ("jak", "wb+")) == NULL ) { printf("Cannot open file "); exit(1); } fwrite fwrite fwrite fclose (&d, sizeof(double), 1, fp); (&i, sizeof(int), 1, fp); (&li, sizeof(long), 1,fp); (fp);

if ((fp = fopen ("jak", "rb+")) == NULL ) { printf("Cannot open file"); exit(1); } fread (&d, sizeof(double), 1, fp); fread(&i, sizeof(int), 1, fp); fread (&li, sizeof(long), 1, fp); printf ("%f %d %ld", d, i, li); fclose (fp); } Nh chng trnh ny minh ha, c th c buffer v thng n ch l mt vng nh gi mt bin. Trong chng trnh n gin trn, gi tr tr v ca hm fread() v fwrite() c b qua. Tuy nhin, lp trnh hiu qu, cc gi tr nn c kim tra xem c li xy ra khng. Mt trong nhng ng dng hu dng nht ca fread() v fwrite() lin quan n vic c v ghi cc kiu d liu do ngi dng nh ngha, c bit l cc cu trc. V d ta c cu trc sau: struct struct_type { float balance; char name[80]; } cust;

292

Lp trnh c bn C

Cu lnh sau y ghi ni dung ca cust vo tp tin ang c tr n bi fp. fwrite(&cust, sizeof(struct struct_type), 1, fp); 21.5 Cc hm x l tp tin

Cc hm x l tp tin khc c tho lun trong phn ny. 21.5.1 Hm feof() Khi mt tp tin c m c dng nh phn, mt s nguyn c gi tr tng ng vi EOF c th c c. Trong trng hp ny, qu trnh c s cho rng n cui tp tin, mc d cha n cui tp tin thc s. Mt hm feof() c th c dng nhng trong trng hp ny. Nguyn mu ca hm l: int feof(FILE *fp ); N tr v true nu n cui tp tin, nu khng n tr v false (0). Hm ny c dng trong khi c d liu nh phn. on lnh sau y c mt tp tin nh phn cho n cui tp tin. . . while (!feof(fp) ) ch = fgetc(fp); . . 21.5.2 Hm rewind() Hm rewind() t li con tr nh v tr bn trong tp tin v u tp tin. N ly con tr tp tin lm i s. C php ca rewind() l: rewind(fp); Chng trnh sau m mt tp tin ch c/ghi, s dng hm fputs() vi u vo l cc chui, a con tr quay v u tp tin v sau hin th cc chui ging nh vy bng hm fgets(). V d 3: #include <stdio.h> main() { FILE *fp; char str [80]; /* Writing to File JAK */ if ((fp = fopen("jak", "w+")) == NULL) { printf ("Cannot open file \n\n"); exit(1); } clrscr (); do

Qun l tp tin

293

{ printf ("Enter a string (CR to quit): \n"); gets (str); if(*str != '\n') { strcat (str, "\n"); /* add a new line */ fputs (str, fp); } } while (*str != '\n'); /*Reading from File JAK */ printf ("\n\n Displaying Contents of File JAK\n\n"); rewind (fp); while (!feof(fp)) { fgets (str, 81, fp); printf ("\n%s", str); } fclose(fp); } Mt mu chy chng trnh trn nh sau: Enter a string (CR to quit): This is input line 1 Enter a string (CR to quit) : This is input line 2 Enter a string (CR to quit): This is input line 3 Enter a string (CR to quit): Displaying Contents of File JAK This is input line 1 This is input line 2 This is input line 3 21.5.3 Hm ferror() Hm ferror() xc nh liu mt thao tc trn tp tin c sinh ra li hay khng. Nguyn mu ca hm l: int ferror(FILE * fp) ; trong fp l mt con tr tp tin hp l. N tr v true nu c xy ra mt li trong thao tc cui cng trn tp tin ; ngc li, n tr v false. V mi thao tc thit lp li tnh trng li, nn hm ferror() phi c gi ngay sau mi thao tc; nu khng, li s b mt. Chng trnh trc c th c sa i kim tra v cnh bo v bt k li no trong khi ghi nh sau:

294

Lp trnh c bn C

. . do { printf( Enter a string (CR to quit): \n"); gets(str); if(*str != '\n') { strcat (str, "\n"); /* add a new line */ fputs (str, fp); } if(ferror(fp)) printf("\nERROR in writing\n"); } while(*str!='\n'); . . 21.5.4 Xa tp tin

Hm remove() xa mt tp tin nh. Nguyn mu ca hm l: int remove (char *filename); N tr v 0 nu thnh cng ngc li tr v mt gi tr khc 0. V d, xt on m lnh sau y: . . printf ("\nErase file %s (Y/N) ? ", file1); ans = getchar (); . . if(remove(file1)) { printf ("\nFile cannot be erased"); exit(1); } 21.5.5 Lm sch cc stream

Thng thng, cc tp tin xut chun c trang b vng m. iu ny c ngha l kt xut cho tp tin c thu thp trong b nh v khng tht s hin th cho n khi vng m y. Nu mt chng trnh b treo hay kt thc bt thng, mt s k t vn cn nm trong vng m. Kt qu l chng trnh c v nh kt thc sm hn l n tht s lm. Hm fflush() s gii quyt vn ny. Nh tn gi ca n, n s lm sch vng m v chp nhng g c trong vng m ra ngoi. Hnh ng lm sch ty theo kiu tp tin. Mt tp tin c m c s c vng m nhp trng, trong khi mt tp tin c m ghi th vng m xut ca n s c ghi vo tp tin. Nguyn mu ca hm ny l: int fflush(FILE * fp);

Qun l tp tin

295

Hm fflush() s ghi ni dung ca bt k vng m d liu no vo tp tin kt hp vi fp. Hm fflush(), khng c i s, s lm sch tt c cc tp tin ang m xut. N tr v 0 nu thnh cng, ngc li, n tr v EOF. 21.5.6 Cc stream chun Mi khi mt chng trnh C bt u thc thi di DOS, h iu hnh s t ng m 5 stream c bit. 5 stream ny l: Nhp chun (stdin) Xut chun (stdout) Li chun (stderr) My in chun (stdprn) Thit b h tr chun (stdaux)

Trong , stdin, stdout v stderr c gn mc nh cho cc thit b nhp/xut chun ca h thng trong khi stdprn c gn cho cng in song song u tin v stdaux c gn cho cng ni tip u tin. Chng c nh ngha nh l cc con tr c nh kiu FILE, v vy chng c th c s dng bt k ni no m vic s dng con tr FILE l hp l. Chng cng c th c chuyn mt cch hiu qu cho cc stream hay thit b khc mi khi cn nh hng li. Chng trnh sau y in ni dung ca tp tin vo my in. V d 4: #include <stdio.h> main() { FILE *in; char buff[81], fname[13]; clrscr(); printf("Enter the Source File Name:"); gets(fname); if((in=fopen(fname, "r"))==NULL) { fputs("\nFile not found", stderr); /* display error message on standard error rather than standard output */ exit(1); } while(!feof(in)) { if(fgets(buff, 81, in)) { fputs(buff, stdprn); /* Send line to printer */ } } fclose(in); }

296

Lp trnh c bn C

Lu cch s dng ca stream stderr vi hm fputs() trong chng trnh trn. N c s dng thay cho hm printf v kt xut ca hm printf l stdout, ni m c th nh hng li. Nu kt xut ca mt chng trnh c nh hng li v mt li xy ra trong qu trnh thc thi, th tt c cc thng bo li a ra cho stream stdout cng phi c nh hng li. trnh iu ny, stream stderr c dng hin th thng bo li ln mn hnh v kt xut ca stderr cng l thit b xut chun, nhng stream stderr khng th nh hng li. N lun lun hin th thng bo ln mn hnh. 21.5.7 Con tr kch hot hin hnh ln theo v tr ni m cc thao tc nhp/xut ang din ra, mt con tr c duy tr trong cu trc FILE. Mi khi mt k t c c ra hay ghi vo mt stream, con tr kch hot hin hnh (current active pointer) (gi l curp) c tng ln. Hu ht cc hm nhp xut u tham chiu n curp, v cp nht n sau cc th tc nhp hoc xut trn stream. V tr hin hnh ca con tr ny c th c tm thy bng s tr gip ca hm ftell(). Hm ftell() tr v mt gi tr kiu long int biu din v tr ca curp tnh t u tp tin trong stream cho. Nguyn mu ca hm ftell() l: long int ftell(FILE *fp); Cu lnh trch t mt chng trnh s hin th v tr ca con tr hin hnh trong stream fp. printf("The current location of the file pointer is : %1d ", ftell (fp)); t li v tr hin hnh Ngay sau khi m stream, con tr kch hot hin hnh c t l 0 v tr n byte u tin ca stream. Nh thy trc y, mi khi c mt k t c c hay ghi vo stream, con tr kch hot hin hnh s tng ln. Bn trong mt chng trnh, con tr c th c t n mt v tr bt k khc vi v tr hin hnh vo bt k lc no. Hm rewind() t v tr con tr ny v u. Mt hm khc c s dng t li v tr con tr ny l fseek(). Hm fseek() nh li v tr ca curp di i mt s byte tnh t u, t v tr hin hnh hay t cui stream l ty vo v tr c qui nh khi gi hm fseek(). Nguyn mu ca hm fseek() l: int fseek(FILE *fp, long int offset, int origin); trong offset l s byte cn di chuyn vt qua v tr tp tin c cho bi tham s origin. Tham s origin ch nh v tr bt u tm kim v phi c gi tr l 0, 1 hoc 2, biu din cho 3 hng k hiu (c nh ngha trong stdio.h) nh trong bng 21.4:

Origin V tr tp tin SEEK_SET or 0 u tp tin SEEK_CUR or 1 V tr con tr ca tp tin hin hnh SEEK_END or 2 Cui tp tin Bng 21.4: Cc hng k hiu Hm fseek() tr v gi tr 0 nu thnh cng v gi tr khc 0 nu tht bi. on lnh sau tm mu tin th 6 trong tp tin: struct addr { char name[40];

Qun l tp tin

297

char char char char

street[40]; city[40]; state[3]; pin[7];

} FILE *fp; . . . fseek(fp, 5L*sizeof(struct addr), SEEK_SET); Hm sizeof() c dng tm di ca mi mu tin theo n v byte. Gi tr tr v c dng xc nh s byte cn thit nhy qua 5 mu tin u tin. 21.5.8 Hm fprintf() v fscanf() Ngoi cc hm nhp xut c tho lun, h thng nhp/xut c vng m cn bao gm cc hm fprintf() v fscanf(). Cc hm ny tng t nh hm printf() v scanf() ngoi tr rng chng thao tc trn tp tin. Nguyn mu ca hm fprintf() v fscanf() l: int fprintf(FILE * fp, const char *control_string,..); int fscanf(FILE *fp, const char *control_string,...); trong fp l con tr tp tin tr v bi li gi hm fopen(). Hm fprintf() v fscanf() nh hng cc thao tc nhp xut ca chng n tp tin c tr bi fp. on chng trnh sau y c mt chui v mt s nguyn t bn phm, ghi chng vo mt tp tin trn a, v sau c thng tin v hin th trn mn hnh. . . printf("Enter a string and a number: "); fscanf(stdin, "%s %d", str, &no); /* read from the keyboard */ fprintf(fp, "%s %d", str, no); /* write to the file*/ fclose (fp); . . fscanf(fp, "%s %d", str, &no) /* read from file */ fprintf(stdout, "%s %d", str, no) /* print on screen */ . . Nn nh rng, mc d fprintf() v fscanf() thng l cch d nht ghi vo v c d liu hn hp ra cc tp tin trn a, nhng chng khng phi lun lun l hiu qu nht. Nguyn nhn l mi li gi phi mt thm mt khong thi gian, v d liu c ghi theo dng ASCII c nh dng (nh n s xut hin trn mn hnh) ch khng phi theo nh dng nh phn. V vy, nu tc v ln ca tp tin l ng ngi, fread() v fwrite() s l la chn tt hn.

298

Lp trnh c bn C

Tm tt Ngn ng C khng cha bt k cu lnh nhp/xut no tng minh. Tt c cc thao tc nhp/xut c thc hin bng cch s dng cc hm trong th vin chun ca C. C hai kiu stream stream vn bn v stream nh phn. Mt stream vn bn l mt chui cc k t. Mt stream nh phn l mt chui cc byte. Mt tp tin c th l bt c g t mt tp tin trn a n mt thit b u cui hay mt my in. Mt con tr tp tin l mt con tr tr n cu trc, trong cha cc thng tin v tp tin, bao gm tn, v tr hin hnh ca tp tin, tp tin ang c c hoc ghi, v c li xut hin hay n cui tp tin. Hm fopen() m mt stream dng v lin kt mt tp tin vi stream . Hm fclose() ng mt stream c m bng hm fopen(). Hm fcloseall() c th c s dng khi cn ng nhiu stream ang m cng mt lc. Hm fputc() c dng ghi k t, v hm fgetc() c dng c k t t mt tp tin ang m. Hm fgets() v fputs() thao tc ging nh hm fgetc() v fputc(), ngoi tr rng chng lm vic trn chui. Hm feof() c dng ch ra cui tp tin khi tp tin c m cho cc thao tc nh phn. Hm rewind() t li v tr ca con tr nh v tr v u tp tin. Hm ferror() xc nh liu mt thao tc trn tp tin c sinh li hay khng. Hm remove() xa mt tp tin cho. Hm fflush() lm sch v chp cc buffer ra ngoi. Nu mt tp tin c m c, th vng m nhp ca n s trng, trong khi mt tp tin c m ghi th vng m xut ca n c ghi vo tp tin. Hm fseek() c th c s dng t li v tr ca con tr nh v bn trong tp tin. Cc hm th vin fread() v fwrite() c dng c v ghi ton b khi d liu vo tp tin. H thng nhp xut c vng m cng bao gm hai hm fprintf() v fscanf(), hai hm ny tng t nh hm printf() v scanf(), ngoi tr chng thao tc trn tp tin.

Qun l tp tin

299

Kim tra tin hc tp 1. C hai kiu stream l stream __________ v stream _________. 2. Cc tp tin ang m c ng li khi chng trnh b treo hay kt thc bt thng. (ng /Sai) 3. Hm _________ m mt stream dng v lin kt mt tp tin vi stream . 4. Hm c dng ghi k t vo tp tin l ________. 5. Hm fgets() xem k t sang dng mi nh l mt phn ca chui. 6. Hm ________ t li v tr ca con tr nh v bn trong tp tin v u tp tin. 7. Mi khi mt k t c c hay ghi t mt stream, ___________ c tng ln. 8. Cc tp tin m trn hm fread() v fwrite() thao tc th phi c m ch ________. 9. V tr hin hnh ca con tr kch hot hin hnh c th c tm thy bng s tr gip ca hm ________. (ng / Sai)

300

Lp trnh c bn C

Bi tp t lm 1. Vit mt chng trnh nhp d liu vo mt tp tin v in n theo th t ngc li. 2. Vit mt chng trnh truyn d liu t mt tp tin ny sang mt tp tin khc, loi b tt c cc nguyn m (a, e, i, o, u). Loi b cc nguyn m dng ch hoa ln ch thng. Hin th ni dung ca tp tin mi.

Qun l tp tin

301

302

Lp trnh c bn C

Bi 22
Mc tiu: Kt thc bi hc ny, bn c th: Thc hin cc thao tc trn tp tin vn bn v tp tin nh phn M v ng tp tin c t tp tin v ghi vo tp tin S dng con tr tp tin.

Qun L Tp Tin

Cc bc c cho trong bi ny c gii thch cn k, d hiu v t duy cn thn t u n cui. Bi c vit p ng c mc tiu hc v c th hiu hon ton v cng c. Xin hy thc hin theo cc bc mt cch cn thn. Phn I Trong thi gian 1 gi 30 pht u: 22.1 Qun l tp tin trong C C cung cp mt giao din ng nht cho vic qun l nhp v xut. Cc phng php truy cp tp tin cng ging nh cc phng php qun l cc thit b khc. Gii php cho tnh ng nht ny l trong C khng c kiu tp tin. C xem tt c cc tp tin l stream. 22.1.1 c, ghi v truy cp d liu trong tp tin C mt s hm x l tp tin trong tp tin header stdio.h. Chng ta hy vit mt chng trnh C s dng nhng hm ny. Chng trnh to mt h thng ngn hng n gin. Cc chi tit khch hng c nhp vo v lu trong mt tp tin gi l customer. Chi tit ca cc giao dch nh gi tin v rt tin c kim tra hp l trn tp tin customer. Cc giao dch hp l c ghi nhn trong tp tin trans. Mt bo co v cc khch hng c s vn thp c in ra. Cc bc c lit k nh sau: 1. nh ngha mt structure lu tr d liu v khch hng v giao dch. Cu lnh s l: struct cust_st { int acc_no; char cust_nm[30]; float bal; }; struct tran_st { int acc_no; char trantype; float amt; }; 2. Hin th mt danh mc thc hin cc thao tc khc nhau da trn la chn ca ngi dng. Cu lnh s l: while(choice != 4) { clrscr(); printf("\nSelect choice from menu\n\n1. Accept customer details\n2. Record Withdrawal/Deposit

Qun l tp tin

305

transaction\n3. Print Low Balance Report\n4. Exit\n\nEnter choice: "); scanf(" %d", &choice); . . } 3. Gi cc hm tng ng da vo la chn ca ngi dng. Cu lnh s l: if(choice == 1) addcust(); else if(choice == 2) rectran(); else if(choice == 3) prnlowbal(); 4. Trong hm thm chi tit ca khch hng, nh ngha mt con tr tp tin kt hp vi tp tin customer. Khai bo mt bin cu trc nhp d liu ca khch hng. Cu lnh s l: FILE *fp; struct cust_st custdata; 5. M tp tin customer theo ch append c th thm cc mu tin mi. Xc nhn rng thao tc m tp tin c thc hin. Cu lnh s l: if((fp = fopen("customer", "a+")) == NULL) { printf("\nERROR opening customer file"); getch(); return; } 6. Nhp d liu khch hng vo bin cu trc v ghi d liu vo tp tin customer. Cu lnh s l: fwrite(&custdata, sizeof(struct cust_st), 1, fp); 7. ng tp tin customer sau khi nhp d liu. Cu lnh s l: fclose(fp); 8. Trong hm dng ghi cc giao dch, nh ngha bin con tr tr n tp tin customer v tp tin trans. V nh ngha bin cu trc nhp vo d liu ca giao dch v c d liu khch hng. Cu lnh s l: FILE *fp1, *fp2; struct cust_st custdata; struct tran_st trandata; 9. M hai tp tin theo ch thch hp. Tp tin customer phi m c v cp nht, trong khi tp tin trans phi cho php thm cc mu tin mi. Cu lnh s l: if((fp1=fopen("customer", "r+w"))==NULL) { printf("\nERROR opening customer file"); getch(); return; }
306 Lp trnh c bn C

if((fp2 = fopen("trans", "a+")) == NULL) { printf("\nERROR opening transaction file"); getch(); return; } 10. Nhp vo s ti khon cho giao dch v bo m rng n tn ti trong tp tin customer. Cu lnh s l: while((fread(&custdata, size, 1, fp1)) == 1 && found == 'n') { if(custdata.acc_no == trandata.acc_no) { found='y'; break; } } 11. bo m nhp vo mt kiu giao dch hp l, cu lnh s l: if(trandata.trantype!='D' && trandata.trantype!='d' && trandata.trantype!='W' && trandata.trantype!='w') printf("\t\tInvalid transaction type, please reenter"); 12. i vi cc giao dch rt tin, phi bo m rng s tin rt ra phi sn c trong ti khon ca khch hng. Nu sn c, cp nht s tin cn li trong ti khon. Cng cn cp nht s tin trong ti khon cho cc giao dch gi tin. Cu lnh s l: if(trandata.trantype=='W' || trandata.trantype=='w') { if(trandata.amt>custdata.bal) printf("\nAccount balance is %.2f. Please reenter withdrawal amount.", custdata.bal); else { custdata.bal-=trandata.amt; . . } } else { custdata.bal+=trandata.amt; . . } 13. Ghi mu tin cha giao dch mi vo tp tin trans v cp nht mu tin ca khch hng trong tp tin customer. Cu lnh s l: fwrite(&trandata, sizeof(struct tran_st), 1, fp2); fseek(fp1, (long)(-size), 1); fwrite(&custdata, size, 1, fp1);

Qun l tp tin

307

Lu rng trong sut qu trnh kim tra s ti khon ca khch hng, mu tin c cui cng l ca khch hng ang thc hin giao dch. V vy, con tr tp tin ca tp tin customer phi nm cui ca mu tin cn cp nht. Con tr tp tin s c t li v tr v u ca mu tin s dng hm fseek(). y size l mt bin s nguyn cha kch c ca cu trc cho d liu khch hng. 14. ng hai tp tin sau khi nhp giao dch. Cu lnh s l: fclose(fp1); fclose(fp2); 15. Trong hm hin th cc ti khon c s vn t, nh ngha con tr tp tin kt hp vi tp tin customer. Khai bo mt bin cu trc c d liu ca khch hng. Cu lnh s l: FILE *fp; struct cust_st custdata; 16. Sau khi m tp tin ch c, c mi mu tin khch hng v kim tra s vn. Nu n t hn 250, in mu tin ra. Cu lnh s l: while((fread(&custdata, sizeof(struct cust_st), 1, fp))==1) { if(custdata.bal<250) { . . printf("\n%d\t%s\t%.2f", custdata.acc_no, custdata.cust_nm, custdata.bal); } }

17. ng tp tin customer. Cu lnh s l: fclose(fp); Chng ta hy nhn vo chng trnh hon chnh.

1. M chng trnh son tho m bn dng g chng trnh C. 2. To mt tp tin mi. 3. G vo cc dng lnh sau y: #include<stdio.h> struct cust_st { int acc_no; char cust_nm[30]; float bal; }; struct tran_st { int acc_no;

308

Lp trnh c bn C

char trantype; float amt; }; void main() { int choice = 1; while(choice != 4) { clrscr(); printf("\nSelect choice from menu\n\n1. Accept customer details\n2. Record Withdrawal/Deposit transaction\n3. Print Low Balance Report\n4. Exit\n\nEnter choice: "); scanf(" %d", &choice); if(choice == 1) addcust(); else if(choice == 2) rectran(); else if(choice == 3) prnlowbal(); } } addcust() { FILE *fp; char flag = 'y'; struct cust_st custdata; clrscr(); if((fp = fopen("customer", "a+")) == NULL) { printf("\nERROR opening customer file"); getch(); return; } while(flag == 'y') { printf("\n\nEnter Account number: "); scanf(" %d", &custdata.acc_no); printf("\nEnter Customer Name: "); scanf("%s", custdata.cust_nm); printf("\nEnter Account Balance: "); scanf(" %f", &custdata.bal); fwrite(&custdata, sizeof(struct cust_st), 1, fp); printf("\n\nAdd another? (y/n): "); scanf(" %c", &flag); } fclose(fp); }

Qun l tp tin

309

rectran() { FILE *fp1, *fp2; char flag = 'y', found, val_flag; struct cust_st custdata; struct tran_st trandata; int size = sizeof(struct cust_st); clrscr(); if((fp1 = fopen("customer", "r+w")) == NULL) { printf("\nERROR opening customer file"); getch(); return; } if((fp2 = fopen("trans", "a+")) == NULL) { printf("\nERROR opening transaction file"); getch(); return; } while(flag == 'y') { printf("\n\nEnter Account number: "); scanf("%d", &trandata.acc_no); found='n'; val_flag = 'n'; rewind(fp1); while((fread(&custdata, size, 1, fp1))==1 && found=='n') { if(custdata.acc_no == trandata.acc_no) { found = 'y'; break; } } if(found == 'y') { while(val_flag == 'n') { printf("\nEnter Transaction type (D/W): "); scanf(" %c", &trandata.trantype); if(trandata.trantype!='D' && trandata.trantype!='d' && trandata.trantype!='W' && trandata.trantype!='w') printf("\t\tInvalid transaction type, please reenter"); else val_flag = 'y'; } val_flag = 'n'; while(val_flag == 'n') { printf("\nEnter amount: "); scanf(" %f", &trandata.amt); if(trandata.trantype=='W' || trandata.trantype=='w') {
310 Lp trnh c bn C

if(trandata.amt > custdata.bal) printf("\nAccount balance is %.2f. Please reenter withdrawal amount.", custdata.bal); else { custdata.bal -= trandata.amt; val_flag = 'y'; } } else { custdata.bal += trandata.amt; val_flag = 'y'; } } fwrite(&trandata, sizeof(struct tran_st), 1, fp2); fseek(fp1, (long)(-size), 1); fwrite(&custdata, size, 1, fp1); } else printf("\nThis account number does not exist"); printf("\nRecord another transaction? (y/n): "); scanf(" %c", &flag); } fclose(fp1); fclose(fp2); }

prnlowbal() { FILE *fp; struct cust_st custdata; char flag = 'n'; clrscr(); if((fp = fopen("customer", "r")) == NULL) { printf("\nERROR opening customer file"); getch(); return; } printf("\nReport on account balances below 250\n\n"); while((fread(&custdata, sizeof(struct cust_st), 1, fp)) == 1) { if(custdata.bal < 250) { flag = 'y'; printf("\n%d\t%s\t%.2f", custdata.acc_no, custdata.cust_nm, custdata.bal); }

} if(flag == 'n')

Qun l tp tin

311

printf("\nNo account balances found below 250"); getch(); fclose(fp); }

xem kt qu, thc hin cc bc sau y: 4. Lu tp tin vi tn filesI.C. 5. Bin dch tp tin, filesI.C. 6. Thc thi chng trnh, filesI.C. 7. Tr v chng trnh son tho. Kt xut ca chng trnh nh sau: Select choice from menu 1. 2. 3. 4. Accept customer details Record Withdrawal/Deposit transaction Print Low Balance Report Exit

Enter choice: Mt mu kt xut ca hm thm vo chi tit ca khch hng nh sau: Enter Account number: 123 Enter Customer Name: E.Wilson Enter Account Balance: 2000 Add another? (y/n): Mt mu kt xut ca hm thm vo chi tit ca giao dch nh sau: Enter Account number: 123 Enter Transaction type (D/W): W Enter amount: 1000 Record another transaction? (y/n): Mt mu kt xut ca hm hin th bo co cc ti khon c vn thp nh sau: Report on account balances below 250 104
312

Jones

200
Lp trnh c bn C

113 120

Sharon 150 Paula 200

Qun l tp tin

313

Phn II Trong thi gian 30 pht k tip: 1. Vit mt chng trnh C hin th s khc nhau gia hai tp tin nhp vo nh l i s ca dng lnh. Vi mi s khc nhau, hin th v tr tm thy s khc nhau v cc k t ca hai tp tin ti v tr . Cng cn phi bo m rng ngi s dng nhp vo s lng i s hp l. Cui cng, hin th tng s s khc nhau tm thy. lm iu ny, a. Khai bo cc bin argv v argc nhn vo i s t dng lnh. b. Khai bo con tr tr n hai tp tin. c. Kim tra tnh hp l ca argc bo m rng nhp ng s i s. d. M hai tp tin ch c. e. t mt vng lp c tng k t t hai tp tin cho n khi n cui c hai tp tin. f. Nu cc k t l khc nhau, hin th chng cng vi v tr ca chng. Tng s m s khc nhau ln 1. g. Nu i n cui ca mt tp tin, in cc k t cn li trong tp tin kia nh l s khc bit. h. Kim tra s m s khc nhau hin th cc thng bo thch hp. i. ng hai tp tin.

314

Lp trnh c bn C

Bi tp t lm 1. Vit mt chng trnh C sao chp ni dung ca mt tp tin vo mt tp tin khc loi tr cc t a, an, v the. 2. Vit mt chng trnh C nhp vo hai chui s. Lu tr mi chui hai tp tin ring bit. Sp xp chui trong mi tp tin. Trn hai chui vo mt, sp xp v lu li chui kt qu vo mt tp tin mi. Hin th ni dung ca tp tin mi.

Qun l tp tin

315

You might also like