You are on page 1of 162

M cl c Gi i thi u...........................................................................................................6 Chng 1. 1.1. 1.2. M u .........................................................................................

Chng trnh l g?.............................................................................8 L p trnh l g? ...................................................................................8 M c cao c l p v i my tnh ......................................................8

1.2.1. 1.2.2. 1.3. 1.4. 1.5. 1.6. 1.7.

M c th p ph thu c vo my tnh ..............................................10

Ngn ng l p trnh v chng trnh d ch ..........................................10 Mi tr ng l p trnh b c cao.............................................................11 L i v tm l i ....................................................................................13 L ch s C v C++ .............................................................................14 Chng trnh C++ u tin ...............................................................15

Bi t p .........................................................................................................19 Chng 2. 2.1. Bi n, ki u d li u v cc php ton ............................................20

Ki u d li u......................................................................................22 Ki u d li u c b n ....................................................................22 Ki u d li u d n xu t .................................................................24

2.1.1. 2.1.2. 2.2.

Khai bo v s d ng bi n .................................................................24 nh danh v cch t tn bi n ...................................................24

2.2.1. 2.2.2. 2.3. 2.4.

Khai bo bi n .............................................................................25

H ng.................................................................................................25 Cc php ton c b n........................................................................26 Php gn.....................................................................................26 Cc php ton s h c..................................................................26 Cc php ton quan h ................................................................27 1

2.4.1. 2.4.2. 2.4.3.

2.4.4. 2.4.5. 2.4.6.

Cc php ton l-gic...................................................................28 u tin c a cc php ton......................................................28 Tng thch gi a cc ki u ..........................................................29

Bi t p .........................................................................................................30 Chng 3. 3.1. 3.2. Cc c u trc i u khi n ..............................................................32

Lu ng i u khi n..............................................................................32 Cc c u trc r nhnh .......................................................................33 L nh if-else ...........................................................................33 L nh switch .............................................................................39

3.2.1. 3.2.2. 3.3.

Cc c u trc l p ................................................................................43 Vng while...............................................................................43 Vng do-while ........................................................................46 Vng for ...................................................................................49

3.3.1. 3.3.2. 3.3.3. 3.4. 3.5.

Cc l nh break v continue .........................................................54 Bi u th c i u ki n trong cc c u trc i u khi n.............................57

Bi t p .........................................................................................................59 Chng 4. 4.1. 4.2. 4.3. 4.4. Hm............................................................................................61

Cc hm c s n.................................................................................62 C u trc chung c a hm ...................................................................63 Cch s d ng hm ............................................................................64 Bi n ton c c v bi n a phng .....................................................65

4.4.1. 4.4.2. 4.5.

Ph m vi c a bi n ........................................................................65 Th i gian s ng c a bi n..............................................................67 i s , v c ch truy n tham s cho hm .........................68

Tham s ,

4.5.1.

Truy n gi tr ..............................................................................68

4.5.2. 4.5.3. 4.6. 4.7.

Truy n tham chi u......................................................................69 Tham s m c nh ......................................................................72

Hm trng tn...................................................................................74 Hm quy ......................................................................................76

Bi t p .........................................................................................................78 Chng 5. 5.1. M ng ..........................................................................................80

M ng m t chi u................................................................................80 Khai bo v kh i t o m ng .........................................................81 ng d ng c a m ng ...................................................................83 Trch nhi m ki m sot tnh h p l c a ch s m ng....................85 M ng lm tham s cho hm........................................................85

5.1.1. 5.1.2. 5.1.3. 5.1.4. 5.2. 5.3.

M ng nhi u chi u .............................................................................86 M ng v xu k t .............................................................................88 Kh i t o gi tr cho xu k t ......................................................90 Th vi n x l xu k t .............................................................90

5.3.1. 5.3.2. 5.4.

Tm ki m v s p x p d li u trong m ng ..........................................91 Tm ki m tuy n tnh ...................................................................91 Tm ki m nh phn .....................................................................92 S p x p ch n ..............................................................................94

5.4.1. 5.4.2. 5.4.3.

Bi t p .........................................................................................................96 Chng 6. 6.1. 6.2. 6.3. 6.4. Con tr v b nh .......................................................................99

B nh my tnh ...............................................................................99 Bi n v a ch c a bi n....................................................................99

Bi n con tr ....................................................................................100 M ng v con tr ..............................................................................105

6.5.

B nh

ng ...................................................................................107 ng...............................................................107 ng ...........................................................108

6.5.1. 6.5.2. 6.6. 6.7.

C p pht b nh Gi i phng b nh

M ng

ng v con tr .....................................................................109

Truy n tham s l con tr ...............................................................111

Bi t p .......................................................................................................115 Chng 7. 7.1. 7.2. 7.2.1. 7.2.2. 7.2.3. 7.3. 7.4. Cc ki u d li u tr u t ng ......................................................118 nh ngha ki u d li u tr u t ng b ng c u trc struct .................118 nh ngha ki u d li u tr u t ng b ng c u trc class ...............124 Quy n truy nh p .......................................................................127 Ton t ph m vi v nh ngha cc hm thnh vin ..................128

Hm kh i t o v hm h y.........................................................129 i t ng.............................................132

L i ch c a l p trnh h ng

Bin d ch ring r ...........................................................................133

Bi t p .......................................................................................................137 Chng 8. 8.1. 8.2. 8.3. Vo ra d li u...........................................................................140

Khi ni m dng d li u ..................................................................140 T p vn b n v t p nh phn ...........................................................141 Vo ra t p .......................................................................................141 M t p......................................................................................142 ng t p...................................................................................143 X l t p vn b n .....................................................................144 X l t p nh phn ....................................................................147

8.3.1. 8.3.2. 8.3.3. 8.3.4.

Bi t p .......................................................................................................151 Ph l c A. Phong cch l p trnh .................................................................153

Ph l c B. Ph l c C.

D ch chng trnh C++ b ng GNU C++...................................157 X l xu b ng th vi n cstring................................................160

Ti li u tham kh o .........................................................................................162

Gi i thi u
L p trnh l m t trong nh ng b c quan tr ng nh t trong quy trnh gi i quy t m t bi ton. Nhi u ngn ng l p trnh c ra i nh m gip chng ta gi i quy t cc bi ton m t cch hi u qu nh t. M i ngn ng l p trnh c nh ng th m nh v nh c i m ring. Cc ngn ng l p trnh c th chia ra thnh hai lo i chnh l ngn ng l p trnh b c th p (g n gi v i ngn ng my), v ngn ng l p trnh b c cao (ng n gi v i ngn ng t nhin c a con ng i). Gio trnh ny trang b cho sinh vin nh ng ki n th c c b n v l p trnh. Ngn ng l p trnh C++ c s d ng minh h a cho vi c l p trnh. Vi c l a ch n C++ b i v n l m t ngn ng l p trnh h ng i t ng chuyn nghi p c s d ng r ng ri trn ton th gi i pht tri n cc chng trnh t n gi n n ph c t p. Hn th n a, s m m d o c a C++ cho php chng ta gi i quy t nh ng bi ton th c t m t cch nhanh chng, ngoi ra cho php chng ta qu n l v tng tc tr c ti p n h th ng, b nh nng cao hi u qu c a chng trnh. Gio trnh c chia thnh 8 chng, m i chng trnh by m t v n l thuy t trong l p trnh. Cc v n l thuy t c m t b ng cc v d th c t . K t thc m i chng l ph n bi t p sinh vin gi i quy t v n m r hn v l thuy t. C u trc c a gio trnh nh sau: Chng 1: gi i thi u cc khi ni m c b n v l p trnh v quy trnh gi i quy t m t bi ton. Sinh vin s hi u v ngn ng l p trnh b c cao v ngn ng l p trnh b c th p. Cu i chng chng ti gi i thi u v mi tr ng l p trnh cng nh ngn ng l p trnh C++. Chng 2: Chng ti gi i thi u cc khi ni m c b n v bi n s , h ng s , cc ki u d li u c b n v cc php ton c b n. Sau khi h c, sinh vin s bi t cch khai bo v s d ng bi n s , h ng s , v cc php ton trn bi n v h ng s . Chng 3: Trng ny gi i thi u v c u trc chng trnh cng nh cc c u trc i u khi n. C th l cc c u r nhnh (if-else, switch), c u trc l p (for, while, do-while) s c gi i thi u. Chng 4: Chng trnh con v hm s c gi i thi u sinh vin hi u c chi n l c l p trnh chia tr . Chng ti s trnh by chi ti t v

cch khai bo v s d ng hm, cng nh cch truy n tham s , truy n gi tr cho hm. Chng 5: Chng ny trnh by c u trc d li u ki u m ng v xu k t . Cch khai bo v s d ng m ng m t chi u cng nh m ng nhi u chi u v v d lin quan c trnh by chi ti t chng ny. Chng 6: y l m t chng tng i c th cho C++, khi chng ti trnh by v b nh v ki u d li u con tr . C u trc b nh , cch qu n l v xin c p php b nh ng thng qua vi c s d ng bi n con tr s c trnh by. Chng 7: Trong chng ny chng ti s trnh by v c u trc d li u tr u t ng (c th l struct v class trong C++). Sinh vin s hi u v bi t cch t o ra nh ng c u trc d li u tr u t ng ph h p v i cc ki u i t ng d li u c n bi u di n. Cu i chng, chng ti cng gi i thi u v l p trnh h ng i t ng, m t th m nh c a ngn ng l p trnh C++. Chng 8: Chng ti gi i thi u v cch vo ra d li u. Sinh vin s gi i thi u chi ti t v cch lm vi c v i cc t p d li u. c

Chng 1. M

Trong chng ny, chng ti s gi i thi u qua m t s khi ni m c b n v : chng trnh, l p trnh, ngn ng l p trnh.

1.1. Chng trnh l g?


B n ch c ch n dng qua nhi u chng trnh khc nhau, v d nh chng trnh so n th o vn b n Microsoft Word. Chng trnh, hay ph n m m, c hi u n gi n l m t t p cc l nh my tnh th c hi n theo. Khi b n a cho my tnh m t chng trnh v yu c u my tnh th c hi n theo cc l nh c a chng trnh, b n ang ch y chng trnh .

1.2. L p trnh l g?
L p trnh l c th hi u n gi n l qu trnh vi t ra cc l nh h ng d n my tnh th c hi n gi i quy t m t bi ton c th no . L p trnh l m t b c quan tr ng trong quy trnh gi i quy t m t bi ton nh m t Hnh 1.1.

Hnh 1.1: Quy trnh gi i quy t m t bi ton.

Quy trnh trn c th c chia ra thnh hai m c: m c cao c l p v i my tnh (machine independent) v m c th p ph thu c vo my tnh (machine specific). 1.2.1. M c cao M c cao nh v n c l p v i my tnh

c l p v i my tnh th ng c chia thnh ba b c chnh l: xc , thi t k thu t ton v l p trnh.

chng trnh d ch

trnh so n th o

bt/gi y

bt/gi y

Xc nh v n : B c ny nh ngha bi ton, xc nh d li u u vo, cc rng bu c, yu c u c n gi i quy t v k t qu u ra. B c ny th ng s d ng bt/gi y v ngn ng t nhin nh ti ng Anh, ti ng Vi t m t v xc nh v n c n gi i quy t. Thi t k thu t ton: M t thu t ton l m t b cc ch d n nh m gi i quy t m t bi ton. Cc ch d n ny c n c di n t m t cch hon ch nh v chnh xc sao cho m i ng i c th hi u v ti n hnh theo. Thu t ton th ng c m t d i d ng m gi (pseudocode). B c ny c th s d ng gi y bt v th ng khng ph thu c vo ngn ng l p trnh. V d v thu t ton tm c s chung l n nh t (UCLN) c a hai s x v y vi t b ng ngn ng t nhin: B c 1: N u x>y th thay x b ng ph n d c a php chia x/y. B c 2: N u khng, thay y b ng ph n d c a php chia y/x. B c 3: N u trong hai s x v y c m t s b ng 0 th k t lu n UCLN l s cn l i. B c 4: N u khng, quay l i B c 1. ho c b ng m gi : repeat if x > y then x := x mod y else y := y mod x until x = 0 or y = 0 if x = 0 then UCLN := y else UCLN := x L p trnh l b c chuy n i thu t ton sang m t ngn ng l p trnh, ph bi n l cc ngn ng l p trnh b c cao, v d nh cc ngn ng C++, Java. B c ny, l p trnh vin s d ng m t chng trnh so n th o vn b n vi t chng trnh. Trong v sau qu trnh l p trnh, ng i ta ph i ti n hnh ki m th v s a l i chng trnh. C ba lo i l i th ng g p: l i c php, l i trong th i gian ch y, v l i l-gic (xem chi ti t M c 1.5).

1.2.2. M c th p ph thu c vo my tnh Cc ngn ng l p trnh b c cao, v d nh C, C++, Java, Visual Basic, C#, c thi t k con ng i tng i d hi u v d s d ng. Tuy nhin, my tnh khng hi u c cc ngn ng b c cao. Do , tr c khi m t chng trnh vi t b ng ngn ng b c cao c th ch y c, n ph i c d ch sang ngn ng my, hay cn g i l m my, m my tnh c th hi u v th c hi n c. Vi c d ch c th c hi n b i m t chng trnh my tnh g i l chng trnh d ch.

1.3. Ngn ng l p trnh v chng trnh d ch


Nh chng ta th y, qu trnh gi i quy t m t bi ton thng qua cc b c khc nhau chuy n i t ngn ng t nhin m con ng i hi u c sang ngn ng my m my tnh c th hi u v th c hi n c. Ngn ng l p trnh th ng c chia ra thnh hai lo i: ngn ng l p trnh b c th p v ngn ng l p trnh b c cao. Ngn ng l p trnh b c th p nh h p ng (assembly language) ho c m my c i m l ngn ng g n v i ngn ng my m my tnh c th hi u c. chnh c a cc ngn ng ny l chng c lin quan ch t ch n ph n c ng c a my tnh. Cc h my tnh khc nhau s d ng cc ngn ng khc nhau. Chng trnh vi t b ng cc ngn ng ny c th ch y m khng c n qua chng trnh d ch. Cc ngn ng b c th p c th dng vi t nh ng chng trnh c n t i u ha v t c . Tuy nhin, chng th ng kh hi u i v i con ng i v khng thu n ti n cho vi c l p trnh. Ngn ng l p trnh b c cao nh Pascal, Ada, C, C++, Java, Visual Basic, Python, l cc ngn ng c m c tr u t ng ha cao, g n v i ngn ng t nhin c a con ng i hn. Vi c s d ng cc ngn ng ny cho vi c l p trnh do d dng hn v nhanh hn r t nhi u so v i ngn ng l p trnh b c th p. Khc v i ngn ng b c th p, chng trnh vi t b ng cc ngn ng b c cao ni chung c th s d ng c trn nhi u lo i my tnh khc nhau. Cc chng trnh vi t b ng m t ngn ng b c cao mu n ch y c th ph i c d ch sang ngn ng my b ng cch s d ng chng trnh d ch. Chng trnh d ch c th chia ra thnh hai lo i l trnh bin d ch v trnh thng d ch. M t s ngn ng b c cao nh C, C++ yu c u lo i chng trnh d ch c g i l trnh bin d ch (compiler). Trnh bin d ch d ch m ngu n thnh m my d ng c th th c thi c. K t qu c a vi c d ch l m t chng trnh th c thi c v c th ch y nhi u l n m khng c n d ch l i. V d , v i ngn ng C++ 10

m t trnh bin d ch r t ph bi n l gcc/g++ trong b GNU Compiler Collection (GCC) ch y trong cc mi tr ng Unix/Linux cng nh Windows. Ngoi ra, Microsoft Visual C++ l trnh bin d ch C++ ph bi n nh t trong mi tr ng Windows. M t s ngn ng b c cao khc nh Perl, Python yu c u lo i chng trnh d ch g i l trnh thng d ch (interpreter). Khc v i trnh bin d ch, thay v d ch ton b chng trnh m t l n, trnh thng d ch v a d ch v a ch y chng trnh, d ch n u ch y chng trnh n . Trong mn h c ny, C++ c ch n lm ngn ng th hi n. y l m t trong nh ng ngn ng l p trnh chuyn nghi p c s d ng r ng ri nh t trn th gi i. Trong ph m vi nh p mn c a mn h c ny, C++ ch c gi i thi u m c r t c b n, r t nhi u tnh nng m nh c a C++ s khng c ni n ho c ch c gi i thi u s qua. Ng i h c nn ti p t c tm hi u v ngn ng C++, v t ra ngoi gi i h n c a cu n sch ny.

1.4. Mi tr ng l p trnh b c cao


l p trnh gi i quy t m t bi ton b ng ngn ng l p trnh b c cao, b n c n c cng c chnh l: chng trnh so n th o, chng trnh d ch dnh cho ngn ng s d ng, v cc th vi n chu n c a ngn ng s d ng (standard library), v chng trnh tm l i (debugger). Cc b c c b n xy d ng v th c hi n m t chng trnh:

1. So n th o: M ngu n chng trnh c vi t b ng m t ph n m m so n th o vn b n d ng text v lu trn a. Ta c th dng nh ng ph n m m so n th o vn b n n gi n nh t nh Notepad (trong mi tr ng Windows) hay vi (trong mi tr ng Unix/Linux), ho c cc cng c so n th o trong mi tr ng tch h p vi t m ngu n chng trnh. M ngu n C++ th ng t trong cc t p v i tn c ph n m r ng l .cpp, cxx, .cc, ho c .C (vi t hoa). 2. D ch: Dng trnh bin d ch d ch m ngu n chng trnh ra thnh cc o n m my ring l (g i l object code) lu trn a. Cc trnh bin d ch ph bi n cho C++ l vc.exe trong b Microsoft Visual Studio hay gcc trong b GNU Compiler v i cc tham s thch h p d ch v lin k t t o ra t p ch y c. V i C++, ngay tr c khi d ch cn c giai o n ti n x l (preprocessing) khi cc nh h ng ti n x l c th c thi lm cc thao tc nh b sung cc t p vn b n c n d ch hay thay th m t s chu i vn b n. M ts nh h ng ti n x l quan tr ng s c gi i thi u d n trong cu n sch ny. 11

3. Lin k t: M t t p m ngu n th ng khng ch a y nh ng ph n c n thi t cho m t chng trnh hon ch nh. N th ng dng n d li u ho c hm c nh ngha trong cc t p khc ho c trong th vi n chu n. Trnh lin k t (linker) k t n i cc o n m my ring l v i nhau v v i cc th vi n c s n t o ra m t chng trnh m my hon ch nh ch y c. 4. N p: Trnh n p (loader) s n p chng trnh d i d ng m my vo b nh . Cc thnh ph n b sung t th vi n cng c n p vo b nh . 5. Ch y: CPU nh n v th c hi n l n l t cc l nh c a chng trnh, d li u v k t qu th ng c ghi ra mn hnh ho c a. Th ng th khng ph i chng trnh no cng ch y c v ch y ng ngay l n ch y th u tin. Chng trnh c th c l i c php nn khng qua c b c d ch, ho c chng trnh d ch c nhng g p l i trong khi ch y. Trong nh ng tr ng h p , l p trnh vin ph i quay l i b c so n th o s a l i v th c hi n l i cc b c sau .

Hnh 1.2: Cc b c c b n

xy d ng m t chng trnh.

thu n ti n cho vi c l p trnh, cc cng c so n th o, d ch, lin k t, ch y... ni trn c k t h p l i trong m t mi tr ng l p trnh tch h p (IDE integrated development environment), trong , t t c cc cng o n i v i ng i dng ch cn l vi c ch y cc tnh nng trong m t ph n m m duy nh t. IDE r t h u ch cho cc l p trnh vin. Tuy nhin, i v i nh ng ng i m i h c l p trnh, th i gian u nn t th c hi n cc b c d ch v ch y chng trnh thay v thng qua cc ch c nng c a IDE. Nh v y, ng i h c s c th n m c b n ch t cc b c c a qu trnh xy d ng chng trnh, hi u c b n 12

ch t v c th .

c i m chung c a cc IDE, trnh tnh tr ng b ph thu c vo m t IDE

V d v cc IDE ph bi n l Microsoft Visual Studio mi tr ng l p trnh thng m i cho mi tr ng Windows, v Eclipse ph n m m mi n ph v i cc phin b n cho c mi tr ng Windows cng nh Unix/Linux, c hai u h tr nhi u ngn ng l p trnh. Dnh cho C++, m t s mi tr ng l p trnh tch h p ph bi n l Microsoft Visual Studio, Dev-C++, Code::Blocks, KDevelop. M i mi tr ng c th h tr m t ho c nhi u trnh bin d ch. Ch ng h n Code::Blocks h tr c GCC v MSVC Do C++ c cc phin b n khc nhau. C nh ng b n ci t khc nhau c a C++. Cc b n ra i tr c chu n C++ 1998 (ISO/IEC 14882) c th khng h tr y cc tnh nng c c t trong chu n ANSI/ISO 1998. B n C++ do Microsoft pht tri n khc v i b n C++ c a GNU. Tuy nhin, cc trnh bin d ch hi n i h u h t h tr C++ chu n, ta cng nn ch n dng cc ph n m m ny. Ngn ng C++ c dng trong cu n sch ny tun theo chu n ISO/IEC 14882, cn g i l "C++ thu n ty" (pure C++).

1.5. L i v tm l i
Trong v sau qu trnh l p trnh, chng ta ph i ti n hnh ki m th v s a l i chng trnh. C ba lo i l i th ng g p: l i c php, l i run-time v l i l-gic. L i c php l do l p trnh vin vi t sai v i cc quy t c c php c a ngn ng l p trnh, ch ng h n thi u d u ch m ph y cu i l nh. Chng trnh bin d ch s pht hi n ra cc l i c php v cung c p thng bo v v tr m n cho l c l i. N u trnh bin d ch ni r ng chng trnh c l i c php th ch c ch n l c l i c php trong chng trnh. Tuy nhin, l i l ch no th trnh bin d ch ch c th on, v n c th on sai. L i run-time l l i xu t hi n trong khi chng trnh ang ch y. L i d ng ny s gy ra thng bo l i v ng ng chng trnh. V d l khi chng trnh th c hi n php chia cho 0. L i l-gic c nguyn nhn l do thu t ton khng ng, ho c do l p trnh vin g p sai st khi th hi n thu t ton b ng ngn ng l p trnh (v d vi t nh m d u c ng thnh d u tr ). Khi c l i l-gic, chng trnh c a b n c th d ch v ch y bnh th ng, nhng k t qu c a chng trnh a ra l i c tr ng h p sai ho c

13

ho t ng c a chng trnh khng nh mong ra nh t.

i. L i l-gic l lo i l i kh tm

N u chng trnh c a b n d ch v ch y khng pht sinh thng bo l i, th m ch chng trnh cho ra k t qu c ng v i m t vi b d li u test, i u khng c ngha chng trnh c a b n hon ton khng c l i. c th ch c ch n hn v tnh ng n c a chng trnh, b n c n ch y th chng trnh v i nhi u b d li u khc nhau v so snh k t qu m chng trnh t o ra v i k t qu mong i.

1.6. L ch s C v C++
Ngn ng l p trnh C c t o ra b i Dennis Ritchie (phng th nghi m Bell) v c s d ng pht tri n h i u hnh UNIX. M t trong nh ng c i m n i b t c a C l c l p v i ph n c ng (portable), t c l chng trnh c th ch y trn cc lo i my tnh v cc h i u hnh khc nhau. Nm 1983, ngn ng C c chu n ha v c g i l ANSI C b i Vi n chu n ha qu c gia Hoa K (American National Standards Institute). Hi n nay ANSI C v n l ngn ng l p trnh chuyn nghi p v c s d ng r ng ri pht tri n cc h th ng tnh ton hi u nng cao. Ngn ng l p trnh C++ do Bjarne Stroustrup (thu c phng th nghi m Bell) pht tri n trn n n l ngn ng l p trnh C v c m h ng chnh t ngn ng l p trnh Simula67. So v i C, C++ l ngn ng an ton hn, kh nng di n t cao hn, v t i h i cc k thu t b c th p. Ngoi nh ng th m nh th a k t C, C++ h tr tr u t ng ha d li u, l p trnh h ng i t ng v l p trnh t ng qut, C++ gip xy d ng d dng hn nh ng h th ng l n v ph c t p. B t u t phin b n u tin nm 1979 v i ci tn "C with Classes" (C km l p i t ng)1 v i cc tnh nng c b n c a l p trnh h ng i t ng, C++ c pht tri n d n theo th i gian. Nm 1983, ci tn "C++" chnh th c ra i, cc tnh nng nh hm o (virtual function), hm trng tn v nh ngha l i ton t (overloading), h ng ... c b sung. Nm 1989, C++ c thm l p tr u t ng, a th a k , hm thnh vin tnh, h ng hm, v thnh vin ki u protected. Cc b sung cho C++ trong th p k sau l khun m u (template), khng gian tn (namespace), ngo i l (exception), cc ton t i ki u d li u m i, v ki u d

Theo l i k c a Bjarne Stroustrup t i trang c nhn c a ng t i trang web c a phng th nghi m AT&T http://www2.research.att.com/~bs/bs_faq.html#invention

14

li u Boolean. Nm 1998, l n u tin C++ c chnh th c chu n ha qu c t b i t ch c ISO, k t qu l chu n ISO/IEC 148822. i km v i s pht tri n c a ngn ng l s pht tri n c a th vi n chu n C++. Bn c nh vi c tch h p th vi n chu n truy n th ng c a C v i cc s a i nh cho ph h p v i C++, th vi n chu n C++ cn c thm th vi n stream I/O ph c v vi c vo ra d li u d ng dng. Chu n C++ nm 1998 tch h p thm ph n l n th vi n STL (Standard Template Library th vi n khun m u chu n)3. Ph n ny cung c p cc c u trc d li u r t h u ch nh vector, danh sch, v cc thu t ton nh s p x p v tm ki m. Hi n nay, C++ l m t trong cc ngn ng l p trnh chuyn nghi p c s d ng r ng ri nh t.

1.7. Chng trnh C++

u tin

Chng trnh n gi n trong Hnh 1.3 s hi n ra mn hnh dng ch Hello world!. Trong chng trnh c nh ng c i m quan tr ng c a C++. Ta s xem xt t ng dng.

Vn b n ny (ISO/IEC 14882:1998) sau c pht hi n l i ch nh s a vo nm 2003, thnh phin b n ISO/IEC 14882:2003. STL v n khng n m trong th vi n chu n m l m t th vi n ring do HP v sau l SGI pht tri n.

15

Hnh 1.3: Chng trnh C++

u tin.

Hai dng u tin b t u b ng chu i // l cc dng ch thch chng trnh. l ki u ch thch dng n. Cc dng ch thch khng gy ra ho t ng g c a chng trnh khi ch y, trnh bin d ch b qua cc dng ny. Ngoi ra cn c d ng ch thch ki u C dng chu i /* v */ nh d u i m b t u v k t thc ch thch. Cc l p trnh vin dng ch thch gi i thch v gi i thi u v n i dung chng trnh. Dng th ba, #include <iostream> l m t nh h ng ti n x l (preprocessor directive) ch d n v m t cng vi c m trnh bin d ch c n th c hi n tr c khi d ch chng trnh. #include l khai bo v th vi n s c s d ng trong chng trnh, trong tr ng h p ny l th vi n vo ra d li u iostream trong th vi n chu n C++. Ti p theo l hm main, ph n khng th thi u c a m i chng trnh C++. N b t u t dng khai bo header c a hm:
int main()

M i chng trnh C++ th ng bao g m m t ho c nhi u hm, trong c ng m t hm c tn main, y l ni chng trnh b t u th c hi n v k t thc. Bn tri t main l t kha int, n c ngha l hm main s tr v m t gi tr l s nguyn. T kha l nh ng t c bi t m C++ dnh ring cho nh ng m c

16

ch c th . Chng 4 s cung c p thng tin chi ti t v khi ni m hm v vi c hm tr v gi tr . Thn hm main c b t u v k t thc b i c p ngo c {}, bn trong l chu i cc l nh m khi chng trnh ch y chng s c th c hi n tu n t t l nh u tin cho n l nh cu i cng. Hm main trong v d ang xt c ch a hai l nh. M i l nh u k t thc b ng m t d u ch m ph y, cc nh h ng ti n x l th khng. L nh th nh t g m cout, ton t <<, xu k t "Hello world!", v d u ch m ph y. N ch th cho my tnh th c hi n m t nhi m v : in ra mn hnh chu i k t n m gi a hai d u nhy kp "Hello world!". Khi l nh c th c thi, chu i k t Hello world s c g i cho cout lu ng d li u ra chu n c a C++, th ng c n i v i mn hnh. Chi ti t v vo ra d li u s c ni n trong Chng 8. Chu i k t n m gi a hai d u nhy kp c g i l m t xu k t (string). dng
using namespace std;

n m g n u chng trnh. T t c thnh ph n c a th vi n chu n C++, trong c cout c dng n trong hm main, c khai bo trong m t khng gian tn (namespace) c tn l std. Dng trn thng bo v i trnh bin d ch r ng chng trnh v d c a ta s s d ng n m t s thnh ph n n m trong khng gian tn std. N u khng c khai bo trn, ti n t std:: s ph i i km theo tn c a t t c cc thnh ph n c a th vi n chu n c dng trong chng trnh, ch ng h n cout s ph i c vi t thnh std::cout. Chi ti t v khng gian tn n m ngoi ph m vi c a cu n sch ny, ng i c c th tm hi u t i cc ti li u [1] ho c [2]. N u khng c lu c bi t th t t c cc chng trnh v d trong cu n sch ny u s d ng khai bo s d ng khng gian tn std nh trn. L nh th hai nh y ra kh i hm v tr v gi tr 0 lm k t qu c a hm. y l b c c tnh ch t quy trnh do C++ quy nh hm main c n tr l i m t gi tr l s nguyn cho bi t tr ng thi k t thc c a chng trnh. Gi tr 0 c tr v cu i hm main c ngha r ng hm k t thc thnh cng. r ng t t cc l nh n m bn trong c p ngo c {} c a thn hm u c li u dng m t m c. V i C++, vi c ny khng c ngha v c php. Tuy nhin, n l i gip cho c u trc chng trnh d th y hn v chng trnh d hi u hn i v i ng i l p trnh. y l m t trong cc i m quan tr ng trong cc quy c v phong cch l p trnh. Ph l c A s h ng d n chi ti t hn v cc quy c ny. 17

n y ta c th s a chng trnh trong Hnh 1.3 in ra l i cho "Hello world!" theo cc cch khc nhau. Ch ng h n, ta c th in ra cng m t n i dung nh c nhng b ng hai l nh g i cout:
cout << "Hello "; cout << "world!";

ho c in ra l i cho trn nhi u dng b ng cch chn vo gi a xu k t cc k t xu ng dng (k t c bi t c k hi u l \n):


cout << "Hello \n world!\n";

Ph l c B h ng d n v cch s d ng b cng c GNU C++ chng trnh.

d ch v ch y

18

Bi t p
1. Trnh by cc b c chnh gi i quy t m t bi ton. Phn tch n i dung v c i m chnh c a t ng b c. 2. T i sao c n ph i c chng trnh d ch, s khc bi t gi a trnh bin d ch v trnh thng d ch? Li t k cc ngn ng l p trnh c n c trnh bin d ch, v cc ngn ng l p trnh c n c trnh thng d ch. 3. S khc bi t, u i m v nh c i m gi a ngn ng l p trnh b c cao v ngn ng l p trnh b c th p? Nu m t v d m nn s d ng ngn ng l p trnh b c th p gi i quy t, v m t v d m nn s d ng ngn ng l p trnh b c cao gi i quy t. 4. Trnh by cc ngn ng l p trnh b c th p m b n bi t, nu ra cc i m n i b t c a t ng ngn ng l p trnh . 5. Trnh by cc ngn ng l p trnh b c cao m b n bi t, nu ra cc i m n i b t c a t ng ngn ng l p trnh . c c

6. Trnh by s khc bi t, u i m v nh c i m gi a ngn ng l p trnh C v C++. 7. Trnh by cc lo i l i th ng g p khi l p trnh. Phn tch t ng lo i l i trn. c i mc a

8. Trnh by 5 v d v l i logic m b n c th g p trong l p trnh. 9. Lm quen v i mi tr ng l p trnh Dev-C++. Li t k ra cc ch c nng chnh c a mi tr ng Dev-C++. Tm hi u v so snh cc mi tr ng l p trnh khc cho C v C++. 10. Vi t m t chng trnh C++ hi n ra mn hnh tn c a b n. S d ng bin d ch dng l nh b ng b cng c GNU C++ d ch v ch y chng trnh.

19

Chng 2. Bi n, ki u d li u v cc php ton


a s chng trnh khng ch c nh ng ho t ng n gi n nh l hi n th m t xu k t ra mn hnh m cn ph i thao tc v i d li u. Trong m t chng trnh, bi n l tn c a m t vng b nh c dng lu d li u trong khi chng trnh ch y. D li u lu trong m t bi n c g i l gi tr c a bi n . Chng ta c th truy nh p, gn hay thay i gi tr c a cc bi n, khi bi n c gn m t gi tr m i, gi tr c s b ghi ln.
#include <iostream> using namespace std; int total pples; int main() { int number f askets int apple er asket;
Khai bo bi n a phng numberOfBaskets sau gn gi tr 5 cho n Khai bo bi n ton c c totalApples ki u int

cout << " nter number apples per baskets: "; cin >> apple er asket; Gn gi tr nh p t bn phm cho bi n applePerBasket total pples number f askets apple er asket; cout << " umber of apples is " << total pples; return } ;

Hnh 2.1: Khai bo v s d ng bi n.

Hnh 2.1 minh h a vi c khai bo v s d ng bi n. Trong , cc dng


int total pples; int number f askets int apple er asket; ;

khai bo bi n. total pples, number f askets, v apple er asket l cc tn bi n. Cc khai bo trn c ngha r ng total pples, number f askets, v apple er asket l d li u thu c ki u int, ngha l cc bi n ny s gi gi tr ki u nguyn. Dng khai bo number f askets c m t i m khc v i hai dng cn l i, l number f askets c kh i t o v i gi tr 5. C++ quy nh r ng t t c cc bi n u ph i c khai bo v i m t ci tn l cc dng

20

v m t ki u d li u tr c khi bi n c s d ng. Cc bi n thu c cng m t ki u c th c khai bo trn cng m t dng, cch nhau b i m t d u ph y. Ch ng h n, c th thay hai dng khai bo cho number f askets, v apple er asket b ng:
int number f askets , apple er asket;

Chng trnh trong Hnh 2.1 yu c u ng i dng nh p s to trong m i gi (apple er asket), tnh t ng s to (total pples) v i d ki n bi t l s gi to (number f asket), r i in ra mn hnh. C th , dng
cout << " nter number apples per baskets: ";

in ra mn hnh xu k t nter number apples per baskets: . l l i m i nh p d li u, l h ng d n dnh cho ng i s d ng chng trnh. Dng ti p theo
cin >> apple er asket;

c d li u c ng i dng nh p vo t u vo chu n th ng l t bn phm. Khi ch y l nh ny, chng trnh s i ng i dng nh p vo m t gi tr cho bi n apple er asket. Ng i dng p ng b ng cch g vo m t s nguyn d i d ng chu i cc ch s r i nh n phm Enter g i cc ch s cho my tnh. n l t n, my tnh bi n i chu i cc ch s n nh n c thnh m t gi tr ki u nguyn r i chp gi tr ny vo bi n apple er asket. Tng ng v i cout l i t ng qu n l dng d li u ra chu n c a th vi n C++, cin l i t ng qu n l dng d li u vo chu n, th ng l t bn phm. Ti p theo l l nh gn
total pples number f askets apple er asket;

L nh ny tnh tch gi tr c a hai bi n number f askets v apple er asket r i gn k t qu cho bi n total pples, trong l k hi u c a php nhn v l k hi u c a php gn. L nh in k t qu ra mn hnh
cout << " umber of apples is " << total pples;

hi n th lin ti p hai thnh ph n: xu k t " umber of apples is " v gi tr c a bi n total pples.

21

Ngoi vi c in gi tr c a m t bi n, C++ cn cho php ta in k t qu c a m t bi u th c. Do , ta c m t l a ch n khc l g p cng vi c c a hai l nh trn (tnh tch hai bi n v in tch ra mn hnh) vo m t l nh:
cout << " umber of apples is " << number f askets apple er asket;

Khi , bi n total pples v n c dng lu tr k t qu c a php tnh tr nn khng cn c n thi t, ta c th xa b dng khai bo bi n ny. l l nh trn di v chi m c sang dng th hai. C++ cho php m t l nh n m trn nhi u dng, d u ch m ph y cu i m i l nh s gip trnh bin d ch hi u u l k t thc c a l nh.

2.1. Ki u d li u
M i bi n ph i c khai bo lu gi gi tr thu c m t ki u d li u no . Ngn ng l p trnh b c cao th ng c hai lo i ki u d li u: cc ki u d li u c b n v cc ki u d li u d n xu t. 2.1.1. Ki u d li u c b n Ki u d li u c b n l ki u d li u do ngn ng l p trnh nh ngha s n. V d nh cc ki u s nguyn char, int, long int. Bi n thu c ki u nguyn c dng lu cc s c gi tr nguyn. i v i ki u c b n chng ta th ng quan tm n kch th c b nh c a ki u d li u, gi i h n gi tr m ki u d li u c th lu gi . i v i cc ki u d u ch m ng (floating-point) lu cc gi tr thu c ki u s th c, chng ta cn quan tm n chnh xc c a ki u d li u . Ti li u chu n C++ khng quy nh chnh xc s byte c n dng lu cc bi n thu c cc ki u d li u c b n trong b nh m ch quy nh yu c u v kch th c c a ki u d li u ny so v i ki u d li u kia. Cc ki u nguyn c d u, signed char, short int, int v long int, ph i c kch th c tng d n. M i ki u nguyn c d u tng ng v i m t ki u nguyn khng d u v i cng kch th c. Cc ki u nguyn khng d u khng th bi u di n gi tr m nhng c th bi u di n s gi tr dng nhi u g p i ki u c d u tng ng. Tng t , cc ki u ch m ng, float, double v long double cng ph i c kch th c tng d n. B ng 2.1 li t k m t s ki u d li u c b n c a C++ v i kch th c c nhi u b n ci t C++ s d ng.

22

Ki u

M t

Kch th c thng d ng (byte)

Ph m vi (tng ng v i kch th c)

char

k t / s nguyn nh gi tr Boolean s nguyn

cc k t ASCII signed char: -128 127, ho c unsighed char: 0 255 true ho c false signed short: -32767 32767 unsigned short: 0 65536 signed int: 2147483648 2147483647 unsigned int: 0 -4294967296 signed long: 2147483648 2147483647 unsigned long: 0 -4294967296

bool short

1 2

int

s nguyn l n s nguyn r tl n s th c s th c v i chnh xc cao s th c v i chnh xc r t cao

long float double

4 4 8

+/- 1.4023x10-45 3.4028x10+38 +/- 4.9406x10-324 1.7977x10308

long double

+/- 4.9406x10-324 1.7977x10308

B ng 2.1: M t s ki u d li u c b n trong C++.

M t s lu : Kch th c v ph m vi c a cc ki u d li u c b n ph thu c vo h th ng m chng trnh c bin d ch t i . Tuy nhin, t t c cc h th ng, ki u char bao gi cng c kch th c l 1 byte; cc ki u d li u char, short, int, long ph i c kch th c tng d n; cn cc ki u float, double, long double ph i c chnh xc cao d n. Ki u char dng lu cc k t n (c m nh hn 256), ch ng h n nh ch ci La-tinh, ch s , hay cc k hi u. Trong C++, m t k t n c ng trong c p nhy n, v d ' '. lu cc k t c m l n hn 255, ta c th s d ng ki u wchar_t. 23

Ki u d li u bool ch c hai gi tr true v false. Ta c th dng bi n thu c ki u ny lu cu tr l i c a nh ng cu h i ng/sai ch ng h n nh "C ph i index l n hn 100?" hay lu cc tr ng thi "Ta tm th y gi tr m cha?". Cc gi tr true v false trong C++ th c ra ch l 0 v 1. 2.1.2. Ki u d li u d n xu t Ki u d li u d n xu t l ki u d li u c xy d ng t cc ki u d li u c b n b ng cc ton t nh * (con tr ), & (tham chi u), [] (m ng), () hm, ho c c nh ngha b ng c ch struct hay class. Cc ki u d li u c nh ngha b ng c ch struct hay class cn c g i l cc ki u d li u c c u trc ho c ki u d li u tr u t ng. Chi ti t v cc ki u d li u d n xu t s c trnh by d n d n trong cc chng sau.

2.2. Khai bo v s d ng bi n
b t u s d ng m t bi n, chng ta ph i ti n hnh hai b c: m t ci tn h p l v khai bo bi n. 2.2.1. nh danh v cch t tn bi n t cho bi n

nh danh (identifier) l thu t ng trong ngn ng l p trnh khi ni n tn (tn bi n, tn hm, tn l p). nh danh l m t chu i k t (bao g m cc ch ci a..z, A..Z, ch s 0..9, d u g ch chn _) vi t li n nhau. nh danh khng c b t u b ng ch s v khng c trng v i cc t kha (nh ng t mang ngha c bi t) c a ngn ng l p trnh. Lu , C++ phn bi t ch ci hoa v ch ci th ng. Cch t tn bi n tun th theo cch t tn nh danh. V d v cc tn bi n:

_sinhvien, sinhvien_ 1, sinhVien_ 1 l cc tn bi n h p l khc nhau


1sinhvien, sinhvin, "sinhvien" l cc tn bi n khng h p l

Tn bi n nn d c, v g i nh n cng d ng c a bi n hay ki u d li u m bi n s lu tr . V d , n u c n dng m t bi n lu s l ng qu to, ta c th t tn l total pples. Khng nn s d ng cc tn bi n ch g m m t k t v khng c ngha nh a hay b.

24

2.2.2. Khai bo bi n Cc ngn ng l p trnh nh ki u m nh, trong c C++, yu c u m i bi n tr c khi dng ph i c khai bo v bi n ph i thu c v m t ki u d li u no . C th chia cc bi n thnh hai lo i: cc bi n c khai bo ngoi t t c cc chng trnh con l bi n ton c c, c hi u l c trn ton b chng trnh, ch ng h n bi n total pples trong Hnh 2.1. cc bi n c khai bo t i m t chng trnh con l bi n a phng, c hi u l c bn trong chng trnh con , ch ng h n number f askets v apple er asket trong Hnh 2.1 l cc bi n a phng c a hm main v ch c hi u l c bn trong hm main. Chng 4 s ni k hn v hai lo i bi n trn. Trong C++, bi n c th c khai bo g n nh b t c u trong chng trnh, mi n l tr c dng u tin s d ng n bi n (xem Hnh 2.1). M t bi n a phng c khai bo nhng cha c gn m t gi tr no c g i l bi n cha c kh i t o. Gi tr c a bi n cha c kh i t o th ng l khng xc nh. trnh tnh tr ng ny, ta c th kh i t o gi tr c a cc bi n b ng cch gn gi tr ngay t i l nh khai bo bi n.

2.3. H ng
H ng l m t lo i bi n c bi t m gi tr c a n c xc nh t i th i i m khai bo v khng c thay i trong su t chng trnh. khai bo m t h ng, ta thm t kha const vo pha tr c l nh khai bo bi n. V d :
const float I const float SCR 3.141 926 3 ; _WIDTH 317.24;

H ng c dng t tn cho cc gi tr khng thay i c dng trong chng trnh, ch ng h n nh r ng mn hnh nh trong v d trn. Cng d ng c a h ng l m i khi c n thay i gi tr , ta ch c n s a l nh khai bo h ng thay v tm v s a gi tr tng ng t i t t c cc v tr dng n n. Ngoi ra, m t ci tn c ngha t cho m t gi tr c dng i dng l i s gip cho chng trnh d c v d hi u hn.

25

2.4. Cc php ton c b n


2.4.1. Php gn Php gn l cch g n m t gi tr cho m t bi n ho c thay bi n. L nh gn trong C++ l: bi n = bi u th c; trong d u b ng (=) c g i l d u gn hay ton t gn. Lu , d u b ng trong C++ khng dng so snh gi tr nh trong m t s ngn ng l p trnh khc. V d
symbol ' ';

i gi tr c a m t

l php gn gi tr A cho bi n symbol, khng ph i l bi u th c so snh xem gi tr c a symbol c ph i l 'A' hay khng. Cng vi c c a php gn l tnh gi tr c a bi u th c bn ph i d u gn r i lu gi tr vo trong bi n n m bn tri d u gn. Bi u th c c th l m t s , m t bi n, ho c m t bi u th c ph c t p. Lu r ng m t bi n c th xu t hi n c hai bn c a d u gn. V d l nh sau tng gi tr c a bi n apples thm 2.
apples apples + 2;

i m c bi t c a C++ l b n thn php gn cng chnh l m t bi u th c v i gi tr tr v l k t qu c a php gn. V d , php gn x = 3 l m t bi u th c c gi tr b ng 3. 2.4.2. Cc php ton s h c C++ h tr nm php ton s h c sau: + (c ng), - (tr ), (nhn), / (chia), % (modulo l y ph n d c a php chia). Php chia c th c hi n cho hai gi tr ki u nguyn s cho k t qu l thng nguyn. V d bi u th c 4 / 3 cho k t qu b ng 1, cn 3 / 5 cho k t qu b ng 0. M t s php gn km theo bi u th c xu t hi n nhi u l n trong m t chng trnh, v v y C++ cho php vi t cc php gn bi u th c m t cch g n ng n hn, s d ng cc php gn ph c h p (+ , - , , / , % , >> , << , & , ^ , | ). Cch s d ng php gn ph c h p + nh sau: bi n += bi u th c; tng ng bi n = bi n + bi u th c; 26

V d :
apples + 2; tng ng apples apples + 2;

Cc php gn ph c h p khc c s d ng tng t . C++ cn cung c p cc php ton ++ (hay --) m t n v . V d : tng (gi m) gi tr c a bi n ln

apples++ hay ++apple c tc d ng tng apples thm 1 n v apples-- hay --apple c tc d ng gi m apples i 1 n v

Khc bi t gi a vi c vi t php tng/gi m tr c bi n (tng/gi m tr c) v vi t php tng/gi m sau bi n (tng/gi m sau) l th i i m th c hi n php tng/gi m, th hi n gi tr c a bi u th c. Php tng/gi m tr c c th c hi n tr c khi bi u th c c tnh gi tr , cn php tng/gi m sau c th c hi n sau khi bi u th c c tnh gi tr . V d , n u apples v n c gi tr 1 th cc bi u th c ++apples hay apples++ u c hi u ng l apples c tng t 1 ln 2. Tuy nhin, ++apples l bi u th c c gi tr b ng 2 (tng apples tr c tnh gi tr ), trong khi apples++ l bi u th c c gi tr b ng 1 (tng apples sau khi tnh gi tr bi u th c). N u ta ch quan tm n hi u ng tng hay gi m c a cc php ++ hay th vi c php ton c t tr c hay t sau khng quan tr ng. cng l cch dng ph bi n nh t c a cc php ton ny. Lu , c n h t s c c n th n khi s d ng cc php tng v gi m trong cc bi u th c. Vi c ny khng c khuy n khch v tuy n c th ti t ki m c m t hai dng l nh nhng l i lm gi m tnh trong sng c a chng trnh. 2.4.3. Cc php ton quan h so snh gi tr hai bi u th c. Cc php Cc php ton quan h c s d ng ton ny cho k t qu b ng 0 n u ng v khc 0 n u sai. Ta s d ng gi tr c a m t bi u th c quan h nh l m t gi tr thu c ki u bool. V d :
bool enough pples (total pples > 1 );

Cc php ton quan h trong ngn ng C++ c li t k trong B ng 2.2.

27

K hi u ton h c
> <

Ton t c a C++
> < > < !

V d
x > y x < y x > y x < x x ! y y y

ngha
x l n hn y x nh hn y x l n hn ho c b ng y x nh hn ho c b ng y x b ng y x khc y

B ng 2.2: Cc php ton quan h .

Ch trnh nh m l n gi a php gn gi tr v php so snh b ng . Nh ng nh m l n gi a cc php ton ki u ny th ng d n n nh ng l i lgic r t kh pht hi n. 2.4.4. Cc php ton l-gic
Ton t C++
&

ngha and

V d
x && y

ngha c a v d Cho gi tr ng khi c x v y ng, ng c l i cho gi tr sai. Cho gi tr ng khi ho c x ng ho c y ng, ng c l i cho gi tr sai Ph nh c a x. Cho gi tr cho gi tr sai khi x ng ng khi x sai;

||

or

x || y

not

!x

B ng 2.3: Cc php ton l-gic.

Cc php ton l-gic dnh cho cc ton h ng l cc bi u th c quan h ho c cc gi tr bool. K t qu c a bi u th c lgic l gi tr bool. V d :
bool enough pples (apples > 3) && (apples < 1 );

c k t qu l bi n enough pples nh n gi tr l cu tr l i c a cu h i "bi n apples c gi tr l n hn 3 v nh hn 10 hay khng?". 2.4.5. u tin c a cc php ton u tin c a m t s php ton th ng g p. Th t c a chng

D i y l m c nh sau:

28

Cc php ton n m trong c p d u ngo c ( ) c 2 * (1 + 3) cho k t qu b ng 8 Cc php ton , /, +, -. Trong , / c V d : 2 * 1 + 3 cho k t qu l 5 Cc php ton so snh <, >, <=, >=. V d : 3 + 4 < 2 + 6 cho k t qu ng

u tin l n nh t. V d :

u tin nh nhau v cao hn +, -.

Cc php ton l-gic c th th t u tin nh sau: !, &&, ||. V d : 1 || 0 && 0 tng ng v i 1 || (0 && 0) v cho k t qu 1 2.4.6. Tng thch gi a cc ki u V c b n, gi tr gn cho m t bi n nn cng ki u v i bi n . Khi m t bi n c gn m t gi tr khng ng v i ki u d li u c a bi n , th gi tr s c chuy n i sang ki u c a bi n (type conversion). M t vi tr ng h p th ng g p trong vi c chuy n ki u l: Chuy n i gi a s th c v s nguyn
// x nh n gi tr 2 // y nh n gi tr 3, // x nh n gi tr 3

int x 2. ; double y 3. ; x y;

Php chia c a s nguyn


int divisor 4; int dividend 6; int quo dividend/divisor;

// quo nh n gi tr

1.

Lu : Php chia m t s nguyn cho m t s nguyn s cho k t qu l m t s nguyn. Mu n k t qu l m t s th c th t nh t m t trong hai s ph i l s th c.

29

Bi t p
1. Vi t chng trnh tnh di n tch c a m t hnh trn. Bn knh l m t s th c v c nh p vo t bn phm. Di n tch hnh trn c hi n ra mn hnh. 2. Nh p t bn phm hai s nguyn l chi u cao c a Peter v Essen. Hy tnh xem Peter cao g p bao nhiu l n Essen. V d , n u chi u cao c a Peter l 180, chi u cao c a Essen l 150, th hi n ra mn hnh dng ch Peter is 1.2 times as tall as Essen. 3. Nh p t bn phm m t s nguyn l nhi t hy hi n ra mn hnh nhi t d i d ng hi u cng th c chuy n i. d i d ng F (Fahrenheit), C (Celsius). Sinh vin t tm

4. Vi t m t chng trnh trong c hai h ng s WIDTH v i gi tr b ng 3.17654, v h ng s LENGTH v i gi tr b ng 10.03212. Tnh v hi n ra mn hnh di n tch c a hnh ch nh t v i hai c nh l WIDTH v LENGTH. 5. Nh p t bn phm b n s nguyn a, b, c, d. Hy tnh v hi n ra mn hnh gi tr c a bi u th c: (a + b) > (c + d) || (a - b) > (c - d) 6. Trnh by s khc bi t gi a bi n a phng v bi n ton c c. Khi no th nn dng bi n a phng, khi no th nn dng bi n ton c c. Nu cc lu y khi s d ng bi n ton c c. 7. Vi t m t chng trnh c ch a hai bi n: bi n a phng bonus v bi n ton c c score. Nh p gi tr hai bi n t bn phm, tnh v hi n ra mn hnh t ng c a score v bonus. 8. Hy tnh (khng dng chng trnh) gi tr c a cc bi u th c sau: a) 1 + 3 < 2 * 4 1 && 1 b) 2 * 2 1 + 5 / 1 & 4 3 c) (2 3 * 1) && 0 / 5 * 2 + 1 9. Tnh gi tr c a bi n c t o n chng trnh sau:

a) int a = 3; int b = 2; int c = a/b; b) double a = 3.1; int b = 2; int c = a/b;

30

c) int a = 3; int b = 2; double c = a/b; 10. Nh p hai s nguyn dng x v y t bn phm, hy tnh: a) Thng c a php ton x chia cho y b) Tch c a php ton x nhn y c) Ph n nguyn c a x chia cho y d) Ph n d c a x chia cho y 11. Nh p t bn phm 3 s th c x, y, v z. Hy tnh a) Trung bnh c ng c a ba s trn b) Hi n ra mn hnh s 1 n u x l s l n nh t trong ba s trn, ng c l i hi n ra mn hnh s 0. c) Hi n ra mn hnh s 1 n u z l s nh trong ba s trn, ng c l i hi n ra mn hnh s 0. 12. Tnh gi tr (khng dng chng trnh) c a bi u th c so snh d i y: a) x = 1; y = 2; x++ < y b) x = 2; y = 1; x-- < y++ c) x = 2; y = 2; x++ == y

31

Chng 3. Cc c u trc i u khi n


Nh ni ph n trn, chng trnh my tnh m chng ta l p trnh t o ra th c ch t l m t t p cc l nh. Cc chng trnh c vi t b ng ngn ng b c cao th ng ch a m t hm chnh (trong C++ l hm main), ni chng trnh b t u th c hi n cc l nh. Trong chng ny chng ta s tm hi u th t th c hi n cc l nh trong m t chng trnh.

3.1. Lu ng i u khi n
Lu ng i u khi n c a chng trnh l th t cc l nh (hnh ng) m chng trnh th c hi n. Cho n chng ny, chng ta m i g p th t n gi n: th t tu n t , ngha l cc hnh ng c th c hi n ng theo th t m chng c vi t trong chng trnh. V d , Hnh 3.1 l s minh h a m t c u trc tu n t i n hnh, trong hai hnh ng v cc mi tn bi u di n th t th c hi n cc hnh ng.

Hnh 3.1: S

chuy n tr ng thi c a m t o n l nh c th t th c thi tu n t .

Trong chng ny, ta s lm quen v i cc lu ng i u khi n ph c t p hn. H u h t cc ngn ng l p trnh, trong c C++, cung c p hai lo i l nh ki m sot lu ng i u khi n: l nh r nhnh (branching) ch n m t hnh hnh ng. ng t danh sch g m nhi u ng cho n khi m t

l nh l p (loop) th c hi n l p i l p l i m t hnh i u ki n d ng no c th a mn. 32

Hai lo i l nh t o thnh cc c u trc i u khi n (control structure) bn trong chng trnh.

3.2. Cc c u trc r nhnh


3.2.1. L nh if-else L nh if-else (hay g i t t l l nh if) cho php r nhnh b ng cch l a ch n th c hi n m t trong hai hnh ng. V d , trong m t chng trnh x p lo i i m thi, n u i m c a sinh vin nh hn 60, sinh vin c coi l tr t, n u khng th c coi l .

[score < 60]

[score >= 60]

in "Failed"

in "Passed"

Hnh 3.2: S

m t l nh if.

Thu t ton nh ny trm bi u di n i m r theo h ng no. T i m t i u ki n. Lu ng c th a mn.

c th hi n b ng s trong Hnh 3.2. Trong hnh qu nhnh, ni chng trnh a ra quy t nh xem nn r m r nhnh c cc mi tn i ra, m i mi tn km theo i u khi n s i theo mi tn no m i u ki n c a n

Cng c th trnh by thu t ton b ng m gi nh sau: If students score is less than 60 print Failed else print Passed Th hi n thu t ton trn b ng m t l nh if-else c a C++, ta c o n m:

33

if (score < 6 ) cout << "Failed"; else cout << " assed";

Khi chng trnh ch y m t l nh if-else, u tin n ki m tra bi ki n n m trong c p ngo c n sau t kha if. N u bi u th c c true th l nh n m sau t kha if s c th c hi n. Ng c l i, l else s c th c hi n. Ch l bi u th c i u ki n ph i c c p ngo c n.
#include <iostream> using namespace std; int main() { int score; cout << " nter your score: "; cin >> score; //get the score from the keyboard

u th c i u gi tr b ng nh n m sau t trong m t

if (score < 6 ) cout << "Sorry. ou ve failed the course.\n"; else cout << "Congratulations! ou ve passed the course.\n"; return } ;

Hnh 3.3: V d v c u trc

Chng trnh v d trong Hnh 3.3 yu c u ng i dng nh p i m r i in ra cc ho c tr t. r ng cc l nh n m thng bo khc nhau ty theo i m s bn trong kh i c n c li u dng m t m c chng trnh trng sng s a d c.

34

Trong c u trc r nhnh , ta c th b ph n n u khng mu n chng trnh th c hi n hnh ng no n u i u ki n khng th a mn. Ch ng h n, n u mu n thm m t l i khen c bi t cho i m s xu t s c t 90 tr ln, ta c th thm l nh sau vo trong chng trnh t i Hnh 3.3.
( >= 9 ) << " x ";

Ta c th dng cc c u trc l ng nhau t o ra i u ki n r nhnh ph c t p. Hnh 3.3 l m t v d n gi n v i ch hai tr ng h p v m t l nh . Xt m t v d ph c t p hn: cho tr c i m s (lu t i bi n ki u ), xc nh x p lo i h c l c A, B, C, D, F ty theo i m . Quy t c x p lo i l: n u i m t 90 tr ln th t lo i A, i m t 80 t i d i 90 t lo i B, v.v.. T i o n m xt cc tr ng h p c a x p lo i i m, ta c th dng c u trc l ng nhau nh sau:
( >= 9 ) = 'A'; ( >= 8 ) = 'B'; ( >= ) = ' '; ( >= 6 ) = 'D'; = 'F';

r ng m i kh i l nh sau n m trong ph n li n tr c. N u khng d i 90, i u ki n c a c u cho k t qu . Tuy nhin, do i u ki n c a l nh th a mn, ch c l nh gn u tin = 'A' c th ph n c a l nh ngoi cng, bao g m ba l nh b qua.

c a kh i l nh b n l nh ngoi cng c thi, cn ton b cn l i, b

V i cc kh i l nh l ng nhau nh trn, khi ph i li u dng qu xa v bn ph i, dng cn l i qu ng n khi n m i l nh c th ph i tr i trn vi dng, d n n vi c chng trnh kh c. Do , a s l p trnh vin C++ th ng

35

dng ki u li u dng nh d i y. (Hai cch li i v i trnh bin d ch v n b qua cc k t tr ng.)


( >= 9 ) = 'A'; ( >= 8 ) = 'B'; ( >= ) = ' '; ( >= 6 ) = 'D'; = 'F';

u dng ny l nh nhau

Hnh 3.4 l chng trnh hon ch nh th c hi n nhi m v yu c u ng i dng nh p i m s sau tnh v in ra x p lo i h c l c tng ng.

36

<

> ;

() ; ; << " >> ( "; ;

>= 9 ) = 'A'; ( >= 8 ) = 'B'; ( >= ) = ' '; ( >= 6 ) = 'D'; = 'F'; << " ;
Hnh 3.4: C u trc if-else l ng nhau.

= " <<

<<

M t i u c n c bi t lu l n u mu n th c hi n nhi u hn m t l nh trong m i tr ng h p c a l nh , ta c n dng c p ngo c {} b c t p l nh thnh m t kh i chng trnh. V d , phin b n ph c t p hn c a l nh trong Hnh 3.3:

37

< 6 ) << "F << "

" << k

; " << ;

<< " << "

" << ";

trnh l i qun c p ngo c, c m t l i khuyn l t p thi quen dng c p ngo c ngay c khi kh i l nh ch bao g m ng m t l nh. Ch ng h n, xt kh i l nh l ng nhau d i y:
( ( == 'A') == 'A') << " << " '

A' A

" <<

; " << ;

Thng bo trong ph n ng ra c n c th c thi khi x p h ng c a mn Ton ( ) khng t A. Tuy nhin, trong th c t , trnh bin d ch l i hi u r ng ph n cng c p v i l nh th hai l nh g n nh t, ngha l:
( ( == 'A') == 'A') << " << " '

A'

" << A

; " << ;

Cc l i lgic d ng ny th ng kh pht hi n. i v i C++, vi c li u dng ch nh m m c ch l p trnh vin d c chng trnh ch khng c ngha v i trnh bin d ch. Cch gi i quy t l s d ng c p ngo c {} ch r cho trnh bin d ch r ng l nh th hai n m trong l nh ngoi cng v r ng ph n cng c p v i l nh ngoi cng :

38

( (

== 'A') == 'A') << "

A'

" <<

<< "

'

" <<

3.2.2. L nh swi Khi chng ta mu n vi t m t c u trc r nhnh c nhi u l a ch n, ta c th s d ng nhi u l nh l ng nhau. Tuy nhin, trong tr ng h p vi c l a ch n r nhnh ph thu c vo gi tr (ki u s nguyn ho c k t ) c a m t bi n hay bi u th c, ta c th s d ng c u trc w chng trnh d hi u hn. L nh w i n hnh c d ng nh sau:
w (bi u_th c)

h ng_1 t p_l nh_1; b h ng_2 t p_l nh_2; b

k; k;

t p_l nh_m c_ nh; Khi l nh w c ch y, bi u_th c c tnh gi tr v so snh v i h ng_1. N u b ng nhau, chu i l nh k t t p_l nh_1 c th c thi cho n khi g p l nh b k u tin, n y chng trnh s nh y t i i m k t thc c u trc w . N u bi u_th c khng c gi tr b ng h ng_1, n s c so snh v i h ng_2, n u b ng nhau, chng trnh s th c thi chu i l nh k t t p_l nh_2 t i khi g p l nh b k u tin th nh y t i cu i c u trc w . Quy trnh c ti p di n nh v y. Cu i cng, n u bi u_th c c gi tr khc v i t t c cc gi tr c li t k (h ng_1, h ng_2, ...), chng trnh s th c thi t p_l nh_m c_ nh n m n u nh c nhn ny (khng b t bu c). sau nhn V d , l nh sau so snh gi tr c a bi n v i cc h ng k t 'A', 'B', 'C' v in ra cc thng bo khc nhau cho t ng tr ng h p.

39

( 'A'

) << " 'B' << " ' ' << " << " = "; b k; A, B, "; = B"; b k; = A"; b k;

N tng ng v i kh i l nh
(

l ng nhau sau:

== 'A') << " = A"; ( == 'B') << " = B"; ( == ' ') << " = "; << " A, B, ";

Lu , cc nhn trong c u trc w ph i l h ng ch khng th l bi n hay bi u th c. N u c n so snh v i bi n hay bi u th c, ta nn dng kh i l nh l ng nhau. V n c bi t c a c u trc w l cc l nh b k. N u ta khng t g n m t l nh b k vo cu i chu i l nh c n th c hi n cho m i tr ng h p, chng trnh s ch y ti p chu i l nh c a tr ng h p sau ch khng t ng nh y t i cu i c u trc w . V d , o n chng trnh sau s ch y l nh in th nh t n u grade nh n m t trong ba gi tr 'A', 'B', 'C' v ch y l nh in th hai trong tr ng h p cn l i:

40

( 'A' 'B' ' '

<< " << "

A, B A, B

"; b ";

k;

Chng trnh trong Hnh 3.5 l m t v d hon ch nh s d ng c u trc w in ra cc thng bo khc nhau ty theo x p lo i h c l c ( ) m ng i dng nh p t bn phm. Trong , 'A' k t thc v i b k sau ch m t l nh, cn 'B' ch y ti p qua ' ', 'D' r i m i g p b k v thot . Nhn c dng x l tr ng h p bi n grade gi kh i l nh w gi tr khng h p l i v i x p lo i h c l c. Trong nhi u chng trnh, ph n th ng c dng x l cc tr ng h p khng mong i, ch ng h n nh b t l i cc k hi u h c l c khng h p l m ng i dng c th nh p sai trong Hnh 3.5.

41

<

> ;

() ; << " >> w ( 'A' << " x 'B' << " ' ' 'D' << " 'F' << " << " , "; b "; k; "; b k; "; "; b k; "; ; )

A x B

F ,
Hnh 3.5: V d s d ng c u trc switch.

42

3.3. Cc c u trc l p
Cc chng trnh th ng c n ph i l p i l p l i m t ho t ng no . V d , m t chng trnh x p lo i h c l c s ch a cc l nh r nhnh gn x p lo i A, B, C cho m t sinh vin ty theo i m s c a sinh vin ny. x p lo i cho c m t l p, chng trnh s ph i l p l i thao tc cho t ng sinh vin trong l p. Ph n chng trnh l p i l p l i m t l nh ho c m t kh i l nh c g i l m t vng l p. L nh ho c kh i l nh c l p i l p l i c g i l thn c a vng l p. C u trc l p cho php l p trnh vin ch th cho chng trnh l p i l p l i m t ho t ng trong khi m t i u ki n no v n c th a mn. Khi thi t k m t vng l p, ta c n xc nh thn vng l p th c hi n hnh ng g. Ngoi ra, ta cn c n m t c ch quy t nh khi no vng l p s k t thc. M c ny s gi i thi u v cc l nh l p m C++ cung c p. 3.3.1. Vng w ile Vng w ile l p i l p l i chu i hnh ng, g i l thn vng l p, n u nh i u ki n l p v n cn c th a mn. C php c a vng l p w nh sau:
w ( i u_ki n_l p)

thn_vng_l p C u trc ny b t u b ng t kha w , ti p theo l i u ki n l p t trong m t c p ngo c n, cu i cng l thn vng l p. Thn vng l p hay ch a nhi u hn m t l nh v khi th ph i c gi trong m t c p ngo c {}. , u tin chng trnh ki m tra gi tr c a bi u Khi th c thi m t c u trc w th c i u ki n, n u bi u th c cho gi tr (th c ch t l b ng 0) th nh y n i m k t thc l nh w , cn n u i u ki n l p c gi tr (th c ch t l m t gi tr no khc 0) th ti n hnh th c hi n t p l nh trong thn vng l p r i quay tr l i ki m tra i u ki n l p, n u khng th a mn th k t thc, n u th a mn th l i th c thi thn vng l p r i quay l i... T p l nh thn vng l p c th lm thay i gi tr c a bi u th c i u ki n t sang (th c ch t l t khc 0 sang b ng 0) d ng vng l p. V d , xt m t chng trnh c nhi m v m t 1 n m t ng ng tr c. o n m m t 1 n b c th c vi t nh sau:
b

cho

43

= 1; ( << ++;

<=

<< ", ";

Gi s bi n b c gi tr b ng 2, o n m trn ho t ng nh sau: u tin, bi n c kh i t o b ng 1. Vng while b t u b ng vi c ki m tra i u ki n ( <= b ), ngha l 1 2, i u ki n th a mn. Thn vng l p c th c thi l n th nh t: gi tr 1 c a c in ra mn hnh km theo d u ph y, sau c tng ln 2. Vng l p quay v i m xu t pht: ki m tra i u ki n l p, gi l 2 2, v n th a mn. Thn vng l p c ch y l n th hai (in gi tr 2 c a v tng ln 3) tr c khi quay l i i m xu t pht c a vng l p. T i l n ki m tra i u ki n l p ny, bi u th c 3 2 cho gi tr , vng l p k t thc do i u ki n l p khng cn c th a mn, chng trnh ch y ti p l nh n m sau c u trc w ang xt. trong o n m trn c th c bi u di n b ng s trong Hnh C u trc w 3.6. Trong s , mi tn sau chu i hnh ng in bi n v tng bi n quay ng c tr l i i m ki m tra i u ki n r nhnh, chu i hnh ng s l p l i n u i u ki n <= b v n ti p t c c th a mn. Cn n u > b , vng while i n i m k t thc, trao i u khi n cho l nh ti p theo trong chu i l nh c a chng trnh.

Hnh 3.6: S

m t vng l p while.

Chng trnh hon ch nh trong Hnh 3.7 minh h in ra cc s nguyn (bi n ) t 1 cho dng nh p vo t bn phm (lu t i bi n b l n ch y khc nhau v i cc gi tr khc nhau c 44

a cch s d ng vng l p w n m t ng ng gi tr do ng i ). Km theo l k t qu c a cc a b . c bi t, khi ng i

dng nh p gi tr 0 cho b , thn vng w khng ch y m t l n no, th hi n vi c khng m t s no c in ra mn hnh. L do l v n u b b ng 0 th bi u th c <= b ngay t u vng w c gi tr .
< > ;

() , << " >> b = 1; ( << ++; << "B ; b ; b ; ";

<=

<< ", ";

" <<

b 1, , B b 1, B b B
Hnh 3.7: V d v vng l p while.

Vng l p v t n M t trong nh ng l i chng trnh th ng g p l m t vng l p khng th k t thc, thn vng l p c l p i l p l i m khng bao gi ng ng. M t vng l p nh v y c g i l vng l p v t n. Thng th ng, m t vi l nh trong thn m t vng w hay -w s lm thay i gi tr c a m t vi bi n bi u th c i u ki n cho gi tr (ho c 0), ch ng h n l nh tng bi n m 45

trong Hnh 3.7. N u (cc) bi n khng c thay i gi tr m t cch thch h p ho c khi i u ki n l p c vi t khng chnh xc (c th do thu t ton sai hay nh m l n khi vi t m chng trnh), ta s nh n c m t vng l p v t n do i u ki n l p khng bao gi nh n gi tr . Hnh 3.8 minh h a m t vng l p v t n khi bi n tng d n n v h n nhng lun nh n gi tr l v khng bao gi c th c gi tr b ng 12 k t thc vng l p w . y c th g i l l i l-gic. N u o n chng trnh c nhi m v tnh t ng cc s 1, 3, 5, 7, 9, 11 th i u ki n l p nn c s a thnh ( < 1 ) chng trnh c th ch y ng.
< > ; , ; = 1; w ( = = ; = 1 ) + + )

; ;

}
Hnh 3.8: V d v vng l p v t n.

3.3.2. Vng do-w ile Vng do-w ile r t gi ng v i vng w , khc bi t chnh l ch thn vng l p s c th c hi n tr c, sau m i ki m tra i u ki n l p, n u ng th quay l i ch y thn vng l p, n u sai th d ng vng l p. Khc bi t c ngha r ng thn c a vng -w lun c ch y t nh t m t l n, trong khi thn vng w c th khng c ch y l n no.

46

Cng th c c a vng

-w

t ng qut l:

thn_vng_l p w ( i u_ki n_l p); Tng t nh vng w , thn_vng_l p c a vng -w c th ch g m m t l nh ho c th ng g p hn l m t chu i l nh c b c trong m t c p ngo c {}. Lu d u ch m ph y t cu i ton b kh i -w . Cng th c t ng qut c a vng n u dng vng w : thn_vng_l p w ( i u_ki n_l p) thn_vng_l p minh h a ho t o n m d i y:
w -w

trn tng ng v i cng th c sau

ng c a hai c u trc l p w

-w = 1;

, ta so snh hai

= 1; ( <= << ++;

b ) << ", "; w (

<< ++; <=

<< ", "; b );

Hai o n m ch khc nhau ch m t bn tri dng vng w , bn ph i dng vng -w , cn l i, cc ph n thn vng l p, i u ki n, kh i t o u gi ng h t nhau. o n bn tri c l y t v d trong m c tr c, n in ra cc s t 1 n b . o n m dng vng -w bn ph i cng th c hi n cng vi c gi ng h t o n bn tri, ngo i tr m t i m: khi b nh hn 1 th n v n m 1 tr c khi d ng vng l p thn vng l p ch y 01 l n tr c khi ki m tra i u ki n. minh h a r hn, ta xem xt Hnh 3.9 l b n s a i c a v d trong Hnh 3.7 b ng cch thay c u trc w b ng c u trc -w v gi nguyn cc ph n cn l i. K t qu ch y chng trnh cho th y ho t ng c a chng trnh trong Hnh 3.9 khng hon ton nh mong mu n. C th , khi b c nh p gi tr 0, chng trnh v n m m t l n trong khi ng ra khng nn m l n no nh chng trnh nguyn g c trong Hnh 3.7. l m t minh h a v s khc bi t gi a ho t ng c a hai c u trc w v -w . Trong bi ton c th ny, c u trc -w khng ph i l l a ch n t t so v i c u trc w .

47

<

> ;

() , << " >> b = 1; do << ++; w ile o << "B ; << ", "; e " << ; ; b ; b ; ";

b 1, , B b 1, B b 1, B
Hnh 3.9: V d v vng l p do-w ile.

T n d ng c i m ch y m t l n tr c khi ki m tra i u ki n, chng trnh trong Hnh 3.10 lm nhi m v nh p t bn phm m t chu i s k t thc b ng s 0 v tnh t ng c a chng. Cng vi c l p i l p l i l nh p vo m t s ( )r i c ng d n gi tr c a s vo t ng ( ). i u ki n l p l s v a nh p ph i khc 0. R rng, khng c n v khng nn ki m tra i u ki n l p tr c khi l n u th c hi n thn vng l p. Trong tr ng h p ny, c u trc -w l l a ch n t t hn so v i c u trc w . Chng trnh trong Hnh 3.10 cn l m t v d v m t vng l p khng dng con m i u khi n vng l p m dng m t bi n canh hay c tr ng thi nh

48

d u i m k t thc. y, 0 l gi tr canh nh d u ph n t d li u cu i cng m ng i dng nh p vo chng trnh.


< > ;

() = ; ;

<< " >> = ( << " ;

b ; + = ); b ;

) ";

" <<

b b b b ( ( ( ( b
Hnh 3.10: Vng l p do-while dng bi n canh.

) ) ) 1 )

3.3.3. Vng fo Vng fo l c u trc h tr vi c vi t cc vng l p m s l n l p c ki m sot b ng bi n m. Ch ng h n, o n m gi sau y m t thu t ton in ra cc s t 1 n b :

49

Lm nhi m v sau y i v i m i gi tr c a ra mn hnh In o n m gi


(

t 1

c th

c vi t b ng vng
<= << ", "; b ;

c a C++ nh sau:
++)

= 1; <<

V i

b 1,

c gi tr b ng 3, o n trnh trn cho k t qu in ra mn hnh l:


, 3,

C u trc t ng qut c a vng l p thn_vng_l p

l:

( kh i_t o; i u_ki n_l p; c p_nh t)

Trong , bi u th c kh i_t o th ng kh i t o con m i u khi n vng l p, i u_ki n_l p xc nh xem thn vng l p c nn ch y ti p hay khng ( i u ki n ny th ng ch a ng ng cu i cng c a con m), v bi u th c c p_nh t lm tng hay gi m con m. Cng tng t nh cc c u trc , w ..., n u thn_vng_l p c nhi u hn m t l nh th c n ph i b c n trong m t c p ngo c {}. Lu r ng c p ngo c n bao quanh b ba kh i_t o, i u_ki n_l p, c p_nh t, cng nh hai d u ch m ph y ngn cch ba thnh ph n , l cc thnh b t bu c c a c php c u trc . Ba thnh ph n cng c th l bi u th c r ng n u c n thi t, nhng k c khi v n ph i c hai d u ch m ph y. Trong h u h t cc tr ng h p, c u trc c u trc l p w sau (ngo i l c ni kh i_t o; w ( i u_ki n_l p) thn_vng_l p c p_nh t; Ta c th khai bo bi n ngay trong ph n kh i_t o c a vng , ch ng h n i v i bi n con m. Nhng cc bi n c khai bo t i ch c hi u l c bn trong c u trc l p (chi ti t v ph m vi c a bi n s c ni n trong M c 4.4). V d : t ng qut trn tng ng v i n trong M c 0):

50

( <<

= 1; <= << ", ";

++)

Hnh 3.11 minh h a cch s d ng vng l p tnh i m trung bnh t i m c a 10 mn h c (s mn h c lu trong bi n bj ). Ng i dng s c yu c u nh p t bn phm i m s c a 10 mn h c trong khi chng trnh c ng d n t ng c a 10 i m s ny. Cng vi c m chng trnh c n l p i l p l i 10 l n l: nh p i m c a m t mn h c, c ng d n i m vo t ng i m. u tin vng s ti n hnh b c kh i t o v i m c ch chnh l kh i t o bi n m. Vi c kh i t o ch c ti n hnh duy nh t m t l n. Trong v d ny, bi n c khai bo ngay t i vng v kh i t o gi tr b ng 0. Ti p theo vng s ti n hnh ki m tra i u ki n l p < bj . N u i u ki n sai, vng l p s k t thc. N u i u ki n ng, thn vng l p s c th c hi n (nh p m t gi tr ki u r i c ng d n vo bi n ). Sau l b c c p nh t v i nhi m v tng bi n m thm 1. K t qu l vng l p s ch y 10 l n v i cc gi tr b ng 0, 1, .., 9 (khi nh n gi tr 10 th i u ki n l p khng cn ng v vng l p k t thc).
< > ;

() = bj << " ( >> += << "A ; = k; k; k; ; ; = 1 ; k < " << bj bj ; << " ++) bj ";

k = " <<

bj

Hnh 3.11: V d v vng l p for.

Xt m t bi ton khc: Tnh li g i ti n ti t ki m. M t ng i g i m t s ti t ki m k h n 12 thng v i s ti n ban u l 1.000.000 VN , li su t 12% m t nm. Gi s ti n li hng nm khng c rt ra m g p chung vo v n. S ti n

51

n m trong s ti t ki m sau m i nm (k h n 12 thng) c tnh theo cng th c sau: amount = principal * (1 + interest_rate)year trong amount l s ti n trong s ti t ki m, principal l v n ban u, interest_rate l li xu t hng nm, v year l s nm g i. Hy tnh v in ra s ti n trong s ti t ki m vo th i i m cu i cc k 12 thng hng nm trong vng 5 nm theo d ng
1 A xxxx xxxx

Thu t ton cho bi ton nh sau: Kh i t o cc bi n amount, principal, interestRate In m c hai c t Year v Amount in deposit ra mn hnh V i year ch y t 1 n 5, th c hi n cc cng vi c sau: tnh amount sau year nm theo cng th c in amount theo c t Chng trnh hon ch nh cho trong Hnh 3.12. Trong c m t s ch . i mc n

Th nh t, v n nh d ng cc gi tr s khi in ra mn hnh. nh d ng m c nh khi in ra mn hnh l nh d ng khoa h c, ch ng h n s 1120000 h th p phn s c d ng 1.12e+006. Ta s nhn th y k t qu ny n u xa b dng sau kh i chng trnh:
<< x << ( ); b

Dng trn khng hi n th g ra mn hnh m ch t c u hnh cho cc l n in ti p theo. C th , x gip quy nh r ng cc gi tr th c in ra theo d ng c d u ch m th p phn (h o l ng Anh-M , tng ng v i d u ph y th p phn c a h mt), cn ( ) quy nh r ng cc gi tr th c c in ra v i chnh xc 2 ch s sau d u ch m. l hai trong nhi u php nh d ng lu ng d li u (stream manipulator). Cc php nh d ng ny n m trong th vi n iomanip c a th vi n chu n. Do , s d ng chng, ta ph i c nh h ng ti n x l < > u t p m ngu n (xem ph n u c a chng trnh trong Hnh 3.12).

52

Th hai l s d ng hm th vi n ton h c tnh ly th a. C++ khng c php tnh ly th a. Thay vo , th vi n <cmath> trong th vi n chu n C++ cung y c p hm w. Hm w( x, ) cho k t qu l gi tr c a php tnh x . dng hm ny, ta cng c n c nh h ng ti n x l < > u t p m ngu n.
< < < > > > ; () b b b << " ; = 1 = A ; 1 ; " << ; ++ b

<<

<<

);

( = <<

= 1; << "

<= ; w( 1 " <<

++) + <<

, ;

);

A 11 1 1 9 8 1 3 19 36 1 6 3 1 68
Hnh 3.12: Tnh ti n ti t ki m hng nm s d ng vng for.

1 3

53

3.4. Cc l nh

eak v o

e
-w

Nh gi i thi u cc m c tr c, cc vng l p w , k t thc khi ki m tra bi u th c i u ki n c gi tr vng l p trong tr ng h p cn l i. Cc l nh b k v nh y cho php thay i lu ng i u khi n . L nh b
k khi

, v u v ch y ti p thn l cc l nh

c th c thi bn trong m t c u trc l p hay m t c u trc w c tc d ng l p t c ch m d t c u trc , chng trnh s ch y ti p l nh n m ti p sau c u trc . L nh b k th ng c dng k t thc s m vng l p (thay v i n l t ki m tra i u ki n l p) ho c b qua ph n cn l i c a c u trc w (nh t i cc v d trong M c 3.2.2). V v d s d ng l nh b k trong vng l p. Ch ng h n, n u ta s a v d trong Hnh 3.11 vng ng ng l i khi ng i dng nh p i m s c gi tr m, ta c chng trnh trong Hnh 3.13. V i ci t ny, khi ng i dng nh p m t i m s c gi tr m, i u ki n ( k < ) s cho k t qu , chng trnh thot kh i vng v ch y ti p t l nh n m sau . Trong tr ng h p , bi n cha k p tng n ng ng bj ( i u ki n l p c a vng cha k p b ph v ). Do , bi u th c ( >= bj ) trong l nh sau c ngha "vng c ch y bj l n hay khng?" ho c "vng c b ng t gi a ch ng b i l nh b k hay khng?", hay l "d li u nh p vo c thnh cng hay khng?".

54

<

> ;

() = , << " ( = >> a k += ; k; k; k; ) k = " << k "; bj ; ; bj

= 1 ; k < " << ; bj ++) << " bj ";

bj

if

eak

>= bj << "A << " ;

Hnh 3.13: V d v l nh b

k.

L nh n m trong m t vng l p c tc d ng k t thc l n l p hi n hnh c a vng l p . Hnh 3.14 l m t b n s a i khc c a chng trnh trong Hnh 3.11. Trong phin b n ny, chng trnh khng ghi nh n i m s c gi tr m, cng khng k t thc chng trnh sau khi bo l i nh b n trong Hnh 3.13, m yu c u nh p l i cho n khi no thnh cng. Khi g p i m s m c nh p vo (bi n k), l nh c th c thi c tc d ng b qua o n l nh ghi nh n i m n a sau c a thn vng w ( o n c ng d n vo t ng v tng bi n m ). L n l p c th c hi n sau s yu c u nh p l i i m cho mn h c ang nh p d (xem k t qu ch y chng trnh trong Hnh 3.14).

55

<

> ;

() = = << " ( ; ,

bj k )

= 3; " << bj << " bj ";

< bj k; << " " << >> k; ( k < ) << i e k;

+ 1 << "

";

k << "

";

+= ++; << "A ;

k = " <<

k 1 3 3 A 8 1 k = 8
Hnh 3.14: V d v l nh .

bj

M t i m c n lu l cc l nh b k hay ch c tc d ng i v i vng l p trong cng ch a n. Ch ng h n, n u c hai vng l p l ng nhau v l nh b k n m trong vng l p bn trong, th khi c th c thi, l nh b k ch c tc d ng k t thc vng l p bn trong. M t vng l p khng c b k hay c c u trc n gi n v d hi u v th i i m ki m tra i u ki n l p l i m duy nh t quy t nh l p hay d ng. V i 56

m t l nh b k k t thc s m vng l p ho c m t l nh k t thc s m l n l p hi n hnh, c u trc l p s kh hi u. V y nn ng i ta khuyn nn trnh hai l nh ny n u c th .

3.5. Bi u th c i u ki n trong cc c u trc i u khi n


H u h t cc c u trc i u khi n m ta ni n trong chng ny u dng n m t thnh ph n quan tr ng: bi u th c i u ki n. Trong cc v d tr c, ta m i ch dng n cc i u ki n n gi n, ch ng h n <= b hay == 'A', v i duy nh t m t php so snh. Khi c n vi t nh ng i u ki n ph c t p hn, c n n nhi u i u ki n nh , ta c th k t h p chng b ng cc php ton lgic && (AND v), || (OR ho c) v (NOT ph nh). V d : Khi ki m tra i u ki n 8 < 9 , b t ng th c ton h c ny c n c tch thnh hai i u ki n n. B t ng ng khi c hai i u ki n n u th a mn. l khi ta c n dng php ton lgic && (AND).
( >= 8 && = 'B'; < 9 )

Khi m t trong hai i u ki n x y ra, ho c ti n h t ho c ti y, th khng th mua thm hng. Tr ng h p ny, ta c n dng php ton lgic || (OR).
( L <= << " ' || b b F ) ";

Ti p t c l p trong khi d li u vo cha c gi tr b ng gi tr canh nh d u i m cu i c a chu i d li u:


w ( ( == ))

y, ta c th dng php ph nh. Ho c nhi u ng i ch n cch n gi n hn l dng php so snh khc ( =):
w ( = )

M t i u c n c bi t lu khi dng ton t so snh b ng (==): trnh nh m l n v i php gn (=). Nh m l n d ng ny s d n n nh ng l i lgic r t kh pht hi n. Ch ng h n cu l nh s in ra l i khen " x " n u x p lo i h c l c t lo i A:

57

ade

'A') << " x

";

N u ta vi t nh m thnh:
( ade 'A') << " x ";

th khi ki m tra i u ki n, cu l nh ny s s a gi tr c a bi n thnh 'A' thay v so snh. Bi u th c gn = 'A' c gi tr b ng gi tr c gn ('A'), gi tr ny khc 0 nn c hi u l . Khi bi u th c i u ki n c a l nh ny lun c gi tr , o n l nh s hi n th l i khen cho m i lo i h c l c. M t g i cch trnh l i ny l nn t p thi quen vi t cc bi u th c so snh theo ki u ('A' == ) thay v ( == 'A') theo thi quen thng th ng. V i v tr gi tr h ng bn tri, bi n bn ph i, th khi ta ch ng may vi t nh m == thnh = th trnh bin d ch s pht hi n l i bin d ch "sai c php c a php gn 'A' = " thay v im l ng do khng th pht hi n l i lgic.

58

Bi t p
1. Nh p vo t bn phm m t s nguyn n m trong kho ng t 0 n 10 l i m c a m t sinh vin. Hy s d ng c u trc switch phn lo i sinh vin theo quy t c d i y. Hi n k t qu phn lo i ra mn hnh: i m < 5: km

5 i m 7: trung bnh 8 i m 9: gi i i m = 10: xu t s c

2. Nh p vo t bn phm hai s nguyn a v b. N u a > b: hi n ra mn hnh dng ch a is greater than b. a < b: hi n ra mn hnh dng ch a is smaler than b. a = b: hi n ra mn hnh dng ch a is equal to b. 3. Nh p vo t bn phm ba s a, b, c. Hy ki m tra xem ba s c th a mn l di cc c nh c a m t tam gic hay khng? N u c, hi n ra mn hnh thng bo v di n thch c a tam gic . N u khng, thng bo ra mn hnh ba s khng ph i l 3 c nh c a m t tam gic. 4. Nh p t bn phm 3 s a, b, c. Hy tm v hi n k t qu ra mn hnh. a. Gi tr l n nh t c a ba s trn b. Gi tr nh nh t c a ba s trn 5. Nh p t bn phm ba s nguyn a, b, c. Tnh t ng c a s nh nh t v s l n nh t trong ba s trn. Hi n k t qu tnh c ra mn hnh. 6. Nh p vo t bn phm danh sch cc s nguyn th hi n cho i m c a m t l p h c. Qu trnh nh p d ng l i khi s nh p vo l m t s m. Vi t chng trnh gi i quy t cc bi ton sau (hi n k t qu tm c ra mn hnh) a. Tnh s l ng sinh vin trong l p b. Tnh i m trung bnh c a l p h c v a nh p. c. Tm sinh vin c i m cao nh t 59

d. Tm sinh vin c i m th p nh t. 7. Nh p vo t bn phm m t s nguyn dng, s d ng c u trc vng l p while-do tnh t ng t t c cc s nguyn dng l nh hn s nh p t bn phm. Hi n k t qu tm c ra mn hnh. 8. Nh p t bn phm m t s nguyn dng. Hy ki m tra xem s nguyn dng c ph i l s nguyn t hay khng, n u khng th tm t t c cc c s c a s nguyn dng . Hi n k t qu tm c ra mn hnh. 9. S d ng c u trc vng l p for tnh t ng t t c cc s nguyn dng chia h t cho 7 v nh hn m t s n cho tr c t bn phm. Hi n k t qu ra mn hnh. 10. Nh p vo t bn phm vo 4 s t nhin. Hy ki m tra xem c t n t i hay khng m t c p s (a, b) trong b n s trn m a chia h t cho b. N u c, hi n ra mn hnh t t c cc c p s (a, b) tm c. 11. Cng th c tnh dy s Fibonacci nh sau: f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2), v i n >1. 12. Nh p t bn phm m t s nguyn khng m n, hy tnh gi tr f(n). Hi n k t qu tnh c ra mn hnh. 13. Nh p vo t bn phm 3 s nguyn h (0 h 23), m (0 m 59), s (0 s 59) cho bi t gi , pht, giy c a th i i m hi n t i. Hy tnh xem cn bao nhiu giy n a th n th i i m 0 gi , 0 pht, 0 giy. V d : h = 23, m = 59, s = 58. K t qu : cn 2 giy n a th n 0:0:0

60

Chng 4. Hm
Cc chng trnh v d m ta g p t u n gi u ng n v i duy nh t m t hm chnh hm . Khi c n gi i quy t bi ton ph c t p hn, hm s di hn, v ph c t p hn, d n n chng trnh kh c, kh hi u, l p trnh vin d m c l i, v l i kh tm. gi i quy t cc bi ton l n v ph c t p, ng i ta th ng s d ng chi n l c chia tr . Ngha l, chia bi ton thnh m t chu i cc bi ton nh hn, d hn, v chng c th c gi i m t cch t nhi u c l p v i nhau, sau k t h p l i c m t l i gi i hon ch nh cho bi ton ban u. Trong l p trnh, chia tr c th hi n b ng vi c chia chng trnh thnh cc chng trnh con. o n m ch a trong thn m t chng trnh con s c th c thi m i khi chng trnh con c g i (hay kch ho t). Chng trnh con chnh l m t trong cc c ch cho php m- un ha chng trnh. tr , vi c s d ng chng trnh con cn mang l i Bn c nh chi n l c chia cho l p trnh vin kh nng ti s d ng m, s d ng cc chng trnh con nh l cc kh i l p ghp xy d ng cc chng trnh m i. Chng trnh con cng gip trnh c cc o n m gi ng nhau l p i l p l i trong m t chng trnh. Ng i ta khuyn r ng di m i chng trnh con khng nn v t qu m t trang mn hnh l p trnh vin c th ki m sot t t ho t ng c a chng trnh con . Trong C++, t t c cc chng trnh con u c th hi n b i c u trc hm. Ngay c chng trnh chnh ( ) cng l m t hm. M t hm c kch ho t khi n c g i t bn trong m t hm khc, ch ng h n hm w c g i t c a chng trnh trong Hnh 3.12. Khi hm c g i th c hi n trong hm xong cng vi c c a mnh, n tr k t qu v cho ni g i n ho c n gi n l tr quy n i u khi n v cho ni g i n. C th so snh hm c g i nh l m t ng i th , cn hm g i n nh l ng i ch . Ng i ch giao vi c cho ng i th A, ng i th A th c hi n cng vi c v khi lm xong th bo co k t qu l i cho ng i ch . Ng i th A trong khi lm nhi m v c a mnh cng c th yu c u m t ng i th khc (B) th c hi n m t nhi m v con trong . n y quan h gi a ng i th A v ng i th B cng tng t nh quan h gi a ng i ch v ng i th B.

61

Chng ny s ni v cch nh ngha cc chng trnh con (ho c cc hm) v cc v n lin quan nh bi n a phng, cch truy n d li u vo trong hm.

4.1. Cc hm c s n
Cc ngn ng l p trnh b c cao th ng cung c p r t nhi u cc hm c s n cho ng i dng s d ng. Cc hm c chia thnh cc nhm hay cc th vi n khc nhau. Khi mu n s d ng hm c s n , ta ch c n ch ra cho chng trnh bi t l hm n m th vi n no (s d ng ) v sau c th s d ng hm m t cch bnh th ng. V d nh t i chng trnh trong Hnh 3.12, ta s d ng hm w v khai bo include th vi n cmath ch a n. M t s th vi n c a C++ hay c s d ng: iostream: cung c p cc hm lin quan cmath: cung c p cc hm lin quan n nh p v xu t d li u n ton h c.

cstdlib: cung c p cc hm cho cc m c ch chung nh: qu n l b nh ng, sinh s ng u nhin, tm ki m-s p x p cstring: cung c p cc hm x chu i l chu i k t nh: tnh di, sao chp

C th tra c u chi ti t v cc th vi n ny t i [4]. V d , B ng 4.1 li t k danh sch m t s hm ton h c thng d ng.


B ng 4.1: Cc hm ton h c trong th vi n cmath.

Hm ceil( x ) cos( x ) exp( x ) fabs( x ) floor( x ) fmod( x, y )

Miu t s nguyn nh nh t khng nh hn x hm l ng gic cos x (x o b ng radian) ex gi tr tuy t ic ax

s nguyn l n nh t khng l n hn x ph n d c a php chia x/y (l y gi tr ki u th c)

62

log( x ) log10( x ) pow( x, y ) sin( x ) sqrt( x ) tan( x )

loga c s e c a x ( ln x ) loga c s 10 c a x ( log x ) xy hm l ng gic sin x (x o b ng radian) cn b c 2 c a x (x l gi tr khng m) hm l ng gic tan x (x o b ng radian)

4.2. C u trc chung c a hm


Ngoi vi c s d ng cc hm c s n trong th vi n, l p trnh vin cn t xy d ng cc hm c a ring mnh. Sau khi c nh ngha, m t hm c th c s d ng nhi u l n. Hm c nh ngha theo cng th c: ki u_tr _v tn_hm (tham_s _1, tham_s _2,) thn_hm trong : ki u_tr _v l ki u gi tr m hm s tr v . y c th l m t trong cc ki u d li u c s n c a C++ ho c m t ki u d li u ng i dng t nh ngha. Trong C++, n u hm khng tr v gi tr no, th ki u_tr _v c thay th b ng t kha . tn_hm l nh danh c a hm, cch danh v gi ng cch t tn bi n. t tn hm tun th theo cch t nh

tham_s _1, tham_s _2,l danh sch cc tham s u vo c a hm. Tn y c a chng l cc tham s hnh th c (formal parameter)4. y l phng ti n truy n d li u vo trong hm. thn_hm l ni ch a chu i cc l nh.

Cn c g i t t l "tham s ".

63

Hnh 4.1 m t cch khai bo, ci t v s d ng m t hm tnh di n tch hnh ch nh t ( A ) trong C++. Hm A nh n hai tham s u vo l L v , n tnh di n tch hnh ch nh t (lu t i bi n ) v tr l i k t qu (l nh ;).
< > ;

b A = ; ( L L , ; )

() = 3; = ; = << " ; A ( " << , w ; );

}
Hnh 4.1: V d v khai bo v s d ng hm.

Lu : Vi c khai bo v nh ngha (thn hm) hm c th tch ra thnh hai ph n khc nhau. Ta s g p nh ng v d cc chng sau. Bi n c khai bo trong m t hm c g i l bi n a phng c a hm , ngha l n ch c ph m vi l bn trong thn hm . Gi s trong chng trnh c a ta c hai hm, m i hm khai bo m t bi n c tn gi ng nhau, v d . Ta s c hai bi n khc nhau tnh c c tn gi ng nhau, v vi c s a i bi n trong hm ny s khng c nh h ng g n bi n trong hm kia. T c l, i v i my tnh, hai bi n ny khng c lin quan g n nhau.

4.3. Cch s d ng hm
s d ng m t hm, ta g i tn hm, theo sau l c p ngo c n ch a cc gi tr truy n vo cho hm (xem cch g i hm A t trong hm

64

Hnh 4.1). Cc gi tr truy n vo cho hm c g i l cc i s (argument)5. Nh trong l i g i hm A ( , w ) t i Hnh 4.1, v w l cc i s . M t hm c th c g i nhi u l n v i cc i s khc nhau. Khi chng trnh th c thi m t l i g i hm, gi tr c a cc i s c sao chp vo cc tham s hnh th c tng ng, ngha l gi tr c a c chp vo L v gi tr c a w c chp vo , r i o n m nh ngha hm c th c thi. Cu i cng, l nh tr v m t gi tr (l gi tr c a bi u th c n m ngay sau t kha ) cho o n m chng trnh g i hm ny. ng th i, lu ng i u khi n c a chng trnh cng quay tr l i v i ni g i hm v cc l nh n i ti p pha sau l i g i hm s c th c thi.

4.4. Bi n ton c c v bi n

a phng

Chng 2 gi i thi u cc khi ni m c b n v bi n. Trong m c ny, ta s bn k hn v cc lo i bi n, hi u l c v ph m vi c a bi n. Chng ta bi t r ng bi n c cc thu c tnh nh: tn, ki u, kch th c, gi tr . Ngoi ra, m i bi n cn c cc c i m khc, c th l: th i gian s ng: bi n t n t i bao lu trong b nh ph m vi: bi n c th 4.4.1. Ph m vi c a bi n Ph m vi (scope) c a m t bi n l nh ng ni chng ta c th s d ng bi n . M t bi n c th c ph m vi ton c c hay ph m vi a phng. Bi n ton c c (global variable) l bi n c khai bo bn ngoi t t c cc hm (bi n A trong Hnh 2.1). Bi n ton c c c th c s d ng trong ton b chng trnh, ngay c bn trong cc hm, mi n l o n m s d ng bi n n m sau dng l nh khai bo bi n . Bi n a phng (local variable) l bi n c khai bo bn trong m t hm ho c m t kh i l nh (trong C++, m t kh i l nh c gi trong c p ngo c {}). Bi n a phng ch c th s d ng bn trong kh i l nh m n c khai bo t i
5

c s d ng t i nh ng ni no trong chng trnh

M t s ti li u dng thu t ng "tham s th c s " hay "tham i" ng "tham s " g i chung cho c tham s hnh th c l n i s .

ch

i s . M t s ti li u khc dng thu t

65

. Kh i l nh ny c th l thn c a m t hm ho c m t kh i c u trc i u khi n (xem Chng 3). Ch ng h n, t i chng trnh trong Hnh 4.2 c ba bi n x khc nhau v i cc ph m vi khc nhau: bi n x c khai bo trong hm c ph m vi l hm ; bi n x c khai bo ngay t i dng u tin c a thn hm c ph m vi l ton b thn hm do c p ngo c {} g n nh t chnh l c p ngo c bao quanh thn hm ; v bi n x c khai bo bn trong thn vng c a hm ch c ph m vi bn trong vng . y l cc bi n hon ton c l p. S a i i v i bi n ny hon ton khng c nh h ng g i v i cc bi n kia (th hi n cc dng output: con m x c a vng thay i gi tr trong khi hai bi n x cn l i khng c g thay i).
< > ; ( () x = (); ( = 1; x = << "L << "L x <= 3; ; x ++) b " << x << " << x << ; ; ; b );

() x = ; << "L b " << x <<

L L L L L x x x x x 1 9

Hnh 4.2: V d v ph m vi c a bi n.

66

4.4.2. Th i gian s ng c a bi n Trong tr ng h p m c nh v i l nh khai bo thng th ng, m t bi n s c t o ra khi chng trnh ch y n l nh khai bo bi n v t n t i cho n khi chng trnh ra kh i ph m vi c a bi n . C th , cc bi n ton c c c ph m vi l ton b chng trnh, nn chng c sinh ra v kh i t o ng m t l n v "s ng" cho n khi chng trnh k t thc. V i cc bi n a phng c khai bo theo ki u thng th ng, ph m vi c a chng ko t l nh khai bo chng cho n h t kh i chng trnh ch a l nh khai bo . Do , cc bi n ny c t o ra m i khi chng trnh ch y n l nh khai bo bi n v b h y i khi chng trnh ch y n h t kh i. Ng i ta cn g i cc bi n a phng ny l bi n t ng (automatic variable). Tr ng h p ngo i l trong C++ l cc bi n a phng c khai bo v i t kha . Cc bi n ny tuy l bi n a phng nhng "s ng" cho n khi chng trnh k t thc m c d n khng th c truy nh p t i trong khi chng trnh ang ch y ngoi ph m vi c a n. Cc bi n static ny gi nguyn gi tr c a mnh gi a cc l n g i hm. Ng i ta g i cc bi n a phng lo i ny l bi n tnh (static variable). Chng trnh trong Hnh 4.3 l m t v d minh h a s khc nhau gi a bi n tnh v bi n thng th ng. Trong hm V b c hai bi n a phng: x l bi n t ng v l bi n tnh. C hai u c khai bo v i gi tr kh i t o b ng 0, cng c in ra mn hnh tr c khi tng thm 1. V b c g i b n l n t trong hm , m i l n l i in ra mn hnh m t dng thng bo gi tr c a x v . K t qu in ra mn hnh cho th y x c gi tr b ng 0 trong t t c cc l i g i hm, trong khi bi n tnh y m i l n l i tng thm 1. L n no b c vo hm V b , x cng nh n gi tr kh i t o (0). Trong khi , ch c kh i t o b ng 0 ng m t l n, n khng b h y khi hm k t thc m n v n "s ng" v gi hi u ng c a php tng cu i hm V b t l n g i hm tr c cho n l n g i hm sau.

67

<

> ; V b ; = " << << ; ()

x =

= ; << "x = " << x << ", x++; ++;

() V V V V ; b b b b (); (); (); ();

x x x x = = = = , , , , = = 1 = = 3
Hnh 4.3: V d v bi n tnh.

4.5. Tham s ,

i s , v c ch truy n tham s cho hm

Trong ph n ny chng ta s tm hi u k v cc c ch truy n tham s cho hm. C hai c ch chnh l truy n gi tr v truy n tham chi u v i i m khc nhau cn b n: m t bn ch cho php hm c g i thao tc trn b n sao d li u c a ni g i hm, bn kia cho php hm c g i truy nh p tr c ti p. 4.5.1. Truy n gi tr Trong c ch truy n gi tr hay truy n b ng gi tr (pass-by-value), tham s c truy n b ng gi tr , ngha l b n sao c a i s c chp vo tham s tng ng trong hm ch b n thn i s th khng c truy n vo hm. Cc thay i i v i b n sao s khng c nh h ng g i v i b n g c, cho nn, khi hm th c hi n cc s a i i v i m t tham s th cc s a i ny khng c nh 68

h ng g t i i s tng ng c dng cho l i g i hm. T t c cc v d trong chng ny cho n y u dng c ch truy n gi tr . Xem thm minh h a trong Hnh 4.4. Vi c tham s hnh th c b thay i gi tr t bn trong hm khng c nh h ng g i v i i s L (m t bi n c a hm ) c dng khi g i hm ny. Sau khi l i g i hm c th c hi n xong, L v n gi nguyn gi tr l 9.
< > ; ) = ( ; += ; ; > ; ; --)

() L = << " << " ; = 9; ( " <<

L b <<

); 1 ; " << L

b 1 9

Hnh 4.4: V d v truy n gi tr cho hm.

Truy n gi tr c xem l l a ch n an ton do n m b o r ng hm c g i s khng gy hi u ng ph khng mong mu n i v i d li u c a ni g i hm. S d ng c ch truy n gi tr l m t trong cc kha c nh c a phong cch l p trnh t t. Tuy nhin, c ch ny c m t nh c i m: n u d li u c truy n vo hm c kch th c l n th s t n ph v th i gian ch y v b nh . 4.5.2. Truy n tham chi u Khc v i truy n gi tr , c ch truy n tham chi u hay truy n b ng tham chi u (pass-by-reference) cho php hm c g i truy nh p tr c ti p t i d li u c a ni g i hm v s a d li u n u mu n. So v i truy n gi tr , c ch truy n 69

tham chi u gip chng trnh c hi u nng cao hn do trnh c chi ph cho vi c sao chp d li u. Tuy nhin, truy n tham chi u lm cho chng trnh km an ton do nguy c hm c g i c th lm r i lo n d li u c a hm g i. M c ny ni v m t c ch m C++ cung c p truy n tham s b ng tham chi u. Ngoi ra, Chng 6 s ni n m t d ng truy n tham chi u khc c th c a C/C++: con tr . Tr c tin chng ta tm hi u v khi ni m tham chi u trong ngn ng l p trnh C++. Tham chi u (reference) c a m t bi n v b n ch t l m t bi t danh hay m t ci tn khc c a chnh bi n . Cc thao tc trn tham chi u c a m t bi n cng c hi u qu gi ng h t nh thao tc trn chnh bi n v ng c l i. Sau khi khai bo, tham chi u c s d ng trong chng trnh nh cc bi n khc. V d dng:
& b b k = b U B;

khai bo

c tn b U B. Lu r ng trong khai bo c d u &. Ngoi ra, tham chi u ph i c kh i t o ngay khi khai bo, C++ khng ch p nh n tnh tr ng m t tham chi u khng chi u i u c .

k l m t tham chi u t i m t bi n ki u

b k Hnh 4.5 minh h a cch khai bo v s d ng tham chi u. Bi n c khai bo (c d u & vo ng tr c tn bi n) l m t tham chi u t i bi n b U B (stick l m t tn g i khc c a USB stick). M i tnh ton v tc ng trn bi n b k s tng t nh trn bi n b U B v ng c l i v th c ch t hai bi n ny l m t.

Hnh 4.5: V d v khai bo v s d ng tham chi u.

70

Trong nhi u tr ng h p, chng ta mu n vi c thay i gi tr c a m t tham s trong hm s lm thay i gi tr c a i s tng ng. V d , khi ta vi t m t hm nh p gi tr cho cc bi n t bn phm. lm nh v y, ta c th s d ng c ch truy n tham chi u. T c l, tham s hnh th c s l m t tham chi u t i i s tng ng. Trong c ch ny, cc s a i i v i tham s hnh th c bn trong hm c th c hi n trn chnh i s dng cho l i g i hm. Hnh 4.6 minh h a c ch truy n tham chi u v i hm . Hm ny nh p hai s nguyn t bn phm v lu chng vo hai tham s v k( c khai bo l tham chi u). Vi c lu gi tr vo v k s lm thay i gi tr c a i s l cc bi n tng ng c a hm . Khc bi t duy nh t v c php gi a truy n gi tr v truy n tham chi u l danh sch khai bo tham s hnh th c. quy nh tham s no s c truy n b ng tham chi u, c n c d u & t ngay sau tn ki u d li u t i khai bo tham s trong nh ngha hm. Trong v d hm , c cc d u & t t i khai bo c a cc tham s v k.
( & , & k);

Lu : Hm khng c n tr v gi tr g nn n c khai bo v i t kha cho ki u gi tr tr v v khng c n c l nh km gi tr trong thn hm.

71

<

> ; ( & , & k) k k; ";

<< " >> >> ;

() 1, << " , << " << " ; k1; ( 1, k ; ( ,

k1); " << 1 << " k ); " << << " k " << ( k1 +

k " <<

k1 <<

k " << k );

<<

' 1 ' k 6 k 11
Hnh 4.6: V d v truy n tham bi n cho hm.

k k k

1 6

Nh ni trn, vi c cho php hm c g i truy nh p tr c ti p t i d c a ni g i hm gy nguy c hm c g i ph r i d li u c a ni g i V y c cch no gi m b t ho c ngn ch n nguy c ny? l h ng chi u. M t khi m t tham chi u c khai bo l h ng, trnh bin d ch s b o r ng tham chi u s ch c dng c ch khng th s a i bi n chi u t i. 4.5.3. Tham s m c nh

li u hm. tham m n m

Khi khai bo hm, ta c th t s n m t gi tr m c nh cho cc tham s . Cc tham s ny ph i ng cu i danh sch. t gi tr m c nh, ta ch c n vi t d u gn v gi tr m t nh cho tham s t i khai bo hm. N u tham s khng c truy n gi tr khi g i hm, gi tr m c nh s c dng. Ng c 72

l i, n u m t gi tr c truy n vo tham s th gi tr m c dng gi tr c truy n vo.

nh s b b qua

Hnh 4.7 minh h a v cch khai bo v s d ng tham s m c nh. Trong , tham s hnh th c c a hm c gi tr m c nh l 9. L n g i hm th nh t cung c p i s cho c hai tham s ( w = 1 v = 5) v ta thu c k t qu l 15. L n g i hm th hai ch cung c p i s c gi b ng 1 cho tham s w , cn tham s s nh n gi tr m c nh (9), ta thu c k t qu l 45.
< > ; w , =9)

( ;

= ; w <= += w ;

; ;

++)

() w L L = << " = << " ; ( w = 1; = ; ( w L " << L ); " << , << L ; );

<<

Hnh 4.7: V d v tham s m c

nh.

V nguyn t c, trnh bin d ch s duy t danh sch cc i s truy n vo t tri qua ph i, v l n l t g n cc i s cho cc tham s hnh th c tng ng. Khi k t thc danh sch i s , nh ng tham s hnh th c cha c truy n gi tr s 73

nh n gi tr m c nh. Lu : s i s truy n vo ph i nhi u hn ho c b ng s tham s hnh th c khng c g n gi tr m c nh.

4.6. Hm trng tn
Trong C++, hai hm khc nhau c th c tn trng nhau (function overloading) n u danh sch tham s (ch quan tm n ki u d li u m khng quan tm n tn c a tham s ) c a hai hm l khc nhau. V d ,
( ( ( x); x); x,

);

l ba hm khc nhau trong C++. M i khi c n d ch m t l i g i hm c tn , trnh bin d ch ki m tra ki u d li u c a i s v s l ng cc i s trong l i g i hm xc nh xem hm c g i l hm no trong ba hm c nh ngha. V d trong Hnh 4.8 minh h a vi c khai bo v s d ng cc hm trng tn li t k trn. C ba hm c g i t trong hm v i danh sch tham s khc nhau. K t qu ch y chng trnh ch ng t trnh bin d ch g i ng hm cho cc b i s khc nhau.

74

<

> ; ( x) " << x << ;

<< "

( << "

b b

x) " << x << ;

( << "

x,

) " << x << " " << << ;

() (1); (1 ); (1, ); ;

1 b 1
Hnh 4.8: V d v hm trng tn.

Cc hm trng tn c phn bi t b i ch k c a hm. Ch k c a m t hm bao g m tn c a hm v danh sch ki u tham s theo th t khai bo. Theo quy t c , ba l nh khai bo hm d i y c ch k trng nhau nn khng c C++ ch p nh n lm cc hm trng tn:
( ( ( x); x); );

Khi k t h p s d ng hm trng tn v tham s m c nh, c n lu trnh tr ng h p m t hm khi b qua cc tham s m c nh l i c l i g i gi ng h t v i m t 75

hm trng tn v i n. V d , khi ta c hai hm trng tn, m t hm c danh sch tham s r ng, hm kia cho php t t c cc tham s c th l y gi tr m c nh, ch ng h n () v ( =1, j= 1). Tnh tr ng ny s gy l i bin d ch do tnh tr ng nh p nh ng khng th xc nh m t l i g i hm ng v i hm no. C++ cn cho php s d ng c ch hm trng tn nh ngha cc phin b n khc c a cc php ton c s n dng cho cc ki u d li u khng c b n. Ch ng h n l p trnh vin c th nh ngha ki u d li u s ph c v vi t php c ng (+) dnh cho ki u d li u ny. N i dung chi ti t v ch ny n m ngoi ph m vi c a cu n sch ny, ng i c c th tm hi u t i [2].

4.7. Hm

quy

Trong cc v d t u cu n sch, ta lm quen v i vi c m t hm g i m t hm khc. quy l d ng g i hm c bi t: hm quy l hm ch a l i g i t i chnh n, tr c ti p ho c gin ti p (qua m t hm khc). D ng hm ny c dng bi u di n cc thu t ton quy a m t bi ton v m t bi ton tng t nhng c kch th c nh hn. y l ch ph c t p, s c ni n m t cch y hn trong cc mn h c cao hn c a ngnh Khoa h c My tnh. Ph n ny ch gi i thi u v quy m c n gi n nh t. V d i n hnh th ng c dng minh h a cho hm quy l bi ton tnh giai th a c a m t s . Giai th a c a n c tnh theo cng th c quy: n! = n * (n-1) * (n-2) * (n-3) ... * 1 tng ng v i: n! = n * (n-1)! Ngha l, gi s f(n) l giai th a b c n, f(n) c f(0) = 1 f(n) = n * f(n-1) Trong , dng th nh t l tr ng h p c b n, dng th hai l cng th c quy. Hm quy vi t b ng C++ v c b n l gi ng h t v i cng th c quy trn. Hnh 4.9 m t hm quy tnh gi tr c a n! Hm quy bao g m m t kh i l nh chia hai tr ng h p c b n v t ng qut. Tr ng h p c b n x y ra n u 1, khi hm k t thc tnh ton v tr v gi tr 1 l 76 nh ngha nh sau:

giai th a c a . Tr ng h p cn l i ( > 1), hm g i ( - 1) r i tr v k t qu l tch c a v ( - 1) .

quy

tnh gi tr c a

Trong hai ph n chnh c a hm quy, tr ng h p c b n nhn qua c v n gi n nhng th c ra l i c vai tr r t quan tr ng trong hm quy. N u thi u ho c c nh m l n khi vi t tr ng h p ny, ho c s su t trong b c quy lm n khng th h i t v tr ng h p c b n th chng trnh c nguy c quy v t n n khi c n ki t b nh dnh cho chng trnh. Hi n t ng ny tng t nh vng l p v t n.
< > ; ( ( <= 1) 1; ( b b ( -1)); = 1 ( -1) )

() = << ; << " ; = " << ( );

}
Hnh 4.9: V d v hm quy tnh n!.

M t i m c n nh ch trong chng trnh tnh giai th a l ki u tr v cho hm tnh giai th a. Gi tr c a giai th a tng r t nhanh so v i : 10! t n gi tr 3628800; n u dng ki u (c kch th c 4 byte h u h t cc b n ci t C++) th giai th a c a 16 b t u v t ra ngoi kho ng gi tr c a (hy th b ng cch s a chng trnh v d trong Hnh 4.9). Do , c th p ng gi tr l n hn c a , ki u d li u cho gi tr giai th a ph i c kch th c l n. Ti li u C++ chu n quy nh ki u c kch th c l n nh t trong cc ki u nguyn v g m t nh t 4 byte. Ki u (vi t ng n g n l ) ch g m cc gi tr khng m nn c th lu gi tr t 0 t i t nh t 4294967295, ta nn ch n ki u d li u ny cho ki u tr v c a hm tnh giai th a.

77

Bi t p
1. Vi t m t hm nh n tham s u vo l 5 s nguyn, v tr v k t qu l trung bnh c ng c a 5 s nguyn . Hi n k t qu tr v c a hm ra mn hnh. 2. Hy tm nh ng hm trng nhau trong danh sch cc hm sau: a) int foo (int x) b) int foo (float x) c) float foo (int y) d) float foo (int x, int y) e) float foo (int x, float y) f) int foo (int student, float teacher) 3. Khi no th nn truy n i s cho hm theo ki u truy n gi tr , khi no th nn truy n theo ki m tham chi u? 4. Vi t m t chng trnh c m t hm v i 5 tham s d ng tham chi u nh p vo 5 s nguyn t bn phm. Tm v hi n ra mn hnh t t c cc c p s c t ng b ng 50. tnh gi tr nh nh t c a 3 s . 5. Vi t chng trnh v i m t hm get_min Hm trn c vi t d a vo hm get_min tnh gi tr nh nh t c a hai s . Lu , hai hm ny trng tn. 6. Nh p t bn phm hai s nguyn x, y. Hy tnh v hi n ra mn hnh gi tr c a cc hm sau y: a) cn b c hai c a x b) ex c) log (x) d) x! e) x!! 7. Tm hi u hm rand sinh ra cc s ng u nhin trong ngn ng l p trnh C++. Hy vi t chng trnh sinh ra 9 s nguyn ng u nhin n m trong ph m 78

vi t 2 n 99. Hi n ra mn hnh cc c p s nguyn c sinh ra c t ng b ng 100. 8. Dy s Fibonacci c tnh nh sau: a) f (0) = 0; f (1) = 1; f(n) = f (n-1) + f(n-2) v i n > 1. b) Hy vi t chng trnh v i hm quy tnh f(k), v i k l gi tr nh p t bn phm. Hi n k t qu tnh c ra mn hnh. 9. Vi t chng trnh c m t hm quy tnh t ng t t c cc s nguyn dng chia h t cho 3 v nh hn m t s nguyn cho tr c nh p t bn phm. a k t qu tnh c ra mn hnh. 10. Vi t m t hm nh n php ton sau y: u vo l hai s x, y v tr ra 4 gi tr l k t qu c a 4

a) Thng c a php ton x chia cho y b) Tch c a php ton x nhn c) Ph n nguyn c a x chia cho y d) Ph n d c a x chia cho y 11. Cho m t dy s g m 5 s nguyn c gi tr i m t khc nhau c nh p vo t bn phm. Hy vi t hm f(k) tr ra gi tr c a ph n t l n th k trong dy s trn. Gi tr k c nh p vo t bn phm. Hi n k t qu tm c ra mn hnh. V d cho dy s : 14, 5, 11, 2, 23 f(1) = 23; f(3) = 11; f(5) = 2. 12. Nh p vo t bn phm 1 s nguyn x, vi t m t hm tnh t ng t t c cc ch s c a s nguyn x. Hi n k t qu tm c ra mn hnh. V d : x = 25701, th t ng cc ch s c a x l: 2+5+7+0+1 = 15.

79

Chng 5. M ng
Cc ki u d li u c b n nh gi i thi u trong Chng 2 khng bi u di n cc lo i d li u m cc bi ton i h i. M t v d l khi chng trnh c n lu v x l m t chu i cc ph n t d li u cng ki u, ch ng h n nh danh sch sinh vin trong tr ng ho c danh sch i m thi c a m t sinh vin, c th s p x p, tm ki m, v tnh ton cc con s th ng k trn chu i d li u . a s cc ngn ng l p trnh cung c p cc ki u d li u c c u trc ph c v cc nhi m v ny, trong , m ng l c u trc d li u thng d ng nh t.

5.1. M ng m t chi u
M ng m t chi u l m t chu i h u h n cc ph n t d li u thu c cng m t ki u d li u, t t i cc nh lin ti p trong b nh . M i ph n t trong m ng c m t ch s khc nhau. M ng cho php nh v v truy nh p n t ng ph n t b ng cch s d ng ch s c a ph n t . V d , i m s cho 7 mn thi c a m t sinh vin c th c lu tr trong m t m ng c kch th c b ng 7 (ngha l c 7 nh ) thay v khai bo 7 bi n khc nhau cho i m thi t ng mn. M ng c th c hnh dung nh sau:
30 0 85 1 76 2 90 3 72 4 80 5 88 6

trong , m i bi u di n m t ph n t c a m ng trong tr ng h p ny l m t gi tr thu c ki u . B y ph n t c a m ng c nh s l n l t t 0 n 6, cn g i l ch s c a cc ph n t trong m ng. B y ph n t c a m ng c th c xem nh 7 bi n ki u v i "tn" c a chng l , 1 , , 3 , , , v 6 , trong ch s c a m i ph n t c t trong c p ngo c vung. Khi truy nh p m t ph n t m ng, c th dng ch s l m t gi tr nguyn ho c m t bi u th c c gi tr nguyn. V d , v i bi n c gi tr b ng 3, l nh sau gn gi tr 100 cho :
+ = 1 ;

cn l nh sau tnh trung bnh c ng c a vo bi n :

1 r i ghi k t qu

80

= (

1 )

5.1.1. Khai bo v kh i t o m ng Cng nh m t bi n bnh th ng, m ng ph i c khai bo tr c khi s d ng. C php khai bo m t m ng trong C++ c d ng: ki u_d _li u tn_m ng s _ph n_t
;

trong , ki u_d _li u l m t ki u d li u h p l (ch ng h n , b ), tn_m ng l m t nh danh h p l , v s _ph n_t (lun ngo c vung) quy nh s l ng ph n t m m ng c n ch a. V d , m ng trong v d
;

, , t trong c p

trn c khai bo nh sau:

Lu : gi tr s ph n t t trong c p ngo c vung ph i l m t h ng s , do cc m ng khai bo ki u ny thu c b nh tnh v ph i c kch th c c xc nh tr c khi chng trnh th c thi. M ng v i kch th c ng s c ni n trong chng sau. Hnh 5.1 minh h a vi c khai bo v s d ng m ng m t chi u. Chng trnh trong hnh yu c u ng i dng nh p i m cho 7 mn h c, l n l t c ng d n t ng i m r i tnh i m trung bnh. r ng chng trnh s d ng m t h ng bi n (NU B _ U ) lu tr kch th c m ng, cng l s mn h c, thay v s d ng gi tr 7 trong ton b o n m. Gi tr ch xu t hi n ng m t l n khi khai bo h ng NU B _ U . V i cch s d ng h ng nh v y, n u ta mu n thay i s mn h c m chng trnh x l, ta ch c n s a duy nh t m t v tr trong chng trnh l l nh khai bo h ng NU B _ U thay v ph i lm m t cng vi c t n th i gian v d gy l i l tm v s a t t c cc gi tr 7 c lin quan (trong cc chng trnh ph c t p hn, khng ph i gi tr 7 no cng lin quan n s mn h c).

81

<

> ; _ U = ;

NU B ()

NU B = ; ( << " >> = + << " ;

< NU B

++) << " ";

" << ; ; " << NU B _ U

3 8 6 3 9 8 88

The average score is 74.42857


Hnh 5.1: V d v khai bo v s d ng m ng.

Lu s khc nhau v ng ngha c a gi tr bn trong c p ngo c vung: t i l nh khai bo m ng th n l kch th c m ng, cn khi truy nh p ph n t c a m ng th n l ch s c a ph n t m ng. Ta c th khai bo m ng ch a b t c lo i d li u no ngo i tr tham chi u. Ch ng h n ta c th khai bo m t m ng ki u ch a m t xu k t . Khi khai bo m t m ng, ta c th kh i t o gi tr cho cc ph n t c a m ng theo cch sau, v i lu r ng s gi tr n m trong danh sch kh i t o khng c v t qu kch th c c khai bo c a m ng.

82

6 ,

, 89,

, 88, 3 , 9

Ta cng c th b qua khng khai bo kch th c c a m ng C++ t xc nh thng qua di c a dy kh i t o. V d l nh sau y cho hi u qu gi ng h t l nh trn:
= 6 , , 89, , 88, 3 , 9 ;

N u khng c kh i t o, cc ph n t c a m ng s c gi tr khng xc nh cho n khi ta gn cho chng m t gi tr no . Vi c s d ng cc gi tr khng xc nh s d n n l i l-gic. 5.1.2. ng d ng c a m ng

M ng c th c dng lu tr v tnh ton nhi u d ng d li u. D th y nh t l dng m ng lu tr m t chu i gi tr , ch ng h n nh dy i m s c a cc mn h c nh v d trong Hnh 5.1. Ta c th dng m ng bi u di n t p h p, ch ng h n m ng = 1, , 1 i di n cho t p h p [0, 2], trong ph n t c gi tr khc 0 mang ngha r ng gi tr c m t trong t p h p. Ngoi ra, ta c th dng cc ph n t m ng lm cc con m. Chng trnh v d trong Hnh 5.2 gi l p vi c tung xc x c v th ng k s l n ra cc m t c gi tr t 1 n 6. Chng trnh s d ng m ng ch a cc con m, trong dng m s l n tung xc x c c m t c gi tr . Vng th nh t trong chng trnh th c hi n gi l p vi c tung xc 6.000.000 l n, sau m i l n tung l i tng con m tng ng. gi l p tung xc x c, chng trnh dng hm sinh s ng u nhin () thu c th vi n b, v n n m trong b th vi n chu n c a ngn ng C. Hm ny tr v m t gi tr nguyn ng u nhin trong kho ng t 0 n AND_ AX (m t h ng s c nh ngha trong b, c gi tr ph thu c t ng b ci t khc nhau c a C++ nhng c m b o l khng nh hn 32767). c c m t gi tr ng u nhin trong m t kho ng gi tr , ta k t h p (), php l y ng d v cc php tnh s h c khc. V d , () % 6 + 1) nh trong chng trnh cho k t qu l m t s cng th c ( ng u nhin trong o n t 1 n 6. Th c ra hm rand() ch sinh ra cc s gi () sinh ra khi c g i l p i l p ng u nhin (pseudocode). Chu i s m l i trng c v ng u nhin nhng m i l n ch y chng trnh l i cho ra cng m t chu i. chu i s m () sinh ra m i l n m i khc, ta c n dng km hm () tr c khi g i () l n u trong chng trnh. Hm () l y m t tham s ki u int v l y gi tr ny lm h t gi ng cho chu i ng u nhin s c sinh. Cc h t gi ng khc nhau s cho chu i khc nhau. Trong chng

83

trnh v d , ta dng th i gian hi n t i lm h t gi ng (g i hm b ng 0).


< < < < > > b> > ; () b b ( ( ) ); 1, ( F , ; = 1; <= 6 = 1 + () % F ++; F F = 6; + 1

() v i

is

; b

; b

++ ) ;

<< "F

" <<

( << ;

= 1; << "

<= " <<

; <<

++ ) ;

F 1 3

1 9 999 8 999 61 9989 99993 1 13


Hnh 5.2: S d ng m ng m.

84

5.1.3. Trch nhi m ki m sot tnh h p l c a ch s m ng i v i m ng c khai bo v i kch th c n, ch s c a cc ph n t trong m ng l cc s nguyn t 0 n n1. Ngoi ra, cc gi tr khc u khng h p l . Vi c truy nh p m ng b ng cc ch s khng h p l , ch ng h n khi truy nh p n -1 hay , c th d n n cc thay i khng mong mu n i v i d li u vng b nh bn ngoi m ng (c th thu c v cc bi n khc), h u qu l chng trnh ch y sai ho c g p s c d ng t ng t. Trong nhi u ngn ng l p trnh, vi c truy nh p m ng c ki m sot t ng trnh tr ng h p truy nh p v i ch s khng h p l . Tuy nhin, trong C++, vi c truy nh p n cc ph n t c a m ng v i ch s nh hn 0 ho c l n hn 1 khng h ph m l i c php, vi c truy nh p ra ngoi m ng khng gy l i khi d ch nhng c th gy l i khi ch y. L p trnh vin c trch nhi m ki m sot cc gi tr ch s m ng trnh tr ng h p ny. 5.1.4. M ng lm tham s cho hm C th dng m ng lm tham s cho hm. Hnh 5.3 l k t qu c a vi c s a chng trnh trong Hnh 5.1, a hai nhi m v nh p d li u cho m ng v tnh i m trung bnh vo hai hm v truy n m ng vo trong hai hm . r ng tuy cc tham s m ng khng c khai bo v i k t "&" trong ph n khai bo v nh ngha hm, nhng th c ch t chng l cc tham chi u (thay v gi tr ). Ni cch khc, khi chng trnh th c thi, cc hm khng t o cc b n sao ring c a cc m ng c truy n lm tham s (vi c t o b n sao ny c th c chi ph r t cao v b nh .) V y lm th no khi ta c n quy nh r ng m t hm khng c s a i m t tham s m ng no ? (v d khng nn cho hm quy n s a m ng .) Gi i php m C++ cung c p l t kha . Ta s a ph n khai bo tham s c a hm t
( , );

thnh
( , );

K t qu l trnh bin d ch s khng ch p nh n cc dng l nh s a gi tr c a tham s m ng bn trong hm . Nn s d ng t kha cho t t c cc tham s m hm khng c nhu c u thay i.

85

<

> ; _ ( U = , = ; < ; ) ; ++) " << ; << " ";

NU B

( << " >>

( = ( = + ; ; = ;

< ;

++)

() NU B ( _ U _ ; U ( " << ); , NU B _ U ; );

, NU B =

<< " ;

Hnh 5.3: V d v m ng lm tham s c a hm.

5.2. M ng nhi u chi u


C u trc m ng c th c nhi u hn m t chi u. M ng nhi u chi u c th c miu t l "m ng c a cc m ng". Ch ng h n, c th hnh dung m ng hai chi u l m t b ng hai chi u g m cc dng v cc c t, m i lu m t gi tr thu c cng m t ki u. V d , m ng A d i y l m t m ng kch th c 3x4 g m cc ph n t ki u nguyn. A 1 l bi u th c truy nh p t i ph n t t i m u xm (dng 2, c t 1).

86

1 A 1 1 8 9 3 6 11

M t v d khc v m ng hai chi u: lu m t bn c ca-r, ta c th dng m t m ng hai chi u ch a cc k t . Trong , k t '.' bi u di n m t tr ng trn bn c , cc k t 'x' v 'o' l n l t bi u di n cc k hi u trong tr chi c ca r. Khai bo m ng hai chi u nh sau:
B A D_H H = ; B A D_ D H = 6; B A D_H H B A D_

D H ;

Ta dng hai ch s hng v c t


b 1 = 'x';

truy nh p t ng ph n t trong m ng, v d :

o n chng trnh sau c th


( ( << b << ; w = ,

c dng

v bn c ra mn hnh.
++)

w < B A D_H H , w++) = , < B A D_ D H, w ;

Cng nh m ng m t chi u, m ng nhi u chi u cng c th dng lm tham s cho hm. Lu , khi khai bo m ng nhi u chi u nh l tham s c a hm, chng ta ph i khai bo kch th c t t c cc chi u c a m ng, ngo i tr chi u u tin c th b tr ng.
B ( b N_ D H );

l m t khai bo h p l , cn
B ( b );

l m t khai bo khng h p l . i v i cc m ng c s chi u nhi u hn 2, c php cng tng t . V d

87

);

5.3. M ng v xu k t
Chng ta dng n cc xu k t , ch ng h n " " trong Hnh 5.3. Cc ngn ng l p trnh u c c u trc xu k t (string), trong quy nh cch tham chi u t i t ng ph n t trong xu. Km theo l m t b cc hm v th t c th c hi n cc php ton trn d li u xu, ch ng h n nh xc nh di xu, so snh n i dung xu, ghp xu. B th vi n chu n C++ c th vi n kh m nh v i ki u d li u dng x l v thao tc v i cc xu k t . Tuy nhin, v b n ch t, xu k t l chu i cc k t , nn ta c th bi u di n xu k t b ng m t m ng m t chi u g m cc ph n t ki u . Nhi u ti n ch trong th vi n chu n C++ s d ng xu k t ki u m ng, cc chng trnh C++ truy n th ng cng nh nhi u chng trnh hi n i v n s d ng xu k t d ng m ng. Do , ta v n c n h c s d ng thnh th o ki u d li u ny. V d , m ng sau y g m 20 ph n t ki u
;

V l thuy t, m ng trn c th ch a m t chu i cc k t v i di khng qu 20. Nhng ta cn c th lu t i cc xu k t c di ng n hn, ch ng h n " " hay "H ". Xu " " m ta g p cng c c u trc tng t , i m khc bi t ch l y l m t h ng xu k t . H ng xu k t c th dng lm gi tr kh i t o t i l nh khai bo m ng . V d :
= "H ";

Do m ng c th lu xu k t c di nh hn kch th c c a m ng, ta c n c c ch xc nh i m cu i hay di c a xu. C++ s d ng k t (' ') nh d u k t thc c a xu k t . V d , m ng c th dng lu xu " " hay "H " nh trong Hnh 5.4.

88

greeting

H
Hnh 5.4: Xu k t lu trong m ng.

Lu : cc k t ' ' n m cu i xu nh d u k t thc xu; cn cc mu xm k hi u cc ph n t m ng n m ngoi xu (tuy v n n m trong m ng) v c gi tr khng xc nh. Khi khai bo m ng lu tr m t xu k t , ta c n ch khai bo kch th c m ng l n ch a c k t n m cu i xu.
< > ; AX_NA () AX_NA << " >> ; << "H " << ; _L N H ; "; << " "; _L N H = 1 ;

H
Hnh 5.5: V d v xu k t .

Hnh 5.5 minh h a m t chng trnh v d nh p m t xu k t v ghi ra mn hnh. Ta c th th y r ng m ng k t (hay xu) c s d ng nh l m t cho php c cc xu k t bi n bnh th ng i v i cc l nh vo ra d li u, khng ch a k t tr ng. N u mu n m b o xu nh p vo s khng di qu kch th c c a m ng name, ta c th dng hm w ch n s k t s c c vo. V d l nh sau gi i h n s k t c c vo khng v t qu 99 v dnh v tr th 100 trong m ng cho k t null nh d u cu i xu.

89

>>

w(1

) >>

N u ta mu n nh p c m t dng, trong c c cc k t tr ng (tn y th ng ch a d u tr ng phn cch gi a h , m, v tn), ta c th dng l nh () cho cng vi c ny. V d , c vo m ng m t dng text c di t i a 100, k t thc b ng k t xu ng dng, ta dng l nh:
( , 1 , ' ' );

lu xu k t input, tham s th hai l di t i a c a input, v tham s th ba l k t nh d u cu i input (k t ny s khng c ghi vo m ng ch). 5.3.1. Kh i t o gi tr cho xu k t C hai cch kh i t o gi tr cho xu k t ngay t i l nh khai bo: 1. Kh i t o xu theo cch kh i t o m ng:
= 'H', ' ', ' ', ' ', ' ', ' ' ;

() i h i tham s th nh t l m ng

2. Dng h ng gi tr

kh i t o xu:
= "H ";

i v i cch th nh t, ta ph i t i n k t cu i xu. Cn cch th hai, cc bi u di n gi tr xu c d ng dng c p d u nhy kp c t ng km thm k t . Lu r ng chng ta ang ni v cng o n kh i t o gi tr cho xu ch khng ni v l nh gn gi tr cho c xu. Cng nh cc lo i m ng ni chung, i v i m ng (hay xu k t ), khng c php dng m t l nh gn tr hng lo t cho cc ph n t trong m ng. Cc l nh sau s gy l i khi d ch:
= 'H', ' ', ' ', ' ', ' ', ' = " "; ' ;

5.3.2. Th vi n x l xu k t c a C++ (v n l th vi n c a C) cung c p m t lo t Th vi n cc hm ti n ch cho vi c x l xu k t , ch ng h n nh tr v di xu, sao chp xu, v so snh xu. Xem thm chi ti t v th vi n ny trong Ph l c C.

90

5.4. Tm ki m v s p x p d li u trong m ng
Tm ki m d li u trong m ng l xc nh xem m t gi tr no ( c g i l kha) c m t trong m ng hay khng, n u c th n n m v tr no. S p x p m ng l s p t l i v tr c a cc ph n t m ng theo m t trong hai th t : gi tr kha tng d n ho c gi m d n. V d , m t danh sch t c th c s p x p theo th t t i n, danh sch sinh vin c s p x p theo s sinh vin. M c ny gi i thi u m t s thu t ton c b n cho vi c tm ki m v s p x p d li u trong m ng. 5.4.1. Tm ki m tuy n tnh Thu t ton tm ki m tuy n tnh (linear search) duy t tu n t t ng ph n t trong m t m ng, so snh kha v i m i ph n t . Khi g p m t ph n t kh p v i kha, thu t ton k t thc v tr v ch s c a ph n t . N u duy t n h t m ng m v n khng tm th y ph n t no kh p v i kha, thu t ton k t lu n l kha c n tm khng c trong m ng. V d , v i m ng {3, 18, 2, 3, 10, 1}, n u ta th c hi n tm ki m v i kha b ng 10, thu t ton tm ki m tuy n tnh s duy t l n l t t ph n t u tin (3) cho t i khi g p ph n t th nm (10) v tr v k t qu l ch s m ng c a ph n t (v i m ng C++ nh s t 0, k t qu c a thu t ton trong tr ng h p ny s l 4).

91

<

> ; ( , <= ) ; , ++) ; k )

( ( -1;

; == k

() 1 ; << " >> = >= ) << << ; k ; ( << " << " , , " << "; ); ; "; = 1 , 3, = 6; , , , 1 ;

k 3 k
Hnh 5.6: V d v tm ki m tuy n tnh.

3 1

Chng trnh trong Hnh 5.6 minh h a thu t ton tm ki m tuy n tnh trong m ng. Trong , thu t ton tm ki m c ci trong hm tr v ch s c a ph n t m ng kh p v i kha tm ki m ho c tr v -1 n u khng tm th y. 5.4.2. Tm ki m nh phn Thu t ton tm ki m tuy n tnh c gi i thi u m c tr c tuy n gi n nhng c ph c t p O(n) nn cho hi u qu khng cao i v i d li u l n. Tm ki m

92

nh phn (binary search) l m t thu t ton tm ki m ph c t p hn nhng cho hi u qu cao hn. Tuy nhin, n cn i h i m ng u vo c s p x p. Gi s m ng c s p x p tng d n, thu t ton tm ki m nh phn ho t ng nh sau: l n l p u tin, l y ph n t n m gi a m ng. N u ph n t kh p v i kha th thu t ton k t thc. N u n c gi tr l n hn kha th ch c ch n n a sau c a m ng ch a ton cc ph n t l n hn kha, v do khng c n tm t i ph n ny. Ngha l vng tm ki m nay c gi i h n ch cn l n a u c a m ng. Cn n u ph n t gi a c gi tr nh hn kha, v i l p lu n tng t nh trn, ta c gi i h n c n tm ki m thu h p l i ch cn l n a sau c a m ng. Nh v y, t i m i l n l p, thu t ton so snh kha v i ph n t n m gi a ph n m ng c n tm ki m ho c l th y ph n t kh p v i kha ho c l lo i b m t n a m ng ra kh i ph m vi c n tm ki m. Thu t ton k t thc khi tm th y m t ph n t c gi tr b ng kha ho c khi ph m vi c n tm ki m b gi m xu ng thnh m t m ng con c kch th c b ng 0. V d , cho m ng {1, 3, 4, 7, 10, 12, 15}. tm ph n t c gi tr 10, u tin thu t ton l y ph n t n m gi a m ng l 7 v so snh v i 10. V 7 nh hn 10, thu t ton b qua n a u c a m ng, ph m vi tm ki m thu h p thnh o n m ng {10, 12, 15}. T i l n l p ti p theo, thu t ton l i l y ph n t n m gi a l 12 v so snh v i kha 10. V 12 l n hn 10 nn n a sau c a o n {10, 12, 15} b b qua, ph m vi tm ki m c thu h p l i ch cn o n m ng g m m t ph n t {10}. L n l p th ba, ph n t n m gi a m ng (ph n t duy nh t cn l i trong o n c n tm) c gi tr trng v i kha nn thu t ton k t lu n tm th y ph n t c gi tr 10. Thu t ton c minh h a b ng chng trnh trong Hnh 5.7.

93

<

> ; ( = , > << ( ( , = ) << " " << = ( + ) == k ) > k ) = + 1; << ; = ; ; ; ; , k )

-1;

() 1 ; << " >> = b >= ) << << ; k ; ( << " << " , , " << "; ); ; "; = 1, 3, = ; , , 1 , 1 , 1 ;

}
Hnh 5.7: V d v tm ki m nh phn.

5.4.3. S p x p ch n S p x p ch n (selection sort) l m t trong nh ng thu t ton s p x p n gi n nh t, nhng l i c hi u qu khng cao i v i d li u c kch th c l n (m ng c s ph n t l n). Ho t ng c a thu t ton ny r t n gi n. l n l p th nh t, ta tm ph n t nh nh t c a ton m ng r i tro v tr c a n v i ph n t u tin (gi thi t r ng ta ang c n s p x p m ng theo th t tng d n). L n l p th 2, ta tm ph n t nh th nh trong ton m ng, ngha l ph n t nh nh t c a o n m ng tnh t ph n t th hai tr i, r i tro v tr c a n v i ph n t th 94

hai trong m ng. Thu t ton ti p t c cho n l n l p cu i cng khi ph n t l n nh m ng c ch n ra v tro v i ph n t c ch s st cu i, d n n vi c ph n t l n nh t m ng n m t i v tr cu i m ng. T ng qut, k t qu c a l n l p th i l ph n t nh th i c a m ng c x p vo v tr th i trong m ng. Hnh 5.8 minh h a thu t ton s p x p ch n.
< > ; ( ( = ; < , - 1; ) ++) , ( = ; j = + 1; j < ( j < w = = = ; ; ; ; j++) ) = j; -1

() 1 << " >> << " ( , ; "; ; "; = ( << " ( = << ; ; < << " "; ; < , "; ; ++) ; ++) >> ;

);

Hnh 5.8: S p x p ch n.

95

Bi t p
1. Nh p vo t bn phm m t danh sch cc s X1, X2,, X2n-1, X2n. Hy vi t m t hm tnh gi tr c a bi u th c sau y (hi n k t qu tm c ra mn hnh): ( X1 + X2n) * (X2 + X2n-1) ** (Xn + Xn+1) 2. Nh p vo t bn phm danh sch tn cc b n sinh vin trong l p. Hy tm hi u v ci t thu t ton s p x p n i b t (bubble sort) s p x p danh sch tn theo th t tng d n. Hi n danh sch sau khi s p x p ra mn hnh. 3. Nh p vo t bn phm m t danh sch cc s nguyn. Hy hi n ra mn hnh t t c cc b s (a, b, c) m t ng c a chng b ng 25. 4. M t qu i c chia thnh m t l i vung c kch th c m*n vung. M i vung ch a m t s nguyn i di n cho cao t i vung . Hy tm v hi n ra mn hnh: vung c vung c cao l n nh t cao nh nh t gi a cao hn gi a th p hn ghi

T t c cc hnh vung c kch th c 3*3, m vung cc vung xung quanh T t c cc hnh vung c kch th c 3*3, m vung cc vung xung quanh

5. Nh p vo t bn phm m t xu k t . S d ng ki u d li u char[] ra mn hnh cc k t qu sau: di c a xu k t v a nh p

Xu k t sau khi lo i b t t c cc d u ?, ! Xu k t sau khi chn vo gi a xu t C++. Xu k t sau khi xa b 5 k t n m gi a

6. Nh p vo t bn phm m t danh sch tn cc b n sinh vin trong l p, hy m xem c bao nhiu b n c tn v i ch ci b t u l T, C, V, A,

96

Q. Tm tn c s b n trng nhau l nhi u nh t. Hi n k t qu tm c ra mn hnh. 7. Nh p vo t bn phm m t xu k t l danh sch tn cc sinh vin. Hai tn ng li n nhau c cch nhau b i t nh t m t d u cch. Hy tnh xem c bao nhiu sinh vin trong danh sch. V d : D li u vo Vinh tuan vinh blah blah K t qu tng ng 5

8. Nh p m t xu k t t bn phm. Hy chu n ho xu b ng cch lo i b cc k t khng ph i ch ci, d u cch, d u ph y, d u ch m. Cc t cch nhau b i ng m t d u cch v ch vi t hoa ch ci u tin. V d : D li u vo tOi te1N !LA ng2uyen v3an aN;. K t qu tng ng Toi Ten La Nguyen Van An.

9. Nh p vo t bn phm 1 dy k t g m cc k t 0..9. Hy tnh s l ng k t 0, s l ng k t 1,, s l ng k t 9 trong xu v a nh p vo. Hi n k t qu ra mn hnh. 10. Nh p t bn phm 2 s nguyn l n (s l ng ch s l n hn 100). Hy vi t chng trnh tnh v hi n k t qu ra mn hnh: T ng c a hai s trn Hi u c a hai s trn Tch c a hai s trn 11. Nh p t bn phm 1 dy cc ch s t 0 n 9. Hy vi t chng trnh ch cc ch s thu c (hi n k t qu ra mn hnh): S nguyn c gi tr l n nh t S nguyn c gi tr nh nh t V d : Dy u vo: 1312013 o

S nguyn c gi tr l n nh t: 3321110 97

S nguyn c gi tr nh nh t: 0111233

98

Chng 6. Con tr v b nh
Con tr l m t cng c m m t s ngn ng l p trnh b c cao, c bi t l C v C++, cung c p cho php chng trnh qu n l v tng tc tr c ti p v i b nh . N gip chng trnh linh ng v hi u qu . Tuy nhin, s d ng con tr cng d d n n sai st v kh pht hi n ra l i.

6.1. B nh my tnh
hi u v con tr , tr c tin ta s tm hi u v b nh my tnh. Ta c th hnh dung b nh my tnh l m t lo t cc nh n i ti p nhau, m i nh c kch th c nh nh t l m t byte. Cc nh n ny c nh s lin t c, nh sau c s th t hn s th t c a nh li n tr c l 1. T c l nh 1505 s ng sau nh 1504 v ng tr c nh 1506 (xem Hnh 6.1). S th t c a nh c th c g i l a ch c a nh .
a ch b nh 1 3 1 1 1 6 1 1 8 1 9 1 1
Hnh 6.1: Bi n

N i dung Tn bi n nh c 1 byte 'H' ' ' ' ' ' ' ' ' ' ' greeting

ee i

xu k t "Hello" trong b nh .

6.2. Bi n v

a ch c a bi n

Bi n trong m t chng trnh l m t vng b nh c dng lu d li u. Vi c truy nh p d li u t i cc nh c th c hi n thng qua tn bi n. T c l, ta khng ph i quan tm n v tr v t l c a b nh . Khi m t bi n c khai bo, ph n b nh c n thi t s c c p pht cho n t i m t v tr c th trong b nh , v tr c g i l a ch b nh c a bi n . V d , trong Hnh 6.1, bi n c a ch l 1504. Thng th ng, h i u hnh s quy t nh v tr c a bi n trong b nh khi chng trnh ch y.

99

l y a ch c a m t bi n, trong C++ ta s d ng ton t tham chi u a ch (&). Khi t ton t tham chi u tr c tn c a m t bi n, ta c m t bi u th c c gi tr l a ch c a bi n trong b nh . V d :
<< << & = 9; ; ; k b b 9 a b 9

Trong th c t , tr c khi chng trnh ch y, chng ta khng th bi t c c a bi n .

a ch

6.3. Bi n con tr
Bi n con tr l m t lo i bi n c bi t, c dng lu gi a ch c a cc vng nh . T c l, gi tr c a m t bi n con tr l a ch c a m t nh trong b nh . Hay ni m t cch hnh t ng, bi n con tr ch n m t nh trong b nh , n c dng gin ti p truy nh p n nh . V d , gi s ta c bi n ki u int n m t i a ch 0x2a52ec, bi n con tr A ang ch t i bi n . i u c ngha bi n A ang c gi tr 0x2a52ec v i u quan tr ng l c th dng A gin ti p truy nh p t i bi n b ng cch dng bi u th c ( A ), xem Hnh 6.2.
ptrApples apples

Hnh 6.2. Con tr ptrApples ch t i bi n apples, gin ti p truy nh p nh apples

Cng nh cc lo i bi n khc, bi n con tr c n c khai bo tr c khi s d ng. V i cc bi n v A ni trn, c th khai bo b ng l nh sau:


A , ;

trong , bi n A c khai bo thu c ki u (con tr t i m t gi tr int), cn bi n c khai bo thu c ki u . Lu l d u * k hi u ki u con tr ch p d ng duy nh t cho bi n n m ngay sau n ch khng p d ng cho t t c cc bi n n m sau, m i bi n con tr trong l nh khai bo c n c m t d u * t tr c n. V d , l nh sau khai bo hai bi n con tr :

100

Con tr c n c kh i t o b ng gi tr 0 (hay NULL) ho c m t a ch ngay t i l nh khai bo ho c b ng m t l nh gn. M t con tr c gi tr 0 hay NULL (m t h ng s tng ng v i 0 c nh ngha trong t p th vi n ) khng ch t i nh no v c g i l con tr null. M t con tr cha c kh i t o ch n m t vng b nh khng xc nh ho c cha c kh i t o, vi c v tnh dng con tr cha c kh i t o truy nh p b nh l m t l i l p trnh kh pht hi n, c th d n n d li u chng trnh b s a lm chng trnh ch y sai ho c gy s c lm s p chng trnh. y l m t trong nh ng c i m khng an ton c a ngn ng C/C++. Do , l p trnh vin nn ch kh i t o con tr ngay sau khi khai bo. truy nh p d li u t i nh m bi n con tr ch n ta s d ng ton t *. V d , ta dng bi u th c A truy nh p bi n m A ang tr t i. C th dng bi u th c A bn tri cng nh bn ph i c a php gn, ngha l c cng nh ghi gi tr vo nh .N u dng php ton truy nh p * cho con tr null, chng trnh s g p l i run-time v d ng l p t c. Hnh 6.4 minh h a v vi c khai bo v s d ng bi n con tr . Trong v d , ta khai bo m t bi n con tr A dng lu gi a ch nh c a bi n . L nh
A = & ; A

s gn a ch c a bi n cho bi n con tr tng t nh trong Hnh 6.2 v Hnh 6.3


a ch b nh x x x x 8 x2a52e x Hnh 6.3: Bi n con tr p N i dung nh c 4 byte

v t o hi u ng

Tn bi n

x2a52e

ptrApples

apples

Apples c gi tr l

a ch c a bi n apples.

Lu , cc tc ng trn nh bi n con tr A ch n cng chnh l cc tc ng c th c hi n trn bi n apples v ng c l i. C th l l nh 101

++;

s tng gi tr c a bi n do bi n con tr A Tng t , l nh


A += 1;

ln m t, ng ngha v i vi c tng gi tr ch n ln 1.

nh

s tng gi tr t i nh m bi n con tr tng gi tr c a bi n thm 1.

thm 1,

ng ngha v i vi c

Chng trnh trong Hnh 6.4 cn minh h a vi c in gi tr c a con tr ra mn hnh. C th dng cout in gi tr c a con tr nh i v i nhi u ki u d li u khc. Tuy nhin, nh d ng c a gi tr in ra ph thu c vo t ng trnh bin d ch, m t s h th ng in ra cc gi tr con tr d ng h c s 16 (nh trong hnh), cc h th ng khc s d ng nh d ng h th p phn.

102

<

> ;

, = 9; << " << "A A ; = & << " << "V ++; << " << "V A ; " << A " <<

<< " << &

; << ;

A " <<

<< A

; << ;

" << A += 1;

<< " <<

; A << ;

A << " << "V ;

" << A

<< " <<

; A << ;

9 A A V 1 V 11 V A 11
Hnh 6.4: Khai bo v s d ng bi n con tr .

x x A A 9 1

M t trong nh ng ng d ng th ng c a con tr l lm con ch y trn chu i cc nh lin ti p, ch ng h n nh m ng. Chng trnh trong Hnh 6.5 minh h a vi c . Trong chng trnh l m t vng l p c nhi m v duy t v in ra ton b cc ph n t c a m ng . Con ch y trong vng l p l con tr v i gi tr ban u l a ch c a ph n t u tin m ng . T i m i l n l p, ph n t m ng 103

hi n c tr t i c c b ng bi u th c r i in ra mn hnh, sau c tng thm 1 ( ++) v i hi u qu l n s tr t i ph n t ti p theo trong m ng. Vng l p d ng khi b t u tr v t ra xa hn v tr ph n t cu i m ng ( i u ki n l p l <= & 6 ).

Hnh 6.5: Dng con tr lm con ch y duy t m ng.

Hnh 6.5 cn minh h a cc php ton c ng v tr con tr v i m t s nguyn v cc php so snh con tr . C th dng cc php so snh b ng/khc v l n hn/nh hn cho con tr . Cc php ton ny so snh cc a ch lu trong cc con tr . M t php so snh th ng g p l so snh m t con tr v i 0 ki m tra xem c ph i l con tr null hay khng. Cc php so snh l n hn/nh hn i v i cc con tr l v ngha tr khi chng ang tr t i cc ph n t c a cng m t m ng. Trong tr ng h p , k t qu c a php so snh cho th y con tr ny tr t i ph n t m ng c ch s cao hn con tr kia. Trong Hnh 6.5, con tr ptr c so snh v i a ch c a ph n t cu i cng xem n ch y n v tr hay cha. Cc php ton c ng tr i v i con tr khng c ngha c ng hay tr chnh s nguyn vo gi tr lu trong bi n con tr . Th c t , gi tr c c ng vo hay tr i l s nguyn nhn v i kch th c c a ki u d li u m con tr tr t i. V d , gi s con tr ki u ang tr t i ph n t m ng v ki u d li u c kch th c 4 byte, l nh += 3; s gn cho gi tr 4020 (ngha l 4008 + 3 * 4) lm n tr t i . Xem minh h a t i Hnh 6.6.

104

Hnh 6.6. Php c ng 3 vo con tr ptr.

6.4. M ng v con tr
Trong C++, m ng v con tr c quan h ch t ch v i nhau v g n nh c th dng thay th cho nhau. M t ci tn m ng c th c coi nh m t h ng con tr , c th dng bi n con tr trong b t c c php no c a m ng. Gi s , khi khai bo m t m ng
;

ta khai bo m t vng nh lin ti p g m 7 , m i ch a m t s nguyn. Trong C++, m ng c ci t b ng con tr . C th l, tn m ng ( ) c th c coi l m t h ng con tr ki u tr t i nh u tin trong m ng ( ). truy c p n ph n t c ch s trong m ng ho c ( + ). V d , v ph n t u tin trong m ng. , ta c th s d ng u c ngha l

thao tc v i m ng c minh h a trong Hnh 6.7. Cch dng ki u con tr Trong vng l p l n l t in ra cc ph n t trong m ng, v i bi u th c ( + ) c dng truy nh p ph n t th trong m ng.

105

<

> ;

, =

) 1, ,3, , ,6, = ; + ; ++)

( << ; (

< ; ) << " ";

}
Hnh 6.7: S d ng tn m ng nh con tr .

Ng c l i, n u ta c l m t con tr ki u int, l nh sau gn gi tr c a cho lm n tr t i v tr u tin trong m ng .


= ;

L nh trn tng ng v i
= & ;

Sau ta c th dng bi n con tr l m t tn m ng.

thao tc m ng

nh th

Hnh 6.8 minh h a vi c , y ch l s a i nh t chng trnh trong Hnh 6.7 th c hi n cng m t nhi m v nhng l i dng v i c php m ng thay v dng tn m ng v i c php con tr .

106

<

> ;

, = =

) 1, ,3, , ,6, ; ; < ;

( << ;

; <<

++) ;

}
Hnh 6.8: S d ng con tr nh tn m ng.

6.5. B nh

ng

Trong t t c cc chng trnh v d tr c, ta m i ch dng b nh trong ph m vi cc bi n c khai bo trong m ngu n v i kch th c c xc nh tr c khi chng trnh ch y. V i C++, t t c cc bi n c khai bo trong chng trnh u n m trong b nh tnh v c kch th c xc nh tr c. N u chng ta c n n l ng b nh m kch th c ch c th bi t c khi chng trnh ch y th sao? Ch ng h n khi chng trnh c a ta c n lm vi c v i m t m ng m kch th c c a n khng xc nh c khi chng trnh cha ch y, v ta cng khng th c l ng di t i a m c n c d li u vo xc nh di c n thi t. Gi i php l s d ng b nh ng. Khng nh cc bi n thng th ng ch c n khai bo, cc bi n n m trong vng b nh ng c n c c p pht khi mu n s d ng v gi i phng m t cch t ng minh khi khng cn c dng n. Trong C++, con tr cng v i cc ton t w v pht v gi i phng d li u n m trong b nh ng. 6.5.1. C p pht b nh Khi m t bi n con tr
A

l cng c

xin c p

ng

c khai bo, v d
;

gi tr c a bi n con tr A cha c xc nh, ngha l n cha tr vo m t vng nh xc nh tr c no. Chng ta cng c th xin c p pht m t vng 107

nh ng, v vng nh ny c qu n l (tr t i) b i bi n con tr b ng cch s d ng ton t c p pht b nh ng w nh sau:


A = w ;

Lnh ny s c p pht m t vng nh cho m t gi tr ki u int, a ch vng nh A . Qu trnh c p pht b nh ny c th c ny c ghi vo bi n hi n trong qu trnh ch y chng trnh v c g i l c p pht b nh ng. Sau l nh c p pht trn, ta c th ti n hnh lu gi , c p nh t gi tr vng nh ny thng qua a ch c a n (hi n lu t i bi n A ). N u l nh c p pht khng thnh cng (ch ng h n v khng cn b nh ), A s nh n gi tr 0. L p trnh vin c n ch phng nh ng tnh hu ng ny. 6.5.2. Gi i phng b nh ng

Do l ng b nh ng l c h n, d li u t trong b nh ng nn c gi i phng khi dng xong dnh b nh cho cc yu c u c p pht ti p theo. Vi c gi i phng vng nh c th c hi n b ng ton t . V d , l nh sau gi i phng nh ki u m con tr A hi n ang tr t i.
A ;

Sau khi c gi i phng, vng nh pht b nh ng khc.

c th

c ti s d ng cho m t l n c p ng.

Hnh 6.9 minh h a v vi c c p pht, s d ng, v gi i phng b nh

108

<

> ;

( A Apples A << " A << " dele e p ; =

, ; ew i ; A += ; A Apples

" << " <<

A A

<< <<

; ;

}
Hnh 6.9: C p pht, s d ng v gi i phng b nh ng.

Lu : n u v s xu t c a ng i l p trnh hay v l do no m t i m t th i i m no chng trnh khng cn lu ho c c cch no tnh ra a ch c a m t vng nh c c p pht ng, th vng b nh ny c xem l b "m t". Ngha l chng trnh khng c cch g truy nh p hay gi i phng vng b nh ny n a, sau khi chng trnh k t thc n m i c h i u hnh thu h i. V d , o n chng trnh sau lm th t thot ph n b nh c c p pht do l nh w th nh t, do con tr duy nh t gi a ch c a nh b gn gi tr m i, ta khng cn c th l y l i c a ch c a vng nh s d ng ho c gi i phng.
1 = = 1 = w w ; ; ;

6.6. M ng

ng v con tr
c cho kch li u

Trong cc chng trnh v d t tr c n gi , kch th c c a m ng ph i xc nh tr c khi khai bo. T c l, kch th c c a m ng l m t h ng s tr c. Trong nhi u tr ng h p, chng ta kh c th xc nh tr c c th c c a m ng ngay t khi l p trnh, m kch th c ny ph thu c vo d u vo cng nh qu trnh ch y chng trnh.

109

kh c ph c tnh tr ng trn, C++ cho php chng ta s d ng con tr t o m ng c kch th c ng n m trong b nh ng. Nh ng m ng c t o theo cch c g i l m ng ng, b i kch th c m ng v vi c c p pht b nh cho m ng c xc nh v ti n hnh trong qu trnh ch y chng trnh. Vi c khai bo m ng ng c ti n hnh thnh hai b c: 1. Khai bo con tr m ng: Tr c tin, khai bo m t bi n con tr : data_type array_name; trong data_type l ki u d li u c a m ng, array_name l tn m ng. 2. Xin c p pht b nh : Sau khi khai bo, chng ta xin c p pht b nh cho bi n con tr b ng ton t new [] theo c u trc sau: array_name = new data_type [size]; h th ng s c p cho chng trnh m t vng nh lin ti p c th ch a c size ph n t c ki u data_type. a ch c a ph n t u tin c ch n b i bi n array_name. Lu , size c th l m t h ng s , ho c l m t bi n. Sau khi c p pht b nh thnh cng, ta c th i x v i bi n con tr array_name nh m t m ng thng th ng v i size ph n t . T c l, truy c p n ph n t th i trong m ng, ta c th s d ng array_name[i] ho c *(array_name + i). Gi i phng b nh : Khi chng ta khng s d ng n m ng ng n a, chng ta ph i ti n hnh gi i phng b nh xin c p pht b ng cch s d ng ton t delete [] nh sau:
delete [] array_name;

Lu khi gi i phng b nh
delete array_name;

ng cho m t m ng, n u ta s d ng l nh

th ch c nh array_name[0] c gi i phng, cn cc nh ti p theo c a m ng khng c gi i phng. Hnh 6.10 minh h a vi c s d ng m ng ng tnh t ng i m c a m t danh sch sinh vin nh p vo t bn phm. S l ng sinh vin khng c xc nh tr c m c ng i dng nh p vo t bn phm.

110

n l de n nt n e

t e e td; * e ; t e n e ; [])

n( nt nt n t n e n nte e

( nt t n

nt = 0; nt nte t e e [ nt];

e e

e ;

nt++) nt

nt t t l ( nt t t l t

= 0; nt = 0; += t l

nt e [

n e nt]; t t l

e ;

nt++)

endl;

et

n 0;

}
Hnh 6.10: M ng ng v con tr .

6.7. Truy n tham s l con tr


Nh c gi i thi u trong M c 4.5, C++ c hai phng php truy n d li u vo trong hm: truy n b ng gi tr v truy n b ng tham chi u. Trong phng php truy n b ng tham chi u, M c 4.5 ni v cch dng i s l tham chi u. Trong m c ny, chng ti s gi i thi u ki u truy n b ng tham chi u cn l i: dng i s l con tr . Cn nh r ng cc i s l bi n tham chi u cho php hm c g i s a gi tr d li u c a hm g i. Cc i s tham chi u cn cho php chng trnh truy n l ng d li u l n vo hm m khng ph i ch u chi ph cho vi c sao chp d li u nh khi truy n b ng gi tr . Cng nh v y, cc i s l con tr c th c s

111

d ng s a i cc bi n c a hm g i ho c trong khi trnh c vi c sao chp d li u.

truy n cc

i t ng d li u l n

Trong C++, con tr c dng km v i ton t * th c hi n c ch truy n b ng tham chi u. Khi g i m t hm, cc i s c n s a gi tr c truy n vo trong hm b ng a ch c a chng (s d ng ton t a ch &).
n l de n d n w e t e e td; nt * )

( nt *

nt t = * ; * = * ; * = t ;

nt

n( nt nt t n t w t ( ;

[])

nte t e n ; e ); te e w

nd

= = = =

endl;

endl;

et

n 0;

nte t e n e e e w n te w n nd = = = =

Hnh 6.11: Tham s c a hm l con tr .

Chng trnh trong Hnh 6.11 minh h a cch s d ng con tr truy n d li u vo hm qua tham chi u. Hm w c nhi m v tro i gi tr c a hai bi n. N nh n cc tham s v l con tr t i cc bi n c n i gi tr , r i thng qua v truy nh p gin ti p t i cc bi n s a gi tr . Cn t i hm n, khi 112

mu n i gi tr c a hai bi n a v b, khi g i hm w .

a ch c a hai bi n ny c truy n vo v v

Trong Hnh 6.12, bi n con tr e c truy n vo hm et l l te . D n n tham s hnh th c c a hm et l l te chnh l con tr t i m ng e trong hm n.
n l de n d n et ( nt t n e t e e td; e nt n n e e e e ) e ; nt++) nt

( nt *

nt = 0; nt nte t e e [ nt];

nt

l te

n t

nt *

nt n

e )

nt t t l = 0; ( nt nt = 0; t t l += et n t t l ;

nt e [

n e nt];

e ;

nt++)

nt

n( nt nt n t n nt * e nte n e e ; e = new

* e ; t e n e ; nt[n e = t l e ; n l

[])

e e l te

e ]; e ); ( t t l

et ( nt t t l t delete et n 0;

n e endl;

e );

Hnh 6.12: Tham s c a hm l con tr .

113

Trong nh ng tr ng h p ta mu n dng con tr hm nhng l i khng mu n cho hm s a i d n t thi t l p quy n c a hm i v i l l te Hnh 6.12, trong , t kha th c e
nt l l te ( n t nt *

truy n l ng l n d li li u, ta c th dng t tham s . Xem v d n t pha tr c tham s


e nt n e

u vo kha hm hnh

e )

quy nh r ng hm l l te ph i coi d li u nt m v khng c php s a i. V cch s d ng t kha 1. khng quy


l t * t ;

e tr t i l h ng

n t khi khai bo m t bi n con tr , ta c 4 l a ch n:

nh con tr li u c tr
n t t ;

hay d

li u

c tr th

t i l h ng c s a i.

2. quy
n t

nh d
l

t i l h ng, con tr

t *

3. quy nh d li u tr t i khng ph i l h ng, nhng bi n con tr th l h ng


l t * n t t ;

4. quy
n t

nh c
l t *

con tr
n t

l n d
t ;

li u n tr

t i

u l h ng.

S d ng n t cho nh ng hon c nh thch h p l m t ph n c a phong cch l p trnh t t. N gip gi m quy n h n c a hm xu ng t i m c v a , ch ng h n m t hm ch c nhi m v c d li u v tnh ton th khng nn c quy n s a d li u, t gi m nguy c c a hi u ng ph khng mong mu n. y chnh l m t trong cc cch thi hnh nguyn t c quy n u tin t i thi u (the principle of least privilege), ch c p cho hm quy n truy nh p d li u v a th c hi n nhi m v c a mnh. M t i m quan tr ng khc c n lu l tnh tr ng con tr c gi tr null ho c khng xc nh do cha gn b ng a ch c a bi n no. N u con tr t c gi tr null ho c khng xc nh th vi c truy nh p * t s d n n l i run-time ho c l i l-gic cho chng trnh. Ta c n ch kh i t o gi tr c a cc bi n con tr v ki m tra gi tr tr c khi truy nh p. Ngoi ra, cn c m t l i khuyn l nn s d ng bi n tham chi u thay cho con tr b t c khi no c th trnh tr ng h p con tr null ho c c gi tr khng xc nh.

114

Bi t p
1. Trnh by s khc bi t, u i m, nh c i m gi a bi n tnh v bi n ng. 2. Vi t m t chng trnh v i hai bi n con tr x, y. S d ng hai bi n x,y lu hai s th c c nh p t bn phm. Tnh t ng c a x, v y v hi n k t qu ra mn hnh. 3. Tnh gi tr c a
nt le ; nt * t = nt * t 2 = le += 2; * t --; * t 2 += ; le , * t le ; t ;

,* t

2 c a o n m sau:

4. Xc

nh k t qu c a o n m sau:

nt * 1 = new nt; nt * 2; * 1 = ; 2 = 1; t * 1 = t * 2 = * 2 = 10; t * 1 = t * 2 = 1 = new nt; * 1 = 20; t * 1 = t * 2 =

* 1 * 2 * 1 * 2

endl; endl; endl; endl;

* 1 * 2

endl; endl;

5. Hy nu cc tnh hu ng c th x y ra

i v i o n chng trnh sau:

115

nt * 1 = new nt * 2; * 1 = ; 2 = 1; t * 2; delete 1; t * 2; * 2 = 10;

nt;

6. Hy nu cc tnh hu ng c th x y ra
nt * 1 = new nt * 2 = new * 1 = ; 2 = 1; t * 2; nt; nt[10];

i v i o n chng trnh sau:

7. Hy nu cc tnh hu ng c th x y ra
nt * = new nt[10]; ( nt = 0; = 10; nt [ ]; [ ] = ; ++)

i v i o n chng trnh sau:

8. Nh p t bn phm vo m t danh sch cc s nguyn. Hy s d ng c u trc m ng ng lu gi dy s nguyn ny v tm s l ng s nguyn chia h t cho s nguyn u tin trong dy. Hi n k t qu ra mn hnh. 9. Phn tch s khc bi t, nh c i m, u i m c a vi c s d ng m ng ng v m ng tnh. Nh ng lu khi khai bo, xin c p pht v gi i phng b nh i v i m ng ng. 10. S d ng c u trc m ng ng lu gi m t danh sch tn cc sinh vin nh p vo t bn phm. Hy s p x p danh sch tn sinh vin tng d n theo di c a tn. Hi n ra mn hnh danh sch sau khi s p x p. 11. M t bn c c kch th c m*n vung. Tr ng thi trn m i vung c bi u di n b i m t k t in hoa t A n Z. S d ng m ng ng hai chi u lu gi tr ng thi c a bn c nh p t bn phm. Tm v hi n ra mn hnh: Cc hng th a mn i u ki n t t c cc cng m t tr ng thi 116

Cc c t th a mn i u ki n t t c cc cng m t tr ng thi Cc ng cho th a mn i u ki n t t c cc cng m t tr ng thi

117

Chng 7. Cc ki u d li u tr u t ng
Cc ki u d li u c s n c a m t ngn ng l p trnh, c bi t l cc ki u d li u c b n, i khi khng bi u di n d li u c a bi ton c n gi i quy t. Thng th ng, ta c n g p m t vi thnh ph n d li u c lin quan v i nhau l i bi u di n m t ph n t d li u ph c h p m i. Ch ng h n: D li u c n thi t m t m t ngy (D te) g m 3 thnh ph n: ngy, thng, nm. V d , d li u v ngy Qu c khnh c a Vi t Nam g m 3 thnh ph n: 2 (ngy), 9 (thng), 1945 (nm). D li u c n thi t thu c ki u nt, m t St dent bao g m ba thnh ph n: t dentN t d thu c ki u D te, n e thu c ki u [ 0].
e

Ki u d li u tr u t ng l ki u d li u ph c h p c c u t o t cc thnh ph n d li u thu c cc ki u d li u khc nhau (c th l ki u c s n ho c ki u d li u m chng ta t nh ngha). y l c ch cho php chng ta t nh ngha cc ki u d li u m i, ch ng h n nh D te v St dent nh miu t trn. i v i m i m t ki u d li u tr u t ng, ta c n nh ngha m t lo t cc thao tc x l d li u cho n. V d , v i ki u d li u D te c th c n n cc thao tc x l d li u nh in ra mn hnh, v cc php tnh i v i d li u ngy thng nh: tnh ngy hm qua, tnh ngy mai, tnh kho ng cch gi a hai ngy, Cc ngn ng l p trnh b c cao c th chia thnh hai lo i: ngn ng l p trnh h ng th t c, v ngn ng l p trnh h ng i t ng. Ki u d li u tr u t ng hai lo i ngn ng ny c s khc bi t nh sau: i v i cc ngn ng l p trnh h ng th t c, cc ki u d li u c c u trc ch d ng l i vi c ng gi cc thnh ph n d li u c lin quan l i v i nhau. Ph n x l d li u c t t i cc hm v th t c c l p.

Cc ngn ng l p trnh h ng i t ng i xa hn m t b c: cho php ng gi c cc hm x l d li u vo trong ki u d li u, coi chng nh l m t ph n khng th tch r i c a ki u d li u. Trong cc ngn ng ny, ki u d li u tr u t ng c g i l cc l p i t ng (class).

7.1.

nh ngha ki u d li u tr u t ng b ng c u trc struct

Cc ngn ng l p trnh b c cao s d ng cc c u trc kh tng t nhau m t d li u tr u t ng. M t trong cc c u trc m C++ cung c p cho cng vi c ny 118

l c u trc t t. V d , ki u d li u tr u t ng nh sau trong C++:


t t nt nt nt e ; n te; e nd; n te, e

e c th

nh ngha

Trong , , c u trc e.

nd l cc tr ng hay cc thnh vin d li u c a

Ch r ng cc tr ng thu c cng m t c u trc ph i c tn khc nhau tuy r ng c th trng tn v i cc tr ng c a m t c u trc khc. Ngoi ra, ph n nh ngha m t c u trc ph i c k t thc b ng m t d u ch m ph y. Sau khi nh ngha ki u d li u e, ta c th s d ng n y nh cc ki u d li u khc. Ta c th khai bo bi n, m ng, con tr , tham chi u ki u e, v d :
e d nne e; e nt ent[10]; e *t ePt = d nne e t eRe = d nne

e; e; t c a C++ khng tng

Lu : m c d cng dng t kha t t, nhng t ng v i t t c a ngn ng l p trnh C.

Trong C++, bi n thu c ki u d li u c u trc cng c i x nh cc ki u d li u thng th ng. Ta c th th c hi n php gn gi tr c a bi n e ny cho bi n e khc, v d :
nt ent[1] = d nne e;

K t qu l gi tr c a cc thnh vin d li u c a d nne e c sao chp vo cc thnh vin d li u tng ng c a nt ent[1]. Lu r ng php gn m c nh c a C++ l php gn nng, ngha l ch c gi tr c a cc thnh vin c sao chp. Do n u m t trong cc thnh vin d li u l con tr t i m t vng nh th ch c gi tr c a con tr c sao chp ch n i dung c a vng nh th khng. truy c p cc thnh vin d li u c a c u trc, ta c hai ton t d u ch m (.) v mi tn (- ). Ton t mi tn (- ) dng truy nh p cc thnh vin qua m t

119

con tr n i t ng. Ton t d u ch m (.) c dng trong cc tr ng h p cn l i. V d , in thnh vin c a bi n d nne e ra mn hnh:
t d nne e. ;

ho c
t t eRe . ;

ho c thng qua bi n con tr t ePt nh sau


t t ePt ; e, cn t eRe l m t

Trong t ePt ang ch a a ch c a bi n d nne tham chi u c a bi n d nne e.

Lu r ng bi u th c (*t ePt ) cho ta chnh bi n d nne th c (*t ePt ). , d nne e. , v t ePt v i nhau. Ngoi ra, c p ngo c trong bi u th c (*t ePt ). ton t * khng c u tin b ng ton t - .

e, do ba bi u

tng ng l c n thi t do

khai bo c u trc d Hnh 7.1 minh h a cch khai bo v s d ng t t li u e. Cng nh cc ki u d li u khc, ki u d li u c c u trc cng c th c truy n vo trong cc hm d i d i d ng tham s (xem Hnh 7.2). Trong v d , ph n m chng trnh c nhi m v in m t gi tr ki u e ra mn hnh c chuy n thnh hm nt v i tham s l m t tham chi u t i bi n e c n in. Trong v d ny, tham s c a hm nt c quy nh l h ng tham chi u (t kha n t) hm ny khng c quy n s a d li u n m trong bi n ki u e c truy n vo. Khi s d ng c ch truy n b ng gi tr , ch ng h n nt( e), m t b n sao c a i s ki u Time s c truy n vo hm tng t nh i v i tham s thu c cc ki u d li u khc. Tuy nhin, trnh vi c ph i t n chi ph tnh ton v b nh cho vi c sao chp cc c u trc m khng ph i c p quy n s a m t cch khng c n thi t, ng i ta th ng dng tham s l h ng tham chi u nh t i hm nt( n t e t) trong Hnh 7.2 thay v dng ki u truy n gi tr . M t l a ch n khc l dng tham s l con tr , ch ng h n
d nt( e * t e)

V n u khng mu n cho print quy n s a d li u c a bi n Time c truy n cho n, ta quy nh tham s l con tr t i h ng ki u Time, ngha l:

120

nt (

n t

e *

e)

r ng c u trc e trong Hnh 7.2 ch bao g m d li u. Ph n chng trnh x l d li u c a e c t bn ngoi c u trc d li u e, t i cc hm c ch c nng thao tc d li u e. y chnh l c i m c a phong cch l p trnh h ng th t c: d li u c khai bo m t ni v x l d li u m t ni. C th , trong v d c a ta, cc hm nt, et e v n tuy n m ngoi v c l pv i e nhng l i c ton quy n thao tc d li u n m trong cc bi n ki u e, ch ng h n nh gn cho m t bi n Time gi tr khng h p l 3:100:-1. y l gi i h n c a cc ngn ng l p trnh th t c. Cc ngn ng l p trnh h ng i t ng i xa hn v cung c p c ch t b o v cho cc ki u d li u. Ta c th s a c u trc e trong Hnh 7.2 s d ng c ch , m c ti p theo s ni v v n ny.

121

de ne n l de n n e

t t e e

nd te t

t.

td;

; nt

e t t e de n t n t e nt ; 0-2 (2 nt n te; 0nt e nd; 0end t t e n() e d nne d nne d nne d nne dn dn dn t e dn t;

t)

le et et et

new t

e e e e

e. = 1 ; e. n te = 0; e. e nd = 0; t. = 0; t. n te = 0; t. e nd = 0; D nne d nne d nne d nne t dn dn dn

e e n te e e e nd e e

d nne d nne d nne dn t dn t dn t

et et et

e e n te e e e nd e e

w ll e eld t e. e. n te e. e nd endl; w ll e t. t. n te t. e nd w t ed t

endl;

et

n 0;

D nne t w ll w ll e e eld w t t 1 ed 0 0 t 0 0 0

Hnh 7.1: V d v khai bo v s d ng c u trc d li u struct.

122

de ne n l de n l de n n e

t t e n e

nd te t

t.

td;

e t t e de n t n t e nt ; 0-2 (2 nt n te; 0nt e nd; 0end t t e nt t e t t e nt ( n t e t t. een t) t.

t)

n te

t. e

nd;

et et t.

e ( =

n te nd e e t nt ; t.

nd nt

e t n te

t nt

e e e

nd) nd;

n te =

n te; t. e

nd =

nt

n() e d nne et et e(d nne e( dn e dn e 1 0 0 e t; 0 0); 0); eld t ; le t e t e e

t D nne w ll nt(d nne e); t endl; t t w ll nt( dn t); et n 0;

w t

ed

Hnh 7.2: V d v dng d li u c u trc lm tham s cho hm.

123

7.2.

nh ngha ki u d li u tr u t ng b ng c u trc

Nh ni trn, ta c th ng gi cc hm x l d li u vo bn trong ki u d li u tr u t ng. V d , cc hm nt v et e trong Hnh 7.2 chnh l m t ti n ch cho ki u d li u e v nn c ng gi vo bn trong ki u d li u ny. C u trc class cho php ta th c hi n vi c ng gi . Khi th c hi n cng vi c ny, ta b t u b c t l p trnh h ng th t c sang l p trnh h ng i t ng. Hnh 7.3 minh h a cch khai bo v ci t l p i t ng e s d ng c u trc l . M t bi n khi khai bo thu c l p e th bi n c g i l m t i t ng e. So v i t t e trong Hnh 7.2, l e khc hai i m: (1) bao g m c cc hm et e v nt; (2) c thm nhn quy n truy nh p public. Cc hm et e v nt c a l p i t ng e trong Hnh 7.3 ho t ng gi ng nh cc hm tng ng trong Hnh 7.2, ch khc ch ta khng c n truy n tham s l m t i t ng e cho cc hm ny (chi ti t s c gi i thch trong m c sau). V m t ho t ng, ci t c a l e trong Hnh 7.3 hon ton tng ng v i t t e trong Hnh 7.2. C th , hm n hay m t hm no khc v n c th t o cc i t ng e v i d li u khng h p l . Ni cch khc, so v i t t e trong Hnh 7.2, l e trong Hnh 7.3 m i ch ti n m t b c l ng gi d li u v i ph n x l. C i ti n trong Hnh 7.4 l b c ti p theo, th c hi n c nhi m v ki m sot d li u. Trong ci t ny, cc thnh vin d li u c gi i h n l ch c truy nh p t bn trong l e, cn hm et e m b o d li u c gn cho cc thnh vin d li u ph i c gi tr h p l . Chi ti t s c gi i thch trong cc m c sau. Lu r ng ta hon ton c th dng t kha t t thay v l trong t t c cc tr ng h p, nhng theo thng l , t t th ng c dng cho cc l p i t ng ch c d li u cn l dng cho cc l p g m c d li u v hm, nn ta chuy n sang dng c u trc l k t v d ny.

124

de ne l e n l de t e n n e e td; l l l d nt () t et e e de n t

nd te t

t.

n te nt ) e nd =

nd;

e ( nt nt = ; n te = ;

; nt

nt ; nt n te; nt e nd; end l n() e d nne et et e(d nne e( dn

0-2 00e

(2 -

t)

dn

t; 0 0); 0); eld t ;

le

t e t

e 1 t 0 0 e

t D nne w ll nt(d nne e); t endl; t t w ll nt( dn t); et n 0;

w t

ed

Hnh 7.3: ng gi cc hm x l d li u vo trong class Time.

125

de ne l e n l de t e n n e e td; l l l d t l et e ( nt nt () e e de n t

nd te t

t.

n te nt nt );

nd;

te nt ; 0-2 nt n te; 0nt e nd; 0l l d ( nt et n ( = 0 ( = 0 ; l end e ( et l et e e ( nt

(2 -

t)

nt

nt 2 ) 0)

) ( = 0 0);

nt

nt

l d( )) = ; n te = ; n t e;

et n l e; e nd = ;

nt

n() e d nne et et e(d nne e( dn e dn e 1 0 0 e t; 0 0); 0); eld t ; le t e t e e

t D nne w ll nt(d nne e); t endl; t t w ll nt( dn t); et n 0;

w t

ed

Hnh 7.4: B sung cho class Time kh nng t ki m sot tnh h p l c a d li u.

126

7.2.1. Quy n truy nh p Khi khai bo m t l p i t ng, chng ta mong mu n phn quy n truy nh p v s d ng d li u cng nh cc hm c a l p . T c l, m t s d li u hay hm c truy nh p v s d ng r ng ri b i t t c cc hm thu c hay khng thu c l p i t ng . Bn c nh , chng ta cng mong mu n m t s d li u hay hm c b o v kh i vi c b truy nh p v s d ng t bn ngoi. T c l, ch cc hm thu c l p c php truy nh p v s d ng, cc hm bn ngoi khng thu c l p i t ng th khng c php truy nh p v s d ng. Cc ngn ng l p trnh h ng quy n nh v y. i t ng cung c p cho chng ta c ch phn

Nhn quy n truy nh p (member access specifier) quy nh quy n truy nh p n cc thnh vin c a l p. Trong s c hai lo i th ng c s d ng l: public: D li u hay hm thu c lo i cng c ng ( c khai bo d i nhn l ) c th c truy nh p v s d ng r ng ri b i t t c cc hm thu c hay khng thu c l p i t ng . Trong Hnh 7.4, hm nt c a l p i t ng Time l hm public, v ta c th g i n thng qua cc bi n dn t ( dn t. nt) hay d nne e (d nne e. nt). private: D li u hay hm thu c lo i ring t ( c khai bo d i nhn te) ch c truy nh p v s d ng b i cc hm thnh vin thu c l p . Cc hm bn ngoi khng thu c l p i t ng th khng c php truy nh p v s d ng. Trong Hnh 7.4, cc bi n , n te, e nd, v hm l d thu c di n te v ch c cc hm thnh vin nt v et e l c th truy nh p tr c ti p, ch ng h n c/ghi gi tr c a . Trong khi, t i hm n, ngha l ngoi l p e, ta khng th truy nh p vo cc bi n , n te, e nd hay g i hm l d. Cc l nh sau y khng h p l v s gy l i khi bin d ch:
d nne d nne e. e. = 1 ; l d(10 );

Lo i nhn te ny th ng c dng cho cc hm ti n ch ch c n dng n bn trong ph m vi l p b i cc hm thnh vin khc. Bn c nh hai nhn ph bi n trn, ta cn cc lo i nhn phn quy n khc nh te ted, end (ta s khng ni n trong ph m vi kha h c ny).

127

N u khng dng cc t kha trn quy nh quy n truy nh p m t cc t ng minh, th quy n truy nh p m c nh c a cc thnh vin c a l l te, cn c a t t l l . Cc lo i quy n truy nh p ngoi m c nh ph i c quy nh m t cch t ng minh. Tuy cc thnh vin private c a m t l p khng th c truy nh p tr c ti p t ngoi nhng chng c th c truy nh p gin ti p thng qua cc hm m l p e, dnh ring cho cng vi c ny. Ch ng h n v i cc i t ng thu c l p hm nt cho php c v hm et e cho php ghi d li u private. Ngoi ra, et e cn c m t ch c nng quan tr ng l ki m tra tnh h p l c a d li u m i tr c khi gn tr cho cc thnh vin d li u (n g i hm l d). N u c n thi t, ta c th b sung cc hm etH , etH , et n te, et n te, etSe nd, etSe nd truy c p n cc thnh vin d li u private. Cng v i et e, chng c g i l cc hm truy c p (accessor) c a l p e, chng ki m sot d li u c ghi vo i t ng v qu n l nh d ng c a k t qu c d li u c a i t ng. 7.2.2. Ton t ph m vi v nh ngha cc hm thnh vin

Vi c khai bo v nh ngha m t hm c th th c hi n ng th i bn trong m t l p i t ng (ch ng h n hm nt trong Hnh 7.4). Nhng ta cng c th tch ph n khai bo v nh ngha m t hm ra hai ni khc nhau: ph n khai bo n m bn trong khai bo l p, ph n nh ngha n m bn ngoi khai bo l p (ch ng h n hm et e trong Hnh 7.4). N u t nh ngha hm bn ngoi ny, ta ph i dng ton t ph m vi ( ) ch r r ng ta ang nh ngha m t hm thnh vin c a l p e ch khng ph i m t hm thng th ng. Ton t ph m vi ch r l p i t ng m m t thnh vin thu c v , cho php hm thnh vin c c tnh ch t ph m vi nh th nh ngha c a n n m bn trong kh i nh ngha c a l p i t ng ch c a n. V d , ph n thn hm et e c xem l n m bn trong ph m vi c a l p Time, do , t y v n c th truy nh p tr c ti p cc bi n thnh vin lo i private thu c l p e. Lu , cng nh cc thnh vin d li u, do n m bn trong ph m vi c a l p nn cc hm thnh vin c a cc l p khc nhau c th trng tn. cc l i g i hm et e t hai i t ng khc nhau d nne e v dn t trong Hnh 7.3 hay Hnh 7.4, l i g i hm t i t ng no th hm ho t ng trn cc thnh vin d li u c a i t ng . Tuy nhin, ta khng ph i truy n i t ng vo hm nh trong Hnh 7.2 khi hm nt l hm 128

thng th ng ch khng ph i hm thnh vin. L do l v khi g i hm thnh vin t m t i t ng, i t ng c t ng truy n vo hm nh l m t tham s n. 7.2.3. Hm kh i t o v hm h y Hnh 7.5 l phin b n m r ng c a ci t l p e trong Hnh 7.4 (cc ph n ... trong Hnh 7.5 c n i dung gi ng nh o n tng ng trong Hnh 7.4). Ngoi thnh vin d li u n te, trong Hnh 7.5 cn c thm cc hm c bi t l e() e( nt nt nt ) v ~ e(). Cc hm c tn e c g i l hm kh i t o (constructor), cn ~ e c g i l hm h y (destructor). Hm kh i t o l hm thnh vin c bi t c ch c nng kh i t o cc thnh vin d li u c a i t ng. N c g i m t cch t ng khi i t ng c t o, v d khi m t bi n thu c l p i t ng, ch ng h n hm kh i t o e() c g i khi l nh khai bo dn t e c th c thi. Hm kh i t o ph i trng tn v i tn l p, khng c gi tr tr v , v khng c ki u gi tr tr v . M t l p c th c vi hm kh i t o ho t ng theo nguyn t c hm trng tn. Khi m t i t ng c t o, trnh bin d ch s ch n g i hm no c danh sch tham s kh p v i cc i s c cho t i l nh khai bo i t ng. Trong Hnh 7.5, i t ng d nne e c khai bo v i 3 i s , cho nn hm kh i t o e ( nt nt nt ) s c t ng g i khi ch y l nh khao bo bi n d nne e. Trong khi , bi n dn t c khai bo khng c i s , nn hm kh i t o e() khng yu c u tham s s c t ng g i khi ch y l nh khao bo bi n dn t. Hm h y, v d ~ e(), th c hi n ch c nng ng c l i v i hm kh i t o. N cg it ng khi m t i t ng b h y khi th i gian s ng c a n k t thc ho c khi n l m t i t ng c c p pht b nh ng v ang c gi i phng kh i b nh b ng l nh delete. Hm h y ph i trng tn v i tn l p nhng c thm d u ng (~) t tr c. Hm h y khng c c k t qu tr v . i v i m t i t ng c thnh vin d li u l b nh ng c c p pht trong th i gian s ng c a i t ng, hm h y l ni thch h p vi t cc l nh gi i phng ph n b nh c c p pht , m o n l nh ny s c th c hi n t i th i i m m i t ng b h y. Trong Hnh 7.5, hm h y ~ e ch a m t l nh gi i phng b nh ng m thnh vin d li u n te tr t i. Cng vi c ny s c th c hi n i v i t ng i t ng dn t v d nne e khi chng trnh ch y h t th i gian s ng c a chng.

129

C hai lo i hm h y v hm t o u khng b t bu c. N u khng c nh ngha, trnh bin d ch s t t o cc hm t o v h y m c nh c n i dung r ng.

130

n l de n l de n n e l l e () e

t n t e e td;

de lt n t t = n te = e nd = 0; n te = 0; nt n t * n) ); [ t len(n) + 1]; n); de t nt n te ( ) t ... e nd; ) ;

e ( nt nt et e( n te = new t (n te ~ e () l d

delete [] n te; nt

et e ( nt nt () t (n te = 0)

n te

te nt nt nt

; 0-2 n te; 0e nd; 0* n te; l l d ( nt

(2 -

t)

nt

nt

...

; nt n() e d nne e dn t d nne t dn et e (1 t; 0 0 t d te );

D nne w ll e eld t ; e. nt(); endl t w ll e w t t. nt(); n 0;

ed

Hnh 7.5: Hm t o v hm h y.

131

7.3. L i ch c a l p trnh h ng

i t ng

T i Hnh 7.4, cc nhn quy n truy nh p l v te quy nh r ng cc thnh vin d li u ( , n te, e nd) ch c php truy nh p t bn trong l p e (hm n n m ngoi ph m vi ny), cn cc hm et e v nt c th c g i t b t c u trong chng trnh. Trong khi , t i Hnh 7.2 cc thnh vin d li u c th c truy nh p t b t c u (ch ng h n hm n) do c quy n truy nh p m c nh l public. i u c ngha l d li u c a t t e c th b c v s a i ty t i b t c o n chng trnh no, trong khi , t bn ngoi l e, d li u ch c th c c b ng cch g i hm nt v c ghi b ng cch g i hm thnh vin et e ni gi tr m i c ki m tra tnh h p l (g i hm l d) tr c khi c p nh t. K t qu c a cc khc bi t trn l: lm vi c v i d li u ki u d li u e trong Hnh 7.2, cc o n chng trnh bn ngoi ph i bi t chi ti t c u t o c a e. Cn i v i ki u e trong Hnh 7.4, cc o n m khc kh c n bi t cch s d ng cc hm nt v et e l - y chnh l giao di n (interface) c a e. Cc o n chng trnh bn ngoi c u trc e Hnh 7.2 c ton quy n thao tng d li u c a cc i t ng e, cn c u trc e Hnh 7.4 c th t m b o c tnh h p l d li u c a mnh b ng vi c cho php truy nh p c ki m sot qua cc hm thnh vin c a chnh n. S khc bi t ny khng c nhi u ngha i v i m t chng trnh nh ch do m t ng i vi t, tuy nhin, n mang l i ch l i quan tr ng trong qu trnh pht tri n cc ph n m m l n hn v i nhi u m un v v i s tham gia c a nhi u l p trnh vin, trong c vi c tng tnh m un v gi m l i l p trnh. Tm l i, m i l p i t ng l khun m u hay m hnh cho vi c t o cc i t ng thu c m t ki u nh t nh. L p i t ng nh ngha hai lo i thnh vin v m i i t ng thu c l p u c: Cc thnh vin d li u m t cc thu c tnh c a n te, v e nd c a c u trc e. i t ng. V d l ,

Cc hm thnh vin, hay hm, m t hnh vi c a i t ng (cc hnh ng m i t ng c th th c hi n). V d l cc hm nt, et ec ac u trc e. 132

L p trnh h ng i t ng cho php n gi n ha vi c l p trnh. Cc m un chng trnh c th k t n i v i nhau m ch c n bi t giao di n c a nhau. Cc chi ti t ci t c che d u bn trong cc m- un v bn ngoi khng c n bi t n. L p trnh h ng i t ng cn gip tng tnh ti s d ng v kh nng tch h p cc m un ph n m m, th hi n hai i m: cc thnh vin c a m t l p c th l i t ng thu c l p khc, v cc l p m i c t o t l p c b ng quan h th a k (ch ny n m ngoi ph m vi kha h c ny).

7.4. Bin d ch ring r


C++ cho php chia chng trnh thnh nhi u ph n lu t i cc t p khc nhau, Cc t p ny c th c bin d ch ring r , r i lin k t (link) v i nhau tr c khi ch y chng trnh. Cch phn chia thng d ng nh t l t nh ngha c a m t l p cng v i nh ngha cc hm thnh vin c a n vo cc t p ring ch khng t cng chng trnh s d ng class . V i cch ny, ta c th xy d ng m t th vi n cc l p i t ng sao cho nhi u chng trnh c th dng chung m t l p. Ta c th bin d ch l p ng m t l n v dng n trong nhi u chng trnh khc nhau, tng t nh ta v n dng cc th vi n quen thu c t e v t n . V i m i l p, ta cn c th vi t nh ngha c a n t i hai t p tch giao di n c a l p (kh i nh ngha l p gi trong c p ngo c {}) kh i chi ti t ci t c a l p ( nh ngha cc hm thnh vin). Khi , n u ta thay i ci t c a m t l p m v n gi nguyn giao di n c a l p th ta ch ph i d ch l i t p ch a ci t c a l p . Cc t p khc, trong c cc t p ch a cc chng trnh s d ng l p , khng c n ph i s a i g v khng c n bin d ch l i. Hnh 7.6, Hnh 7.7 v Hnh 7.8 l k t qu c a vi c tch chng trnh trong Hnh 7.5 thnh ba t p ring r . Thng l cho vi c tch t p nh sau: T p header ch a nh ngha l p v cc nguyn m u hm thnh vin, ngha l ph n n m trong c p ngo c {}, c t tn c ph n m r ng l .h (t p time.h trong Hnh 7.7). T p ny ph i c include trong t t c cc t p s d ng l p Time (cc t p time.cpp v main.cpp). T p m ngu n ch a nh ngha c a cc hm thnh vin c a l p, th ng trng tn v i tn t p header tng ng (v d time.cpp) v c ph n m r ng l .cpp hay .cc. 133

Cc t p ny c bin d ch ring r v lin k t v i t p chng trnh chnh (main.cpp) tr c khi ch y chng trnh. m ngu n c a t p time.h, ta th y ph n n i dung t p c gi trong b nh h ng ti n x l d i y trnh vi c n i dung t p c include nhi u l n trong m t chng trnh.
nde __ I de ne __ I end _H__ _H__

o n ti n x l c ngha: n u nhn __ I _H__ cha c nh ngha th nh ngha __ I _H__, v o n m sau cho n tr c end m i c trnh bin d ch xt n. Cn n u nh __ I _H__ c nh ngha khi trnh bin d ch duy t n dng nde __ I _H__, th trnh bin d ch s b qua ph n m ti p theo cho n h t end . Dng de ne __ I _H__ n m trong t p time.h c tc d ng nh d u tr ng thi r ng time.h c include vo chng trnh. Ci tn __ I _H__ l c t theo thng l tng ng v i tn t p time.h.

Hnh 7.6: T p main.cpp ch a chng trnh chnh.

134

nde de ne l l

I I e

_H _H

e ()

de lt n t t = n te = e nd = 0; n te = 0; nt nt delete [] n te; nt n t * n); de t t nt ) ;

e ( nt e () l d

et e ( nt nt ();

te nt nt nt

; n te; e nd; * n te;

0-2 00-

(2 -

t)

l ; end

l d ( nt

nt

nt

);

Hnh 7.7: T p time.h ch a

nh ngha c a l p Time.

135

n l de n l de n l de n e n

t n t e t e. e e td; nt nt n t * n)

e ( nt et e( n te = new t (n te

); [ t len(n) + 1]; n);

e ( et

et

e ( nt

nt

nt

l d( )) = ; n te = ; n t e;

et n l e; e nd = ;

e t (n te

nt() n te ( e nd; ) ;

= 0)

n te

l et

e n ( (

l d ( nt = 0 = 0

nt 2 ) 0)

nt

= 0

0);

Hnh 7.8: T p time.cpp ch a ci

t l p Time.

136

Bi t p
1. Tm hi u v trnh by v l p trnh h ng i t ng, cc ngn ng l p trnh h ng i t ng m b n bi t. S khc bi t, u i m, nh c i m c a l p trnh h ng i t ng so v i l p trnh h ng th t c. 2. Trnh by cc s gi ng nhau v khc bi t gi a c u trc d li u struct, v c u trc d li u class. Cho hai v d v s d ng c u trc d li u struct v c u trc d li u class cho cng m t ki u d li u. 3. Trnh by s khc bi t gi a d li u v phng th c thu c lo i private v thu c lo i public. Khi no th nn khai bo bi n v phng th c thu c lo i private. Cho hai v d minh h a v cch s d ng d li u v phng th c thu c private v thu c public. 4. Vi t m t c u trc d li u struct ch a thng tin v ba c nh c a m t tam gic: Nh p thng tin cc c nh c a tam gic t bn phm Vi t hm ki m tra xem ba c nh c th a mn l ba c nh c a tam gic hay khng. Hi n k t qu ra mn hnh. Vi t hm tnh di n tch tam gic. Hi n k t qu ra mn hnh. 5. Vi t m t class ch a thng tin v ba c nh c a m t tam gic v cc phng th c: Nh p thng tin cc c nh c a tam gic t bn phm. Ki m tra xem l tam gic th ng, tam gic cn, tam gic l tam gic. Hi n k t qu ra mn hnh. u, hay khng

6. Nh p t bn phm thng tin v m t ngy (m t ngy g m ba thnh ph n l ngy, thng, nm), s d ng c u trc struct v c u trc class tnh ton v hi n ra mn hnh: Ngy hm tr c. Ngy hm sau. Cn bao nhiu ngy n a th n ngy 1/1/2020.

7. Vi t m t class Student bao g m 3 thng tin c b n l name, age, university. L p Student bao g m: 137

M t hm kh i t o gn thng tin cho sinh vin: name = NO NAME; age = -1; university = No information; Hm h y v i m c ch hi n ra dng ch : Good bye + name. Hm assign nh n v gn thng tin name, age, university cho m t sinh vin. Hm print hi n thng tin c a m t sinh vin ra mn hnh. 8. Vi t m t class lu tr thng tin v m t sinh vin (tn tu i, ngy thng nm sinh, qu qun, l p h c, l c h c t 0,0 n 10,0) v cc phng th c tnh ton: Sinh vin bao nhiu tu i tnh n ngy hm nay.

Phn lo i h c l c c a sinh vin (km, trung bnh, gi i, xu t s c). Qu qun thu c c thu c ba thnh thnh ph l n (H N i, H Ch Minh, N ng) hay khng. 9. Nh p vo t bn phm m t danh sch sinh vin. Hy tnh v hi n ra mn hnh: Thng tin v t t c cc b n tn l Vinh Thng tin v t t c cc b n qu H N i

Cho bi t t ng s b n c h c l c km (<4), h c l c trung bnh (4 v <8), h c l c gi i (8). 10. S d ng c u trc d li u class v m ng ng lu gi danh sch sinh vin m t l p h c. M i sinh vin bao g m cc thng tin (tn tu i, ngy thng nm sinh, qu qun, l p h c, l c h c t 0,0 n 10,0). Vi t chng trnh th c hi n cc cng vi c sau y: Nh p thng tin cc sinh vin t bn phm Hy ki m tra xem c hai b n sinh vin no trng nhau t t c cc thng tin. Hi n k t qu tm c ra mn hnh. 138

11. Tm hi u v tnh th a k (inheritance) trong trong l p trnh h ng Hy vi t m t chng trnh g m 2 l p sau:

i t ng.

12. L p people g m 2 thu c tnh (name, age) v phng th c talk ( u vo l m t xu k t , hi n xu k t ra mn hnh). 13. L p student g m 4 thu c tnh (name, age, university, major) v hai phng th c talk, study (hi n ra mn hnh thng tin v university v major).

139

Chng 8. Vo ra d li u
T t c cc chng trnh m ta g p trong cu n sch ny u l y d li u vo t bn phm v in ra mn hnh. N u ch dng bn phm v mn hnh l cc thi t b vo ra d li u th chng trnh c a ta kh c th x l c kh i l ng l n d li u, v k t qu ch y chng trnh s b m t ngay khi ta ng c a s mn hnh c i thi n tnh tr ng ny, ta c th lu d li u t i cc output ho c t t my. thi t b lu tr th c p m thng d ng nh t th ng l a c ng. Khi d li u t o b i m t chng trnh c th c lu l i sau ny c s d ng b i chnh n ho c cc chng trnh khc. D li u lu tr nh v y c ng gi t i cc thi t b lu tr thnh cc c u trc d li u g i l t p (file). Chng ny s gi i thi u v cch vi t cc chng trnh l y d li u vo (t bn phm ho c t m t t p) v ghi d li u ra (ra mn hnh ho c m t t p).

8.1. Khi ni m dng d li u


Trong m t s ngn ng l p trnh nh C++ v Java, d li u vo ra t t p, cng nh t bn phm v mn hnh, u c v n hnh thng qua cc dng d li u (stream). Ta c th coi dng d li u l m t knh ho c m ch d n m d li u c truy n qua chuy n t ni g i n ni nh n. D li u c truy n t chng trnh ra ngoi theo m t dng ra (output stream). c th l dng ra chu n n i v a d li u ra mn hnh, ho c dng ra n i v i m t t p v y d li u ra t p . Chng trnh nh n d li u vo qua m t dng vo (input stream). Dng vo c th l dng vo chu n n i v a d li u vo t mn hnh, ho c dng vo n i v i m t t p v nh n d li u vo t t p . D li u vo v ra c th l cc k t , s , ho c cc byte ch a cc ch s nh phn. Trong C++, cc dng vo ra c ci t b ng cc i t ng c a cc l p dng t m ta v n dng ghi ra mn hnh chnh l dng ra vo ra c bi t. V d , chu n, cn n l dng vo chu n n i v i bn phm. C hai u l cc i t ng dng d li u (khi ni m " i t ng" ny c lin quan n tnh nng h ng i t ng c a C++, khi ni v cc dng vo/ra c a C++, ta s ph i c p nhi u n tnh nng ny).

140

8.2. T p vn b n v t p nh phn
V b n ch t, t t c d li u trong cc t p u c lu tr d i d ng m t chu i cc bit nh phn 0 v 1. Tuy nhin, trong m t s hon c nh, ta khng coi n i dung c a m t t p l m t chu i 0 v 1 m coi t p l m t chu i cc k t . M t s t p c xem nh l cc chu i k t v c x l b ng cc dng v hm cho php chng trnh v h so n th o vn b n c a b n nhn cc chu i nh phn nh l cc chu i k t . Chng c g i l cc t p vn b n (text file). Nh ng t p khng ph i t p vn b n l t p nh phn (binary file). M i lo i t p c x l b i cc dng v hm ring. Chng trnh C++ c a b n c lu tr trong t p vn b n. Cc t p nh v nh c l cc t p nh phn. Do t p vn b n l chu i k t , chng th ng trng gi ng nhau t i cc my khc nhau, nn ta c th chp chng t my ny sang my khc m khng g p ho c g p ph i r t t r c r i. N i dung c a cc t p nh phn th ng l y c s l cc gi tr s , nn vi c sao chp chng gi a cc my c th g p r c r i do cc my khc nhau c th dng cc quy cch lu tr s khng gi ng nhau. C u trc c a m t s d ng t p nh phn c chu n ha chng c th c s d ng th ng nh t t i cc platform khc nhau. Nhi u d ng t p nh v m thanh thu c di n ny. M i k t trong m t t p vn b n c bi u di n b ng 1 ho c 2 byte, ty theo l k t ASCII hay Unicode. Khi m t chng trnh vi t m t gi tr vo m t t p vn b n, cc k t c ghi ra t p gi ng h t nh khi chng c ghi ra mn hnh b ng cch s d ng t. V d , hnh ng vi t s 1 vo m t t p s d n n k t qu l 1 k t c ghi vo t p, cn v i s 1039582 l 7 k t c ghi vo t p. Cc t p nh phn lu t t c cc gi tr thu c m t ki u d li u c b n theo cng m t cch, gi ng nh cch d li u c lu trong b nh my tnh. V d , m i gi tr nt b t k, 1 hay 1039582 u chi m m t chu i 4 byte.

8.3. Vo ra t p
C++ cung c p cc l p sau
t e t e t e

th c hi n nh p v xu t d li u

i v i t p:

: l p dnh cho cc dng ghi d li u ra t p : l p dnh cho cc dng : l p dnh cho cc dng v a c d li u t t p c v a ghi d li u ra t p.

141

i t ng thu c cc l p ny do quan h th a k nn cch s d ng chng kh gi ng v i n v t cc i t ng thu c l p t e v t e m chng ta dng. Khc bi t ch l ch ta ph i n i cc dng v i cc t p.

Hnh 8.1: Cc thao tc c b n v i t p vn b n.

Chng trnh trong Hnh 8.1 t o m t t p c tn hello.txt v ghi vo m t cu "Hell " theo cch m ta th ng lm i v i t, ch khc ch thay t b ng i t ng dng le c n i v i m t t p. Sau y l cc b c thao tc v i t p. 8.3.1. M t p Vi c u tin l n i i t ng dng v i i di t p. K t qu l i t ng dng s i v i i t ng s c th c hi n t p t m t i t ng dng, ta dng hm
en ( leN e de);

m t t p, hay ni cch khc l m m t n cho t p, b t k ho t ng c v ghi i v i t p m n i di n. m m t en c a n:

Trong , leN e l m t xu k t thu c lo i n t * v i k t thc l k t n ll (h ng xu k t cng thu c d ng ny), l tn c a t p c n m , v de l tham s khng b t bu c v l m t t h p c a cc c sau:

142

n t n te

m m m

c ghi d ng t p nh phn

t v tr b t u c/ghi t i cu i t p. N u c ny khng c t gi tr g, v tr kh i u s l u t p. m ghi ti p vo cu i t p. C ny ch m t p ch ghi. c dng cho dng

n ut p cm ghi c t tr c, n i dung c s b xa ghi n i dung m i.

Cc c trn c th c k t h p v i nhau b ng ton t bit OR (|). V d , n u ta mu n m t p people.dat theo d ng nh phn ghi b sung d li u vo cu i t p, ta dng l i g i hm sau:
t e le. le; en ( e le.d t t |

);

Trong tr ng h p l i g i hm en khng cung c p tham s de, ch ng h n Hnh 8.1, ch m c nh cho dng lo i t e l t, cho dng lo i t e l n, v cho dng lo i t e l n | t. Cch th hai n i m t dng v i m t t p l khai bo tn t p v ki u m t p ngay khi khai bo dng, hm en s c g i v i cc i s tng ng. V d :
t e le ( ell .t t t | | n );

ki m tra xem m t t p c c m thnh cng hay khng, ta dng hm thnh vin _ en(), hm ny khng yu c u i s v tr v m t gi tr ki u l b ng t e n u thnh cng v b ng l e n u x y ra tr ng h p ng c l i
( le. _ en()) * le n w en nd e d *

8.3.2.

ng t p

Khi ta hon thnh cc cng vi c c d li u v ghi k t qu , ta c n ng t p ti nguyn c a n tr v tr ng thi s n sng c s d ng. Hm thnh vin ny 143

khng c tham s , cng vi c c a n l x cc vng b nh c lin quan v ng t p:


le. l e();

Sau khi t p c ng, ta l i c th dng dng le v a ng l i c th c m b i cc ti n trnh khc. Hm l e cng c g i t ang n i v i m t t p. 8.3.3. X l t p vn b n ng khi m t

m t p khc, cn t p

i t ng dng b h y trong khi n

Ch dng t p vn b n c thi t l p n u ta khng dng c n khi m t p. Cc thao tc xu t v nh p d li u i v i t p vn b n c th c hi n tng t nh cch ta lm v i t v n.


n l de n l de n nt n e t e t e e td;

n () t e ( e le. le ( _ en()) e .t t );

e e e e

le le le. l

1 Int d t 2 t e t e(); nn t

n t

P te

n S

n ; en e n ;

el e et

t n 0;

en

le ;

1 Int d t 2 t e t n t P te n S

en e

Hnh 8.2: Ghi d li u ra t p vn b n.

144

n l de n l de n l de n nt n e

t e t e t n e td;

n () t e ( le. w le ( _ en()) le.e e .t t );

le (

())

t n l ne; etl ne ( le l ne); t l ne endl; le. l el e et t n 0; e(); nn t en le ;

1 Int d t 2 t e t n t P te
Hnh 8.3:

n S

en e
c d li u t t p vn b n.

Chng trnh v d trong Hnh 8.2 ghi hai dng vn b n vo m t t p. Chng trnh trong Hnh 8.3 c n i dung t p v ghi ra mn hnh. r ng trong chng trnh th hai, ta dng m t vng l p c cho n cu i t p. Trong , le.e () l hm tr v gi tr t e khi ch m n cu i t p, gi tr t e m le.e () tr v c dng lm i u ki n k t thc vng l p c t p. Ki m tra tr ng thi c a dng Bn c nh hm e () c nhi m v ki m tra cu i t p, cn c cc hm thnh vin khc dng ki m tra tr ng thi c a dng:

145

d()

tr v t e n u m t thao tc c ho c ghi b th t b i. V d khi ta c vi t vo m t t p khng c m ghi ho c khi thi t b lu tr khng cn ch tr ng ghi. tr v t e trong nh ng tr ng h p d() tr v t e v khi c l i nh d ng, ch ng h n nh khi ta ang nh c m t s nguyn nhng l i g p ph i d li u l cc ch ci. tr v t e n u ch m n cu i t p

l()

() d()

tr v l e n u x y tnh hu ng m m t trong cc hm trn n u c g i th s tr v t e.

t l i c tr ng thi m m t hm thnh vin no nh d u tr c , ta dng hm thnh vin le . Con tr get v put c a dng i t ng dng vo ra c t nh t m t con tr n i b . Con tr n i b c a t e hay t e c g i l con tr get hay con tr c. N ch t i v tr m thao tc c ti p theo s c th c hi n t i . Con tr n i b c a t e hay t e c g i l con tr put hay con tr ghi. N ch t i v tr m thao tc ghi ti p theo s c th c hi n t i . Cu i cng, t e c c con tr get v con tr put. nh v v tr hi n t i c a cc con tr get v put, ta c cc hm thnh vin tell v tell . Cc hm ny tr v m t gi tr thu c ki u _t e, l ki u d li u s nguyn bi u di n v tr hi n t i (tnh t u t p) c a con tr get c a dng (n u g i hm tell ) ho c con tr put c a dng (n u g i hm tell ).
d

M i

tr
d d

t l i v tr c a cc con tr get v put, ta c cc hm ee ( et e t n) v ee ( et d e t n) c cng d ng di chuy n cc con get v put t i v tr et. Trong , et c tnh t u t p n u e t n l e (gi tr m c nh c a d e t n), t cu i t p n u e t n l end, v t v tr hi n t i n u direction l . tnh kch th c c a

Hnh 8.4 minh h a cch s d ng cc con tr get v put m t t p vn b n.

146

n l de n l de n nt n e

t e t e e td;

n () t e le ( e .t t );

l n e n = le.tell (); le. ee (0 end); l n end = le.tell (); le. l e(); t et n 0; e e (end e n) te . n ;

e e te .
Hnh 8.4: Dng con tr dng xc nh kch th c t p.

8.3.4. X l t p nh phn c v ghi d li u v i t p nh phn, ta khng th dng cc ton t <<, >> v cc hm nh etl ne do d li u c nh d ng khc v cc k t tr ng khng c dng tch gi a cc ph n t d li u. Thay vo , ta dng hai hm thnh vin c thi t k ring cho vi c c v ghi d li u nh phn m t cch tu n t l w te v e d. Cch dng nh sau: size); n t_ t e . e d(memory_block size); Trong memory_block thu c lo i "con tr t i char" (char*), n i di n cho a ch c a m t m ng byte lu tr cc ph n t d li u c c ho c cc ph n t c n c ghi ra dng. Tham s size l m t gi tr nguyn xc nh s k t c n c ho c ghi vo m ng . Cc chng trnh trong Hnh 8.5, Hnh 8.6 v Hnh 8.7 minh h a vi c ghi d li u ki u ng i dng t nh ngha t t p nh phn. c v
t t_ t e .w te(memory_block

147

nde S de ne S n l de n n e de t ne

D N _H D N _H t e e td; _N _ N H 20

t St dent n e [ l t e;

_N

H + 1];

St dent () n e[0] = 0 ; St dent ( n t * l t); d ntln() t n e t ; St dent St dent ( n t * n l

e = 0;

endl;

nt len t = t len(n); (len t _N _ N t n (n e n len t ); n e[len t ] = 0 ; e = ;

H) len t t e end

_N t e t

_ n

H;

end
Hnh 8.5: Ki u b n ghi n gi n Student.

148

n l de n l de n l de n l de n nt n e

t e t e t n t dent. e td;

n () t e ( le. le ( _ en()) 10); ); ); *)( *)( *)( nne) l ) ) e (St dent)); e (St dent)); e (St dent)); e .d t n | t);

St dent St dent St dent le.w le.w le.w

nne( nne l ( l ( te(( te(( te(( e();

le. l el e et t n 0;

nn t

en

le ;

Hnh 8.6: Ghi d li u ra t p nh phn.

149

n l de n l de n l de n l de n nt n e

t e t e t n t dent. e td;

n () t e ( w le ( e .d t _ en()) le.e () ) n );

le. le (

St dent t dent; le. e d(( *)( t dent) e ( t dent)); ( le. d()) t dent. ntln(); le. l el e et t n 0;
Hnh 8.7: c d li u t t p nh phn.

e(); nn t en le ;

150

Bi t p
1. Nh p vo t bn phm m t danh sch sinh vin. M i sinh vin g m c cc thng tin sau y: tn tu i, ngy thng nm sinh, ni sinh, qu qun, l p, h c l c (t 0 n 9). Hy ghi thng tin v danh sch sinh vin ra t p vn b n student.txt 2. Sau khi th c hi n bi 1, hy vi t chng trnh nh p danh sch sinh vin t t p vn b n student.txt r i hi n th ra mn hnh: Thng tin v t t c cc b n tn l Vinh ra t p vn b n vinh.txt Thng tin t t c cc b n qu H N i ra t p vn b n hanoi.txt

T ng s b n c h c l c km (<4), h c l c trung bnh (4 v <8), h c l c gi i (8) ra t p vn b n hocluc.txt. 3. Sau khi th c hi n bi 2, hy vi t chng trnh cho bi t kch th c c a t p vn b n student.txt, vinh.txt, hanoi.txt, hocluc.txt. K t qu ghi ra t p vn b n all.txt. 4. Vi t chng trnh ki m tra xem t p vn b n student.txt c t n t i hay khng? N u t n t i th hi n ra mn hnh cc thng tin sau: S l ng sinh vin trong t p S l ng dng trong t p Ghi vo cu i t p vn b n dng ch CHECKED N u khng t n t i, th hi n ra mn hnh dng ch NOT EXISTED. 5. T p vn b n numbers.txt g m nhi u dng, m i dng ch a m t danh sch cc s nguyn ho c th c. Hai s ng li n nhau cch nhau t nh t m t d u cch. Hy vi t chng trnh t ng h p cc thng tin sau v ghi vo t p vn b n info.txt nh ng thng tin sau: S l ng s trong t p S l ng cc s nguyn S l ng cc s th c Lu : Test chng trnh v i c tr ng h p t p vn b n number.txt ch a m t hay nhi u dng tr ng cu i t p. 151

6. Trnh by s khc nhau, u i m, nh c i m gi a t p vn b n v t p vn b n nh phn. Khi no th nn dng t p vn b n nh phn. 7. Cho file vn b n numbers.txt ch a cc s nguyn ho c th c. Hy vi t m t chng trnh c cc s t file numbers.txt v ghi ra file nh phn numbers.bin cc s nguyn n m trong file numbers.txt. 8. Sau khi th c hi n bi 7, hy vi t m t chng trnh c v tnh t ng c a t t c cc s nguyn file nh phn numbers.bin. Hi n ra mn hnh k t qu thu c. 9. Sau khi th c hi n bi 7, hy vi t m t chng trnh c cc s nguyn file nh phn numbers.bin. Ghi cc s n m v tr ch n (s u tin trong file c tnh v tr s 0) trong file nh phn numbers.bin vo cu i file numbers.txt. 10. Cho hai file vn b n num1.txt v num2.txt, m i file ch a 1 dy s c s p khng gi m. S l ng s trong m i file khng qu 109. Hy vi t chng trnh c v ghi ra file vn b n num12.txt cc s trong hai file num1.txt v num2.txt th a mn i u ki n cc s trong file num12.txt cng c s p x p khng gi m. 11. File vn b n document.txt ch a m t vn b n ti ng anh. Cc cu trong vn b n c phn cch nhau b i d u . ho c !. Hy ghi ra file vn b n sentences.txt n i dung c a vn b n document.txt, m i cu c vi t trn m t dng. V d : document.txt
t e H we e d t e en e.

sentences.txt
t H we e t d e e en e.

12. File vn b n document.txt ch a m t vn b n c l n c cc cu ti ng anh v cc cu ti ng Vi t. Cc cu trong vn b n c phn cch nhau b i d u . ho c ! . Hy ghi ra file vn b n english.txt (viet.txt) cc c u ti ng Anh (Vi t) trong vn b n document.txt.

152

Ph l c A. Phong cch l p trnh


Ph n ny gi i thi u nh ng i m c b n m l p trnh vin nn lm theo chng trnh d c, d hi u, v t c hi u qu cao. V c b n, chng trnh c n vi t t ng minh, n gi n, d hi u. Khng nn s d ng cc c u trc l nh ph c t p d d n n nh m l n v kh tm l i. A.1. Ch thch Tr c v trong khi l p trnh c n ph i ghi ch thch cho cc o n m trong chng trnh. Vi c ch thch gip chng ta hi u m t cch r rng v t ng minh hn v cng vi c chng ta c n lm. Quan tr ng hn, chng s gip chng ta d dng hi u khi chng ta quay l i ki m tra ho c ti p t c lm vi c v i chng trnh. c bi t quan tr ng l gip chng ta c th chia s v cng pht tri n chng trnh theo nhm trong m t th i gian di. C th l, i v i m i hm, c bi t l cc hm quan tr ng, chng ta c n xc nh v ghi ch thch v nh ng v n c b n sau: M c ch c a hm l g? Bi n u vo c a hm (tham bi n) l g? u vo n u c?

Cc i u ki n r ng bu c c a cc bi n K t qu tr v c a hm l g? Cc r ng bu c c a k t qu tr ra n u c.

Vi c ch thch s gip chng hi u r rng v yu c u c a hm. V d :

153

t e n t n l l te t e n t tw nte e n e t t n nte e n e etS ( nt nt ) nt et = n ; + ;

tw lle t

d t n 10

A.2. Chia nh chng trnh Trong l p trnh, ng i ta th ng s d ng chi n l c chia tr , t c l chng trnh c chia nh ra thnh cc chng trnh con. Vi c chia nh ra thnh cc chng trnh con lm tng tnh m un c a chng trnh v mang l i cho l p trnh vin kh nng ti s d ng m. Ng i ta khuyn r ng di m i chng trnh con khng nn v t qu m t trang mn hnh l p trnh vin c th ki m sot t t ho t ng c a chng trnh con . A.3. Bi n ton c c Xu h ng chung l nn h n ch s d ng bi n ton c c. Khi nhi u hm cng s d ng m t bi n ton c c, vi c thay i gi tr bi n ton c c c a m t hm no c th d n n nh ng thay i khng mong mu n cc hm khc. Bi n ton c c s lm cho cc hm trong chng trnh khng c l p v i nhau. A.4. Cch t tn bi n

Tn bi n nn d c, v g i nh n cng d ng c a bi n hay ki u d li u m bi n s lu tr . i v i nh ng bi n g m nhi u t , th cc t nn vi t li n nhau v ch ci u tin c a cc t pha sau nn c vi t hoa. V d


n e St dent n nt

Cc bi n h ng nn vi t hoa. N u bi n h ng g m nhi u t , th cc t nn chia cch b ng d u g ch chn. V d

154

PI

R_I

ION

A.5. Cch

t tn hm

Tn hm nn d c, v g i nh n m c ch c a hm. Tn hm nn b t u b ng m t ng t . i v i nh ng hm g m nhi u t , th cc t nn vi t li n nhau v ch ci u tin c a cc t pha sau nn c vi t hoa. V d


etS et n l l teS e

A.6. Bi u th c Cc bi u th c c n vi t n gi n, g n g n v d hi u. Cc bi u th c di c th tch nh ra s d ng cc bi n trung gian. Nn s d ng cc c p d u ngo c trch s nh p nh ng v nh m l n v th t th c hi n cc php ton trong bi u th c. V d :


= * + * * d e

C th vi t thnh
= = * ; * ( + 1) (d e);

Lu : Bi u th c i u ki n cng nn tun th theo nguyn t c trn. A.7. Vng l p Khng nn s d ng nhi u cc l nh nh y nh e , hay nt n e thot ra kh i vng l p. V i m i vng l p, nn xc nh r rng i u ki n vng l p k t thc. A.8. Kh i chng trnh Cc o n chng trnh c n c trnh by theo thnh t ng kh i (s d ng cc d u cch). Vi c trnh by theo kh i s gip chng ta d dng hi u c c u trc v th t th c hi n cc l nh. V d :

155

le ( d ne) d S et d ne = n e (); ();

A.9. L p M i l p (class) nn tch ra thnh hai t p ring bi t. T p header (.h) ch a khai bo v l p, cn t p ngu n (.cpp) ch a nh ngha v cc phng th c c a l p. Vi c tch ny s d dng cho chng ta trong vi c theo di, tm hi u v pht tri n chng trnh. V d :
t e. t e.

156

Ph l c B. D ch chng trnh C++ b ng GNU C++


B.1. D ch v lin k t Qu trnh t o t p th c thi c t cc t p m ngu n c hai b c. B c 1: bin d ch cc t p m ngu n thnh cc t p m object. Cc t p c m r ng .cpp ho c .cc c d ch thnh cc t p c m r ng .o. B c 2: lin k t cc t p m object thnh m t t p th c thi c. Cc t p c m r ng .o c lin k t v i nhau thnh m t t p th c thi c ( ui .exe trong mi tr ng DOS/Windows). N u chng trnh ch g m m t t p m ngu n, v d count.cpp, ta ch c n ch y l nh g++ -o count.exe count.cpp K t qu l m t t p th c thi c c tn count.exe. Ho c ta ch dng l nh g++ count.cpp K t qu l m t t p th c thi c c tn m c Unix/Linux). nh (a.out trong mi tr ng

N u chng trnh bao g m nhi u t p m ngu n, ch ng h n time_test.cpp (ch a hm main), time.cpp, time.h, ta d ch t ng t p c ui cpp ho c cc b ng l nh sau g++ -c file.cpp Sau lin k t l i b ng l nh g++ time_test.o time.o -o time_test.exe B.2. Ti n ch make c a GNU Ta c bin d ch b ng cch m i l n l i g t ng l nh nh h ng d n trn. Tuy nhin, v i nh ng chng trnh l n bao g m nhi u t p m ngu n, dng n nhi u th vi n, vi c g t ng l nh b ng tay m i khi c n d ch chng trnh khng ph i l cch lm hi u qu . Ti n ch e trong b cng c GNU cho php t ng ha quy trnh d ch v lin k t chng trnh. e l m t h th ng c thi t k xy d ng cc chng trnh t cc cy m ngu n l n. T ct c a l p trnh vin v cy m ngu n, ti n ch make s g i trnh bin d ch v lin k t 157

m t cch hi u qu nh t xy d ng chng trnh th c thi c. M c ny l m t h ng d n t i gi n cho vi c s d ng ti n ch e. dng ti n ch e cho m t chng trnh, l p trnh vin ph i t o m t t p c tn e le n m trong cng th m c v i cc t p m ngu n. T p ny ch a cc l nh h ng d n make lm g v lm th no xy d ng c chng trnh.
e le g m cc b

c t , m i b qu n l vi c c p nh t m t t p.

M ib ct c am tt p e le g m 3 ph n: ch (target), cc quan h ph thu c (dependency), v cc ch th (instruction). Cng th c nh sau:


et le De enden le1 De enden le2 ... De enden len

trong , et le l t p c n c p nh t v m i De enden le l m t t p m et le ph thu c vo n. Dng th hai c a b c t l m t l nh d ch et le, l nh ny ph i c m t k t TAB ng tr c v k t thc b ng k t xu ng dng. V d , b ct u tin trong e le c a chng ta nh sau:
t e_te t.e e t e. t e_te t. ++ t e. t e_te t. - t e_te t.e e

trong dng u ch ra r ng time_test.exe ph thu c hai t p time.o v time_test.o, dng th hai l l nh dng g++ d ch ra t p time_test.exe. Ti p theo, time.o khng c s n ngay khi bin d ch l n b c t cho t p ny:
t e. t e. ++ - t t e. e.

u, cho nn ta ph i vi t

Tng t l b
t e_te t. ++ -

c t cho time_test.o
t e. t e. t e_te t.

Do , Makefile s c d ng:
t e_te t t e. t e_te t. ++ t e. t e_te t. e. t e. ++ - t t e. e. t e_te t

e_te t. ++ -

t e. t e. t e_te t.

V khi ta g t d u nh c dng l nh 158

chng trnh

es

le v th c hi n cc cng vi c sau:

1. th y r ng time_test.exe ph thu c vo time.o, v: a) Ki m tra time.o, th y n ph thu c time.cc v time.h; b) Xc nh xem time.o l i th i cha (c hn b n m i nh t c a cc t p time.cc v time.h) c) n u l i th i th ch y l nh ++ - t e. t o t e.

2. th y r ng time_test.exe cng ph thu c vo time_test.o, v a) Ki m tra time_test.o, th y n ph thu c time_test.cc v time.h; b) Xc nh xem time_test.o l i th i cha (cha c d ch t b n m i nh t c a cc t p time_test.cc v time.h)
)n u

l i th i th ch y l nh time_test.o

++ -

e_te t.

t o

3. th y r ng t t c cc t p m time_test.exe ph thu c nn n ch y l nh ++ t e. t e_te t. chng trnh time_test.exe.

u c c p nh t, t e_te t t o

159

Ph l c C. X l xu b ng th vi n cstring
C.1. M t s hm x l xu thng d ng
a ( a , a )

Sao chp xu s vo m ng char d. Tr v


a ( a , a ,

a ch c a xu d.
z _ )

Chp t i a n k t t xu s vo m ng char d. Tr v
a a ( a , a )

a ch m ng d. ln k t null

Chp xu s vo cu i xu d. K t u tin c a xu s s cu i xu d. Tr v a ch c a xu d.
a a ( a , a , z _ )

Chp t i a n k t c a xu s vo cu i xu d. K t ln k t null cu i xu d. Tr v a ch c a xu d.
( a 1, a 2 )

u tin c a xu s s

So snh xu s1 v xu s2. Tr v m t gi tr b ng 0 n u s1 b ng s2, nh hn 0 (th ng l -1) n u s1 nh hn s2, ho c l n hn 0 (th ng l 1) n u s1 l n hn s2 theo th t t i n.


( a 1, a 2, z _ )

Tng t hm strcmp() nhng ch so snh n k t n k t u tin c a xu s2.


a k( a 1, a 2 )

u tin c a xu s1 v i

M t chu i cc l i g i hm strtok c tc d ng tc xu s1 thnh cc m nh ("token"), ch ng h n cc t trong m t dng vn b n. Xu k t c tch d a theo cc k t ch a trong xu s2. V d , n u ta c n tch xu "Hello, how are you?" thnh cc t , v i ' ', '?', ',' l cc k t ngn cch gi a cc t , k t qu s l cc token "Hello", "how", "are", "you". Tuy nhin, m i l n g i hm strtok ch tch c m t token v tr v a ch c a token . Khi khng cn tm th y token no, hm s tr v gi tr NULL. L n g i u tin trong qu trnh phn tch xu s1 s c n tham s u tin l s1, cc l n g i sau s ti p t c tch s1 n u tham s u tin l NULL.
z _ ( a )

Tr v

di c a xu s l s k t 160

ng tr c k t null.

C.2. Khuy n co v vi c s d ng th vi n cstring M t s hm trong th vi n cstring n u s d ng khng c n th n c th d n n vi c truy nh p ra ngoi khng gian c khai bo c a m ng ho c tnh tr ng xu k t khng c k t thc ng cch b ng k t null. i v i nh ng hm ny, l p trnh vin ph i s d ng m t cch c n tr ng m b o khng gy ra l i d li u. M c ny a ra m t s khuy n co v vi c s d ng cc hm ny. Cc hm t v t n sao chp ton b xu k t l tham s th hai vo m ng char ch m khng quan tm khng gian khai bo c a m ng ch c ch ch a hay khng. L p trnh vin ph i t m b o r ng m ng ch c ch cho xu ngu n cng nh k t null k t thc xu . M t l i khuyn l nn dng t n thay cho t , v t n cho php ki m sot c s l ng k t s c chp vo m ng ch. Tng t , cc hm t t v t n t chp xu k t l tham s th hai vo cu i xu k t l tham s th nh t m cng khng quan tm khng gian khai bo c a m ng ch c ch ch a c hai xu hay khng. L p trnh vin ph i t m b o r ng m ng ch c ch cho c hai xu cng nh k t null k t thc xu th hai. t n t cng c khuyn dng hn v n cho php ki m sot s l ng k t s c chp vo m ng ch. Khi s d ng t n , n u s k t c n chp (tham s th ba) khng l n hn di c a xu ngu n (tham s th hai), th k t null s khng c chp vo m ng ch. t n cng khng t chn thm m t k t null vo cu i o n v a chp. Trong tr ng h p ny, n u l p trnh vin khng t g n k t null nh d u k t thc xu k t qu , xu ny c th tr thnh xu c di khng xc nh v i nguy c d n n l i nghim tr ng khi ch y chng trnh. Tnh tr ng tng t cng x y ra i v i hm t n t.

161

Ti li u tham kh o
[1]. Bjarne Stroustrup, The C++ Programming Language, 3rd edition, Addison-Wesley, 1997. [2]. [3]. [4]. Deitel & Deitel, C++ How to Program, 5th edition, Prentice Hall, 2005. ISO/IEC JTC1/SC22/WG21. Stable release, ISO/IEC 14882:2003 (2003) Juan Soulie, C++ Language Tutorial, http://www.cplusplus.com.

162

You might also like