You are on page 1of 710

GS.

Phn vn t

C++
V

Lp trnh hng i tng

LI NI U
Lp trnh cu trc l phng php t chc, phn chia chng trnh thnh cc hm, th tc, chng c dng x l d liu nhng li tch ri cc cu trc d liu. Thng qua cc ngn ng Foxpro, Pascal, C a s nhng ngi lm Tin hc kh quen bit vi phng php lp trnh ny. Lp trnh hng i tng da trn vic t chc chng trnh thnh cc lp. Khc vi hm v th tc, lp l mt n v bao gm c d liu v cc phng thc x l. V vy lp c th m t cc thc th mt cch chn thc, y c phn d liu v yu cu qun l. T tng lp trnh hng i tng c p dng cho hu ht cc ngn ng mi chy trn mi trng Windows nh Microsoft Access, Visual Basic, Visual C. V vy vic nghin cu phng php lp trnh mi ny l rt cn thit i vi tt c nhng ngi quan tm, yu thch Tin hc. C ra i nm 1973 vi mc ch ban u l vit h iu hnh Unix trn my tnh mini PDP. Sau C c s dng rng ri trn nhiu loi my tnh khc nhau v tr thnh mt ngn ng lp trnh cu trc rt c a chung. a C vo th gii hng hng i tng, nm 1980 nh khoa hc ngi M B. Stroustrup cho ra i mt ngn ng C mi c tn ban u l C c lp, sau n nm 1983 th gi l C++. Ngn ng C++ l mt s pht trin mnh m ca C. Trong C++ chng nhng a vo tt c cc khi nim, cng c ca lp trnh hng i tng m cn a vo nhiu kh nng mi m cho hm. Nh vy C++ l mt ngn ng lai cho php t chc chng trnh theo cc lp v cc hm. C th ni C++ thc y ngn ng C vn rt thuyt phc i vo th gii lp trnh hng i tng v C++ tr thnh ngn ng hng i tng ni bt trong nhng nm 90. Cun sch ny s trnh by mt cch h thng cc khi nim ca lp trnh hng i tng c ci t trong C++ nh lp, i tng, s tha k, tnh tng ng bi v cc kh nng mi trong xy dng, s dng hm nh: i tham chiu, i mc nh, hm trng tn, hm ton t. C mt s vn cn t c bit n nh cch xy dng hm vi s i bt nh trong C cng s c gii thiu. Cc chng t 1 n 10 vi cch gii thch t m v vi gn 100 chng trnh minh ho s cung cp cho bn c cc khi nim, phng php v kinh nghim lp trnh hng i tng trn C++. Mc lc cui sch s h thng ngn gn phng php phn tch, thit k v lp trnh hng i tng trn bnh din chung. Cun sch gm 10 chng v 6 ph lc Chng 1 hng dn cch lm vic vi phn mm TC++ 3.0 th nghim cc chng trnh, trnh by s lc v cc phng php lp trnh v gii thiu mt s m rng n gin ca C++ .

Chng 2 trnh by cc kh nng mi trong vic xy dng v s dng hm trong C++ nh bin tham chiu, i c kiu tham chiu, i c gi tr mc nh, hm trc tuyn, hm trng tn, hm ton t. Chng 3 ni v mt khi nim trung tm ca lp trnh hng i tng l lp gm: nh ngha lp, khai bo cc bin, mng i tng (kiu lp), phng thc, dng con tr this trong phng thc, phm vi truy xut ca cc thnh phn, cc phng thc ton t. Chng 4 trnh by cc vn to dng, sao chp, hu b cc i tng v cc vn khc c lin quan nh: Hm to, hm to sao chp, hm hu, ton t gn, cp pht b nh cho i tng, hm bn, lp bn. Chng 5 trnh by mt khi nim quan trng to nn kh nng mnh ca lp trnh hng i tng trong vic pht trin, m rng phn mm, l kh nng tha k ca cc lp. Chng 6 trnh by mt khi nim quan trng khc cho php x l cc vn khc nhau, cc thc th khc nhau, cc thut ton khc nhau theo cng mt lc thng nht, l tnh tng ng bi v phng thc o. Cc cng c ny cho php d dng t chc chng trnh qun l nhiu dng i tng khc nhau. Chng 7 ni v vic t chc vo - ra trong C++. C++ a vo mt khi nim mi gi l cc dng tin (Stream). Cc thao tc vo - ra s thc hin trao i d liu gia b nh vi dng tin: Vo l chuyn d liu t dng nhp vo b nh, ra l chuyn d liu t b nh ln dng xut. nhp xut d liu trn mt thit b c th no, ta ch cn gn dng nhp xut vi thit b . Vic t chc vo ra theo cch nh vy l rt khoa hc v tin li v n c tnh c lp thit b. Chng 8 trnh by cc hm ho s dng trong C v C++. Cc hm ny c s dng ri rc trong ton b cun sch xy dng cc i tng ho. Chng 9 trnh by cc hm truy xut trc tip vo b nh ca my tnh, trong c b nh mn hnh. Cc hm ny s c s dng trong chng 10 xy dng cc lp menu v ca s . Chng 10 gii thiu 5 chng trnh tng i hon chnh nhm minh ho thm kh nng v k thut lp trnh hng i tng trn C++ Ph lc 1 trnh by cc php ton trong C++ v th t u ca chng. Ph lc 2 lit k mt danh sch cc t kho ca C++. Ph lc 3 trnh by bng m ASCII v m qut ca cc k t.

Ph lc 4 trnh by mt vn quan trng nhng cn t c ni n trong cc ti liu, l cch s dng con tr void xy dng cc hm vi s i khng c nh ging nh cc hm printf v scanf ca C. V trong C++ vn s dng cc hm ca C, nn trong ph lc 5 s gii thiu tm tt hn 200 hm bn c tin vic tra cu. Cui cng, ph lc 6 trnh by mt cch ngn gn phng php phn tch, thit k v lp trnh hng i tng trn bnh din chung. Khi vit chng ti ht sc c gng cun sch c hon chnh, song chc chn khng trnh khi thiu st, v vy rt mong nhn c s gp ca c gi. Nhn dp ny chng ti xin chn thnh cm n c nhn Nguyn Vn Phc tn tnh gip trong vic hiu nh v bin tp cun sch ny.

Tc gi

MC LC Chng 1 C++ V Lp Trnh Hng i Tng ................................................................ 9


1. Lm vic vi TC++ 3.0 ................................................................................................................................... 9 2. C v C++ ..................................................................................................................................................... 10 3. Lp trnh cu trc v lp trnh hng i tng ......................................................................................... 11 4. Mt s m rng n gin ca C++ so vi C................................................................................................. 18 5. Vo ra trong C++ ........................................................................................................................................ 24 6. Cu trc, hp v kiu lit k ....................................................................................................................... 29 7. Cp pht b nh ........................................................................................................................................ 33 8. Cc hm trong C++ ..................................................................................................................................... 39

Chng 2 Hm Trong C++ ............................................................................................. 41


1. Bin tham chiu (Reference variable) ...................................................................................................... 41 2. Truyn gi tr cho hm theo tham chiu .................................................................................................. 45 3. Hm tr v cc tham chiu ...................................................................................................................... 54 4. i c gi tr mc nh ............................................................................................................................. 58 5. Cc hm trc tuyn (inline) ..................................................................................................................... 64 6. nh ngha chng cc hm (Overloading) ................................................................................................. 69 7. nh ngha chng cc ton t .................................................................................................................. 79 8. Cc v d v nh ngha chng ton t .................................................................................................... 86 9. Cc bi ton v ma trn v vc t ............................................................................................................ 94

Chng 3 Khi Nim V Lp ....................................................................................... 106


1. nh ngha lp.......................................................................................................................................... 106 2. Bin, mng i tng............................................................................................................................... 109 3. Con tr i tng .................................................................................................................................... 113 4. i ca phng thc, con tr this ............................................................................................................ 116

5. Ni thm v kiu phng thc v kiu i ca phng thc ................................................................... 124 6. Hm, hm bn.......................................................................................................................................... 140 7. Phm vi truy xut ..................................................................................................................................... 158 8. Cc phng thc ton t ......................................................................................................................... 160

Chng 4 Hm To, Hm Hu V Cc Vn Lin Quan ............................................ 170


1. Hm to (constructor) .............................................................................................................................. 170 2. Lp khng c hm to v hm to mc nh ............................................................................................ 177 3. Lp a thc.............................................................................................................................................. 181 4. Hm to sao chp (copy constructor) ....................................................................................................... 188 5. Hm hu (Destructor)............................................................................................................................... 199 6. Ton t gn.............................................................................................................................................. 209 7. Phn loi phng thc, phng thc inline ............................................................................................. 219 8. Hm to v i tng thnh phn............................................................................................................ 222 9. Cc thnh phn tnh ................................................................................................................................. 234 10. Mng i tng ..................................................................................................................................... 242 11. cp pht b nh cho i tng .............................................................................................................. 248 12. i tng hng, phng thc hng ....................................................................................................... 254 13. Hm bn, lp bn ................................................................................................................................... 260

Chng 5 Dn Xut V Tha K ................................................................................... 269


1. S dn xut v tnh tha k...................................................................................................................... 269 2. Hm to, hm hu i vi tnh tha k .................................................................................................... 278 3. Phm vi truy nhp n cc thnh phn ca lp c s ............................................................................... 285 4. Tha k nhiu mc v s trng tn .......................................................................................................... 289 5. Cc lp c s o ....................................................................................................................................... 294 6. Mt s v d v hm to, hm hu trong tha k nhiu mc .................................................................... 297 7. Ton t gn ca lp dn xut ................................................................................................................... 307 8. Hm to sao chp ca lp dn xut .......................................................................................................... 317 9. Pht trin, hon thin chng trnh ......................................................................................................... 325 10. B sung, nng cp chng trnh ............................................................................................................. 331 11. T khi qut n c th ......................................................................................................................... 354 12. Ton th v b phn .............................................................................................................................. 361

Chng 6 Tng ng Bi V Phng Thc o ............................................................ 361


1. Phng thc tnh ..................................................................................................................................... 361 2. S hn ch ca phng thc tnh ............................................................................................................ 368 3. Phng thc o v tng ng bi............................................................................................................ 375 4. S linh hot ca phng thc o trong pht trin nng cp chng trnh ................................................ 387 5. Lp c s tru tng ............................................................................................................................... 391 6. S dng tng ng bi v phng thc o .............................................................................................. 400 7. X l cc thut ton khc nhau................................................................................................................. 406

Chng 7 Cc Dng Tp Tin (Stream) .......................................................................... 415


1. Cc lp stream ......................................................................................................................................... 415 2. Dng cin v ton t nhp ......................................................................................................................... 416 3. Nhp k t v chui k t t bn phm ..................................................................................................... 418 4. Dng cout v ton t xut ....................................................................................................................... 426 5. Cc phng thc nh dng ..................................................................................................................... 428 6. C nh dng............................................................................................................................................ 432 7. Cc b phn nh dng v cc hm nh dng .......................................................................................... 438 8. Cc dng tin chun ................................................................................................................................... 445 9. Xut ra my in .......................................................................................................................................... 447 10. Lm vic vi tp ..................................................................................................................................... 453 12. c d liu t tp .................................................................................................................................. 467 13. c ghi ng thi trn tp .................................................................................................................... 476 14. X l li .................................................................................................................................................. 483 15. Nhp xut nh phn ............................................................................................................................... 486 16. c ghi ng thi theo kiu nh phn ..................................................................................................... 490 17. Xy dng ton t nhp xut i tng trn tp ................................................................................... 497 18. H thng cc lp stream ........................................................................................................................ 504

Chng 8 Ha ...................................................................................................... 508


1. Khi nim ha ..................................................................................................................................... 508 2. Khi ng h ha ................................................................................................................................ 510 3. Li ha ................................................................................................................................................ 514 4. Mu v mu ............................................................................................................................................. 515

5. V v t mu ............................................................................................................................................ 518 6. Chn kiu ng ..................................................................................................................................... 524 7. Ca s (Viewport) .................................................................................................................................... 528 8. T im, t min ...................................................................................................................................... 532 9. X l vn bn trn mn hnh ho ......................................................................................................... 536 10. Ct hnh, Dn hnh v To nh chuyn ng ........................................................................................... 541 11. Mt s chng trnh ho .................................................................................................................. 544 12. In nh t mn hnh ho ..................................................................................................................... 556

Chng 9 Truy Nhp Trc Tip Vo B Nh ............................................................... 560


1. Cc hm truy nhp theo a ch phn on .............................................................................................. 560 2. B Nh Mn Hnh Vn Bn ....................................................................................................................... 561 3. Chuyn i a ch .................................................................................................................................. 563 4. Cc v d minh ho ................................................................................................................................... 564

Chng 10 Mt S Chng Trnh Hng i Tng Trn C++ ................................... 574


1. Lp ca s ............................................................................................................................................... 574 2. Lp menu................................................................................................................................................. 584 3. Lp hnh hc ............................................................................................................................................ 591 4. Cc lp ngn xp v hng i ................................................................................................................... 599 5. Cc lp sp xp ........................................................................................................................................ 613 6. V d v Cc lp sp xp ........................................................................................................................... 621

Ph Lc 1 Th t u tin ca cc php ton .............................................................. 628 Ph Lc 2. Cc T Kha Ca C++ .................................................................................. 632 Ph Lc 3 Bng M Asskey V Gii Quyt.................................................................... 633 Ph Lc 4 Hm Vi i S Bt nh Trong C................................................................ 641 Ph Lc 5. Tm Tt Cc Hm Ca Turbo C Theo Th T Abc ........................................ 648 Ph Lc 6 Phn Tch, Thit K V Lp Trnh Hng i Tng ..................................... 660
1. Phn tch hng i tng ...................................................................................................................... 660 2. Thit k hng i tng ........................................................................................................................ 675 3. Lp Trnh Hng i Tng ..................................................................................................................... 699

Chng 1 C++ V Lp Trnh Hng i Tng


Trong chng ny trnh by cc vn sau: - Cch s dng phn mm TC++ 3.0 - Nhng sa i cn thit mt chng trnh C bin n thnh mt chng trnh C++ (chy c trong mi trng C++) - Tm lc v cc phng php lp trnh cu trc v lp trnh hng i tng - Nhng m rng ca C++ so vi C

1. Lm vic vi TC++ 3.0


Cc v d trong cun sch ny s vit v thc hin trn mi trng TC++ 3.0. B ci t TC++ 3.0 gm 5 a. Sau khi ci t (gi s vo th mc C:\TC) th trong th mc TC s gm cc th mc con sau: C:\TC\BGI cha cc tp ui BGI v CHR C:\TC\BIN cha cc tp chng trnh (ui EXE) nh TC, TCC, TLIB, TLINK C:\TC\INCLUDE cha cc tp tiu ui H C:\TC\LIB cha cc tp ui LIB, OBJ vo mi trng ca TC++ ch cn thc hin tp chng trnh TC trong th mc C:\TC\BIN . Kt qu nhn c h menu chnh ca TC++ vi mu nn xanh gn ging nh h menu quen thuc ca TC (Turbo C). H menu ca TC++ gm cc menu: File, Edit, Search, Run, Compile, Debug, Project, Options, Window, Help. Cch son tho, bin dch v chy chng trnh trong TC++ cng ging nh trong TC, ngoi tr im sau: Tp chng trnh trong h son tho ca TC++ c ui mc nh l CPP cng trong TC th tp chng trnh lun c ui C.

Trong TC++ c th thc hin c chng trnh C v C++. thc hin chng trnh C cn dng ui C t tn cho tp chng trnh, thc hin chng trnh C++ cn dng ui CPP t tn cho tp chng trnh.

2. C v C++
-C th ni C++ l s m rng (ng k) ca C. iu c ngha l mi kh nng, mi khi nim trong C u dng c trong C++. - V trong C++ s dng gn nh ton b cc khi nim, nh ngha, cc kiu d liu, cc cu trc lnh, cc hm v cc cng c khc ca C, nn yu cu bt buc i vi cc c gi C++ l phi bit s dng tng i thnh tho ngn ng C. - V C++ l s m rng ca C, m bn thn mt chng trnh C l chng trnh C++ (ch cn thay ui C bng ui CPP). Tuy nhin Trnh bin dch TC++ yu cu mi hm chun dng trong chng trnh u phi khai bo nguyn mu bng mt cu lnh #include, trong khi iu ny khng bt buc i vi Trnh bin dch ca TC. Trong C c th dng mt hm chun m b qua cu lnh #include khai bo nguyn mu ca hm c dng. iu ny khng bo li khi bin dch, nhng c th dn n kt qu sai khi chy chng trnh. V d khi bin dch chng trnh sau trong mi trng C s khng gp cc dng cnh bo (Warning) v thng bo li (error). Nhng khi chy s nhn c kt qu sai. #include <stdio.h> void main() { float a,b,c,p,s; printf("\nNhap a, b, c "); scanf("%f%f%f",&a,&b,&c); p=(a+b+c)/2; s= sqrt(p*(p-a)*(p-b)*(p-c));

10

printf("\nDien tich = %0.2f",s); getch(); } Nu bin dch chng trnh ny trong TC++ s nhn c cc thng bo li sau: Eror: Funtion sqrt should have a prototype Eror: Funtion getch should have a prototype bin chng trnh trong thnh mt chng trnh C++ cn: + t tn chng trnh vi ui CPP + Thm 2 cu lnh #include khai bo nguyn mu cho cc hm sqrt, getch: #include <math.h> #include <conio.h>

3. Lp trnh cu trc v lp trnh hng i tng


3.1. Phng php lp trnh cu trc - T tng chnh ca lp trnh cu trc l t chc chng trnh thnh cc chng trnh con. Trong PASCAL c 2 kiu chng trnh con l th tc v hm. Trong C ch c mt loi chng trnh con l hm. Hm l mt n v chng trnh c lp dng thc hin mt phn vic no nh: Nhp s liu, in kt qu hay thc hin mt s tnh ton. Hm cn c i v cc bin, mng cc b dng ring cho hm. Vic trao i d liu gia cc hm thc hin thng qua cc i v cc bin ton b. Cc ngn ng nh C, PASCAL, FOXPRO l cc ngn ng cho php trin khai phng php lp trnh cu trc. Mt chng trnh cu trc gm cc cu trc d liu (nh bin, mng, bn ghi) v cc hm, th tc.

11

Nhim v chnh ca vic t chc thit k chng trnh cu trc l t chc chng trnh thnh cc hm, th tc: Chng trnh s bao gm cc hm, th tc no. V d xt yu cu sau: Vit chng trnh nhp to (x,y) ca mt dy im, sau tm mt cp im cch xa nhau nht. Trn t tng ca lp trnh cu trc c th t chc chng trnh nh sau: + S dng 2 mng thc ton b x v y cha to dy im + Xy dng 2 hm: Hm nhapsl dng nhp to n im, hm ny c mt i l bin nguyn n v c khai bo nh sau: void nhapsl(int n); Hm do_dai dng tnh di on thng i qua 2 im c ch s l i v j , n c khai bo nh sau: float do_dai(int i, int j); Chng trnh C cho bi ton trong c vit nh sau: #include <stdio.h> #include <conio.h> #include <math.h> float x[100],y[100]; float do_dai(int i, int j) { return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); } void nhapsl(int n) { int i;

12

for (i=1;i<=n;++i) { printf("\nNhap toa do x, y cua diem thu %d : ",i); scanf("%f%f",&x[i],&y[i]); } } void main() { int n,i,j,imax,jmax; float d,dmax; printf("\nSo diem N= "); scanf("%d",&n); nhapsl(n); dmax=do_dai(1,2); imax=1;jmax=2; for (i=1;i<=n-1;++i) for (j=i+1;j<=n;++j) { d=do_dai(i,j); if (d>dmax) { dmax=d; imax=i; jmax=j; }

13

} printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax); printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax); getch(); } 3.2. Phng php lp trnh hng i tng + Khi nim trung tm ca lp trnh hng i tng l lp (class). C th xem lp l s kt hp cc thnh phn d liu v cc hm. Cng c th xem lp l s m rng ca cu trc trong C (struct) bng cch a thm vo cc phng thc (method) hay cng gi l hm thnh vin (member function). Mt lp c nh ngha nh sau:

class Tn_Lp { // Khai bo cc thnh phn d liu // Khai bo cc phng thc }; + Cc phng thc c th c vit (xy dng) bn trong hoc bn ngoi (pha di) phn nh nghi lp. Cu trc (cch vit) phng thc tng t nh hm ngoi tr quy tc sau: Khi xy dng mt phng thc bn ngoi nh ngha lp th trong dng u tin cn dng tn lp v 2 du : t trc tn phng thc ch r phng thc thuc lp no (xem v d bn di). + S dng cc thnh phn d liu trong phng thc: V phng thc v cc thnh phn d liu thuc cng mt lp v v phng thc c lp ln ct x l cc thnh phn d liu, m trong thn ca phng thc c quyn truy nhp n cc thnh phn d liu (ca cng lp). + Bin lp: Sau khi nh ngha mt lp, c th dng tn lp khai bo cc bin kiu lp hay cng gi l i tng. Mi i tng s c cc thnh phn d liu v cc phng thc. Li gi mt phng thc cn cha tn i tng xc nh phng thc thc hin t i tng no. + Mt chng trnh hng i tng s bao gm cc lp c quan h vi nhau.

14

+ Vic phn tch, thit k chng trnh theo phng php hng i tng nhm thit k, xy dng cc lp. + T khi nim lp ny sinh hng lot khi nim khc nh: Thnh phn d liu, phng thc, phm vi, s ng gi, hm to, hm hu, s tha k, lp c s, lp dn xut, tng ng bi, phng thc o, ... + u im ca vic thit k hng i tng l tp trung xc nh cc lp m t cc thc th ca bi ton. Mi lp a vo cc thnh phn d liu ca thc th v xy dng lun cc phng thc x l d liu. Nh vy vic thit k chng trnh xut pht t cc ni dng, cc vn ca bi ton. + Cc ngn ng thun tu hng i tng (nh Smalltalk) ch h tr cc khi nim v lp, khng c cc khi nim hm. + C++ l ngn ng lai , n cho php s dng c cc cng c ca lp v hm. minh ho cc khi nim va nu v lp trnh hng i tng ta tr li xt bi ton tm di ln nht i qua 2 im. Trong bi ton ny ta gp mt thc th l dy im. Cc thnh phn d liu ca lp dy im gm: - Bin nguyn n l s im ca dy - Con tr x kiu thc tr n vng nh cha dy honh - Con tr y kiu thc tr n vng nh cha dy tung Cc phng thc cn a vo theo yu cu bi ton gm: - Nhp to mt im - Tnh di on thng i qua 2 im Di y l chng trnh vit theo thit k hng i tng. thc hin chng trnh ny nh t tn tp c ui CPP. Xem chng trnh ta thy thm mt iu mi trong C++ l: Cc khai bo bin, mng c th vit bt k ch no trong chng trnh (tt nhin phi trc khi s dng bin, mng). #include <stdio.h> #include <conio.h> #include <math.h>

15

#include <alloc.h> class daydiem { public: int n; float *x,*y; float do_dai(int i, int j) { return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); } void nhapsl(void); }; void daydiem::nhapsl(void) { int i; printf("\nSo diem N= "); scanf("%d",&n); x=(float*)malloc((n+1)*sizeof(float)); y=(float*)malloc((n+1)*sizeof(float)); for (i=1;i<=n;++i) { printf("\nNhap toa do x, y cua diem thu %d : ",i); scanf("%f%f",&x[i],&y[i]); }

16

} void main() { daydiem p; p.nhapsl(); int n,i,j,imax,jmax; float d,dmax; n=p.n; dmax=p.do_dai(1,2); imax=1;jmax=2; for (i=1;i<=n-1;++i) for (j=i+1;j<=n;++j) { d=p.do_dai(i,j); if (d>dmax) { dmax=d; imax=i; jmax=j; } } printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax); printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax); getch(); }

17

4. Mt s m rng n gin ca C++ so vi C


Trong mc ny trnh by mt s m rng ca C++ , tuy n gin, ngn gn nhng em li rt nhiu tin li. 4.1. Vit cc dng ghi ch Trong C++ vn c th vit cc dng ghi ch trong cc du /* v */ nh trong C. Cch ny cho php vit cc ghi ch trong nhiu dng hoc trong mt dng. Ngoi ra trong C++ cng cho php vit ghi ch trong mt dng sau 2 du gch cho, v d: int x,y ; // Khai bo 2 bin thc 4.2. Khai bo linh hot Trong C tt c cc cu lnh khai bo bin, mng cc b phi t ti u khi. Do vy nhiu khi, v tr khai bo v v tr s dng ca bin kh xa nhau, gy kh khn trong vic kim sot chng trnh. C++ khc phc nhc im ny bng cch cho php cc lnh khai bo bin, mng c th t bt k ch no trong chng trnh trc khi cc bin, mng c s dng. V d chng trnh nhp mt dy s thc ri sp xp theo th t tng dn c th vit trong C++ nh sau: #include <stdio.h> #include <conio.h> #include <alloc.h> void main() { int n; printf("\n So phan tu cua day N= "); scanf("%d",&n); float *x= (float*)malloc((n+1)*sizeof(float)); for (int i=1;i<=n;++i) {

18

printf("\nX[%d]= ",i); scanf("%f",x+i); } for (i=1;i<=n-1;++i) for (int j=i+1;j<=n;++j) if (x[i]>x[j]) { float tg=x[i]; x[i]=x[j]; x[j]=tg; } printf("\nDay sau khi sap xep\n"); for (i=1;i<=n;++i) printf("%0.2f ",x[i]); getch(); } 4.3. Ton t p kiu Ton t ny c vit trong C nh sau: (Kiu) biu thc Trong C++ vn c th dng cch vit ny. Ngoi ra C++ cho php vit mt cch khc tin li hn nh sau: Kiu(biu thc) V d chng trnh tnh cng thc S = 2/1 + 3/2 + ... + (n+1)/n

19

vi n l mt s nguyn dng nhp t bn phm, c th vit nh sau: #include <stdio.h> #include <conio.h> void main() { int n; printf("\n So phan tu cua day N= "); scanf("%d",&n); float s=0.0; for (int i=1;i<=n;++i) s += float(i+1)/float(i) ; // Ep kieu theo C++ printf("S= %0.2f ",s); getch(); } 4.4. Hng c kiu to ra mt hng c kiu, ta s dng t kho const t trc mt khai bo c khi gn gi tr. Sau y l mt s v d. + Hng nguyn: const int maxsize = 1000; int a[maxsize] ; + Cu trc hng: typedef struct { int x, y ; // To ca im

20

int mau ; // M mu ca im } DIEM ; const DIEM d = {320, 240, 15}; Chng trnh di y minh ho cch dng hng c kiu. Chng trnh to mt cu trc hng (kiu DIEM) m t im gia mn hnh ho vi mu trng. im ny c hin th trn mn hnh ho. #include <stdio.h> #include <conio.h> #include <graphics.h> #include <stdlib.h> typedef struct { int x,y; int mau; } DIEM; void main() { int mh=0,mode=0; initgraph(&mh,&mode,""); int loi=graphresult(); if (loi) { printf("\nLoi do hoa: %s",grapherrormsg(loi)); getch(); exit(0); }

21

const DIEM gmh = {getmaxx()/2,getmaxy()/2,WHITE}; putpixel(gmh.x,gmh.y,gmh.mau); getch();

closegraph(); } Ch : a. C th dng cc hm gn gi tr cho cc hng c kiu (trong chng trnh trong dng cc hm getmax v getmaxy). b. Mi cu lnh nhm thay i gi tr hng c kiu u b bo li khi bin dch chng trnh. V d nu trong chng trnh a vo cu lnh: gmh.x=200; th khi dch chng trnh s nhn c thng bo li nh sau: Cannot modify a const object 4.5. Cc kiu char v int Trong C mt hng k t c xem l nguyn do n c kch thc 2 byte, v d trong C: sizeof(A) = sizeof(int) = 2 Cng trong C++ mt hng k t c xem l gi tr kiu char v c kch thc mt byte. Nh vy trong C++ th: sizeof(A) = sizeof(char) = 1 4.6. Ly a ch cc phn t mng thc 2 chiu Trong Turbo C 2.0 khng cho php dng php & ly a ch cc phn t mng thc 2 chiu. V vy khi nhp mt ma trn thc (dng scanf) ta phi nhp qua mt bin trung gian sau mi gn cho cc phn t mng. Trong TC ++ 3.0 cho php ly a ch cc phn t mng thc 2 chiu, do c th dng scanf nhp trc tip vo cc phn t mng.

22

Chng trnh C++ di y s minh ho iu ny. Chng trnh nhp mt ma trn thc cp mxn v xc nh phn t c gi tr ln nht. #include <conio.h> #include <stdio.h> void main() { float a[20][20], smax; int m,n,i,j, imax, jmax; clrscr(); puts( "Cho biet so hang va so cot cua ma tran: ") ; scanf("%d%d",&m,&n) ; for (i=1;i<=m;++i) for (j=1;j<=n;++j) { printf("\na[%d][%d]= ",i,j); scanf("%f",&a[i][j]); // Ly a ch phn t mng thc // 2 chiu } smax = a[1][1]; imax=1; jmax=1; for (i=1;i<=m;++i) for (j=1;j<=n;++j) if (smax<a[i][j]) { smax = a[i][j];

23

imax=i ; jmax = j; } puts( "\n\n Ma tran") ; for (i=1;i<=m;++i) for (j=1;j<=n;++j) { if (j==1) puts(""); printf("%6.1f", a[i][j]); } puts( "\n\nPhan tu max:" ); printf("\nco gia tri = %6.1f", smax); printf("\nTai hang %d cot %d " ,imax, jmax) ; getch(); }

5. Vo ra trong C++
5.1. Cc ton t v phng thc xut nhp in d liu ra mn hnh v nhp d liu t bn phm , trong C++ vn c th dng cc hm printf v scanf (nh ch ra trong cc chng trnh C++ cc mc trong). Ngoi ra trong C++ cng dng ton t xut: cout << biu thc << ... << biu thc ; a gi tr cc biu thc ra mn hnh, dng ton t nhp: cin >> bin >> ... >> bin nhp cc gi tr s (nguyn thc) t bn phm v gn cho cc bin.

24

nhp mt dy khng qu n k t v cha vo mng h (kiu char) c th dng phng thc cin.get nh sau: cin.get(h,n); Ch 1: Ton t nhp cin >> s li k t chuyn dng \n trong b m, k t ny c th lm tri phng thc cin.get. khc phc tnh trng trong cn dng phng thc cin.ignore b qua mt k t chuyn dng nh sau: cin.ignore(1); Ch 2: s dng cc ton t v phng thc ni trn cn khai bo tp tiu : #include <iostream.h> Chng trnh sau minh ho vic s dng cc cng c vo ra mi ca C++ nhp mt danh sch n th sinh. D liu mi th sinh gm h tn, cc im ton, l, ho. Sau in danh sch th sinh theo th t gim ca tng im.

#include <iostream.h> #include <conio.h> void main() { struct { char ht[25]; float t,l,h,td; } ts[50],tg; int n,i,j; clrscr(); cout << " So thi sinh: " ; cin >> n ;

25

for (i=1;i<=n;++i) { cout << "\n Thi sinh " << i ; cout << "\n Ho ten: " ; cin.ignore(1); cin.get(ts[i].ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> ts[i].t >> ts[i].l >> ts[i].h ; ts[i].td = ts[i].t + ts[i].l + ts[i].h ; } for (i=1;i<=n-1;++i) for (j=i+1;j<=n;++j) if (ts[i].td < ts[j].td ) { tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } cout << "\nDanh sach thi sinh sau khi sap xep " ; for (i=1;i<=n;++i) { cout << "\n Ho ten: " << ts[i].ht; cout << " Tong diem: " << ts[i].td; }

26

getch(); } 5.2. nh dng khi in ra mn hnh + quy nh s thc (float, double) c in ra c ng p ch s sau du chm thp phn, ta s dng ng thi cc hm sau: setiosflags(ios::showpoint); // Bt c hiu showpoint setprecision(p); Cc hm ny cn t trong ton t xut nh sau: cout << setiosflags(ios::showpoint) << setprecision(p) ; Cu lnh trn s c hiu lc i vi tt c cc ton t xut tip theo cho n khi gp mt cu lnh nh dng mi. + quy nh rng ti thiu l w v tr cho gi tr (nguyn, thc, chui) c in trong cc ton t xut, ta dng hm setw(w) Hm ny cn t trong ton t xut v n ch c hiu lc cho mt gi tr c in gn nht. Cc gi tr in ra tip theo s c rng ti thiu mc nh l 0. Nh vy cu lnh: cout << setw(3) << AB << CD S in ra 5 k t l: mt du cch v 4 ch ci A, B, C v D. Ch : Mun s dng cc hm trn cn a vo cu lnh #include sau: #include <iomanip.h> Tr li chng trnh trong ta thy danh sch th sinh in ra s khng thng ct. khc phc iu ny cn vit li on chng trnh in nh sau: cout << "\nDanh sach thi sinh sau khi sap xep " ; cout << setiosflags(ios::showpoint) << setprecision(1) ; for(i=1;i<=n;++i) {

27

cout << "\n Ho ten: " << setw(25) << ts[i].ht; cout << " Tong diem: " << setw(5)<< ts[i].td; } getch(); Chng trnh di y l mt minh ho khc v vic s dng cc ton t nhp xut v cch nh dng trong C++ . Chng trnh nhp mt ma trn thc cp mxn. Sau in ma trn di dng bng v tm mt phn t ln nht. #include <iostream.h> #include <iomanip.h> #include <conio.h> void main() { float a[20][20], smax; int m,n,i,j, imax, jmax; clrscr(); cout << " Cho biet so hang va so cot cua ma tran: " ; cin >> m >> n ; for (i=1;i<=m;++i) for (j=1;j<=n;++j) { cout << "a[" << i << "," << j << "]= " ; cin >> a[i][j] ; } smax = a[1][1]; imax=1; jmax=1; for (i=1;i<=m;++i)

28

for (j=1;j<=n;++j) if (smax<a[i][j]) { smax = a[i][j]; imax=i ; jmax = j; } cout << "\n\n Ma tran" ; cout << setiosflags(ios::showpoint) << setprecision(1) ; for (i=1;i<=m;++i) for (j=1;j<=n;++j) { if (j==1) cout << '\n' ; cout << setw(6) << a[i][j]; } cout << "\n\n" << "Phan tu max:" << '\n' ; cout << "co gia tri = " << setw(6) << smax; cout << "\nTai hang " << imax << " cot " << jmax ; getch(); }

6. Cu trc, hp v kiu lit k


6.1. Tn sau t kho struct c xem nh tn kiu cu trc Trong C++ mt kiu cu trc cng c nh ngha nh C theo mu:

29

struct Tn_kiu_ct { // Khai bo cc thnh phn ca cu trc }; Sau khai bo cc bin, mng cu trc, trong C dng mu sau: struct Tn_kiu_ct danh sch bin, mng cu trc ; Nh vy trong C, tn vit sau t kho struct cha phi l tn kiu v cha c th dng khai bo. Trong C++ xem tn vit sau t kho struct l tn kiu cu trc v c th dng n khai bo. Nh vy khai bo cc bin, mng cu trc trong C++ , ta c th dng mu sau: Tn_kiu_ct danh sch bin, mng cu trc ; V d sau s: nh ngha kiu cu trc TS (th sinh) gm cc thnh phn : ht (h tn), sobd (s bo danh), dt (im ton), dl (im l), dh (im ho) v td (tng im), sau khai bo bin cu trc h v mng cu trc ts. struct TS { char ht [25]; long sobd; float dt, dl, dh, td; }; TS h, ts[1000] ; 6.2. Tn sau t kho union c xem nh tn kiu hp Trong C++ mt kiu hp (union) cng c nh ngha nh C theo mu: union Tn_kiu_hp {

30

// Khai bo cc thnh phn ca hp }; Sau khai bo cc bin, mng kiu hp , trong C dng mu sau: union Tn_kiu_hp danh sch bin, mng kiu hp ; Nh vy trong C, tn vit sau t kho union cha phi l tn kiu v cha c th dng khai bo. Trong C++ xem tn vit sau t kho union l tn kiu hp v c th dng n khai bo. Nh vy khai bo cc bin, mng kiu hp, trong C++ c th dng mu sau: Tn_kiu_hp danh sch bin, mng kiu hp ; 6.3. Cc union khng tn Trong C++ cho php dng cc union khng tn dng: union { // Khai bo cc thnh phn }; Khi cc thnh phn (khai bo trong union) s dng chung mt vng nh. iu ny cho php tit kim b nh v cho php d dng tch cc byte ca mt vng nh. V d nu cc bin ngun i , bin k t ch v bin thc x khng ng thi s dng th c th khai bo chng trong mt union khng tn nh sau: union { int i ; char ch ; float x ; };

31

Khi cc bin i , ch v f s dng chung mt vng nh 4 byte. Xt v d khc, tch cc byte ca mt bin unsigned long ta dng union khng tn sau: union { unsigned long u ; unsigned char b[4] ; }; Kh nu gn u = 0xDDCCBBAA; // S h 16 th : b[0] = 0xAA b[1] = 0xBB b[2] = 0xCC b[3] = 0xDD 6.4. Kiu lit k (enum) + Cng ging nh cu trc v hp, tn vit sau t kho enum c xem l kiu lit k v c th dng khai bo, v d: enum MAU { xanh, do, tim, vang } ; // nh ngha kiu MAU MAU m, dsm[10] ; // Khai bo cc bin, mng kiu MAU + Cc gi tr kiu lit k (enum) l cc s nguyn. Do c th thc hin cc php tnh trn cc gi tr enum, c th in cc gi tr enum, c th gn gi tr enum cho bin nguyn, v d: MAU m1 , m2 ; int n1, n2 ; m1 = tim ;

32

m2 = vng ; n1 = m1 ; // n1 = 2 n2 = m1 + m2 ; // n2 = 5 printf (\n %d , m2 ); // in ra s 3 + Khng th gn trc tip mt gi tr nguyn cho mt bin enum m phi dng php p kiu, v d: m1 = 2 ; // li m1 = MAU(2) ; // ng

7. Cp pht b nh
7.1. Trong C++ c th s dng cc hm cp pht b nh ng ca C nh: hm malloc cp pht b nh, hm free gii phng b nh c cp pht. 7.2. Ngoi ra trong C++ cng a thm ton t new cp pht b nh v ton t delete gii phng b nh c cp pht bi new 7.3. Cch dng ton t new cp pht b nh nh sau: + Trc ht cn khai bo mt con tr cha a ch vng nh s c cp pht: Kiu *p; y Kiu c th l: - cc kiu d liu chun ca C++ nh int , long, float , double, char , ... - cc kiu do lp trnh vin nh ngha nh: mng, hp, cu trc, lp, ... + Sau dng ton t new theo mu: p = new Kiu ; // Cp pht b nh cho mt bin (mt phn t)

33

p = new Kiu[n] ; //Cp pht b nh cho n phn t V d cp pht b nh cho mt bin thc ta dng cu lnh sau: float *px = new float ; cp pht b nh cho 100 phn t nguyn ta dng cc cu lnh: int *pn = new int[100] ; for (int i=0 ; i < 100 ; ++i ) pn[i] = 20*i ; // Gn cho phn t th i 7.4. Hai cch kim tra s thnh cng ca new Khi dng cu lnh: Kiu *p = new Kiu[n] ; hoc cu lnh: Kiu *p = new Kiu ; cp pht b nh s xut hin mt trong 2 trng hp: thnh cng hoc khng thnh cng. Nu thnh cng th p s cha a ch u vng nh c cp pht. Nu khng thnh cng th p = NULL. on chng trnh sau minh ho cch kim tra li cp pht b nh: double *pd ; int n ; cout << \n S phn t : ; cin >> n ; pd = new double[n] ; if (pd==NULL) { cout << Li cp pht b nh

34

exit (0) ; } Cch th 2 kim tra s thnh cng ca ton t new l dng con tr hm: _new_handler c nh ngha trong tp new.h. Khi gp li trong ton t new (cp pht khng thnh cng) th chng trnh s thc hin mt hm no do con tr _new_handler tr ti. Cch dng con tr ny nh sau: + Xy dng mt hm dng kim tra s thnh cng ca new + Gn tn hm ny cho con tr _new_handler Nh vy hm kim tra s c gi mi khi c li xy ra trong ton t new. on chng trnh kim tra theo cch th nht c th vit theo cch th hai nh sau: void kiem_tra_new(void) // Lp hm kim tra { cout << Li cp pht b nh exit (0) ; } _new_handler = kiem_tra_new // Gn tn hm cho con tr double *pd ; int n ; cout << \n S phn t : ; cin >> n ; pd = new double[n] ; // Khi xy ra li s gi hm kim_tra_new Ch : C th dng lnh gn gn tn hm x l li cho con tr _new_handler nh trong on chng trnh trong, hoc dng hm: set_new_handler(Tn hm) ;

35

(xem cc chng trnh minh ho bn di) 7.5. Ton t delete dng gii phng vng nh c cp pht bi new Cch dng nh sau: delete p ; // p l con tr dng trong new V d: float *px ; px = new float[2000] ; // Cp pht b nh cho 2000 phn t thc // S dng b nh c cp pht delete px ; // gii phng b nh 7.6. Hai chng trnh minh ho Chng trnh th nht minh ho cch dng new cp pht b nh cha n th sinh. Mi th sinh l mt cu trc gm cc trng ht (h tn), sobd (s bo danh) v td (tng im). Chng trnh s nhp n, cp pht b nh cha n th sinh, kim tra li cp pht b nh (dng cch 1), nhp n th sinh, sp xp th sinh theo th t gim ca tng im, in danh sch th sinh sau khi sp xp, v cui cng l gii phng b nh cp pht. #include <iomanip.h> #include <iostream.h> #include <stdlib.h> #include <conio.h> struct TS { char ht[20]; long sobd; float td; };

36

void main(void) { TS*ts ; int n; cout << "\n So thi sinh n = " ; cin >> n; ts = new TS[n+1]; if(ts==NULL) { cout << "\nLoi cap phat bo nho " ; getch(); exit(0); } for (int i=1;i<=n;++i) { cout <<"\nThi sinh thu " << i; cout << "\nHo ten: " ; cin.ignore(1) ; cin.get(ts[i].ht,20); cout << "So bao danh: " ; cin >> ts[i].sobd ; cout << "Tong diem: " ; cin >> ts[i].td ; }

37

for (i=1;i<=n-1;++i) for (int j=i+1;j<=n;++j) if (ts[i].td < ts[j].td) { TS tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } cout << setiosflags(ios::showpoint) << setprecision(1) ; for (i=1;i<=n;++i) cout << "\n" << setw(20) << ts[i].ht << setw(6)<< ts[i].sobd <<setw(6)<< ts[i].td; delete ts; getch(); } Chng trnh th hai minh ho cch dng con tr _new_handler kim tra s thnh cng ca ton t new. Chng trnh s cp pht b nh cho mt mng con tr v s theo ri khi no th khng b nh cp pht. #include <new.h> #include <iostream.h> #include <stdlib.h> #include <conio.h> int k; void loi_bo_nho(void)

38

{ cout << "\nLoi bo nho khi cap phat bo nho cho q[" << k << "]"; getch(); exit(0); } void main() { double *q[100] ; long n; clrscr(); set_new_handler(loi_bo_nho) ; // _new_handler=loi_bo_nho; n=10000; for ( k=0;k<100;++k) q[k] = new double[n]; cout << "Khong loi"; getch(); }

8. Cc hm trong C++
Trong C++ c rt nhiu m rng, ci tin v hm lm cho vic xy dng v s dng hm rt tin li. iu ny s trnh by k trong chng sau. Trong mc ny ch thng k mt s im mi v hm m C++ a vo. 8.1. i kiu tham chiu

39

Trong C, nhn kt qu ca hm cn dng i con tr, lm cho vic xy dng cng nh s dng hm kh phin phc. Trong C++ a vo i kiu tham chiu (ging nh PASCAL) dng cha kt qu ca hm, khin cho vic to lp cng nh s dng hm n gin hn. 8.2. i tham chiu const i tham chiu c c im l cc cu lnh trong thn hm c th truy nhp ti v d dng lm cho gi tr ca n thay i. Nhiu khi ta mun dng i kiu tham chiu ch tng tc trao i d liu gia cc hm , khng mun dng n cha kt qu ca hm. Khi c th dng i tham chiu const bo ton gi tr ca i trong thn hm. 8.3. i c gi tr mc nh Trong nhiu trng hp ngi dng vit mt li gi hm nhng cng cha bit nn chn gi tr no cho cc i . khc phc kh khn ny, C++ a ra gii php i c gi tr mc nh. Khi xy dng hm, ta gn gi tr mc nh cho mt s i. Ngi dng nu khng cung cp gi tr cho cc i ny, th hm s dng gi tr mc nh. 8.4. Hm on line i vi mt on chng trnh nh (s lnh khng ln) th vic thay cc on chng trnh ny bng cc li gi hm s lm cho chng trnh gn nh i cht nhng lm tng thi gian my. Trong cc trng hp ny c th dng hm trc tuyn (on line) va gim kch thc chng trnh ngun, va khng lm tng thi gian chy my. 8.5. Cc hm trng tn (nh ngha chng cc hm) ly gi tr tuyt i ca mt s, trong C cn lp ra nhiu hm vi tn khc nhau, v d abs cho s nguyn, fabs cho s thc, labs cho s nguyn di, cabs cho s phc. iu ny r rng gy phin toi cho ngi s dng. Trong C++ cho php xy dng cc hm trng tn nhng khc nhau v kiu i. Nh vy ch cn lp mt hm ly gi tr tuyt i cho nhiu kiu d liu khc nhau. 8.6. nh ngha chng ton t Vic dng cc php ton thay cho mt li gi hm r rng lm cho chng trnh ngn gn, sng sa hn nhiu. V d thc hin php cng 2 ma trn nu dng php cng v vit: C=A+B; th rt gn vi tonhc. Trong C++ cho php dng cc php tonchun t tn cho cc hm (gi l nh ngha chng ton t). Sau c th thay li gi hm bng cc php ton nh ni

40

trn. Nh vy mt php ton mang nhiu ngha, v d php + c th hiu l cng 2 s ngun, 2 s thc hoc 2 ma trn. C++ s cn c vo kiu ca cc s hng m quyt nh chn php cng c th.

Chng 2 Hm Trong C++


Chng ny trnh bynhng kh nng mi ca C++ trong vic xy dng v s dng hm. l: + Kiu tham chiu v vic truyn d liu cho hm bng tham chiu. + i tham chiu hng (const) + i c gi tr mc nh + Hm trc tuyn + Vic nh ngha chng cc hm + Vic nh ngha chng cc ton t

1. Bin tham chiu (Reference variable)


1.1. Hai loi bin dng trong C Trc khi ni n bin tham chiu, chng ta nhc li 2 loi bin gp trong C l: Bin gi tr dng cha d liu (nguyn, thc, k t, ... ) Bin con tr dng cha a ch Cc bin ny u c cung cp b nh v c a ch. V d cu lnh khai bo: double x , *px;

41

s to ra bin gi tr kiu double x v bin con tr kiu double px. Bin x c vng nh 8 byte, bin px c vng nh 4 byte (nu dng m hnh Large). Bin x dng cha gi tr kiu double, v d lnh gn: x = 3.14; s cha gi tr 3.14 vo bin x. Bin px dng cha a ch ca mt bin thc, v d cu lnh: px = &x ; s lu tr a ch ca bin x vo con tr px. 1.2. Bin tham chiu Trong C++ cho php s dng loi bin th ba l bin tham chiu. So vi 2 loi bin quen bit ni trn, th bin ny c nhng c im sau: + Bin tham chiu khng c cp pht b nh, khng c a ch ring. + N dng lm b danh cho mt bin (kiu gi tr) no v n s dng vng nh ca bin ny. V d cu lnh: float u, v, &r = u ; to ra cc bin thc u, v v bin tham chiu thc r. Bin r khng c cp pht b nh, n l mt tn khc (b danh) ca u v n dng chung vng nh ca bin u. Thut ng: Khi r l b danh (alias) ca u th ta ni r tham chiu n bin u. Nh vy 2 thut ng trn c hiu nh nhau. ngha: Khi r l b danh ca u th r dng chung vng nh ca u, d : + Trong mi cu lnh, vit u hay vit r u c ngha nh nhau, v u truy nhp n cng mt vng nh. + C th dng bin tham chiu truy nhp n mt bin kiu gi tr. V d: int u, v, &r = u; r = 10 ; // u=10 cout << u ; // in ra s 10

42

r++ ; ++ u ; cout << r ; v=r; &r;

// u = 11 // r = 12 // in ra s 12 // v=12 // Cho a ch ca u

Cng dng: Bin tham chiu thng c s dng lm i ca hm cho php hm truy nhp n cc tham s bin trong li gi hm. Vi ch v bin tham chiu: a. V bin tham chiu khng c a ch ring, n ch l b danh ca mt bin kiu gi tr nn trong khai bo phi ch r n tham chiu n bin no. V d nu khai bo: double &x ; th Trnh bin dch s bo li: Reference variable x must be initialized b. Bin tham chiu c th tham chiu n mt phn t mng, v d: int a[10] , &r = a[5]; r = 25 ; // a[5] = 25 c. Khng cho php khai bo mng tham chiu d. Bin tham chiu c th tham chiu n mt hng. Khi n s s dng vng nh ca hng v n c th lm thay i gi tr cha trong vng nh ny. V d nu khai bo: int &s = 23 ; th Trnh bin dch a ra cnh bo (warning): Temporary used to initialize 's'

43

Tuy nhin chng trnh vn lm vic. Cc cu lnh di y vn thc hin v cho kt qu nh sau: s++; cout << "\ns= " << s; // In ra s=24 Chng trnh di y minh ho cch dng bin tham chiu n mt phn t mng cu trc nhp d liu v thc hin cc php tnh trn cc trng ca phn t mng cu trc. #include <iostream.h> #include <conio.h> struct TS { char ht[25]; float t,l,h,td; }; void main() { TS ts[10],&h=ts[1]; // h tham chiu n ts[1] cout << "\n Ho ten: " ; cin.get(h.ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> h.t >> h.l >> h.h ; h.td = h.t + h.l + h.h ; cout << "\n Ho ten: " << ts[1].ht; cout << "\n Tong diem: " << ts[1].td; getch(); }

44

1.3. Hng tham chiu (const) Hng tham chiu c khai bo theo mu: int n = 10 ; const int &r = n; Cng ging nh bin tham chiu, hng tham chiu c th tham chiu n mt bin hoc mt hng. V d: int n = 10 ; const int &r = n ; // Hng tham chiu r tham chiu n bin n const int &s=123 ; //Hng tham chiu s tham chiu n hng 123 S khc nhau gia bin v hng tham chiu ch: Khng cho php dng hng tham chiu lm thay i gi tr ca vng nh m n tham chiu. V d: int y = 12, z ; const int &py=y; // Hng tham chiu py tham chiu n bin y y++; // ng

z = 2*py ; // ng z = 26 cout << y <<" "<< py; // In ra: 13 13 py=py+1; // Sai, Trnh bin dch thng bo li: // Cannot modify a const object Cch dng: Hng tham chiu cho php s dng gi tr cha trong mt vng nh, nhng khng cho php thay i gi tr ny. Hng tham chiu thng c s dng lm i ca hm cho php hm s dng gi tr ca cc tham s trong li gi hm, nhng trnh khng lm thay i gi tr ca cc tham s.

2. Truyn gi tr cho hm theo tham chiu

45

2.1. Hm trong C Trong C ch c mt cch truyn d liu cho hm theo gi tr : + Cp pht vng nh cho cc i. + Gn gi tr cc tham s trong li gi hm cho cc i sau hm lm vic trn vng nh ca cc i ch khng lin quan g n cc tham s. Nh vy chng trnh s to ra cc bn sao (cc i) ca cc tham s v hm s thao tc trn cc bn sao ny, ch khng lm vic trc tip vi cc tham s. Phng php ny c 2 nhc im chnh: Tn km v thi gian v b nh v phi to ra cc bn sao. Khng thao tc trc tip trn cc tham s, v vy khng lm thay i c gi tr cc tham s. 2.2. Truyn gi tr cho hm theo tham chiu Trong C++ cung cp thm cch truyn d liu cho hm theo tham chiu bng cch dng i l bin tham chiu hoc i l hng tham chiu. Cch ny c u im: Khng cn to ra cc bn sao ca cc tham s, do tit kim b nh v thi gian chy my. Hm s thao tc trc tip trn vng nh ca cc tham s, do d dng thay i gi tr cc tham s khi cn. 2.3. Mi quan h gia i v tham s trong li gi hm Nu i l bin hoc hng tham chiu kiu K th tham s (trong li gi hm) phi l bin hoc phn t mng kiu K. V d: + i l bin hoc hng tham chiu kiu double, th tham s l bin hoc phn t mng kiu double + i l bin hoc hng tham chiu kiu cu trc, th tham s l bin hoc phn t mng kiu cu trc 2.4. Cc chng trnh minh ho /* Chng trnh sau c t chc thnh 3 hm: Nhp dy s double

46

Hon v 2 bin double Sp xp dy s double theo th t tng dn Chng trnh s nhp mt dy s v in dy sau khi sp xp */ #include <iostream.h> #include <conio.h> #include <stdio.h> void nhapds(double *a, int n) { for (int i=1; i<= n ; ++i) { cout << "\nPhan tu thu " << i << " : " ; cin >> a[i] ; } } void hv(double &x, double &y) { double tg=x; x=y; y= tg; } void sapxep(double * a, int n) { for (int i=1; i <= n-1 ;++i) for (int j=i+1 ; j<=n ;++j) if (a[i] > a[j])

47

hv(a[i],a[j]); } void main() { double x[100]; int i, n; cout <<"\n N= "; cin >> n; nhapds(x,n); sapxep(x,n); for (i=1;i<=n;++i) printf("\n%0.1lf",x[i]); getch(); } /* Chng trnh sau gm cc hm: - Nhp dy cu trc (mi cu trc cha d liu mt th sinh) - Hon v 2 bin cu trc - Sp xp dy th sinh theo th t gim ca tng im - In mt cu trc (in h tn v tng im) Chng trnh s nhp d liu mt danh sch th sinh, nhp im chun v in danh sch th sinh trng tuyn */ #include <iostream.h>

48

#include <iomanip.h> #include <conio.h> struct TS { char ht[20]; float t,l,h,td; }; void ints(const TS &ts) { cout << setiosflags(ios::showpoint) << setprecision(1) ; cout << "\nHo ten: " << setw(20) << ts.ht << setw(6) << ts.td ; } void nhapsl(TS *ts,int n) { for (int i=1;i<=n;++i) { cout << "\n Thi sinh " << i ; cout << "\n Ho ten: " ; cin.ignore(1); cin.get(ts[i].ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> ts[i].t >> ts[i].l >> ts[i].h ; ts[i].td = ts[i].t + ts[i].l + ts[i].h ; }

49

} void hvts(TS &ts1, TS &ts2) { TS tg=ts1; ts1=ts2; ts2=tg; } void sapxep(TS *ts,int n) { for (int i=1;i<=n-1;++i) for (int j=i+1;j<=n;++j) if (ts[i].td < ts[j].td) hvts(ts[i],ts[j]); } void main() { TS ts[100]; int n,i; clrscr(); cout << " So thi sinh: " ; cin >> n ; nhapsl(ts,n); sapxep(ts,n) ; float dc;

50

cout << " Diem chuan: " ; cin >> dc; cout << "\n\nDanh sach trung tuyen\n" ; for (i=1;i<=n;++i) if (ts[i].td >= dc) ints(ts[i]); else break; getch(); } /* Chng trnh sau gm cc hm: Nhp mt ma trn thc cp mxn In mt ma trn thc di dng bng Tm phn t ln nht v phn t nh nht ca dy s thc; Chng trnh s nhp mt ma trn, in ma trn va nhp v in cc phn t ln nht v nh nht trn mi hng ca ma trn */ #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdio.h> void nhapmt(float a[20][20], int m, int n) {

51

for (int i=1 ; i<= m ; ++i) for (int j=1; j<= n ; ++j) { cout << "\na[" << i << "," << j << "]= " ; cin >> a[i][j] ; } } void inmt(float a[20][20], int m, int n) { cout << setiosflags(ios::showpoint) << setprecision(1); for (int i=1 ; i<= m ; ++i) for (int j=1; j<= n ; ++j) { if (j==1) cout << "\n" ; cout << setw(6) << a[i][j] ; } } void maxminds(float *x, int n,int &vtmax, int &vtmin) { vtmax = vtmin = 1 ; for (int i=2; i<=n ; ++i) { if (x[i] > x[vtmax]) vtmax = i; if (x[i] < x[vtmin]) vtmin = i;

52

} } void main() { float a[20][20]; int m, n; cout <<"\n So hamg va so cot ma tran: "; cin >> m >> n; nhapmt(a,m,n); clrscr(); inmt(a,m,n); float *p = (float*)a; int vtmax, vtmin; for (int i=1;i<=m;++i) { p = ((float*)a) + i*20 ; maxminds(p , n, vtmax, vtmin) ; printf("\nHang %d Phan tu max= %6.1f tai cot %d",i,p[vtmax],vtmax); printf("\n Phan tu min= %6.1f tai cot %d", p[vtmin],vtmin); } getch(); }

53

3. Hm tr v cc tham chiu
Hm c th c kiu tham chiu v tr v gi tr tham chiu. Khi c th dng hm truy nhp n mt bin hoc mt phn t mng no . Di y l mt s v d. V d 1 trnh bymt hm tr v mt tham chiu n mt bin ton b. Do c th dng hm truy nhp n bin ny. #include <iostream.h> #include <conio.h> int z ; int &f() // Hm tr v mt b danh ca bin ton b z { return z; } void main(void) { f()=50; // z = 50 cout <<"\nz= " << z; getch(); }

V d 2 trnh bymt hm tr v b danh ca mt bin cu trc ton b. Khc vi v d trn, y khng dng hm mt cch trc tip m gn hm cho mt bin tham chiu, sau dng bin tham chiu ny truy nhp n bin cu trc ton b.

54

#include <iostream.h> #include <conio.h> struct TS { char ht[25]; float t,l,h,td; }; TS ts; TS &f() { return ts; } void main() { TS &h=f(); // h tham chiu n bin ts cout << "\n Ho ten: " ; cin.get(h.ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> h.t >> h.l >> h.h ; h.td = h.t + h.l + h.h ; cout << "\n Ho ten: " << ts.ht; cout << "\n Tong diem: " << ts.td; getch(); }

55

V d 3 trnh bymt hm tr v b danh ca mt phn t mng cu ton b. Hm s kim tra xem ch s mng c vt ra ngoi min quy nh hay khng. Sau dng hm ny truy nhp n cc phn t mng cu trc. #include <iostream.h> #include <conio.h> #include <stdlib.h> struct TS { char ht[25]; float t,l,h,td; }; TS *ts; void cap_phat_bo_nho_nhapsl(int n) { ts = new TS[n+1] ; if (ts==NULL) { cout << "Loi cap phat bo nho " ; exit(1); } for (int i=1;i<=n;++i) { TS &h=ts[i]; cout << "\nThi sinh thu " << i ;

56

cout << "\n Ho ten: " ; cin.ignore(1); cin.get(h.ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> h.t >> h.l >> h.h ; h.td = h.t + h.l + h.h ; } } TS &f(int i, int n) // Cho bi danh ts[i] { if (i<1 || i>n) { cout << "Chi so mang khong hop le " ; exit(1); } return ts[i]; } void main() { int n, i ; cout << "\n So thi sinh : " ; cin >> n; cap_phat_bo_nho_nhapsl(n); while (1)

57

{ cout << "\nCan xem thi sinh thu may: " ; cout << "\nChon so tu 1 den " << n << " (bam sai ket thuc CT) "; cin >> i; TS &h=f(i,n); cout << "\n Ho ten: " << h.ht; cout << "\n Tong diem: " << h.td; } }

4. i c gi tr mc nh
4.1. Th no l i mc nh Mt trong cc kh nng mnh ca C++ l n cho php xy dng hm vi cc i c gi tr mc nh. Thng thng s tham s trong li gi hm phi bng s i ca hm. Mi i s c khi gn gi tr theo tham s tng ng ca n. Trong C++ cho php to gi tr mc nh cho cc i. Cc i ny c th c hoc khng c tham s tng ng trong li gi hm. Khi khng c tham s tng ng, i c khi gn bi gi tr mc nh. V d hm delay vi i s mc nh c vit theo mt trong 2 cch sau: Cch 1 (Khng khai bo nguyn mu): void delay(int n=1000) { for (int i=0 ; i<n ; ++i) ; }

58

Cch 2 (C khai bo nguyn mu): void delay(int n=1000) ; void delay(int n) { for (int i=0 ; i<n ; ++i) ; } Cch dng: + Cung cp gi tr cho i n (C tham s trong li gi hm) delay(5000) ; // i n = 5000 + S dng gi tr mc nh ca i (Khng c tham s trong li gi) delay() ; // i n = 1000 4.2. Quy tc xy dng hm vi i mc nh + Cc i mc nh cn phi l cc i cui cng tnh t tri sang phi. Gi s c 5 i theo th t t tri sang phi l d1, d2, d3, d4, d5 Khi : nu mt i mc nh th phi l d5 nu hai i mc nh th phi l d4, d5 nu ba i mc nh th phi l d3, d4, d5 ... Cc v d sai: d3 v d5 mc nh (khi d4 cng phi mc nh) d3 v d4 mc nh (khi d5 cng phi mc nh)

59

+ Khi xy dng hm, nu s dng khai bo nguyn mu, th cc i mc nh cn c khi gn trong nguyn mu, v d: // Khi gn gi tr cho 3 i mc nh d3, d4 v d5) void f(int d1, float d2, char *d3=HA NOI, int d4 = 100, double d5=3.14) ; void f(int d1, float d2, char *d3, int d4, double d5) { // Cc cu lnh trong thn hm } Khng c khi gn li cho cc i mc nh trong dng u ca nh ngha hm. Nu vi phm iu ny th Chng trnh dch s thng bo li. + Khi xy dng hm, nu khng khai bo nguyn mu, th cc i mc nh c khi gn trong dng u ca nh ngha hm, v d: // Khi gn gi tr cho 3 i mc nh d3, d4 v d5) void f(int d1, float d2, char *d3=HA NOI, int d4 = 100, double d5=3.14) { // Cc cu lnh trong thn hm } + Gi tr dng khi gn cho i mc inh C th dng cc hng, cc bin ton b, cc hm khi gn cho i mc nh, v d: int MAX = 10000; void f(int n, int m = MAX, int xmax = getmaxx(), int ymax = getmaxy() ) ; 4.3. Cch s dng hm c i mc nh

60

Li gi hm cn vit theo quy nh sau: Cc tham s thiu vng trong li gi hm phi tng ng vi cc i mc nh cui cng (tnh t tri sang phi). Ni cch khc: dng gi tr mc nh cho mt i (tt nhin phi l i mc nh) th cng phi s dng gi tr mc nh cho cc i cn li. V d vi hm c 3 i mc nh: void f(int d1, float d2, char *d3=HA NOI, int d4 = 100, double d5=3.14) ; Th cc li gi sau l ng: f(3,3.4,ABC,10,1.0) ; // y tham s f(3,3.4,ABC) ; f(3,3.4) ; Cc li gi sau l sai: f(3) ; f(3,3.4, ,10) ; // Thiu tham s cho i khng mc nh d2 // dng gi tr mc nh cho d3, th cng // phi dng gi tr mc nh cho d4 v d5 4.4. Cc v d Hm ht (bn di) dng hin th chui k t dc trn n dng mn hnh. Cc i dc v n u c gi tr mc nh. #include <conio.h> #include <iostream.h> void ht(char *dc="HA NOI",int n=10) ; void ht(char *dc , int n ) { for (int i=0;i<n;++i) // Thiu 2 tham s cui // Thiu 3 tham s cui

61

cout << "\n" << dc; } void main() { ht(); // In dng ch HA NOI trn 10 dng ht("ABC",3); // In dng ch ABC trn 3 dng ht("DEF"); getch(); } V d di y trnh byhm hin th mt chui str trn mn hnh ho, ti v tr (x,y) v c mu m. Cc i x, y v m l mc nh. Dng cc hm getmaxx() v getmaxy() khi gn cho x, y. Dng hng RED gn cho m. #include <conio.h> #include <graphics.h> void hiendc(char *str, int x=getmaxx()/2, int y = getmaxy()/2, int m=RED); void hiendc(char *str, int x,int y, int m) { int mau_ht = getcolor(); // Luu mau hien tai setcolor(m); outtextxy(x,y,str) ; setcolor(mau_ht); // Khoi phuc mau hien tai } void main() { // In dng ch DEF trn 10 dng

62

int mh=0, mode=0; initgraph(&mh,&mode,""); setbkcolor(BLUE); hiendc("HELLO"); // HELLO mu gia mn hnh hiendc("CHUC MUNG",1,1); // CHUC MUNG mu ti v // tr (1,1) hiendc("CHAO",1,400,YELLOW); // CHAO mu vng ti v // tr (1,400) getch(); } V d di y trnh byhm tnh tch phn xc nh gm 3 i: f l hm cn tnh tch phn, a v b l cc cn di v trn (a<b). C 3 i f, a v b u mc nh. Gi tr mc nh ca con tr hm f l a ch ca hm bp (bnh phng), ca a bng 0, ca b bng 1. #include <conio.h> #include <iostream.h> #include <iomanip.h> #include <math.h> double bp(double x); double tp( double (*f)(double)=bp,double a=0.0, double b=1.0) ; double bp(double x) { return x*x; } double tp(double (*f)(double), double a, double b ) {

63

int n=1000; double s=0.0, h=(b-a)/n; for (int i=0; i<n ; ++i) s+= f(a+i*h + h) + f(a+i*h ) ; return s*h/2; } void main() { clrscr(); cout << setiosflags(ios::showpoint) << setprecision(2); cout << "\nTich phan tu 0 den 1 cua x*x= " << tp() ; cout << "\nTich phan tu 0 den 1 cua exp(x)= " << tp(exp); cout << "\nTich phan tu 0 den PI/2 cua sin(x) " << tp(sin,0,3.14/2); getch();
}

5. Cc hm trc tuyn (inline)


5.1. u, nhc im ca hm Vic t chc chng trnh thnh cc hm c 2 u im r rt : Th nht l chia chng trnh thnh cc n v c lp, lm cho chng trnh c t chc mt cch khoa hc d kim sot d pht hin li, d pht trin, m rng. Th hai l gim c kch thc chng trnh, v mi on chng trnh thc hin nhim v ca hm c thay bng mt li gi hm.

64

Tuy nhin hm cng c nhc im l lm chm tc chng trnh do phi thc hin mt s thao tc c tnh th tc mi khi gi hm nh: Cp pht vng nh cho cc i v bin cc b, truyn d liu ca cc tham s cho cc i, gii phng vng nh trc khi thot khi hm. Cc hm trc tuyn trong C++ cho kh nng khc phc c nhc im ni trn. 5.2. Cc hm trc tuyn bin mt hm thnh trc tuyn ta vit thm t kho inline vo trc khai bo nguyn mu hm. Nu khng dng nguyn mu th vit t kho ny trc dng u tin ca nh ngha hm. V d: inline float f(int n, float x); float f(int n, float x) { // Cc cu lnh trong thn hm } hoc inline float f(int n, float x) { // Cc cu lnh trong thn hm } Ch : Trong mi trng hp, t kho inline phi xut hin trc cc li gi hm th Trnh bin dch mi bit cn x l hm theo kiu inline. V d hm f trong chng trnh sau s khng phi l hm trc tuyn v t kho inline vit sau li gi hm: #include <conio.h> #include <iostream.h> void main()

65

{ int s ; s = f(5,6); cout << s ; getch(); } inline int f(int a, int b) { return a*b; } Ch : Trong C++ , nu hm c xy dng sau li gi hm th bt buc phi khai bo nguyn mu hm trc li gi. Trong v d trn, Trnh bin dch C++ s bt li v thiu khai bo nguyn mu hm f . 5.3. Cch bin dch hm trc tuyn Chng trnh dch x l cc hm inline nh cc macro (c nh ngha trong lnh #define), ngha l n s thay mi li gi hm bng mt on chng trnh thc hin nhim v ca hm. Cch ny lm cho chng trnh di ra, nhng tc chng trnh tng ln do khng phi thc hin cc thao tc c tnh th tc khi gi hm. 5.4. So snh macro v hm trc tuyn Dng macro v hm trc tuyn u dn n hiu qu tng t, tuy nhin ngi ta thch dng hm trc tuyn hn, v cch ny m bo tnh cu trc ca chng trnh, d s dng v trnh c cc sai st lt vt thng gp khi dng #define (nh thiu cc du ngoc, du chm phy) 5.5. Khi no th nn dng hm trc tuyn Phng n dng hm trc tuyn rt ngn c thi gian chy my nhng li lm tng khi lng b nh chng trnh (nht l i vi cc hm trc tuyn c nhiu cu lnh). V vy ch nn dng phng n trc tuyn i vi cc hm nh. 5.6. S hn ch ca Trnh bin dch

66

Khng phi khi gp t kho inline l Trnh bin dch nht thit phi x l hm theo kiu trc tuyn. Ch rng t kho inline ch l mt s gi cho Trnh bin dch ch khng phi l mt mnh lnh bt buc. C mt s hm m cc Trnh bin dch thng khng x l theo cch inline nh cc hm cha bin static, hm cha cc lnh chu trnh hoc lnh goto hoc lnh switch, hm quy. Trong trng hp ny t kho inline l d nhin b b qua. Thm ch t kho inline vn b b qua ngay c i vi cc hm khng c nhng hn ch nu trn nu nh Trnh bin dch thy cn thit (v d c qu nhiu hm inline lm cho b nh chng trnh qu ln) V d: Chng trnh sau s dng hm inline tnh chu vi v din tch ca hnh ch nht: Phng n 1: Khng khai bo nguyn mu. Khi hm dtcvhcn phi t trn hm main. #include <conio.h> #include <iostream.h> inline void dtcvhcn(int a, int b, int &dt, int &cv) { dt=a*b; cv=2*(a+b); } void main() { int a[20],b[20],cv[20],dt[20],n; cout << "\n So hinh chu hat: " ; cin >> n; for (int i=1;i<=n;++i) {

67

cout << "\nNhap 2 canh cua hinh chu nhat thu " <<i<< ": "; cin >> a[i] >> b[i] ; dtcvhcn(a[i],b[i],dt[i],cv[i]); } clrscr(); for (i=1;i<=n;++i) { cout << "\n Hinh chu nhat thu " << i << " : "; cout << "\nDo dai 2 canh= " << a[i] << " va " << b[i] ; cout << "\nDien tich= " << dt[i] ; cout << "\nChu vi= " << cv[i] ; } getch(); } Phng n 2: S dng khai bo nguyn mu. Khi t kho inline t trc nguyn mu. Ch : Khng c t inline trc nh ngha hm. Trong chng trnh di y nu t inline trc nh ngha hm th hu qu nh sau: Chng trnh vn dch thng, nhng khi chy th chng trnh b qun, khng thot c. #include <conio.h> #include <iostream.h> inline void dtcvhcn(int a, int b, int &dt, int &cv) ; void main() { int a[20],b[20],cv[20],dt[20],n; cout << "\n So hinh chu hat: " ;

68

cin >> n; for (int i=1;i<=n;++i) { cout << "\nNhap 2 canh cua hinh chu nhat thu " <<i<< ": "; cin >> a[i] >> b[i] ; dtcvhcn(a[i],b[i],dt[i],cv[i]); } clrscr(); for (i=1;i<=n;++i) { cout << "\n Hinh chu nhat thu " << i << " : "; cout << "\nDo dai 2 canh= " << a[i] << " va " << b[i] ; cout << "\nDien tich= " << dt[i] ; cout << "\nChu vi= " << cv[i] ; } getch(); } void dtcvhcn(int a, int b, int &dt, int &cv) { dt=a*b; cv=2*(a+b); }

6. nh ngha chng cc hm (Overloading)

69

6.1. Khi nim v nh ngha chng nh ngha chng (hay cn gi s ti bi) cc hm l dng cng mt tn nh ngha cc hm khc nhau. y l mt m rng rt c ngha ca C++. Nh bit, trong C v cc ngn ng khc (nh PASCAL, FOXPRO,...) mi hm u phi c mt tn phn bit. i khi y l mt s hn ch ln, v phi dng nhiu hm khc nhau thc hin cng mt cng vic. V d ly gi tr tuyt i trong C cn dng ti 3 hm khc nhau: int abs(int i); // Ly gi tr tuyt i gi tr kiu int longt labs(longt l); // Ly gi tr tuyt i gi tr kiu long double fabs(double d); // Ly gi tr tuyt i gi tr kiu double Nh kh nng nh ngha chng, trong C++ c th dng chung mt tn cho c 3 hm trn nh sau: int abs(int i) ; // Ly gi tr tuyt i gi tr kiu int longt abs(longt l) ; // Ly gi tr tuyt i gi tr kiu long double abs(double d) ; // Ly gi tr tuyt i gi tr kiu double 6.2. Yu cu v cc hm nh ngha chng Khi dng cng mt tn nh ngha nhiu hm, Trnh bin dch C++ s da vo s khc nhau v tp i ca cc hm ny i tn cc hm. Nh vy, sau khi bin dch mi hm s c mt tn khc nhau. T cho thy: cc hm c nh ngha trng tn phi c tp i khc nhau (v s lng hoc kiu). Nu 2 hm hon ton trng tn v trng i th Trnh bin dch s khng c cch no phn bit c. Ngay c khi 2 hm ny c kiu khc nhau th Trnh bin dch vn bo li. V d sau xy dng 2 hm cng c tn l f v cng c mt i nguyn a, nhng kiu hm khc nhau. Hm th nht kiu nguyn (tr v a*a), hm th hai kiu void (in gi tr a). Chng trnh s b thng bo li khi bin dch (bn hy th xem sao) #include <conio.h> #include <iostream.h> int f(int a); void f(int a);

70

int f(int a) { return a*a; } void f(int a) { cout << "\n " << a ; } void main() { int b=f(5); f(b); getch(); } 6.3. S dng cc hm nh ngha chng Khi gp mt li gi, Trnh bin dch s cn c vo s lng v kiu ca cc tham s gi hm c ng tn v ng b i s tng ng. V d: abs(123); // Tham s kiu int, gi hm int abs(int i) ; abs(123L); // Tham s kiu long, gi hm long abs(long l); abs(3.14); //Tham s kiu double, gi hm double abs(double d); Khi khng c hm no c b i cng kiu vi b tham s (trong li gi), th Trnh bin dch s chn hm no c b i gn kiu nht (php chuyn kiu d dng nht). V d: abs(A) ; // Tham s kiu char, gi hm int abs(int i) ;

abs(3.14F); // Tham s kiu float, gi hm double abs(double d); 6.4. Nn s dng php nh ngha chng cc hm nh th no

71

Nh ni trn, khi xy dng cng nh s dng cc hm trng tn, Trnh bin dch C++ phi suy on v gii quyt nhiu trng hp kh nhp nhng. V vy khng nn lm dng qu ng kh nng nh ngha chng, v iu lm cho chng trnh kh kim sot v d dn n sai st. Vic nh ngha chng s hiu qu hn nu c s dng theo cc li khuyn sau: + Ch nn nh ngha chng cc hm thc hin nhng cng vic nh nhau nhng trn cc i tng c kiu khc nhau. V d trong chng trnh cn xy dng cc hm: cng 2 ma trn vung kiu double, cng 2 ma trn vung kiu int, cng 2 ma trn ch nht kiu double, cng 2 ma trn ch nht kiu int, th 4 hm trn nn nh ngha chng (t cng tn). + Nn dng cc php chuyn kiu (nu cn) b tham s trong li gi hon ton trng kiu vi b i s ca mt hm c nh ngha chng. V nh th mi trnh c s nhp nhng cho Trnh bin dch v Trnh bin dch s chn ng hm cn gi. 6.5. Ly a ch cc hm trng tn Gi s c 4 hm u c tn l tinh_max c khai bo nh sau: int tinh_max(int a, int b, int c) ; // Max ca 3 s nguyn double tinh_max(double a, double b, double c); // Max ca 3 s // thc int tinh_max(int *a, int n) ; // Max ca mt dy s nguyn double tinh_max(double *a, int n) ; //Max ca mt dy s thc Vn t ra l lm th no ly c a ch ca mi hm. Cu tr li nh sau: ly a ch ca mt hm, ta khai bo mt con tr hm c kiu v b i nh hm cn ly a ch. Sau gn tn hm cho con tr hm. V d: int (*f1)(int , int, int ); f1 = tinh_max ; // Ly a ch ca hm th nht

double (*f2)(double , double, double); f2 = tinh_max ; int (*f3)(int *, int ); f3 = tinh_max ; // Ly a ch ca hm th ba // Ly a ch ca hm th hai

double (*f4)(double *, int );

72

f4 = tinh_max ; 6.6. Cc v d

// Ly a ch ca hm th t

V d 1: Chng trnh gii bi ton tm max ca mt dy s nguyn v max ca mt dy s thc. Trong chmg trnh c 6 hm. Hai hm dng nhp dy s nguyn v dy s thc c tn chung l nhapds. Bn hm: tnh max 2 s nguyn, tnh max 2 s thc, tnh max ca dy s nguyn, tnh max ca dy s thc c t chung mt tn l max. #include <conio.h> #include <iostream.h> #include <iomanip.h> void nhapds(int *x, int n); void nhapds(double *x, int n); int max(int x, int y); double max(double x, double y); int max(int *x, int n); double max(double *x, int n); void nhapds(int *x, int n) { for (int i=1;i<=n;++i) { cout << "Phan tu " << i << " = " ; cin >> x[i] ; } } void nhapds(double *x, int n) {

73

for (int i=1;i<=n;++i) { cout << "Phan tu " << i << " = " ; cin >> x[i] ; } } int max(int x, int y) { return x>y?x:y ; } double max(double x, double y) { return x>y?x:y ; } int max(int *x, int n) { int s=x[1]; for (int i=2;i<=n;++i) s = max(s,x[i]); return s; } double max(double *x, int n) { double s=x[1];

74

for (int i=2;i<=n;++i) s = max(s,x[i]); return s; } void main() { int a[20] , n , ni, nd, maxi ; double x[20] , maxd ; clrscr(); cout << "\nSo phan tu nguyen ni = " ; cin >> ni ; cout << "Nhap day so nguyen\n " ; nhapds(a,ni); cout << "\nSo phan tu thuc nd = " ; cin >> nd ; cout << "Nhap day so thuc\n " ; nhapds(x,nd); maxi = max(a,ni); maxd = max(x,nd); cout << "\nMax cua day nguyen = " << maxi ; cout << "\nMax cua day thuc = " << maxd ; getch(); } V d 2:

75

Chng trnh sau thc hin php nhn ma trn: D = A*B*C trong A, B l cc ma trn vung, C l ma trn ch nht. Trong chng trnh c 3 cp hm trng tn thc hin 3 nhim v (nhng trn 2 i tng khc nhau l ma trn vung v ch nht): Nhp ma trn, nhn 2 ma trn v in ma trn. #include <conio.h> #include <iostream.h> #include <iomanip.h> typedef int MT[20][20]; void nhapmt(MT a,char *ten, int m, int n); void inmt(MT a,char *ten, int m, int n); void nhanmt(MT a,MT b, MT c, int m, int n, int p); void nhapmt(MT a,char *ten, int n); void inmt(MT a,char *ten, int n); void nhanmt(MT a,MT b, MT c, int n); void nhapmt(MT a, char *ten, int m, int n) { for (int i=1;i<=m;++i) for (int j=1;j<=n;++j) { cout << "\n" << ten <<"[" << i << "," << j << "]= " ; cin >> a[i][j]; } } void nhapmt(MT a,char *ten, int n)

76

{ nhapmt(a,ten,n,n) ; } void inmt(MT a,char *ten, int m, int n) { cout << "\nMa tran: " << ten; for (int i=1;i<=m;++i) { cout << "\n" ; for (int j=1;j<=n;++j) cout << setw(6) << a[i][j]; } } void inmt(MT a,char *ten, int n) { inmt(a,ten,n,n) ; } void nhanmt(MT a,MT b, MT c, int m, int n, int p) { for (int i=1;i<=m;++i) for (int j=1;j<=p;++j) { c[i][j]=0; for (int k=1;k<=n;++k)

77

c[i][j] += a[i][k] * b[k][j]; } } void nhanmt(MT a,MT b, MT c, int n) { nhanmt(a,b,c,n,n, n) ; } void main() { MT a,b,c,d; // d= abc MT u; clrscr(); nhapmt(a,"A",2); nhapmt(b,"B",2); nhapmt(c,"C",2,3); nhanmt(a,b,u,2); nhanmt(u,c,d,2,2,3); inmt(a,"A",2); inmt(b,"B",2); inmt(u,"U = A*B",2); inmt(c,"C",2,3); inmt(d,"D = U*C",2,3); getch(); }

78

7. nh ngha chng cc ton t


7.1. Cc php ton trong C v C++ Trong C v C++ c kh nhiu cc php ton dng thc hin cc thao tc trn cc kiu d liu chun. V d cc php s hc: + - * / p dng cho cc kiu d liu nguyn, thc. Php ly phn d % p dng i vi kiu nguyn. 7.2. Thc hin cc php ton trn cc kiu d liu khng chun trong C Vic thc hin cc php ton trn cc i tng t nh ngha (nh mng, cu trc) l nhu cu bt buc ca thc t. Chng hn cn thc hin cc php s hc trn s phc, trn phn s, trn a thc, trn vc t, trn ma trn. p ng yu cu ny, ta s dng cc hm trong C. V d sau y l mt chng trnh C gm cc hm nhp phn s, in phn s v thc hin cc php cng tr nhn chia phn s. Chng trnh s nhp 5 phn s: p, q, z, u, v v tnh phn s s theo cng thc: s = (p q*z)/(u + v) #include <conio.h> #include <stdio.h> #include <math.h> typedef struct { int a,b; } PS; void nhap(PS *p); void in(PS p); int uscln(int x, int y); PS rutgon(PS p); PS cong(PS p1, PS p2);

79

PS tru(PS p1, PS p2); PS nhan(PS p1, PS p2); PS chia(PS p1, PS p2); void nhap(PS *p) { int t, m; printf("\nTu va mau: "); scanf("%d%d", &t, &m); p->a = t; p->b = m; } void in(PS p) { printf(" %d/%d",p.a,p.b); } int uscln(int x, int y) { x=abs(x); y=abs(y); if (x*y==0) return 1; while (x!=y) if (x>y) x-=y; else y-=x; return x; } PS rutgon(PS p)

80

{ PS q; int x; x=uscln(p.a,p.b); q.a = p.a / x ; q.b = p.b / x ; return q; } PS cong(PS p1, PS p2) { PS q; q.a = p1.a*p2.b + p2.a*p1.b; q.b = p1.b * p2.b ; return rutgon(q); } PS tru(PS p1, PS p2) { PS q; q.a = p1.a*p2.b - p2.a*p1.b; q.b = p1.b * p2.b ; return rutgon(q); } PS nhan(PS p1, PS p2) {

81

PS q; q.a = p1.a * p2.a ; q.b = p1.b * p2.b ; return rutgon(q); } PS chia(PS p1, PS p2) { PS q; q.a = p1.a * p2.b ; q.b = p1.b * p2.a ; return rutgon(q); } void main() { PS p, q, z, u, v ; PS tu,mau, s; printf("\n Nhap phan so p: "); nhap(&p); printf("\n Nhap phan so q: ");nhap(&q); printf("\n Nhap phan so z: ");nhap(&z); printf("\n Nhap phan so u: ");nhap(&u); printf("\n Nhap phan so v: ");nhap(&v); tu = nhan(q,z); tu = tru(p,tu) ; mau = cong(u,v) ;

82

s = chia(tu,mau); printf(\n Phan so s = ); in(s); getch(); } Nhn xt: Vic s dng cc hm thc hin cc php tnh khng c t nhin v t ra di dng. V d thc hin mt cng thc s = (p - q*z)/(u + v) phi dng 2 bin trung gian v 4 li gi hm. Cu hi t ra l c cch no ch cn vit ng cng thc ton hc, m vn nhn c kt qu mong mun hay khng? Trong C++ c th p ng c mong mun ny bng cch s dng cc php ton chun ca n cho cc kiu d liu t nh ngha (mng, cu trc, ...). Ni cch khc C++ cho php dng cc php ton nh ngha cc hm, m ta thng gi l nh ngha chng cc ton t (hay cn gi: S ti bi cc ton t). 7.3. Cch nh ngha chng cc ton t 7.3.1.Tn hm ton t: Gm t kho operator v tn php ton, v d: operator+ operator(nh ngha chng php +) (nh ngha chng php -)

7.3.2. Cc i ca hm ton t: a. Vi cc php ton c 2 ton hng, th hm ton t cn c 2 i. i th nht ng vi ton hng th nht, i th hai ng vi ton hng th hai. Do vy, vi cc php ton khng giao hon (nh php-) th th t i l rt quan trng. V d cc hm ton t cng , tr phn s c khai bo nh sau: struct PS { int a; // T s

int b; // Mu s

83

}; PS operator+(PS p1, PS p2); // p1 + p2 PS operator-(PS p1, PS p2); // p1 - p2

PS operator*(PS p1, PS p2); // p1 * p2 PS operator/(PS p1, PS p2); // p1 / p2

b. Vi cc php ton c mt ton hng, th hm ton t c mt i. V d hm ton t i du ma trn (i du tt c cc phn t ca ma trn) c khai bo nh sau: struct MT { double a[20][20] ; // Mng cha cc phn t ma trn int m ; // S hng ma trn int n ; // S ct ma trn }; MT operator-(MT x) ; 7.3.3. Thn ca hm ton t: Vit nh thn ca hm thng thng. V d hm i du ma trn c th c nh ngha nh sau: struct MT { double a[20][20] ; // Mng cha cc phn t ma trn int m ; // S hng ma trn int n ; // S ct ma trn }; MT operator-(MT x) { MT y;

84

for (int i=1; i<= m ;++i) for (int j=1; j<= n ;++j) y[i][j] = - x[i][j] ; return y; } 7.4. Cch dng hm ton t C 2 cch dng: Cch 1: Dng nh mt hm thng thng bng cch vit li gi. V d: PS p, q, u, v ; u = operator+(p, q) ; // u = p + q v = operator-(p, q) ; // v = p - q Cch 2: Dng nh php ton ca C++ . V d: PS p, q, u, v ; u = p + q ; // u = p + q v = p - q ; // v = p - q Ch : Khi dng cc hm ton t nh php ton ca C++ ta c th kt hp nhiu php ton vit cc cng thc phc tp. Cng cho php dng du ngoc trn quy nh th t thc hin cc php tnh. Th t u tin ca cc php tnh vn tun theo cc quy tc ban u ca C++ . Chng hn cc php * v / c th u tin cao hn so vi cc php + v V d: PS p, q, u, v, s1, s2 ; s1 = p*q - u/v ; // s1 = (p*q) s2 = (p - q)/(u + v) ; // s2 = (p - q)/(u + v)

85

8. Cc v d v nh ngha chng ton t


V d 1: Trong v d ny ngoi vic s dng cc hm ton t thc hin 4 php tnh trn phn s, cn nh ngha chng cc php ton << v >> xut v nhp phn s (xem chi tit trong chng 7). Hm operator<< c 2 i kiu ostream& v PS (Phn s). Hm tr v gi tr kiu ostream&. Hm c khai bo nh sau: ostream& operator<< (ostream& os, PS p); Tng t hm operator>> c khai bo nh sau: istream& operator>> (istream& is,PS &p); Di y s ch ra cch xy dng v s dng cc hm ton t. Chng ta cng s thy vic s dng cc hm ton t rt t nhin, ngn gn v tin li. Chng trnh di y c ni dung nh chng trnh trong 6.2, nhng thay cc hm bng cc hm ton t. #include <conio.h> #include <iostream.h> #include <math.h> typedef struct { int a,b; } PS; ostream& operator<< (ostream& os, PS p); istream& operator>> (istream& is,PS &p); int uscln(int x, int y); PS rutgon(PS p); PS operator+(PS p1, PS p2);

86

PS operator-(PS p1, PS p2); PS operator*(PS p1, PS p2); PS operator/(PS p1, PS p2); ostream& operator<< (ostream& os, PS p) { os << p.a << '/' << p.b ; return os; } istream& operator>> (istream& is,PS &p) { cout << "Nhap tu va mau: " ; is >> p.a >> p.b ; return is; } int uscln(int x, int y) { x=abs(x); y=abs(y); if (x*y==0) return 1; while (x!=y) if (x>y) x-=y; else y-=x;

return x; } PS rutgon(PS p)

87

{ PS q; int x; x=uscln(p.a,p.b); q.a = p.a / x ; q.b = p.b / x ; return q; } PS operator+(PS p1, PS p2) { PS q; q.a = p1.a*p2.b + p2.a*p1.b; q.b = p1.b * p2.b ; return rutgon(q); } PS operator-(PS p1, PS p2) { PS q; q.a = p1.a*p2.b - p2.a*p1.b; q.b = p1.b * p2.b ; return rutgon(q); } PS operator*(PS p1, PS p2) {

88

PS q; q.a = p1.a * p2.a ; q.b = p1.b * p2.b ; return rutgon(q); } PS operator/(PS p1, PS p2) { PS q; q.a = p1.a * p2.b ; q.b = p1.b * p2.a ; return rutgon(q); } void main() { PS p, q, z, u, v ; PS s; cout <<"\nNhap cac PS p, q, z, u, v:\n " ; cin >> p >> q >> z >> u >> v ; s = (p - q*z) / (u + v) ; cout << "\n Phan so s = " << s; getch(); } V d 2: Chng trnh a vo cc hm ton t: operatorc mt i dng o du mt a thc

89

operator+ operatoroperator* operator^ operator<< operator>>

c 2 i dng cng 2 a thc c 2 i dng tr 2 a thc c 2 i dng nhn 2 a thc c 2 i dng tnh gi a thc ti x c 2 i dng in a thc c 2 i dng nhp a thc

Chng trnh s nhp 4 a thc: p, q, r, s. Sau tnh a thc: f = -(p+q)*(r-s) Cui cng tnh gi tr f(x), vi x l mt s thc nhp t bn phm. #include <conio.h> #include <iostream.h> #include <math.h> struct DT { double a[20]; // Mang chua cac he so da thuc a0, a1,... int n ; // Bac da thuc }; ostream& operator<< (ostream& os, DT d); istream& operator>> (istream& is,DT &d); DT operator-(const DT& d); DT operator+(DT d1, DT d2); DT operator-(DT d1, DT d2); DT operator*(DT d1, DT d2); double operator^(DT d, double x); // Tinh gia tri da thuc

90

ostream& operator<< (ostream& os, DT d) { os << " - Cac he so (tu ao): " ; for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os; } istream& operator>> (istream& is, DT &d) { cout << " - Bac da thuc: " ; cin >> d.n; cout << "Nhap cac he so da thuc:\n" ; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << " = " ; is >> d.a[i] ; } return is; } DT operator-(const DT& d) { DT p; p.n = d.n; for (int i=0 ; i<=d.n ; ++i)

91

p.a[i] = -d.a[i]; return p; } DT operator+(DT d1, DT d2) { DT d; int k,i; k = d1.n > d2.n ? d1.n : d2.n ; for (i=0; i<=k ; ++i) if (i<=d1.n && i<=d2.n) d.a[i] = d1.a[i] + d2.a[i]; else if (i<=d1.n) d.a[i] = d1.a[i]; else d.a[i] = d2.a[i]; i=k; while (i>0 && d.a[i]==0.0) --i; d.n = i; return d ; } DT operator-(DT d1, DT d2) { return (d1 + (-d2)); }

92

DT operator*(DT d1, DT d2) { DT d; int k, i, j; k = d.n = d1.n + d2.n ; for (i=0; i<=k; ++i) d.a[i] = 0; for (i=0 ; i<= d1.n ; ++i) for (j=0 ; j<= d2.n ; ++j) d.a[i+j] += d1.a[i]*d2.a[j] ; return d; } double operator^(DT d, double x) { double s=0.0 , t=1.0; for (int i=0 ; i<= d.n ; ++i) { s += d.a[i]*t; t *= x; } return s; } void main() { DT p,q,r,s,f;

93

double x,g; clrscr(); cout <<"\nNhap da thuc P " ; cin >> p; cout <<"\nNhap da thuc Q " ; cin >> q; cout <<"\nNhap da thuc R " ; cin >> r; cout <<"\nNhap da thuc S " ; cin >> s; cout << "\nNhap so thuc x: " ; cin >> x; f = -(p+q)*(r-s); g = f^x; cout << "\nDa thuc f " << f ; cout << "\n x = " << x; cout << "\nf(x) = " << g; getch(); }

9. Cc bi ton v ma trn v vc t
Trong mc ny s xt cc ma trn thc vung cp n v cc vc t thc cp n. Chng c biu din thng qua cc kiu cu trc MT v VT: struct MT { double a[20][20] ; // Mang a cha cc phn t ma trn int n ; }; struct VT // Cp ma trn

94

{ double b[20]; // Mang chua cac phan tu cua vec to int n ; // Cap vec to }; x l ma trn v vc t, chng ta xy dng 9 hm ton t: ostream& operator<< (ostream& os, const MT& x); // In ma trn ostream& operator<< (ostream& os, const VT& v); // In vc t istream& operator>> (istream& is,MT& x); istream& operator>> (istream& is, VT &v); // Nhp ma trn // Nhp vc t

MT operator+(const MT& x1, const MT& x2); // Cng 2 ma trn MT operator-(const MT& x1, const MT& x2); // Tr 2 ma trn

MT operator*(const MT& x1, const MT& x2); // Nhn 2 ma trn VT operator*(const MT& x, const VT& v); // Nhn ma trn vc t MT operator!(MT x); // Nghch o ma trn

Thut ton cho 8 hm ton t u tng i quen thuc khng c g phi bn. nghch o ma trn c nhiu cch, y chng ta dng phng php Jordance nh sau. Gi s cn nghch o ma trn x cp n. Ta dng thm ma trn n v y. Sau thc hin ng thi cc php tnh trn c x v y sao cho x tr thnh n v. Kt qu y chnh l nghch o ca x. Thut ton c tin hnh trn n bc. Ni dung ca bc k (k = 1,...,n) nh sau: Tm ch s r ( k <= r <= n) sao cho abs(x[r,k]) = max { abs(x[i,k] vi i = k,...,n } Nu abs(x[r,k]) = 0 th ma trn khng c nghch o v thut ton kt thc gia chng. Hon v hng k vi hng r trong c 2 ma trn x v y. Chia hng k ca c x v y cho tg = x[k,k] (mc ch lm cho x[k,k] = 1). Bin i ct k ca x tr thnh vc t n v bng cch lm cho cc phn t x[i,k] = 0 (vi i khc k). Mun vy ta thc hin cc php tnh sau trn c x v y:

95

(hng i) = (hng i) - x[i,k]*(hng k) , vi mi i khc k Ni dung chng trnh l nhp 4 ma trn X, Y, R, S v vc t u. Sau tnh vc t v theo cng thc: v = ((X + Y)*(R - S))-1u Nh s thy trong hm main() di y, nh cc hm ton t m cu lnh tnh v c vit gn ging nh cng thc ton hc nu trn. /* Chng trnh */ #include <conio.h> #include <iostream.h> #include <iomanip.h> #include <math.h> struct MT { double a[20][20]; // Mang chua cac phan tu ma tran int n ; // Cap ma tran }; struct VT { double b[20]; // Mang chua cac phan tu cua vec to int n ; // Cap vec to }; ostream& operator<< (ostream& os, const MT& x); ostream& operator<< (ostream& os, const VT& v); istream& operator>> (istream& is,MT& x); istream& operator>> (istream& is, VT &v);

96

MT operator+(const MT& x1, const MT& x2); MT operator-(const MT& x1, const MT& x2); MT operator*(const MT& x1, const MT& x2); VT operator*(const MT& x, const VT& v); MT operator!(MT x); // Tinh ma tran nghich dao ostream& operator<< (ostream& os, const MT& x) { os << setprecision(2) << setiosflags(ios::showpoint); for (int i=1 ; i<= x.n ; ++i) { os << "\n" ; for (int j=1; j<=x.n; ++j) os << setw(6) << x.a[i][j] ; } os << "\n" ; return os; } ostream& operator<< (ostream& os, const VT& v) { os << setprecision(2) << setiosflags(ios::showpoint); for (int i=1 ; i<= v.n ; ++i) os << setw(6) << v.b[i] ; os << "\n" ; return os;

97

} istream& operator>> (istream& is, MT& x) { cout << " - Cap ma tran: " ; is >> x.n; cout << "Nhap cac phan tu :\n" ; for (int i=1 ; i<= x.n ; ++i) for (int j=1; j<=x.n; ++j) { cout << "PT hang " << i << " cot " << j << " = " ; is >> x.a[i][j] ; } return is; } istream& operator>> (istream& is, VT& v) { cout << " - Cap vec to: " ; is >> v.n; cout << "Nhap cac phan tu :\n" ; for (int i=1 ; i<= v.n ; ++i) { cout << "Phan tu thu " << i << " = " ; is >> v.b[i] ; }

98

return is; } MT operator+(const MT& x1, const MT& x2) { if (x1.n!=x2.n) { cout << "\nKhong thuc hien duoc phep cong vi 2 MT khong cung cap"; getch(); return x1; } else { MT x; int i, j, n; n = x.n = x1.n ; for (i=1; i<=n; ++i) for (j=1; j<=n ;++j) x.a[i][j] = x1.a[i][j] + x2.a[i][j] ; return x; } } MT operator-(const MT& x1, const MT& x2) { if (x1.n!=x2.n)

99

{ cout << "\nKhong thuc hien duoc phep tru vi 2 MT khong cung cap"; getch(); return x1; } else { MT x; int i, j, n; n = x.n = x1.n; for (i=1; i<=n; ++i) for (j=1; j<=n ;++j) x.a[i][j] = x1.a[i][j] - x2.a[i][j] ; return x; } } MT operator*(const MT& x1, const MT& x2) { if (x1.n!=x2.n) { cout << "\nKhong thuc hien duoc phep nhan vi 2 MT khong cung cap"; getch(); return x1; }

100

else { MT x; int n, i, j,k; n = x.n = x1.n; for (i=1; i<=n; ++i) for (j=1; j<=n ;++j) { x.a[i][j] = 0.0 ; for (k=1 ; k<=n; ++k) x.a[i][j] += x1.a[i][k]*x2.a[k][j] ; } return x; } } VT operator*(const MT& x, const VT& v) { if (x.n != v.n) { cout << "\n Cap ma tran khac cap vec to, phep nhan vo nghia"; getch(); return v; } else

101

{ VT u; int n; n = u.n = v.n ; for (int i=1; i <=n ; ++i) { u.b[i] = 0; for (int j=1; j<=n; ++j) u.b[i] += x.a[i][j]*v.b[j]; } return u; } } MT operator!(MT x) { MT y; int i,j,k,r,n; double tg; n = y.n = x.n ; for (i=1 ; i<=n ; ++i) for (j=1 ; j<=n ; ++j) if (i==j) y.a[i][j] = 1; else y.a[i][j] = 0; for (k=1; k<=n; ++k) {

102

r=k; for (i=k+1; i<=n; ++i) if (abs(x.a[i][k]) > abs(x.a[r][k]) ) r = i; if (abs(x.a[r][k]) < 1.0E-8) { cout << "\n Ma tran suy bien, khong co nghich dao" ; getch(); return x; } /* Hoan vi hang r va hang k */ for (j=1 ; j<=n ; ++j) { tg = x.a[k][j]; x.a[k][j] = x.a[r][j]; x.a[r][j] = tg; tg = y.a[k][j]; y.a[k][j] = y.a[r][j]; y.a[r][j] = tg; } /* Chia hang k cho a[k,k] */ tg = x.a[k][k] ; for (j=1 ; j<=n ; ++j) { x.a[k][j] /= tg;

103

y.a[k][j] /= tg; } /* Khu cot k : lam cho a[i,k] = 0 voi i != k */ for (int i=1; i<= n ; ++i) if (i != k) { tg = x.a[i][k] ; for (j=1 ; j<=n ; ++j) { x.a[i][j] -= tg*x.a[k][j] ; y.a[i][j] -= tg*y.a[k][j] ; } } } return y; } void main() { MT x,y,r,s; VT u,v; clrscr(); cout <<"\nNhap ma tran X " ; cin >> x; cout <<"\nNhap ma tran Y " ; cin >> y; cout <<"\nNhap ma tran R " ; cin >> r;

104

cout <<"\nNhap ma tran S " ; cin >> s; cout <<"\nNhap vec to u " ; cin >> u; v = !((x+y)*(r-s))*u ; cout << "\nVec to v = xu " << v ; getch(); }

105

Chng 3 Khi Nim V Lp


Nh ni trn, lp l khi nim trung tm ca lp trnh hng i tng, n l s m rng ca cc khi nim cu trc (struct) ca C v bn ghi (record) ca PASCAL. Ngoi cc thnh phn d liu (nh cu trc), lp cn cha cc thnh phn hm , cn gi l phng thc (method) hay hm thnh vin (member function). Cng ging nh cu trc, lp c th xem nh mt kiu d liu. V vy lp cn gi l kiu i tng v lp c dng khai bo cc bin, mng i tng (nh th dng kiu int khai bo cc bin mng nguyn). Nh vy t mt lp c th to ra (bng cch khai bo) nhiu i tng (bin, mng) khc nhau. Mi i tng c vng nh ring ca mnh. V vy cng c th quan nim lp l tp hp cc i tng cng kiu. Chng ny s trnh bycch nh ngha lp, cch xy dng phng thc, gii thch v phm vi truy nhp, s dng cc thnh phn ca lp, cch khai bo bin, mng cu trc, li gi ti cc phng thc.

1. nh ngha lp
1. Lp c nh ngha theo mu: class tn_lp { // Khai bo cc thnh phn d liu (thuc tnh) // Khai bo cc phng thc }; // nh ngha (xy dng) cc phng thc Ch : Thuc tnh ca lp c th l cc bin, mng, con tr c kiu chun (int, float, char, char*, long,...) hoc kiu ngoi chun nh ngha trc (cu trc, hp, lp, ...) . Thuc tnh ca lp khng th c kiu ca chnh lp , nhng c th l kiu con tr lp ny, v d: class A {

106

A A ... } ;

x;

// Khng cho php, v x c kiu lp A

*p ; // Cho php , v p l con tr kiu lp A

2. Khi bo cc thnh phn ca lp (thuc tnh v phng thc) c th dng cc t kho private v public quy nh phm vi s dng ca cc thnh phn. Nu khng quy nh c th (khng dng cc t kho private v public) th C++ hiu l private. Cc thnh phn private (ring) ch c s dng bn trong lp (trong thn ca cc phng thc ca lp). Cc hm khng phi l phng thc ca lp khng c php s dng cc thnh phn ny. Cc thnh phn public (cng cng) c php s dng c bn trong v bn ngoi lp. 3. Cc thnh phn d liu thng (nhng khng bt buc) khai bo l private bo m tnh giu kn, bo v an ton d liu ca lp, khng cho php cc hm bn ngoi xm nhp vo d liu ca lp. 4. Cc phng thc thng khai bo l public chng c th c gi ti (s dng) t cc hm khc trong chng trnh. 5. Cc phng thc c th c xy dng bn ngoi hoc bn trong nh ngha lp. Thng thng, cc phng thc ngn c vit bn trong nh ngha lp, cn cc phng thc di th vit bn ngoi nh ngha lp. 6. Trong thn phng thc ca mt lp (gi s lp A) c th s dng: + Cc thuc tnh ca lp A + Cc phng thc ca lp A + Cc hm t lp trong chng trnh. V phm vi s dng ca hm l ton chng trnh. 7. Gi tr tr v ca phng thc c th c kiu bt k (chun v ngoi chun) V d sau s minh ho cc iu ni trn. Chng ta s nh ngha lp m t v x l cc im trn mn hnh ho. Lp c t tn l DIEM. + Cc thuc tnh ca lp gm:

107

int x ; // honh (ct) int y ; // tung int m ; // mu + Cc phng thc: Nhp d liu mt im Hin th mt im n mt im Lp im c xy dng nh sau: class DIEM { private: int x, y, m ; public: void nhapsl() ; void hien() ; void an() { putpixel(x, y, getbkcolor()); } }; void DIEM::nhap() { cout << \nNhp honh (ct) v tung (hng) ca im: cin >> x >> y ; (hng)

108

cout << \nNhp m mu ca im: cin >> m ; } void DIEM::hien() { int mau_ht ; mau_ht = getcolor(); putpixel(x, y, m); setcolor(mau_ht); } Qua v d trn c th rt ra mt s iu cn nh sau: + Trong c 3 phng thc (d vit trong hay vit ngoi nh ngha lp) u c php truy nhp n cc thuc tnh x, y v m ca lp. + Cc phng thc vit bn trong nh ngha lp (nh phng thc an() ) c vit nh mt hm thng thng. + Khi xy dng cc phng thc bn ngoi lp, cn dng thm tn lp v ton t phm vi :: t ngay trc tn phng phc quy nh r y l phng thc ca lp no.

2. Bin, mng i tng


Nh ni trn, mt lp (sau khi nh ngha) c th xem nh mt kiu i tng v c th dng khai bo cc bin, mng i tng. Cch khai bo bin, mng i tng cng ging nh khai bo bin, mng cc kiu khc (nh int, float, cu trc, hp, ...), theo mu sau: Tn_lp danh sch i ; Tn_lp danh sch mng ; V d s dng lp DIEM 1, c th khai bo cc bin, mng DIEM nh sau:

109

DIEM d1, d2, d3 ; // Khai bo 3 bin i tng d1, d2, d3 DIEM d[20] ; // Khai bo mng i tng d gm 20 phn t Mi i tng sau khi khai bo s c cp pht mt vng nh ring cha cc thuc tnh ca chng. Ch rng s khng c vng nh ring cha cc phng thc cho mi i tng. Cc phng thc s c s dng chung cho tt c cc i tng cng lp. Nh vy v b nh c cp pht th i tng ging cu trc. Trong trng hp ny: sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = 6 sizeof(d) = 20*6 = 120 Thuc tnh ca i tng: Trong v d trn, mi i tng d1, d2, d3 v mi phn t d[i] u c 3 thuc tnh l x, y, m. Ch l mi thuc u thuc v mt i tng, v vy khng th vit tn thuc mt cch ring r m bao gi cng phi c tn i tng i km, ging nh cch vit trong cu trc ca C hay bn ghi ca PASCAL. Ni cch khc, cch vit thuc tnh ca i tng nh sau: tn_i_tng.Tn_thuc_tnh Vi cc i tng d1, d2, d3 v mng d, c th vit nh sau: d1.x d2.x d3.y // Thuc tnh x ca i tng d1 // Thuc tnh x ca i tng d2 // Thuc tnh y ca i tng d3

d[2].m // Thuc tnh m ca phn t d[2] d1.x = 100 ; // Gn 100 cho d1.x d2.y = d1.x; // Gn d1.x cho d2.y S dng cc phng thc Cng ging nh hm, mt phng thc c s dng thng qua li gi. Tuy nhin trong li gi phng thc bao gi cng phi c tn i tng ch r phng thc thc hin trn cc thuc tnh ca i tng no. V d li gi: d1.nhapsl(); s thc hin nhp s liu vo cc thnh phn d1.x, d1.y v d1.m

110

Cu lnh d[3].nhapsl() ; s thc hin nhp s liu vo cc thnh phn d[3].x, d[3].y v d[3].m Chng ta s minh ho cc iu ni trn bng mt chng trnh n gin s dng lp DIEM nhp 3 im, hin ri n cc im va nhp. Trong chng trnh a vo hm kd_do_hoa() dng khi ng h ho. #include <conio.h> #include <iostream.h> #include <graphics.h> class DIEM { private: int x, y, m ; public: void nhapsl(); void an() { putpixel(x,y,getbkcolor()); } void hien(); }; void DIEM::nhapsl() { cout << "\nNhap hoanh do (cot) va tung do (hang) cua diem: " ; cin >> x >> y ;

111

cout << " \nNhap ma mau cua diem: " ; cin >> m ; } void DIEM::hien() { int mau_ht; mau_ht = getcolor() ; putpixel(x,y,m); setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ""); } void main() { DIEM d1, d2, d3 ; d1.nhapsl(); d2.nhapsl(); d3.nhapsl(); kd_do_hoa(); setbkcolor(BLACK);

112

d1.hien(); d2.hien(); d3.hien(); getch(); d1.an(); d2.an(); d3.an(); getch(); closegraph(); }

3. Con tr i tng
Con tr i tng dng cha a ch ca bin, mng i tng. N c khai bo nh sau: Tn_lp *con tr ; V d dng lp DIEM c th khai bo: DIEM *p1 , *p2, *p3 ; // khai bo 3 con tr p1, p2, p3 DIEM d1, d2 ; // Khai bo 2 i tng d1, d2 DIEM d[20] ; // Khai bo mng i tng v c th thc hin cc cu lnh: p1 = &d2 ; // p1 cha a ch ca d2 , hay p1 tr ti d2 p2 = d ; // p2 tr ti u mng d

p3 = new DIEM // To mt i tng v cha a ch ca n // vo p3

113

s dng thuc tnh ca i tng thng qua con tr, ta vit nh sau: Tn_con_tr->Tn_thuc_tnh Ch : Nu con tr cha a ch u ca mng, c th dng con tr nh tn mng. Nh vy sau khi thc hin cc cu lnh trn th: p1->x v d2.x l nh nhau p2[i].y v d[i].y l nh nhau Tm li ta c quy tc sau Quy tc s dng thuc tnh: s dng mt thuc tnh ca i tng ta phi dng php . hoc php -> . Trong chng trnh, khng cho php vit tn thuc tnh mt cch n c m phi i km tn i tng hoc tn con tr theo cc mu sau: Tn_i_tng.Tn_thuc_tnh Tn_con_tr->Tn_thuc_tnh Tn_mng_i_tng[ch_s].Tn_thuc_tnh Tn_con_tr[ch_s].Tn_thuc_tnh Chng trnh di y cng s dng lp DIEM (trong 1) nhp mt dy im, hin th v n cc im va nhp. Chng trnh dng mt con tr kiu DIEM v dng ton t new to ra mt dy i tng. #include <conio.h> #include <iostream.h> #include <graphics.h> class DIEM { private: int x, y, m ; public:

114

void nhapsl(); void an() { putpixel(x,y,getbkcolor()); } void hien(); }; void DIEM::nhapsl() { cout <<"\nNhap hoanh do (cot) va tung do (hang) cua diem:" ; cin >> x >> y ; cout << " \nNhap ma mau cua diem: " ; cin >> m ; } void DIEM::hien() { int mau_ht; mau_ht = getcolor() ; putpixel(x,y,m); setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ;

115

mh=mode=0; initgraph(&mh, &mode, ""); } void main() { DIEM *p; int i, n; cout << "So diem: " ; cin >> n; p = new DIEM[n+1]; for (i=1; i<=n; ++i) p[i].nhapsl(); kd_do_hoa(); for (i=1; i<=n; ++i) p[i].hien(); getch(); for (i=1; i<=n; ++i) p[i].an(); getch(); closegraph(); }

4. i ca phng thc, con tr this

116

4.1. Con tr this l i th nht ca phng thc Chng ta hy xem li phng thc nhapsl ca lp DIEM void DIEM::nhapsl() { cout <<"\nNhap hoanh do (cot) va tung do (hang) cua diem:" ; cin >> x >> y ; cout << " \nNhap ma mau cua diem: " ; cin >> m ; } R rng trong phng thc ny chng ta s dng tn cc thuc tnh x, y v m mt cch n c. iu ny c v nh mu thun vi quy tc s dng thuc tnh nu trong mc trc. Song s th nh sau: C++ s dng con tr c bit this trong cc phng thc. Cc thuc tnh vit trong phng thc c hiu l thuc mt i tng do con tr this tr ti. Nh vy phng thc nhapsl() c th vit mt cch tng minh nh sau: void DIEM::nhapsl() { cout << "\nNhap hoanh do (cot) va tung do (hang) cua diem:" ; cin >> this->x >> this->y ; cout << " \nNhap ma mau cua diem: " ; cin >> this->m ; } T gc hm s c th kt lun rng: Phng thc bao gi cng c t nht mt i l con tr this v n lun lun l i u tin ca phng thc. 4.2. Tham s ng vi i con tr this Xt mt li gi ti phng thc nhapsl() :

117

DIEM d1; d1.nhapsl() ; Trong trng hp ny tham s truyn cho con tr this chnh l a ch ca d1: this = &d1 Do : this->x chnh l d1.x this->y chnh l d1.y this->m chnh l d1.m Nh vy cu lnh d1.nhapsl() ; s nhp d liu cho cc thuc tnh ca i tng d1. T c th rt ra kt lun sau: Tham s truyn cho i con tr this chnh l a ch ca i tng i km vi phng thc trong li gi phng thc. 4.3. Cc i khc ca phng thc Ngoi i c bit this (i ny khng xut hin mt cch tng minh), phng thc cn c cc i khc c khai bo nh trong cc hm. i ca phng thc c th c kiu bt k (chun v ngoi chun). V d xy dng phng thc v ng thng qua 2 im ta cn a vo 3 i: Hai i l 2 bin kiu DIEM, i th ba kiu nguyn xc nh m mu. V c i ngm nh this l i th nht, nn ch cn khai bo thm 2 i. Phng thc c th vit nh sau: void DIEM::doan_thang(DIEM d2, int mau) { int mau_ht; mau_ht = getcolor(); setcolor(mau); line(this->x,this->y,d2.x,d2.y);

118

setcolor(mau_ht); } Chng trnh sau minh ho cc phng thc c nhiu i. Ta vn dng lp DIEM nhng c mt s thay i: + B thuc tnh m (mu) + B cc phng thc hien v an +a vo 4 phng thc mi: ve_ doan_thang (V on thng qua 2 im) ve_tam_giac (V tam gic qua 3 im) do_dai (Tnh di ca on thng qua 2 im) chu_vi (Tnh chu vi tam gic qua 3 im) Chng trnh cn minh ho: + Vic phng thc ny s dng phng thc khc (phng thc ve_tam_giac s dng phng thc ve_doan_thang, phng thc chu_vi s dng phng thc do_dai) + S dng con tr this trong thn cc phng thc ve_tam_giac v chu_vi Ni dung chng trnh l nhp 3 im, v tam gic c nh l 3 im va nhp sau tnh chu vi tam gic. #include <conio.h> #include <iostream.h> #include <graphics.h> #include <math.h> #include <stdio.h> class DIEM { private:

119

int x, y ; public: void nhapsl(); void ve_doan_thang(DIEM d2, int mau) ; void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; double do_dai(DIEM d2) { DIEM d1 = *this ; return sqrt( pow(d1.x - d2.x,2) + } double chu_vi(DIEM d2, DIEM d3); }; void DIEM::nhapsl() { cout <<" \nNhap hoanh do (cot) va tung do (hang) cua diem:" ; cin >> x >> y ; } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ""); } void DIEM::ve_doan_thang(DIEM d2, int mau) pow(d1.y - d2.y,2) ) ;

120

{ setcolor(mau); line(this->x,this->y,d2.x,d2.y); } void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) { (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(*this,mau); } double DIEM::chu_vi(DIEM d2, DIEM d3) { double s; s= (*this).do_dai(d2) + d2.do_dai(d3) + d3.do_dai(*this) ; return s; } void main() { DIEM d1, d2, d3; char tb_cv[20] ; d1.nhapsl(); d2.nhapsl(); d3.nhapsl(); kd_do_hoa();

121

d1.ve_tam_giac(d2,d3,15); double s = d1.chu_vi(d2,d3); sprintf(tb_cv,"Chu vi = %0.2f", s); outtextxy(10,10,tb_cv); getch(); closegraph(); } Mt s nhn xt v i ca phng thc v li gi phng thc + Quan st nguyn mu phng thc: void ve_doan_thang(DIEM d2, int mau) ; s thy phng thc c 3 i: i th nht l mt i tng DIEM do this tr ti i th hai l i tng DIEM d2 i th ba l bin nguyn mau Ni dung phng thc l v mt on thng i qua cc im *this v d2 theo m mu mau. Xem thn ca phng s thy c ni dung ny: void DIEM::ve_doan_thang(DIEM d2, int mau) { setcolor(mau); line(this->x,this->y,d2.x,d2.y); } Tuy nhin trong trng hp ny, vai tr ca this khng cao lm, v n c a vo ch ct lm r i th nht. Trong thn phng thc c th b t kho this vn c. + Vai tr ca this tr nn quan trng trong phng thc ve_tam_giac: void ve_tam_giac(DIEM d2, DIEM d3,int mau) ;

122

Phng thc ny c 4 i l: this tr ti mt i tng kiu DIEM d2 d3 mt i tng kiu DIEM mt i tng kiu DIEM

mau mt bin nguyn Ni dung phng thc l v 3 cnh: cnh 1 i qua *this v d2 cnh 2 i qua cnh 3 i qua d2 v d3 d3 v *this

Cc cnh trn c v nh s dng phng thc ve_doan_thang: V cnh 1 dng lnh: (*this).ve_doan_thang(d2,mau) ; V cnh 2 dng lnh: d2.ve_doan_thang(d3,mau); V cnh 3 dng lnh: d3.ve_doan_thang(*this,mau); Trong trng ny r rng vai tr ca this rt quan trng. Nu khng dng n th cng vic tr nn kh khn, di dng v kh hiu hn. Chng ta hy so snh 2 phng n: Phng n dng this trong phng thc ve_tam_giac: void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) { (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(*this,mau); } Phng n khng dng this trong phng thc ve_tam_giac: void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau)

123

{ DIEM d1; d1.x = x; d1.y = y; d1.ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(d1,mau); }

5. Ni thm v kiu phng thc v kiu i ca phng thc


5.1. Kiu phng thc Phng thc c th khng c gi tr tr v (kiu void) hoc c th tr v mt gi tr c kiu bt k, k c gi tr kiu i tng, con tr i tng, tham chiu i tng. 5.2. i ca phng thc i ca phng thc (cng ging nh i ca hm) c th c kiu bt k: + Kiu d liu chun nh int, float, char,... . Con tr hoc tham chiu n kiu d liu chun nh int*, float*, char*, int&, float&, char&,... + Cc kiu ngoi chun nh ngha trc nh i tng, cu trc, hp, enum,... . Con tr hoc tham chiu n cc kiu ngoi chun ny. + Kiu i tng ca chnh phng thc, con tr hoc tham chiu n kiu i tng ny. 5.3. Cc v d V d 1 minh ho: + Thuc tnh (thnh phn d liu) ca lp c th l i tng ca lp khc nh ngha bn trn.

124

+ Phng thc c gi tr tr v kiu i tng v con tr i tng. Ni dung chng trnh l nhp mt dy hnh ch nht, sau tm hnh ch nht c max din tch v hnh ch nht c max chu vi. Chng trnh c t chc thnh 2 lp: + Lp HINH_CN gm: - Cc thuc tnh: d v r (chiu di v chiu rng) - Cc phng thc void nhapsl() ; // Nhp chiu di, rng int dien_tich(); // Tnh din tch int chu_vi() ; // Tnh chu vi

+ Lp DAY_HINH_CN gm - Cc thuc tnh: int n ; //s hnh ch nht ca dy HINH_CN *h; //Con tr ti dy i tng ca lp HINH_CN - Cc phng thc void nhapsl(); // Nhp mt dy hnh ch nht

HINH_CN hinh_dt_max() ; //Tr v hnh ch nht c // din tch max HINH_CN *hinh_cv_max() ; // Tr v con tr ti HCN c // chu vi max #include <conio.h> #include <iostream.h> class HINH_CN {

125

private: int d, r; // chieu dai va chieu rong public: void nhapsl() { cout << " \nNhap chieu dai va chieu rong: " ; cin >> d >> r ; } void in() { cout << "\nchieu dai = " << d ; cout << " chieu rong= " << r; } int dien_tich() { return d*r; } int chu_vi() { return 2*(d+r); } }; class DAY_HINH_CN {

126

private: int n; // So hinh ch nhat HINH_CN *h; public: void nhapsl(); HINH_CN hinh_dt_max() ; HINH_CN *hinh_cv_max() ; }; void DAY_HINH_CN::nhapsl() { cout << "So hinh CN = " ; cin >> n; h = new HINH_CN[n+1]; for (int i=1;i<=n;++i) h[i].nhapsl(); } HINH_CN DAY_HINH_CN::hinh_dt_max() { HINH_CN hdtmax; hdtmax = h[1]; for (int i=2; i<=n; ++i) if (h[i].dien_tich() > hdtmax.dien_tich() ) hdtmax = h[i]; return hdtmax;

127

} HINH_CN *DAY_HINH_CN::hinh_cv_max() { int imax = 1; for (int i=2; i<=n; ++i) if (h[i].chu_vi() > h[imax].chu_vi() ) imax = i ; return (h+imax); } void main() { DAY_HINH_CN d; HINH_CN hdtmax; d.nhapsl(); hdtmax = d.hinh_dt_max(); hdtmax.in() ; HINH_CN *hcvmax=d.hinh_cv_max(); hcvmax->in() ; getch(); } V d 2 minh ho: + Thuc tnh (thnh phn d liu) ca lp c th l i tng ca lp khc nh ngha bn trn. + Phng thc c gi tr tr v kiu i tng

128

+ Vai tr ca con tr this (xem phng thc maxdt ca lp TAM_GIAC) + Phng thc tnh (xem phng thc tao_tg ca lp TAM_GIAC) Ni dung chng trnh l nhp mt dy cc im, sau tm tam gic ln nht (v din tch) c nh l cc im va nhp. Chng trnh c t chc thnh 2 lp: + Lp DIEM gm: - Cc thuc tnh: x v y (to ca im) - Cc phng thc void nhapsl() ; // Nhp x, y void in() ; // In to

double do_dai(DIEM d2) ; // Tnh di on thng qua // 2 im (im n xc nh bi this v im d2) + Lp TAM_GIAC gm: - Cc thuc tnh: DIEM d1,d2,d3; // 3 nh ca tam gic - Cc phng thc: void nhapsl(); // Nhp to 3 nh void in(); // In to 3 nh

// To mt i tng TAM_GIAC t 3 i tng DIEM static TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) double dien_tich() ; // Tnh din tch // Tm tam gic c din tch max trong 2 tam gic *this v t2 TAM_GIAC maxdt(TAM_GIAC t2); + Cc vn ng ch trong chng trnh l:

129

- Phng thc tnh tao_tg (s gii thch bn di) - Phng thc maxdt + Thut ton l: - Duyt qua cc t hp 3 im. - Dng phng thc tao_tg lp tam gic t 3 im - Dng phng thc maxdt chn tam gic c din tch ln hn trong 2 tam gic: tam gic va to v tam gic c din tch max (trong s cc tam gic to) #include <conio.h> #include <iostream.h> #include <math.h> class DIEM { private: double x,y; // Toa do cua diem public: void nhapsl() { cout << " Toa do x, y: " ; cin >> x >> y ; } void in() { cout << " x = " << x << " y = " << y; }

130

double do_dai(DIEM d2) { return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); } }; class TAM_GIAC { private: DIEM d1,d2,d3; // 3 dinh tam giac public: void nhapsl(); void in(); static TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) { TAM_GIAC t; t.d1=e1; t.d2 = e2; t.d3=e3; return t; } double dien_tich() ; TAM_GIAC maxdt(TAM_GIAC t2); }; void TAM_GIAC::nhapsl() { cout << "\nDinh 1 - " ;

131

d1.nhapsl(); cout << "\nDinh 2 - " ; d2.nhapsl(); cout << "\nDinh 3 - " ; d3.nhapsl(); } void TAM_GIAC::in() { cout << "\nDinh 1: " ; d1.in(); cout << "\nDinh 2: " ; d2.in(); cout << "\nDinh 3: " ; d3.in(); } double TAM_GIAC::dien_tich() { double a,b,c,p,s; a=d1.do_dai(d2); b=d2.do_dai(d3); c=d3.do_dai(d1); p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } TAM_GIAC TAM_GIAC::maxdt(TAM_GIAC t2) { if (this->dien_tich() > t2.dien_tich())

132

return *this ; else return t2; } void main() { DIEM d[50]; int n, i ; clrscr(); cout << "\n So diem= "; cin >> n; for (i=1; i<=n; ++i) { cout << "\nNhap diem " << i << " - " ; d[i].nhapsl(); } int j, k ; TAM_GIAC tmax, t; tmax = TAM_GIAC::tao_tg(d[1],d[2],d[3]); for (i=1;i<=n-2;++i) for (j=i+1;j<=n-1;++j) for (k=j+1;k<=n;++k) { t=TAM_GIAC::tao_tg(d[i],d[j],d[k]);

133

tmax = tmax.maxdt(t); } cout << "\n\nTam giac co dien tich lon nhat: " ; tmax.in(); cout << "\nDien tich = " << tmax.dien_tich(); getch(); } Ch 1: to mt i tng TAM_GIAC t 3 i tng DIEM ta dng phng thc tnh: static TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) { TAM_GIAC t; t.d1=e1; t.d2 = e2; t.d3=e3; return t; } Phng thc tnh (s ni thm trong cc mc bn di) c cc c im sau: + N ging phng thc thng thng ch: Trong thn ca n c th truy nhp ti cc thnh phn ca lp (c th l lp TAM_GIAC). + N khc phng thc thng thng ch: - Khng c i ngm nh xc nh bi con tr this (nh phng thc thng thng). Nh vy phng thc tao_tg c ng 3 i. - N khng gn vi mt i tng c th no ca lp, nn trong li gi ti phng thc o c th dng tn lp, v d (xem hm main): t=TAM_GIAC::tao_tg(d[i],d[j],d[k]); Ch 2: Khng th thay phng thc tnh tao_tg bng hm, v trong thn hm khng c truy xut n cc thuc tnh ca lp TAM_GIAC. Tuy nhin c mt gii php khc l dng khi

134

nim hm bn (friend). Hm bn ca mt lp c quyn truy nhp n cc thuc tnh ca lp. Trong v d 3 di y ta s xy dng hm tao_tg nh mt hm bn ca lp TAM_GIAC. Ch 3: cn mt gii php na l dng hm to (constructor) s trnh bytrong cc chng sau: Chng trnh di y c ni dung ging nh v d 2, nhng thay phng thc tnh tao_tg bng hm bn tao_tg. V d 3: Minh ho cch dng hm bn. Ni dung chng trnh ging nh trong v d 2. #include <conio.h> #include <iostream.h> #include <math.h> class DIEM { private: double x,y; // Toa do cua diem public: void nhapsl() { cout << " Toa do x, y: " ; cin >> x >> y ; } void in() { cout << " x = " << x << " y = " << y; } double do_dai(DIEM d2)

135

{ return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); } }; class TAM_GIAC { private: DIEM d1,d2,d3; // 3 dinh tam giac public: void nhapsl(); void in(); friend TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) { TAM_GIAC t; t.d1=e1; t.d2 = e2; t.d3=e3; return t; } double dien_tich() ; TAM_GIAC maxdt(TAM_GIAC t2); }; void TAM_GIAC::nhapsl() { cout << "\nDinh 1 - " ; d1.nhapsl();

136

cout << "\nDinh 2 - " ; d2.nhapsl(); cout << "\nDinh 3 - " ; d3.nhapsl(); } void TAM_GIAC::in() { cout << "\nDinh 1: " ; d1.in(); cout << "\nDinh 2: " ; d2.in(); cout << "\nDinh 3: " ; d3.in(); } double TAM_GIAC::dien_tich() { double a,b,c,p,s; a=d1.do_dai(d2); b=d2.do_dai(d3); c=d3.do_dai(d1); p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } TAM_GIAC TAM_GIAC::maxdt(TAM_GIAC t2) { if (this->dien_tich() > t2.dien_tich()) return *this ;

137

else return t2; } void main() { DIEM d[50]; int n, i ; clrscr(); cout << "\n So diem= "; cin >> n; for (i=1; i<=n; ++i) { cout << "\nNhap diem " << i << " - " ; d[i].nhapsl(); } int j, k ; TAM_GIAC tmax, t; tmax = tao_tg(d[1],d[2],d[3]); for (i=1;i<=n-2;++i) for (j=i+1;j<=n-1;++j) for (k=j+1;k<=n;++k) { t=tao_tg(d[i],d[j],d[k]); tmax = tmax.maxdt(t);

138

} cout << "\n\nTam giac co dien tich lon nhat: " ; tmax.in(); cout << "\nDien tich = " << tmax.dien_tich(); getch(); }

Ch : Hm bn c th xy dng bn trong nh ngha lp (nh chng trnh trn) hoc c th khai bo bn trong v xy dng bn ngoi nh ngha lp nh sau: class TAM_GIAC { private: DIEM d1,d2,d3; // 3 dinh tam giac public: void nhapsl(); void in(); friend TAM_GIAC tao_tg(DIEM e1,DIEM e2,DIEM e3); double dien_tich() ; TAM_GIAC maxdt(TAM_GIAC t2); }; TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) { TAM_GIAC t; t.d1=e1; t.d2 = e2; t.d3=e3;

139

return t; } Nhn xt: Khng cho php dng t kho friend khi xy dng hm (bn ngoi lp)

6. Hm, hm bn
6.1. Hm c cc tnh cht sau: + Phm vi ca hm l ton b chng trnh, v vy hm c th c gi ti t bt k ch no. Nh vy trong cc phng thc c th s dng hm. + i ca hm c th l cc i tng, tuy nhin c mt hn ch l trong thn hm khng cho php truy nhp ti thuc tnh ca cc i ny. V d gi s nh ngha lp: class DIEM { private: double x,y; // Toa do cua diem public: void nhapsl() { cout << " Toa do x, y: " ; cin >> x >> y ; } void in() { cout << " x = " << x << " y = " << y; }

140

}; Dng lp DIEM, ta xy dng hm tnh di ca on thng i qua 2 im nh sau: double do_dai(DIEM d1, DIEM d2) { return sqrt(pow(d1.x-d2.x,2) + pow(d1.y-d2.y,2)); } Hm ny s b bo li khi dch, v trong thn hm khng cho php s dng cc thuc tnh d1.x, d1.y, d2.x, d2.y ca cc i tng d1 v d2 thuc lp DIEM. + Phm vi s dng ca cc phng thc (public) l ton chng trnh, v vy trong thn hm c th gi ti cc phng thc. V d gi s nh ngha lp:

class DIEM { private: double x,y; // Toa do cua diem public: void nhapsl() { cout << " Toa do x, y: " ; cin >> x >> y ; } void in() { cout << " x = " << x << " y = " << y; }

141

double do_dai(DIEM d2) { return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); } }; Khi bng cch dng phng thc do_dai, ta c th vit hm tnh din tch tam gic c nh l cc i tng d1, d2, d3 ca lp DIEM nh sau: double dt_tg(DIEM d1, DIEM d2, DIEM d3) { double a,b,c,p,s; a=d1.do_dai(d2); b=d2.do_dai(d3); c=d3.do_dai(d1); p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } Bng cch dng hm dt_tg, c th t chc li chng trnh tm tam gic c din tch ln nht ( mc trn) mt cch n gin hn( b i lp TAM_GIAC) nh v d sau. V d 1: #include <conio.h> #include <iostream.h> #include <math.h> class DIEM { private:

142

double x,y; // Toa do cua diem public: void nhapsl() { cout << " Toa do x, y: " ; cin >> x >> y ; } void in() { cout << " x = " << x << " y = " << y; } double do_dai(DIEM d2) { return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); } }; double dt_tg(DIEM d1, DIEM d2, DIEM d3) { double a,b,c,p,s; a=d1.do_dai(d2); b=d2.do_dai(d3); c=d3.do_dai(d1); p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c));

143

} void main() { DIEM d[50]; int n, i,j,k,imax,jmax,kmax ; clrscr(); cout << "\n So diem= "; cin >> n; for (i=1; i<=n; ++i) { cout << "\nNhap diem " << i << " - " ; d[i].nhapsl(); } imax=1; jmax=2; kmax=3; for (i=1;i<=n-2;++i) for (j=i+1;j<=n-1;++j) for (k=j+1;k<=n;++k) if (dt_tg(d[i],d[j],d[k]) > dt_tg(d[imax],d[jmax],d[kmax])) { imax = i ; jmax = j; kmax = k; } cout << "\n\nTam giac co dien tich lon nhat: " ;

144

cout << "\nDinh 1 - "; d[imax].in(); cout << "\nDinh 2 - "; d[jmax].in(); cout << "\nDinh 3 - "; d[kmax].in(); cout << "\nDien tich = " << dt_tg(d[imax],d[jmax],d[kmax]) ; getch(); } Nhn xt: Chng trnh trn lm vic trn mng d kiu DIEM. By gi nu ta dng mng ngoi th t s th t s suy ra phn t ca mng. Nh vy hm double dt_tg(DIEM d1, DIEM d2, DIEM d3); c 3 i kiu DIEM c th thay bng hm c 3 i nguyn: double dt_tg(int i, int j, int k); tnh din tch tam gic c nh l d[i], d[j] v d[k] . tng ny c th hin trong v d sau. V d 2: Chng trnh dng mng i tng ngoi. Ch : Khai bo mng i tng phi t sau nh ngha kiu i tng (nh ngha lp). #include <conio.h> #include <iostream.h> #include <math.h> double dt_tg(int i, int j, int k); // Khai bo hm dt_tg class DIEM { private: double x,y; // Toa do cua diem public:

145

void nhapsl(); void in(); double do_dai(DIEM d2); }; // Ch : Khai bo mng kiu DIEM phi t sau nh ngha // lp DIEM DIEM d[50]; void DIEM::nhapsl() { cout << " Toa do x, y: " ; cin >> x >> y ; } void DIEM::in() { cout << " x = " << x << " y = " << y; } double DIEM::do_dai(DIEM d2) { return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); } double dt_tg(int i, int j, int k) { double a,b,c,p,s; a=d[i].do_dai(d[j]);

146

b=d[j].do_dai(d[k]); c=d[k].do_dai(d[i]); p=(a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } void main() { int n, i,j,k,imax,jmax,kmax ; clrscr(); cout << "\n So diem= "; cin >> n; for (i=1; i<=n; ++i) { cout << "\nNhap diem " << i << " - " ; d[i].nhapsl(); } imax=1; jmax=2; kmax=3; for (i=1;i<=n-2;++i) for (j=i+1;j<=n-1;++j) for (k=j+1;k<=n;++k) if (dt_tg(i,j,k) > dt_tg(imax,jmax,kmax)) { imax = i ; jmax = j;

147

kmax = k; } cout << "\n\nTam giac co dien tich lon nhat: " ; cout << "\nDinh 1 - "; d[imax].in(); cout << "\nDinh 2 - "; d[jmax].in(); cout << "\nDinh 3 - "; d[kmax].in(); cout << "\nDien tich = " << dt_tg(imax,jmax,kmax); getch(); } 6.2. Hm bn (friend function) 6.2.1. mt hm tr thnh bn ca mt lp, c 2 cch vit: Cch 1: Dng t kho friend khai bo hm trong lp v xy dng hm bn ngoi nh cc hm thng thng (khng dng t kho friend). Mu vit nh sau: class A { private: // Khai bo cc thuc tnh public: ... // Khai bo cc hm bn ca lp A friend void f1(...); friend double f2(...); friend A f3(...) ; ...

148

}; // Xy dng cc hm f1, f2, f3 void f1(...) { ... } double f2(...) { ... } A f3(...) { ... } Cch 2: Dng t kho friend xy dng hm trong nh ngha lp. Mu vit nh sau: class A { private: // Khai bo cc thuc tnh public: ... // Xy dng cc hm bn ca lp A void f1(...) {

149

... } double f2(...) { ... } A f3(...) { ... } ... }; 6.2.2. Tnh cht ca hm bn Trong thn hm bn ca mt lp c th truy nhp ti cc thuc tnh ca cc i tng thuc lp ny. y l s khc nhau duy nht gia hm bn v hm thng thng. Ch rng hm bn khng phi l phng thc ca lp. Phng thc c mt i n (ng vi con tr this) v li gi ca phng thc phi gn vi mt i tng no (a ch i tng ny c truyn cho con tr this). Li gi ca hm bn ging nh li gi ca hm thng thng. V d sau s so snh phng thc, hm bn v hm t do (hm thng thng). Xt lp SP (s phc). Hy so snh 3 phng n thc hin vic cng 2 s phc: Phng n 1: Dng phng thc class SP { private: double a; // Phn thc double b; // Phn o

150

public: SP cong(SP u2) { SP u: u.a = this->a + u2.a ; u.b = this->b + u2.b ; return u; } }; Cch dng SP u, u1, u2; u = u1.cong(u2); Phng n 2: Dng hm bn class SP { private: double a; // Phn thc double b; // Phn o public: friend SP cong(SP u1, SP u2) { SP u: u.a = u1.a + u2.a ; u.b = u1.b + u2.b ;

151

return u; } }; Cch dng SP u, u1, u2; u = cong(u1, u2); Phng n 3: Dng hm t do class SP { private: double a; // Phn thc double b; // Phn o public: ... }; SP cong(SP u1, SP u2) { SP u: u.a = u1.a + u2.a ; u.b = u1.b + u2.b ; return u; }

152

Phng n ny khng c chp nhn, Trnh bin dch s bo li v trong thn hm khng c quyn truy xut n cc thuc tnh ring (private) a, b ca cc i tng u, u1 v u2 thuc lp SP. 6.2.3. Mt hm c th l bn ca nhiu lp c khng? Cu tr li l c. Khi mt hm l bn ca nhiu lp, th n c quyn truy nhp ti tt c cc thuc tnh ca cc i tng trong cc lp ny. lm cho hm f tr thnh bn ca cc lp A, B v C ta s dng mu vit sau: class class class B; // Khai bo trc lp A B; // Khai bo trc lp B C; // Khai bo trc lp C

// nh ngha lp A class A { // Khai bo f l bn ca A friend void f(...) ; }; // nh ngha lp B class B { // Khai bo f l bn ca B friend void f(...) ; }; // nh ngha lp C class C { // Khai bo f l bn ca C

153

friend void f(...) ; }; // Xy dng hm f void f(...) { ... } Chng trnh sau y minh ho cch dng hm bn (bn ca mt lp v bn ca nhiu lp). Chng trnh a vo 2 lp VT (vc t), MT (ma trn) v 3 hm bn thc hin cc thao tc trn 2 lp ny: // Hm bn vi lp VT dng in mt vc t friend void in(const VT &x); // Hm bn vi lp MT dng in mt ma trn friend void in(const MT &a); // Hm bn vi c 2 lp MT v VT dng nhn ma trn vi vc t friend VT tich(const MT &a,const VT &x); Ni dung chng trnh l nhp mt ma trn vung cp n v mt vc t cp n, sau thc hin php nhn ma trn vi vc t va nhp. // Chng trnh CT3_09.CPP #include <conio.h> #include <iostream.h> #include <math.h> class VT; class MT ; class VT

154

{ private: int n; double x[20]; // Toa do cua diem public: void nhapsl(); friend void in(const VT &x); friend VT tich(const MT &a,const VT &x) ; }; class MT { private: int n; double a[20][20]; public: friend VT tich(const MT &a,const VT &x); friend void in(const MT &a); void nhapsl(); }; void VT::nhapsl() { cout << "\n Cap vec to = "; cin >> n ; for (int i=1; i<=n ; ++i)

155

{ cout << "\nPhan tu thu " << i << " = " ; cin >> x[i]; } } void MT::nhapsl() { cout << "\n Cap ma tran = "; cin >> n ; for (int i=1; i<=n ; ++i) for (int j=1; j<=n; ++j) { cout << "\nPhan tu thu hang "<< i << " cot " << j << "=" ; cin >> a[i][j]; } } VT tich(const MT &a,const VT &x) { VT y; int n=a.n; if (n!=x.n) return x; y.n = n; for (int i=1; i<=n; ++i)

156

{ y.x[i]=0; for (int j=1; j<=n; ++j) y.x[i] += a.a[i][j]*x.x[j]; } return y; } void in(const VT &x) { cout << "\n"; for (int i=1; i<=x.n; ++i) cout << x.x[i] << " "; } void in(const MT &a) { for (int i=1; i<=a.n; ++i) { cout << "\n" ; for (int j=1; j<=a.n; ++j) cout << a.a[i][j] << " "; } } void main() {

157

MT a; VT x,y; clrscr(); a.nhapsl(); x.nhapsl(); y=tich(a,x); clrscr(); cout << "\nMa tran A:"; in(a); cout << "\n\nVec to x: " ; in(x); cout << "\n\nVec y = Ax: " ; in(y); getch(); }

7. Phm vi truy xut


7.1. Cc t kho private v public Cc thnh phn (thuc tnh v phng thc) ca lp c th khai bo l private hoc public theo mu: private: // Khai bo cc thnh phn ring ca lp public:

158

// Khai bo cc thnh phn chung (cng cng) Ch : Cc thnh phn khai bo mc nh (khng dng cc t kho private v public) c xem l cc thnh phn private. 7.2. Cc thnh phn ring ca lp ch c s dng trong phm vi ca lp (trong thn cc phng thc ca lp). Chng khng th em ra s dng bn ngoi lp. + Mt thuc tnh private: Thuc tnh ny (ca mt i tng no ) ch c th c s dng trong thn ca cc phng thc cng lp. + Mt phng thc private: Ch c s dng trong thn ca cc phng thc cng lp. V d sau minh ho cch dng phng thc private. Xt lp PS (phn s) vi 2 thuc tnh nguyn l t (t) v m (mu). Gi s cn xy dng cc phng thc thc hin cc php ton cng tr, nhn, chia phn s. Do cc php ton ny cn dng trong ton b chng trnh, nn cc phng thc thc hin cc php ton cn khai bo l public. thc hin cc php tnh trn phn s cn dng n php rt gn phn s. Ta c th dng mt phng thc private lm iu ny v vic rt gn ch dng trong ni b lp. 7.3. Cc thnh phn cng cng ca lp c phm vi s dng trong ton chng trnh. Nh vy nu mt thuc tnh c khai bo l public, th n c th c truy nhp trong thn ca bt k hm no trong chng trnh. V d trong 6 ch ra phng n dng mt hm (t do) thc hin php cng 2 s phc nh sau l sai: Phng n 3: Dng hm t do class SP { private: double a; // Phn thc double b; // Phn o public: ... };

159

SP cong(SP u1, SP u2) { SP u: u.a = u1.a + u2.a ; u.b = u1.b + u2.b ; return u; } Tuy nhin nu sa cha bng cch khai bo cc thuc tnh a v b l public th li c. Nhn xt: Cc thuc tnh thng khai bo l private m bo tnh du kn, an ton d liu ca lp.

8. Cc phng thc ton t


8.1. Cch t tn Cc phng thc ton t c xy dng nh cc phng thc thng thng, ch c khc cch t tn. Tn cc phng thc ton t (cng ging nh hm ton t) c to bng cch ghp t kho operator vi mt php ton, v d: operator+ operator<< operator>> 8.2. Con tr this Cng ging nh phng thc thng thng, phng thc ton t c i u tin (i khng tng minh) l con tr this. 8.3. Ton t mt ton hng

160

Cc phng thc ton t mt ton hng: Dng ngay con tr this biu th ton hng duy nht ny, nn trong phng thc s khng c i tng minh. V d phng thc ton t - (i du) mt i tng kiu SP (s phc) c th vit nh sau: class SP { private: double a; // Phn thc double b; // Phn o public: SP operator-(); }; SP SP:: operator-() { SP u ; u.a = - this->a ; u.b = - this->b ; return u; } Cch dng: SP u, v;

u = -v; 8.4. Ton t hai ton hng Cc phng thc ton t hai ton hng: Con tr this ng vi ton hng th nht, nn trong phng thc ch cn dng mt i tng minh biu th ton hng th hai. V d phng thc ton t + (cng) hai i tng kiu SP (s phc) c th vit nh sau:

161

class SP { private: double a; // Phn thc double b; // Phn o public: SP operator+(SP u2); }; SP SP:: operator+(SP u2) { SP u ; u.a = this->a + u2.a ; u.b = this->b + u2.b ; return u; } Cch dng: SP p, p, r;

r = p+q; 8.5. Lp DT (a thc) Chng trnh sau s nh ngha lp DT v a vo cc phng thc, hm: + Cc thuc tnh: int n ; // bc a thc double *a ; // tr ti vng nh cha cc h s a thc + Cc phng thc operator+, operator- dng i du cc h s a thc

162

operator+ operatoroperator* operator^ operator[] + Cc hm bn: operator<< operator>> + Hm (t do)

dng cng 2 a thc dng tr 2 a thc dng nhn 2 a thc dng tnh gi tr a thc dng cho bit bc v h s ca a thc

dng in cc h s a thc dng nhp cc h s a thc

double F(DT p, double x) dng tnh p(x)-gi tr a thc ti x + Ni thm v phng thc ch s v hm t do F - Nu p l i tng ca lp DT, th hm ch s cho bit: p[-1] = double(n) p[i] = a[i] , i=0, 1, ..., n - Hm t do F s dng phng thc ch s xc nh n , cc h s a thc v dng chng tnh gi tr a thc. + Trong chng trnh s dng hm new cp pht vng nh cha h s a thc. + Ni dung chng trnh gm: - Nhp, in cc a thc p, q, r, s - Tnh a thc: f = -(p + q)*(r - s) - Nhp cc s thc x1 v x2 - Tnh f(x1) (bng cch dng phng thc operator^) - Tnh f(x2) (bng cch dng hm F) // Chng trnh CT3_10.CPP

163

#include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,... public: friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); DT operator-(); DT operator+(const DT &d2); DT operator-(DT d2); DT operator*(const DT &d2); double operator^(const double &x); // Tinh gia tri da thuc double operator[](int i) { if(i<0) return double(n); else return a[i]; }

164

}; // Ham tinh gia tri da thuc double F(DT d,double x) { double s=0.0 , t=1.0; int n; n = int(d[-1]); for (int i=0; i<=n; ++i) { s += d[i]*t; t *= x; } return s; } ostream& operator<< (ostream& os,const DT &d) { os << " - Cac he so (tu ao): " ; for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os; } istream& operator>> (istream& is,DT &d) { cout << " - Bac da thuc: " ;

165

cin >> d.n; d.a = new double[d.n+1]; cout << "Nhap cac he so da thuc:\n" ; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << " = " ; is >> d.a[i] ; } return is; } DT DT::operator-() { DT p; p.n = n; p.a = new double[n+1]; for (int i=0 ; i<=n ; ++i) p.a[i] = -a[i]; return p; } DT DT::operator+(const DT &d2) { DT d; int k,i; k = n > d2.n ? n : d2.n ;

166

d.a = new double[k+1]; for (i=0; i<=k ; ++i) if (i<=n && i<=d2.n) d.a[i] = a[i] + d2.a[i]; else if (i<=n) d.a[i] = a[i]; else d.a[i] = d2.a[i]; i=k; while(i>0 && d.a[i]==0.0) --i; d.n = i; return d ; } DT DT::operator-(DT d2) { return (*this + (-d2)); } DT DT::operator*(const DT &d2) { DT d; int k, i, j; k = d.n = n + d2.n ; d.a = new double[k+1]; for (i=0; i<=k; ++i) d.a[i] = 0;

167

for (i=0 ; i<= n ; ++i) for (j=0 ; j<= d2.n ; ++j) d.a[i+j] += a[i]*d2.a[j] ; return d; } double DT::operator^(const double &x) { double s=0.0 , t=1.0; for (int i=0 ; i<= n ; ++i) { s += a[i]*t; t *= x; } return s; } void main() { DT p,q,r,s,f; double x1,x2,g1,g2; clrscr(); cout <<"\nNhap da thuc P " ; cin >> p; cout << "\nDa thuc p " << p ; cout <<"\nNhap da thuc Q " ; cin >> q; cout << "\nDa thuc q " << q ;

168

cout <<"\nNhap da thuc R " ; cin >> r; cout << "\nDa thuc r " << r ; cout <<"\nNhap da thuc S " ; cin >> s; cout << "\nDa thuc s " << s ; f = -(p+q)*(r-s); cout << "\nNhap so thuc x1: " ; cin >> x1; cout << "\nNhap so thuc x2: " ; cin >> x2; g1 = f^x1; g2 = F(f,x2); cout << "\nDa thuc f " << f ; cout << "\n f("<<x1<<") = " << g1; cout << "\n f("<<x2<<") = " << g2; getch(); }

169

Chng 4 Hm To, Hm Hu V Cc Vn Lin Quan


Chng ny trnh bymt s vn c tnh chuyn su hn v lp nh: + Hm to (constructor) + Hm hu (destructor) + Ton t gn v hm to sao chp + Mi lin quan gia hm to v i tng thnh phn + Cc thnh phn tnh + Lp bn, hm bn + i tng hng + Phng thc inline

1. Hm to (constructor)
1.1. Cng dng Hm to cng l mt phng thc ca lp (nhng kh c bit) dng to dng mt i tng mi. Chng trnh dch s cp pht b nh cho i tng sau s gi n hm to. Hm to s khi gn gi tr cho cc thuc tnh ca i tng v c th thc hin mt s cng vic khc nhm chun b cho i tng mi. 1.2. Cch vit hm to 1.2.1. im khc ca hm to v cc phng thc thng thng Khi vit hm to cn 3 s khc bit ca hm to so vi cc phng thc khc nh sau: + Tn ca hm to: Tn ca hm to bt buc phi trng vi tn ca lp.

170

+ Khng khai bo kiu cho hm to. + Hm to khng c kt qu tr v. 1.2.2. S ging nhau ca hm to v cc phng thc thng thng Ngoi 3 im khc bit trn, hm to c vit nh cc phng thc khc: + Hm to c th c xy dng bn trong hoc bn ngoi nh ngha lp. + Hm to c th c i hoc khng c i. + Trong mt lp c th c nhiu hm to (cng tn nhng khc b i). V d sau nh ngha lp DIEM_DH (im ho) c 3 thuc tnh: int x; // honh (ct) ca im int y; // tung (hng) ca im int m; // mu ca im v a vo 2 hm to khi gn cho cc thuc tnh ca lp: // Hm to khng i: Dng cc gi tr c nh khi gn cho // x, y, m DIEM_DH() ; // Hm to c i: Dng cc i x1, y1, m1 khi gn cho // x, y, m // i m1 c gi tr mc nh 15 (mu trng) DIEM_DH(int x1, int y1, int m1=15) ; class DIEM_DH { private: int x, y, m ; public:

171

//Hm to khng i: khi gn cho x=0, y=0, m=1 // Hm ny vit bn trong nh ngha lp DIEM_DH() { x=y=0; m=1; } // Hm to ny xy dng bn ngoi nh ngha lp DIEM_DH(int x1, int y1, int m1=15) ; // Cc phng thc khc }; // Xy dng hm to bn ngoi nh ngha lp DIEM_DH:: DIEM_DH(int x1, int y1, int m1) { x=x1; y=y1; m=m1; } 1.3. Dng hm to trong khai bo + Khi xy dng cc hm to, ta c th dng chng trong khai bo to ra mt i tng ng thi khi gn cho cc thuc tnh ca i tng c to. Da vo cc tham s trong khai bo m Trnh bin dch s bit cn gi n hm to no. + Khi khai bo mt bin i tng c th s dng cc tham s khi gn cho cc thuc tnh ca bin i tng. + Khi khai bo mng i tng khng cho php dng cc tham s khi gn. + Cu lnh khai bo mt bin i tng s gi ti hm to 1 ln + Cu lnh khai bo mt mng n i tng s gi ti hm to n ln.

172

V d: DIEM_DH d; // Gi ti hm to khng i. // Kt qu d.x=0, d.y=0, d.m=1


152

DIEM_DH u(200,100,4); // Gi ti hm to c i. // Kt qu u.x=200, u.y=100, d.m=4 DIEM_DH v(300,250); // Gi ti hm to c i. // Kt qu v.x=300, v.y=250, d.m=15 DIEM_DH p[10] ; // Gi ti hm to khng i 10 ln

Ch : Vi cc hm c i kiu lp, th i ch xem l cc tham s hnh thc, v vy khai bo i (trong dng u ca hm) s khng to ra i tng mi v do khng gi ti cc hm to. 1.4. Dng hm to trong cp pht b nh + Khi cp pht b nh cho mt i tng c th dng cc tham s khi gn cho cc thuc tnh ca i tng, v d: DIEM_DH *q =new DIEM_DH(50,40,6);//Gi ti hm to c i // Kt qu q->x=50, q->y=40, q->m=6 DIEM_DH *r = new DIEM_DH ; // Gi ti hm to khng i // Kt qu r->x=0, r->y= 0, r->m=1 + Khi cp pht b nh cho mt dy i tng khng cho php dng tham s khi gn, v d: int n=20; DIEM_DH *s = new DIEM_DH[n] ; // Gi ti hm to khng // i 20 ln. 1.5. Dng hm to biu din cc i tng hng + Nh bit, sau khi nh ngha lp DIEM_DH th c th xem lp ny nh mt kiu d liu nh int, double, char, ...

173

Vi kiu int chng ta c cc hng int, nh 356. Vi kiu double chng ta c cc hng double, nh 98.75 Khi nim hng kiu int, hng kiu double c th m rng cho hng kiu DIEM_DH + biu din mt hng i tng (hay cn gi: i tng hng) chng ta phi dng ti hm to. Mu vit nh sau: Tn_lp(danh sch tham s) ; V d i vi lp DIEM_DH ni trn, c th vit nh sau:

DIEM_DH(345,123,8) // Biu th mt i tng kiu DIEM_DH // c cc thuc tnh x=345, y=123, m=8 Ch : C th s dng mt hng i tng nh mt i tng. Ni cch khc, c th dng hng i tng thc hin mt phng thc, v d nu vit: DIEM_DH(345,123,8).in(); th c ngha l thc hin phng thc in() i vi hng i tng. 1.6. V d minh ho Chng trnh sau y minh ho cch xy dng hm to v cch s dng hm to trong khai bo, trong cp pht b nh v trong vic biu din cc hng i tng. //CT4_02.CPP #include <conio.h> #include <iostream.h> #include <iomanip.h> class DIEM_DH { private: int x,y,m;

174

public: // Hm bn dng in i tng DIEM_DH friend void in(DIEM_DH d) { cout <<"\n " << d.x << " "<< d.y<<" " << d.m ; } // Phng thc dng in i tng DIEM_DH void in() { cout <<"\n " << x << " "<< y<<" " << m ; } //Hm to khng i DIEM_DH() { x=y=0; m=1; } //Hm to c i, i m1 c gi tr mc nh l 15 (mu trng) DIEM_DH(int x1,int y1,int m1=15); }; //Xy dng hm to DIEM_DH::DIEM_DH(int x1,int y1,int m1) { x=x1; y=y1; m=m1;

175

} void main() { DIEM_DH d1; // Gi ti hm to khng i DIEM_DH d2(200,200,10); // Gi ti hm to c i DIEM_DH *d; d= new DIEM_DH(300,300); // Gi ti hm to c i clrscr(); in(d1); //Gi hm bn in() d2.in();//Gi phng thc in() in(*d); //Gi hm bn in() DIEM_DH(2,2,2).in();//Gi phng thc in() DIEM_DH t[3]; // 3 ln gi hm to khng i DIEM_DH *q; // Gi hm to khng i int n; cout << "\nN= "; cin >> n; q=new DIEM_DH[n+1]; // (n+1) ln gi hm to khng i for (int i=0;i<=n;++i) q[i]=DIEM_DH(300+i,200+i,8);//(n+1) ln gi hm to c i for (i=0;i<=n;++i) q[i].in(); // Gi phng thc in()

for (i=0;i<=n;++i) DIEM_DH(300+i,200+i,8).in();// Gi phng thc in()

176

getch(); }

2. Lp khng c hm to v hm to mc nh
Cc chng trnh nu trong chng 3 u khng c hm to. Vy khi cc i tng c hnh thnh nh th no ? 2.1. Nu lp khng c hm to, Chng trnh dch s cung cp mt hm to mc nh khng i (default). Hm ny thc cht khng lm g c. Nh vy mt i tng to ra ch c cp pht b nh, cn cc thuc tnh ca n cha c xc nh. Chng ta c th kim chng iu ny, bng cch chy chng trnh sau: //CT4_03.CPP // Hm to mc nh #include <conio.h> #include <iostream.h> class DIEM_DH { private: int x,y,m; public: // Phuong thuc void in() { cout <<"\n " << x << " "<< y<<" " << m ; } };

177

void main() { DIEM_DH d; d.in(); DIEM_DH *p; p= new DIEM_DH[10]; clrscr(); d.in(); for (int i=0;i<10;++i) (p+i)->in(); getch(); } 2.2. Nu trong lp c t nht mt hm to, th hm to mc nh s khng c pht sinh na. Khi mi cu lnh xy dng i tng mi u s gi n mt hm to ca lp. Nu khng tm thy hm to cn gi th Chng trnh dch s bo li. iu ny thng xy ra khi chng ta khng xy dng hm to khng i, nhng li s dng cc khai bo khng tham s nh v d sau: #include <conio.h> #include <iostream.h> class DIEM_DH { private: int x,y,m; public: // Phng thc dng in i tng DIEM_DH

178

void in() { cout <<"\n " << x << " "<< y<<" " << m ; } //Hm to c i DIEM_DH::DIEM_DH(int x1,int y1,int m1) { x=x1; y=y1; m=m1; } }; void main() { DIEM_DH d1(200,200,10); // Gi ti hm to c i DIEM_DH d2; // Gi ti hm to khng i d2= DIEM_DH(300,300,8); // Gi ti hm to c i d1.in(); d2.in(); getch(); } Trong cc cu lnh trn, ch c cu lnh th 2 trong hm main() l b bo li. Cu lnh ny s gi ti hm to khng i, m hm ny cha c xy dng. Gii php: C th chn mt trong 2 gii php sau: - Xy dng thm hm to khng i. - Gn gi tr mc nh cho tt c cc i x1, y1 v m1 ca hm to xy dng trn.

179

Theo phng n 2, chng trnh c th sa nh sau: #include <conio.h> #include <iostream.h> class DIEM_DH { private: int x,y,m; public: // Phng thc dng in i tng DIEM_DH void in() { cout <<"\n " << x << " "<< y<<" " << m ; } //Hm to c i , tt c cc i u c gi tr mc nh DIEM_DH::DIEM_DH(int x1=0,int y1=0,int m1=15) { x=x1; y=y1; m=m1; } }; void main() { DIEM_DH d1(200,200,10); // Gi ti hm to, khng dng // tham s mc nh DIEM_DH d2; // Gi ti hm to , dng 3 tham s mc nh

180

d2= DIEM_DH(300,300); // Gi ti hm to, dng 1 tham s // mc nh d1.in(); d2.in(); getch(); }

3. Lp a thc
Chng trnh di y l s ci tin chng trnh trong mc 8.5 ca chng 3 bng cch a vo 2 hm to: //Hm to khng i DT() { this->n=0; this->a=NULL; } //Hm to c i DT(int n1) { this->n=n1 ; this->a = new double[n1+1]; } Hm to c i s to mt i tng mi (kiu DT) gm 2 thuc tnh l bin nguyn n v con tr a. Ngoi ra cn cp pht b vng nh (cho a) cha cc h s ca a thc.

181

Nu khng xy dng hm to, m s dng hm to mc nh th cc i tng (kiu DT) to ra bi cc lnh khai bo s cha c b nh cha a thc. Nh vy i tng to ra cha hon chnh v cha dng c. c mt i tng hon chnh phi qua 2 bc: + Dng khai bo to cc i tng, v d: DT d; + Cp pht vng nh (cho i tng) cha a thc, v d: d.n = m; d.a = new double[m+1] ; Quy trnh ny c p dng trong cc phng thc ton t ca chng trnh trong mc 8.5 chng 3. R rng quy trnh ny va di va khng tin li, li hay mc li, v ngi lp trnh hay qun khng cp pht b nh. Vic dng cc hm to sn sinh ra cc i tng hon chnh t ra tin li hn, v trnh c 160 cc thao tc ph (nh cp pht b nh) nm bn ngoi khai bo. Phng n dng hm to s c s dng trong cc phng thc ton t ca chng trnh di y: + Ni dung chng trnh gm: - Nhp, in cc a thc p, q, r, s - Tnh a thc: f = -(p + q)*(r - s) - Nhp cc s thc x1 v x2 - Tnh f(x1) (bng cch dng phng thc operator^) - Tnh f(x2) (bng cch dng hm F) // CT4_05.CPP #include <conio.h> #include <iostream.h> #include <math.h> class DT {

182

private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1 ; this->a = new double[n1+1]; } friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); DT operator-(); DT operator+(const DT &d2); DT operator-(DT d2); DT operator*(const DT &d2); double operator^(const double &x); // Tinh gia tri da thuc double operator[](int i) { if (i<0)

183

return double(n); else return a[i]; } }; // Ham tinh gia tri da thuc double F(DT d,double x) { double s=0.0 , t=1.0; int n; n = int(d[-1]); for (int i=0; i<=n; ++i) { s += d[i]*t; t *= x; } return s; } ostream& operator<< (ostream& os,const DT &d) { os << " - Cac he so (tu ao): " ; for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os;

184

} istream& operator>> (istream& is,DT &d) { if (d.a!=NULL) delete d.a; cout << " - Bac da thuc: " ; cin >> d.n; d.a = new double[d.n+1]; cout << "Nhap cac he so da thuc:\n" ; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << " = " ; is >> d.a[i] ; } return is; } DT DT::operator-() { DT p(this->n); for (int i=0 ; i<=n ; ++i) p.a[i] = -a[i]; return p; } DT DT::operator+(const DT &d2) {

185

int k,i; k = n > d2.n ? n : d2.n ; DT d(k); for (i=0; i<=k ; ++i) if (i<=n && i<=d2.n) d.a[i] = a[i] + d2.a[i]; else if (i<=n) d.a[i] = a[i]; else d.a[i] = d2.a[i]; i=k; while(i>0 && d.a[i]==0.0) --i; d.n = i; return d ; } DT DT::operator-(DT d2) { return (*this + (-d2)); } DT DT::operator*(const DT &d2) { int k, i, j; k = n + d2.n ; DT d(k);

186

for (i=0; i<=k; ++i) d.a[i] = 0; for (i=0 ; i<= n ; ++i) for (j=0 ; j<= d2.n ; ++j) d.a[i+j] += a[i]*d2.a[j] ; return d; } double DT::operator^(const double &x) { double s=0.0 , t=1.0; for (int i=0 ; i<= n ; ++i) { s += a[i]*t; t *= x; } return s; } void main() { DT p,q,r,s,f; double x1,x2,g1,g2; clrscr(); cout <<"\nNhap da thuc P " ; cin >> p; cout << "\nDa thuc p " << p ; cout <<"\nNhap da thuc Q " ; cin >> q;

187

cout << "\nDa thuc q " << q ; cout <<"\nNhap da thuc R " ; cin >> r; cout << "\nDa thuc r " << r ; cout <<"\nNhap da thuc S " ; cin >> s; cout << "\nDa thuc s " << s ; f = -(p+q)*(r-s); cout << "\nNhap so thuc x1: " ; cin >> x1; cout << "\nNhap so thuc x2: " ; cin >> x2; g1 = f^x1; g2 = F(f,x2); cout << "\nDa thuc f " << f ; cout << "\n f("<<x1<<") = " << g1; cout << "\n f("<<x2<<") = " << g2; getch(); }

4. Hm to sao chp (copy constructor)


4.1. Hm to sao chp mc nh Gi s nh ngha mt lp no , v d lp PS (phn s). Khi : + Ta c th dng cu lnh khai bo hoc cp pht b nh to cc i tng mi, v d: PS p1, p2 ; PS *p = new PS ; + Ta cng c th dng lnh khai bo to mt i tng mi t mt i tng tn ti, v d:

188

PS u; PS v(u) ; // To v theo u ngha ca cu lnh ny nh sau: - Nu trong lp PS cha xy dng hm to sao chp, th cu lnh ny s gi ti mt hm to sao chp mc nh (ca C++). Hm ny s sao chp ni dung tng bit ca u vo cc bit tng ng ca v. Nh vy cc vng nh ca u v v s c ni dung nh nhau. R rng trong a s cc trng hp, nu lp khng c cc thuc tnh kiu con tr hay tham chiu, th vic dng cc hm to sao chp mc nh ( to ra mt i tng mi c ni dung nh mt i tng cho trc) l v khng cn xy dng mt hm to sao chp mi. - Nu trong lp PS c hm to sao chp (cch vit s ni sau) th cu lnh: PS v(u) ; s to ra i tng mi v, sau gi ti hm to sao chp khi gn v theo u. V d sau minh ho cch dng hm to sao chp mc nh: Trong chng trnh a vo lp PS (phn s): + Cc thuc tnh gm: t (t s) v m (mu). + Trong lp khng c phng thc no c m ch c 2 hm bn l cc hm ton t nhp (>>) v xut (<<). + Ni dung chng trnh l: Dng lnh khai bo to mt i tng u (kiu PS) c ni dung nh i tng c d. //CT4_06.CPP // Ham tao sao chep mac dinh #include <conio.h> #include <iostream.h> class PS { private:

189

int t,m ; public: friend ostream& operator<< (ostream& os,const PS &p) { os << " = " << p.t << "/" << p.m; return os; } friend istream& operator>> (istream& is, PS &p) { cout << " - Nhap tu va mau: " ; is >> p.t >> p.m ; return is; } }; void main() { PS d; cout << "\n Nhap PS d"; cin >> d; cout << "\n PS d " << d; PS u(d); cout << "\n PS u " << u; getch(); } 4.2. Cch xy dng hm to sao chp

190

+ Hm to sao chp s dng mt i kiu tham chiu i tng khi gn cho i tng mi. Hm to sao chp c vit theo mu: Tn_lp (const Tn_lp & dt) { // Cc cu lnh dng cc thuc tnh ca i tng dt // khi gn cho cc thuc tnh ca i tng mi } + V d c th xy dng hm to sao chp cho lp PS nh sau: class PS { private: int t,m ; public: PS (const PS &p) { this->t = p.t ; this->m = p.m ; } ... }; 4.3. Khi no cn xy dng hm to sao chp + Nhn xt: Hm to sao chp trong v d trn khng khc g hm to sao chp mc nh. + Khi lp khng c cc thuc tnh kiu con tr hoc tham chiu, th dng hm to sao chp mc nh l .

191

+ Khi lp c cc thuc tnh con tr hoc tham chiu, th hm to sao chp mc nh cha p ng c yu cu. V d lp DT (a thc) trong 3: class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1 ; this->a = new double[n1+1]; } friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); .... }; By gi chng ta hy theo ri xem vic dng hm to mc nh trong on chng trnh sau s dn n sai lm nh th no: DT d ;

192

// To i tng d kiu DT cin >> d ; /* Nhp i tng d , gm: nhp mt s nguyn dng v gn cho d.n, cp pht vng nh cho d.a, nhp cc h s ca a thc v cha vo vng nh c cp pht */ DT u(d) ; /* Dng hm to mc nh xy dng i tng u theo d Kt qu: u.n = d.n v u.a = d.a. Nh vy 2 con tr u.a v d.a cng tr n mt vng nh. */ Nhn xt: Mc ch ca ta l to ra mt i tng u ging nh d, nhng c lp vi d. Ngha l khi d thay i th u khng b nh hng g. Th nhng mc tiu ny khng t c, v u v d c chung mt vng nh cha h s ca a thc, nn khi sa i cc h s ca a thc trong d th cc h s ca a thc trong u cng thay i theo. Cn mt trng hp na cng dn n li l khi mt trong 2 i tng u v d b gii phng (thu hi vng nh cha a thc) th i tng cn li cng s khng cn vng nh na. V d sau s minh ho nhn xt trn: Khi d thay i th u cng thay i v ngc li khi u thay i th d cng thay i theo. //CT4_07.CPP #include <conio.h> #include <iostream.h> #include <math.h> class DT { private:

193

int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1 ; this->a = new double[n1+1]; } friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); }; ostream& operator<< (ostream& os,const DT &d) { os << " - Cac he so (tu ao): " ; for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os; } istream& operator>> (istream& is,DT &d)

194

{ if (d.a!=NULL) delete d.a; cout << " - Bac da thuc: " ; cin >> d.n; d.a = new double[d.n+1]; cout << "Nhap cac he so da thuc:\n" ; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << " = " ; is >> d.a[i] ; } return is; } void main() { DT d; clrscr(); cout <<"\nNhap da thuc d " ; cin >> d; DT u(d); cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ; cout <<"\nNhap da thuc d " ; cin >> d; cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ;

195

cout <<"\nNhap da thuc u " ; cin >> u; cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ; getch(); } 4.4. V d v hm to sao chp Trong chng trnh trn ch r: Hm to sao chp mc nh l cha tho mn i vi lp DT. V vy cn vit hm to sao chp xy dng i tng mi ( v d u) t mt i tng ang tn ti (v d d) theo cc yu cu sau: + Gn d.n cho u.n + Cp pht mt vng nh cho u.a c th cha c (d.n + 1) h s. + Gn cc h s cha trong vng nh ca d.a sang vng nh ca u.a Nh vy chng ta s to c i tng u c ni dung ban u ging nh d, nhng c lp vi d. p ng cc yu cu nu trn, hm to sao chp cn c xy dng nh sau: DT::DT(const DT &d) { this->n = d.n; this->a = new double[d.n+1]; for (int i=0;i<=d.n;++i) this->a[i] = d.a[i]; } Chng trnh sau s minh ho iu ny: S thay i ca d khng lm nh hng n u v ngc li s thay i ca u khng lm nh hng n d. //CT4_08.CPP

196

// Vit hm to sao chp cho lp DT #include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1 ; this->a = new double[n1+1]; } DT(const DT &d); friend ostream& operator<< (ostream& os,const DT &d); friend istream& operator>> (istream& is,DT &d); };

197

DT::DT(const DT &d) { this->n = d.n; this->a = new double[d.n+1]; for (int i=0;i<=d.n;++i) this->a[i] = d.a[i]; } ostream& operator<< (ostream& os,const DT &d) { os << " - Cac he so (tu ao): " ;
174

for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os; }

istream& operator>> (istream& is,DT &d) { if (d.a!=NULL) delete d.a; cout << " - Bac da thuc: " ; cin >> d.n; d.a = new double[d.n+1]; cout << "Nhap cac he so da thuc:\n" ; for (int i=0 ; i<= d.n ; ++i) { cout << "He so bac " << i << " = " ;

198

is >> d.a[i] ; } return is; } void main() { DT d; clrscr(); cout <<"\nNhap da thuc d " ; cin >> d; DT u(d); cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ; cout <<"\nNhap da thuc d " ; cin >> d; cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ; cout <<"\nNhap da thuc u " ; cin >> u; cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ; getch(); }

5. Hm hu (Destructor)

199

5.1. Cng dng ca hm hu Hm hu l mt hm thnh vin ca lp (phng thc) c chc nng ngc vi hm to. Hm hu c gi trc khi gii phng (xo b) mt i tng thc hin mt s cng vic c tnh dn dp trc khi i tng c hu b, v d nh gii phng mt vng nh m i tng ang qun l, xo i tng khi mn hnh nu nh n ang hin th, ... Vic hu b mt i tng thng xy ra trong 2 trng hp sau: + Trong cc ton t v cc hm gii phng b nh, nh delete, free,... + Gii phng cc bin, mng cc b khi thot khi hm, phng thc. 5.2. Hm hu mc nh Nu trong lp khng nh ngha hm hu, th mt hm hu mc nh khng lm g c c pht sinh. i vi nhiu lp th hm hu mc nh l , v khng cn a vo mt hm hu mi. 5.3. Quy tc vit hm hu Mi lp ch c mt hm hu vit theo cc quy tc sau: + Kiu ca hm: Hm hu cng ging nh hm to l hm khng c kiu, khng c gi tr tr v. + Tn hm: Tn ca hm hu gm mt du ng (ng trc) v tn lp: ~Tn_lp + i: Hm hu khng c i V d c th xy dng hm hu cho lp DT (a thc) 3 nh sau: class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,...

200

public: ~DT() { this->n=0; delete this->a; } ... }; 5.4. Vai tr ca hm hu trong lp DT 5.4.1. Khim khuyt ca chng trnh trong 3 Chng trnh trong 3 nh ngha lp DT (a thc) kh y gm: + Cc hm to + Cc hm ton t nhp >>, xut << + Cc hm ton t thc hin cc php tnh + - * Tuy nhin vn cn thiu hm hu gii phng vng nh m i tng kiu DT (cn hu) ang qun l. Chng ta hy phn tch cc khim khuyt ca chng trnh ny: + Khi chng trnh gi ti mt phng thc ton t thc hin cc php tnh cng, tr, nhn a thc, th mt i tng trung gian c to ra. Mt vng nh c cp pht v giao cho n (i tng trung gian) qun l. + Khi thc hin xong php tnh s ra khi phng thc. i tng trung gian b xo, tuy nhin ch vng nh ca cc thuc tnh ca i tng ny c gii phng. Cn vng nh (cha cc h s ca a thc) m i tng trung gian ang qun l th khng h b gii phng. Nh vy s vng nh b chim dng v ch s tng ln. 5.4.2. Cch khc phc

201

Nhc im trn d dng khc phc bng cch a vo lp DT hm hu vit trong 5.3 (mc trn). 5.5. Lp hnh trn ho Chng trnh di y gm: Lp HT (hnh trn) vi cc thuc tnh: int r; // Bn knh

int m ; // Mu hnh trn int xhien,yhien; // V tr hin th hnh trn trn mn hnh char *pht; int hienmh; Cc phng thc: + Hm to khng i HT(); thc hin vic gn gi tr bng 0 cho cc thuc tnh ca lp. + Hm to c i HT(int r1,int m1=15); thc hin cc vic: - Gn r1 cho r, m1 cho m - Cp pht b nh cho pht - V hnh trn v lu nh hnh trn vo vng nh ca pht + Hm hu ~HT(); thc hin cc vic: - Xo hnh trn khi mn hnh (nu ang hin th) // Con tr tr ti vng nh cha nh hnh trn // Trng thi hin (hienmh=1), n (hienmh=0)

202

- Gii phng b nh cp cho pht + Phng thc void hien(int x, int y); c nhim v hin th hnh trn ti (x,y) + Phng thc void an(); c nhim v lm n hnh trn Cc hm c lp: void ktdh(); //Khi to ho void ve_bau_troi(); // V bu tri y sao void ht_di_dong_xuong(); // V mt cp 2 hnh trn di // chuyn xung void ht_di_dong_len();// V mt cp 2 hnh trn di // chuyn ln trn Ni dung chng trnh l to ra cc chuyn ng xung v ln ca cc hnh trn. //CT4_09.CPP // Lop do hoa // Ham huy // Trong ham huy co the goi PT khac #include <conio.h> #include <iostream.h> #include <math.h> #include <stdlib.h> #include <graphics.h>

203

#include <dos.h> void ktdh(); void ve_bau_troi(); void ht_di_dong_xuong(); void ht_di_dong_len(); int xmax,ymax; class HT { private: int r,m ; int xhien,yhien; char *pht; int hienmh; public: HT(); HT(int r1,int m1=15); ~HT(); void hien(int x, int y); void an(); }; HT:: HT() { r=m=hienmh=0; xhien=yhien=0;

204

pht=NULL; }

HT::HT(int r1,int m1) { r=r1; m=m1; hienmh=0; xhien=yhien=0; if (r<0) r=0; if (r==0) { pht=NULL; } else { int size; char *pmh; size = imagesize(0,0,r+r,r+r); pmh = new char[size]; getimage(0,0,r+r,r+r,pmh); setcolor(m); circle(r,r,r); setfillstyle(1,m); floodfill(r,r,m); pht = new char[size]; getimage(0,0,r+r,r+r,pht);

205

putimage(0,0,pmh,COPY_PUT); delete pmh; pmh=NULL; } } void HT::hien(int x, int y) { if (pht!=NULL && !hienmh) // chua hien { hienmh=1; xhien=x; yhien=y; putimage(x,y,pht,XOR_PUT); } } void HT::an() { if (hienmh) // dang hien { hienmh=0; putimage(xhien,yhien,pht,XOR_PUT); } } HT::~HT() {

206

an(); if (pht!=NULL) { delete pht; pht=NULL; } } void ktdh() { int mh=0,mode=0; initgraph(&mh,&mode,""); xmax = getmaxx(); ymax = getmaxy(); }

void ve_bau_troi() { for (int i=0;i<2000;++i) putpixel(random(xmax), random(ymax), 1+random(15)); } void ht_di_dong_xuong() { HT h(50,4); HT u(60,15);

207

h.hien(0,0); u.hien(40,0); for (int x=0;x<=340;x+=10) { h.an(); u.an(); h.hien(x,x); delay(200); u.hien(x+40,x); delay(200); } } void ht_di_dong_len() { HT h(50,4); HT u(60,15); h.hien(340,340); u.hien(380,340); for (int x=340;x>=0;x-=10) { h.an(); u.an(); h.hien(x,x); delay(200);

208

u.hien(x+40,x); delay(200); } } void main() { ktdh(); ve_bau_troi(); ht_di_dong_xuong(); ht_di_dong_len(); getch(); closegraph(); } Cc nhn xt: 1. Trong thn hm hu gi ti phng thc an(). 2. iu g xy ra khi b i hm hu: + Khi gi hm ht_di_dong_xuong() th c 2 i tng kiu HT c to ra. Trong thn hm s dng cc i tng ny v cc hnh trn di chuyn xung. Khi thot khi hm th 2 i tng (to ra trn) c gii phng. Vng nh ca cc thuc tnh ca chng b thu hi, nhng vng nh cp pht cho thuc tnh pht cha c gii phng v nh ca 2 hnh trn ( pha di mn hnh) vn khng c ct i. + iu tng t xy ra sau khi ra khi hm ht_di_dong_len() : vng nh cp pht cho thuc tnh pht cha c gii phng v nh ca 2 hnh trn ( pha trn mn hnh) vn khng c thu dn.

6. Ton t gn

209

6.1. Ton t gn mc nh Ton t gn (cho lp) l mt trng hp c bit so vi cc ton t khc. Nu trong lp cha nh ngha mt phng thc ton t gn th Trnh bin dch s pht sinh mt ton t gn mc nh thc hin cu lnh gn 2 i tng ca lp, v du: HT h1, h2(100,6); h1 = h2 ; // Gn h2 cho h1 Ton t gn mc nh s s sao chp i tng ngun (h2) vo i tng ch (h1) theo tng bit mt. Trong a s cc trng hp khi lp khng c cc thnh phn con tr hay tham chiu th ton t gn mc nh l dng v khng cn nh ngha mt phng thc ton t gn cho lp. Nhng i vi cc lp c thuc tnh con tr nh lp DT (a thc), lp HT (hnh trn) th ton t gn mc nh khng thch hp v vic xy dng ton t gn l cn thit. 6.2. Cch vit ton t gn Cng ging nh cc phng thc khc, phng thc ton t gn dng i con tr this biu th i tng ch v dng mt i tng minh biu th i tng ngun. V trong thn ca ton t gn khng nn lm vic vi bn sao ca i tng ngun, m phi lm vic trc tip vi i tng ngun, nn kiu i tng minh nht thit phi l kiu tham chiu i tng. Phng thc ton t gn c th c hoc khng c gi tr tr v. Nu khng c gi tr tr v (kiu void), th khi vit chng trnh khng c php vit cu lnh gn lin tip nhiu i tng, nh: u=v=k=h; Nu phng thc ton t gn tr v tham chiu ca i tng ngun, th c th dng ton t gn th thc hin cc php gn lin tip nhiu i tng. V d i vi lp HT (trong mc trc), c th xy dng ton t gn nh sau: void HT::operator=(const HT &h) { r = h.r ; m = h.m ; xhien = yhien = 0;

210

hienmh = 0 ; if (h.pht==NULL) pht = NULL; else { int size; size = imagesize(0,0,r+r,r+r); pht = new char[size]; memcpy(pht,h.pht,size); } } Vi ton t gn ny, ch cho php gn i tng ngun cho mt i tng ch. Nh vy cu lnh sau l sai: HT u, v, h ; u=v=h; By gi ta sa li ton gn n tr v tham chiu i tng ngun nh sau: const HT & HT::operator=(const HT &h) { r = h.r ; m = h.m ; xhien = yhien = 0; hienmh = 0 ; if (h.pht==NULL) pht = NULL; else

211

{ int size; size = imagesize(0,0,r+r,r+r); pht = new char[size]; memcpy(pht,h.pht,size); } return h ; } Vi ton t gn mi ny, ta c th vit cu lnh gn i tng ngun cho nhiu i tng ch. Nh vy cc cu lnh sau l c: HT u, v, h ; u=v=h; 6.3. Ton t gn v hm to sao chp + Ton t gn khng to ra i tng mi, ch thc hin php gn gia 2 i tng tn ti. + Hm to sao chp c dng to mt i tng mi v gn ni dung ca mt i tng tn ti cho i tng mi va to. + Nu xy dng ton t gn m li dng hm to sao chp mc nh th cha , v vic khi gn trong cu lnh khai bo s khng gi ti ton t gn m li gi ti hm to sao chp. + Nh vy i vi lp c thuc tnh con tr, th ngoi hm to, cn xy dng thm: - Hm hu - Hm to sao chp - Phng thc ton t gn Ch : Khng phi mi cu lnh cha c du = u gi n ton t gn. Cn phn bit 3 trng hp: 1. Cu lnh new (cha du =) s gi n hm to, v d:

212

HT *h= new HT(50,6); // gi n hm to c i 2. Cu lnh khai bo v khi gn (dng du =) s gi n hm to sao chp, v d: HT k=*h; // gi n hm to sao chep

3. Cu lnh gn s gi n ton t gn, v d: HT u; u=*h; // gi n phng thc ton t gn 6.4. V d minh ho Chng trnh di y nh ngha lp HT (hnh trn) v minh ho: + Hm to v hm hu + Phng thc ton t gn c kiu tham chiu + Hm to sao chp + Cch dng con tr this trong hm to sao chp + Cch dng con tr _new_handler kim tra vic cp pht b nh. //CT4_10.CPP // Lop do hoa // Ham huy // toan tu gan - tra ve tham chieu // Ham tao sao chep // Trong ham huy co the goi PT khac #include <conio.h> #include <iostream.h> #include <stdlib.h> #include <graphics.h> #include <new.h>

213

#include <mem.h> static void kiem_tra_bo_nho() ; void ktdh(); int xmax,ymax; void kiem_tra_bo_nho() { outtextxy(1,1,"LOI BO NHO"); getch(); closegraph(); exit(1); } class HT { private: int r,m ; int xhien,yhien; char *pht; int hienmh; public: HT(); HT(int r1,int m1=15); HT(const HT &h); ~HT(); void hien(int x, int y);

214

void an(); const HT &operator=(const HT &h); }; const HT & HT::operator=(const HT &h) { // outtextxy(1,1,"Gan"); getch(); r = h.r ; m = h.m ; xhien = yhien = 0; hienmh = 0 ; if (h.pht==NULL) pht = NULL; else { int size; size = imagesize(0,0,r+r,r+r); pht = new char[size]; memcpy(pht,h.pht,size); } return h; } HT::HT(const HT &h) { //outtextxy(300,1,"constructor sao chep"); getch(); *this = h;

215

} HT:: HT() { r=m=hienmh=0; xhien=yhien=0; pht=NULL; } HT::HT(int r1,int m1) { r=r1; m=m1; hienmh=0; xhien=yhien=0; if (r<0) r=0; if (r==0) { pht=NULL; } else { int size; char *pmh; size = imagesize(0,0,r+r,r+r); pmh = new char[size]; getimage(0,0,r+r,r+r,pmh); setcolor(m); circle(r,r,r);

216

setfillstyle(1,m); floodfill(r,r,m); pht = new char[size]; getimage(0,0,r+r,r+r,pht); putimage(0,0,pmh,COPY_PUT); delete pmh; pmh=NULL; } } void HT::hien(int x, int y) { if (pht!=NULL && !hienmh) // chua hien { hienmh=1; xhien=x; yhien=y; putimage(x,y,pht,XOR_PUT); } } void HT::an() { if (hienmh) // dang hien { hienmh=0; putimage(xhien,yhien,pht,XOR_PUT);

217

} } HT::~HT() { an(); if (pht!=NULL) { delete pht; pht=NULL; } } void ktdh() { int mh=0,mode=0; initgraph(&mh,&mode,""); xmax = getmaxx(); ymax = getmaxy(); } void main() { _new_handler = kiem_tra_bo_nho ; ktdh(); HT *h= new HT(50,6); // gi hm to c i h->hien(100,200);

218

HT k=*h;

// gi hm to sao chp

k.hien(200,200); HT t,v,u; t = v = u = *h; // gi ton t gn u.hien(300,200); v.hien(400,200); t.hien(500,200); getch(); closegraph(); } 6.5. Vai tr ca phng thc ton t gn Chng trnh trn s v 5 hnh trn trn mn hnh. iu g s xy ra nu b i phng thc ton t gn v hm to sao chp? + Nu b c hai, th ch xut hin mt hnh trn ti v tr (100,200). + Nu b ton t gn (gi hm to sao chp) th ch xut hin 2 hnh trn ti cc v tr (100,200) v (200,200). + Nu b hm to sao chp (gi ton t gn) th xut hin 4 hnh trn.

7. Phn loi phng thc, phng thc inline


7.1. Phn loi cc phng thc C th chia phng thc thnh cc nhm: 1. Cc phng thc thng thng 2. Cc phng thc dng xy dng v hu b i tng gm: + Hm to khng i,

219

+ Hm to c i + Hm to sao chp + Hm hu 3. Cc phng thc ton t 7.2. Con tr this Mi phng thc u dng con tr this nh i th nht (i n). Ngoi ra trong phng thc c th a vo cc i tng minh c khai bo nh i ca hm. + Vi cc phng thc thng thng, th i n biu th i tng ch th trong li gi phng thc. + Vi cc hm to, th i n biu th i tng mi c hnh thnh. + Vi cc hm hu, th i n biu th i tng sp b hu b. + Vi cc phng thc ton t, th i n biu th ton hng i tng th nht. 7.3. Phng thc inline. C 2 cch bin dch phng thc theo kiu inline: Cch 1: Xy dng phng thc bn trong nh ngha lp. Cch 2: Thm t kho inline vo nh ngha phng thc (bn ngoi nh ngha lp). Ch l ch cc phng thc ngn khng cha cc cu lnh phc tp (nh chu trnh, goto, switch, quy) mi c th tr thnh inline. Nu c nh bin dch theo kiu inline cc phng thc cha cc cu lnh phc tp ni trn, th Trnh bin dch s bo li. Trong chng trnh di y, tt c cc phng thc ca lp PS (phn s) u l phng thc inline //CT4_11.CPP // Lop PS // Inline #include <conio.h>

220

#include <iostream.h> class PS { private: int t,m ; public: PS() { t=0;m=1; } PS(int t1, int m1); void nhap(); void in(); PS operator*=(PS p2) { t*=p2.t; m*=p2.m; return *this; } }; inline PS::PS(int t1, int m1) { t=t1; m=m1;

221

} inline void PS::nhap() { cout << "\nNhap tu va mau: " ; cin >> t >> m; } inline void PS::in() { cout << "\nPS = " << t << "/" << m ; } void main() { PS q,p,s(3,5); cout << "\n Nhap PS p"; p.nhap(); s.in(); p.in(); q = p*=s; p.in(); q.in(); getch(); }

8. Hm to v i tng thnh phn

222

8.1. Lp bao, lp thnh phn Mt lp c thuc tnh l i tng ca lp khc gi l lp bao, v d: class A { private: int a, b; ... }; class B { private: double x, y, z; ... }; class C { private: int m, n; A u; B p, q; ... }; Trong v d trn th: C l lp bao

223

A, B l cc lp thnh phn (ca C) 8.2. Hm to ca lp bao + Ch l trong cc phng thc ca lp bao khng cho php truy nhp trc tip n cc thuc tnh ca cc i tng ca cc lp thnh phn. + V vy, khi xy dng hm to ca lp bao, phi s dng cc hm to ca lp thnh phn khi gn cho cc i tng thnh phn ca lp bao. V d khi xy dng hm to ca lp C, cn dng cc hm to ca lp A khi gn cho i tng thnh phn u v dng cc hm to ca lp B khi gn cho cc i tng thnh phn p, q. 8.3. Cch dng hm to ca lp thnh phn xy dng hm to ca lp bao + dng hm to (ca lp thnh phn) khi gn cho i tng thnh phn ca lp bao, ta s dng mu: tn_i_tng(danh sch gi tr) + Cc mu trn cn vit bn ngoi thn hm to, ngay sau dng u tin. Ni mt cch c th hn, hm to s c dng: tn_lp(danh sch i) : tn_i_tng( danh sch gi tr), ... tn_i_tng( danh sch gi tr) { // Cc cu lnh trong thn hm to } Ch l cc du ngoc sau tn i tng lun lun phi c, ngay c khi danh sch gi tr bn trong l rng. + Danh sch gi tr ly t danh sch i. Da vo danh sch gi tr, Trnh bin dch s bit cn dng hm to no khi gn cho i tng. Nu danh sch gi tr l rng th hm to khng i s c s dng.

224

+ Cc i tng mun khi gn bng hm to khng i c th b qua, khng cn phi lit k trong hm to. Ni cch khc: Cc i tng khng c lit k trn dng u hm to ca lp bao, u c khi gn bng hm to khng i ca lp thnh phn. V d: class A { private: int a, b; public: A() { a=b=0; } A(int a1, int b1) { a = a1; b = b1; } ... }; class B { private: double x, y, z; public: B()

225

{ x = y = z = 0.0 ; } B(double x1, double y1) { x = x1; y = y1; z = 0.0 ; } B(double x1, double y1, double z1) { x = x1; y = y1; z = z1 ; } ... }; class C { private: int m, n; A u, v; B p, q, r; public: C(int m1, int n1,int a1, int b1, double x1, double y1, double x2, double y2, double z2) : u(), v(a1,b1), q(x1,y1), r(x2,y2,z2) { m = m1 ; n = n1;

226

} }; Trong hm to ni trn ca lp C, th cc i tng thnh phn c khi gn nh sau: u c khi gn bng hm to khng i ca lp A v c khi gn bng hm to 2 i ca lp A q c khi gn bng hm to 2 i ca lp B r c khi gn bng hm to 3 i ca lp B p (khng c mt) c khi gn bng hm to khng i ca lp B 8.4. S dng cc phng thc ca lp thnh phn Mc d lp bao c cc thnh phn i tng, nhng trong lp bao li khng c php truy nhp n cc thuc tnh ca cc i tng ny. V vy gii php thng thng l: + Trong cc lp thnh phn, xy dng sn cc phng thc c th ly ra cc thuc tnh ca lp. + Trong lp bao dng cc phng thc ca lp thnh phn nhn cc thuc tnh ca cc i tng thnh vin cn dng n. 8.5. Cc v d Hai chng trnh di y minh ho cc iu ni trong cc mc trn. V d 1: Trong v d ny xt 2 lp: DIEM (im) v DT (on thng) Lp DIEM l lp thnh phn ca lp DT //CT4_12.CPP // Thuoc tinh doi tuong #include <conio.h> #include <iostream.h>

227

class DIEM { private: int x,y ; public: DIEM() { x=y=0; } DIEM(int x1, int y1) { x= x1; y=y1; } void in() { cout << "(" << x << "," << y << ")" ; } }; class DT { private: DIEM d1, d2; int m; public:

228

DT() : d1(), d2() { m=0; } DT(int m1,int x1, int y1, int x2, int y2) : d1(x1,y1), d2(x2,y2) { m=m1; } DT(int m1,DIEM t1, DIEM t2) { m=m1; d1 = t1; d2 = t2; } void in() { cout << "\n Diem dau : "; d1.in(); cout << "\n Diem cuoi: "; d2.in(); cout << "\n Mau : " << m; } }; void main() { DT u, v(1,100,100,200,200), s(2,DIEM(300,300),

229

DIEM(400,400)) ; clrscr(); u.in(); v.in(); s.in(); getch(); } V d 2: Trong v d ny xt 3 lp: Diem (im) DTron (ng trn) HTron (Hnh trn) Lp DTron c mt lp thnh phn l lp Diem. Lp HTron c 2 lp thnh phn l lp DTron v lp Diem. Trong lp DTron a vo phng thc v ng trn. Trong lp HTron a vo phng thc v v t mu hnh trn. Khi xy dng phng thc ca lp bao cn s dng cc phng thc ca lp thnh phn. //CT4_13.CPP // Thuoc tinh doi tuong #include <conio.h> #include <iostream.h> #include <graphics.h> class Diem {

230

private: int x,y ; public: Diem() { x=y=0; } Diem(int x1, int y1) { x= x1; y=y1; } int getx() { return x; } int gety() { return y; } }; class DTron // Duong tron { private: Diem t ; // tam

231

int r ; int m; public: DTron() { r=m=0; } DTron(int x1,int y1,int r1,int m1): t(x1,y1) { m=m1; r=r1; } int mau() { return m; } void ve() { setcolor(m); circle(t.getx(),t.gety(),r); } }; class HTron { private:

232

DTron dt; Diem d; int m; public: HTron() { m=0; } HTron(int x1, int y1, int r1, int m1, int x, int y, int mt): dt(x1,y1,r1,m1), d(x,y) { m = mt; } void ve() { dt.ve(); setfillstyle(1,m); floodfill(d.getx(),d.gety(),dt.mau()); } }; void main() { int mh=0, mode=0; initgraph(&mh,&mode,"");

233

setbkcolor(1); DTron dt(100,100,80,6); HTron ht(300,300,150,15,300,300,4); dt.ve(); ht.ve(); getch(); closegraph(); }

9. Cc thnh phn tnh


9.1. Thnh phn d liu tnh + Thnh phn d liu c khai bo bng t kho static gi l tnh, v d: class A { private: static int ts ; // Thnh phn tnh int .... };
206 Thnh phn tnh c cp pht mt vng nh c nh. N tn ti ngay c khi lp cha c +

x;

mt i tng no c. + Thnh phn tnh l chung cho c lp, n khng phi l ring ca mi i tng. V d xt 2 i tng:

234

A u,v ; // Khai bo 2 i tng th gia cc thnh phn x v ts c s khc nhau nh sau: u.x v v.x c 2 vng nh khc nhau u.ts v v.ts ch l mt, chng cng biu th mt vng nh thnh phn ts tn ti ngay khi u v v cha khai bo + biu th thnh phn tnh, ta c th dng tn lp, v du: i vi ts th 3 cch vit sau l tng ng: A::ts u.ts v.ts

+ Khai bo v khi gn gi tr cho thnh phn tnh Thnh phn tnh s c cp pht b nh v khi gn gi tr ban u bng mt cu lnh khai bo t sau nh ngha lp (bn ngoi cc hm, k c hm main), theo cc mu: int A::ts ; // Khi gn cho ts gi tr 0

int A::ts = 1234; // Khi gn cho ts gi tr 1234 Ch : Khi cha khai bo th thnh phn tnh cha tn ti. V d xt chng trnh sau: #include <conio.h> #include <iostream.h> class HDBH { private: char *tenhang ; // Tn hng double tienban ; // Tin bn static int tshd ; // Tng s ho n // Ho n bn hng

static double tstienban ; // Tng s tin bn public: static void in()

235

{ cout <<"\n" << tshd; cout <<"\n" << tstienban; } }; void main() { HDBH::in(); getch(); } Cc thnh phn tnh tshd v tstienban cha khai bo, nn cha tn ti. V vy cc cu lnh in gi tr cc thnh phn ny trong phng thc in l khng logic. Khi dch chng trnh, s nhn c cc thng bo li (ti phng thc in) nh sau: Undefined symbol HDBH::tshd in module ... Undefined symbol HDBH::tstienban in module ... C th sa chng trnh trn bng cch a vo cc lnh khai bo cc thnh phn tnh tshd v tstienban nh sau: //CT4_14.CPP // thanh phan tinh // Lop HDBH (hoa don ban hang) #include <conio.h> #include <iostream.h> class HDBH { private:

236

int shd ; char *tenhang ; double tienban ; static int tshd ; static double tstienban ; public: static void in() { cout <<"\n" << tshd; cout <<"\n" << tstienban; } }; int HDBH::tshd=5; double HDBH::tstienban=20000.0; void main() { HDBH::in(); getch(); } 9.2. Khi no cn s dng cc thnh phn d liu tnh Xt mt v d v qun l cc ho n bn hng. Mi ho n c: Tn hng, s tin bn. R rng cc thuc tnh ni trn l ring ca mi ho n. Mt khc nu chng ta quan tm n tng s ho n bn, tng s tin bn, th cc thng tin ny l chung. V vy khi thit k lp HDBH (ho n bn hng) , th ta c th a vo 4 thnh phn d liu l: tenhang (tn hng)

237

tienban (tin bn) tshd (tng s ho n) tstienban (tng s tin bn) Cc thuc tnh tenhang v tienban l ring ca mi ho n, nn chng c chn l cc thuc tnh thng thng. Cn cc thuc tnh tshd v tstienban l chung cho c lp nn chng c chn l cc thuc tnh tnh. 9.3. Phng thc tnh + C 2 cch vit phng thc tnh: Cch 1: Dng t kho static t trc nh ngha phng thc vit bn trong nh ngha lp (nh phng thc in() v d cui ca mc 9.1). Cch 2: Nu phng thc xy dng bn ngoi nh ngha lp, th dng t kho static t trc khai bo phng thc bn trong nh ngha lp. Ch khng cho php dng t kho static t trc nh ngha phng thc vit bn ngoi nh ngha lp. + Phng thc tnh l chung cho c lp, n khng l thuc vo mt i tng c th, n tn ti ngay khi lp cha c i tng no (xem v d trong mc 9.1). + Li gi phng thc tnh: C th xut pht t mt i tng no (nh vn dng khi gi cc phng thc khc) C th dng tn lp V d xt lp HDBH trong mc 9.1 v xt cc cu lnh: HDBH u, v; Khi gi phng thc tnh in() c th dng mt trong cc lnh sau: u.in(); v.in(); HDBH::in(); + V phng thc tnh l c lp vi cc i tng, nn khng th dng phng thc tnh x l d liu ca cc i tng ch th trong li gi phng thc tnh. Ni cch khc khng cho

210

238

php truy nhp ti cc thuc tnh (tr thuc tnh tnh) trong thn phng thc tnh. iu cng ng ngha vi vic khng cho php dng con tr this trong phng thc tnh. V d nu lp phng thc tnh in() in cc thuc tnh ca lp HDBH nh sau: class HDBH { private: int shd ; char *tenhang ; double tienban ; static int tshd ; static double tstienban ; public: static void in() { cout <<"\n" << tshd; cout <<"\n" << tstienban; cout <<"\n" << tenhang; cout <<"\n" << tienban; } }; th s b li, v trong thn phng thc tnh khng cho php truy nhp n cc thuc tnh tenhang v tienban. 9.4. V d minh ho vic dng phng thc tnh Xt bi ton qun l ho n bn hng. Mi ho n c 2 d liu l tn hng v tin bn. S dng hm to to ra cc ho n, dng hm hu b i (loi i) cc ho n khng cn lu

239

tr, dng mt phng thc sa cha ni dung ho n (nhp li tin bn). Vn t ra l sau mt s thao tc: To, sa v hu ho n th tng s ho n cn li l bao nhiu v tng s tin trn cc ho n cn li l bao nhiu? Chng trnh di y nhm p ng yu cu t ra. //CT4_14.CPP // thanh phan tinh // Lop HDBH (hoa don ban hang) #include <conio.h> #include <iostream.h> class HDBH { private: char *tenhang ; double tienban ; static int tshd ; static double tstienban ; public: HDBH(char *tenhang1=NULL,double tienban1=0.0 ) { tienban=tienban1; tenhang=tenhang1; ++tshd; tstienban += tienban; } ~HDBH()

240

{ --tshd; tstienban -= tienban; } void sua(); static void in(); }; int HDBH::tshd=0; double HDBH::tstienban=0; void HDBH::in() { cout <<"\n\nTong so hoa don: " << tshd; cout <<"\nTong so tien: " << tstienban; } void HDBH::sua() { cout << "\n\nTen hang: " << tenhang; cout << "\nTien ban : " << tienban; tstienban -= tienban; cout << "\nSua tien ban thanh : " ; cin >> tienban; tstienban += tienban; } void main()

241

{ HDBH *h1 = new HDBH("Xi mang",2000); HDBH *h2 = new HDBH("Sat thep",3000); HDBH *h3 = new HDBH("Ti vi",4000); clrscr(); HDBH::in(); getch(); delete h1; HDBH::in(); getch(); h2->sua(); HDBH::in(); getch(); delete h3; HDBH::in(); getch(); }

10. Mng i tng


10.1. Khai bo C th dng tn lp khai bo mng i tng (ging nh khai bo mng int, float, char, ...) theo mu: Tn_lp tn_mng[kch_c] ;

242

V d gi s nh ngha lp DIEM (im), khi c th khai bo cc mng i tng DIEM nh sau: DIEM a[10], b[20] ; ngha: a l mng kiu DIEM gm 10 phn t b l mng kiu DIEM gm 20 phn t Cu lnh khai bo mng s gi ti hm to khng i to cc phn t mng. Trong v d trn, hm to c gi 30 ln to 30 phn t mng i tng. 10.2. Khai bo v khi gn khai bo mng v khi gn gi tr cho cc phn t mng i tng, cn dng cc hm to c i theo mu sau: Tn_lp tn_mng[kch_c] = { Tn_lp(cc tham s), ..., Tn_lp(cc tham s) } ; V d gi s lp DIEM nh ngha: class DIEM { private: int x, y ; public: DIEM() { x=y=0; } DIEM(int x1, int y1) { x=x1; y=y1;

243

} void nhapsl(); void ve_doan_thang(DIEM d2, int mau) ; }; Khi cc cu lnh khai bo di y u ng: DIEM d[5] = {DIEM(1,1),DIEM(200,200)}; DIEM u[] = {DIEM(1,1),DIEM(200,200)}; ngha ca cc lnh ny nh sau: Cu lnh u gi ti hm to 2 ln khi gn cho d[1], d[2] v gi ti hm to khng i 3 ln to cc phn t d[3], d[4] v d[5]. Cu lnh sau gi ti hm to 2 ln khi gn cho u[1], u[2]. Mng u s gm 2 phn t. 10.3. Biu th thnh phn ca phn t mng biu th thuc tnh ca phn t mng i tng, ta vit nh sau: Tn_mng[ch s] . Tn_thuc_tnh thc hin phng thc i vi phn t mng ta vit nh sau: Tn_mng[ch s] . Tn_phng_thc(danh sch tham s) ; V d v on thng ni im d[1] vi d[2] theo mu , ta c th dng phng thc ve_doan_thang nh sau: d[1].ve_doan_thang(d[2], 4);// Thc hin phng thc i vi d[1] 10.4. V d Chng trnh di y a vo lp TS (th sinh) v xt bi ton: Nhp mt danh sch th sinh, sp xp danh sch theo th t gim ca tng im. Chng trnh minh ho: + Cch dng mng i tng. + Vai tr con tr this (trong phng thc hv(hon v)) . + Cc hm to, hm hu.

244

+ Vai tr ca ton t gn (nu s dng php gn mc nh chng trnh s cho kt qu sai). //CT4_15.CPP // mang doi tuong // Lop TS (thi sinh) // Chu y vai tro cua toan tu gan #include <conio.h> #include <iostream.h> #include <string.h> class TS { private: char *ht; double td; public: TS() { ht = new char[20]; td = 0; } ~TS() { delete ht; } const TS &operator=(const TS &ts2)

245

{ this->td = ts2.td; strcpy(this->ht,ts2.ht); return ts2; } void nhap(int i); void in(); double gettd() { return td; } void hv(TS &ts2) { TS tg; tg = *this ; *this = ts2 ; ts2 = tg; } }; void TS::in() { cout << "\nHo ten: " << ht << " } void TS::nhap(int i) Tong diem: " << td;

246

{ cout << "\nNhap thi sinh " << i ; cout << "\nHo ten: " ; cin >> ht; cout << "Tong diem: " ; cin >> td; } void main() { TS ts[100]; int n, i, j; clrscr(); cout << "\n So thi sinh: " ; cin >> n; for (i=1; i<= n; ++i) ts[i].nhap(i); cout <<"\n Danh sach nhap vao:"; for (i=1; i<= n; ++i) ts[i].in(); for (i=1; i<n ; ++i) for (j=i+1 ; j<=n; ++j) if (ts[i].gettd() < ts[j].gettd()) ts[i].hv(ts[j]); cout <<"\n\n Danh sach sau khi sap xep:"; for (i=1; i<= n; ++i) ts[i].in();

247

getch(); }

11. cp pht b nh cho i tng


11.1. Cch cp pht b nh cho i tng C th dng new v tn lp cp pht mt vng nh cho mt hoc mt dy cc i tng. B nh cp pht c qun l bi mt con tr kiu i tng. V d sau khi nh ngha lp DIEM nh trong mc trn, ta c th thc hin cc lnh cp pht b nh nh sau: int n = 10; DIEM *p, *q, *r ; p = new DIEM ; // Cp pht b nh cho mt i tng q = new DIEM[n] ; //Cp pht b nh cho n i tng r = new DIEM(200,100); // Cp pht b nh v khi gn cho // mt i tng 11.2. Lm vic vi i tng thng qua con tr + Gi s con tr p tr ti vng nh ca mt i tng no . Khi : - biu th mt thnh phn (thuc tnh hoc phng thc) ca i tng, ta dng mu vit sau: p -> tn_thnh_phn - biu th i tng, ta dng mu vit sau: *p + Gi s con tr q tr ti a ch u vng nh ca mt dy i tng. Khi : - biu th mt thnh phn (thuc tnh hoc phng thc) ca i tng th i, ta dng mt trong cc mu vit sau: q[i].tn_thnh_phn

248

(q+i)-> tn_thnh_phn - biu th i tng th i, ta dng mt trong cc mu vit sau: q[i] *(q+i) 11.3. Bi ton sp xp th sinh Trong mc 10.4. s dng mng i tng gii quyt bi ton: Nhp mt danh sch th sinh, sp xp danh sch theo th t gim ca tng im. Di y s a ra phng n mi bng cch dng con tr v cp pht b nh cho cc i tng. Chng trnh ch thay i hm main() nh sau: void main() { TS *ts; int n, i, j; clrscr(); cout << "\n So thi sinh: " ; cin >> n; ts = new TS[n+1]; for (i=1; i<= n; ++i) ts[i].nhap(i); cout <<"\n Danh sach nhap vao:"; for (i=1; i<= n; ++i) ts[i].in(); for (i=1; i<n ; ++i) for (j=i+1 ; j<=n; ++j) if (ts[i].gettd() < ts[j].gettd())

249

ts[i].hv(ts[j]); cout <<"\n\n Danh sach sau khi sap xep:"; for (i=1; i<= n; ++i) ts[i].in(); getch(); }

Nhn xt: S khc bit gia hm main mi v hm main trong 10.4 l rt t. 11.4. Danh sch mc ni Chng trnh di y nh ngha lp t tr TS (lp c thuc tnh kiu *TS). Lp ny c dng t chc danh sch mc ni. Chng trnh nhp mt danh sch th sinh v cha trong mt danh sch mc ni. Sau duyt trn danh sch ny in cc th sinh trng tuyn. So vi lp TS nu trong mc 10.4, lp TS y c mt s im khc nh sau: + Thm thuc tnh: TS *dc; // Dng cha a ch ca mt i tng kiu TS + Thm cc phng thc: void setdc(TS *dc1) ; // Gn dc1 cho thuc tnh dc TS *getdc() ; // Nhn gi tr ca dc

+ Phng thc nhap trong chng trnh trc c kiu void nay sa l: int nhap(int i); Phng thc tr v 1 nu h tn nhp vo khc trng, tr v 0 nu tri li. + B i cc phng thc khng dng n nh: Ton t gn, hon v. //CT4_16.CPP // Danh sch mc ni // Lop TS (thi sinh)

250

#include <conio.h> #include <iostream.h> #include <string.h> #include <ctype.h> #include <stdio.h> class TS { private: char *ht; double td; TS *dc; public: TS() { ht = new char[20]; td = 0; dc=NULL; } ~TS() { delete ht; dc=NULL ; } int nhap(int i); void in();

251

double gettd() { return td; } void setdc(TS *dc1) { dc=dc1; } TS *getdc() { return dc; } }; void TS::in() { cout << "\nHo ten: " << ht << " } int TS::nhap(int i) { cout << "\nNhap thi sinh " << i ; cout << "\nHo ten (Bm Enter kt thc nhp): " ; fflush(stdin); gets(ht); if (ht[0]==0) return 0; Tong diem: " << td;

252

cout << "Tong diem: " ; cin >> td; dc=NULL; return 1; } void main() { int i=0; TS *pdau,*p,*q; pdau=NULL; clrscr(); while(1) { q=new TS; ++i; if (q->nhap(i)==0) { delete q; break; } if (pdau==NULL) pdau = p = q; else { p->setdc(q) ; p = q;

253

} } /* In */ double diemchuan; cout << "\nDiem chuan: " ; cin >> diemchuan; cout <<"\nDanh sach trung tuyen:" ; p=pdau; while (p!=NULL) { if (p->gettd()>=diemchuan) p->in(); p = p->getdc(); } getch(); }

12. i tng hng, phng thc hng


+ Cng ging nh cc phn t d liu khc, mt i tng c th c khai bo l hng bng cch dng t kho const. V d: class DIEM { private: int x, y;

254

int m; public: DIEM() { x = y = m = 0; } DIEM(int x1, int y1, int m1=15) { x= x1; y= y1; m= m1; } ... }; const DIEM d = DIEM(200,100); // Khai bo i tng hng + Khi khai bo cn s dng cc hm to khi gn gi tr cho i tng hng. Gi tr khi to c th l cc hng, cc bin, cc biu thc v cc hm, v d: int x0=100, y0=50; m0 =4; const DIEM d5 = DIEM(x0 + getmaxx()/2, y0 + getmaxy()/2, m0); + Cc phng thc c th s dng cho cc i tng hng l hm to v hm hu. V l thuyt cc i tng hng khng th b thay i, m ch c to ra hoc hu b i. Khi dng mt phng thc cho i tng hng, th CTBD (Chng trnh bin dich) s cnh bo (warning): Non-const function called for const object Tuy nhin, chng trnh EXE vn c to v khi thc hin chng trnh, th ni dung cc i tng hng vn b thay i. Chng trnh di y s minh ho iu ny. Chng trnh a vo lp PS (phn s). Phng thc ton t ++ vn c th lm thay i i tng hng (mc d khi bin dch c 3 cnh bo).

255

//CT4_19.CPP // doi tuong const // Lop PS (phan so) #include <conio.h> #include <iostream.h> #include <string.h> #include <math.h> class PS { private: int t,m; public: PS() { t = m = 0; } PS(int t1, int m1) { t = t1; m = m1; } PS operator++() { t += m ; return *this ;

256

} void in() { cout << "\nPS= " << t << "/" << m; } void nhap() { cout << "\n Nhap tu va mau: " ; cin >> t >> m; } }; void main() { int t1=-3, m1=5; const PS p = PS(abs(t1)+2,m1+2); // Khai bo i tng hng clrscr(); p.in(); ++p; p.in(); getch(); } + Phng thc const bin mt phng thc thnh const ta ch vic vit thm t kho const vo sau dng u ca phng thc.

257

Ch : Nu phng thc c khai bo bn trong v nh ngha bn ngoi lp, th t kho const cn c b sung c trong khai bo v nh ngha phng thc. Trong thn phng thc const khng cho php lm thay i cc thuc tnh ca lp. V vy vic dng phng thc const cho cc i tng hng s m bo gi nguyn ni dung ca cc i tng hng. ng nhin cc phng thc const vn dng c cho cc i tng khc. V d sau v lp PS (phn s) minh ho vic dng phng thc const. // i tng const // Phng thc const // Lop PS (phan so) #include <conio.h> #include <iostream.h> #include <string.h> #include <math.h> class PS { private: int t,m; public: PS() { t = m = 0; } PS(int t1, int m1) {

258

t = t1; m = m1; } PS operator++() { t += m ; return *this ; } void in() const ; void nhap() { cout << "\n Nhap tu va mau: " ; cin >> t >> m; } }; void PS::in() const { cout << "\nPS= " << t << "/" << m; } void main() { int t1=-3, m1=5; const PS p = PS(abs(t1)+2,m1+2); PS q; clrscr();

259

q.nhap(); p.in(); q.in(); getch(); }

13. Hm bn, lp bn
13.1. Hm bn (xem mc 6, chng 3) ca mt lp, tuy khng phi l phng thc ca lp, nhng c th truy nhp n cc thnh phn ring (private) ca lp. Mt hm c th l bn ca nhiu lp. 13.2. Nu lp A c khai bo l bn ca lp B th tt c cc phng thc ca A u c th truy nhp n cc thnh phn ring ca lp B. Mt lp c th l bn ca nhiu lp khc. Cng c th khai bo A l bn ca B v B l bn ca A. 13.3. Cch khai bo lp bn Gi s c 3 lp A, B v C. khai bo lp ny l bn ca lp kia, ta vit theo mu sau: // Khai bo trc cc lp class A; class B ; class C; // nh ngha cc lp class A { ... friend class B ; // Lp B l bn ca A

260

friend class C ; // Lp C l bn ca A ... }; class B { ... friend class A ; // Lp A l bn ca B friend class C ; // Lp C l bn ca B ... }; class C { ... friend class B ; // Lp B l bn ca C ... }; 13.4. V d Chng trnh di y c 2 lp: MT (ma trn vung) VT (vc t) Lp MT l bn ca VT v lp VT l bn ca MT. Trong chng trnh s dng cc phng thc trng tn: 2 phng thc nhap(): nhp ma trn

261

nhp vc t 2 phng thc in(): in ma trn in vc t 4 phng thc tich(): tch ma trn vi ma trn, kt qu l ma trn tch ma trn vi vc t, kt qu l vc t tch vc t vi ma trn, kt qu l vc t tch vc t vi vc t, kt qu l s thc Ni dung chng trnh l: + Nhp cc ma trn A, B, C + Nhp cc vc t + Tnh tch D = AB + Tnh tch u = Dy + Tnh tch v = xC + Tnh tch s = vu //CT4_17.CPP // Lop ban // Lop MT , lop VT #include <conio.h> #include <iostream.h> class MT; class VT; class MT

262

{ private: double a[10][10]; int n; public: friend class VT; MT() { n=0; } void nhap(); void in(); VT tich(const VT &y); MT tich(const MT &b) ; }; class VT { private: double x[10]; int n; public: friend class MT; VT() {

263

n=0; } void nhap(); void in(); VT tich(const MT &b); double tich(const VT &y) ; }; void MT::nhap() { cout << "\n Cap ma tran: " ; cin >> n; for (int i=1; i<=n; ++i) for (int j=1; j<=n; ++j) { cout << "\nPhan tu hang " << i << " cot " << j << " = " ; cin >> a[i][j]; } } void MT::in() { for (int i=1; i<=n; ++i) { cout << "\n" ; for (int j=1; j<=n; ++j)

264

cout << a[i][j] << " " ; } } void VT::nhap() { cout << "\n Cap vec to: " ; cin >> n; for (int i=1; i<=n; ++i) { cout << "\nPhan tu thu " << i << " = " ; cin >> x[i]; } } void VT::in() { for (int i=1; i<=n; ++i) cout << x[i] << " " ; } VT MT::tich(const VT &y) { VT z; int i,j; for (i=1; i<=n; ++i) {

265

z.x[i] = 0.0 ; for (j=1; j<=n; ++j) z.x[i] += a[i][j]*y.x[j]; } z.n = n; return z; } MT MT::tich(const MT &b) { MT c; int i,j,k; for (i=1; i<=n; ++i) for (j=1; j<=n; ++j) { c.a[i][j] = 0.0 ; for (k=1; k<=n; ++k) c.a[i][j] += a[i][k]*b.a[k][j]; } c.n = n; return c; } VT VT::tich(const MT &b) { VT z;

266

int i,j; for (j=1; j<=n; ++j) { z.x[j] = 0.0 ; for (i=1; i<=n; ++i) z.x[j] += b.a[i][j]*x[i]; } z.n = n; return z; } double VT::tich(const VT &y) { double tg=0.0; for (int i=1; i<=n; ++i) tg += x[i]*y.x[i]; return tg; } void main() { MT a,b,c; VT x,y; clrscr(); cout << "\nMa tran A"; a.nhap();

267

cout << "\nMa tran B"; b.nhap(); cout << "\nMa tran C"; c.nhap(); cout << "\nvec to X"; x.nhap(); cout << "\nvec to Y"; y.nhap(); MT d= a.tich(b); VT u = d.tich(y); VT v = x.tich(c); double s = v.tich(u); cout << "\n\nVec to v\n"; v.in(); cout << "\n\nMa tran D"; d.in(); cout << "\n\nVec to y\n"; y.in(); cout << "\n\nS= vDy = " << s; getch(); }

268

Chng 5 Dn Xut V Tha K


C 2 khi nim rt quan trng lm nn ton b th mnh ca phng php lp trnh hng i tng l tnh k tha (inheritance) v tnh tng ng bi (polymorphism). Tnh k tha cho php cc lp c xy dng trn cc lp c. Trong chng ny s ni v s tha k ca cc lp.

1. S dn xut v tnh tha k


1.1. Lp c s v lp dn xut Mt lp c xy dng tha k mt lp khc gi l lp dn xut. Lp dng xy dng lp dn xut gi l lp c s. Lp no cng c th l mt lp c s. Hn th na, mt lp c th l c s cho nhiu lp dn xut khc nhau. n lt mnh, lp dn xut li c th dng lm c s xy dng cc lp dn xut khc. Ngoi ra mt lp c th dn xut t nhiu lp c s. Di y l mt s s v quan h dn xut ca cc lp: S 1: Lp B dn xut t lp A, lp C dn xut t lp B A

S 2: Lp A l c s ca cc lp B, C v D

269

B S 3: Lp D dn xut t 3 lp A, B, C A

D S 4: Lc dn xut tng qut A B C

Tnh tha k: Mt lp dn xut ngoi cc thnh phn ca ring n, n cn c tha k tt c cc thnh phn ca cc lp c s c lin quan. V d trong s 1 th lp C c tha k cc thnh phn ca cc lp B v A. Trong s 3 th lp D c tha k cc thnh phn ca cc lp A, B v C. Trong s 4 th lp G c tha k cc thnh phn ca cc lp D, E, A, B v C. 1.2. Cch xy dng lp dn xut Gi s nh ngha cc lp A v B. xy dng lp C dn xut t A v B, ta vit nh sau: class C : public A, public B {

270

private: // Khai bo cc thuc tnh public: // Cc phng thc }; 1.3. Tha k private v public Trong v d trn, lp C tha k public cc lp A v B. Nu thay t kho public bng private, th s tha k l private. Ch : Nu b qua khng dng t kho th hiu l private, v d nu nh ngha: class C : public A, B { private: // Khai bo cc thuc tnh public: // Cc phng thc }; th A l lp c s public ca C , cn B l lp c s private ca C. Theo kiu tha k public th tt c cc thnh phn public ca lp c s cng l cc thnh phn public ca lp dn xut. Theo kiu tha k private th tt c cc thnh phn public ca lp c s s tr thnh cc thnh phn private ca lp dn xut. 1.4. Tha k cc thnh phn d liu (thuc tnh) Cc thuc tnh ca lp c s c tha k trong lp dn xut. Nh vy tp thuc tnh ca lp dn xut s gm: cc thuc tnh mi khai bo trong nh ngha lp dn xut v cc thuc tnh ca lp c s.

271

Tuy vy trong lp dn xut khng cho php truy nhp n cc thuc tnh private ca lp c s. Ch : Cho php t trng tn thuc tnh trong cc lp c s v lp dn xut. V d: class A { private: int a, b, c; public: ... }; class B { private: double a, b, x; public: ... }; class C : public A, B { private: char *a , *x ; int b ; public:

272

... }; Khi lp C s c cc thuc tnh: A::a , A::b, A::c (kiu int) - tha k t A B::a , B::b, B::x (kiu double) - tha k t B a, x (kiu char*) v b (kiu int) - khai bo trong C Trong cc phng thc ca C ch cho php truy nhp trc tip ti cc thuc tnh khai bo trong C. 1.5. Tha k phng thc Tr: + Hm to + Hm hu + Ton t gn cc phng thc (public) khc ca lp c s c tha k trong lp dn xut. V d: Trong chng trnh di y: + u tin nh ngha lp DIEM c: Cc thuc tnh x, y Hai hm to Phng thc in() + Sau xy dng lp HINH_TRON dn xut t lp DIEM, a thm: Thuc tnh r Hai hm to Phng thc getR Ch cch dng hm to ca lp c s (lp DIEM) xy dng hm to ca lp dn xut.

273

+ Trong hm main: Khai bo i tng h kiu HINH_TRON S dng phng thc in() i vi h (s tha k) S dng phng thc getR i vi h //CT5-01 // Lop co so #include <conio.h> #include <iostream.h> class DIEM { private: double x, y; public: DIEM() { x = y =0.0; } DIEM(double x1, double y1) { x = x1; y = y1; } void in() { cout << "\nx= " << x << " y= " << y;

274

} }; class HINH_TRON : public DIEM { private: double r; public: HINH_TRON() { r = 0.0; } HINH_TRON(double x1, double y1, double r1): DIEM(x1,y1) { r = r1; } double getR() { return r; } }; void main() { HINH_TRON h(2.5,3.5,8);

275

clrscr(); cout << "\nHinh tron co tam: "; h.in(); cout << "\nCo ban kinh= " << h.getR(); getch(); } 1.6. Lp c s v i tng thnh phn Lp c s thng c x l ging nh mt thnh phn kiu i tng ca lp dn xut. V d chng trnh trong 1.5 c th thay bng mt chng trnh khc trong thay vic dng lp c s DIEM bng mt thnh phn kiu DIEM trong lp HINH_TRON. Chng trnh mi c th vit nh sau: //CT5-02 // Lop co doi tuong thanh phan #include <conio.h> #include <iostream.h> class DIEM { private: double x, y; public: DIEM() { x = y =0.0; } DIEM (double x1, double y1)

276

{ x = x1; y = y1; } void in() { cout << "\nx= " << x << " y= " << y; } }; class HINH_TRON { private: DIEM d; double r; public: HINH_TRON() : d() { r = 0.0; } HINH_TRON(double x1, double y1, double r1): d(x1,y1) { r = r1; } void in() {

277

d.in(); } double getR() { return r; } }; void main() { HINH_TRON h(2.5,3.5,8); clrscr(); cout << "\nHinh tron co tam: "; h.in(); cout << "\nCo ban kinh= " << h.getR(); getch(); }

2. Hm to, hm hu i vi tnh tha k


2.1. Lp dn xut khng tha k cc hm to, hm hu, ton t gn ca cc lp c s 2.2. Cch xy dng hm to ca lp dn xut + Hm to cn c cc i khi gn cho cc thuc tnh (thnh phn d liu) ca lp. + C th phn thuc tnh lm 3 loi ng vi 3 cch khi gn khc nhau:

278

1. Cc thuc tnh mi khai bo trong lp dn xut. Trong cc phng thc ca lp dn xut c th truy xut n cc thuc tnh ny. V vy chng thng c khi gn bng cc cu lnh gn vit trong thn hm to. 2. Cc thnh phn kiu i tng. Trong lp dn xut khng cho php truy nhp n cc thuc tnh ca cc i tng ny. V vy khi gn cho cc i tng thnh phn cn dng hm to ca lp tng ng. iu ny trnh bytrong mc 8 chng 4. 3. Cc thuc tnh tha k t cc lp c s. Trong lp dn xut khng c php truy nhp n cc thuc tnh ny. V vy khi gn cho cc thuc tnh ni trn, cn s dng hm to ca lp c s. Cch thc cng ging nh khi gn cho cc i tng thnh phn, ch khc nhau ch: khi gn cho cc i tng thnh phn ta dng tn i tng thnh phn, cn khi gn cho cc thuc tnh tha k t cc lp c s ta dng tn lp c s: Tn_i_tng_thnh_phn(danh sch gi tr) Tn_lp_c_s(danh sch gi tr) Danh sch gi tr ly t cc i ca hm to ca lp dn xut ang xy dng (xem v d mc 2.4 v 6, v d 1) 2.3. Hm hu Khi mt i tng ca lp dn xut c gii phng (b hu), th cc i tng thnh phn v cc i tng tha k t cc lp c s cng b gii phng theo. Do cc hm hu tng ng s c gi n. Nh vy khi xy dng hm hu ca lp dn xut, chng ta ch cn quan tm n cc thuc tnh (khng phi l i tng) khai bo thm trong lp dn xut m thi. Ta khng cn n cc i tng thnh phn v cc thuc tnh tha k t cc lp c s. (xem v d mc 2.4 v 6, v d 2) 2.4. V d xt cc lp + Lp NGUOI gm: - Cc thuc tnh char *ht ; // H tn int ns ;
245 246

279

- Hai hm to, phng thc in() v hm hu + Lp MON_HOC gm: - Cc thuc tnh char *monhoc ; // Tn mn hc int st ; // S tit

- Hai hm to, phng thc in() v hm hu + Lp GIAO_VIEN : - K tha t lp NGUOI - a thm cc thuc tnh char *bomon ; // B mn cng tc

MON_HOC mh ; // Mn hc ang dy - Hai hm to , phng thc in() v hm hu Hy cch xy dng cc hm to, hm hu ca lp dn xut GIAO_VIEN. Trong lp GIAO_VIEN c th gi ti 2 phng thc in(): GIAO_VIEN::in() // c xy dng trong lp GIAO_VIEN NGUOI::in() // Tha k t lp NGUOI

Hy ch cch gi ti 2 phng thc in() trong chng trnh di y. //CT5-03 // Ham tao cua lop dan suat #include <conio.h> #include <iostream.h> #include <string.h> class MON_HOC {

280

private: char *monhoc; int st; public: MON_HOC() { monhoc=NULL; st=0; } MON_HOC(char *monhoc1, int st1) { int n = strlen(monhoc1); monhoc = new char[n+1]; strcpy(monhoc,monhoc1); st=st1; } ~ MON_HOC() { if (monhoc!=NULL) { delete monhoc; st=0; } }

281

void in() { cout << "\nTen mon: " << monhoc << " so tiet: " << st; } }; class NGUOI { private: char *ht; int ns; public: NGUOI() { ht=NULL; ns=0; } NGUOI(char *ht1, int ns1) { int n = strlen(ht1); ht = new char[n+1]; strcpy(ht,ht1); ns=ns1; } ~NGUOI()

282

{ if (ht!=NULL) { delete ht; ns=0; } } void in() { cout << "\nHo ten : " << ht << " nam sinh: " << ns; } }; class GIAO_VIEN : public NGUOI { private: char *bomon; MON_HOC mh; public: GIAO_VIEN():mh(),NGUOI()//Su dung ham tao khong doi { bomon=NULL; } GIAO_VIEN(char *ht1, int ns1, char *monhoc1,int st1, char *bomon1 ): NGUOI(ht1,ns1),mh(monhoc1, st1)

283

{ int n = strlen(bomon1); bomon = new char[n+1]; strcpy(bomon,bomon1); } ~GIAO_VIEN() { if (bomon!=NULL) delete bomon; } void in() { // Su dung phuong thuc in NGUOI::in(); cout << "\n Cong tac tai bo mon: " << bomon; mh.in(); } }; void main() { clrscr(); GIAO_VIEN g1; // Goi toi cac ham tao khong doi GIAO_VIEN *g2; //Goi toi cac ham tao co doi

284

g2 = new GIAO_VIEN("PHAM VAN AT", 1945, "CNPM", 60, "TIN HOC"); g2->in(); /* co the viet g2->GIAO_VIEN::in(); */ g2->NGUOI::in(); getch(); delete g2; // Goi toi cac ham huy getch(); }

3. Phm vi truy nhp n cc thnh phn ca lp c s


3.1. Cc t kho quy nh phm vi truy nhp ca lp c s + Mc d lp dn xut c tha k tt c cc thnh phn ca lp c s, nhng trong lp dn xut khng th truy nhp ti tt c cc thnh phn ny. Gii php thng dng l s dng cc phng thc ca lp c s truy nhp n cc thuc tnh ca chnh lp c s . Cng c th s dng cc gii php khc di y. + Cc thnh phn private ca lp c s khng cho php truy nhp trong lp dn xut. + Cc thnh phn public ca lp c s c th truy nhp bt k ch no trong chng trnh. Nh vy trong cc lp dn xut c th truy nhp c ti cc thnh phn ny. + Cc thnh phn khai bo l protected c phm vi truy nhp rng hn so vi cc thnh phn private, nhng hp hn so vi cc thnh phn public. Cc thnh phn protected ca mt lp ch c m rng phm vi truy nhp cho cc lp dn xut trc tip t lp ny.

285

3.2. Hai kiu dn xut C 2 kiu dn xut l private v public, chng cho cc phm vi truy nhp khc nhau ti lp c s. C th nh sau: + Cc thnh phn public v protected ca lp c s s tr thnh cc thnh phn public v protected ca lp dn xut theo kiu public. + Cc thnh phn public v protected ca lp c s s tr thnh cc thnh phn private ca lp dn xut theo kiu private. V d : Gi s lp A c: thuc tnh public a1 thuc tnh protected a2 v lp B dn xut public t A, th A::a1 tr thnh public trong B, A::a2 tr thnh protected trong B. Do nu dng B lm lp c xy dng lp C. Th trong C c th truy nhp ti A::a1 v A::a2. Th nhng nu sa i B dn xut private t A, th c A::a1 v A::a2 tr thnh private trong B, v khi trong C khng c php truy nhp ti cc thuc tnh A::a1 v A::a2. bit tng tn hn, chng ta hy bin dch chng trnh: //CT5-04 // Pham vi truy nhap #include <conio.h> #include <iostream.h> #include <string.h> class A { protected:

286

int a1; public: int a2; A() { a1=a2=0; } A(int t1, int t2) { a1=t1; a2= t2; } void in() { cout << a1 <<" " << a2 ; } }; class B: private A { protected: int b1; public: int b2; B() {

287

b1=b2=0; } B(int t1, int t2, int u1, int u2) { a1=t1; a2=t2; b1=u1;b2=u2; } void in() { cout << a1 <<" " << a2 << " " << b1 << " " << b2; } }; class C : public B { public: C() { b1=b2=0; } C(int t1, int t2, int u1,int u2) { a1=t1; a2=t2; b1=u1;b2=u2; } void in() {

288

cout << a1; cout <<" " << a2 << " " << b1 << " " << b2; } }; void main() { C c(1,2,3,4); c.in(); getch(); } Chng ta s nhn c 4 thng bo li sau trong lp C (ti hm to c i v phng thc in): A::a1 is not accessible A::a2 is not accessible A::a1 is not accessible A::a2 is not accessible By gi nu sa i lp B dn xut public t A th chng trnh s khng c li v lm vic tt.

4. Tha k nhiu mc v s trng tn


4.1. S xy dng cc lp dn xut theo nhiu mc Nh bit: + Khi nh ngha mt lp (v d lp A), ta c th dng n lm c s xy dng lp dn xut (v d B).

289

+ n lt mnh, B c th dng lm c s xy dng lp dn xut mi (v d C). + Tip li c th dng C lm c s xy dng lp dn xut mi. + S tip tc theo cch trn l khng hn ch. S trn chnh l s tha k nhiu mc. Ngoi ra chng ta cng bit: + Mt lp c th c dn xut t nhiu lp c s. + Mt lp c th dng lm c s cho nhiu lp. Hnh v di y l mt v d v s tha k kh tng qut, th hin c cc iu ni trn: A B C

F Din gii: Lp D dn xut t A v B Lp E dn xut t C Lp F dn xut t D Lp G dn xut t D v E Lp H dn xut t E 4.2. S tha k nhiu mc.

+ Nh bit: Lp dn xut tha k tt c cc thnh phn (thuc tnh v phng thc) ca lp c s, k c cc thnh phn m lp c s c tha k. + Hy p dng nguyn l trn xt lp G:

290

- Lp G tha k cc thnh phn ca cc lp D v E - Lp D tha k cc thnh phn ca lp A v B - Lp E tha k cc thnh phn ca lp C Nh vy cc thnh phn c th s trong lp G gm: - Cc thnh phn khai bo trong G (ca ring G) - Cc thnh phn khai bo trong cc lp D, E, A, B, C (c tha k).

4.3. S trng tn Nh ni trong 4.2: Trong lp G c th s dng (trc tip hay gin tip) cc thnh phn ca ring G v cc thnh phn m n c tha k t cc lp D, E, A, B, C. Yu cu v cch t tn y l: + Tn cc lp khng c trng lp + Tn cc thnh phn trong mt lp cng khng c trng lp + Tn cc thnh phn trong cc lp khc nhau c quyn c trng lp. phn bit cc thnh phn trng tn trong lp dn xut, cn s dng thm tn lp (xem v d trong 4.4). 4.4. S dng cc thnh phn trong lp dn xut Nh ni trn: Thnh phn ca lp dn xut gm: + Cc thnh phn khai bo trong lp dn xut + Cc thnh phn m lp dn xut tha k t cc lp c s Quy tc s dng cc thnh phn trong lp dn xut: Cch 1: Dng tn lp v tn thnh phn. Khi Chng trnh dch C++ d dng phn bit thnh phn thuc lp no. V d: D h; // h l i tng ca lp D dn xut t A v B

291

h.D::n l thuc tnh n khai bo trong D h.A::n l thuc tnh n tha k t A (khai bo trong A) h.D::nhap() l phng thc nhap() nh ngha trong D h.A::nhap() l phng thc nhap() nh ngha trong A Cch 2: Khng dng tn lp, ch dng tn thnh phn. Khi Chng trnh dch C++ phi t phn on bit thnh phn thuc lp no. Cch phn on nh sau: Trc tin xem thnh phn ang xt c trng tn vi mt thnh phn no ca lp dn xut khng? Nu trng th l thnh phn ca lp dn xut. Nu khng trng th tip tc xt cc lp c s theo th t: Cc lp c quan h gn vi lp dn xut xt trc, cc lp quan h xa xt sau. Hy ch trng hp sau: Thnh phn ang xt c mt ng thi trong 2 lp c s c cng mt ng cp quan h vi lp dn xut. Gp trng hp ny Chng trnh dch C++ khng th quyt nh c thnh phn ny tha k t lp no v buc phi a ra mt thng bo li (xem v d di y). Cch khc phc: Trng hp ny phi s dng thm tn lp nh trnh bytrong cch 1.
257 258

V d xt lp dn xut D. Lp D c 2 c s l cc lp A v B. Gi s cc lp A, B v D c nh ngha: class A { private: int n; float public: void nhap(); void xuat(): }; class B { private: a[20];

292

int m,n; float public: void nhap(); void xuat(): }; class D : public A, public B { private: int k; public: void nhap(); void xuat(): }; Hy ch cc im sau: 1. Dng cc phng thc ca cc lp A, B xy dng cc phng thc ca D // Xy dng phng thc nhap() void D::nhap() { cout << \n Nhap k : ; cin >> k ; // k l thuc tnh ca D A::nhap(); // Nhp cc thuc tnh m D tha k t A B::nhap(); // Nhp cc thuc tnh m D tha k t B } a[20][20];

293

// Xy dng phng thc xuat() void D::xuat() { cout << \n k = << k ; A::xuat(); // Xut cc thuc tnh m D tha k t A B::xuat(); // Xut cc thuc tnh m D tha k t B } 2. Lm vic vi cc i tng ca lp dn xut D h ; // Khai bo h l i tng ca lp D h.nhap() ; // tng tng vi h.D::nhap(); h.A::xuat(); // In gi tr cc thuc tnh h.A::n v h.A::a h.B::xuat(); // In gi tr cc thuc tnh h.B::m, h.B::n v h.B::a h.D::xuat() ; // In gi tr tt c cc thuc tnh ca h h.xuat() ; // tng ng vi h.D::xuat() ;

5. Cc lp c s o
5.1. Mt lp c s xut hin nhiu ln trong lp dn xut Mt iu hin nhin l khng th khai bo 2 ln cng mt lp trong danh sch ca cc lp c s cho mt lp dn xut. Chng hn v d sau l khng cho php: class B : public A, public A { }; Tuy nhin vn c th c trng hp cng mt lp c s c cp nhiu hn mt ln trong cc lp c s trung gian ca mt lp dn xut. V d:

294

#include <iostream.h> class A { public: int a; }; class B : public A { public: int b; }; class C : public A { public: int c; }; class D : public B , public C { public: int d; }; void main() { D h;

295

h.d = 4 ; // tt h.c = 3 ; // tt h.b = 2 ; // tt h.a = 1 ; // li } Trong v d ny A l c s cho c 2 lp c s trc tip ca D l B v C. Ni cch khc c 2 lp c s A cho lp D. V vy trong cu lnh: h.a = 1 ; th Chng trnh dch C++ khng th nhn bit c thuc tnh a tha k thng qua B hay thng qua C v n s a ra thng bo li sau: Member is ambiguous: A::a and A::a 5.2. Cc lp c s o Gii php cho vn ni trn l khai bo A nh mt lp c s kiu virtual cho c B v C. Khi B v C c nh ngha nh sau: class B : virtual public A { public: int b; }; class C : virtual public A { public: int c; };

296

Cc lp c s o (virtual) s c kt hp to mt lp c s duy nht cho bt k lp no dn xut t chng. Trong v d trn, hai lp c s A ( A l c s ca B v A l c s ca C) s kt hp li tr thnh mt lp c s A duy nht cho bt k lp dn xut no t B v C. Nh vy by gi D s ch c mt lp c s A duy nht, do php gn: h.a = 1 ; s gn 1 cho thuc tnh a ca lp c s A duy nht m D k tha.

6. Mt s v d v hm to, hm hu trong tha k nhiu mc


V d 1. V d ny minh ho cch xy dng hm to trong cc lp dn xut. Ngoi ra cn minh ho cch dng cc phng thc ca cc lp c s trong lp dn xut v cch x l cc i tng thnh phn. Xt 4 lp A, B, C v D. Lp C dn xut t B, lp D dn xut t C v c thnh phn l i tng kiu A. //CT5-06 // Thua ke nhieu muc // Ham tao #include <conio.h> #include <iostream.h> #include <string.h> class A { private: int a; char *str ; public:

297

A() { a=0; str=NULL; } A(int a1,char *str1) { a=a1; str=strdup(str1); } void xuat() { cout << "\n" << "So nguyen lop A= " << a << " Chuoi lop A: " << str ; } }; class B { private: int b; char *str ; public: B() { b=0; str=NULL; }

298

B(int b1,char *str1) { b=b1; str=strdup(str1); } void xuat() { cout << "\n" << "So nguyen lop B = " << b << " Chuoi lop B: " << str ; } }; class C : public B { private: int c; char *str ; public: C():B() { c=0; str=NULL; } C(int b1,char *strb,int c1, char *strc) : B(b1,strb) { c=c1; str=strdup(strc); }

299

void xuat() { B::xuat(); cout << "\n" << "So nguyen lop C = " << c << " Chuoi lop C: " << str ; } }; class D : public C { private: int d; char *str ; A public: D():C(),u() { d=0; str=NULL; } D(int a1, char *stra,int b1,char *strb,int c1, char *strc, int d1, char *strd) : u(a1,stra), C(b1,strb,c1,strc) { d=d1; str=strdup(strd); } void xuat() u;

300

{ u.xuat(); C::xuat(); cout << "\n" << "So nguyen lop D = " << d << " Chuoi lop D: " << str ; } }; void main() { D h(1,"AA",2,"BB",3,"CC",4,"DD"); clrscr(); cout << "\n\n Cac thuoc tinh cua h thua ke B: " ; h.B::xuat(); cout << "\n\n Cac thuoc tinh cua h thua ke B va C: " ; h.C::xuat(); cout << "\n\n Cac thuoc tinh cua h thua ke B,C va khai bao trong D:" ; h.xuat(); getch(); } V d 2. V d ny minh ho cch xy dng hm hu trong lp dn xut. Chng trnh trong v d ny ly t chng trnh ca v d 1, sau a thm vo cc hm hu. //CT5-07 // Thua ke nhieu muc // Ham tao

301

// Ham huy #include <conio.h> #include <iostream.h> #include <string.h> class A { private: int a; char *str ; public: A() { a=0; str=NULL; } A(int a1,char *str1) { a=a1; str=strdup(str1); } ~A() { cout <<"\n Huy A"; getch(); a=0; if (str!=NULL) delete str; }

302

void xuat() { cout << "\n" << "So nguyen lop A= " << a << " Chuoi lop A: " << str ; } }; class B { private: int b; char *str ; public: B() { b=0; str=NULL; } B(int b1,char *str1) { b=b1; str=strdup(str1); } ~B() { cout <<"\n Huy B"; getch(); b=0;

303

if (str!=NULL) delete str; } void xuat() { cout << "\n" << "So nguyen lop B = " << b << " Chuoi lop B: " << str ; } }; class C : public B { private: int c; char *str ; public: C():B() { c=0; str=NULL; } C(int b1,char *strb,int c1, char *strc) : B(b1,strb) { c=c1; str=strdup(strc); } ~C() {

304

cout <<"\n Huy C"; getch(); c=0; if (str!=NULL) delete str; } void xuat() { B::xuat(); cout << "\n" << "So nguyen lop C = " << c << " Chuoi lop C: " << str ; } }; class D : public C { private: int d; char *str ; A public: D():C(),u() { d=0; str=NULL; } D(int a1, char *stra,int b1,char *strb,int c1, char *strc, int d1, char *strd) : u(a1,stra), C(b1,strb,c1,strc) u;

305

{ d=d1; str=strdup(strd); } ~D() { cout <<"\n Huy D"; getch(); d=0; if (str!=NULL) delete str; } void xuat() { u.xuat(); C::xuat(); cout << "\n" << "So nguyen lop D = " << d << " Chuoi lop D: " << str ; } }; void main() { D *h; h = new D(1,"AA",2,"BB",3,"CC",4,"DD"); clrscr(); cout << "\n\n Cac thuoc tinh cua h thua ke B: " ; h->B::xuat();

306

cout << "\n\n Cac thuoc tinh cua h thua ke B va C: " ; h->C::xuat(); cout << "\n\n Cac thuoc tinh cua h thua ke B,C va khai bao trong D:" ; h->xuat(); delete h; // Lan luot goi toi cac ham huy cua cac lop D, A, C, B getch(); }

7. Ton t gn ca lp dn xut
7.1. Khi no cn xy dng ton t gn: Khi lp dn xut c cc thuc tnh (k c thuc tnh tha k t cc lp c s) l con tr, th nht thit khng c dng ton t gn mc nh, m phi xy dng cho lp dn xut mt ton t gn. 7.2. Cch xy dng ton t gn cho lp dn xut + Trc ht cn xy dng ton t gn cho cc lp c s + Vn mu cht l: Khi xy dng ton t gn cho lp dn xut th lm th no s dng c cc ton t gn ca lp c s. Cch gii quyt nh sau: - Xy dng cc phng thc (trong cc lp c s) nhn c a ch ca i tng n ca lp. Phng thc ny c vit n gin theo mu: Tn_lp * get_DT ( ) { return this ; } - Trong thn ca ton t gn (cho lp dn xut), s dng phng thc trn nhn a ch i tng ca lp c s m lp dn xut tha k. Sau thc hin php gn trn cc i tng ny.

307

Phng php nu trn c th minh ho mt cch hnh thc nh sau: Gi s lp B dn xut t A. xy dng ton t gn cho B, th: 1. Trong lp A cn xy dng ton t gn v phng thc cho a ch ca i tng n. C th A cn c nh ngha nh sau:

class A { ... A & operator=(A& h) { //cc cu lnh thc hin gn trong A } // Phng thc nhn a ch i tng n ca A A* get_A() { return this; } ... }; 2. Ton t gn trong lp B cn nh sau: class B : public A { ... B & operator=(B& h) {

308

A *u1, *u2; u1 = this->get_A(); u2 = h.get_A(); *u1 = *u2 ; // S dng php gn trong A gn cc // thuc tnh m B k tha t A //Cc cu lnh thc hin gn cc thuc tnh ring ca B } ... }; 7.3. V d Chng trnh di y minh ho cch xy dng ton t gn cho lp D c 2 lp c s l C v B (C l lp c s trc tip, cn B l c s ca C) . Ngoi ra D cn c mt thuc tnh l i tng ca lp A. //CT5-08 // Thua ke nhieu muc // gan #include <conio.h> #include <stdio.h> #include <iostream.h> #include <string.h> class A { private: int a;

309

char *str ; public: A() { a=0; str=NULL; } A& operator=(A& h) { this->a = h.a; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; } void nhap() { cout << "\nNhap so nguyen lop A: " ; cin >> a ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop A: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); } void xuat() {

310

cout << "\n" << "So nguyen lop A= " << a << " Chuoi lop A: " << str ; } }; class B { private: int b; char *str ; public: B() { b=0; str=NULL; } B* getB() { return this; } B& operator=(B& h) { this->b = h.b; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h;

311

} void nhap() { cout << "\nNhap so nguyen lop B: " ; cin >> b ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop B: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); } void xuat() { cout << "\n" << "So nguyen lop B = " << b << " Chuoi lop B: " << str ; } }; class C : public B { private: int c; char *str ; public: C():B() {

312

c=0; str=NULL; } C* getC() { return this; } C& operator=(C& h) { B *b1, *b2; b1= this->getB(); b2= h.getB(); *b1 = *b2; this->c = h.c; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; } void nhap() { B::nhap(); cout << "\nNhap so nguyen lop C: " ; cin >> c ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop C: " ; char tg[30];

313

fflush(stdin); gets(tg); str = strdup(tg); }

void xuat() { B::xuat(); cout << "\n" << "So nguyen lop C = " << c << " Chuoi lop C: " << str ; } }; class D : public C { private: int d; char *str ; A public: D():C(),u() { d=0; str=NULL; } D& operator=(D& h) { u;

314

this->u = h.u; C *c1,*c2; c1 = this->getC(); c2 = h.getC(); *c1 = *c2; this->d = h.d; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; } void nhap() { u.nhap(); C::nhap(); cout << "\nNhap so nguyen lop D: " ; cin >> d ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop D: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); } void xuat() { u.xuat();

315

C::xuat(); cout << "\n" << "So nguyen lop D = " << d << " Chuoi lop D: " << str ; } }; void main() { D h1,h2,h3; clrscr(); h1.nhap(); h3=h2=h1; cout<<"\n\nH2:"; h2.xuat(); cout<<"\n\nH3:"; h3.xuat(); h1.nhap(); cout<<"\n\nH2:"; h2.xuat(); cout<<"\n\nH3:"; h3.xuat(); cout<<"\n\nH1:"; h1.xuat(); getch(); }

316

8. Hm to sao chp ca lp dn xut


8.1. Khi no cn xy dng hm to sao chp: Khi lp dn xut c cc thuc tnh (k c thuc tnh tha k t cc lp c s) l con tr, th nht thit khng c dng hm to sao chp mc nh, m phi xy dng cho lp dn xut mt hm to sao chp. 8.2. Cch xy dng hm to sao chp cho lp dn xut + Trc ht cn xy dng ton t gn cho lp dn xut (xem 7). + Sau xy dng hm to sao chp cho lp dn xut theo mu: Tn_lp_dn_xut (Tn_lp_dn_xut &h ) { *this = h ; } 8.3. V d Chng trnh di y minh ho cch xy dng hm to sao chp cho lp D c 2 lp c s l C v B (C l lp c s trc tip, cn B l c s ca C) . Ngoi ra D cn c mt thuc tnh l i tng ca lp A. Chng trnh ny da trn chng trnh trong mc 7.3 vi 2 thay i: + Xy dng thm hm to sao chp cho lp D. + Thay i mt s cu lnh trong hm main s dng hm to sao chp. thy r vai tr ca hm to sao chp chng ta hy so snh kt qu nhn c trong 2 trng hp: C hm to sao chp v b i hm ny. //CT5-09 // Thua ke nhieu muc // Ham tao sao chep #include <conio.h>

317

#include <stdio.h> #include <iostream.h> #include <string.h> class A { private: int a; char *str ; public: A() { a=0; str=NULL; } A& operator=(A& h) { this->a = h.a; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; } void nhap() { cout << "\nNhap so nguyen lop A: " ; cin >> a ; if (str!=NULL) delete str;

318

cout << "\nNhap chuoi lop A: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); } void xuat() { cout << "\n" << "So nguyen lop A= " << a << " Chuoi lop A: " << str ; } }; class B { private: int b; char *str ; public: B() { b=0; str=NULL; } B* getB() { return this;

319

} B& operator=(B& h) { this->b = h.b; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; } void nhap() { cout << "\nNhap so nguyen lop B: " ; cin >> b ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop B: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); } void xuat() { cout << "\n" << "So nguyen lop B = " << b << " Chuoi lop B: " << str ; } }; class C : public B

320

{ private: int c; char *str ; public: C():B() { c=0; str=NULL; } C* getC() { return this; } C& operator=(C& h) { B *b1, *b2; b1= this->getB(); b2= h.getB(); *b1 = *b2; this->c = h.c; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; }

321

void nhap() { B::nhap(); cout << "\nNhap so nguyen lop C: " ; cin >> c ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop C: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); }

void xuat() { B::xuat(); cout << "\n" << "So nguyen lop C = " << c << " Chuoi lop C: " << str ; } }; class D : public C { private: int d; char *str ; A u;

322

public: D():C(),u() { d=0; str=NULL; } D(D& h) // Ham tao sao chep { *this=h; } D& operator=(D& h) { this->u = h.u; C *c1,*c2; c1 = this->getC(); c2 = h.getC(); *c1 = *c2; this->d = h.d; if (this->str!=NULL) delete this->str; this->str = strdup(h.str); return h; } void nhap() { u.nhap();

323

C::nhap(); cout << "\nNhap so nguyen lop D: " ; cin >> d ; if (str!=NULL) delete str; cout << "\nNhap chuoi lop D: " ; char tg[30]; fflush(stdin); gets(tg); str = strdup(tg); } void xuat() { u.xuat(); C::xuat(); cout << "\n" << "So nguyen lop D = " << d << " Chuoi lop D: " << str ; } }; void main() { D h1; clrscr(); h1.nhap(); D h2(h1); cout<<"\n\nH2:"; h2.xuat();

324

h1.nhap(); cout<<"\n\nH2:"; h2.xuat(); cout<<"\n\nH1:"; h1.xuat(); getch(); }

9. Pht trin, hon thin chng trnh


C th dng tnh tha k pht trin kh nng ca chng trnh. 9.1. tng ca vic pht trin chng trnh nh sau: Sau khi xy dng c mt lp, ta s pht trin lp ny bng cch xy mt lp dn xut trong a thm cc thuc tnh v phng thc mi. Qu trnh trn li tip tc vi lp va nhn c. Ta cng c th xy dng cc lp mi c thuc tnh l i tng ca cc lp c. Bng cch ny, s nhn c mt dy cc lp cng ngy cng hon thin v c nhiu kh nng hn. 9.2. V d v vic pht trin chng trnh Gi s cn xy dng chng trnh v mt s hnh phng. Chng ta c th pht trin chng trnh ny nh sau: u tin nh ngha lp DIEM (im) gm 2 thuc tnh x, y. T lp DIEM xy dng lp DUONG_TRON (ng trn) bng cch b sung 2 bin nguyn l r (bn knh) v md (mu ng). T lp DUONG_TRON xy dng lp HINH_TRON bng cch thm vo bin nguym mt (mu t). i theo mt nhnh khc: Xy dng lp DOAN_THANG (on thng) gm 2 i tng kiu DIEM, v lp TAM_GIAC gm 3 i tng DIEM. Chng trnh di y cho php v cc ng trn, hnh trn, on thng v hnh tam gic. Chng trnh cn minh ho cch dng con tr this trong lp dn xut thc hin cc phng thc ca lp co s. Ngoi ra cn minh ho cch dng ton t ch s [] nhn cc to x, y t cc i tng ca lp DIEM.

325

//CT5-10 // Phat trien chuong trinh #include <conio.h> #include <stdio.h> #include <iostream.h> #include <string.h> #include <graphics.h> class DIEM { private: int x,y; public: DIEM() { x=y=0; } DIEM(int x1, int y1) { x=x1; y=y1; } DIEM(DIEM &d) { this->x= d.x; this->y= d.y;

326

} int operator[](int i) { if (i==1) return x; else return y; } }; class DUONG_TRON : public DIEM { private: int r,md; public: DUONG_TRON() : DIEM() { r=md=0; } DUONG_TRON(DIEM d, int r1, int md1) : DIEM(d) { r=r1; md=md1; } void ve() { setcolor(md); circle ( (*this)[1],(*this)[2],r);

327

} int getmd() { return md; } }; class HINH_TRON : public DUONG_TRON { private: int mt; public: HINH_TRON() : DUONG_TRON() { mt=0; } HINH_TRON(DIEM d, int r1, int md1, int mt1) : DUONG_TRON(d,r1,md1) { mt=mt1; } void ve() { DUONG_TRON::ve(); setfillstyle(1,mt);

328

floodfill((*this)[1],(*this)[2],this->getmd()); } }; class DOAN_THANG { private: DIEM d1, d2; int md; public: DOAN_THANG() : d1(), d2() { md=0; } DOAN_THANG(DIEM t1, DIEM t2, int md1) { d1=t1; d2 = t2; md=md1; } void ve() { setcolor(md); line(d1[1],d1[2] ,d2[1],d2[2]); } }; class TAM_GIAC

329

{ private: DIEM d1,d2,d3; int md, mt; public: TAM_GIAC(): d1(), d2(), d3() { md=mt=0; } TAM_GIAC(DIEM t1,DIEM t2,DIEM t3,int md1,int mt1) { d1=t1; d2=t2; d3 = t3; md=md1;mt=mt1; } void ve() { DOAN_THANG(d1,d2,md).ve(); DOAN_THANG(d1,d3,md).ve(); DOAN_THANG(d2,d3,md).ve(); setfillstyle(1,mt); floodfill((d1[1]+d2[1]+d3[1])/3,(d1[2]+d2[2]+d3[2])/3,md); } }; void ktdh() {

330

int mh=0,mode=0; initgraph(&mh,&mode,""); } void main() { ktdh(); DUONG_TRON dt(DIEM(100,100),80,MAGENTA); HINH_TRON ht(DIEM(400,100),80,RED,YELLOW); DOAN_THANG t(DIEM(100,100),DIEM(400,100),BLUE); TAM_GIAC tg(DIEM(250,150), DIEM(100,400), DIEM(400,400), CYAN, CYAN); dt.ve(); ht.ve(); t.ve(); tg.ve(); getch(); closegraph(); }

10. B sung, nng cp chng trnh


C th dng tnh tha k sa i, b sung, nng cp chng trnh. 10.1. tng ca vic nng cp chng trnh nh sau: Gi s c mt chng trnh hot ng tt. By gi cn c mt s b sung thay i khng nhiu lm. C 2 gii php: Hoc sa

331

cha cc lp ang hot ng n nh, hoc xy dng mt lp dn xut thc hin cc b sung, sa cha trn lp ny. R rng gii php th 2 t ra hp l hn . 10.2. V d Gi s c chng trnh qun l gio vin gm 3 lp MON_HOC (Mn hc), GV (Gio vin) v BM (B mn) : class MON_HOC { private: char tenmh[20] ; // Tn mn hc int public: MON_HOC() ; // Hm to const MON_HOC& operator=(const MON_HOC& m) ; // Gn void nhap() ; // Nhp void xuat() ; // Xut }; class GV { private: char ht[25]; // Ho ten int ns; int sm; // Nam sinh // So mon hoc co the day sotiet ; // S tit

MON_HOC *mh ; //Danh sach cac mon hoc

332

public: GV() ; // Hm to ~GV() ; //Hm hu int getsm() ; // Cho bit s mn (dng trong BM::sapxep) const GV& operator=(const GV& g); // Gn (dng trong // BM::sapxep) void nhap(); // Nhp void xuat(); // Xut }; class BM { private: char tenbm[20]; // Tn b mn int n; // So giao vien GV *gv; // Danh sach giao vien public: BM() // Hm to void nhap(); // Nhp void xuat(); // Xut void sapxep(); // Sp xp }; Chng trnh cho php: 1. Nhp danh sch gio vin ca b mn. // Bo mon

333

2. Sp xp danh sch gio vin theo th t gim ca s mn m mi gio vin c th ging dy. 3. In danh sch gio vin.

Ni dung chng trnh nh sau: //CT5-11 // Nang cap chuong trinh // CT ban dau #include <conio.h> #include <stdio.h> #include <iostream.h> #include <string.h> class MON_HOC { private: char tenmh[20]; int sotiet; public: MON_HOC() { tenmh[0]=sotiet=0; } const MON_HOC& operator=(const MON_HOC& m) {

334

strcpy(this->tenmh,m.tenmh); this->sotiet = m.sotiet; return m; } void nhap() { cout << "\nTen mon hoc:"; fflush(stdin); gets(tenmh); cout << "So tiet: " ; cin >> sotiet; } void xuat() { cout << "\nTen mon hoc:" << tenmh << " so tiet: " << sotiet; } }; class GV { private: char ht[25]; // Ho ten int ns; int sm; // Nam sinh // So mon hoc co the day

MON_HOC *mh ; //Danh sach cac mon hoc

335

public: GV() { ht[0]= ns= sm= 0 ; mh = NULL; } ~GV() { ht[0]= ns= sm= 0 ; if (mh) delete mh; } int getsm() { return sm; } const GV& operator=(const GV& g); void nhap(); void xuat(); }; const GV& GV::operator=(const GV& g) { strcpy(this->ht,g.ht); this->ns=g.ns; int n = g.sm;

336

this->sm = n; if (this->mh) delete this->mh; if (n) { this->mh = new MON_HOC[n+1]; for (int i=1; i<=n; ++i) this->mh[i] = g.mh[i]; } return g; } void GV::nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "Nam sinh: " ; cin >> ns; cout << "So mon co the giang day: " ; cin >> sm; if (this->mh) delete this->mh; if(sm) { this->mh = new MON_HOC[sm+1]; for (int i=1; i<=sm; ++i) this->mh[i].nhap();

337

} } void GV::xuat() { cout << "\nHo ten: " << ht ; cout << "\nNam sinh: " << ns ; cout << "\nSo mon co the giang day: " << sm; if (sm) { cout << "\n Do la: "; for (int i=1; i<=sm; ++i) this->mh[i].xuat(); } } class BM { private: char tenbm[20]; int n; // So giao vien GV *gv; // Danh sach giao vien public: BM() { tenbm[0] = n = 0; // Bo mon

338

gv = NULL; } void nhap(); void xuat(); void sapxep(); }; void BM::nhap() { cout << "\n\nTen bo mon: " ; fflush(stdin); gets(tenbm); cout << "So giao vien: "; cin >> n; if (gv) delete gv; if (n) { gv = new GV[n+1]; for (int i=1; i<=n; ++i) gv[i].nhap(); } } void BM::xuat() { cout << "\nBo mon: " << tenbm; cout << "\nSo giao vien: " << n;

339

if (n) { cout << "\n Danh sach giao vien cua bo mon:"; for (int i=1; i<=n; ++i) gv[i].xuat(); } } void BM::sapxep() { GV tg; int i,j; if (n) for (i=1;i<n;++i) for (j=i+1;j<=n;++j) if (gv[i].getsm()<gv[j].getsm()) { tg=gv[i]; gv[i]=gv[j]; gv[j]=tg; } } void main() { BM b; b.nhap(); b.sapxep();

340

b.xuat(); getch(); } Vn t ra l: Hin nay cc gio vin bt u hng dn lun vn tt nghip cho sinh vin. V vy cn b sung thng tin ny vo phn d liu gio vin. nng cp chng trnh chng ta s nh ngha lp GV2 dn xut t lp GV, sau trong lp BM s thay GV bng GV2. C 2 ch cn b sung v mt ch cn sa i nh sau: 1. B sung trong lp GV phng thc: GV* getGV() { return this; } Phng thc ny dng xy dng ton t gn cho lp GV2. 2. Trong lp BM thay GV bng GV2. iu ny c th t c bng sa cha trc tip hoc bng mt cu lnh #define : #define GV GV2 3. nh ngha thm 2 lp: LV (Lun vn) v GV2 (Lp GV2 dn xut t lp GV) nh sau: class LV // Luan van { private: char tenlv[30]; // Ten luan van char tensv[25]; // Ten sinh vien int nambv; public: LV() ; // Hm to // Nam bao ve luan van

341

const LV& operator=(const LV& l) ; // Gn void nhap() ; // Nhp void xuat() ; }; class GV2 : public GV { private: int solv; // S lun vn hng dn LV *lv; // Danh sch lun vn public: GV2(); // Hm to ~GV2() ; // Hm hu GV2& operator=(GV2& g); // Gn void nhap(); // Nhp void xuat(); // Xut };

Chng trnh nng cp nh sau: //CT5-12B // Nang cap chuong trinh // CT nang cap #include <conio.h> #include <stdio.h> #include <iostream.h>

342

#include <string.h> class MON_HOC { private: char tenmh[20]; int sotiet; public: MON_HOC() { tenmh[0]=sotiet=0; } const MON_HOC& operator=(const MON_HOC& m) { strcpy(this->tenmh,m.tenmh); this->sotiet = m.sotiet; return m; } void nhap() { cout << "\nTen mon hoc:"; fflush(stdin); gets(tenmh); cout << "So tiet: " ; cin >> sotiet; }

343

void xuat() { cout << "\nTen mon hoc:" << tenmh << " so tiet: " << sotiet; } }; // Bo sung phuong thuc getGV cho lop GV // dung de xay dung toan tu gan cho lop GV2 class GV { private: char ht[25]; // Ho ten int ns; int sm; // Nam sinh // So mon hoc co the day

MON_HOC *mh ; //Danh sach cac mon hoc public: GV() { ht[0]= ns= sm= 0 ; mh = NULL; } ~GV() { ht[0]= ns= sm= 0 ;

344

if (mh) delete mh; } // Bo sung phuong thuc getGV GV* getGV() { return this; } int getsm() { return sm; } const GV& operator=(const GV& g); void nhap(); void xuat(); }; const GV& GV::operator=(const GV& g) { strcpy(this->ht,g.ht); this->ns=g.ns; int n = g.sm; this->sm = n; if (this->mh) delete this->mh; if (n) {

345

this->mh = new MON_HOC[n+1]; for (int i=1; i<=n; ++i) this->mh[i] = g.mh[i]; } return g; } void GV::nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "Nam sinh: " ; cin >> ns; cout << "So mon co the giang day: " ; cin >> sm; if (this->mh) delete this->mh; if (sm) { this->mh = new MON_HOC[sm+1]; for (int i=1; i<=sm; ++i) this->mh[i].nhap(); } } void GV::xuat() {

346

cout << "\nHo ten: " << ht ; cout << "\nNam sinh: " << ns ; cout << "\nSo mon co the giang day: " << sm; if (sm) { cout << "\n Do la: "; for (int i=1; i<=sm; ++i) this->mh[i].xuat(); } }

// Bo sung cac lop LV va GV2 class LV // Luan van { private: char tenlv[30]; // Ten luan van char tensv[25]; // Ten sinh vien int nambv; public: LV() { tenlv[0]=tensv[0] = nambv = 0; } const LV& operator=(const LV& l) // Nam bao ve luan van

347

{ strcpy(this->tenlv,l.tenlv); strcpy(this->tensv,l.tensv); this->nambv = l.nambv ; return l; } void nhap() { cout << "\nTen luan van:"; fflush(stdin); gets(tenlv); cout << "Ten sinh vien:"; fflush(stdin); gets(tensv); cout << "Nam bao ve: " ; cin >> nambv ; } void xuat() { cout << "\nTen lan van:" << tenlv << " Sinh vien: " << tensv

<< " Nam bao ve: " << nambv; } }; class GV2 : public GV {

348

private: int solv; LV *lv; public: GV2():GV() { solv = 0 ; lv = NULL; } ~GV2() { if (solv) delete lv; } GV2& operator=(GV2& g); void nhap(); void xuat(); }; GV2& GV2::operator=(GV2& g) { GV *g1, *g2; g1 = this->getGV(); g2 = g.getGV(); *g1 = *g2; int n = g.solv;

349

this->solv = n; if (this->lv) delete this->lv; if (n) { this->lv = new LV[n+1]; for (int i=1; i<=n; ++i) this->lv[i] = g.lv[i]; } return g; } void GV2::nhap() { GV::nhap(); cout << "So luan van da huong dan: " ; cin >> solv; if (this->lv) delete this->lv; if (solv) { this->lv = new LV[solv+1]; for (int i=1; i<=solv; ++i) this->lv[i].nhap(); } } void GV2::xuat()

350

{ GV::xuat(); cout << "\nSo luan van da huong dan: " << solv; if (solv) { cout << "\n Do la: "; for (int i=1; i<=solv; ++i) this->lv[i].xuat(); } } // Sua lop BM: thay GV bang GV2 #define GV GV2 class BM { private: char tenbm[20]; int n; // So giao vien GV *gv; // Danh sach giao vien public: BM() { tenbm[0] = n = 0; gv = NULL; } // Bo mon

351

void nhap(); void xuat(); void sapxep(); }; void BM::nhap() { cout << "\n\nTen bo mon: " ; fflush(stdin); gets(tenbm); cout << "So giao vien: "; cin >> n; if (gv) delete gv; if (n) { gv = new GV[n+1]; for (int i=1; i<=n; ++i) gv[i].nhap(); } } void BM::xuat() { cout << "\nBo mon: " << tenbm; cout << "\nSo giao vien: " << n; if (n) {

352

cout << "\n Danh sach giao vien cua bo mon:"; for (int i=1; i<=n; ++i) gv[i].xuat(); } } void BM::sapxep() { GV tg; int i,j; if (n) for (i=1;i<n;++i) for (j=i+1;j<=n;++j) if (gv[i].getsm()<gv[j].getsm()) { tg=gv[i]; gv[i]=gv[j]; gv[j]=tg; } } #undef GV void main() { BM b; b.nhap(); b.sapxep(); b.xuat();

353

getch(); }

11. T khi qut n c th


Tnh tha k cng thng dng thit k cc bi ton theo hng t khi qut n c th, t chung n ring. u tin a ra cc lp m t nhng i tng chung, sau dn xut ti cc i tng ngy mt c th hn. Mt trng hp khc cng thng gp l: Qun l nhiu thc th c nhng phn d liu chung. Khi ta c th xy dng mt lp c s gm cc phn d liu chung. Mi thc th s c m t bng mt lp dn xut t lp c s ny. Sau y l mt s v d minh ho: V d 1 (minh ho t tng i t khi qut n c th) : Gi s cn qun l sinh vin ca mt trng i hc. Khi ta c th bt u t lp SINH_VIEN (Sinh vin). Sau dng n lm c s dn xut ti cc lp m t cc i tng sinh vin c th hn, v d: SV Tin, SV Ton, SV Lut, SV Du lch, ... Cc bi ton kiu nh vy rt thng gp trong thc t. V d 2 (minh ho phn chung ca nhiu thc th). Gi s cn xy dng phn mm thc hin cc php tnh v ma trn vung v vc t cp n. Ta c nhn xt l n chung cho c vc t v ma trn. Hn na n cn chung cho tt c cc ma trn v vc t cng xt trong bi ton. V vy c th nh ngha mt lp c s ch c mt thuc tnh tnh (static) n. Cc lp ma trn, vc t dn xut t lp ny v s dng chung cng mt gi tr n. Di y l chng trnh thc hin cc php ton ma trn, vc t. Chng trnh c t chc thnh 3 lp: Lp CAP (Cp ma trn, vc t) gm mt thnh phn tnh n v phng thc nhp n. Lp VT (Vc t) c mt thuc tnh l mng mt chiu (cha cc phn t ca vc t) v cc phng thc nhp, xut. Lp MT (Ma trn) c mt thuc tnh l mng 2 chiu (cha cc phn t ca ma trn) , cc phng thc nhp, xut v nhn. Lp MT l bn ca lp VT.

354

Chng trnh s nhp mt ma trn, nhp mt vc t v tnh tch ca chng. //CT5-13 // ma tran vec to // Dng thuc tnh static #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class CAP; class MT; class VT; class CAP { private: static int n; public: void nhap() { int ch; if (n==0) { cout << "\nN= "; cin >> n; } else

355

{ cout <<"\n Hien n = " << n; cout << "\n Co thay doi n? - C/K"; ch=toupper(getch()); if (ch=='C') { cout << "\nN= "; cin >> n; } } } int getN() { return n; } }; int CAP::n=0; class MT : public CAP { private: double a[20][20]; public: void nhap(); void xuat(); VT operator*(VT x);

356

}; class VT : public CAP { private: double x[20]; public: friend class MT; void nhap(); void xuat(); }; void MT::nhap() { int n,i,j; n = this->getN(); if (n==0) { this->CAP::nhap(); n = this->getN(); } for (i=1; i<=n; ++i) for (j=1; j<=n; ++j) { cout << " PT hang " << i << " cot " << j << " = "; cin >> a[i][j];

357

} } void MT::xuat() { int n,i,j; n = this->getN(); if (n) for (int i=1; i<=n; ++i) { cout << "\n" ; for (int j=1; j<=n; ++j) cout << a[i][j] << " "; } } VT MT::operator*(VT x) { VT y; int n,i,j; n = this->getN(); for (i=1; i<=n; ++i) { y.x[i]=0; for (j=1; j<=n; ++j) y.x[i] += a[i][j]*x.x[j];

358

} return y; } void VT::nhap() { int n,i; n = this->getN(); if (n==0) { this->CAP::nhap(); n = this->getN(); } for (i=1; i<=n; ++i) { cout << " PT thu " << i << " = "; cin >> x[i]; } } void VT::xuat() { int n,i; n = this->getN(); if (n) {

359

cout << "\n"; for (int i=1; i<=n; ++i) { cout << x[i] << " "; } } } void main() { MT a; VT x,y; clrscr(); cout<<"\nNhap ma tran A:"; a.nhap(); cout<<"\n\nNhap Vec to X:\n"; x.nhap(); y = a*x; cout<<"\n\nMa tran A"; a.xuat(); cout<<"\n\nVec to X"; x.xuat(); cout<<"\n\nVec to Y=AX"; y.xuat(); getch(); }

360

12. Ton th v b phn


Thng thng khi xem xt, gii quyt mt bi ton, ta thng chia n thnh cc bi ton nh hn. Ni cch khc: Mt bi ton ln bao gm nhiu bi ton b phn. Khi ta c th nh ngha cc lp cho cc bi ton b phn. Lp cho bi ton chung c dn xut t cc lp ni trn. Xt mt th d n gin l bi ton qun l th vin. N gm 2 bi ton b phn l qun l sch v qun l c gi. Chng ta s xy dng lp SACH v lp DOC_GIA. Sau dng cc lp ny lm c s xy dng lp THU_VIEN.

Chng 6 Tng ng Bi V Phng Thc o


Tng ng bi v phng thc o l cng c mnh ca C++ cho php t chc qun l cc i tng khc nhau theo cng mt lc . Mt khi nim khc lin quan l: lp c s tru tng. Chng ny s trnh bycch s dng cc cng c trn xy dng chng trnh qun l nhiu i tng khc nhau theo mt lc thng nht.

1. Phng thc tnh


1.1. Li gi ti phng thc tnh Nh bit mt lp dn xut c tha k cc phng thc ca cc lp c s tin bi ca n. V d lp A l c s ca B, lp B li l c s ca C, th C c 2 lp c s tin bi l B v A. Lp C c tha k cc phng thc ca A v B. Cc phng thc m chng ta vn ni l cc phng thc tnh. tm hiu thm v cch gi ti cc phng thc tnh, ta xt v d v cc lp A, B v C nh sau: class A {

361

public: void xuat() { cout << "\n Lop A " ; } }; class B:public A { public: void xuat() { cout << "\n Lop B " ; } }; class C:public B { public: void xuat() { cout << "\n Lop C " ; } }; Lp C c 2 lp c s tin bi l A , B v C k tha cc phng thc ca A v B. Do mt i tng ca C s c ti 3 phng thc xuat. Hy theo ri cc cu lnh sau:

362

C h ; // h l i tng kiu C h.xuat() ; // Gi ti phng thc h.D::xuat() h.B::xuat() ; // Gi ti phng thc h.B::xuat() h.A::xuat() ; // Gi ti phng thc h.A::xuat() Cc li gi phng thc trong v d trn u xut pht t i tng h v mi li gi u xc nh r phng thc cn gi. By gi chng ta hy xt cc li gi khng phi t mt bin i tng m t mt con tr. Xt cc cu lnh: A *p, *q, *r; // p, q, r l con tr kiu A A a; // a l i tng kiu A

B b; // b l i tng kiu B C c; // c l i tng kiu c Chng ta hy ghi nh mnh sau v con tr ca cc lp dn xut v c s: Php gn con tr: Con tr ca lp c s c th dng cha a ch cc i tng ca lp dn xut. Nh vy c 3 php gn sau u hp l: p = &a ; q = &b ; r = &c ;

Chng ta tip tc xt cc li gi phng thc t cc con tr p, q, r: p->xuat(); q->xuat(); r->xuat();

363

v hy l gii xem phng thc no (trong cc phng thc A::xuat, B::xuat v C::xuat) c gi. Cu tr li nh sau: C 3 cu lnh trn u gi ti phng thc A::xuat() , v cc con tr p, q v r u c kiu A. Nh vy c th tm lc cch thc gi cc phng thc tnh nh sau: Quy tc gi phng thc tnh: Li gi ti phng thc tnh bao gi cng xc nh r phng thc no (trong s cc phng thc trng tn ca cc lp c quan h tha k) c gi: 1. Nu li gi xut pht t mt i tng ca lp no, th phng thc ca lp s c gi. 2. Nu li gi xut pht t mt con tr kiu lp no, th phng thc ca lp s c gi bt k con tr cha a ch ca i tng no. 1.2. V d Xt 4 lp A, B, C v D. Lp B v C c chung lp c s A. Lp D dn xut t C. C 4 lp u c phng thc xuat(). Xt hm: void hien(A *p) { p->xuat(); } Khng cn bit ti a ch ca i tng no s truyn cho i con tr p, li gi trong hm lun lun gi ti phng thc A::xuat() v con tr p kiu A. 319 vy bn cu 320 Nh lnh: hien(&a); hien(&b); hien(&c); hien(&d); trong hm main (ca chng trnh di y) u gi ti A::xuat(). //CT6-01 // Phuong thuc tinh

364

#include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class A { private: int n; public: A() { n=0; } A(int n1) { n=n1; } void xuat() { cout << "\nLop A: "<< n; } int getN() { return n;

365

} }; class B:public A { public: B():A() { } B(int n1):A(n1) { } void xuat() { cout << "\nLop B: "<<getN(); } }; class C:public A { public: C():A() { } C(int n1):A(n1) {

366

} void xuat() { cout << "\nLop C: "<<getN(); } }; class D:public C { public: D():C() { } D(int n1):C(n1) { } void xuat() { cout << "\nLop D: "<<getN(); } }; void hien(A *p) { p->xuat(); }

367

void main() { A a(1); B b(2); C c(3); D d(4); clrscr(); hien(&a); hien(&b); hien(&c); hien(&d); getch(); }

2. S hn ch ca phng thc tnh


V d sau cho thy s hn ch ca phng thc tnh trong vic s dng tnh tha k pht trin chng trnh. Gi s cn xy dng chng trnh qun l th sinh. Mi th sinh a vo ba thuc tnh: H tn, s bo danh v tng im. Chng trnh gm ba chc nng: Nhp d liu th sinh, in d liu th sinh ra my in v xem - in (in h tn ra mn hnh, sau la chn hoc in hoc khng). Chng trnh di y s dng lp TS (Th sinh) p ng c yu cu t ra. //CT6-02 // Han che phuong thuc tinh // Lop TS #include <conio.h>

368

#include <stdio.h> #include <iostream.h> #include <ctype.h> class TS { private: char ht[25]; int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } void in() { fprintf(stdprn,"\n\nHo ten: %s", ht); fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nTong diem: %0.1f", td);

369

} void xem_in() { int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); if (ch=='C') this->in(); } }; void main() { TS t[100]; int i, n; cout << "\nSo thi sinh: "; cin >> n; for (i=1; i<=n; ++i) t[i].nhap(); for (i=1; i<=n; ++i) t[i].xem_in(); getch(); }

370

Gi s Nh trng mun qun l thm a ch ca th sinh. V s thay i y l khng nhiu, nn chng ta khng ng n lp TS m xy dng lp mi TS2 dn xut t lp TS. Trong lp TS2 a thm thuc tnh dc (a ch) v cc phng thc nhap, in. C th lp TS2 c nh ngha nh sau: class TS2:public TS { private: char dc[30] ; // Dia chi public: void nhap() { TS::nhap(); cout << "Dia chi: " ; fflush(stdin); gets(dc); } void in() { TS::in(); fprintf(stdprn,"\nDia chi: %s", dc); } }; Trong lp TS2 khng xy dng li phng thc xem_in, m s dng phng thc xem_in ca lp TS. Chng trnh mi nh sau: //CT6-03 // Han che phuong thuc tinh

371

// Lop TS TS2 #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class TS { private: char ht[25]; int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } void in() { fprintf(stdprn,"\n\nHo ten: %s", ht);

372

fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nTong diem: %0.1f", td); } void xem_in() { int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); if (ch=='C') this->in(); //Goi den TS::in() (Vi this la con tro //kieu TS) } }; class TS2:public TS { private: char dc[30] ; // Dia chi public: void nhap() { TS::nhap(); cout << "Dia chi: " ; fflush(stdin); gets(dc);

373

} void in() { TS::in(); fprintf(stdprn,"\nDia chi: %s", dc); } }; void main() { TS2 t[100]; int i, n; cout << "\nSo thi sinh: "; cin >> n; for (i=1; i<=n; ++i) t[i].nhap(); for (i=1; i<=n; ++i) t[i].xem_in(); getch(); } Khi thc hin chng trnh ny, chng ta nhn thy: D liu in ra vn khng c a ch. iu ny c th gii thch nh sau: Xt cu lnh (th 2 t di ln trong hm main): t[i].xem_in() ;

374

Cu lnh ny gi ti phng thc xem_in ca lp TS2 (v t[i] l i tng ca lp TS2). Nhng lp TS2 khng nh ngha phng thc xem_in, nn phng thc TS::xem_in() s c gi ti. Hy theo ri phng thc ny: void xem_in() { int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); if(ch=='C') this->in(); //Goi den TS::in() (Vi this la con tro kieu TS) } Cc lnh u ca phng thc s in h tn th sinh. Nu chn c (bm phm C), th cu lnh: this->in() ; s c thc hin. Mc d a ch ca t[i] (l i tng ca lp TS2) c truyn cho con tr this, th nhng cu lnh ny lun lun gi ti phng thc TS::in(), v con tr this y c kiu TS v v in() l phng thc tnh. Kt qu l khng in c a ch ca th sinh. Nh vy vic s dng cc phng thc tnh in() (trong cc lp TS v TS2) khng p ng c yu cu pht trin chng trnh. C mt gii php rt n gin l: nh ngha cc phng thc in() trong cc lp TS v TS2 nh cc phng thc o (virtual).

3. Phng thc o v tng ng bi


3.1. Cch nh ngha phng thc o Gi s A l lp c s, cc lp B, C, D dn xut (trc tip hoc dn tip) t A. Gi s trong 4 lp trn u c cc phng thc trng dng tiu (trng kiu, trng tn, trng cc i). nh ngha cc phng thc ny l cc phng thc o, ta ch cn:

375

+ Hoc thm t kho virtual vo dng tiu ca phng thc bn trong nh ngha lp c s A. + Hoc thm t kho virtual vo dng tiu bn trong nh ngha ca tt c cc lp A, B, C v D. V d: Cch 1: class A { ... virtual void hien_thi() { cout << \n y l lp A ; }; }; class B : public A { ... void hien_thi() { cout << \n y l lp B ; }; }; class C : public B { ...

376

void hien_thi() { cout << \n y l lp C ; }; }; class D : public A { ... void hien_thi() { cout << \n y l lp D ; }; }; Cch 2: class A { ... virtual void hien_thi() { cout << \n y l lp A ; }; }; class B : public A {

377

... virtual void hien_thi() { cout << \n y l lp B ; }; }; class C : public B { ... virtual void hien_thi() { cout << \n y l lp C ; }; }; class D : public A { ... virtual void hien_thi() { cout << \n y l lp D ; }; }; Ch : T kho virtual khng c t bn ngoi nh ngha lp. V d nu vit nh sau l sai (CTBD s bo li).

378

class A { ... virtual void hien_thi() ; }; virtual void hien_thi() // Sai { cout << \n y l lp A ; }; Cn sa li nh sau: class A { ... virtual void hien_thi() ; }; void hien_thi() // ng { cout << \n y l lp A ; }; 3.2. Quy tc gi phng thc o c s so snh vi phng thc tnh, ta nhc li quy tc gi phng thc tnh nu trong 1. 3.2.1. Quy tc gi phng thc tnh Li gi ti phng thc tnh bao gi cng xc nh r phng thc no (trong s cc phng thc trng tn ca cc lp c quan h tha k) c gi:

379

1. Nu li gi xut pht t mt i tng ca lp no, th phng thc ca lp s c gi. 2. Nu li gi xut pht t mt con tr kiu lp no, th phng thc ca lp s c gi bt k con tr cha a ch ca i tng no. 3.2.2. Quy tc gi phng thc o Phng thc o ch khc phng thc tnh khi c gi t mt con tr (trng hp 2 nu trong mc 3.2.1). Li gi ti phng thc o t mt con tr cha cho bit r phng thc no (trong s cc phng thc o trng tn ca cc lp c quan h tha k) s c gi. iu ny ph thuc vo i tng c th m con tr ang tr ti: Con tr ang tr ti i tng ca lp no th phng thc ca lp s c gi. V d A, B, C v D l cc lp nh ngha trong 3.1. Ta khai bo mt con tr kiu A v 4 i tng: A *p ; // p l con tr kiu A A a ; // a l bin i tng kiu A B b ; // b l bin i tng kiu B C c ; // c l bin i tng kiu C D d ; // d l bin i tng kiu D Xt li gi ti cc phng thc o hien_thi sau: p = &a; // p tr ti i tng a ca lp A

p->hien_thi() ; // Gi ti A::hien_thi() p = &b; // p tr ti i tng b ca lp B

p->hien_thi() ; // Gi ti B::hien_thi() p = &c; // p tr ti i tng c ca lp C

p->hien_thi() ; // Gi ti C::hien_thi() p = &d; // p tr ti i tng d ca lp D

p->hien_thi() ; // Gi ti D::hien_thi()

380

3.3. Tng ng bi Chng ta nhn thy cng mt cu lnh p->hien_thi(); tng ng vi nhiu phng thc khc nhau. y chnh l tng ng bi. Kh nng ny r rng cho php x l nhiu i tng khc nhau, nhiu cng vic, thm ch nhiu thut ton khc nhau theo cng mt cch thc, cng mt lc . iu ny s c minh ho trong cc mc tip theo. 3.4. Lin kt ng C th so snh s khc nhau gi phng thc tnh v phng thc o trn kha cnh lin kt mt li gi vi mt phng thc. Tr li v d trong 3.2: A *p ; // p l con tr kiu A A a ; // a l bin i tng kiu A B b ; // b l bin i tng kiu B C c ; // c l bin i tng kiu C D d ; // d l bin i tng kiu D Nu hien_thi() l cc phng thc tnh, th d p cha a ch ca cc i tng a, b, c hay d, th li gi: p->hien_thi() ; lun lun gi ti phng thc A::hien_thi() Nh vy mt li gi (xut pht t con tr) ti phng thc tnh lun lun lin kt vi mt phng thc c nh v s lin kt ny xc nh trong qu trnh bin dch chng trnh. Cng vi li gi: p->hien_thi() ; nh trn, nhng nu hien_thi() l cc phng thc o, th li gi ny khng lin kt cng vi mt phng thc c th no. Phng thc m n lin kt (gi ti) cn cha xc nh trong giai on dch chng trnh. Li gi ny s:

381

+ lin kt vi A::hien_thi() , nu p cha a ch i tng lp A + lin kt vi B::hien_thi() , nu p cha a ch i tng lp B + lin kt vi C::hien_thi() , nu p cha a ch i tng lp C + lin kt vi D::hien_thi() , nu p cha a ch i tng lp D Nh vy mt li gi (xut pht t con tr) ti phng thc o khng lin kt vi mt phng thc c nh, m tu thuc vo ni dung con tr. l s lin kt ng v phng thc c lin kt (c gi) thay i mi khi c s thay i ni dung con tr trong qu trnh chy chng trnh. 3.5. Quy tc gn a ch i tng cho con tr lp c s + Nh ni trong 1, C++ cho php gn a ch i tng ca mt lp dn xut cho con tr ca lp c s. Nh vy cc php gn sau (xem 3.2) l ng: A *p ; // p l con tr kiu A A a ; // a l bin i tng kiu A B b ; // b l bin i tng kiu B C c ; // c l bin i tng kiu C D d ; // d l bin i tng kiu D p = &a; // p v a cng lp A

p = &b; // p l con tr lp c s, b l i tng lp dn xut p = &c; // p l con tr lp c s, c l i tng lp dn xut p = &d; // p l con tr lp c s, d l i tng lp dn xut + Tuy nhin cn ch l: Khng cho php gn a ch i tng ca lp c s cho con tr ca lp dn xut. Nh vy v d sau l sai: B *q ; A a; q = &a; Sai v: Gn a ch i tng ca lp c s A cho con tr ca lp dn xut B

382

3.6. V d Ta sa chng trnh trong 1 bng cch nh ngha cc phng thc xuat() l o. Khi bn cu lnh: hien(&a); hien(&b); hien(&c); hien(&d); trong hm main (ca chng trnh di y) s ln lt gi ti 4 phng thc khc nhau: A::xuat() B::xuat() C::xuat() D::xuat() //CT6-01B // Phuong thuc o v tng ng bi #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h> class A { private: int n; public: A()

383

{ n=0; } A(int n1) { n=n1; } virtual void xuat() { cout << "\nLop A: "<< n; } int getN() { return n; } }; class B:public A { public: B():A() { } B(int n1):A(n1) {

384

} void xuat() { cout << "\nLop B: "<<getN(); } }; class C:public A { public: C():A() { } C(int n1):A(n1) { } void xuat() { cout << "\nLop C: "<<getN(); } }; class D:public C { public: D():C()

385

{ } D(int n1):C(n1) { } void xuat() { cout << "\nLop D: "<<getN(); } }; void hien(A *p) { p->xuat(); } void main() { A a(1); B b(2); C c(3); D d(4); clrscr(); hien(&a); hien(&b); hien(&c);

386

hien(&d); getch(); } 3.5. S tha k ca cc phng thc o Cng ging nh cc phng thc thng thng khc, phng thc o cng c tnh tha k. Chng hn trong chng trnh trn (mc 3.4) ta b i phng thc xuat() ca lp D, th cu lnh: hien(&d) ; (cu lnh gn cui trong hm main) s gi ti C::xuat() , phng thc ny c k tha trong lp D (v D dn xut t C).

4. S linh hot ca phng thc o trong pht trin nng cp chng trnh
V d v cc lp TS v TS2 trong 2 ch ra s hn ch ca phng thc tnh trong vic s dng tnh tha k nng cp, pht trin chng trnh. Trong 2 cng ch ra lp TS2 cha p ng c yu cu nu ra l in a ch ca th sinh. Gii php cho vn ny rt n gin: Thay cc phng thc tnh in() bng cch dng chng nh cc phng thc o. Chng trnh khi s nh sau: //CT6-03B // S linh hot ca phng thc o // Lop TS TS2 #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h>

387

class TS { private: char ht[25]; int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } virtual void in() { fprintf(stdprn,"\n\nHo ten: %s", ht); fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nTong diem: %0.1f", td); } void xem_in() {

388

int ch; cout << "\nHo ten: " << ht ; cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); if (ch=='C') this->in(); // V in() l phng thc o nn //c th gi n TS::in() hoc TS2::in() } }; class TS2:public TS { private: char dc[30] ; // Dia chi public: void nhap() { TS::nhap(); cout << "Dia chi: " ; fflush(stdin); gets(dc); } void in() { TS::in(); fprintf(stdprn,"\nDia chi: %s", dc);

389

} }; void main() { TS2 t[100]; int i, n; cout << "\nSo thi sinh: "; cin >> n; for (i=1; i<=n; ++i) t[i].nhap(); for (i=1; i<=n; ++i) t[i].xem_in(); getch(); } Khi thc hin chng trnh ny, chng ta nhn thy: D liu th sinh in ra c a ch. iu ny c th gii thch nh sau: Xt cu lnh (th 2 t di ln trong hm main): t[i].xem_in() ; Cu lnh ny gi ti phng thc xem_in ca lp TS2 (v t[i] l i tng ca lp TS2). Nhng lp TS2 khng nh ngha phng thc xem_in, nn phng thc TS::xem_in() s c gi ti. Hy theo ri phng thc ny: void xem_in() { int ch; cout << "\nHo ten: " << ht ;

390

cout << "\nCo in khong? - C/K" ; ch = toupper(getch()); this->in(); // V in() l phng thc o nn //c th gi n TS::in() hoc TS2::in() } Cc lnh u ca phng thc s in h tn th sinh. Nu chn C (bm phm C), th cu lnh: this->in() ; s c thc hin. a ch ca t[i] (l i tng ca lp TS2) c truyn cho con tr this (ca lp c s TS). V in() l phng thc o v v this ang tr ti i tng t[i] ca lp TS2, nn cu lnh ny gi ti phng thc TS2::in(). Trong phng thc TS2::in() c in a ch ca th sinh. Nh vy vic s dng cc phng thc tnh in() (trong cc lp TS v TS2) khng p ng c yu cu pht trin chng trnh. C mt gii php rt n gin l: nh ngha cc phng thc in() trong cc lp TS v TS2 nh cc phng thc o (virtual).

5. Lp c s tru tng
5.1. Lp c s tru tng Mt lp c s tru tng l mt lp ch c dng lm c s cho cc lp khc. Khng h c i tng no ca mt lp tru tng c to ra c, bi v n ch c dng nh ngha mt s khi nim tng qut, chung cho cc lp khc. Mt v d v lp tru tng l lp CON_VAT (con vt), n s dng lm c s xy dng cc lp con vt c th nh lp CON_CHO (con ch), CON_MEO (con mo),... (xem v d bn di) Trong C++ , thut ng Lp tru tng c bit p dng cho cc lp c cha cc phng thc o thun tu. Phng thc o thun tu l mt phng thc o m ni dung ca n khng c g. Cch thc nh ngha mt phng thc o thun tu nh sau: virtual void tn_phng_thc() = 0 ; V d:

391

class A { public: virtual void nhap() = 0 ; virtual void xuat() = 0 ; void chuong(); }; Trong v d trn, th A l lp c s tru tng. Cc phng thc nhap v xuat c khai bo l cc lp o thun tu (bng cch gn s 0 cho chng thay cho vic ci t cc phng thc ny). Phng thc chuong() l mt phng thc bnh thng v s phi c mt nh ngha u cho phng thc ny. Khng c i tng no ca mt lp tru tng li c th c pht sinh. Tuy nhin cc con tr v cc bin tham chiu n cc i tng ca lp tru tng th vn hp l. Bt k lp no dn xut t mt lp c s tru tng phi nh ngha li tt c cc phng thc thun o m n tha hng, hoc bng cc phng thc o thun tu, hoc bng nhng nh ngha thc s. V d: class B : public A { public: virtual void nhap() = 0 ; virtual void xuat() { // Cc cu lnh } }; Theo ngha v hng i tng, ta vn c th c mt lp tru tng m khng nht thit phi cha ng nhng phng thc thun tu o.

392

Mt cch tng qut m ni th bt k lp no m n ch c dng lm c s cho nhng lp khc u c th c gi l lp tru tng. Mt cch d dng nhn bit mt lp tru tng l xem c dng lp khai bo cc i tng hay khng? . Nu khng th l lp c s tru tng. 5.2. V d Gi s c 20 , mi c th nui mt con ch hoc mt con mo. Yu cu xy dng chng trnh gm cc chc nng: + Nhp mt con vt mi mua (hoc ch, hoc mo) vo rng u tin. + Xut (em bn) mt con vt (hoc ch, hoc mo). + Thng k cc con vt ang nui trong 20 . Chng trnh c t chc nh sau: + Trc tin nh ngha lp CON_VAT l lp c s o. Lp ny c mt thuc tnh l tn con vt v mt phng thc o dng xng tn. + Hai lp l CON_MEO v CON_CHO c dn xut t lp CON_VAT + Cui cng l lp DS_CON_VAT (Danh sch con vt) dng qun l chung c mo v ch. Lp ny c 3 thuc tnh l: s con vt cc i (chnh bng s ), s con vt ang nui v mt mng con tr kiu CON_VAT. Mi phn t mng s cha a ch ca mt i tng kiu CON_MEO hoc CON_CHO. Lp s c 3 phng thc thc hin 3 chc nng nu trn ca chng trnh. Ni dung chng trnh nh sau: //CT6-04 // Lop co so truu tuong // Lop CON_VAT #include <conio.h> #include <stdio.h> #include <iostream.h> #include <ctype.h>

393

#include <string.h> class CON_VAT { protected: char *ten; public: CON_VAT() { ten = NULL; } CON_VAT(char *ten1) { ten = strdup(ten1); } virtual void xung_ten() { } }; class CON_MEO:public CON_VAT { public: CON_MEO() : CON_VAT() { }
345 346

394

CON_MEO(char *ten1) : CON_VAT(ten1) { } virtual void xung_ten() { cout << "\nToi la chu meo: " << ten ; } }; class CON_CHO:public CON_VAT { public: CON_CHO() : CON_VAT() { } CON_CHO(char *ten1) : CON_VAT(ten1) { } virtual void xung_ten() { cout << "\nToi la chu cho: " << ten ; } }; class DS_CON_VAT // Danh sach con vat {

395

private: int max_so_con_vat; int so_con_vat; CON_VAT **h ; public: DS_CON_VAT(int max); ~DS_CON_VAT(); int nhap(CON_VAT *c); CON_VAT* xuat(int n); void thong_ke(); }; DS_CON_VAT::DS_CON_VAT(int max) { max_so_con_vat = max; so_con_vat = 0; h = new CON_VAT*[max]; for (int i=0; i<max; ++i) h[i] = NULL; } DS_CON_VAT::~DS_CON_VAT() { max_so_con_vat = 0; so_con_vat = 0; delete h;

396

} int DS_CON_VAT::nhap(CON_VAT *c) { if (so_con_vat==max_so_con_vat) return 0; int i=0; while (h[i]!=NULL) ++i; h[i]=c; so_con_vat++ ; return (i+1); } CON_VAT* DS_CON_VAT::xuat(int n) { if (n<1 || n > max_so_con_vat) return NULL ; --n ; if (h[n]) { CON_VAT *c = h[n]; h[n]=NULL; so_con_vat-- ; return c; } else

397

return NULL; } void DS_CON_VAT::thong_ke() { if (so_con_vat) { cout << "\n" ; for (int i=0; i<max_so_con_vat; ++i) if (h[i]) h[i]->xung_ten(); } } CON_CHO c1("MUC"); CON_CHO c2("VEN"); CON_CHO c3("LAI"); CON_CHO c4("NHAT"); CON_CHO c5("BONG"); CON_MEO m1("MUOP"); CON_MEO m2("DEN"); CON_MEO m3("TRANG"); CON_MEO m4("TAM THE"); CON_MEO m5("VANG"); void main() {

398

DS_CON_VAT d(20); clrscr(); d.nhap(&c1); int im2 = d.nhap(&m2); d.nhap(&c3); d.nhap(&m1); int ic4 = d.nhap(&c4); d.nhap(&c5); d.nhap(&m5); d.nhap(&c2); d.nhap(&m3); d.thong_ke(); d.xuat(im2); d.xuat(ic4); d.thong_ke(); getch(); } Ch : Theo quan im chung v cch thc s dng, th lp CON_VAT l lp c s tru tng. Tuy nhin theo quan im ca C++ th lp ny cha phi l lp c s tru tng, v trong lp khng c cc phng thc thun tu o. Phng thc xung_ten: virtual void xung_ten() { } l phng thc o, c nh ngha y , mc d thn ca n l rng. Do vy khai bo:

399

CON_VAT cv(Con vat chung); vn c C++ chp nhn. By gi nu nh ngha li phng thc xung_ten nh sau: virtual void xung_ten() = 0 ; th n tr thnh phng thc thun o v C++ s quan nim lp CON_VAT l lp tru tng. Khi cu lnh khai bo: CON_VAT cv(Con vat chung); s b C++ bt li vi thng bo: Cannot create instance of abstruct class CON_VAT

6. S dng tng ng bi v phng thc o


6.1. Chin lc s dng tng ng bi Tng ng bi cho php xt cc vn khc nhau, cc i tng khc nhau, cc phng php khc nhau, cc cch gii quyt khc nhau theo cng mt lc chung. Cc bc p dng tng ng bi c th tng kt li nh sau: 1. Xy dng lp c s tru tng bao gm nhng thuc tnh chung nht ca cc thc th cn qun l. a vo cc phng thc o hay thun o dng xy dng cc nhm phng thc o cho cc lp dn xut sau ny. Mi nhm phng thc o s thc hin mt chc nng no trn cc lp. 2. Xy dng cc lp dn xut bt u t lp c s o. S mc dn xut l khng hn ch. Cc lp dn xut s m t cc i tng c th cn qun l. 3. Xy dng cc phng thc o trong cc dn xut. Cc phng thc ny to thnh cc nhm phng thc o trong s cc lp c quan h tha k. 4. Xy dng lp qun l cc i tng. D liu ca lp ny l mt dy con tr ca lp c s tru tng ban u. Cc con tr ny c th cha a ch i tng ca cc lp dn xut. Do vy c th dng cc con tr ny thc hin cc thao tc trn cc i tng ca bt k lp dn xut no.

400

6.2. V d Chng trnh qun l cc con vt trong 5 l mt v d v cch s dng tng ng bi. Di y l mt v d khc. Gi s c 4 hnh v: on thng, hnh trn, hnh ch nht v hnh vung. Bn hnh cho hin thng hng trn mn hnh to thnh mt bc tranh. Nu thay i th t cc hnh s nhn c cc bc tranh khc nhau. Chng trnh di y s cho hin tt c cc bc tranh khc nhau. Chng trnh c t chc theo cc bc nu trong 6.1: + Lp c s tru tng l lp HINH (hnh) gm mt thuc tnh mau (mu) v mt phng thc o thun tu: virtual void draw(int x, int y) = 0 ; + Cc lp dn xut trc tip t lp hnh l : DTHANG , HTRON v CHUNHAT. + Lp VUONG dn xut t lp CHUNHAT. + Lp qun l chung l lp picture c thuc tnh l mt mng con tr kiu HINH gm 4 phn t dng cha a ch 4 i tng: DTHANG, HTRON, CHUNHAT v VUONG. S dng phng thc draw gi t 4 phn t mng ni trn s nhn c mt bc tranh. Bng cch hon v cc phn t ny, s nhn c tt c cc bc tranh khc nhau. //CT6-05 // Lop co so truu tuong // Lop hinh hoc #include <conio.h> #include <graphics.h> class HINH { private: int mau; public: HINH(int m) {

401

mau = m; } getmau() { return mau; } virtual void draw(int x, int y) = 0; }; class DTHANG : public HINH { private: int dodai; public: DTHANG(int d, int m):HINH(m) { dodai = d ; } virtual void draw(int x, int y) { setcolor(getmau()) ; line(x,y,x+dodai,y); } }; class CHUNHAT: public HINH

402

{ private: int rong, cao; public: CHUNHAT(int r, int c, int m):HINH(m) { rong = r; cao = c; } virtual void draw(int x, int y ) { setcolor(getmau()) ; rectangle(x,y,x+rong,y+cao); setfillstyle(1,getmau()); floodfill(x+rong/2,y+cao/2, getmau() ); } }; class VUONG : public CHUNHAT { public: VUONG(int a, int m): CHUNHAT(a,a,m) { } }; class HTRON: public HINH

403

{ private: int bk; //Ban kinh public: HTRON(int bk1, int m):HINH(m) { bk = bk1; } virtual void draw(int x, int y) { setcolor(getmau()) ; circle(x+bk,y+bk,bk); setfillstyle(1,getmau()); floodfill(x + bk, y + bk,getmau()); } }; class picture { private: HINH *h[4]; public: picture(HINH *h0,HINH *h1,HINH *h2,HINH *h3) { h[0]=h0;

404

h[1]=h1; h[2]=h2; h[3]=h3; } void paint(int *k); void listpaint(); }; void picture::paint(int *k) { for (int i=0; i<4; ++i) h[k[i]]->draw(10+i*150, 200); } void picture::listpaint() { int k[4],i1,i2,i3,i4; for (i1=0;i1<4;++i1) for (i2=0;i2<4;++i2) if (i2!=i1) for (i3=0;i3<4;++i3) if (i3!=i2 && i3!=i1) for (i4=0;i4<4;++i4) if (i4!=i3 && i4!=i2 && i4!=i1) { k[0]=i1;k[1]=i2;

405

k[2]=i3;k[3]=i4; paint(k); getch(); cleardevice(); } } DTHANG dt(120,14); HTRON ht(60,RED); CHUNHAT cn(120,100,MAGENTA); VUONG v(120,CYAN); }; void main() { int mh=0,mode=0; initgraph(&mh,&mode,""); picture pic(&dt,&ht,&cn,&v); pic.listpaint(); getch(); closegraph(); }

7. X l cc thut ton khc nhau


C th s dng tng ng bi t chc thc hin cc thut ton khc nhau trn cng mt bi ton nh sau:

406

+ Lp c s tru tng s cha d liu bi ton v mt phng thc o. + Mi lp dn xut ng vi mt thut ton c th. Phng thc o ca lp dn xut s thc hin mt thut ton c th. + S dng mt mng con tr ca lp c s v gn cho mi phn t mng a ch ca mt i tng ca lp dn xut. Sau dng cc phn t mng con tr gi ti cc phng thc o. Bng cch s thc hin cng mt bi ton theo cc thut ton khc nhau v d dng so snh hi qu ca cc thut ton. V d sau minh ho vic thc hin bi ton sp xp dy s nguyn theo th t tng bng cch dng ng thi 3 thut ton: Thut ton la chn (Select_Sort), thut ton sp xp nhanh (Quick_Sort) v thut ton vun ng (Heap_Sort). Chng trnh gm 4 lp: + Lp c s tru tng: class sort { protected: int *a; void hoan_vi(long i, long j) ; public: virtual void sapxep(int *a1, long n) ; }; Lp ny gm: - Mt thnh phn d liu l con tr a tr ti mt vng nh cha dy s nguyn cn sp xp. - Phng thc hoan_vi(i,j) dng hon v cc phn t a[i] v a[j]. Phng thc ny c dng trong 3 lp dn xut bn di. - Phng thc o sapxep(a1,n) dng sp xp dy n s nguyn cha trong mng a1. + Ba lp dn xut l: SELECT_SORT, QUICK_SORT v HEAP_SORT. Mi lp u c phng thc o: virtual void sapxep(int *a1, long n) ;

407

thc hin hin vic sp xp theo theo mt thut ton c th. + Trong hm main() s to ra mt dy 30000 s nguyn mt cch ngu nhin, sau ln lt s dng 3 thut ton sp xp so snh. Kt qu nh sau: Thi gian sp xp theo thut ton Select sort l: 19.20 giy Thi gian sp xp theo thut ton Quick sort l: 0.11 giy Thi gian sp xp theo thut ton Heap sort l: 0.44 giy Ni dung chng trnh nh sau: //CT6-06 // Lop co so truu tuong // Lop sort #include <conio.h> #include <stdio.h> #include <time.h> #include <stdlib.h> #include <iostream.h> #include <dos.h> class sort { protected: int *a; void hoan_vi(long i, long j) { int tg = a[i]; a[i] = a[j];

408

a[j] = tg; } public: virtual void sapxep(int *a1, long n) { a = a1; } }; class select_sort : public sort { public: virtual void sapxep(int *a1, long n) ; }; void select_sort::sapxep(int *a1, long n) { long i,j,r; sort::sapxep(a1,n); for (i=1; i<n; ++i) { r=i; for (j=i+1; j<=n; ++j) if(a[j] < a[r]) r = j; if(r!=i) hoan_vi(i,r); }

409

} class quick_sort : public sort { private: void q_sort(long l, long r); public: virtual void sapxep(int *a1, long n) ; }; void quick_sort::q_sort(long l, long r) { int x; long i,j; if (l < r) { x = a[l]; i = l; j = r+1; do { ++i; --j; while (i<r && a[i] < x) ++i ; while (a[j] > x) --j ; if (i<j) hoan_vi(i,j); } while (i<j); hoan_vi(l,j); q_sort(l,j-1);

410

q_sort(j+1,r); } } void quick_sort::sapxep(int *a1, long n) { sort::sapxep(a1,n); q_sort(1,n); } class heap_sort : public sort { private: void shift(long i, long n); public: virtual void sapxep(int *a1, long n) ; }; void heap_sort::shift(long i, long n) { long l,r,k; l = 2*i; r = l+1; if (l>n) return; if (l==n) { if (a[i]<a[l]) hoan_vi(i,l); return;

411

} if (a[l] > a[r]) k = l; else k = r; if (a[i]>=a[k]) return; else { hoan_vi(i,k); shift(k,n); } } void heap_sort::sapxep(int *a1, long n) { long i; sort::sapxep(a1,n); /* Tao dong */ for (i=n/2 ; i>=1; --i) shift(i,n); /* Lap */ for (i=n ; i>=2; --i) { hoan_vi(1,i); shift(1,i-1);

412

} } void main() { long i,n; struct time t1,t2; int *a, k, tg, sec, hund; n=30000; a=(int*) malloc((n+1)*sizeof(int)); if (a==NULL) { puts("\nLoi BN"); getch(); exit(0); } sort *s[3]; select_sort ss; quick_sort qs; heap_sort hs; s[0]=&ss; s[1]=&qs; s[2]=&hs; clrscr(); for (k=0; k<3; ++k) { srand(5000);

413

for (i=1;i<=n;++i) a[i]=rand(); gettime(&t1); s[k]->sapxep(a,n); gettime(&t2); tg = (t2.ti_sec - t1.ti_sec)*100 + t2.ti_hund - t1.ti_hund ; sec = tg / 100; hund = tg % 100; printf("\n Sap xep %d %d %d %d %d",k+1, t2.ti_sec,t2.ti_hund,t1.ti_sec,t1.ti_hund); printf("\n Sap xep %d Thoi gian %d sec %d hund", k+1,sec,hund); } getch(); }

414

Chng 7 Cc Dng Tp Tin (Stream)


C cung cp mt th vin cc hm nhp xut nh printf, scanf, gets, getch(), puts, puch(), fprintf, fscanf, fopen, fwite, fread,... . Cc hm ny lm vic kh hiu qu nhng khng thch ng vi cch t chc chng trnh hng i tng. C++ s dng khi nim dng tin (stream) v a ra cc lp dng tin t chc vic nhp xut. Dng tin c th xem nh mt dy cc byte. Thao tc nhp l ly (c) cc byte t dng tin (khi gi l dng nhp - input) vo b nh. Thao tc xut l a cc byte t b nh ra dng tin (khi gi l dong xut - output). Cc thao tc ny l c lp thit b. thc hin vic nhp, xut ln mt thit b c th, chng ta ch cn gn dng tin vi thit b ny.

1. Cc lp stream
C 4 lp quan trng cn nh l: + Lp c s ios + T lp ios dn xut n 2 lp istream v ostream + Hai lp istream v ostream li dn xut ti lp iostream S k tha gia cc lp nh sau: ios

istream

ostream

iostream Lp ios + Thuc tnh ca lp: Trong lp ios nh ngha cc thuc tnh c s dng lm cc c nh dng cho vic nhp xut v cc c kim tra li (xem bn di). + Cc phng thc: Lp ios cung cp mt s phng thc phc v vic nh dng d liu nhp xut, kim tra li (xem bn di).

415

Lp istream Lp ny cung cp ton t nhp >> v nhiu phng thc nhp khc (xem bn di) nh cc phng thc: get, getline, read, ignore, peek, seekg, tellg,... Lp ostream Lp ny cung cp ton t xut << v nhiu phng thc xut khc (xem bn di) nh cc phng thc: put, write, flush, seekp, tellp,... Lp iostream Lp ny tha k cc phng thc nhp xut ca cc lp istream v ostream.

2. Dng cin v ton t nhp


Dng cin l mt i tng kiu istream nh ngha trong C++ . l dng vo (input) chun gn vi bn phm (tng t nh stdin ca C). Cc thao tc nhp trn dng cin ng ngha vi nhp d liu t bn phm. Do cin l mt i tng ca lp istream nn vi cin chung ta c th s dng ton t nhp >> v cc phng thc nhp ca cc lp ios v istream. Cch dng ton t nhp c d liu t dng cin nh sau: cin >> Tham_s ; Trong Tham_s c th l: - Bin hoc phn t mng nguyn nhn mt s nguyn - Bin hoc phn t mng thc nhn mt s thc - Bin hoc phn t mng k t nhn mt k t - Con tr k t nhn mt dy cc k t khc trng

Ch : Cc ton t nhp c th vit ni ui nhp nhiu gi tr trn mt dng lnh nh sau:

416

cin >> Tham_s_1 >> Tham_s_2 >> ... >> Tham_s_k ; Cch thc nhp nh sau: B qua cc k t trng (du cch, du tab, du chuyn dng) ng trc nu c v sau c vo cc k t tng ng vi kiu yu cu. C th i vi tng kiu nh sau: Khi nhp s nguyn s b qua cc k t trng ng trc nu c, sau bt u nhn cc k t biu th s nguyn. Vic nhp kt thc khi gp mt k t trng hoc mt k t khng th hiu l thnh phn ca s nguyn. V d nu trn dng vo (g t bn phm) cha cc k t <space><space>123X2 v Tham_s (bn phi cin) l bin nguyn n th n s nhn gi tr 123. Con tr nhp s dng ti k t X. Php nhp mt s thc cng tin hnh tng t: B qua cc khong trng ng trc nu c, sau bt u nhn cc k t biu th s Thc. Vic nhp kt thc khi gp mt k t trng hoc mt k t khng th hiu l thnh phn ca s thc. Php nhp mt k t cng vy: B qua cc khong trng ng trc nu c, sau nhn mt k t khc k t trng. V d nu g <space><space>XY th k t X c nhn v con tr nhp dng ti k t Y. Php nhp mt dy k t: B qua cc khong trng ng trc nu c, sau bt u nhn t mt k t khc k t trng. Vic nhp kt thc khi gp mt k t trng. V d 1: Xt on chng trnh: char ten[10], que[12]; char ch; int n; float x; cin >> n >> x >> ch >> ten >> que ; Nu g cc k t: 123<s>3.14<s><s>ZHONG<s>HAI<s>PHONG<Enter> ( cho gn s k hiu <s> l <space>) th kt qu nhp nh sau: n=123

417

x=3.14 ch=Z ten=HONG que = HAI Con tr nhp s dng ti k t <space> trc t PHONG. Cc k t cn li s c nhn trong cc cu lnh nhp tip theo. V d 2: Xt on chng trnh: int m; float y; cin >> m >> y; Nu g: <s><s>456<s><s>4.5<Enter> th kt qu nhp l: m = 456 y = 4.5 K t <Enter> vn cn li trn dng nhp.

3. Nhp k t v chui k t t bn phm


Chng ta nhn thy ton t nhp >> ch tin li khi dng nhp cc gi tr s (nguyn, thc). nhp k t v chui k t nn dng cc phng thc sau (nh ngha trong lp istream): cin.get cin.getline cin.ignore

3.1. Phng thc get c 3 dng (thc cht c 3 phng thc cng c tn get): Dng 1:

418

int cin.get() ; dng c mt k t (k c khong trng). Cch thc c ca cin.get c th minh ho qua v d sau: Xt cc cu lnh char ch; ch = cin.get() + Nu g ABC<Enter> th bin ch nhn m k t A, cc k t BC<Enter> cn li trn dng vo. + Nu g A<Enter> th bin ch nhn m k t A, k t <Enter> cn li trn dng vo. + Nu g <Enter> th bin ch nhn m k t <Enter> (bng 10) v dng vo rng. Dng 2: istream& cin.get(char &ch) ; dng c mt k t (k c khong trng) v t vo mt bin kiu char c tham chiu bi ch. Ch : + Cch thc c ca cin.get dng 2 cng ging nh dng 1 + Do cin.get() dng 2 tr v tham chiu ti cin, nn c th s dng cc phng thc get() dng 2 ni ui nhau. V d 2 nu khai bo char ch1, ch2; th 2 cu lnh: cin.get(ch1);

419

cin.get(ch2); c th vit chung trn mt cu lnh sau: cin.get(ch1).get(ch2); Dng 3: istream& cin.get(char *str, int n, char delim = \n); dng c mt dy k t (k c khong trng) v a vo vng nh do str tr ti. Qu trnh c kt thc khi xy ra mt trong 2 tnh hung sau: + Gp k t gii hn (cho trong delim). K t gii hn mc nh l \n (Enter) + nhn (n-1) k t Ch : + K t kt thc chui \0 c b sung vo dy k t nhn c + k t gii hn vn cn li trn dng nhp dnh cho cc lnh nhp tip theo. Ch : + Cng ging nh get() dng 2, c th vit cc phng thc get() dng 3 ni ui nhau trn mt dng lnh. + K t <Enter> cn li trn dng nhp c th lm tri phng thc get() dng 3. V d xt on chng trnh: char ht[25], qq[20], cq[30]; cout << \nH tn: ; cin.get(ht,25); cout << \nQu qun: ; cin.get(qq,20); cout << \nC quan: ; cin.get(cq,30); cout <<\n <<ht<< <<qq<< <<cq

420

on chng trnh dng nhp h tn, qu qun v c quan. Nu g: Pham Thu Huong<Enter> th cu lnh get u tin s nhn c chui Pham Thu Huong ct vo mng ht. K t <Enter> cn li s lm tri 2 cu lnh get tip theo. Do cu lnh cui cng s ch in ra Pham Thu Huong. khc phc tnh trng trn, c th dng mt trong cc cch sau: + Dng phng thc get() dng 1 hoc dng 2 ly ra k t <Enter> trn dng nhp trc khi dng get (dng 3). + Dng phng thc ignore ly ra mt s k t khng cn thit trn dng nhp trc khi dng get dng 3. Phng thc ny vit nh sau: cin.ignore(n) ; // Ly ra (loi ra hay b qua) n k t trn // dng nhp. Nh vy c th nhp c c qu qun v c quan, cn sa li on chng trnh trn nh sau: char ht[25], qq[20], cq[30]; cout << \nH tn: ; cin.get(ht,25); cin.get(); // Nhn <Enter> cout << \nQu qun: ; cin.get(qq,20); ignore(1); // B qua <Enter> cout << \nC quan: ; cin.get(cq,30); cout <<\n <<ht<< <<qq<< <<cq 3.2. Phng thc getline

421

Tng t nh get dng 3, c th dng getline nhp mt dy k t t bn phm. Phng thc ny c m t nh sau: istream& cin.getline(char *str, int n, char delim = \n); Phng thc u tin lm vic nh get dng 3, sau n loi <Enter> ra khi dng nhp (k t <Enter> khng a vo dy k t nhn c). Nh vy c th dng getline nhp nhiu chui k t (m khng lo ngi cc cu lnh nhp tip theo b tri). V d on chng trnh nhp h tn, qu qun v c quan bn trn c th vit nh sau (bng cch dng getline): char ht[25], qq[20], cq[30]; cout << \nH tn: ; cin.getline(ht,25); cout << \nQu qun: ; cin.getline(qq,20); cout << \nC quan: ; cin.get(cq,30); cout <<\n <<ht<< <<qq<< <<cq Ch : Cng ging nh get() dng 2 v get() dng 3, c th vit cc phng thc getline() ni ui nhau trn mt dng lnh. V d on chng trnh trn c th vit li nh sau: char ht[25], qq[20], cq[30]; cout << \nH tn, Qu qun v C quan: ; cin.getline(ht,25).getline(qq,20).get(cq,30); cout <<\n <<ht<< <<qq<< <<cq 3.3. Phng thc ignore Phng thc ignore dng b qua (loi b) mt s k t trn dng nhp. Trong nhiu trng hp, y l vic lm cn thit khng lm nh hng n cc php nhp tip theo. Phng thc ignore c m t nh sau:

422

istream& cin.ignore(int n=1); Phng thc s b qua (loi b) n k t trn dng nhp. 3.4. Nhp ng thi gi tr s v k t Nh ni trong 2, ton t nhp >> bao gi cng li k t <Enter> trn dng nhp. K t <Enter> ny s lm tri cc lnh nhp k t hoc chui k t bn di. Do vy cn dng: hoc ignore() hoc get() dng 1 hoc get() dng 2 loi b k t <Enter> cn st li ra khi dng nhp trc khi thc hin vic nhp k t hoc chui k t. 3.5. V d: Chng trnh di y s dng lp TSINH (Th sinh) vi 2 phng thc xuat v nhap. //CT7_04.CPP // Nhp d liu s v k t #include <iostream.h> #include <conio.h> struct TS { int sobd; char ht[25]; float dt,dl,dh,td; }; class TSINH { private:

423

TS *ts; int sots; public: TSINH() { ts=NULL; sots=0; } TSINH(int n) { ts=new TS[n+1]; sots=n; } ~TSINH() { if (sots) { sots=0; ts = NULL; } } void nhap(); void xuat(); };

424

void TSINH::nhap() { if (sots) for (int i=1; i<=sots; ++i) { cout << "\nThi sinh "<< i << ": " ; cout << "\nSo bao danh: " ; cin >> ts[i].sobd; cin.ignore(); cout << "Ho ten: " ; cin.get(ts[i].ht,25); cout << "Diem toan, ly , hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh; ts[i].td = ts[i].dt + ts[i].dl + ts[i].dh; } } void TSINH::xuat() { if (sots) { cout << "\nDanh sach thi sinh:" ; for (int i=1; i<=sots; ++i) cout << "\nHo ten: " << ts[i].ht << " So BD: "<< ts[i].sobd <<" Tong diem: "<< ts[i].td;

425

} } void main() { int n; clrscr(); cout << "\nSo thi sinh: "; cin>>n; TSINH *t = new TSINH(n); t->nhap() ; t->xuat(); getch(); delete t; }

4. Dng cout v ton t xut


4.1. Dng cout Dng cout l mt i tng kiu ostream nh ngha trong C++. l dng xut (output) chun gn vi mn hnh (tng t nh stdout ca C). Cc thao tc xut trn dng cout ng ngha vi xut d liu ra mn hnh. Do cout l mt i tng ca lp ostream nn vi cout chung ta c th s dng ton t xut << v cc phng thc xut ca cc lp ios v ostream. 4.2.Ton t xut C++ nh ngha chng ton t dch tri << gi cc k t ra dng xut.

426

Cch dng ton t xut xut d liu t b nh ra dng cout nh sau: cout << Tham_s ; Trong Tham_s biu th mt gi tr cn xut ra mn hnh. Gi tr s c bin i thnh mt dy k t trc khi a ra dng xut. Kiu ca Tham_s c th nh sau: - Nguyn (xut gi tr nguyn) - Thc (xut gi tr thc) - k t - char (xut mt k t) - con tr k t - char* (xut chui k t) Ch : Cc ton t xut c th vit ni ui nhau ( xut nhiu gi tr) trn mt dng lnh nh sau: cout << Tham_s_1 << Tham_s_2 << ... << Tham_s_k ; Ch : Ton t xut c nh ngha chng (trng tn) vi ton t dch tri v n cng c mc u tin nh ton t dch tri. Xem ph lc 1 chng ta thy ton t xut c th t u tin ln hn cc ton t trong biu thc iu kin. V vy nu dng ton t xut in mt biu thc iu kin nh sau: int a=5, b=10; cout << \nMax= << a>b?a:b ; th Trnh bin dch s bo li. trnh li cn dng cc du ngoc trn bao biu thc iu kin nh sau: int a=5, b=10; cout << \nMax= << (a>b?a:b) ; Tm li: Nn bao cc biu thc trong 2 du ngoc trn. 4.3. nh dng (to khun dng cho) d liu xut Vic nh dng d liu xut hay to khun dng cho d liu xut l mt vic cn thit. V d cn in cc gi tr thc trn 10 v tr trong c 2 v tr dnh cho phn phn. Bn thn ton t xut cha c kh nng nh dng, m cn s dng cc cng c sau:

427

+ Cc phng thc nh dng + Cc cc c nh dng + Cc hm v b phn nh dng Mc sau s trnh bycch nh dng gi tr xut.

5. Cc phng thc nh dng


5.1. Ni dung nh dng gi tr xut Ni dung nh dng l xc nh cc thng s: - rng quy nh - chnh xc - K t n - V cc thng s khc + rng thc t ca gi tr xut: Nh ni trn, C++ s bin i gi tr cn xut thnh mt chui k t ri a chui ny ra mn hnh. Ta s gi s k t ca chui ny l rng thc t ca gi tr xut. V d vi cc cu lnh: int n=4567, m=-23 ; float x = -3.1416 ; char ht[] = Tran Van Thong ; th: rng thc t ca n l 4, ca m l 3, ca x l 7, ca ht l 14. + rng quy inh l s v tr ti thiu trn mn hnh dnh in gi tr. Theo mc nh, rng quy nh bng 0. Chng ta c th dng phng thc cout.width() thit lp rng ny. V d cu lnh: cout.width(8); s thit lp rng quy nh l 8.

428

+ Mi quan h gia rng thc t v rng quy nh - Nu rng thc t ln hn hoc bng rng quy nh th s v tr trn mn hnh cha gi tr xut s bng rng thc t. - Nu rng thc t nh hn rng quy nh th s v tr trn mn hnh cha gi tr xut s bng rng quy nh. Khi s c mt s v tr d tha. Cc v tr d tha s c n (lp y) bng khong trng. + Xc nh k t n: K t n mc nh l du cch (khong trng). Tuy nhin c th dng phng thc cout.fill() chn mt k t n khc. V d vi cc cu lnh sau: int n=123; // rng thc t l 3

cout.fill(*); // K t n l * cout.width(5); // rng quy nh l 5 cout << n ; th kt qu in ra l: **123 + chnh xc l s v tr dnh cho phn phn (khi in s thc). chnh xc mc nh l 6. Tuy nhin c th dng phng thc cout.precision() chn chnh xc. V d vi cc cu lnh: float x = 34.455 ; // rng thc t 6 cout.precision(2) ; // chnh xc 2 cout.width(8); cout.fill(0) ; cout << x ; th kt qu in ra l: 0034.46 5.2. Cc phng thc nh dng 1. Phng thc // rng quy c 8 // K t n l s 0

429

int cout.width() cho bit rng quy nh hin ti. 2. Phng thc int cout.width(int n) Thit lp rng quy nh mi l n v tr v rng quy nh trc . Ch : rng quy nh n ch c tc dng cho mt gi tr xut. Sau C++ li p dng rng quy nh bng 0. V d vi cc cu lnh: int m=1234, n=56; cout << \nAB cout.width(6); cout << m ; cout << n ; th kt qu in ra l: AB 123456 (gia B v s 1 c 2 du cch). 3. Phng thc int cout.precision() Cho bit chnh xc hin ti (ang p dng xut cc gi tr thc). 4. Phng thc int cout.precision(int n) Thit lp chnh xc s p dng l n v cho bit chnh xc trc . chnh xc c thit lp s c hiu lc cho ti khi gp mt cu lnh thit lp chnh xc mi. 5. Phng thc char cout.fill()

430

Cho bit k t n hin ti ang c p dng. 6. Phng thc char cout.fill(char ch) Quy nh k t n mi s c dng l ch v cho bit k t n ang dng trc . K t n c thit lp s c hiu lc cho ti khi gp mt cu lnh chn k t n mi. V d xt chng trnh: //CT7_06.CPP // Cac phuong thuc dinh dang #include <iostream.h> #include <conio.h> void main() { clrscr(); float x=-3.1551, y=-23.45421; cout.precision(2); cout.fill('*'); cout << "\n" ; cout.width(8); cout << x; cout << "\n" ; cout.width(8); cout << y; getch(); }

431

Sau khi thc hin, chng trnh in ra mn hnh 2 dng sau: ***-3.16 **-23.45

6. C nh dng
6.1. Khi nim chung v c Mi c cha trong mt bit. C c 2 trng thi: Bt (on) - c gi tr 1 Tt (off) - c gi tr 0 (Trong 6.3 s trnh bycc phng thc dng bt, tt cc c) Cc c c th cha trong mt bin kiu long. Trong tp <iostream.h> nh ngha cc c sau: ios::left ios::dec ios::fixed ios::uppercase ios::right ios::oct ios::scientific ios::showpoint ios::internal ios::hex ios::showpos ios::showbase

6.2. Cng dng ca cc c C th chia cc c thnh cc nhm: Nhm 1 gm cc c nh v (cn l) : ios::left ios::right ios::internal C ios::left: Khi bt c ios:left th gi tr in ra nm bn tri vng quy nh, cc k t n nm sau, v d: 35*** -89**

432

C ios::right: Khi bt c ios:right th gi tr in ra nm bn phi vng quy nh, cc k t n nm trc, v d: ***35 **-89 Ch : Mc nh c ios::right bt. C ios::internal: C ios:internal c tc dng ging nh c ios::right ch khc l du (nu c) in u tin, v d: ***35 -**89 Chng trnh sau minh ho cch dng cc c nh v: //CT7_06.CPP // Cac phuong thuc dinh dang // Co dinh vi #include <iostream.h> #include <conio.h> void main() { clrscr(); float x=-87.1551, y=23.45421; cout.precision(2); cout.fill('*'); cout.setf(ios::left); // Bt c ios::left cout << "\n" ; cout.width(8); cout << x;

433

cout << "\n" ; cout.width(8); cout << y; cout.setf(ios::right); // Bt c ios::right cout << "\n" ; cout.width(8); cout << x; cout << "\n" ; cout.width(8); cout << y; cout.setf(ios::internal); // // Bt c ios::internal cout << "\n" ; cout.width(8); cout << x; cout << "\n" ; cout.width(8); cout << y; getch(); } Sau khi thc hin chng trnh in ra 6 dng nh sau: -87.16** 23.45*** **-87.16 ***23.45

434

-**87.16 ***23.45 Nhm 2 gm cc c nh dng s nguyn: ios::dec ios::oct ios::hex + Khi ios::dec bt (mc nh): S nguyn c in di dng c s 10 + Khi ios::oct bt : S nguyn c in di dng c s 8 + Khi ios::hex bt : S nguyn c in di dng c s 16 Nhm 3 gm cc c nh dng s thc: ios::fxed ios::scientific ios::showpoint Mc nh: C ios::fixed bt (on) v c ios::showpoint tt (off). + Khi ios::fixed bt v c ios::showpoint tt th s thc in ra di dng thp phn, s ch s phn phn (sau du chm) c tnh bng chnh xc n nhng khi in th b i cc ch s 0 cui. V d nu chnh xc n = 4 th: S thc -87.1500 c in: S thc 23.45425 c in: S thc 678.0 c in: -87.15 23.4543 678

+ Khi ios::fixed bt v c ios::showpoint bt th s thc in ra di dng thp phn, s ch s phn phn (sau du chm) c in ra ng bng chnh xc n. V d nu chnh xc n = 4 th: S thc -87.1500 S thc 23.45425 S thc 678.0 c in: c in: c in: -87.1500 23.4543

678.0000

+ Khi ios::scientific bt v c ios::showpoint tt th s thc in ra di dng m (dng khoa hc). S ch s phn phn (sau du chm) ca phn nh tr c tnh bng chnh xc n nhng khi in th b i cc ch s 0 cui.

435

V d nu chnh xc n = 4 th: S thc -87.1500 S thc 23.45425 S thc 678.0 c in: c in: c in: -8.715e+01 2.3454e+01

6.78e+02

+ Khi ios::scientific bt v c ios::showpoint bt th s thc in ra di dng m. S ch s phn phn (sau du chm) ca phn nh tr c in ng bng chnh xc n. V d nu chnh xc n = 4 th: S thc -87.1500 S thc 23.45425 S thc 678.0 c in: c in: c in: -8.7150e+01 2.3454e+01

6.7800e+01

Nhm 4 gm cc hin th: ios::showpos ios::showbase ios::uppercase C ios::showpos + Nu c ios::showpos tt (mc nh) th du cng khng c in trc s dng. + Nu c ios::showpos bt th du cng c in trc s dng. C ios::showbase + Nu c ios::showbase bt th s nguyn h 8 c in bt u bng k t 0 v s nguyn h 16 c bt u bng cc k t 0x. V d nu a = 40 th: dng in h 8 l: 050

dng in h 16 l 0x28 + Nu c ios::showbase tt (mc nh) th khng in 0 trc s nguyn h 8 v khng in 0x trc s nguyn h 16. V d nu a = 40 th: dng in h 8 l: 50

dng in h 16 l 28 C ios::uppercase

436

+ Nu c ios::uppercase bt th cc ch s h 16 (nh A, B, C, ...) c in di dng ch hoa. + Nu c ios::uppercase tt (mc nh) th cc ch s h 16 (nh A, B, C, ...) c in di dng ch thng. 6.3. Cc phng thc bt tt c Cc phng thc ny nh ngha trong lp ios. + Phng thc long cout.setf(long f) ; s bt cc c lit k trong f v tr v mt gi tr long biu th cc c ang bt. Thng thng gi tr f c xc nh bng cch t hp cc c trnh by trong mc 6.1. V d cu lnh: cout.setf(ios::showpoint | ios::scientific) ; s bt cc c ios::showpoint v ios::scientific. + Phng thc long cout.unsetf(long f) ; s tt cc c lit k trong f v tr v mt gi tr long biu th cc c ang bt. Thng thng gi tr f c xc nh bng cch t hp cc c trnh bytrong mc 6.1. V d cu lnh: cout.unsetf(ios::showpoint | ios::scientific) ; s tt cc c ios::showpoint v ios::scientific. + Phng thc long cout.flags(long f) ; c tc dng ging nh cout.setf(long). V d cu lnh: cout.flags(ios::showpoint | ios::scientific) ; s bt cc c ios::showpoint v ios::scientific.

437

+ Phng thc long cout.flags() ; s tr v mt gi tr long biu th cc c ang bt.

7. Cc b phn nh dng v cc hm nh dng


7.1. Cc b phn nh dng (nh ngha trong <iostream.h>) Cc b phn nh dng gm: dec oct // nh c ios::dec // nh c ios::oct

hex // nh c ios::hex endl // xut k t \n (chuyn dng) flush // y d liu ra thit b xut Chng c tc dng nh c nh dng nhng c vit ni ui trong ton t xut nn tin s dng hn. V d xt chng trnh n gin sau: //CT7_08.CPP // Bo phan dinh dang #include <iostream.h> #include <conio.h> void main() { clrscr(); cout.setf(ios::showbase) cout << "ABC" << endl << hex << 40 << " " << 41;

438

getch(); } Chng trnh s in 2 dng sau ra mn hnh: ABC 0x28 0x29 7.2. Cc hm nh dng (nh ngha trong <iomanip.h>) Cc hm nh dng gm: setw(int n) setpecision(int n) setfill(char ch) setiosflags(long l) // nh cout.width(int n) // nh cout.pecision(int n) // nh cout. fill(char ch) // nh cout.setf(long f)

resetiosflags(long l) // nh cout.unsetf(long f) Cc hm nh dng c tc dng nh cc phng thc nh dng nhng c vit ni ui trong ton t xut nn tin s dng hn. Ch 1: Cc hm nh dng (cng nh cc b phn nh dng) cn vit trong cc ton t xut. Mt hm nh dng ng mt mnh nh mt cu lnh s khng c tc dng nh dng. Ch 2: Mun s dng cc hm nh dng cn b sung vo u chng trnh cu lnh: #include <iomanip.h> V d c th thay phng thc cout.setf(ios::showbase) ; trong chng trnh ca mc 7.1 bng hm cout << setiosflags(ios::showbase); (ch hm phi vit trong ton t xut) Nh vy chng trnh trong 7.1 c th vit li theo cc phng n sau:

439

Phng n 1: #include <iostream.h> #include <iomanip.h> #include <conio.h> void main() { clrscr(); cout << setiosflags(ios::showbase) ; cout << "ABC" << endl << hex << 40 << " " << 41; getch(); } Phng n 2: #include <iostream.h> #include <iomanip.h> #include <conio.h> void main() { clrscr(); cout << "ABC" << endl << setiosflags(ios::showbase) << hex << 40 << " " << 41; getch(); } Di y l v d khc v vic dng cc hm v b phn nh dng. Cc cu lnh: int i = 23;

440

cout << i << endl << setiosflags(ios::showbase) << hex << i << dec << setfill(*) << endl << setw(4) << i << setfill(0) << endl << setw(5) << i ; s in ra mn hnh nh sau: 23 0x17 **23 00023 7.3. V d: Chng trnh di y minh ho cch dng cc hm nh dng v phng thc nh dng in danh sch th sinh di dng bng vi cc yu cu sau: S bo danh in 4 k t (chn thm s 0 vo trc v d 0003), tng im in vi ng mt ch s phn phn. //CT7_08.CPP // Bo phan dinh dang // Ham dinh dang // Co dinh dang #include <iostream.h> #include <iomanip.h> #include <conio.h> struct TS { int sobd; char ht[25]; float dt,dl,dh,td;

441

}; class TSINH { private: TS *ts; int sots; public: TSINH() { ts=NULL; sots=0; } TSINH(int n) { ts=new TS[n+1]; sots=n; } ~TSINH() { if (sots) { sots=0; ts = NULL; }

442

} void nhap(); void sapxep(); void xuat(); }; void TSINH::nhap() { if (sots) for (int i=1; i<=sots; ++i) { cout << "\nThi sinh "<< i << ": " ; cout << "\nSo bao danh: " ; cin >> ts[i].sobd; cin.ignore(); cout << "Ho ten: " ; cin.get(ts[i].ht,25); cout << "Diem toan, ly , hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh; ts[i].td = ts[i].dt + ts[i].dl + ts[i].dh; } } void TSINH::sapxep() { int i,j;

443

for (i=1; i< sots; ++i) for (j=i+1; j<= sots; ++j) if (ts[i].td < ts[j].td) { TS tg; tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } } void TSINH::xuat() { if (sots) { cout << "\nDanh sach thi sinh:" ; cout.precision(1); cout << setiosflags(ios::left); cout << "\n" << setw(20) << "Ho ten" << setw(8) << "So BD" << setw(10) << "Tong diem"; for (int i=1; i<=sots; ++i) cout << "\n" << setw(20)<<setiosflags(ios::left) << ts[i].ht << setw(4) << setfill('0') << setiosflags(ios::right) << ts[i].sobd << " " << setfill(32)

<< setiosflags(ios::left|ios::showpoint)

444

<< setw(10) << ts[i].td; } } void main() { int n; clrscr(); cout << "\nSo thi sinh: "; cin>>n; TSINH *t = new TSINH(n); t->nhap() ; t->sapxep(); t->xuat(); getch(); delete t; }

8. Cc dng tin chun


C 4 dng tin (i tng ca cc lp Stream) nh ngha trc, c ci t khi chng trnh khi ng. Hai trong s ni trn l: cin dng input chun gn vi bn phm, ging nh stdin ca C. cout dng output chun gn vi mn hnh, ging nh stdout ca C. Hai dng tin chun khc l: cerr dng output li chun gn vi mn hnh, ging nh stderr ca C.

445

clog ging cerr nhng c thm b m. Ch 1: C th dng cc dng cerr v clog xut ra mn hnh nh dng i vi cout. Ch 2: V clog c thm b m, nn d liu c a vo b m. Khi y b m th a d liu t b m ra dng clog. V vy trc khi kt thc xut cn dng phng thc: clog.flush(); y d liu t b m ra clog. Chng trnh sau minh ho cch dng dng clog. Chng ta nhn thy, nu b cu lnh clog.flush() th s khng nhn thy kt qu xut ra mn hnh khi chng trnh tm dng bi cu lnh getch(). // Dng clog v flush #include <iostream.h> #include <conio.h> void main() { clrscr(); float x=-87.1500, y=23.45425,z=678.0; clog.setf(ios::scientific); clog.precision(4); clog.fill('*'); clog << "\n"; clog.width(10); clog << x; clog << "\n"; clog.width(10); clog << y;

446

clog << "\n"; clog.width(10); clog << z; clog.flush(); getch(); }

9. Xut ra my in
Trong s 4 dng tin chun khng dng no gn vi my in. Nh vy khng th dng cc dng ny xut d liu ra my in. xut d liu ra my in (cng nh nhp, xut trn tp) cn to ra cc dng tin mi v cho n gn vi thit b c th. C++ cung cp 3 lp stream lm iu ny, l cc lp: ifstream ofstream dng to dng nhp dng to dng xut

fstream dng to dng nhp, dng xut hoc dng nhp-xut Mi lp c 4 hm to dng khai bo cc dng tin (i tng dng tin). Trong mc sau s ni thm v cc hm to ny. to mt dng xut v gn n vi my in ta c th dng mt trong cc hm to sau: ofstream Tn_dng_tin(int fd) ; ofstream Tn_dng_tin(int fd, char *buf, int n) ; Trong : + Tn_dng_tin l tn bin i tng kiu ofstream hay gi l tn dng xut do chng ta t t. + fd (file descriptor) l ch s tp tin. Ch s tp tin nh sn i vi stdprn (my in chun) l 4.

447

+ Cc tham s buf v n xc nh mt vng nh n byte do buf tr ti. Vng nh s c dng lm b m cho dng xut. V d 1 cu lnh: ofstream prn(4) ; s to dng tin xut prn v gn n vi my in chun. Dng prn s c b m mc nh. D liu trc ht chuyn vo b m, khi y b m th d liu s c y t b m ra dng prn. ch ng yu cu y d liu t b m ra dng prn c th s dng phng thc flush hoc b phn nh dng flush. Cch vit nh sau: prn.flush(); // Phng thc prn << flush ; // B phn nh dng Cc cu lnh sau s xut d liu ra prn (my in) v ngha ca chng nh sau: prn << \nTong = << (4+9) ; // a mt dng vo b m prn << \nTich = << (4*9); // a tip dng th 2 vo b m prn.flush(); // y d liu t b m ra my in (in 2 dng) Cc cu lnh di y cng xut d liu ra my in nhng s in tng dng mt: prn << \nTong = << (4+9) << flush ; // In mt dng prn << \nTich = << (4*9) ; << flush // In dng th hai V d 2: Cc cu lnh char buf[1000] ; ofstream prn(4,buf,1000) ; s to dng tin xut prn v gn n vi my in chun. Dng xut prn s dng 1000 byte ca mng buf lm b m. Cc cu lnh di y cng xut d liu ra my in: prn << \nTong = << (4+9) ; // a d liu vo b m prn << \nTich = << (4*9) ; // a d liu vo b m prn.flush() ; // Xut 2 dng ( b m) ra my in Ch : Trc khi kt thc chng trnh, d liu t b m s c t ng y ra my in.

448

Chng trinh minh ho: Chng trnh di y tng t nh chng trnh trong mc 7.3 (ch sa i phng thc xut) nhng thay vic xut ra mn hnh bng xut ra my in. //CT7_08B.CPP // Xuat ra may in // Bo phan dinh dang // Ham dinh dang #include <iostream.h> #include <iomanip.h> #include <conio.h> struct TS { int sobd; char ht[25]; float dt,dl,dh,td; }; class TSINH { private: TS *ts; int sots; public: TSINH() { ts=NULL;

449

sots=0; } TSINH(int n) { ts=new TS[n+1]; sots=n; } ~TSINH() { if (sots) { sots=0; ts = NULL; } } void nhap(); void sapxep(); void xuat(); }; void TSINH::nhap() { if (sots) for (int i=1; i<=sots; ++i) {

450

cout << "\nThi sinh "<< i << ": " ; cout << "\nSo bao danh: " ; cin >> ts[i].sobd; cin.ignore(); cout << "Ho ten: " ; cin.get(ts[i].ht,25); cout << "Diem toan, ly , hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh; ts[i].td = ts[i].dt + ts[i].dl + ts[i].dh; } } void TSINH::sapxep() { int i,j; for (i=1; i< sots; ++i) for (j=i+1; j<= sots; ++j) if (ts[i].td < ts[j].td) { TS tg; tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } }

451

void TSINH::xuat() { ostream prn(4); if (sots) { prn << "\nDanh sach thi sinh:" ; prn.precision(1); prn << setiosflags(ios::left); prn << "\n" << setw(20) <<"Ho ten" << setw(8) << "So BD"<< setw(10) << "Tong diem"; for (int i=1; i<=sots; ++i) prn << "\n" << setw(20)<<setiosflags(ios::left) <<ts[i].ht << setw(4) << setfill('0')<<setiosflags(ios::right)<< ts[i].sobd << " " << setfill(32) <<setiosflags(ios::left|ios::showpoint)

<<setw(10)<< ts[i].td; } } void main() { int n; clrscr(); cout << "\nSo thi sinh: "; cin>>n; TSINH *t = new TSINH(n);

452

t->nhap() ; t->sapxep(); t->xuat(); getch(); delete t; }

10. Lm vic vi tp
10.1. Cc lp dng nhp, xut d liu ln tp Nh ni trn, C++ cung cp 4 dng tin chun lm vic vi bn phm v mn hnh. Mun nhp xut ln tp chng ta cn to cc dng tin mi (khai bo cc i tng Stream) v gn chng vi mt tp c th. C++ cung cp 3 lp stream lm iu ny, l cc lp: ofstream dng to cc dng xut (ghi tp) ifstream dng to cc dng nhp (c tp) fstream dng to cc dng nhp, dng xut hoc dng nhp-xut

S dn xut cc lp nh sau: ios

ostream

fstreambas e

istream

ofstream

ifstream

fstream

453

10.2. Ghi d liu ln tp Th tc ghi d liu ln tp nh sau: 1. Dng lp ofstream to ra mt dng xut v gn n vi mt tp c th. Khi vic xut d liu ra dng ny ng ngha vi vic ghi d liu ln tp. 2. Thc hin xut d liu ra dng xut va to nh th xut d liu ra dng xut chun cout. 10.3. c d liu t tp Th tc c d liu t tp nh sau: 1. Dng lp ifstream to ra mt dng nhp v gn n vi mt tp c th. Khi vic nhp d liu t dng ny ng ngha vi vic c d liu t tp. 2. Thc hin nhp d liu t dng nhp va to nh th nhp d liu t dng nhp chun cin. 10.4. c - ghi d liu ng thi trn tp Th tc c-ghi d liu ng thi trn tp nh sau: 1. Dng lp fstream to ra mt dng nhp-xut v gn n vi mt tp c th. 2. Thc hin nhp d liu t dng nhp-xut va to nh th nhp d liu t dng nhp chun cin. 3. Thc hin xut d liu ra dng nhp-xut va to nh th xut d liu ra dng xut chun cout. Nhn xt: Nh vy: 1. Vic xut d liu ra my in hoc ln tp c thc hin hon ton ging nh xut d liu ra dng xut chun cout (mn hnh). 2. Vic c d liu t tp c thc hin hon ton ging nh nhp d liu t dng nhp chun cin (bn phm). 11. Ghi d liu ln tp 11.1. Lp ofstream ghi d liu ln tp chng ta s dng lp ofstream. Lp ofstream tha k cc phng thc ca cc lp ios v ostream. N cng tha k phng thc:

454

close ca lp fstreambase. Ngoi ra lp ofstream c thm cc hm to v cc phng thc sau: 1. Hm to: ofstream() ; // Khng i dng to mt i tng ofstream (dng xut), cha gn vi tp. 2. Hm to: ofstream(const char *fn, int mode = ios::out, int prot = filebuf::openprot);dng to mt i tng ofstream, m tp c tn fn ghi v gn i tng va to vi tp c m. + Tham s fn cho bit tn tp. + Tham s mode c gi tr mc nh l ios::out (m ghi). Tham s ny c th l mt hp ca cc gi tr sau: ios::binary ghi theo kiu nh phn (mc nh theo kiu vn bn) ios::out ghi tp, nu tp c th n b xo ios::app ghi b sung vo cui tp ios::ate chuyn con tr tp ti cui tp sau khi m tp

ios::trunc xo ni dung ca tp nu n tn ti ios::nocreate ios::noreplace nu tp cha c th khng lm g (b qua) nu tp c th khng lm g (b qua)

+ Tham s th ba prot quy nh cp bo v ca dng tin, tham s ny c th b qua v n c gn mt gi tr mc nh. 3. Hm to: ofstream(int fd); dng to mt i tng ofstream v gn n vi mt tp c ch s fd ang m.

455

( m v ly ch s (s hiu) tp c th dng hm _open, xem cun K thut Lp trnh C ca tc gi). 4. Hm to: ofstream(int fd, char *buf, int n); dng to mt i tng ofstream , gn n vi mt tp c ch s fd ang m v s dng mt vng nh n byte do buf tr ti lm b m. 5. Phng thc: void open(const char *fn, int mode = ios::out, int prot = filebuf::openprot);dng m tp c tn fn ghi v gn n vi i tng ofstream. Cc tham s ca phng thc c cng ngha nh trong hm to th 2. 11.2. Cc cch ghi tp C 2 cch chnh sau: + Cch 1: Dng hm to 2 xy dng mt dng xut, m mt tp ghi v gn tp vi dng xut. Sau dng ton t xut << v cc phng thc xut d liu ra dng xut va to nh th xut d liu ra cout (xem cc mc trn). + Cch 2: Dng hm to 1 xy dng mt dng xut. Sau dng phng thc open m mt tp c th v cho gn vi dng xut va xy dng. Khi khng cn lm vic vi tp ny na, chng ta c th dng phng thc close chm dt mi rng buc gia dng xut v tp. Sau c th gn dng xut vi tp khc. Theo cch ny, c th dng mt dng xut (i tng ofstream) xut d liu ln nhiu tp khc nhau. 11.3. V d Chng trnh 1: Chng trnh di y s nhp danh sch n th sinh. Thng tin th sinh gm: H tn, tnh hoc thnh ph c tr, s bo danh, cc im ton l ho. D liu th sinh c ghi trn 2 tp: Tp DS1.DL ghi th sinh theo th t nhp t bn phm, tp DS2.DL ghi th sinh theo th t gim ca tng im. Cu trc ca 2 tp nh sau: Dng u ghi mt s nguyn bng s th sinh. Cc dng tip theo ghi d liu ca th sinh. Mi th sinh ghi trn 2 dng, dng 1 ghi h tn trn 24 v tr v tn tnh trn 20 v tr. Dng 2 ghi s bo danh (6 v tr), cc im ton, l , ho v tng im (mi im ghi trn 6 v tr trong mt v tr cha phn phn). Chng trnh s

456

dng lp TS (Th sinh) c 3 phng thc: Nhp, sp xp v ghi tp. Cch ghi tp s dng y l cch 1: Dng hm to dng 2 ca lp ofstream. Chng trnh 2 ngay bn di cng gii quyt cng bi ton nu trn nhng s dng cch ghi tp th 2 (dng hm to 1 v phng thc open) Mt iu ng ni y l vic nhp mt chui k t (nh h tn v tn tnh) bng cc phng thc get hoc getline cha c thun tin, v 2 l do sau: th nht l cc phng thc ny c th b k t chuyn dng (cn st trn cin) lm tri. Th hai l cc phng thc ny c th li mt s k t trn dng cin (nu s k t g nhiu hn so vi quy nh) v cc k t ny s gy nh hng n cc php nhp tip theo. khc phc cc nhc im trn, chng ta a vo 2 chng trnh trn hm getstr nhp chui k t t bn phm.

//CT7_10.CPP // Ghi Tep #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> void getstr(char *str,int n) { char tg[21]; while(1) // B qua Enter v nhp ti a n-1 k t { cin.get(str,n); if (str[0])

457

break; else cin.ignore(); } while(1) // Loi cc k t cn li ra khi dng nhp cin { cin.get(tg,20); if (tg[0]==0) { cin.ignore(); break; } } }

struct TSINH { char ht[25]; char ttinh[21]; int sobd; float dt,dl,dh,td; }; class TS {

458

private: int sots; TSINH *ts; public: TS() { sots=0; ts = NULL; } void nhap(); void sapxep(); void ghitep(char *ttep); }; void TS::nhap() { cout << "\n So thi sinh: " ; cin >> sots ; int n=sots; ts = new TSINH[n+1]; for (int i=1; i<=n; ++i) { cout << "\n Nhap thi sinh thu: " << i << endl; cout << "Ho ten: " ; getstr(ts[i].ht,25);

459

cout << "Tinh hoac thanh pho: " ; getstr(ts[i].ttinh,21); cout << "So bao danh: " ; cin >> ts[i].sobd ; cout << "Cac diem toan, ly, hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh ; ts[i].td =ts[i].dt + ts[i].dl + ts[i].dh ; } } void TS::sapxep() { int n = sots; for (int i=1; i< n; ++i) for (int j=i+1; j<= n; ++j) if (ts[i].td < ts[j].td) { TSINH tg = ts[i]; ts[i] = ts[j]; ts[j] = tg; } } void TS::ghitep(char *ttep) { ofstream f(ttep);

460

f << sots ; f << setprecision(1) << setiosflags(ios::showpoint); for (int i=1; i<=sots; ++i) { f << endl << setw(24) << ts[i].ht << setw(20) << ts[i].ttinh ; f << endl << setw(6) << ts[i].sobd << setw(6) << ts[i].dt << setw(6) << ts[i].dl << setw(6) << ts[i].dh << setw(6) << ts[i].td ; } f.close(); } void main() { clrscr(); TS t; t.nhap(); t.ghitep("DS1.DL"); t.sapxep(); t.ghitep("DS2.DL"); cout << "\n Hoan thanh"; getch(); }

461

Chng trnh 2: //CT7_11.CPP // Ghi Tep #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> void getstr(char *str,int n) { char tg[21]; while(1) { cin.get(str,n); if (str[0]) break; else cin.ignore(); } while(1) { cin.get(tg,20); if (tg[0]==0)

462

{ cin.ignore(); break; } } } struct TSINH { char ht[25]; char ttinh[21]; int sobd; float dt,dl,dh,td; }; class TS { private: int sots; TSINH *ts; public: TS() { sots=0; ts = NULL; }

463

void nhap(); void sapxep(); void ghitep(char *ttep); }; void TS::nhap() { cout << "\n So thi sinh: " ; cin >> sots ; int n=sots; ts = new TSINH[n+1]; for (int i=1; i<=n; ++i) { cout << "\n Nhap thi sinh thu: " << i << endl; cout << "Ho ten: " ; getstr(ts[i].ht,25); cout << "Tinh hoac thanh pho: " ; getstr(ts[i].ttinh,21); cout << "So bao danh: " ; cin >> ts[i].sobd ; cout << "Cac diem toan, ly, hoa: " ; cin >> ts[i].dt >> ts[i].dl >> ts[i].dh ; ts[i].td =ts[i].dt + ts[i].dl + ts[i].dh ; } }

464

void TS::sapxep() { int n = sots; for (int i=1; i< n; ++i) for (int j=i+1; j<= n; ++j) if (ts[i].td < ts[j].td) { TSINH tg = ts[i]; ts[i] = ts[j]; ts[j] = tg; } } void TS::ghitep(char *ttep) { ofstream f; f.open(ttep,ios::out|ios::noreplace); if (f.bad()) { cout << "\nTep " << ttep << " da ton tai"; cout << "\nCo ghi de? - C/K"; int ch=getch(); if (toupper(ch)=='C') { f.close();

465

f.open(ttep) ; } else exit(1); } f << sots ; f << setprecision(1) << setiosflags(ios::showpoint); for (int i=1; i<=sots; ++i) { f << endl << setw(24) << ts[i].ht << setw(20) << ts[i].ttinh ; f << endl << setw(6) << ts[i].sobd << setw(6) << ts[i].dt << setw(6) << ts[i].dl << setw(6) << ts[i].dh << setw(6) << ts[i].td ; } f.close(); } void main() { clrscr(); TS t; t.nhap(); t.ghitep("DS1.DL");

466

t.sapxep(); t.ghitep("DS2.DL"); cout << "\n Hoan thanh"; getch(); }

12. c d liu t tp
12.1. Lp ifstream c d liu t tp chng ta s dng lp ifstream. Lp ifstream tha k cc phng thc ca cc lp ios v istream. N cng tha k phng thc: close ca lp fstreambase. Ngoi ra lp ifstream c thm cc hm to v cc phng thc sau: 1. Hm to: ifstream() ; // Khng i dng to mt i tng ifstream (dng nhp), cha gn vi tp. 2. Hm to: ifstream(const char *fn, int mode = ios::in, int prot = filebuf::openprot); dng to mt i tng ifstream, m tp c tn fn c v gn i tng va to vi tp c m. + Tham s fn cho bit tn tp. + Tham s mode c gi tr mc nh l ios::in (m c). Tham s ny c th l mt hp ca cc gi tr sau: ios::binary c theo kiu nh phn (mc nh theo kiu vn bn)

467

ios::ate

chuyn con tr tp ti cui tp sau khi m tp

+ Tham s th ba prot quy nh cp bo v ca dng tin, tham s ny c th b qua v n c gn mt gi tr mc nh. 3. Hm to: ifstream(int fd); dng to mt i tng ifstream v gn n vi mt tp c ch s fd ang m. ( m v ly ch s (s hiu) tp c th dng hm _open, xem cun K thut Lp trnh C ca tc gi) 4. Hm to: ifstream(int fd, char *buf, int n); dng to mt i tng ifstream , gn n vi mt tp c ch s fd ang m v s dng mt vng nh n byte do buf tr ti lm b m. 5. Phng thc: void open(const char *fn, int mode = ios::in, int prot = filebuf::openprot); dng m tp c tn fn c v gn n vi i tng ifstream. Cc tham s ca phng thc c cng ngha nh trong hm to th 2. 12.2. Cc cch c tp C 2 cch chnh sau: + Cch 1: Dng hm to 2 xy dng mt dng nhp, m mt tp c v gn tp vi dng nhp. Sau dng ton t nhp >> v cc phng thc nhp d liu t dng nhp va to nh th nhp d liu t cin (xem cc mc trn) + Cch 2: Dng hm to 1 xy dng mt dng nhp. Sau dng phng thc open m mt tp c th v cho gn vi dng nhp va xy dng. Khi khng cn lm vic vi tp ny na, chng ta c th dng phng thc close chm dt mi rng buc gia dng nhp v tp. Sau c th gn dng nhp vi tp khc. Theo cch ny, c th dng mt dng nhp (i tng ifstream) nhp d liu t nhiu tp khc nhau.

468

12.3. Kim tra s tn ti ca tp, kim tra cui tp + Khi m mt tp c m tp khng tn ti th s pht sinh li, khi phng thc bad tr v gi tr khc khng. V d kim tra xem tp DSTS (Danh sch th sinh) tn ti hay khng c th dng on chng trnh: ifstream fin(DSTS); if (fin.bad()) { cout << \nTep DSTS khng tn tai; exit(1); } + Trong qu trnh c, con tr tp s chuyn dn v cui tp. Khi con tr tp cui tp (ht d liu) m vn thc hin mt lnh c th phng thc eof s cho gi tr khc khng. Chng trnh di y dng phng thc eof xc nh di (s byte) ca tp TC.EXE (ch cn dng kiu c nh phn): //CT7_14.CPP // Do dai tep #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> void main() { clrscr(); long dd=0; char ch;

ifstream f("TC.EXE",ios::in | ios::binary); if (f.bad())

469

{ cout << "\nTep TC.EXE khong ton tai"; getch(); exit(1); } while(f.get(ch),!f.eof()) ++dd; cout << "\n Do dai TC.EXE: " << dd; getch(); } 12.4. V d Chng trnh di y s: + c danh sch th sinh t tp DS1.DL do chng trnh trong muc 11 to ra. + In danh sch th sinh va c. + Sp xp dy th sinh (va nhp t tp) theo th t gim ca tng im. + Ghi danh sch th sinh sau khi sp xp ln tp DS3.DL + c danh sch th sinh t tp DS3.DL + In danh sch th sinh c t tp DS3.DL Chng trnh s dng lp TS (Th sinh) c 4 phng thc: void xuat(); void sapxep(); void ghitep(char *ttep); void doctep(char *ttep); //CT7_12.CPP // Doc tep

470

#include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> struct TSINH { char ht[25]; char ttinh[21]; int sobd; float dt,dl,dh,td; }; class TS { private: int sots; TSINH *ts; public: TS() { sots=0; ts = NULL; }

471

void xuat(); void sapxep(); void ghitep(char *ttep); void doctep(char *ttep); }; void TS::xuat() { cout << "\n\nSo thi sinh: " << sots; cout << setprecision(1) << setiosflags(ios::showpoint); for (int i=1; i<=sots; ++i) { cout << "\nThi sinh thu: " << i ; cout << "\nHo ten: " << ts[i].ht ; cout << "\nTinh - thanh pho: " << ts[i].ttinh ; cout << "\nSo bao danh: " << ts[i].sobd ; cout << "\nCac diem toan, ly, hoa: " << setw(5) << ts[i].dt << setw(5) << ts[i].dl << setw(5) << ts[i].dh ; cout << "\nTong diem: " << ts[i].td ; } } void TS::sapxep() {

472

int n = sots; for (int i=1; i< n; ++i) for (int j=i+1; j<= n; ++j) if (ts[i].td < ts[j].td) { TSINH tg = ts[i]; ts[i] = ts[j]; ts[j] = tg; } } void TS::ghitep(char *ttep) { ofstream f; f.open(ttep,ios::out|ios::noreplace); if (f.bad()) { cout << "\nTep " << ttep << " da ton tai"; cout << "\nCo ghi de? - C/K"; int ch=getch(); if (toupper(ch)=='C') { f.close(); f.open(ttep) ; }

473

else exit(1); } f << sots ; f << setprecision(1) << setiosflags(ios::showpoint); for (int i=1; i<=sots; ++i) { f << endl << setw(24) << ts[i].ht << setw(20) << ts[i].ttinh ; f << endl << setw(6) << ts[i].sobd << setw(6) << ts[i].dt << setw(6) << ts[i].dl << setw(6) << ts[i].dh << setw(6) << ts[i].td ; } f.close(); } void TS::doctep(char *ttep) { ifstream f; f.open(ttep); if (f.bad()) { cout << "\nTep " << ttep << " khong ton tai"; getch();

474

exit(1); } f >> sots ; f.ignore(); if (ts!=NULL) delete ts; ts = new TSINH[sots+1]; for (int i=1; i<=sots; ++i) { f.get(ts[i].ht,25).get(ts[i].ttinh,21); ; f >> ts[i].sobd >> ts[i].dt >> ts[i].dl >> ts[i].dh >> ts[i].td ; f.ignore(); } f.close(); } void main() { clrscr(); TS t; t.doctep("DS1.DL"); t.xuat(); t.sapxep(); t.ghitep("DS3.DL"); t.doctep("DS3.DL");

475

t.xuat(); cout << "\n Hoan thanh"; getch(); }

13. c ghi ng thi trn tp


13.1. Lp fstream c ghi ng thi trn tp, chng ta s dng lp fstream. Lp fstream tha k cc phng thc ca cc lp ofstream v ifstream. Ngoi ra lp fstream c cc hm to v phng thc sau: 1. Hm to: fstream() ; // Khng i dng to mt i tng fstream (dng nhp-xut), cha gn vi tp. 2. Hm to: fstream(const char *fn, int mode, int prot = filebuf::openprot); dng to mt i tng fstream, m tp c tn fn v gn i tng va to vi tp c m. + Tham s fn cho bit tn tp. + Tham s mode quy nh cc kiu truy nhp v c th l t hp ca cc gi tr sau: ios::binary c-ghi theo kiu nh phn (mc nh theo kiu vn bn). ios::out ghi tp, nu tp c th n b xo ios::in c tp

ios::app ghi b sung vo cui tp ios::ate chuyn con tr tp v cui sau khi m

ios::trunc xo ni dung ca tp nu n tn tI

476

ios::nocreate ios::noreplace Ch :

nu tp cha c th khng lm g (b qua) nu tp c th khng lm g (b qua)

+ Tham s mode khng c gi tr mc nh. + Tham s th ba prot quy nh cp bo v ca dng tin, tham s ny c th b qua v n c gn mt gi tr mc nh. 3. Hm to: fstream(int fd); dng to mt i tng fstream v gn n vi mt tp c ch s fd ang m. ( m v ly ch s (s hiu) tp c th dng hm _open, xem cun K thut Lp trnh C ca tc gi) 4. Hm to: fstream(int fd, char *buf, int n); dng to mt i tng fstream , gn n vi mt tp c ch s fd ang m v s dng mt vng nh n byte do buf tr ti lm b m. 5. Phng thc: void open(const char *fn, int mode, int prot = filebuf::openprot); dng m tp c tn fn v gn n vi i tng fstream. Cc tham s ca phng thc c cng ngha nh trong hm to th 2. Ch : Tham s mode khng c gi tr mc nh. 13.2. Cc cch c-ghi ng thi trn tp C 2 cch chnh sau: + Cch 1: Dng hm to 2 xy dng mt dng nhp-xut, m mt tp c-ghi v gn tp vi dng nhp-xut. Sau dng ton t nhp >> , ton t xut >> v cc phng thc

477

nhp, xut nhp, xut d liu ra dng nhp-xut va to (nh i vi cc dng chun cin v cout). V d: fstream f(DU_LIEU, ios::in | ios::out) ; + Cch 2: Dng hm to 1 xy dng mt dng nhp-xut. Sau dng phng thc open m mt tp c th ( c v ghi) v cho gn vi dng nhp-xut va xy dng. Khi khng cn lm vic vi tp ny na, chng ta c th dng phng thc close chm dt mi rng buc gia dng nhp-xut v tp. Sau c th gn dng nhp-xut vi tp khc. Theo cch ny, c th dng mt dng nhp-xut (i tng fstream) c-ghi d liu t nhiu tp khc nhau. V d: fstream f; f.open(DU_LIEU, ios::in | ios::out) ; 13.3. Di chuyn con tr tp 13.3.1. di chuyn con tr tp trn dng xut, chng ta s dng cc phng thc sau (ca lp ostream) : 1. Phng thc ostream& seekp(long n) ; s chuyn con tr tp ti v tr (byte) th n (s th t cc byte tnh t 0). 2. Phng thc ostream& seekp(long offset, seek_dir dir) ; s chuyn con tr tp ti v tr offset k t v tr xut pht dir. Gi tr ca offset c th m, cn dir c th nhn mt trong cc gi tr sau: ios::beg xut pht t u tp ios::end xut pht t cui tp ios::cur xut pht t v tr hin ti ca con tr tp

3. Phng thc long teelp() ;

478

cho bit v tr hin ti ca con tr tp. 13.3.2. di chuyn con tr tp trn dng nhp, chng ta s dng cc phng thc sau (ca lp istream): 4. Phng thc istream& seekg(long n) ; s chuyn con tr tp ti v tr (byte) th n (s th t cc byte tnh t 0) 5. Phng thc istream& seekg(long offset, seek_dir dir) ; s chuyn con tr tp ti v tr offset k t v tr xut pht dir. Gi tr ca offset c th m, cn dir c th nhn mt trong cc gi tr sau: ios::beg xut pht t u tp ios::end xut pht t cui tp ios::cur xut pht v tr hin ti ca con tr tp

6. Phng thc long teelg() ; cho bit v tr hin ti ca con tr tp. 13.3.3. di chuyn con tr tp trn dng nhp-xut, chng ta c th s dng c 6 phng thc nu trn. 13.4. V d V d 1. Trong 12 vit chng trnh xc nh di ca tp TC.EXE. Di y l mt phng n khc n gin hn: fstream f(TC.EXE); f.seekg(0,ios::end); do_dai = f.teelg();

479

V d 2. Chng trnh di y s nhp danh sch n th sinh t bn phm v ghi ln tp. Sau a con tr tp v u tp v bt u c d liu th sinh t tp in ra mn hnh. Thng tin th sinh gm: H tn, tnh hoc thnh ph c tr, s bo danh, cc im ton l ho. //CT7_13.CPP // ghi - c ng thi #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> #include <stdio.h> void main() { char ht[25], ttinh[21], ttep[40]; int sobd,stt ; float dt, dl, dh, td; fstream f; cout << "\nTen tep: " ; cin >> ttep; f.open(ttep,ios::out|ios::in|ios::noreplace); if (f.bad()) { cout << "\nTep " << ttep << " da ton tai"; cout << "\nCo ghi de? - C/K";

480

int ch=getch(); if (toupper(ch)=='C') { f.close(); f.open(ttep,ios::out|ios::in|ios::trunc) ; } else exit(1); } stt=0 ; f << setprecision(1) << setiosflags(ios::showpoint); while(1) { ++stt; cout << "\nNhap thi sinh thu: " << stt ; cout << "\nHo ten (neu rong thi ket thuc nhap) : "; cin.ignore(); cin.getline(ht,25); if (ht[0]==0) break; cout << "Tinh - thanh pho: "; cin.getline(ttinh,21); cout << "SoBD, diem toan, diem ly, diem hoa: " ; cin >> sobd >> dt>> dl >> dh ; td = dt + dl + dh ;

481

if (stt>1) f << endl; f << setw(24) << ht << setw(20) << ttinh ; f << endl << setw(6) << sobd << setw(6) << dt << setw(6) << dl << setw(6) << dh << setw(6) << td ; } f.seekg(0); stt=0; clrscr(); cout << "\nDanh sach thi sinh\n"; cout << setprecision(1) << setiosflags(ios::showpoint); while(1) { f.getline(ht,25).getline(ttinh,21); if (f.eof()) break; ++stt; f >> sobd >> dt >> dl >> dh >> td; f.ignore(); cout << "\nThi sinh thu: " << stt ; cout << "\nHo ten: "<< ht; cout << " \nTinh - thanh pho: " << ttinh;

482

cout << "\nSo bao danh: " << sobd; cout << "\nDiem toan, ly, hoa va tong diem: " <<setw(6)<< dt << setw(6) <<dl << setw(6) << dh << setw(6) << td ; } f.close(); cout << "\n Hoan thanh"; getch(); }

14. X l li
Khi lm vic vi tp khng phi mi vic u tri chy m thng xy ra nhiu iu trc trc, chng hn: 1. M mt tp c nhng tp khng tn ti. 2. c d liu nhng con tr tp cui tp 3. Ghi d liu nhng ht khng gian a (a y). 4. To tp nhng ia hng, hoc a cm ghi hoc a y. 5. Dng tn tp khng hp l 6. nh thc hin mt thao tc nhng tp li khng c m mode ph hp thc hin thao tc . Tm li khi lm vic vi tp thng gp nhiu li khc nhau, nu khng bit cch pht hin x l th chng trnh s dn n ri lon hoc cho kt qu sai. Trong lp ios ca C++ c nhiu phng thc cho php pht hin li khi lm vic vi tp. l: 1. Phng thc int eof() ;

483

Nu con tr tp cui tp m li thc hin mt lnh c d liu th phng thc eof() tr v gi tr khc khng, tri li phng thc c gi tr bng 0. 2. Phng thc int fail() ; Phng thc fail() tr v gi tr khc khng nu ln nhp xut cui cng c li, tri li phng thc c gi tr bng 0. 3. Phng thc int bad() ; Phng thc bad() tr v gi tr khc khng khi mt php nhp xut khng hp l hoc c li m cha pht hin c, tri li phng thc c gi tr bng 0. 4. Phng thc int good() ; Phng thc good() tr v gi tr khc khng nu mi vic u tt p ( khng c li no xy ra). Khi c mt li no th phng thc c gi tr bng 0. 5. Phng thc void clear() ; dng tt tt c cc bit li. V d 1. Khi m tp c cn kim tra xem tp c tn ti khng. lm iu , chng ta c th dng on chng sau: char ten_tep[40] ; cout << \n Cho bit tn tp: ; cin >> ten_tep ;
426 ifstream f(ten_tep);

if (f.bad()) { cout << \n Tp << ten_tep << khng tn ti ;

484

exit(1) ; } V d 2. Khi to tp mi ghi cn kim tra xem c to c tp hay khng. lm iu , chng ta c th dng on chng sau: char ten_tep[40] ; cout << \n Cho bit tn tp: ; cin >> ten_tep ; ofstream f(ten_tep); if (f.bad()) { cout << \n Khng to c tp << ten_tep ; exit(1) ; } V d 3. xc nh di ca tp, c th dng phng thc eof() v thut ton sau: + c mt byte (ch phi c theo kiu nh phn) + Nu vic c thnh cng ( eof()=0 ) th cng thm mt vo b m. Nu vic c khng thnh ( eof() != 0 ) th kt thc vng lp. Thut ton trn c th hin bng on chng trnh sau: ifstream f(ten_tep, ios::in | ios::binary) ; long dem = 0 ; char ch; while (1) { f.get(ch) ; if (!eof()) dem++ ; else break;

485

15. Nhp xut nh phn


15.1. Chn kiu nhp xut nh phn Kiu nhp xut mc nh l vn bn. chn kiu nhp xut nh phn, th trong tham s mode (ca hm to dng 2 v phng thc open) cn cha gi tr: ios::binary V d mun m tp DSTS.DL c-ghi theo kiu nh phn v gn tp vi dng nhp-xut fs , ta dng cu lnh sau: fstream fs(DSTS.DL , ios::in | ios::out | ios::binary) ; 15.2. c, ghi k t + ghi mt k t ln tp c th dng phng thc: ostream & put(char) ; + c mt k t t tp c th dng phng thc: istream & get(char &) ; Cn ch rng: Cch c ghi k t theo kiu vn bn khc vi cch c ghi k t theo kiu nh phn (xem chng 10, cun K thut lp trnh C ca tc gi) V d sao tp c th dng thut ton n gin sau: + c mt k t t tp ngun + Nu c thnh cng ( phng thc eof() = 0) th ghi ln tp ch v li tip tc c k t tip theo. + Nu c khng thnh cng ( phng thc eof() != 0) th kt thc. Ch l phi dng kiu nhp xut nh phn th thut ton mi cho kt qu chnh xc. Chng trnh sao tp di y vit theo thut ton trn. //CT7_15.CPP

486

// Sao tep #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> void main() { clrscr(); char tep_nguon[40], tep_dich[40] ; char ch; fstream fnguon, fdich; cout << "\nTen tep nguon: " ; cin >> tep_nguon; cout << "\nTen tep dich: " ; cin >> tep_dich; fnguon.open(tep_nguon,ios::in | ios::binary); fdich.open(tep_dich,ios::out | ios::binary); if (fnguon.bad() || fdich.bad() ) { cout << "\n Loi mo tep nguon hoac dich " ; getch(); exit(1); } while(fnguon.get(ch),!fnguon.eof()) fdich.put(ch) ; fnguon.close();

487

fdich.close(); cout << "\nHoan thanh" ; getch(); } 15.3. c, ghi mt dy k t theo kiu nh phn + Phng thc: ostream & write(char *buf, int n) ; s xut n k t (byte) cha trong buf ra dng xut. + Phng thc: istream & read(char *buf, int n) ; s nhp n k t (byte) t dng nhp v cha vo buf. + Phng thc int gcount cho bit s k t thc s c c trong phng thc read. Ch : Cc phng thc write, read ch lm vic mt cch chnh xc trong kiu nhp-xut nh phn. Di y l chng trnh sao tp s dng cc phng thc write, read v gcount. //CT7_16.CPP // Sao tep dung write, read va gcount #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> void main()

488

{ clrscr(); char tep_nguon[40], tep_dich[40] ; char buf[5000]; int n; fstream fnguon, fdich; cout << "\nTen tep nguon: " ; cin >> tep_nguon; cout << "\nTen tep dich: " ; cin >> tep_dich; fnguon.open(tep_nguon,ios::in | ios::binary); fdich.open(tep_dich,ios::out | ios::binary); if (fnguon.bad() || fdich.bad() ) { cout << "\n Loi mo tep nguon hoac dich " ; getch(); exit(1); } while(fnguon.read(buf,5000),(n=fnguon.gcount())) fdich.write(buf,n) ; fnguon.close(); fdich.close(); cout << "\nHoan thanh" ; getch(); }

489

16. c ghi ng thi theo kiu nh phn


Chng trnh di y minh ho cch c ghi ng thi trn tp theo kiu nh phn. Chng trnh s dng cc phng thc write, read, cc phng thc di chuyn con tr tp v cc phng thc kim tra li. Chng trnh gm 3 chc nng: 1. Nhp mt danh sch th sinh mi v ghi vo tp TS.DL 2. B sung th sinh vo tp TS.DL 3. Xem sa th sinh trn tp TS.DL //CT7_18.CPP // Doc tep #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <stdio.h> struct TSINH { char ht[25]; int sobd; float td; }; class TS

490

{ private: TSINH ts; char ten_tep[40]; int sots; static int size; public: TS(char *ttep); void tao_ds(); void bo_sung(); void xem_sua(); }; int TS::size = sizeof(TSINH); TS::TS(char *ttep) { strcpy(ten_tep,ttep); fstream f; f.open(ten_tep,ios::binary|ios::in|ios::ate); if (!f.good()) sots = 0 ; else { sots=f.tellg()/size ; }

491

} void TS::tao_ds() { fstream f; f.open(ten_tep,ios::binary|ios::out|ios::noreplace); if (!f.good()) { cout << "\nDanh sach da ton tai" ; cout << "\nCo tao lai khong? - C/K" ; char ch=getch(); if (toupper(ch) != 'C') return; else { f.close(); f.open(ten_tep,ios::binary|ios::out|ios::trunc); } } sots=0; while(1) { cout << "\nThi sinh thu: " << (sots+1) ; cout << "\nHo ten (Bam Enter de ket thuc): "; fflush(stdin);

492

gets(ts.ht); if (ts.ht[0]==0) break; cout << "\nSo bao danh: "; cin >> ts.sobd; cout << "\nTong diem: "; cin >> ts.td; f.write((char*)(&ts),size) ; sots++ ; } f.close(); } void TS::bo_sung() { fstream f; f.open(ten_tep,ios::binary|ios::app|ios::nocreate); if (!f.good()) { cout << "\nDanh sach chua tao" ; cout << "\nCo tao moi khong? - C/K" ; char ch=getch(); if (toupper(ch) != 'C') return; else {

493

f.close(); f.open(ten_tep,ios::binary|ios::out); } } int stt=0; while(1) { cout << "\nBo sung thi sinh thu: " << (stt+1); cout << "\nHo ten (Bam Enter de ket thuc): "; fflush(stdin); gets(ts.ht); if (ts.ht[0]==0) break; cout << "\nSo bao danh: "; cin >> ts.sobd; cout << "\nTong diem: "; cin >> ts.td; f.write((char*)(&ts),size) ; ++stt; } sots += stt ; f.close(); } void TS::xem_sua() {

494

fstream f; int ch; f.open(ten_tep,ios::binary|ios::out|ios::in|ios::nocreate); if (!f.good()) { cout << "\nDanh sach chua tao" ; getch(); return ; } cout << "\nDanh sach gom: " << sots << "thi sinh" ; int stt; while(1) { cout << "\nCan xem-sua thi sinh thu (Bam 0 de ket thuc): " ; cin >> stt ; if (stt<1 || stt > sots) break; f.seekg((stt-1)*size,ios::beg); f.read((char*)(&ts),size); cout << "\nHo ten : " << ts.ht; cout << "\nSo ba danh: " << ts.sobd ; cout << "\nTong diem: " << ts.td ; cout << "\nCo sua khong? - C/K" ; ch=getch(); if (toupper(ch)=='C') {

495

f.seekg(-size,ios::cur) ; cout << "\nHo ten: "; fflush(stdin); gets(ts.ht); cout << "\nSo bao danh: "; cin >> ts.sobd; cout << "\nTong diem: "; cin >> ts.td; f.write((char*)(&ts),size) ; } } f.close(); } void main() { int chon; clrscr(); TS t("TS.DL"); while(1) { clrscr(); cout << "\n1. Tao danh sach thi sinh moi" ; cout << "\n2. Bo sung danh sach thi sinh" ; cout << "\n3. Xem-sua danh sach thi sinh" ;

496

cout << "\n4. Ket thuc chuong trinh chon = getch(); chon = chon - 48; clrscr(); if (chon==1) t.tao_ds(); else if(chon==2) t.bo_sung(); else if(chon==3) t.xem_sua(); else break; } clrscr(); cout << "\n Hoan thanh"; getch(); }

";

17. Xy dng ton t nhp xut i tng trn tp


Trong cc mc trn trnh bycch dng cc ton t nhp >> v xut << ghi d liu kiu chun (nguyn, thc, k t, chui k t) trn tp. Mc ny trnh by cch xy dng cc ton t dng c ghi cc i tng ca mt lp bt k do ngi dng nh ngha. Gi s chng ta mun s dng cc ton t nhp xut c ghi cc i tng ca lp TS. Khi ta a vo cc hm bn ton t nhp xut nh sau: class TS { private: // Khai bo cc thuc tnh

497

public: friend fstream& operator<<(fstream& fs,const TS &t); friend fstream& operator>>(fstream& fs,TS &t); ... }; V kiu ghi: C th xy dng cc ton t thc hin cc php c ghi theo kiu vn bn cng nh nh phn. V d 1: Ghi theo kiu vn bn Chng trnh di y minh ho cch xy dng v s dng cc ton t nhp xut i tng trn mn hnh, bn phm v tp. Chng trnh a vo lp TS (Th sinh) v cc hm ton t cho php nhp xut cc i tng TS trn mn hnh, bn phm v tp. Chng trnh gm cc ni dung sau: + To tp TS.DL dng c v ghi theo kiu vn bn. + Nhp 3 th sinh t bn phm v cha vo 3 bin i tng t1, t2, t3. + Ghi ni dung ca 3 bin i tng t1, t2, t3 ln tp TS.DL + c cc i tng t tp TS.DL v cha vo 3 bin t4, t5, t6 + In cc bin i tng t4, t5, t6 ra mn hnh + Chuyn con tr v u tp, dng chu trnh while ln lt c cc i tng t tp v in ra mn hnh. Dng phng thc eof kim tra xem c ht d liu hay cha. //CT7_17.CPP // Cac toan tu doc ghi doi tuong tren Tep #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h>

498

#include <ctype.h> class TS { private: char ht[25]; float td; public: friend ostream& operator<<(ostream& os,const TS &t); friend istream& operator>>(istream& is,TS &t); friend fstream& operator<<(fstream& fs,const TS &t); friend fstream& operator>>(fstream& fs,TS &t); }; fstream& operator>>(fstream& fs,TS &t) { fs.getline(t.ht,25); fs >> t.td; fs.ignore(); return fs; } ostream& operator<<(ostream& os,const TS &t) { os << "\nHo ten: " << t.ht ; os << "\nTong diem: " << t.td; return os;

499

} fstream& operator<<(fstream& fs,const TS &t) { fs << t.ht << endl; fs << t.td << endl; return fs; } istream& operator>>(istream& is,TS &t) { cout << "\nHo ten: " ; is.get(t.ht,25); cout << "Tong diem: " ; is >> t.td ; is.ignore(); return is; } void main() { clrscr(); fstream f("TS.DL",ios::out | ios::in | ios::trunc); TS t1,t2,t3,t4,t5,t6,t; cin >> t1 >> t2 >> t3; f << t1 << t2 <<t3; f.seekg(0);

500

f>>t4>>t5>>t6; cout << t4 << t5 << t6; f.seekg(0); while (f>>t ,!f.eof()) cout << t; f.close(); cout << "\n Xong"; getch(); }

V d 2 : Ghi theo kiu nh phn Chng trnh di y cng c cc chc nng nh chng trnh trong v d 1 bn trn, nhng cch ghi c tp theo kiu nh phn. //CT7_19.CPP // Cac toan tu doc ghi doi tuong tren Tep // Kieu nhi phan #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> class TS {

501

private: char ht[25]; float td; static int size; public: friend ostream& operator<<(ostream& os,const TS &t); friend istream& operator>>(istream& is,TS &t); friend fstream& operator<<(fstream& fs,const TS &t); friend fstream& operator>>(fstream& fs,TS &t); }; int TS::size= sizeof(TS); fstream& operator>>(fstream& fs,TS &t) { fs.read( (char*)(&t) , t.size); return fs; } fstream& operator<<(fstream& fs,const TS &t) { fs.write( (char*)(&t) , t.size); return fs; } ostream& operator<<(ostream& os,const TS &t) { os << t.ht << endl;

502

os << t.td << endl; return os; } istream& operator>>(istream& is,TS &t) { cout << "\nHo ten: " ; is.get(t.ht,25); cout << "Tong diem: " ; is >> t.td ; is.ignore(); return is; } void main() { clrscr(); fstream f("THU.DL",ios::binary | ios::out|ios::in|ios::trunc); TS t1,t2,t3,t4,t5,t6,t; cin >> t1 >> t2 >> t3; f << t1 << t2 <<t3; f.seekg(0); f>>t4>>t5>>t6; cout << t4 << t5 << t6; f.seekg(0); while( f>>t ,!f.eof() )

503

cout << t; f.close(); cout << "\n Xong"; getch(); }

18. H thng cc lp stream


Mc ny h thng li cc lp stream m chng ta s dng bn trn t chc xut nhp trn mn hnh, bn phm, my in v tp 18.1. S quan h gia cc lp ios

istream

fstreambas e

ostream

ifstream

ofstream

fstream 18.2. Cc phng thc ca lp ios 1. int bad() 2. void clear(int=0) 3. int eof() 4. int fail() 5. int fill()

504

6. int fill(char) 7. long flags() 8. long flags(long) 9. int good() 10. int precision() 11. int precision(int) 12. long setf(long) 13. long setf(long setbits, long field) 14. long unsetf(long) 15. int width() 16. int width(int) 18.3. Cc phng thc ca lp istream 1. operator>> 2. int gcount() 3. int get() 4. istream& get(char*, int, char = \n) 5. istream& get(char&) 6. istream& getline(char*, int, char = \n) 7. istream& ignore(int n = 1, int delim = EOF) 8. int peek() 9. istream& putback(char) 10. istream& read(char*, int) 11. istream& seekg(long) 12. istream& seekg(long, seek_dir)

505

13. long tellg()

18.4. Cc phng thc ca lp ostream 1. operator<< 2. ostream& flush() 3. ostream& put(char) 4. ostream& seekp(long) 5. ostream& seekp(long, seek_dir) 6. long tellp() 7. ostream& write(char*, int) 18.5. Cc phng thc ca lp fstreambase void close() 18.6. Cc phng thc ca lp ifstream 1. ifstream() 2. ifstream(const char*, int = ios::in, int = filebuf::openprot) 3. ifstream(int ) 4. ifstream(int , char*, int) 5. void open(const char*, int = ios::in, int = filebuf::openprot) 18.7. Cc phng thc ca lp ofstream 1. ofstream() 2. ofstream(const char*, int = ios::out, int = filebuf::openprot) 3. ofstream(int ) 4. ofstream(int , char*, int)

506

5. void open(const char*, int = ios::out, int = filebuf::openprot) 18.8. Cc phng thc ca lp fstream 1. fstream() 2. fstream(const char*, int, int = filebuf::openprot) 3. fstream(int ) 4. fstream(int , char*, int) 5. void open(const char*, int, int = filebuf::openprot)

507

Chng 8 Ha
Trong chng ny s gii thiu cc hm v cc ng v hnh c bn nh ng trn, cung elip, hnh qut, ng gy khc, hnh a gic, ng thng, ng ch nht, hnh ch nht, hnh hp ch nht, ... Ngoi ra cn cp ti cc vn rt l th khc nh: x l vn bn trn mn hnh ha, ca s v k thut to nh di ng. Cc hm ha c khai bo trong tp graphics.h.

1. Khi nim ha
hiu k thut lp trnh ha, u tin phi hiu cc yu t c bn ca ha. T trc n nay chng ta ch yu lm vic vi kiu vn bn. Ngha l mn hnh c thit lp hin th 25 dng, mi dng c th cha 80 k t. Trong kiu vn bn, cc k t hin th trn mn hnh c phn cng ca my PC n nh trc v ta khng th no thay i c kch thc, kiu ch. mn hnh ha, ta c th x l n tng chm im (pixel) trn mn hnh v do vy mun v bt k th g cng c. S bi tr v s pixel trn mn hnh c gi l phn gii (resolution). Do mi kiu mn hnh ha c mt cch x l ha ring nn TURBO C cung cp mt tp tin iu khin ring cho tng kiu ha. Bng 8-1 cho thy cc kiu ha v cc tp tin iu khin chng. Ngoi cc tp c ui BGI cha chng trnh iu khin ha, TURBO C cn cung cp cc tp tin ui CHR cha cc Font ch v cc kiu ch khc nhau trn mn hnh ha. l cc tp: GOTH.CHR LITT.CHR SANS.CHR TRIP.CHR Bng 8-1. Cc tp tin iu khin ha ca TURBO C++ Tn tp tin ATT.BGI Kiu mn hnh ha ATT & T6300 (400 dng)

508

CGA.BGI

IBMCGA, MCGA v cc my tng thch

EGAVGA.BGI IBM EGA, VGA v cc my tng thch HERC.BGI IBM8514.BGI PC3270.BGI Hercules monochrome v cc my tng thch IBM 8514 v cc my tng thch IBM 3270 PC

Mn hnh ha gm nhiu im nh c sp xp trn cc ng thng ngang v dc. iu ny ng cho tt c cc kiu mn hnh ha ca my tnh. Khc bit ch yu gia chng l kch thc v s cc im nh. Trong kiu CGA ( phn gii thp), im nh c kch thc ln, chiu ngang c 320 im nh, cn theo chiu dc c 200 im nh. Mn hnh VGA c phn gii cao hn: im nh nh hn, trn mi hng c 640 im nh v trn mi ct c 480 im nh. im nh cng nh th s im nh trn mn hnh cng nhiu v cht lng ha cng cao. Mi kiu ha dng mt h ta ring. H ta cho mn hnh VGA l 640 x 480 nh sau : (0,0) (639,0)

(0,479) Hnh 8.1. H ta VGA

(639,479)

509

Nh h ta ny, ta c th tc ng hay tham chiu n bt k im nh no trn mn hnh ha. Nu dng mn hnh CGA th gc di phi c ta (319, 199). c lp vi kiu ha ang s dng, cc hm getmaxx v getmaxy bao gi cng cho ta x v y ln nht trong kiu ha ang dng. Mt chng trnh ha thng gm cc phn sau: - Khi ng h thng ha. - Xc nh mu nn (mu mn hnh), mu ng v, mu t v kiu (mu) t. - V, t mu cc hnh m ta mong mun. - Cc thao tc ha khc nh cho hin cc dng ch... - ng h thng ha tr v mode vn bn.

2. Khi ng h ha
Mc ch ca vic khi ng h thng ha l xc nh thit b ha (mn hnh) v mt ha s s dng trong chng trnh. lm iu ny ta dng hm: void initgraph(int *graphdriver, int *graphmode,char *driverpath); trong : driverpath l ng dn ca th mc cha cc tp tin iu khin ha, graphdriver, graphmode cho bit mn hnh v mt ha s s dng trong chng trnh. Bng 8-2 cho thy cc gi tr kh d ca graphdriver v graphmode. V d 1. Gi s my tnh ca ta c mn hnh EGA, cc tp tin ha cha trong th mc C: \TC, khi ta c th khi ng h thng ha nh sau: #include "graphics.h" main() { int mh=EGA, mode= EGALO; initgraph(&mh, &mode, "C:\TC");

510

... } Bng 8-2. Cc gi tr kh d ca graphdriver, graphmode graphdriver Detect (0) CGA (1) CGAC0 (0) CGAC1 (1) CGAC2 (2) CGAC3 (3) CGAHi (4) MCGA (2) MCGA0 (0) MCGA1 (1) MCGA2 (2) MCGA3 (3) MCGAMed (4) MCGAHi (5) EGA (3) EGALO (0) EGAHi (1) EGA64 (4) EGA64LO (0) EGA64Hi (1) EGAMONO (5) EGAMONOHi (0) 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 640 x 480 640 x 200 640 x 350 640 x 200 640 x 350 640 x 350 graphmode phn gii

511

VGA (9)

VGALO (0) VGAMED (1) VGAHI (2)

640 x 200 640 x 350 640 x 480 720 x 348 320 x 200 320 x 200 320 x 200 320 x 200 640 x 400 640 x 400 720 x 350 640 x 480, 256 mu 1024 x 768, 256 mu

HERCMONO (7) ATT400 (8)

HERCMONOHI ATT400C0 (0) ATT400C1 (1) ATT400C2 (2) ATT400C3 (3) ATT400MED (4) ATT400HI (5)

PC3270 (10) IBM8514 (6)

PC3270HI (0) IBM8514LO (0) IBM8514HI (1)

Ch 1. Bng 8-2 cho cc tn hng v gi tr ca chng m cc bin graphdriver, graphmode c th nhn. Chng hn hng DETECT c gi tr 0, hng VGA c gi tr 9, hng VGALO c gi tr 0... Khi lp trnh ta c th dng tn hng hoc gi tr tng ng ca chng. Chng hn cc php gn trong v d 1 c th vit theo mt cch khc tng ng nh sau: mh=3; mode=0; Ch 2. Bng 8.2 cho thy phn gii ph thuc c vo mn hnh v mode. V d trong mn hnh EGA nu dng mode EGALO th phn gii l 640 x 200, hm getmaxx cho gi tr

512

639, hm getmaxy cho gi tr 199 . Nu cng mn hnh EGA m dng mode EGAHI th phn gii l 640x 350, hm getmaxx cho gi tr 639, hm getmaxy cho gi tr 349. Ch 3. Nu khng bit chnh xc kiu mn hnh ang s dng th ta gn cho bin graphdriver hng DETECT hay gi tr 0. Khi kt qu ca hm initgraph s l: - Kiu ca mn hnh ang s dng c pht hin, gi tr s ca n c gn cho bin graphdriver. - Mode ha phn gii cao nht ng vi mn hnh ang s dng cng c pht hin v gi tr s ca n c gn cho bin graphmode. Nh vy vic dng hng s DETECT chng nhng c th khi ng c h thng ha ca mn hnh hin c theo mode c phn gii cao nht, m cn gip ta xc nh chnh xc kiu mn hnh ang s dng. V d 2. Chng trnh di y xc nh kiu mn hnh ang s dng: #include "graphics.h" #include "stdio.h" main() { int mh=0, mode= 0; initgraph(&mh, &mode, ""); printf("\n Gi tr s ca mn hnh l: %d", mh); closegraph(); } Nu chng trnh cho kt qu: Gi tr s ca mn hnh l: 3 th ta c th khng nh loi mn hnh ang dng l EGA. Ch 4. Nu chui dng xc nh driverpath l mt chui rng (nh trong v d 2) th chng trnh dch s tm cc tp iu khin ha trn th mc ch.

513

3. Li ha
Khi khi ng h thng ha nu my khng tm thy cc chng trnh iu khin ha th s pht sinh li ha v vic khi ng coi nh khng thnh. Li ha cn pht sinh khi dng cc hm ho. Trong mi trng hp, hm graphresult cho bit c li hay khng li v l li g. Bng 8-3 cho cc m li m hm ny pht hin c. Ta c th dng hm grapherrormsg vi m li do hm graphresult tr v bit c l li g, v d: int maloi; maloi = graphresult(); printf("\nLi ha l: %d", grapherrormsg(maloi)); Bng 8-3. Cc m li ca Graphresult Hng grOk grNoInitGraph grNotDetected grFileNotFoun d grInvalidDrive r grNoLoadMe m Tr 0 -1 -2 -3 -4 -5 Li pht hin Khng c li Cha khi ng h ha Khng c phn cng ha Khng tm thy trnh iu khin ha Trnh iu khin khng hp l Khng RAM cho ha Vt vng RAM trong Scan fill Vt vng RAM trong flood fill Khng tm thy tp tin Font Khng RAM np Font Kiu ha khng hp l cho trnh iu khin

grNoScanMem -6 grNoFloodMe m grFontNoFoun d -7 -8

grNoFontMem -9 grInvalidMode -10

514

grError grIOerror grInvalidFont grInvalidFont Num

-11 -12 -13 -14

Li ha tng qut Li ha vo ra Tp tin Font khng hp l S hiu Font khng hp l

4. Mu v mu
1. chn mu nn ta s dng hm void setbkcolor(int color); 2. chn mu ng v ta dng hm void setcolor(int color); 3. chn mu (kiu) t v mu t ta dng hm void setfillstyle(int pattern, int color); Trong c 3 trng hp color xc nh m ca mu. Cc gi tr kh d ca color cho trong bng 8-4, pattern xc nh m ca mu t (xem bng 8-5). Mu t v mu t s c s dng trong cc hm pieslice, fillpoly, bar, bar3d v floodfill (xem 5 di y). 4. Chn gii mu thay i gii mu c nh ngha trong bng 8.4 ta dng hm void setpalette(int colornum, int color); V d cu lnh setpalette(0, Lightcyan); bin mu u tin trong bng mu thnh xanh l nht. Cc mu khc khng b nh hng. Bng 8-4. Cc gi tr kh d ca color

515

Tn hng

Gi tr s 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Mu hin th

BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIHGTGRAY DARKGRAY LIGHTBLUE LIGHTGREE N LIGHTCYAN LIGHTRED LIGHTMAGE NTA YELLOW WHITE

en Xanh da tri Xanh l cy Xanh l Tm Nu Xm nht Xm sm Xanh da tri nht Xanh l cy nht Xanh l nht nht Tm nht Vng Trng

5. nhn gii mu hin hnh ta dng hm void getpalette (struct palettetype *palette); y palettetype l kiu nh ngha trc nh sau: #define MAXCOLORS 15 struct palettetype { unsigned char size;

516

unsigned char colors[MAXCOLORS+1]; }; y: size l s lng mu trong palette, colors l mng cha mu vi ch s mng chy t 0 n size - 1 Bng 8-5. Cc gi tr kh d ca pattern Tn hng EMPTY_FILL SOLID_FILL LINE_FILL LTSLASH_FIL L SLASH_FILL BKSLASH_FIL L LTBKSLASH_ FILL HATCH_FILL Gi tr s 0 1 2 3 4 5 6 7 M t kiu t T bng mu nn T bng ng nt lin T bng - - T bng /// T bng /// in m T bng \\\ in m T bng \\\ T bng ng gch bng nht T bng ng gch bng ch thp T bng ng t qung T bng du chm tha T bng du chm mau

XHATCH_FILL 8 INTERLEAVE_ 9 FILL WIDE_DOT_FI LL 10

CLOSE_DOT_F 11 ILL

6. Hm getcolor tr v mu xc nh trc bng hm setcolor. 7. Hm getbkcolor tr v mu xc nh trc bng hm setbkcolor.

517

8. Hm getmaxcolor tr v m mu cc i thuc gii mu hin ang c hiu lc. Trn 256 K EGA, hm getmaxcolor lun cho gi tr 15.

5. V v t mu
C th chia cc ng v hnh thnh bn nhm chnh: - ng trn v ellipse - ng gp khc v hnh a gic - ng thng - Hnh ch nht A. ng trn v hnh trn Nhm ny gm cung trn, ng trn, cung ellipse v hnh qut. 1. Cung trn. v mt cung trn ta dng hm void arc(int x, int y, int gd, int gc, int r); y: (x, y) l ta ca tm cung trn, r l bn knh gd l gc u gc l gc cui Ch : Trong tt c cc hm di y, gc tnh theo v c gi tr t 0 n 360. 2. ng trn. v mt ng trn ta dng hm void circle(int x, int y, int r); y: (x, y) l ta ca tm;

518

r l bn knh ng trn. 3. Cung ellipse. v mt cung Ellipse ta dng hm void ellipse(int x,int y,int gd,int gc,int xr,int yr); y: (x, y) l ta ca tm cung Ellipse gd l gc u gc l gc cui xr l bn trc ngang yr l bn trc ng. 4. Hnh qut. v v t mu mt hnh qut ta dng hm void pieslice(int x,int y,int gd,int gc,int r); y: (x,y) l ta tm hnh qut gd l gc u gc l gc cui r l bn knh V d 1. Chng trnh di y s v: mt cung trn gc phn t th nht, mt cung ellipse gc phn t th ba, mt ng trn v mt hnh qut qut t 90 n 360 . #include <graphics.h> main() { int mh, mode; // Khi ng ha, mn hnh EGA, mode EGALO mh=EGA;

519

mode=EGALO; initgraph(&mh, &mode,""); // Mu nn Green, mu ng v //White, mu t Red, kiu t SlashFill setbkcolor (GREEN); setcolor (WHITE); setfillstyle (SLASH_FILL, RED); // V: mt cung trn gc phn t th nht, // mt cung Ellipse gc phn t th ba, // mt ng trn, mt qut trn arc(160, 50, 0, 90, 45); ellipse(480, 50, 180, 270, 150, 45); circle(160, 150, 45); pieslice(480, 150, 90, 360, 45); // Kt thc ch ha closegraph(); } B. ng gp khc v a gic 5. Mun v mt ng gp khc i qua n im: (x1,y1), ... , (xn,yn) th trc ht ta phi a cc ta vo mt mng a no kiu int. Ni mt cch chnh xc hn, cn gn x1 cho a[0], y1 cho a[1], x2 cho a[2], y2 cho a[3],... Sau ta vit li gi hm: drawpoly(n, a); Khi im cui (xn, yn) trng vi im u (x1, y1) ta nhn c mt ng gp khc khp kn. 6. Gi s a l mng ni trong im 5, khi li gi hm

520

fillpoly(n, a); s v v t mu mt a gic c nh l cc im (x1, y1), ... ,(xn, yn). V d 2. Chng trnh di y s v mt ng gp khc v hai hnh tam gic. #include <graphics.h> // Xy dng cc mng cha ta cc nh int poly1[]={5,200,190,5,100,300}; int poly2[]={205,200,390,5,300,300}; int poly3[]={405,200,590,5,500,300,405,200}; main() { int mh=0, mode=0; initgraph(&mh, &mode, ""); // Mu nn CYAN, mu ng v // YELLOW, mu t MAGENTA, mu t SolidFill setbkcolor (CYAN); Setcolor (YELLOW); setfillstyle (SOLID_FILL, MAGENTA); drawpoly (3, poly1); // ng gp khc fillpoly (3, poly2); // Hnh a gic fillpoly(4, poly3); // Hnh a gic closegraph(); } C. ng thng 7. Hm

521

void line(int x1,int y1,int x2,int y2); v ng thng ni hai im (x1, y1) v (x2, y2) nhng khng lm thay i v tr con chy. 8. Hm void lineto(int x,int y); v ng thng t im hin ti ti im (x, y) v chuyn con chy n im (x, y). 9. Hm void linerel(int dx,int dy); v mt ng thng t v tr hin ti (x, y) ca con chy n im c di chuyn n v tr mi. 10. Hm void moveto(int x,int y); s di chuyn con chy ti v tr (x, y). V d 3. Chng trnh di y to ln mt ng gp khc bng cc on thng. ng gp khc i qua cc nh: (20, 20), (620, 20), (620, 180), (20, 180) v (320, 100). #include <graphics.h> main() { int mh=0, mode=0; initgraph(&mh, &mode, ""); setbkcolor(GREEN); setcolor(YELLOW); moveto(320,100); line(20,20,620,20); linerel(-300,80); lineto(620,180); (x + dx,y + dy). Con chy

522

lineto(620,20); closegraph(); } D. Hnh ch nht 11. Hm void rectangle(int x1,int y1,int x2,int y2); s v mt ng ch nht c cc cnh song song vi cc cnh ca mn hnh. Ta nh trn bn tri ca hnh ch nht l (x1,y1) v im di bn phi l (x2,y2). 12. Hm void bar(int x1,int y1,int x2,int y2); s v v t mu mt hnh ch nht. Cc gi tr x1,y1,x2 v y2 c ngha nh ni trong im 11. 13. Hm void bar3d(int x1,int y1,int x2,int y2,int depth,int top); s v mt khi hp ch nht, mt ngoi ca n l hnh ch nht xc nh bi cc ta x1,y1,x2,y2 (nh ni trong im 12). Hnh ch nht ny c t mu. Tham s depth n nh s im nh trn b su ca khi 3 chiu. Tham s top c th nhn tr 1 (TOPON) hay 0 (TOPOFF) v khi 3 chiu s c np hay khng np (xem hnh v).

TOPON

TOPOFF

V d 4. Chng trnh di y s v mt ng ch nht, mt hnh ch nht v mt khi hp ch nht c np. #include <graphics.h>

523

main() { int mh=0, mode=0; initgraph(&mh, &mode, ""); setbkcolor(GREEN); setcolor(RED); setfillstyle(CLOSE_DOT_FILL,YELLOW); rectangle(5,5,300,160); bar(5,175,300,340); bar3d(320,100,500,340,100,1); closegraph(); }

6. Chn kiu ng
1. Hm void setlinestyle(int linestyle,int pattern,int thickness); tc ng n nt v ca cc th tc line, lineto, rectange, drawpoly, circle,... Hm ny cho php ta n nh 3 yu t ca ng thng l dng, b dy v mu t to. + Dng ng do tham s linestyle khng ch. Sau y l cc gi tr kh d ca linestyle v dng ng thng tng ng. SOLID_LINE = 0 Nt lin

DOTTED_LINE = 1 Nt chm CENTER_LINE = 2 Nt chm gch DASHED_LINE = 3 Nt gch

524

USERBIT_LINE = 4 Mu t to + B dy do tham s thickness khng ch. Gi tr ny c th l: NORM_WIDTH = 1 B dy bnh thng THICK_WIDTH = 3 B dy gp ba + Mu t to: Nu tham s th nht l USERBIT_LINE th ta c th to ra mu ng thng bng tham s pattern. V d xt on chng trnh: int pattern= 0x1010; setlinestyle(USERBIT_LINE, pattern, NORM_WIDTH); line(0,0,100,200); Gi tr ca pattern trong h 16 l 0x1010 hay trong h 2 l 0001 0000 0001 0000

Ch no c bit 1 im nh s sng, bit 0 lm tt im nh. 2. nhn cc gi tr hin hnh ca 3 yu t trn ta dng hm: void getlinesettings(struct linesettingstype *lineinfo); vi kiu linesettingstype c nh ngha trc nh sau: struct linesettingstype { int linestyle; unsigned int upattern; int thickness; }; V d 1. Chng trnh di y minh ha cch dng cc hm setlinestyle v getlinesettings v ng thng. // kiu ng

525

#include <graphics.h> #include <conio.h> main() { struct linesettingstype kieu_cu; int mh=0, mode=0; initgraph(&mh, &mode, ""); if (graphresult!= grOk) exit(1); setbkcolor(GREEN); setcolor(RED); line(0,0,100,0); // Lu li kiu hin ti getlinesettings(kieu_cu); // Thit lp kiu mi setlinestyle(DOTTED_LINE,0,THICK_WIDTH); line(0,0,100,10); // Phc hi kiu c setlinestyle(kieu_cu.linestyle, kieu_cu.upattern, kieu_cu.thickness); Line(0,20,100,20); getch(); closegraph(); } 3. Hm void setwritemode( int writemode);

526

s thit lp kiu th hin ng thng cho cc hm line, drawpoly, linerel, lineto, rectangle. Kiu th hin do tham s writemode khng ch: - Nu writemode bng COPY_PUT = 0, th ng thng c vit ln dng ang c trn mn hnh. - Nu writemode bng XOR_PUT = 1, th mu ca ng thng nh v s kt hp vi mu ca tng chm im ca ng hin c trn mn hnh theo php ton XOR (chng 3, 3) to ln mt ng thng mi. Mt ng dng ca XOR_PUT l: Khi thit lp kiu writemode bng XOR_PUT ri v li ng thng cng mu th s xa ng thng c v khi phc trng thi ca mn hnh. Chng trnh di y minh ha cch dng hm setwritemode. Khi thc hin ta s thy hnh ch nht thu nh dn vo tm mn hnh. V d 2: // Thu hnh; #include <graphics.h> #include <conio.h> main() { struct linesettingstype kieu_cu; int mh=0, mode=0, x1, y1, x2, y2; initgraph(&mh, &mode, ""); if (graphresult!= grOk) exit(1); setbkcolor(GREEN); setcolor(RED); setfillstyle(CLOSE_DOT_FILL, YELLOW); x1=0; y1=0; x2=getmaxx(); y2=getmaxy();

527

setwritemode(XOR_PUT); tt: rectangle(x1,y1,x2,y2); // V hnh ch nht if ( (x1+1)<(x2-1) && (y1+1)<(y2-1) ) { rectangle(x1,y1,x2,y2); // xa hnh ch nht x1=x1+1; y1=y1+1; co hnh ch nht x2=x2-1; y2=y2-1; goto tt; } setwritemode(COPY_PUT); // Tr v overwrite mode closegraph(); }

7. Ca s (Viewport)
1. Viewport l mt vng ch nht trn mn hnh ha ta nh window trong textmode. thit lp viewport ta dng hm void setviewport(int x1,int y1,int x2,int y2,int clip); trong (x1,y1) l ta gc trn bn tri v (x2,y2) l ta gc di bn phi. Bn gi tr ny phi tha mn: 0 <= x1 <= x2 0 <= y1 <= y2 Tham s clip c th nhn mt trong hai gi tr: clip = 1 khng cho php v ra ngoi viewport clip = 0 Cho php v ra ngoi viewport.

528

V d cu lnh setviewport(100,50,200,150, 1); s thit lp viewport. Sau khi lp viewport ta c h ta mi m gc trn bn tri ca viewport s c ta (0,0). 2. nhn viewport hin hnh ta dng hm void getviewsettings(struct viewporttype *vp); y kiu viewporttype c nh ngha nh sau: struct viewporttype { int left, top, right, bottom; int clip; }; 3. xa viewport ta dng hm void clearviewport(void); 4. xa mn hnh v a con chy v ta (0,0) ca mn hnh ta dng hm void cleardevice(void); Ch : Cu lnh ny s xa mi th trn mn hnh. 5. Ta m dng Nh s dng Viewport c th vit cc chng trnh ha theo ta m dng. Mun vy ta thit lp viewport sao cho tm tuyt i ca mn hnh l gc trn bn tri ca viewport v cho clip = 0 c th v ra ngoi gii hn ca viewport. Sau y l on chng trnh thc hin cng vic trn int xc, yc; xc= getmaxx()/2; yc= getmaxy()/2; setviewport(xc, yc, getmaxx(), getmaxy(), 0);

529

Nh th mn hnh s c chia lm 4 phn vi ta m dng nh sau: Phn t tri trn: x m, y m Phn t tri di: x m, y dng Phn t phi trn: x dng, y m Phn t phi di: x dng, y dng Chng trnh di y v th hm sin(x) trong h trc ta m dng. Honh x ly cc gi tr t -4*PI n 4*PI. Trong chng trnh c dng hai hm mi l: outtextxy v putpixel (xem cc mc sau). V d 1: // th hm sin #include <graphics.h> #include <conio.h> #include <math.h> #define SCALEX 20 #define SCALEY 60 main() { int mh=0, mode=0, x, y, i; initgraph(&mh, &mode, ""); if (graphresult!= grOk) exit(1); setviewport(getmaxx()/,getmaxy()/2, getmaxx(),getmaxy(), 0); // K h trc ta setcolor(BLUE); line(-(getmaxx()/2),0,getmaxx()/2,0);

530

line(0,-(getmaxy()/2),0,getmaxy()/2); settextjustify(1,1); setcolor(RED); outtextxy(0,0,"(0,0)"); for (i=-400;i<=400;++i) { x=round(2*M_PI*i*SCALEX/200); y=round(sin(2*M_PI*i/200)*SCALEY); putpixel(x,y,YELLOW); } getch(); } V d 1 to ln mt th t cc chm im. By gi ta sa v d 1 i cht: gi nguyn t u n outtextxy, thay phn cui bi on chng trnh di y. Ta s c th t cc on thng rt ngn ghp li. V d 2: // Phn u ging v d 1 setcolor(YELLOW); for (i=-400;i<=400;++i) { x=round(2*M_PI*i*SCALEX/200); y=round(sin(2*M_PI*i/200)*SCALEY); if(i= -400) moveto(x,y); else lineto(x,y); } getch();

531

8. T im, t min
1. Hm void putpixel(int x, int y, int color); s t im (x,y) theo mu xc nh bi color. 2. Hm unsigned getpixel(int x, int y); s tr v s hiu mu ca im nh v tr (x,y). Ch : nu im ny cha c t mu bi cc hm v hoc putpixel (m ch mi c to mu nn bi setbkcolor) th hm cho gi tr bng 0. V vy c th dng hm ny theo mu di y xc nh cc nt v trn mn hnh ho v v ra giy. if (getpixel(x,y)!=0) { // im (x,y) c v , t mt chm im ra giy } 3. T min t mu cho mt min no trn mn hnh ta dng hm void floodfill(int x, int y, int border); y: (x,y) l ta ca mt im no gi l im gieo. tham s border cha m ca mt mu. S hot ng ca hm floodfill ph thuc vo gi tr ca x,y, border v trng thi mn hnh.

532

a) Khi trn mn hnh c mt ng (cong hoc gp khc) khp kn m m mu ca n bng gi tr ca border th: + Min gii hn bi ng kn s c t mu nu im gieo (x,y) nm bn trong min ny. + Nu im gieo (x,y) nm bn ngoi th phn mn hnh bn ngoi min ng ni trn c t mu. b) Khi trn mn hnh khng c mt ng no nh vy, th c mn hnh c t mu. V d 1. Chng trnh di y s v mt ng trn trn mn hnh xanh. Ta (x,y) ca im gieo c np vo t bn phm. Ty thuc vo gi tr c th ca x,y, chng trnh s t mu vng cho hnh trn hoc phn mn hnh bn ngoi hnh trn. #include <graphics.h> #include <stdio.h> main() { int mh=0, mode=0, x, y; initgraph(&mh, &mode, ""); if (graphresult!= grOk) exit(1); setbkcolor(GREEN); setcolor(RED); setfillstyle(11,YELLOW); circle(320,100,50); moveto(1,150); outtext(" Toa do diem gieo x,y "); scanf("%d%d",&x,&y); flooddfill(x,y,RED); }

533

V d 2. Minh ha cch dng hm Putpixel v hm getpixel v cc im nh v sau xa cc im nh. Mun kt thc chng trnh bm ESC. #include <conio.h> #include <graphics.h> #include <stdio.h> #include <stdlib.h> int seed = 1962; // Nhn cho b to s ngu nhin int numpts = 2000; // V 2000 chm im int ESC = 27; void putpixelplay(void); main() { int mh=0, mode=0; initgraph(&mh, &mode, ""); if (graphresult()!= grOk) exit(1); putpixelplay(); closegraph(); } void putpixelplay(void) { int i,x,y,color,xmax,ymax,maxcolor,ch; struct viewporttype v; getviewsettings(&v);

534

xmax=(v.right - v.left -1); ymax=(v.bottom - v.top -1); maxcolor=getmaxcolor(); while (!kbhit()) { //V cc chm im mt cch ngu nhin srand(seed); i=0; while(i<=numpts) { ++i; x=random(xmax)+1;y=random(ymax)+1; color=random(maxcolor); putpixel(x,y,color); } // Xa cc im nh srand(seed); i=0; while(i<=numpts) { ++i; x= random(xmax) + 1; y= random(ymax) + 1; color=random(maxcolor); putpixel(x,y,0); }

535

if(kbhit()) { ch=getch(); if (ch==ESC) break; } } } // Kt thc hm putpixelplay

9. X l vn bn trn mn hnh ho
1. Hin th vn bn trn mn hnh ho Hm void outtext (char *s); s hin chui k t (do s tr ti) ti v tr hin ti ca con tr. Hm void outtextxy(int x,int y,char *s); s hin chui k t (do s tr ti) ti v tr (x,y). V d 1: Hai cch sau y s cho cng kt qu outtextxy (100,100," chao ban "); v moveto (100,100); outtext (" chao ban "); Ch : Trong mt ha vn cho php dng hm nhp d liu scanf v cc hm bt phm getch, kbhit.

536

2. Fonts Nh ni trn: Cc Fonts nm trong cc tp tin .CHR trn a. Cc Font ny cho cc kch thc v kiu ch khc nhau s hin th trn mn hnh ho bng outtext hay outtextxy. chn v np Font chng ta dng hm: void settextstyle(int font,int direction,int charsize); (Ch : hm ch c tc dng nu tn ti cc tp .CHR) Vi direction l mt trong hai hng s: HORIZ_DIR = 0 VERT_DIR = 1 Nu direction l HORIZ_DIR, vn bn s hin th theo hng nm ngang t tri sang phi. Nu direction l VERT_DIR, vn bn s hin th theo chiu ng t di ln trn. i charsize l h s phng to k t v c gi tr trong khong t 1 n 10. - Nu charsize = 1, k t c th hin trong hnh ch nht 8*8 pixel. - Nu charsize = 2, k t c th hin trong hnh ch nht 16*16 pixel. ... - Nu charsize = 10, k t c th hin trong hnh ch nht 80*80 pixel. Cui cng l tham s font chn kiu ch v nhn mt trong cc hng sau: DEFAULT_FONT = 0 TRIPLEX_FONT = 1 SMALL_FONT = 2 SANS_SERIF_FONT = 3 GOTHIC_FONT = 4 Cc gi tr do settextstyle thit lp s d nguyn cho n khi gi mt settextstyle mi. V d 2: settextstyle (3,VERT_DIR,2);

537

outtextxy (50,50," HELLO "); 3. V tr hin th Hm settextjustify cho php n nh ni hin th vn bn ca outtext theo quan h vi v tr hin ti ca con chy hay ca outtextxy theo quan h vi to (x,y). Hm ny c dng void settextjustify(int horiz, int vert); Tham s horiz c th l mt trong cc hng s sau: LEFT_TEXT = 0 (Vn bn xut hin bn phi con chy) CENTER_TEXT = 1 (Chnh tm vn bn theo v tr con chy) RIGHT_TEXT = 2 (Vn bn xut hin bn tri con chy) Tham s Vert c th l mt trong cc hng s sau: BOTTOM_TEXT = 0 (Vn bn xut hin pha trn con chy) CENTER_TEXT = 1 (Chnh tm vn bn theo v tr con chy) TOP_TEXT = 2 (Vn bn xut hin pha di con chy) V d 3: settextjustify(1,1); outtextxy(100,100,"ABC"); Kt qu l im (100,100) s nm gia ch B. 4. B rng v b cao ca vn bn Hm void textheight (char *s); tr v chiu cao (theo pixel) ca chui do s tr ti. V d nu k t c kch thc 8*8 th textheight ("H") = 8 V d 4: on chng trnh di y s cho hin 5 dng ch.

538

#include <graphics.h> main() { int mh=0,mode=0,y,size; initgraph(&mh,&mode,""); y=10; settextjustify(0,0); for (size=1; size<=5; ++size) { settextstyle(0,0,size); outtextxy(0,y,"GRAPHICS"); y += textheight("GRAPHICS") + 10; } getch(); closegraph(); } Hm void textwidth(char *s); s da vo chiu di ca chui, kch thc Font ch, h s khuych i ch tr v b rng (theo pixel) ca chui do s tr ti. V d 5: Trong chng trnh di y s lp cc hm vo ra trn mn hnh ho. #include <graphics.h> #include <conio.h> #define Enter 13

539

#define Lmargin 10 void text_write(int *x,int *y,char *s); void text_writeln(int *x,int *y,char *s); void text_read(int *x,int *y,char *s); void text_write(int *x,int *y,char *s) { outtextxy(*x,*y,s); *x += textwidth(s); } void text_writeln(int *x,int *y,char *s) { outtextxy(*x,*y,s); *x=Lmargin; *y += textheight(s)+5; } void text_read(int *x,int *y,char *s) { int i=0; char ch[2]; ch[1]=0; while(1) { ch[0]=getch(); if(ch[0]==Enter) break; text_write(x,y,ch); s[i]=ch[0]; ++i;

540

} s[i]=0; } main() { int mh=0,mode=0,x,y,xmax,ymax; char name[25]; initgraph(&mh,&mode,""); settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); x=Lmargin; y=100; text_write (&x,&y,"cho ten cua ban: "); text_read (&x,&y,name); text_writeln (&x,&y,"" ); text_write(&x,&y,"chao ban "); text_write(&x,&y,name); getch(); closegraph(); }

10. Ct hnh, Dn hnh v To nh chuyn ng


1. Hm unsigned imagesize(int x1,int y1,int x2,int y2)

541

tr v s byte cn thit lu tr nh trong phm vi hnh ch nht (x1,y1,x2,y2). 2. Hm #include <alloc.h> void *malloc(unsigned n); tr v con tr tr ti mt vng nh n byte mi c cp pht. 3. Hm void getimage(int x1,int y1,int x2,int y2,void *bitmap); s chp cc im nh ca hnh ch nht (x1,y1,x2,y2) v cc thng tin v b rng, cao ca hnh ch nht vo vng nh do bitmap tr ti. Vng nh v bin bitmap cho bi hm malloc. ln ca vng nh c xc nh bng hm imagesize. 4. Hm void putimage(int x,int y,void *bitmap,int copymode); dng sao nh lu trong vng nh bitmap ra mn hnh ti v tr (x,y). Tham s copymode xc nh kiu sao chp nh, n c th nhn cc gi tr sau: COPY_PUT = 0 XOR_PUT = 1 Sao chp nguyn xi. Cc im nh trong bitmap kt hp vi cc im nh trn mn hnh bng php XOR OR_PUT = 2 Cc im nh trong bitmap kt hp vi cc im nh trn mn hnh bng php OR AND_PUT = 3 Cc im nh trong bitmap kt hp vi cc im nh trn mn hnh bng php AND NOT_PUT = 4 nh xut hin trn mn hnh theo dng o ngc (php NOT) vi nh trong bitmap. Nhn xt: Nu dng mode XOR_PUT chp hnh, ri lp li ng cu lnh th hnh s b xo v mn hnh tr li nh c. K thut ny dng to ln cc hnh nh chuyn ng.

542

V d 1: Chng trnh di y minh ho cch dng imagesize, malloc, getimage v putimage. #include <alloc.h> #include <graphics.h> main() { int mh=0,mode=0; char *p; unsigend size; initgraph (&mh,&mode,""); bar(0,0,getmaxx(),getmaxy()); size = imagesize(10,20,30,40); p=(char*)malloc(size); // p tr ti vng nh size byte // mi c cp pht getimage (10,20,30,40,p); getch(); cleardevice(); putimage (100,100,p,COPY_PUT); getch(); closegraph(); } 5. To nh di ng Nguyn tc to nh di ng ging nh phim hot hnh: - V mt hnh (trong chui hnh m t chuyn ng)

543

- Delay - Xo hnh - V hnh k theo - Delay ... A) V hnh Cch 1: V li mt nh nhng ti cc v tr khc nhau. Cch 2: Lu nh vo mt vng nh ri a nh ra mn hnh ti cc v tr khc nhau. B) Xa nh Cch 1: Dng hm cleardevice Cch 2: Dng hm putimage (mode XOR_PUT) xp chng ln nh cn xo. Cch 3: Lu trng thi mn hnh vo mt ch no . V mt hnh nh. a trng thi c mn hnh ra xp ln nh va v. K thut to nh di ng c minh ho trong cc chng trnh ca 11.

11. Mt s chng trnh ho


Chng trnh 1: u tin v bu tri u sao. Sau tng chm pho hoa c bn ln bu tri. Khi bm phm Enter th vic bn pho hoa kt thc, ta nhn li bu tri y sao. Bm tip Enter th kt thc chng trnh. // Bn pho hoa trn bu tri y sao #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <alloc.h>

544

main() { int x[101],y[101]; int mh=0,mode=0,i,n; char *p[101]; initgraph(&mh,&mode,""); if (graphresult()!=0) exit(1); setcolor(RED); // V bu tri y sao for (i=1;i<=1000;++i) { putpixel(random(getmaxx()), random(getmaxy()),random(getmaxcolor())); } // Lu hin trng 100 hnh ch nht trn mn hnh khi phc for (i=1;i<=100;++i) { x[i]=random(getmaxx())-10; y[i]=random(getmaxy())-10; if (x[i]<0) x[i]=0; if (y[i]<0) y[i]=0; n=imagesize(x[i],y[i],x[i]+10,y[i]+10); p[i]=(char*)malloc(n); getimage(x[i],y[i],x[i]+10,y[i]+10,p[i]);

545

} // Chu trnh bn pho hoa do { // a 100 qu pho ln mn hnh ti cc v tr quy nh for (i=1;i<=100;++i) { setfillstyle(SOLID_FILL,i%15+1); pieslice(x[i]+5,y[i]+5,0,360,5); } delay(500); //Xo chm pho hoa va bn bng cch khi phc mn hnh for (i=100;i>=1;--i) putimage(x[i],y[i],p[i],COPY_PUT); delay(500); } while(!kbhit()); getch(); getch(); closegraph(); } Chng trnh 2: V ng h c 3 kim gi, pht v giy. ng h chy ng theo gi h thng. Mun kt thc chng trnh bm Enter. // ng h #include <graphics.h>

546

#include <conio.h> #include <math.h> #include <dos.h> // Hm k on thng t tm ng h theo , chiu di, // dy v mu void ke(int ddo, unsigned dai, unsigned day,unsigned mau); // K kim giy khi bit s giy void ke_giay(unsigned giay); // K kim pht khi bit s pht void ke_phut(unsigned phut); // K kim gi khi bit s gi void ke_gio(unsigned gio, unsigned phut); void chay_kim_giay(void); void chay_kim_phut(void); void chay_kim_gio(void); int x0,y0,rgio,rphut,rgiay,mgio,mphut,mgiay; unsigned phutgioht,gioht,phutht,giayht; void ke(int ddo, unsigned dai, unsigned day,unsigned mau) { unsigned x,y; float goc; while (ddo>=360) ddo=ddo-360; goc=(M_PI/180)*ddo; x=x0+ (int)(dai*cos(goc)+0.5); y=y0- (int)(dai*sin(goc)+0.5); setcolor(mau); setlinestyle(0,0,day);

547

line(x0,y0,x,y); } // Hm ke kim giay void ke_giay(unsigned giay) { int ddo; ddo = (90 - 6*giay); ke(ddo,rgiay,1,mgiay); } // Hm ke kim phut void ke_phut(unsigned phut) { int ddo; ddo= (90-6*phut); ke(ddo,rphut,3,mphut); } // Hm ke kim gio void ke_gio(unsigned gio, unsigned phut) { int ddo; ddo = 360 + 90 - 30*(gio%12) - (phut+1)/2; ke(ddo,rgio,3,mgio); } // Hm chnh giy hin ti v lm chuyn ng kim giy

548

void chay_kim_giay(void) { unsigned giay; struct time t; gettime(&t); giay=t.ti_sec; if (giay!=giayht) { ke_giay(giayht); giayht=giay; ke_giay(giayht); } } // Hm chnh pht hin ti v lm chuyn ng kim pht void chay_kim_phut(void) { unsigned phut; struct time t; gettime(&t); phut=t.ti_min; if (phut!=phutht) { ke_phut(phutht); phutht=phut; ke_phut(phutht);

549

} } // Hm chnh gi pht hin ti v lm chuyn ng kim gi void chay_kim_gio(void) { unsigned h,gio,phut,sophut,sophutht; struct time t; gettime(&t); gio=t.ti_hour; phut=t.ti_min; sophut = gio*60+phut; sophutht = gioht*60+phutgioht; if ( sophut<sophutht) sophut=sophut+ 12*60; h=sophut-sophutht; if (h>=12) { ke_gio(gioht,phutgioht); phutgioht=phut; gioht=gio; ke_gio(gioht,phutgioht); } } main() { struct time t;

550

char *dso[]={"", "12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}; int i,mh=0,mode=0,r,x,y; float goc; initgraph(&mh,&mode,""); x0=(getmaxx()/2)-1; y0=(getmaxy()/2)-1; r=y0-2; rgiay = r-10; rphut=r-50; rgio=r-90; mgiay= BROWN; mphut=RED; // mgio:=magenta; mgio=YELLOW; // V chu vi ng h setcolor(BLUE); setlinestyle(0,0,3); circle(x0,y0,r); setfillstyle(1,YELLOW); floodfill(0,0,BLUE); setfillstyle(1,WHITE); floodfill(x0,y0,BLUE); setlinestyle(0,0,1); circle(x0,y0,10); setfillstyle(1,GREEN); floodfill(x0,y0,BLUE); settextjustify(1,1); setcolor(MAGENTA); outtextxy(x0,y0+120,"IBM-JIMIKO"); // Ghi ch s settextstyle(3,0,3); settextjustify(1,1); setcolor(BLUE); for (i=1;i<=12;++i) { goc=(2*M_PI+M_PI/2) - (i-1)*(M_PI/6);

551

x = x0+ (int)(rphut*cos(goc)+0.5); y = y0- (int)(rphut*sin(goc)+0.5); outtextxy(x,y,dso[i]); } // Xc nh thi im u gettime(&t); gioht=t.ti_hour; phutht=t.ti_min; giayht=t.ti_sec; phutgioht=phutht; setwritemode(XOR_PUT); // Ve kim gio,phut,giay ke_gio(gioht,phutgioht); ke_phut(phutht); ke_giay(giayht); // Lm chuyn ng cc kim do { chay_kim_giay(); chay_kim_phut(); chay_kim_gio(); } while(!kbhit()); closegraph(); } Chng trnh 3: V mt con tu v tr bay trn bu tri y sao theo qu o ellipse. Trong khi tu chuyn ng th cc ngi sao thay nhau nhp nhy

552

// Tu v tr chuyn ng trn bu tri y sao nhp nhy #include <graphics.h> #include <stdio.h> #include <conio.h> #include <alloc.h> #include <stdlib.h> #include <math.h> // Khai bo cc hm trong chng trnh void tau_cd(void); // tu chuyn ng void nhap_nhay_bt(void); // nhp nhy bu tri void main(void); // hm main // Khai bo cc bin mng ngoi int a,b,x,y,x0,y0,mh=0,mode=0,n,i; float goc,xt,yt; char *p; int xx[1001],yy[1001]; // Hm main void main(void) { initgraph(&mh,&mode,""); if (graphresult()!=0) exit(1); // V tu v tr setcolor(RED); ellipse(100,50,0,360,20,8);

553

ellipse (100,46,190,357,20,6); line(107,44,110,38); circle(110,38,2); line(93,44,90,38); circle(90,38,2); setfillstyle(SOLID_FILL,BLUE); floodfill(101,54,RED); setfillstyle(SOLID_FILL,MAGENTA); floodfill(94,45,RED); // Lu nh ca tu v tr vo b nh n=imagesize(79,36,121,59); p=(char*)malloc(n); getimage(79,36,121,59,p); // V bu tri y sao v lu v tr ca chng // vo cc mng xx, yy phc v hm nhap_nhay_bt cleardevice(); for (i=1;i<=1000;++i) { xx[i]=random(getmaxx()); yy[i]=random(getmaxy()); putpixel(xx[i],yy[i],random(getmaxcolor())); } // Xc nh gi tr ban u cho cc bin // dng iu khin chuyn ng tu goc= 2*M_PI + M_PI/2;

554

x0= (getmaxx() - 42)/2; y0= (getmaxy() - 25)/2; a=x0; b=y0; // chu trnh tu v tr chuyn ng v cc ngi sao nhp nhy do { tau_cd(); nhap_nhay_bt(); } while(!kbhit()); getch(); closegraph(); } void tau_cd(void) { xt=a*cos(goc)+x0; yt=-b*sin(goc)+y0; x=(int)(xt+0.5); y=(int)(yt+0.5); // t tu v tr ln mn hnh putimage(x,y,p,XOR_PUT); delay(500); // Xa putimage(x,y,p,XOR_PUT); // Thay i gc lm cho tu chuyn ng goc -= M_PI/30;

555

if (goc<M_PI/2) goc=2*M_PI+M_PI/2; } void nhap_nhay_bt(void) { static i=1; // Lnh ny thc hin mt ln khi dch int j; // Cho nhp nhy bng cch i mu 50 ngi sao for (j=1;j<=50;++j) { putpixel(xx[i],yy[i],random(getmaxcolor())); ++i; if (i>1000) i=1; } }

12. In nh t mn hnh ho
Hm in_anh di y s in nh trong min ch nht (xt, yt, xd, yd) ca mn hnh ho ra giy trn cc my in LQ1070, LQ1170 v FX1050. void in_anh(int dd,int xt,int yt,int xd,int yd); Tham s dd l m ca nt in. Thc cht dd l s ln in li. Bnh thng chon dd=1. Nu mun in r hn ta chn dd bng 2 hay 3. Trong hm in_anh c dng hm tao_mau, n c m t nh sau: int tao_mau(int k,int x,int y);

556

Hm ny s d trn k chm im theo chiu dc bt u t to (x,y) trn mn hnh bit xem chm im no t mu. Hm s tr v mt gi tr nguyn to bi cc bit 1 (ng vi im t mu) v 0 (ng vi im cha t mu). Hm in_anh s dng hm tao_mau duyt trn min ch nht (xt,yt,xd,yd). Mi ln duyt s nhn c mt mu cc chm im (gi tr nguyn) v mu ny c in ra giy. Di y l ni dung ca 2 hm ni trn. // in nh #include "stdio.h" #include "graphics.h" int tao_mau(int k,int x,int y); void in_anh(int dd,int xt,int yt,int xd,int yd); int tao_mau(int k,int x,int y) { int c=0,i; for (i=0;i<k;++i) if (getpixel(x,y+i)) c =c|(128>>i); return c; } void in_anh(int dd,int xt,int yt,int xd,int yd) { //dd - so lan in lai mot dong char c,ch1; int scot,m,mm,k,dong,cot,i,j,n1,n2; dong=(yd-yt+1)/6; mm=(yd-yt+1) % 6; cot=xd-xt+1;

557

for (i=0;i<=dong;++i) { if (i<dong) m=6; else m=mm; if (m>0) { scot=0; for (j=0;j < cot;++j) if (tao_mau(m,xt+j,yt+i*6)) scot=j+1; if (scot) { n1=scot % 256; n2= scot/256; for (k=0;k<dd;++k) { fprintf(stdprn,"%c%c%c%c%c%c",13,27,'*', 0,n1,n2); //LQ for (j=0;j < scot;++j) { if (kbhit())//bat phim { if ((ch1=getch())==0) getch(); if (ch1==27) goto ket; } c=tao_mau(m,xt+j,yt+i*6); fprintf(stdprn,"%c",c);

558

} } } fprintf(stdprn,"%c%c%c",27,'A',m); fprintf(stdprn,"\n"); } } ket: fprintf(stdprn,"%c%c",27,'@'); }

559

Chng 9 Truy Nhp Trc Tip Vo B Nh


Trong chng ny trnh by cc vn : + Hai kiu a ch: a ch phn on v a ch thc + Truy nhp ti a ch phn on + i t a ch phn on sang a ch thc + B nh mn hnh, truy nhp trc tip vo b nh mn hnh + Dng con tr ly d liu t b nh phn on + Dng con tr hm thc hin cc th tc ca DOS

1. Cc hm truy nhp theo a ch phn on


1. Hm pokeb: Gi mt k t vo b nh. + Ngun mu trong dos.h nh sau: void pokeb(unsigned seg, unsigned off, char value); + Cng dng: Gi gi tr k t value vo b nh ti a ch phn on seg:off 2. Hm peekb: Nhn mt k t t b nh. + Ngun mu trong dos.h nh sau: char peekb(unsigned seg, unsigned off); + Cng dng: Nhn mt byte ti a ch phn on seg:off 3. Hm poke: Gi mt s ngun vo b nh. + Ngun mu trong dos.h nh sau: void poke(unsigned seg, unsigned off, int value); + Cng dng: Gi gi tr ngun value vo b nh ti a ch phn on seg:off 4. Hm peek: Nhn mt s ngun t b nh.

560

+ Ngun mu trong dos.h nh sau: int peek(unsigned seg, unsigned off); + Cng dng: Nhn mt word ti a ch phn on seg:off 5. Hm movedata: Sao cc byte. + Ngun mu trong mem.h nh sau: void movedata(unsigned seg_gui, unsigned off_gui, unsigned seg_nhan, unsigned off_nhan, int n); + Cng dng: Sao n byte t seg_gui:off_gui n seg_nhan:off_nhan

2. B Nh Mn Hnh Vn Bn
2.1. Cch biu din k t trong b nh mn hnh B nh mn hnh vn bn bt u t a ch : (0xb800:0x0000) Khi a mt k t vo vng nh mn hnh, th n s hin ln mn hnh. Mi k t trong mn hnh chim 2 byte trong b nh mn hnh: byte u cha m ASCII, byte th hai biu din mu hin th gi l byte thuc tnh. Cc bit ca byte thuc tnh: B7B6B5B4B3B2B1B0 c chia lm 3 nhm: + Nhm 1 gm bit B7 biu th s nhp nhy. Nu B7=0 th k t khng nhp nhy, nu B7=1 th k t s nhp nhy. + Nhm 2 gm cc bit B6, B5 v B4. Cc bit ny cha c mt s ngun t 0 n 7 v biu th 8 mu nn ca k t. + Nhm 3 gm cc bit B3, B2, B1 v B0. Cc bit ny cha c mt s ngun t 0 n 15 v biu th 16 mu ca k t.

561

2.2. Trang mn hnh Mi trang mn hnh gm 80x25 k t, do cn 80x25x2=4000 byte b nh. Thc t mi trang mn hnh c phn b 4096 = 0x1000 byte. Nh vy 4 trang mn hnh c phn b nh sau: + Trang mn hnh th 0 bt u t a ch 0xB800:0x0000 + Trang mn hnh th 1 bt u t a ch 0xB800:0x1000 + Trang mn hnh th 2 bt u t a ch 0xB800:0x2000 + Trang mn hnh th 3 bt u t a ch 0xB800:0x3000 2.3. Chn trang hin th Ti mi thi im ch c th hin th c mt trong 4 trang mn hnh. hin th trang mn hnh th t (t=0,1,2,3) chng ta s dng chc nng 5 ca ngt 0x10 theo mu sau: union REGS v,r; v.h.ah = 5 ; // Chc nng 5 v.h.al = t ; // S hiu trang mn hnh cn hin th int86(0x10, &v, &r); // Thc hin ngt 0x10 2.4. V d minh ho V d sau dng hm pokeb a cc k t vo cc trang ca b nh mn hnh, sau dng chc nng 5 ca ngt 0x10 chn trang hin th. //CT9_03.CPP #include <dos.h> #include <conio.h> char d1[]={'C',1*16+14,'H',1*16+14,'U',1*16+14,'C',1*16+14}; char d2[]={'M',2*16+15,'U',2*16+15,'N',2*16+15,'G',2*16+15}; void main() {

562

union REGS v,r; clrscr(); //Mc nh hin th trang 0 for (int i=0;i<8;++i) pokeb(0xb800,i,d1[i]); getch(); //Hien thi trang 1 v.h.ah = 5 ; v.h.al = 1 ; int86(0x10,&v,&r); for (i=0;i<8;++i) pokeb(0xb800,0x1000+i,d2[i]); getch(); //Hien thi trang 0 v.h.ah = 5 ; v.h.al = 0 ; int86(0x10,&v,&r); getch(); //Hien thi trang 1 v.h.ah = 5 ; v.h.al = 1 ; int86(0x10,&v,&r); getch(); }

3. Chuyn i a ch

563

3.1. chuyn t a ch thc sang a ch phn on ta dng cc macro: unsigned FP_SEG(a_ch_thc) unsigned FP_OFF(a_ch_thc) 3.2. chuyn t a ch phn on sang a ch thc ta dng macro: void far *MK_FP(seg,off) V d 1. Sau khi thc hin cc cu lnh: char buf[100]; unsigned ds,dx; ds = FP_SEG(buf); dx = FP_OFF(buf); th ds:dx cha a ch ca mng buf. V d 2. Sau khi thc hin cc cu lnh: char far *pchar; pchar = (char far*)MK_FP(0xb800:0); th pchar tr ti a ch u ca b nh mn hnh. Khi ta c th s dng cc lnh gn truy nhp trc tip ti b nh mn hnh.

4. Cc v d minh ho
Chng trnh 1. Chng trnh minh ho cch truy nhp trc tip vo b nh mn hnh c a ch u l 0xB800:0. Chng trnh gm hm main() v hai hm sau: 1. Hm cuaso void cuaso(int dongt,int cott,int dongd,int cotd,int maucs); thit lp mt ca s mu c to gc trong-tri l (dongt, cott) v gc di-phi l (dongd,cotd). Mu cho bi tham s maucs. y s dng hm pokeb v a ch phn on. 2. Hm duarmh

564

void duarmh(char *day, int dong, int cotd, int cotc,int m_nen, int m_chu); s a ra mn hnh mt dy k t (cha trong dy) ti dng dong, t ct cotd n cotc. Mu nn cho bi m_nen, mu ch cho bi m_ch. y s dng ton t gn trong a ch thc. Trong hm main() s s dng cc hm cuaso v duarmh to hai ca s v vit hai dng ch trong trang mn hnh th hai (t dng 26 n dng 50). /* chng trnh minh ho cch truy nhp trc tip vo b nh ca mn hnh */ #include "dos.h" #include "conio.h" void duarmh(char *day, int dong,I nt cotd, int cotc,I nt m_nen, int m_chu); void cuaso(int dongt,int cott,int dongd,int cotd,int maucs); main() { cuaso(26,1,50,80,BLUE); duarmh("Chuc mung nam moi", 28, 30, 50, MAGENTA, WHITE); cuaso(30,20,46,60,RED); duarmh("Chuc mung nam moi", 40, 30, 50, MAGENTA, YELLOW); getch(); } void cuaso(int dongt,int cott,int dongd,int cotd,int maucs) /* Dung dia phan doan */ { int i, j, p, t, dt, dd, mau;

565

union REGS v, r; /* Xac dinh thuoc tinh mau */ mau = (maucs << 4)+maucs; /* Xac dinh trang man hinh t va cac chi so dong tren dt, dong duoi dd trong trang t */ t=(dongt-1)/25; dt=(dongt-1)-t*25; dd=(dongd-1)-t*25; /* Chon t la trang hien thi */ v.h.ah=5;v.h.al=t; int86(0x10,&v,&r); /* Dua cac khoang trong (ma 32) va thuoc tinh mau vao cac vi tri thich hop cua bo nho man hinh */ for (i=dt;i<=dd;++i) { p=t*4096+i*160+(cott-1)*2; for (j=0;j<=cotd-cott;++j) { pokeb(0xb800,p+2*j,32); pokeb(0xb800,p+2*j+1,mau); }

566

} } void duarmh(char *day, int dong, int cotd, int cotc, int m_nen, int m_chu) /* Dung dia chi thuc */ { int i,p,t,d,kt,mau; char far *buf; union REGS v,r; /* Lay dia chi thuc cua bo nho man hinh */ buf=(char far*)MK_FP(0xb800,0); /* Xac dinh thuoc tinh mau */ mau = (m_nen << 4)+m_chu; /* Xac dinh trang man hinh t va cac chi so dong d trong trang t */ t=(dong-1)/25; d=dong-1-t*25; /* Chon t la trang hien thi */ v.h.ah=5;v.h.al=t; int86(0x10,&v,&r); p=t*4096+d*160+(cotd-1)*2; /* Dua cac ky tu va thuoc tinh mau vao cac vi tri thich hop cua bo nho man hinh

567

*/ for (i=0;i<=cotc-cotd;++i) { if ((kt=day[i])==0) break; buf[p+2*i]=kt; buf[p+2*i+1]=mau; } } Chng trnh 2. Bit a ch ca cc th tc x l ngt c lu tr trong b nh t a ch 0000:0000 n 0000:0x0400. Chng trnh s cho bit a ch ca th tc x l ngt n (gi tr n nhp vo t bn phm). S hiu ca ngt c tnh t 0, nhng n c nh s t 1. /* Xac dinh dia chi cac thu tuc ngat */ #include "dos.h" #include "conio.h" #include "stdio.h" main() { unsigned char far *p; /*p se tro toi bang vecto ngat*/ int n; /* n - so hieu ngat, n=1,2,... */ int k; /* vi tri cua ngat n trong bang vecto ngat */ unsigned seg,off; /* p tro toi bang vecto ngat */ p=(unsigned char far*)MK_FP(0,0); clrscr();

568

while(1) { printf("\n So hieu ngat (Bam 0 - Ket thuc): "); scanf("%d",&n); if(n==0) break; k=(n-1)*4; off=p[k]+256*p[k+1]; seg=p[k+2]+256*p[k+3]; printf("\nDia chi %x:%x",seg,off); } } Chng trnh 3. Chng trnh minh ho cch dng con tr hm thc hin th tc khi ng li my ca DOS, bit a ch u ca th tc ny l 0xFFFF:0000 . Chng trnh yu cu nhp mt khu. Nu chn ng (bm ABCD v Enter) th chng trnh tip tc lm vic, nu vo sai th s khi ng li my. #include <dos.h> #include <conio.h> #include <iostream.h> #include <ctype.h> typedef void far (*HAM)(void); void khoi_dong_may(void) { HAM f; f = (HAM)MK_FP(0xFFFF,0); f(); } char mat_khau[]= {'A','B','C','D'};

569

int n = sizeof(mat_khau)/sizeof(char); void main() { char i, ch, sai_mat_khau; clrscr(); i=0; sai_mat_khau=0; cout << "\nMat khau: "; while(1) { ch=getch(); if (ch==13) break; cout << '*' ; if (i<n) { if (toupper(ch)!=mat_khau[i]) sai_mat_khau=1; } else sai_mat_khau=1; ++i ; } if (sai_mat_khau) {

570

cout << "\nSai mat khau, Khoi dong lai may"; getch(); khoi_dong_may(); } else { cout << "\nDung mat khau, tiep tuc chuong trinh"; getch(); } } Chng trnh 4. Chng trnh minh ho cch dng bin con tr ly d liu v thi gian h thng cha trong 4 byte bt u t a ch 0:0x46C . Chng trnh cng minh ho cch truy nhp trc tip b nh mn hnh vn bn (a ch u l 0xB800:0) v cch bt phm tng qut. Chng trnh s in ra mn hnh cc ch ci mt cch ngu nhin. Khi bm phm F1 chng trnh tm dng thng bo thi gian. kt thc chng trnh bm phm ESC. #include <dos.h> #include <conio.h> #include <stdlib.h> #define VT 132 // vi tri thong bao //Dia chi vung nho man hinh char far *p_mh = (char far*)MK_FP(0xB800,0) ; //Dia chi 4 byte chua thoi gian unsigned long far *t_time=(unsigned long far*)MK_FP(0,0x46C); char buf_time[]={'T',47,'I',47,'M',47,'E',47,':', 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47, 32, 47};

571

char buf_luu[28]; void thong_bao_thoi_gian() { //Luu trang thai man hinh for (int i=0; i<28; ++i) buf_luu[i]=p_mh[i]; // Xac dinh gio, phut, giay int gio = (int)(*t_time/65543) ; unsigned long du = *t_time%65543 ; int phut = (int)(du/1092); du = du%1092; int giay = (int)(du/18); //Doi ra ky tu dua vao mang buf_time buf_time[12]=gio/10 + 48; buf_time[14]=gio%10 + 48; buf_time[18]=phut/10 + 48; buf_time[20]=phut%10 + 48; buf_time[24]=giay/10 + 48; buf_time[26]=giay%10 + 48; //Dua thong bao goi ra man hinh for (i=0; i<28; ++i) p_mh[i] = buf_time[i]; getch(); //Khoi phuc man hinh

572

for (i=0; i<28; ++i) p_mh[i] = buf_luu[i]; } void main() { int ch1, ch2; clrscr(); while(1) { if (kbhit()) { ch1=getch(); if (ch1==0) ch2=getch(); if (ch1==27) //ESC break; if (ch1==0 && ch2==59) // Bam F1 thong_bao_thoi_gian(); } //In cac chu cai mot cach ngau nhien gotoxy(random(80)+1,random(25)+1); putch(random(26)+65); delay(400); } }

573

Chng 10 Mt S Chng Trnh Hng i Tng Trn C++

Chng ny trnh by thm mt s chng trnh hng i tng trn C++. y l cc chng trnh tng i phc tp, hu ch v s dng cc cng c mnh ca C++ nh: Cch truy nhp trc tip b nh mn hnh, k thut ho, con tr void, tnh k tha, lp c s tru tng, tng ng bi, phng thc o.

1. Lp ca s
Chng trnh gm lp cua_so v lp stack + Lp ca s Thuc tnh gm: char *noidung; // Tr n vng nh cha ni dung // son tho trn ca s int cao,rong ; // Chiu cao v chiu rng ca s int mau; // mau = 16*mau_nen + mau_chu

int ra_mh; // Cho bit ca s c a ra mn hnh cha? int posx,posy; // V tr trn tri ca ca s trn mn hnh word *pluu; // Tr n vng nh cha ni dung // phn mn hnh b ca s ln Phng thc gm: cua_so(); cua_so(int c,int r,byte mau_nen, byte mau_chu);

574

int push(int x,int y); // a ca s ra mn hnh ti (x,y) // cho php son tho trn ca s // Bm F6 chuyn sang ca s khc // Bm ESC kt thc void pop(); // Tho g ca s v khi phc mn hnh int get_ra_mh(); + Lp stack (dng qun l mt dy ca s) Thuc tnh gm: int max; //S ca s cc i c th qun l int num; //S ca s hin c trong stack cua_so **pcs; //Con tr tr n vng nh cha //a ch ca cc i tng cua_so Phng thc gm: stack(); stack(int max_cs); int accept(cua_so *cs,int x,int y); //a mt ca s //vo stack, n s hin ln mn hnh void del(); // Loi ca s khi stack, n s b xo // khi mn hnh Ni dung chng trnh: + u tin hin ca s th nht nn GREEN cha WHITE. C th son tho trn . + Nu bm ESC kt thc chng trnh, nu bm F6 th hin thm ca s th hai nn CYAN ch MAGENTA. C th son tho trn .

575

+ Nu bm ESC kt thc chng trnh, nu bm F6 th hin thm ca s th ba nn RED ch YELLOW. C th son tho trn . + ang mt ca s, nu bm ESC th kt thc chng trnh, nu bm F6 th hin ca s tip theo (theo th t vng quanh: 1 -> 2 -> 3 -> 1). Chng trnh s dng phng php truy nhp trc tip b nh mn hnh trnh by trong chng 9. // CT10_01.CPP // lop cua_so #include <stdio.h> #include <conio.h> #include <dos.h> #include <alloc.h> typedef unsigned int word; typedef unsigned char byte; struct kt_word { word kt; }; struct kt_byte { byte ma, mau; }; union ky_tu { struct kt_byte h;

576

struct kt_word x; }; typedef union ky_tu far *VP; VP vptr=(VP)MK_FP(0xb800,0); // Vi tri x,y tren man hinh #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) class cua_so { private: char *noidung; int cao, rong; int mau; // mau = 16*mau_nen + mau_chu int ra_mh; int posx,posy; word *pluu; public: cua_so(); cua_so(int c,int r,byte mau_nen, byte mau_chu); int push(int x,int y); void pop(); int get_ra_mh(); }; cua_so::cua_so() {

577

cao=rong=mau=ra_mh=posx=posy=0; noidung=NULL; pluu=NULL; } cua_so::cua_so(int c,int r,byte mau_nen, byte mau_chu) { cao=c; rong=r; mau= 16*mau_nen+mau_chu; ra_mh=posx=posy=0; noidung = (char*)malloc(cao*rong); for (int i=0;i<cao*rong;++i) noidung[i]=32; pluu= (word*)malloc(2*cao*rong); } int cua_so::push(int x,int y) { word *p= pluu; char *pnd=noidung; VP ptr; int i,j; // Luu man hinh if (ra_mh==0) { ra_mh=1; posx=x;posy=y; for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j)

578

{ ptr=VPOS(i,j); *p=ptr->x.kt; ++p; } } // Hien noi dung dang soan thao tren cua so for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j) { ptr=VPOS(i,j); ptr->h.mau=mau; ptr->h.ma=*pnd; ++pnd; } // Soan thao int xx=posx,yy=posy,ch1,ch2; while (1) { gotoxy(xx,yy); if ((ch1=getch())==0) ch2=getch(); if (ch1==27)break; // ESC Ket Thuc Soan Thao else if (ch1==0&&ch2==64)break; //F6 else if (ch1==13) { ++yy; xx=posx; if(yy>=posy+cao) break; }

579

else if (ch1!=0) { ptr=VPOS(xx,yy); ptr->h.ma=ch1; ++xx; if (xx>=posx+rong) {++yy; xx=posx;} if (yy>=posy+cao) break; } else if (ch2==72||ch2==80||ch2==75||ch2==77) { if (ch2==72) yy--; else if (ch2==80) ++yy; else if (ch2==75) --xx; else ++xx; if (xx<posx) xx=posx; if (xx>=posx+rong) {++yy; xx=posx;} if (yy<posy) yy=posy; if (yy>=posy+cao) break; } } // Luu ket qua soan thao pnd=noidung; for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j)

580

{ ptr=VPOS(i,j); *pnd=ptr->h.ma; ++pnd; } if (ch1==0&&ch2==64) return 0; //F6 else return 1; } void cua_so::pop() // Khoi phuc vung nho bi cua so chiem { if (ra_mh==0) return; ra_mh=0; word *p=pluu; VP ptr; int i,j; for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j) { ptr=VPOS(i,j); ptr->x.kt=*p; ++p; } } int cua_so::get_ra_mh() { return ra_mh; }

581

//class stack class stack { private: int max,num; cua_so **pcs; public: stack(); stack(int max_cs); int accept(cua_so *cs,int x,int y); void del(); }; stack::stack() { max=num=0; pcs=NULL; } stack::stack(int max_cs) { max=max_cs; num=0; pcs=(cua_so**)malloc(max*sizeof(cua_so*)); for (int i=0;i<max;++i) pcs[i]=NULL; } int stack::accept(cua_so *cs,int x,int y) {

582

int gt; if (num==max)return 0; if (!cs->get_ra_mh()) { pcs[num]=cs; ++num; } gt=cs->push(x,y); return gt; } void stack::del() { if (num==0) return; --num; pcs[num]->pop(); pcs[num]=NULL; } main() { int ch; cua_so w1(10,40,GREEN,WHITE), w2(12,42,CYAN,MAGENTA), w3(14,44,RED,YELLOW); stack s(4); clrscr();

583

while(1) { ch=s.accept(&w1,5,5); if(ch==1)break; ch=s.accept(&w2,8,8); if(ch==1)break; ch=s.accept(&w3,11,11); if(ch==1)break; } s.del(); s.del(); s.del(); }

2. Lp menu
Lp cmenu c 2 phng thc to lp v s dng menu: 1. Hm to cmenu(int so_cn_menu,char **nd_menu); dng to mt menu (i tng kiu cmenu). Hm to cha 2 i l: + Bin so_cn_menu cha s chc nng ca menu + Con tr nd_menu tr ti mt vng nh cha a ch cc chui k t dng lm tiu menu v 512tiu cc chc nng menu. V d cc cu lnh: char *nd[]={"Qun l vt t", "Nhp s liu", "Tm kim","Kt thc"}; cmenu mc(3,nd);

584

s to mt menu mc gm 3 chc nng: Nhp s liu, Tm kim v Kt thc. Menu c tiu l: Qun l vt t 2. Phng thc int menu(int x,int y,int mau_nen,int mau_chon); thc hin cc vic sau: + Hin th menu ti v tr (x,y) trn mn hnh. Menu c mu nn xc nh bi i mau_nen v mu chc nng nh chn (hp sng) xc nh bi i mau_chon. + Cho php s dng cc phm mi tn ln, xung di chuyn hp sng v dng phm Enter thot khi phng thc. + Sau khi thot khi, phng thc tr v gi tr bng s th t (tnh t 1) ca chc nng c chn. Chng trnh di y xy dng lp cmenu v minh ho cch s dng lp ny. /* CT10_02.CPP menu.cpp lop cmenu */ #include <stdio.h> #include <conio.h> #include <dos.h> #include <alloc.h> #include <string.h> typedef unsigned int word; typedef unsigned char byte; struct kt_word

585

{ word kt; }; struct kt_byte { byte ma, mau; }; union ky_tu { struct kt_byte h; struct kt_word x; }; typedef union ky_tu far *VP; VP vptr=(VP)MK_FP(0xb800,0); // Vi tri x,y tren man hinh #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) class cmenu { private: int so_cn,cao,rong,posx,posy; int chon; char **nd; private: void hiendc(char *dc,int x,int y, int mau);

586

void hien_menu(int x,int y,int mau_nen,int mau_chon); public: cmenu(int so_cn_menu,char **nd_menu); int menu(int x,int y,int mau_nen,int mau_chon); }; cmenu::cmenu(int so_cn_menu,char **nd_menu) { cao=so_cn=so_cn_menu; nd=nd_menu; rong=0; chon=1; int d; for(int i=0;i<=so_cn;++i) if( (d=strlen(nd[i])) > rong) rong=d; } void cmenu::hiendc(char *dc,int x,int y, int mau) { VP ptr; int i; byte m=16*mau+15; //chu trang for(i=0;i<rong;++i) { ptr=VPOS(x+i,y); ptr->h.mau=m ; ptr->h.ma=32; }

587

for(i=0;i<rong;++i) { ptr=VPOS(x+i,y); if(dc[i]==0)break; ptr->h.ma=dc[i]; } } void cmenu::hien_menu(int x,int y,int mau_nen,int mau_chon) { for(int i=0;i<=so_cn;++i) hiendc(nd[i],x,y+i,mau_nen); hiendc(nd[chon],x,y+chon,mau_chon); } int cmenu::menu(int x,int y,int mau_nen,int mau_chon) { int ch1,ch2,chonluu; //Trinh bay hien_menu(x,y,mau_nen,mau_chon); //Bat phim while(1) { if( (ch1=getch())==0 ) ch2=getch(); if(ch1==13) //chon chuc nang return (chon);

588

else if( (ch1==0)&&(ch2==80||ch2==72)) { //Di chuyen hop sang chonluu=chon; if(ch2==80) ++chon; else --chon; if(chon<1) chon=cao; else if(chon>cao) chon=1; if(chon!=chonluu) { hiendc(nd[chonluu],x,y+chonluu,mau_nen); hiendc(nd[chon],x,y+chon,mau_chon); } } } } char *nd[]={"TINH DIEN TICH", "Tam giac","Hinh tron", "Chu nhat", "Hinh vuong", "Ket thuc chuong trinh"}; void main() { cmenu mc(5,nd); int chon; clrscr(); while(1) {

589

chon=mc.menu(5,5,BLUE,MAGENTA); if(chon==1) { clrscr(); puts("TAM GIAC"); getch(); clrscr(); } else if(chon==2) { clrscr(); puts("HINH TRON"); getch();clrscr(); } else if(chon==3) { clrscr(); puts("CHU NHAT"); getch();clrscr(); } else if(chon==4) { clrscr(); puts("HINH VUONG"); getch(); clrscr();

590

} else break; } }

3. Lp hnh hc
Chng trnh di y gm: + Lp hinh l lp c s tru tng + V 3 lp dn sut t lp hnh l: - Lp khoihop biu th cc khi hp lp phng - Lp duong biu th cc on thng qua 2 im - Lp tron biu th cc ng trn Chng trnh minh ho cch dng tng ng bi v phng thc o. Ni dung chng trnh nh sau: + Khi chy chng trnh s thy xut hin mt khi hp lp phng. + C th di chuyn khi hp bng cc phm mi tn. + Bm phm Q s xut hin mt on thng. + C th di chuyn on thng bng cc phm mi tn. + Bm phm Q s xut hin mt ng trn. + C th di chuyn ng trn bng cc phm mi tn. + Bm phm Q s kt thc chng trnh. /*
518

CT10_03.CPP LOP hinh hoc

591

Minh hoa cach dung: + lop co so truu tuong + Tuong ung boi va phuong thuc ao */ #include <graphics.h> #include <process.h> #include <stdio.h> #include <conio.h> char getkey(int &dx,int &dy); class hinh { protected: int mau; public: hinh(void) { mau=0; } hinh(int m) { mau=m; } virtual void dchuyen(int b)=0; };

592

class khoihop : public hinh { private: int x,y; int a ; public: khoihop(void):hinh() { x=y=a=0; } khoihop(int m,int x1,int y1, int a1):hinh(m) { x=x1; y=y1; a=a1; } virtual void dchuyen(int b); void hien(void) { setfillstyle(1,mau); bar3d(x,y,x+a,y+a,a/2,1); } void an(void) {

593

setfillstyle(1,getbkcolor()); bar(x,y-a/2,x+a+a/2,y+a+a/2); } }; class duong:public hinh { private: int x1,y1,x2,y2; public: duong(void):hinh() { x1=x2=y1=y1=0; } duong(int m,int a,int b,int c,int d):hinh(m) { x1=a;y1=b;x2=c;y2=d; } virtual void dchuyen(int b); void hien(void) { setcolor(mau); line(x1,y1,x2,y2); } void an(void)

594

{ setcolor(getbkcolor()); line(x1,y1,x2,y2); } }; class tron:public hinh { private: int x,y,r; public: tron(void):hinh() { x=y=r=0; } tron(int m,int a,int b,int d):hinh(m) { x=a; y=b; r=d; } virtual void dchuyen(int b); void hien(void) { setcolor(mau); circle(x,y,r); }

595

void an(void) { setcolor(getbkcolor()); circle(x,y,r); } }; char getkey(int &dx,int &dy) { int ch1,ch2; dx=dy=0; while (1) { ch1=getch(); if (ch1==0) ch2=getch(); if (ch1=='q'||ch1=='Q') return('q'); if ((ch1==0&&(ch2==80||ch2==72||ch2==75||ch2==77)))
522

{ if (ch2==80) dy=1; else if (ch2==72) dy=-1; else if (ch2==77) dx=1; else dx=-1; return(0); }

596

} } void khoihop::dchuyen(int b) { int dx,dy; while (1) { hien(); if (getkey(dx,dy)=='q') break; an(); x+=b*dx; y+=b*dy; } } void duong::dchuyen(int b) { int dx,dy; while (1) { hien(); if (getkey(dx,dy)=='q') break; an(); x1+=b*dx; x2+=b*dx;

597

y1+=b*dy; y2+=b*dy; } } void tron::dchuyen(int b) { int dx,dy; while (1) { hien(); if (getkey(dx,dy)=='q') break; an(); x+=b*dx; y+=b*dy; } } void main() { int mh=0,mode=0; initgraph(&mh,&mode,""); if (graphresult()) { printf("\n LOI"); getch();

598

exit(0); } setbkcolor(0); // setwritemode(0); hinh *h[3]; khoihop M(4,300,200,15); duong D(10,10,10,60,60); tron T(14,200,200,50); h[0]=&M; h[1]=&D;h[2]=&T; for(int i=0;i<3;++i) h[i]->dchuyen(10); closegraph(); }

4. Cc lp ngn xp v hng i
Chng trnh t chc thnh 4 lp chnh: 1. Lp container (thng cha) gm 2 thuc tnh: unsigned long count; //S phn t trong thng cha void (*errhandler)(); //Con tr ti hm x l li 2. Lp s_list tha k t lp container, c thm 2 thuc tnh cc con tr kiu cu trc listnode: struct listnode { void *dataptr;

599

listnode *next; }; listnode *head; // Tr ti u danh sch listnode *tail; // Tr ti cui danh sch

Cc phn t c cha trong lp s_list di dng mt danh sch mc ni n. Mi nt cha a ch ca mt phn t. Do y dng kiu con tr void nn c th a vo lp s_list cc phn t c kiu bt k. 3. Lp stack tha k t lp s_list 4. Lp queue tha k t lp stack Cc lp stack v queue khng c cc thuc tnh ring. Hai phng thc quan trng ca cc lp ny l: virtual int store(void *item) ; // Ct vo mt phn t virtual void *retrieve () ; // Ly ra mt phn t Ch l: Lp stack hot ng theo nguyn tc LIFO (vo sau ra trc) cn lp queue hot ng theo nguyn tc FIFO (vo trc ra trc) . Chng trnh sau minh ho cch dng lin kt bi, phng thc o v con tr kiu void qun l cc kiu d liu khc nhau. Hot ng ca chng trnh nh sau: + Trc tin ln lt a a ch ca bin i tng ts1, chui HA NOI, bin nguyn a, bin i tng ts2 v bin thc x vo ngn xp s1 v hng i q1. + Thc hin php gn cc bin i tng: s2 = s1 ; q2 = q1 ; + Ly cc phn t trong ngn xp s2 theo trnh t ngc vi lc a vo. + Ly cc phn t trong hng i q2 theo trnh t nh lc a vo. /*

600

CT10_05.CPP Lop vat chua (container) Lop danh sach moc noi Lop ngan xep Lop hang doi Chu y: 1. constructor sao chep cua lop dan suat 2. toan tu gan cua lop dan suat 3. co the dung cac phuong thuc khac de viet constructor va destructor 4. Dung con tro this */ #include <stdio.h> #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <alloc.h> #include <dos.h> //Lop container class container { protected: unsigned long count; //so pt trong thung chua void (*errhandler)();

601

public: container(); container(const container &c); // Ham tao sao chep void operator=(const container &c); // Gan unsigned long getcount(); // Cho biet so phan tu // Dinh ham xl loi void seterrorhandler(void (*userhandler)()); // 4 phuong thuc thuan ao virtual int store(void *item)=0;//Cat mot phan tu vao thung virtual void *examine()=0; // Xem gia tri mot phan tu virtual void *retrieve ()=0; // Lay mot pt ra virtual void empty()=0; // Lam cho thung tro nen rong }; // Cai dat // Ham xl loi mac dinh void defaulthandler(); void defaulthandler() { puts("\nContainer error: memory allocation failure"); } container::container () { count=0; errhandler= defaulthandler; }

602

container::container(const container &c) { count=c.count; errhandler=c.errhandler; } // Gan void container::operator=(const container &c) { count=c.count; errhandler=c.errhandler; } // Cho biet so pt unsigned long container::getcount() { return count; } // Dinh ham xl loi void container::seterrorhandler(void (*userhandler)()) { errhandler=userhandler; } // Lop danh sach moc noi don class s_list:public container { protected: //Cau truc mot nut trong ds

603

struct listnode { void *dataptr; listnode *next; }; listnode *head; listnode *tail; private: // phuong thuc sao chep void copy(const s_list &s1); public: s_list(); s_list(const s_list &s1); ~s_list(); void operator=(const s_list &s1); // 4 phuong thuc ao virtual int store(void *item)=0; // Cat mot phan tu vao // thung virtual void *examine()=0; // Xem gia tri mot phan tu virtual void *retrieve ()=0; // Lay mot pt ra virtual void empty(); // Lam cho thung tro nen rong }; //Cai dat void s_list::copy(const s_list &s1)

604

{ head=NULL; tail=NULL; listnode *temp = s1.head; while(temp!=NULL) { if(head==NULL) { head= new listnode; if(head==NULL) errhandler(); tail=head; } else { tail->next = new listnode; if(tail->next == NULL) errhandler(); tail = tail->next; } tail->dataptr= temp->dataptr; tail->next=NULL; temp = temp->next; } } // constructor s_list::s_list() : container()

605

{ head=NULL; tail=NULL; } s_list::s_list(const s_list &s1):container(s1) { copy(s1); } s_list::~s_list() { this->empty(); } void s_list::operator=(const s_list &s1) { this->empty(); count=s1.count; copy(s1); } void s_list::empty() { listnode *q,*p; p = head; head=NULL; tail=NULL; while (p!=NULL) { q=p; p=p->next;

606

delete q; } } // Lop stack class stack:public s_list { public: stack(); stack(const stack &st); void operator=(const stack &st); virtual int store(void *item); // Cat mot phan tu vao thung virtual void *examine(); // Xem gia tri mot phan tu virtual void *retrieve(); // Lay mot pt ra }; stack::stack():s_list() { } stack::stack(const stack &st):s_list(st) { } void stack::operator=(const stack &st) { this->s_list::operator=(st); //Dung toan tu gan cua s_list }

607

int stack::store(void *item) // Cat mot phan tu vao thung { //Dua vao dau danh sach listnode *p; p= new listnode ; if(p==NULL) return 1; count++; p->dataptr=item; p->next=head; head=p; return 0; } void *stack::examine() // Xem gia tri mot phan tu { if(count==0) return NULL; else return head->dataptr; } void *stack::retrieve() // Lay mot pt ra { if(count==NULL) return NULL; else { listnode *p; void *value; value = head->dataptr; p=head;

608

head = p->next; delete p; count--; return value; } } // Lop queue class queue:public stack { public: queue(); queue(const queue &q); void operator=(const queue &q); virtual int store(void *item); // Cat mot phan tu vao thung }; queue::queue(): stack() { } queue::queue(const queue &q):stack(q) { } void queue::operator=(const queue &q) { this->stack::operator=(q); //Dung toan tu gan cua stack

609

} int queue::store(void *item) { // Dat vao cuoi listnode *q; q=new listnode; if(q==NULL)return 1; // Bo sung q->next=NULL; q->dataptr=item; if(count==0) { head=q; tail=q; } else { tail->next=q; tail=q; } count++; return 0; } class TS { private: char ht[25];

610

int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } void xuat() { cout << "\nHo ten: " << ht; cout << "\nSo bao danh: " << sobd; cout << "\nTong diem: " << setiosflags(ios::showpoint) << setprecision(1)<<setw(5)<< td; } }; // Ham main void main() {

611

stack s1,s2; queue q1,q2; TS ts1,ts2,ts; int a=123,b; float x=3.14,y; char *str; clrscr(); ts1.nhap(); ts2.nhap(); //Gui vao s1.store(&ts1); q1.store(&ts1); s1.store("HA NOI"); q1.store("HA NOI"); s1.store(&a); q1.store(&a); s1.store(&ts2); q1.store(&ts2); s1.store(&x); q1.store(&x); //Lay ra tu ngan xep theo nguyen tac LIFO cout <<"\n\nLay ra tu ngan xep:" ; s2=s1; y = *((float*)s2.retrieve()); cout << "\nSo thuc = " <<setiosflags(ios::showpoint) << setprecision(2)<< y; ts = *((TS*)s2.retrieve()); ts.xuat(); b = *((int*)s2.retrieve()); cout << "\nSo nguyen = " << b;

612

str = (char*)s2.retrieve(); cout << "\nChuoi ky tu: " << str; ts = *((TS*)s2.retrieve()); ts.xuat(); //Lay ra tu hang doi theo nguyen tac FIFO cout <<"\n\nLay ra tu hang doi:" ; q2=q1; ts = *((TS*)q2.retrieve()); ts.xuat(); str = (char*)q2.retrieve(); cout << "\nChuoi ky tu: " << str; b = *((int*)q2.retrieve());

cout << "\nSo nguyen = " << b; ts = *((TS*)q2.retrieve()); ts.xuat(); y = *((float*)q2.retrieve()); cout << "\nSo thuc = " << setiosflags(ios::showpoint) << setprecision(2)<< y; getch(); }

5. Cc lp sp xp

613

Trong tp C_SORT.H di y s cha 4 lp sp xp: sort, select_sort, quick_sort v heap_sort. tng qut hn. So vi cc lp sp xp trong mc 7 chng 6 th cc lp y tng qut hn ch: + Cc lp trong mc 7 chng 6 ch cho php sp xp mt dy s nguyn theo th t tng dn. + Cc lp di y cho php sp xp mt dy phn t c kiu bt k (nguyn, thc, cu trc, lp, ...) v theo mt tiu chun sp xp bt k. 1. Lp sort l lp c s tru tng + Cc thuc tnh: protected: void *a ; // Tr ti vng nh cha dy // phn t cn sp xp int size ; // ln tnh theo byte ca phn t int (*nho_hon)(void* pt1, void* pt2); // Con tr hm // nh ngha pt1 nh hn pt2 + Cc phng thc: protected: void hoan_vi(int i, int j) ; // Hon v cc phn t th i v j void * dia_chi (int m); // Cho a ch ca phn t th m public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // Sp xp dy // n phn t cha trong vng nh a1, mi phn t // c di itemsize, th t tng c quy nh // bi hm ss_nho_hon

614

2. Lp select_sort dn xut t lp sort. Lp ny s thc hin vic sp xp theo phng php chon (xem mc 7 chng 6). + Cc phng thc: public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // thc hin // sp xp theo phng php chn 3. Lp quick_sort dn xut t lp sort. Lp ny s thc hin vic sp xp theo phng php quick sort (xem mc 7 chng 6) + Cc phng thc: private: void q_sort(int l, int r); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // thc hin // sp xp theo phng php quick sort 4. Lp heap_sort dn xut t lp sort. Lp ny s thc hin vic sp xp theo phng php heap sort (xem mc 7 chng 6). + Cc phng thc: private: void shift(int i, int n); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void* ,void* )) ; // thc hin // sp xp theo phng php heap sort

615

Di y l ni dung tp C_SORT.H //C_SORT.H // Lop co so truu tuong // Lop sort #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <iostream.h> #include <iomanip.h> #include <mem.h> class sort { protected: void *a; int size; int (*nho_hon)(void*,void*); void* dia_chi(int m) { return (void*) ((char*)a + size*(m-1)); } void hoan_vi(int i, int j) { void *tg, *di, *dj; di= dia_chi(i);

616

dj= dia_chi(j); tg = new char[size]; memcpy(tg,di,size); memcpy(di,dj,size); memcpy(dj,tg,size); } public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { a=a1; size=n; // Cho C++ hai long size=itemsize; nho_hon= ss_nho_hon; } }; class select_sort : public sort { public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) ; }; void select_sort::sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*))

617

{ int i,j,r; sort::sapxep(a1,n,itemsize,ss_nho_hon); for(i=1; i<n; ++i) { r=i; for(j=i+1; j<=n; ++j) if(nho_hon(dia_chi(j),dia_chi(r))) r = j; if(r!=i) hoan_vi(i,r); } } class quick_sort : public sort { private: void q_sort(int l, int r); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) ; }; void quick_sort::q_sort(int l, int r) { void *x; int i,j; x = new char[size];

618

if(l < r) { memcpy(x, dia_chi(l), size); i = l; j = r+1; do { ++i; --j; while(i<r && nho_hon(dia_chi(i),x)) ++i ; while(nho_hon(x,dia_chi(j)) ) --j ; if(i<j) hoan_vi(i,j); } while (i<j); hoan_vi(l,j); q_sort(l,j-1); q_sort(j+1,r); } } void quick_sort::sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { sort::sapxep(a1,n,itemsize,ss_nho_hon); q_sort(1,n); } class heap_sort : public sort {

619

private: void shift(int i, int n); public: virtual void sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)); }; void heap_sort::shift(int i, int n) { int l,r,k; l = 2*i; r = l+1; if(l>n) return;
542

if(l==n) { if (nho_hon(dia_chi(i), dia_chi(l))) hoan_vi(i,l); return; } if(nho_hon(dia_chi(r), dia_chi(l))) k = l; else k = r; if (!nho_hon(dia_chi(i), dia_chi(k))) return; else

620

{ hoan_vi(i,k); shift(k,n); } } void heap_sort::sapxep(void *a1,int n,int itemsize, int (*ss_nho_hon)(void*,void*)) { long i; sort::sapxep(a1,n,itemsize,ss_nho_hon); // Tao dong for(i=n/2 ; i>=1; --i) shift(i,n); // Lap for(i=n ; i>=2; --i) { hoan_vi(1,i); shift(1,i-1); } }

6. V d v Cc lp sp xp
Trong mc ny trnh by 2 chng trnh minh ho cch dng cc lp ni trn. Chng trnh th nht minh ho cch s dng cc lp trong tp C_SORT.H sp xp mt dy th sinh theo

621

th t gim v th t tng ca tng im. Chng trnh th hai minh ho cch dng cc lp trong C_SORT.H sp xp mt dy s nguyn theo chiu tng v chiu gim. Chng trnh 1 //CT10-08 // Lop co so truu tuong // Lop sort #include "c_sort.h" class TS { private: char ht[25]; int sobd; float td; public: float get_td() { return td; } void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ;

622

cin >> sobd; cout << "Tong diem: " ; cin >> td; } void xuat() { cout << "\nHo ten: " << ht; cout << "\nSo bao danh: " << sobd; cout << "\nTong diem: " << setiosflags(ios::showpoint) << setprecision(1)<<setw(5)<< td; } }; int ss_tong_diem_giam(void *ts1, void *ts2) { return ( ((TS*)ts1)->get_td() > ((TS*)ts2)->get_td()) ; } int ss_tong_diem_tang(void *ts1, void *ts2) { return ( ((TS*)ts1)->get_td() < ((TS*)ts2)->get_td()) ; } void main() { TS t[100]; sort *sa;

623

int n,i; clrscr(); cout << "\nSo thi sinh: "; cin >> n; for(i=1; i<=n; ++i) t[i].nhap(); for(i=1; i<=n; ++i) t[i].xuat(); getch(); cout << "\n\nSap xep giam theo tong diem - PP Select Sort" ; sa= new select_sort; sa->sapxep( t+1,n,sizeof(TS),ss_tong_diem_giam); for(i=1; i<=n; ++i) t[i].xuat(); delete sa; getch(); cout << "\n\nSap xep tang theo tong diem - PP Select Sort"; sa= new select_sort; sa->sapxep( t+1,n,sizeof(TS),ss_tong_diem_tang); for(i=1; i<=n; ++i) t[i].xuat(); delete sa; getch(); cout << "\n\nSap xep giam theo tong diem - PP Quick Sort" ; sa= new quick_sort; sa->sapxep( t+1,n,sizeof(TS),ss_tong_diem_giam); for(i=1; i<=n; ++i) t[i].xuat(); delete sa;

624

getch(); cout << "\n\nSap xep tang theo tong diem - PP Quick Sort" ; sa= new quick_sort; sa->sapxep( t+1,n,sizeof(TS),ss_tong_diem_tang); for(i=1; i<=n; ++i) t[i].xuat(); delete sa; getch(); cout << "\n\nSap xep giam theo tong diem - PP Heap Sort" ; sa= new heap_sort; sa->sapxep( t+1,n,sizeof(TS),ss_tong_diem_giam); for(i=1; i<=n; ++i) t[i].xuat(); delete sa; getch(); cout << "\n\nSap xep tang theo tong diem - PP Heap Sort" ; sa= new heap_sort; sa->sapxep( t+1,n,sizeof(TS),ss_tong_diem_tang); for(i=1; i<=n; ++i) t[i].xuat(); delete sa; getch(); } Chng trnh 2 //CT10-09 // Lop co so truu tuong // Lop sort

625

#include "c_sort.h" int ss_tang(void *i1,void *i2) { return *((int*)i1) < *((int*)i2); } int ss_giam(void *i1,void *i2) { return *((int*)i1) > *((int*)i2); } void main() { int i,n; struct time t1,t2; int b[20],a[20], k, tg, sec, hund; n=10; sort *s[3]; select_sort ss; quick_sort qs; heap_sort hs; s[0]=&ss; s[1]=&qs; s[2]=&hs; clrscr(); srand(5000); for(i=1;i<=n;++i) b[i]=rand();

626

cout<<"\nDay ban dau\n "; for(i=1;i<=n;++i) cout <<b[i]<<" "; cout<<"\n\nCac day tang sap xep theo "; cout << "select_sort, quick_sort, heap_sort\n"; for(k=0; k<3; ++k) { for(i=1;i<=n;++i) a[i]=b[i]; s[k]->sapxep (a+1,n,sizeof(int),ss_tang); //In for(i=1;i<=n;++i) cout <<a[i]<<" "; cout<<"\n"; } cout<<"\n\nCac day giam sap xep theo "; cout << "select_sort, quick_sort, heap_sort\n"; for(k=0; k<3; ++k) { for(i=1;i<=n;++i) a[i]=b[i]; s[k]->sapxep (a+1,n,sizeof(int),ss_giam); //In for(i=1;i<=n;++i) cout <<a[i]<<" "; cout << "\n"; }

627

getch(); }

Ph Lc 1 Th t u tin ca cc php ton


Cc php ton c chia thnh 16 nhm. Cc php ton trong cng nhm c mc u tin nh nhau. V trnh t kt hp th: + Cc php tnh ca nhm 2, nhm 14 v ton t gn (nhm 15) kt hp t phi sang tri. + Cc php ton cn li kt hp t tri qua phi. 1. Nhm mt () Gi hom (Function call) [] Ch s mng (Array subscript) -> Chn gin tip mt thnh phn (indirect component selector) :: . Xc nh phm vi truy nhp (scope access/resolution) Chn trc tip mt thnh phn (direct component selector)

2. Nhm hai () Gi hom (Function call) ! ~ + Ph nh logic (Logical negation -NOT) Ly phn b theo bit (Bitwise (1's) complement) Du cng (Unary plus) Du tr (Unary minus)

++ Php tng mt (Preincrement or postincrement) -Php gim mt (Predecrement or postdecrement)

628

& Php ly a ch (Address) * Truy nhp gin tip (Indirection)

sizeof Cho kch thc ca ton hng (returns size of operand, in bytes) new Cp pht b nh ng (dynamically allocates C++ storage) delete Gii phng b nh (dynamically deallocates C++ storage) 3. Nhm ba * / Nhn ( Multiply) Chia (Divide)

% Ly phn d (Remainder - modulus) 4. Nhm bn .* Gi gin tip ti thnh phn t mt bin i tng ->* Gi gin tip ti thnh phn t mt con tr i tng 5. Nhm nm + Cng (Binary plus) Tr (Binary minus)

6. Nhm su << Dch tri (Shift left) >> Dch phi (Shift right) 7. Nhm by < Nh hn (Less than)

<= Nh hn hoc bng (Less than or equal to) > Ln hn (Greater than)

>= Ln hn hoc bng (Greater than or equal to)

629

8. Nhm tm == Bng (Equal to) != Khng bng (Not equal to) 9. Nhm chn & Php v theo bit (Bitwise AND) 10. Nhm mi ^ Php hoc loi tr theo bit (Bitwise XOR)

11. Nhm mi mt | Php hoc theo bit (Bitwise OR) 12. Nhm mi hai && Php v logic (Logical AND) 13. Nhm mi ba && Php hoc logic (Logical OR) 14. Nhm mi bn ?: Ton t iu kin (a ? x : y means "if a then x, else y")

15. Nhm mi nm = *= /= Php gn n gin (Simple assignment) Php gn sau khi nhn (Assign product) Php gn sau khi chia (Assign quotient)

%= Php gn sau khi ly phn d (Assign remainder) += -= Php gn sau khi cng (Assign sum) Php gn sau khi tr (Assign difference)

&= Php gn sau khi AND theo bit (Assign bitwise AND) ^= Php gn sau khi XOR theo bit (Assign bitwise XOR)

630

|=

Php gn sau khi OR theo bit (Assign bitwise OR)

<<= Php gn sau khi dch tri (Assign left shift) >>= Php gn sau khi dch phi (Assign right shift) 16. Nhm mi su , Ton t phy dng phn cch cc phn t Tt c cc ton t ni trn u c th nh ngha chng tr cc ton t sau: . Chn trc tip mt thnh phn

.* Gi gin tip ti thnh phn t mt bin i tng :: Ton t xc nh phm vi truy nhp

?: Ton t iu kin

631

Ph Lc 2. Cc T Kha Ca C++
asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef union unsigned virtual void volatile while

632

Ph Lc 3 Bng M Asskey V Gii Quyt


1. Bng m ascii B k t ASCII gm 256 k t c phn b nh sau: + 32 k t u tin l cc k t iu khin khng in c nh k t Enter (m 13), k t ESC (m 27). + Cc m ASCII 32-47, 58-64, 91-96 v 123-127 l cc k t c bit nh du chm, du phy, du cch, du ngoc, du mc, du hi,... + Cc m ASCII 48-57 l 10 ch s + Cc m ASCII 65-90 l cc ch ci hoa t A n Z + Cc m ASCII 97-122 l cc ch ci thng t a n z Lu : Ch thng c m ASCII ln hn 32 so vi ch hoa tng ng. V d m ASCII ca a l 97 cn m ASCII ca A l 65. + Cc m ASCII 128-255 l cc k t ho. Bng sau cho m ASCII ca 128 k t u tin. nhn c cc k t ho (c m t 128 n 255) c th dng chng trnh sau: // In cc k t ho ln mn hnh #include <stdio.h> #include <conio.h> main() { int i; clrscr(); for (i=128; i<=255; ++i) printf("%6d%2c",i,i); }

633

Bng m ASCII m (S TT) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 k t m (S TT) 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 SUB ESC FS GS RS US Space ! # $ % & ( ) * + , k t m (S TT) 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 4 5 6 7 8 9 : ; < = > ? @ A B C D E F k t

634

19 20 21 22 23 24 25 m (S TT) 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

DC3 DC4 NAK SYN ETB CAN EM k t

45 46 47 48 49 50 51 m (S TT)

. / 0 1 2 3 k t

71 72 73 74 75 76 77 m (S TT)

G H I J K L M k t

N O P Q R S t U V W X Y Z [ \

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

_ * a b c d e f g h i J k l m

112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

p q r s t u v w x y z { | } ~

635

93 94

] ^

110 111

n o

127

DEL

2. Bng m scan t bn phm Mi phm trn bn phm ca IBM PC u c gn mt con s, gi l m scan, t 1 n 83. IBM PC AT ng mt nhm m khc, t 1 n 108 cc m ny bt u bng cc phm s, cc phm ch, ri n cc phm chc nng v cui cng l cc phm cho con tr, khi mt phm c nhn th b x l ca bn phm gi cho CPU m scan tng ng, khi n c nh th m scan cng thm 80 hex s c gi tip cho CPU. Hex
556 1

Thp phn 1 2-11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Phm ca PC ESC 1-9,0 tr, gch di =, + Backspace Tab Q W E R T Y U I O P

Phm ca PC-AT Tilde 1-9,0 tr, gch di =, + \,thanh ng Backspace Tab Q W E R T Y U I O

2-B C D E F 10 11 12 13 14 15 16 17 18 19

636

1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 Hex 26 27 28 29 2A 2B 2C 2D 2E 2F 30

26 27 28 29 30 31 32 33 34 35 36 37 Thp phn 38 39 40 41 42 43 44 45 46 47 48

[ ] Enter Ctrl A S D F G H J K Phm ca PC L Chm phy, : Nhy Tidle Shift \, thanh ng Z X C V B

P [ ]

Ctrl A S D F G H J Phm ca PC-AT K L Chm phy,: Nhy tri Enter Shift tri

Z X C

637

31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 Hex 42 43 44 45 46 47

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 Thp phn 66 67 68 69 70 71

N M Phy Chm /,? Shift phi *, PrtScr Alt Space bar Caps Lock F1 F2 F3 F4 F5 F6 F7 Phm ca PC F8 F9 F10 Num Lock

V B N M Phy Chm /, ?

Shift phi Alt

Space bar

Caps Lock F2 Phm ca PC-AT F4 F6 F8 F10

Scroll Lock,Break F1 Home F3

638

48 49 4A 4B 4C 4D 4F 50 51 52 53 5A 5B 5C 5D 5F 60 61 62 63 64 65 Hex 66

72 73 74 75 76 77 79 80 81 82 83 90 91 92 93 95 96 97 98 99 100 101 Thp phn 102

mi tn ln PgUp

F5 F7

Du tr bn tnh F9 Mi tn tri 5 Mi tn phi End Mi tn xung PgDn Ins Del ESC Home Mi tn tri End Num Lock Mi tn ln 5 ca bn tnh Mi tn xung Ins Scroll Lock PgUp Phm ca PC Phm ca PC-AT Mi tn phi ca bn tnh

639

67 68 69 6A 6B 6C

103 104 105 106 107 108

PgDn Del Sys *, PrtScr +

640

Ph Lc 4 Hm Vi i S Bt nh Trong C
Trong cc gio trnh C thng ch hng dn cch xy dng hm vi cc i c nh. Mi i cn c mt tham s (cng kiu vi n) trong li gi hm. Tuy nhin mt vi hm chun ca C li khng nh vy, m linh hot hn, chng khi dng hm printf hay scanf th s tham s m ta cung cp cho hm l khng c nh c v s lng ln kiu cch. V d trong cu lnh: printf(\n Tng = %d , 3+4+5) ; c 2 tham s, nhng trong cu lnh: printf(\n H Ni ) ; ch c mt tham s. Nh vy cn phn bit cc khi nim sau: - i s c nh c khai bo trong dng u ca hm, n c tn v kiu - Tham s ng vi i s c nh gi l tham s c nh - i bt nh c khai bo bi ba du chm: bt nh c v s lng v kiu - Tham s bt nh (ng vi i bt nh) l mt danh sch gi tr vi s lng v kiu tu (khng xc nh) Trong ph lc ny s trnh by cch xy dng cc hm vi i s bt nh. Cng c ch yu c dng l con tr v danh sch. 1. Bin con tr Bin con tr (hay con tr) dng cha a ch ca bin, mng, hm, ... C nhiu kiu a ch, v vy cng c nhiu kiu con tr. Bin con tr c khai bo theo mu: Kiu *Tn_bin_con_tr ; V d: float px ; // px l con tr thc Cc php ton quan trng trn con tr gm: + Gn a ch mt vng nh cho con tr (dng ton t gn, php ly a ch, cc hm cp pht b nh)

641

+ Truy nhp vo vng nh thng qua con tr, dng php ton: *Tn_con_tr ( y c 2 vng nh: vng nh ca bin con tr v vng nh m a ch u ca n cha trong bin con tr) + Cng a ch con tr cha a ch ca phn t tip theo, dng php ton: ++ Tn_con_tr hoc Tn_con_tr ++

Ch rng cc php ton trn ch c th thc hin i vi con tr c kiu. 2. Danh sch khng cng kiu Dng con tr c kiu ch qun l c mt danh sch gi tr cng kiu, v d dy s thc, dy s nguyn, dy cc cu trc,.... Khi cn qun l mt danh sch cc gi tr khng cng kiu ta phi dng con tr khng kiu (void) khai bo nh sau: void * Tn_con_tr ; Con tr void c th cha cc a ch c kiu bt k, v dng tr n vng nh cha danh sch cn qun l. Mt ch quan trng l mi khi gi vo hay ly ra mt gi tr t vng nh, th tu theo kiu gi tr m ta phi dng php chuyn kiu thch hp i vi con tr. V d sau minh ho cch lp mt danh sch gm mt s nguyn, mt s thc v mt chui k t. Chng ta cn mt b nh cha s nguyn, s thc v a ch chui v dng cc con tr void qun l vng nh ny. void *list , *p ; // Con tr list tr ti u danh sch // p dng duyt qua cc phn t ca danh sch list=malloc(sizeof(int) + sizeof(float)+ sizeof(char*) ); p=list; *((int*)p) = 12; // a s nguyn 12 vo danh sch ((int*)p)++ ; // Chuyn sang phn t tip theo

*((float*)p) = 3.14; // a s thc 3.14 vo danh sch ((float*)p)++ ; // Chuyn sang phn t tip theo

642

*((char**)p) = HA NOI; // a a ch chui HA NOI // vo danh sch // Nhn cc phn t trong danh sch p=list; // V u danh sch int a = *((int*)p); // Nhn phn t th nht ((int*)p)++ ; // Chuyn sang phn t tip theo

float x= *((float*)p); // Nhn phn t th hai ((float*)p)++ ; // Chuyn sang phn t tip theo char *str = *((char**)p) ; // Nhn phn t th ba 3. Hm vi i s bt nh + i bt nh bao gi cng t sau cng v c khai bo bng du ba chm. V d v d hm void f(int n, char *s, ...) ; c 2 i c nh l n, s v i bt nh. + nhn c cc tham s bt nh trong li gi hm ta cn lu cc im sau: - Cc tham s bt nh cha trong mt danh sch. nhn c a ch u danh sch ta dng mt con tr void v php gn sau: void *list ; list = ... ; - Dng mt tham s c nh kiu chui quy nh s lng v kiu ca mi tham s trong danh sch, v d: 3i hiu l : tham s bt nh gm 3 gi tr int 3f hiu l : tham s bt nh gm 3 gi tr float fiss hiu l c 4 tham s bt nh c kiu ln lt l float, int, char*, char*

643

Mt khi bit c a ch u danh sch, bit c s lng v kiu ca mi tham s , th d dng nhn c gi tr cc tham s s dng trong thn hm. V d sau y minh ho cch xy dng cc hm vi tham s bt nh. Hm dng in cc gi tr kiu int, float v char. Hm c mt tham s c nh cho bit c bao nhiu gi tr v kiu cc gi tr cn in. Kiu quy nh nh sau: i l int, f l float, s l char*. Tham s c 2 cch vit: lp (gm mt hng s nguyn v mt ch ci nh kiu) v lit k (mt dy cc ch ci nh kiu). V d: 4s c ngha in 4 chui

siif c ngha in mt chui, 2 gi tr nguyn v mt gi tr thc: #include <stdio.h> #include <ctype.h> #include <string.h> #include <conio.h> #include <stdlib.h> #include <stdarg.h> void InDanhSachGiaTri(char *st,...) { void *list ; int gt_int ; float gt_float; char *gt_str; int n,i ; char kieu; int lap; list = ... ; // list tro toi vung nho chua danh sach dia chi cac // tham so

644

lap = isdigit(st[0]) ; if (lap) n=st[0] - '0' ; else n=strlen(st); printf("\n n= %d lap = %d",n,lap); getch(); for(i=0;i<n;++i) { if(lap) kieu=st[1]; else kieu = st[i]; printf("\nKieu= %c",kieu); getch(); switch(kieu) { case 'i' : gt_int = *((int*)list); if(!lap) ((int*)list)++ ; printf("\nGia tri %d = %d",i,gt_int); break; case 'f' : gt_float = (float) (*((double*)list)); if(!lap)

645

((double*)list)++ ; printf("\nGia tri %d = %0.2f",i,gt_float); break; case 's' : gt_str = *((char**)list) ; if(!lap) ((char**)list)++ ; printf("\nGia tri %d = %s",i,gt_str); } } } void main() { float x=3.14; int a=123; char *tp="HAI PHONG"; InDanhSachGiaTri("4i",a); InDanhSachGiaTri("4s","HA NOI"); InDanhSachGiaTri("ifsssffii", a, x, tp, tp,"QUY NHON", x, 6.28, a, 246); InDanhSachGiaTri("4f",6.28); getch(); } 4. Hm khng i v hm vi i bt nh

646

Nhiu ngi ngh hm khai bo nh sau void f(); l hm khng i trong C. Trong C++ th hiu nh th l ng, cn trong C th l hm c i bt nh (hm khng i trong C khai bo nh sau: f(void) ). Do khng c i c nh no cho bit v s lng v kiu ca cc tham s bt nh, nn gii php y l dng cc bin ton b. R rng gii php ny khng khng thun tin cho ngi dng v phi khai bo ng tn bin ton b v phi khi gn gi tr cho n trc khi gi hm. V d trnh by mt hm ch c i bt nh dng tnh max v min ca cc gi tr thc. Cc tham s bt nh c a vo theo trnh t sau: a ch cha max, a ch cha min, cc gi tr nguyn cn tnh max, min. Chng trnh dng bin ton b N cho bit s gi tr nguyn cn tnh max, min. int N; void maxmin() { void *lt = ... ; float *max, *min , tg; int i; max = *((float**)lt)++; min = *((float**)lt)++; *max = *min = (float) *((double*)lt)++; for(i=1;i<N;++i) { tg= (float) *((double*)lt)++; if(tg > *max) *max = tg; if(tg < *min) *min = tg; } }

647

Ph Lc 5. Tm Tt Cc Hm Ca Turbo C Theo Th T Abc

1. _chmod 2. _close 3. _creat 4. _open 5. abort 6. abs 7. acos 8. arc 9. asin 10. atan 11. atan2 12. atof 13. atoi 14. atol 15. bar 16. bar3d 17. cabs

<io.h> <io.h> <io.h> <io.h> <process.h> <stdlib.h> <math.h> <graphics.h> <math.h> <math.h> <math.h> <ctype.h> <ctype.h> <ctype.h> <graphics.h> <graphics.h> <math.h>

648

18. calloc 19. ceil 20. chdir 21. chmod 22. circle 23. cleardevive 24. clearviewport 25. close 26. clreol 27. clrscr 28. coreleft 29. cos 30. cosh 31. cprintf 32. creat 33. cscanf 34. delay 35. delline 36. disable 37. drawpoly

<alloc.h> <math.h> <dir.h> <io.h> <graphics.h> <graphics.h> <graphics.h> <io.h> <conio.h> <conio.h> <alloc.h> <math.h> <math.h> <conio.h> <io.h> <conio.h> <dos.h> <conio.h> <dos.h> <graphics.h>

649

38. ecvt 39. ellipse 40. enable 41. exit 42. exp 43. fabs 44. fclose 45. fcloseall 46. fcvt 47. feof 48. ferror 49. fflush 50. fflushall 51. fgetc 52. fgets 53. fillpopy 54. findfirst 55. findnext 56. floodfill 57. floor

<ctype.h> <graphics.h> <dos.h> <process.h> <math.h> <math.h> <stdio.h> <stdio.h> <ctype.h> <stdio.h> <stdio.h> <stdio.h> <stdio.h> <stdio.h> <stdio.h> <graphics.h> <dir.h> <dir.h> <graphics.h> <math.h>

650

58. fmode 59. fopen 60. FP_OFF 61. FP_SEG 62. fprintf 63. fprintf 64. fputc 65. fputs 66. fread 67. free 68. fscanf 69. fseek 70. fteel 71. fwrite 72. gcvt 73. geninterrupt 74. getbkcolor 75. getc 76. getch 77. getchar

<math.h> <stdio.h> <dos.h> <dos.h> <stdio.h> <stdio.h> <stdio.h> <stdio.h> <stdio.h> <alloc.h> <stdio.h> <stdio.h> <stdio.h> <stdio.h> <ctype.h> <dos.h> <graphics.h> <stdio.h> <conio.h> <stdio.h>

651

78. getche 79. getcolor 80. getcwd 81. getdate 82. getimage 83. getlinesettings 84. getmaxcolor 85. getmaxx 86. getmaxy 87. getpalette 88. getpixel 89. gets 90. gettextinfo 91. gettime 92. gettime 93. getvect 94. getviewport 95. getw 96. gotoxy 97. gotoxy

<conio.h> <graphics.h> <dir.h> <time.h> <graphics.h> <graphics.h> <graphics.h> <graphics.h> <graphics.h> <graphics.h> <graphics.h> <stdio.h> <conio.h> <dos.h> <time.h> <dos.h> <graphics.h> <stdio.h> <conio.h> <conio.h>

652

98. grapherrormsg 99. graphresult 100. imagesize 101. initgraph 102. int86 103. int86x 104. intdos 105. intdosx 106. intr 107. inxdigit 108. isalnum 109. isalpha 110. iscntrl 111. isdigit 112. isgraph 113. islower 114. isprint 115. ispunct 116. isspace 117. isupper

<graphics.h> <graphics.h> <graphics.h> <graphics.h> <dos.h> <dos.h> <dos.h> <dos.h> <dos.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h> <ctype.h>

653

118. itoa 119. kbhit 120. keep 121. labs 122. line 123. linerel 124. lineto 125. log 126. log10 127. lseek 128. ltoa 129. malloc 130. memccpy

<ctype.h> <conio.h> <dos.h> <stdlib.h> <graphics.h> <graphics.h> <graphics.h> <math.h> <math.h> <io.h> <ctype.h> <alloc.h> <memory.h> hoc <string.h> <memory.h> hoc <string.h> <memory.h> hoc <string.h> <memory.h> hoc <string.h> <memory.h> hoc <string.h> <memory.h> hoc

131. memchr

132. memcmp

133. memcpy

134. memicmp

135. memset

654

<string.h> 136. MK_FP 137. mkdir 138. movedata 139. movedata <dos.h> <dir.h> <mem.h> <memory.h> hoc <string.h> <graphics.h> <dos.h> <io.h> <graphics.h> <graphics.h> <dos.h> <dos.h> <stdio.h> <graphics.h> <dos.h> <dos.h> <math.h> <stdio.h> <stdio.h> <conio.h>

140. moveto 141. nosound 142. open 143. outtext 144. outtextxy 145. peek 146. peekb 147. perror 148. pieslice 149. poke 150. pokeb 151. pow 152. printf 153. putc 154. putch

655

155. putchar 156. putimage 157. putpixel 158. puts 159. putw 160. rand 161. random 162. randomize 163. read 164. realloc 165. rectangle 166. remove 167. rewind 168. rmdir 169. scanf 170. segread 171. setbkcolor 172. setcolor 173. setdate 174. setfillstyle

<stdio.h> <graphics.h> <graphics.h> <stdio.h> <stdio.h> <stdlib.h> <stdlib.h> <stdlib.h> v <time.h> <io.h> <alloc.h> <graphics.h> <stdio.h> <stdio.h> <dir.h> <stdio.h> <dos.h> <graphics.h> <graphics.h> <time.h> <graphics.h>

656

175. setlinestyle 176. setpalette 177. settextjustify 178. settextstyle 179. settime 180. setvect 181. setviewport 182. setwritemode 183. sin 184. sinh 185. sleep 186. sound 187. sprintf 188. sqrt 189. srand 190. strcat 191. strchr 192. strcmp 193. strcmpi 194. strcpy

<graphics.h> <graphics.h> <graphics.h> <graphics.h> <time.h> <dos.h> <graphics.h> <graphics.h> <math.h> <math.h> <dos.h> <dos.h> <stdio.h> <math.h> <stdlib.h> <string.h> <string.h> <string.h> <string.h> <string.h>

657

195. strcspn 196. strdup 197. stricmp 198. strlen 199. strlwr 200. strncat 201. strncmp 202. strncpy 203. strnicmp 204. strnset 205. strpbrk 206. strrchr 207. strrev 208. strset 209. strspn 210. strstr 211. strupr 212. system 213. tan 214. tanh

<string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <string.h> <process.h> <math.h> <math.h>

658

215. textbackground 216. textcolor 217. textheight 218. textmode 219. textwidth 220. time 221. tolower 222. toupper 223. ultoa 224. unlink 225. wherex 226. wherey 227. window 228. write

<conio.h> <conio.h> <graphics.h> <conio.h> <graphics.h> <time.h> <ctype.h> <ctype.h> <ctype.h> <stdio.h> <conio.h> <conio.h> <conio.h> <io.h>

659

Ph Lc 6 Phn Tch, Thit K V Lp Trnh Hng i Tng


1. Phn tch hng i tng
1.1. Gii thiu Phn tch h thng khng ch c lin quan cht ch vi s xut hin ca my tnh, m thc t nhu cu phn tch c trc khi my tnh xut hin t nhiu th k. Khi cc Vua Pharaon ca Ai Cp c i xy dng cc Kim T Thp, th nhng ngi thit k Kim T Thp c th c coi nh nhng nh thit k h thng, nhng kin trc s i ti, cn nhng ngi t chc vn chuyn nguyn vt liu, huy ng nhn cng xy dng Kim T Thp, theo mt ngha no , chnh l nhng ngi phn tch h thng. T gia th k trc, cc nh t bn, cc doanh nghip mun c li nhun cao phi tin hnh nghin cu phng php, cch t chc, phn cng lao ng hp l cho cc h thng sn xut, kinh doanh hot ng t hiu qu cao hn. Chnh h thc hin phn tch nhng h thng ra nhng phng php qun l, cch t chc mi, tt hn. Cng vi s pht trin ca cng nghip in t, gi thnh phn cng gim nhiu, nhng gi phn mm li tng. Nht l ph tn cho bo tr h thng p ng c nh cu ca ngi s dng li chim mt t trng rt ln trong tng chi ph cho mt d n pht trin phn mm. iu ny cho thy vai tr ca cng vic phn tch h thng l rt quan trng v cn thit phi tm ra phng php tt hn cho vic pht trin h thng. Phn tch lm nhim v phn tch bi ton thnh cc thnh phn nh hn. Trong cng ngh phn mm th n cn c ngha l phi hiu r qu trnh xy dng c t yu cu ca ngi s dng, nm c cc chc nng v cch phn r h thng vt l thnh cc n th (module). Theo phng php truyn thng th iu thng c thc hin theo cch tip cn trnxung (top-down), s dng phng php phn tch c cu trc. Phn tch hng i tng cho php m t h thng gn vi th gii thc hn, xc nh r cc i tng, tru tng ho cc yu cu trn c s xy dng c cu trc ca h thng. Phng php hng i tng gii quyt c h ngn cch gia phn tch v thit k h thng. Trong mc ny chng ta cp n cc bc cn thc hin trong phn tch hng i tng (PTHT). Thng qua v d v phn tch h thng th vin, chng ta hnh dung r hn cng vic

660

xy dng cc c t yu cu, m t i tng v cch xc nh mi quan h gia cc lp i tng trong h thng. 1.2. Cc bc thc hin trong phn tch hng i tng xy dng mt h thng phn mm th phi gii quyt ba vn chnh sau: + D liu, lp cc i tng v cu trc ca chng. + Nhng hnh vi th hin cc chc nng cc b, nhng qu trnh trong h thng. + iu khin hnh vi tng th ca h thng. Trong thc t, cu trc d liu v yu cu v hnh vi ca h thng thng xuyn thay i. Do vy phi phn tch k bi ton, la chn phng php pht trin h thng thch hp cho h thng c tnh cht m, d thch nghi gip cho cng vic bo tr h thng tn km. Ngi phn tch h thng l ngi c kin thc bao qut, c kinh nghim trong qu trnh phn tch nhiu h thng ng dng khc nhau, ng thi phi c kh nng giao tip, trao i v hiu c nhng ngi u t, thit k v nhng ngi s dng h thng. Nhim v ca phn tch h thng l phi tr li cho c cu hi "H thng lm ci g?" v "Ti sao?". xc nh c bi ton v tr li c nhng cu hi nu trn th ngi phn tch cng cn phi pht hin, tm hiu k nhng h thng c hoc ang hot ng trong thc t. C th cha phi l h thng tin hc ho. Trn c s nghin cu nhng h thng c, xc nh r yu cu ca ngi s dng quyt nh xem h thng cn xy dng s lm ci g v hot ng nh th no. Qu trnh c m t nh hnh 1-1.

661

Tm hiu h thng c

Quyt nh h thng mi lm ci g?

Yu cu ca ngi s dng

Pht hin nhng h thng c

Xc nh r h thng cn pht trin

Hnh 1-1. Mc bao qut th gii thc Trong cc phng php truyn thng th m hnh dng d liu c m t thng qua s dng d liu. Cc qu trnh trong h thng c xc nh thng qua vic phn r chc nng top-down. S bin i trng thi c s dng m t s bin i thng tin v dng iu khin trong h thng. Phng php hng i tng kt hp hai phng din d liu vi qu trnh, gp chung hnh vi cc b vi d liu trong mt n v cu trc. Phng php phn tch hng i tng cung cp cho chng ta cng c n gin nhng mnh xc nh cc i tng v xy dng cc n nguyn ca h thng cn pht trin. Phn tch hng i tng bao gm cc bc sau: + Tm hiu bi ton. + Xc nh r cc c t yu cu ca ngi s dng, ca h thng phn mm. + Xc nh cc i tng v cc thuc tnh ca chng. + Xc nh cc hm m cc i tng s phi thc hin (hnh vi ca cc i tng).

662

+ Xc nh mi quan h tng tc gia cc i tng, cc thng bo v s truyn thng bo gia cc i tng.


Xy dng cc c t yu cu

nh ngha bi ton

Xc nh cc lp i tng xc Xc nh cc hm

Mi quan h gia cc i tng

Thit k

Hnh 1-2. Phn tch hng i tng 1.2.1. Tm hiu k bi ton Nhim v u tin ca qu trnh phn tch l phi tm hiu k bi ton ng dng. Ngi phn tch phi gp g, trao i vi nhng ngi u t, nhng ngi s dng bit r v chc nng, nhim v ca h thng cn pht trin. ng thi ngi phn tch phi tm hiu, pht hin nhng h thng c hoc ang gii quyt nhng vn tng t nh nhng vn d m h thng cn x l. Da vo nhng kinh nghim, kt qu phn tch nhng h thng c, nhng cng vi m hng ngyphi thc hin xc nh chnh xc bi ton. Trn c s lm r hn nhng yu cu ca bi ton v nh ngha li theo quan im ca cc k s phm mm m bo a ra c li gii tin hc (h thng thc hin c trn my tnh). Cc khng nh v bi ton phi n gin v r rng, mch lc v vn phm. iu ny gip cho cc k s phn mm c iu kin tp chung nhiu hn vo vic xy dng li gii cho bi ton. Da trn nhng khng nh ca bi ton xy dng cc c t yu cu ca ngi s dng ln ca c h thng phn mm. 1.2.2. Xy dng cc c t yu cu

663

Khi nh ngha r bi ton th bc tip theo l phi tm hiu xem h thng d kin s yu cu lm ci g? iu quan trng y l phi xy dng c danh sch cc yu cu ca ngi s dng. R rng l y cn c s trao i, hiu bit gia ngi s dng v ngi pht trin h thng v nhng iu m h mong mun. Da trn nhng yu cu ca ngi s dng, ngi pht trin a ra cc c t cho h thng. Ngi xy dng h thng phi tr li c cc cu hi: + u ra (output) ca h thng l ci g? + H thng s phi lm ci g c kt qu mong mun, ngha l phi x l ci g? + u vo (input) ca h thng l ci g? + Nhng ti nguyn m h thng yu cu l ci g? Phi hiu r ngun gc, cc dng thng tin cn cung cp cho h thng hot ng. H thng s gii quyt vn g, nhng kt qu cn phi c l g. Xc nh c mi quan h gia u vo/ra (input/output), ngha l xc nh c nhng khng nh v mi quan h gia tin iu kin v hu iu kin cho cc qu trnh trong h thng. Cc c t chi tit phc v cho vic xy dng v trc nghim h thng kim tra xem nhng nhim v t ra c c hon thnh hay khng. 1.2.3. Xc nh cc i tng Thng thng cc i tng s c xc nh thng qua cc thc th trong th gii thc v c tru tng ho thnh cc i tng tru tng. xc nh cc i tng chng ta c th s dng mt trong nhng cng c sau: 1. S dng d liu 2. Phn tch vn bn. S dng d liu: S dng d liu l m hnh h thng cho c d liu ln qu trnh. Thng tin ly t cc ngun d liu, c chuyn n cho mt hay nhiu qu trnh x l v ngc li, mt qu trnh khi nhn thng tin vo (input) th bt u thc hin, x l thng tin v cho cc kt qu (output) v chng c gi ti cc kho d liu. Trong s dng d 581 mt qu trnh s c thc liu, 582 hin khi c cc thng tin u vo (theo cc ng c mi tn dn n qu trnh ). Trong s , hnh trn hoc ellipse c s dng biu din cho mt qu trnh, trong hnh c tn gi ca qu trnh. Tn gi cho mt qu trnh phi l duy nht v bao gi cng phi bt u bng ng t kt hp vi b ng nh: "X l n hng", "Ghi nhn ngun hng" v.v... V d:

664

n t hng

X l n hng

Ch th

Chc nng quan trng ca qu trnh l x l d liu, bin i thng tin. Dng d liu c biu din bng ng thng c mi tn lm nhim v chuyn ti thng tin vo hoc ra khi mt qu trnh. Mi tn ch hng ca dng thng tin. Lu l y ch ni ti s vn chuyn thng tin logic ch khng phi thng tin dng vt l. Dng d liu c gn vi mt tn nhng khng nht thit phi l duy nht. Cc dng d liu, v tn c gn cho n phi ch ra c thng tin logic tng ng cho mt qu trnh. Trong s dng d liu, cc d liu c biu din bng hnh ch nht c cha tn ca thng tin cc ct gi. Tn gn vi d liu phi l danh t. V d: KHACH_HANG biu din cho nhng thng tin v khch hng c c tn l KHACH_HANG. Gia d liu v qu trnh lun c t nht mt dng d liu lin kt.
n t hng Khch hng n hng X l Ch th Kho sch

Hnh 1-3. S dng d liu Cc qu trnh c biu din trong cc hnh trn hoc ellipse l cc th tc, cc hm. Hnh 1-3 m t s dng d liu ca h thng x l n hng v vn chuyn thng tin cho cng ty pht hnh sch. Trong s dng d liu ca h thng th cc thc th c biu din trong cc hnh ch nht v cc kho d liu c biu din vi tn gi t trong hai ng thng song song. Kho d liu biu din cho mt lng ln thng tin cn phi lu tr trong mt thi gian di, thng l trong cc tp d liu cho nhiu ngi c th truy nhp vo. S dng d liu c th s dng biu din qu trnh x l thng tin trong h thng nhiu mc tru tng khc nhau. Qu trnh "X l n hng", "Tp hp n hng" hnh 1-4 c lm mn t qu trnh "X l n hng" hnh 1-3 v c th tip tc c lm mn thm, m t nhng qu trnh nh thanh ton, giao hng v.v..., mc chi tit hn.

665

CSDL v sch

n t sch

X l Cc kho sch n hng

CSDL v khch hng

Tp hp n hng

Hnh 1-4. S dng d liu trong h x l n t hng Phng php to ra s dng d liu Chng ta c th to ra s dng d liu theo mt trong hai cch sau: 1. Dng s chc nng: S chc nng ch cho chng ta bit v chc nng v cu trc phn cp cng vic cn thc hin. Mt trong nhng nhim v u tin ca ngi phn tch l phn tch bi ton xy dng s chc nng ca h thng. Theo phng php c cu trc, vic phn r chc nng ca h thng thnh nhng chc nng con li bao hm nhiu chc nng con khc na s cho kt qu l mt s phn cp cc chc nng ca h thng (phn tch chc nng v cch xy dng s chc nng c cp k trong cun "Phn tch, thit k v ci t h 583 584 thng tin qun l, Vin Tin hc"). Cc chc nng trong s chc nng s c chuyn tng ng sang qu trnh trong s dng d liu. Da vo kt qu tm hiu, phn tch bi ton xc nh cc ngun d liu, kho d liu vo/ra cho cc qu trnh trong s dng d liu. 2. S dng s ng cnh: S ng cnh thng c s dng giai on u ca qu trnh phn tch v c dng vch phm vi hot ng ca h thng. Thng thng s ng cnh c xy dng di dng ta nh s chc nng, bao gm mt nt chnh biu din cho nhim v trung tm ca h thng, v to ra l cc tc nhn ngoi hoc nhm cng vic c lin quan.

666

Phn tch s chc nng, s ng cnh v cch xy dng s dng d liu c th tham kh trong cun "Phn tch, thit k v ci t h thng tin qun l, Vin Tin hc". Chng ta c th da vo nh ngha ca s dng d liu xc nh cc i tng. Trong s dng d liu, nhng hnh ch nht, c hai ng thng song song biu din cho d liu, kho d liu c th c xem nh l cc i tng. Lu rng khng c s tng ng 1-1 gia nhng nt biu din cho d liu, kho d liu trong s dng d liu vi cc i tng. Mt i tng c th l i din ca mt hay nhiu nt d liu, kho d liu trong s dng d liu tu thuc vo ng cnh ca vn m n m t. V d trong hnh 1-4. chng ta s c ba i tng: SACH, DON_HANG v KHACH_HANG. Hai nt: kho d liu "CSDL v sch" vi nt d liu "Cc kho sch" cng i din cho i tng SACH v cng qun l nhng thng tin v sch; i tng DON_HANG c xc nh t nt "n t sch" cn KHACH_HANG c xc nh t nt "CSDL v khch hng". Phn tch vn bn: Cch thc hin th hai l da trn m t bng vn bn ca bi ton hoc li gii phn tch. Vn bn m t c th gm c mt hay nhiu cu, mt hay nhiu on, chng, phn, tu thuc vo mc phc tp ca bi ton. Trong cc i tng thng c m t bng cc danh t. Danh t thng c phn loi thnh danh t ring, danh t chung, v cc danh t tru tng hoc danh t ch i lng. iu quan trng cn lu khi phn tch l phi da vo ng ngha v ng cnh phn loi danh t. Mt t c th l danh t chung trong ng cnh ny song n cng c th l danh t tru tng hoc danh t ch i lng trong ng cnh khc. Cng cn lu l khng phi tt c cc danh t u c dng biu din cho nhng i tng cn thit cho h thng ca chng ta. Bng 1-1. Bnh phn loi danh t Kiu ca danh t Danh t chung Danh t ring Danh t tru tng hoc i lng ngha Xc nh mt lp cc thc th Tn ca mt i tng xc nh Xc nh cht lng, i lng hoc hot ng ng vi danh t V d

t, khch hng, hc sinh Nguyn An, IBM, BBC Thu nhp, lng, giao thng

667

Tm li, chng ta c th s dng mt trong hai cng c trn xc nh danh sch cc i tng ca bi ton ng dng v sau tip tc: 1. Xc nh nhng i tng ch nm trong khng gian bi ton, khng gian li gii, v nhng i tng nm trong khng gian bi ton nhng nm ngoi gii hn ca h thng phn mm. 2. Xy dng cc thuc tnh cho cc i tng ca khng gian li gii. Sau khi xc nh c cc i tng th nhim v tip theo l xc nh nhng thuc tnh m t cc tnh cht ca tng lp i tng. Ngi phn tch c th da vo ba ngun cung cp thng tin c bn sau tp hp, xy dng nhng thuc tnh cho tng lp i tng: 1. T nhng kinh nghim, tri thc ca ngi phn tch h thng v thc t cng vic trong lnh vc tp trung nghin cu d on, xc nh danh sch cc thuc tnh. 2. T nhng ngi s dng, thng qua cc cuc phng vn, trao i v tm hiu bi ton c th lp danh sch cc thuc tnh. 3. T nhng h thng c, nhng bng biu, bo co v cc ti liu khoa hc c s dng thng xuyn trong lnh vc ang nghin cu chn lc ra nhng thuc tnh cho lp cc i tng xc nh. Theo cch thc chng ta c th xut danh sch nhng thuc tnh cho cc lp SACH, DON_HANG v KHACH_HANG trong h qun l kinh doanh sch nu trn nh sau: i vi lp SACH Tac_gia : Tn tc gi ca cun sch

Ten_sach : Tn gi, tiu ca cun sch Nha_XB : Nh xut bn Nam_XB : Nm xut bn i vi lp DON_HANG So_hieu SH_KH : S hiu n t hng : S hiu hoc tn khch hng

Ngay_DH : Ngy t hng Ngay_GH : Ngy giao hng

668

i vi lp KHACH_HANG SH_KH : S hiu khch hng

Ten_KH : Tn khch hng Dia_chi TK_KH : a ch, ni giao hng : S ti khon ca khch hng trong ngn hng

Danh sch cc thuc tnh ca cc lp s c tip tc xem xt, b sung cho y trong giai on thit k. Cn lu l phi cn nhc a ra c nhng thuc tnh chung nht, vi nhng tn gi c trng cho tng lp i tng. 1.2.4. Xc nh cc hm m t y , chnh xc cc i tng chng ta cn tip tc xc nh cc hm m t hnh vi ca chng. Chng ta c th da vo vn bn m t bi ton xc nh cc hm. Thng thng, trong cc cu m t th ng t c dng ch mt hnh ng, s xut hin, phn loi hay cu thnh ca cc i tng. Bng 1-2. Bng phn loi ng t Cc kiu ng t ng t ch hnh ng ng t ch s xut hin ng t ch s hu ng t ch s so snh ng t ch trng thi ngha Nu cc hnh ng Phn loi Cu thnh Cc php so snh iu kin - bt bin V d c, vit, mua, bn L, nm trong v.v... C, l mt phn ca Nh hn, bng v.v... Cn, phi c mt

Cc ng t ch hnh ng v so snh gip cho chng ta xc nh c cc hm, cn ng t ch s xut hin, so snh gip chng ta xy dng c cu trc phn loi. ng t s hu gip cho vic xc nh nhng cu trc cu thnh ca cc i tng. Cch th hai l da vo s dng d liu xc nh cc hm, cc chc nng c biu din bng cc hnh trn hoc ellipse. V d, m t cho hnh vi ca i tng trong lp KHACH_HANG chng ta phi xy dng cc hm x l nhng thuc tnh xc nh trn nh cc hm xc nh nhng thng tin v khch hng: s hiu, h v tn, a ch, ti khon v.v...

669

1.2.5. Xc nh mi quan h gia cc i tng Bc tip theo l xc nh mi quan h gia cc i tng, ngha l s trao i thng tin gia chng. Nh chng ta thy, trong mt h thng mi thc th phi c quan h t nht vi mt thc th khc. Chng hn, trong h thng qun l kinh doanh ca cng ty pht hnh sch vi s dng d liu xy dng hnh 1-4, khch hng mun mua sch th phi ghi vo n t hng, ngha l i tng KHACH_HANG s phi gi mt thng bo (n t hng) cho i tng DON_HANG. Tng t, DON_HANG li c quan h vi SACH v nhng cun sch s c bn cho khch hng khi nhn c cc n t hng. Quan h gia cc lp i tng c th c nhng kiu khc nhau v c phn thnh ba kiu sau: 1. Quan h mt - mt 2. Quan h mt - nhiu 3. Quan h nhiu - nhiu Quan h mt - mt: Hai lp c quan h 1-1 nu vi mi i tng ca lp ny c lin quan tng ng mt i tng lp kia v ngc li. V d: Hai lp PHIEU_GHI v MAT_HANG c quan h 1-1. Mi phiu ghi trong lp PHIEU_GHI s m t ng mt mt hng c qun l trong lp MAT_HANG. Quan h ny c biu din nh sau:
PHIEU_GHI MAT_HANG

Hnh 1-5. Quan h mt - mt Quan h mt - nhiu: Hai lp A v B c quan h mt - nhiu nu: - Vi mi i tng trong lp A c quan h vi mt hay nhiu i tng trong lp B. - Mi i tng trong lp B c quan h vi mt i tng ca lp A. Quan h mt - nhiu c biu din nh sau: A KHACH_HA NG

B Hnh 1-6. Quan h mt - nhiu

DON_HANG

Lp KHACH_HANG c quan h mt - nhiu vi lp DON_HANG v mt khch hng c th t nhiu n hng khc nhau.

670

Quan h nhiu - nhiu: Hai lp A v B c quan h nhu - nhiu nu: - Mi i tng A c s tng ng vi nhiu i tng trong B. - Ngc li, mi i tng trong B cng c tng ng vi nhiu i tng trong A. Quan h nhiu - nhiu c biu din nh sau: A NHA_CUNG_ CAP

B Hnh 1-7. Quan h nhiu - nhiu

MAT_HANG

Hai lp NHA_CUNG_CAP v MAT_HANG c quan h nhiu - nhiu v mi x nghip c th sn xut v bn ra nhiu mt hng v ngc li, mt mt hng cng c th c sn xut nhiu ni. M hnh d liu v nhng quan h gia cc i tng c s dng khng ch nh mt cng c phn tch, thit k m cn nh mt phng php kim chng cc yu cu ca h thng. Nhng vn v xy dng m hnh d liu, m hnh quan h v cc bc chun ho d liu c th tham kho trong cun Phn tch, thit k v ci t h thng tin qun l, Vin Tin hc. 1.3. V d 1.3.1. Pht biu bi ton Ti khoa Tin hc ca mt trng i hc c khong vi trm cun sch cho cc cn b nhn vin trong khoa mn. Hy xy dng mt h thng qun l trn my tnh nhng cun sch m khoa c, nhng cun no ang trong phng lm vic, nhng cun no ang c ngi mn v ai mn. y l v d n gin, nhng cng kh in hnh trong qu trnh phn tch, thit k hng i tng. Chng ta cng s phn tch kh nng m rng, kh nng bo tr h thng hng i tng theo nhng yu cu mi cn m rng v pht trin h thng nhm p ng nhu cu ca ngi s dng. gii quyt bi ton nu trn, chng ta c th s dng mt trong nhng h qun tr d liu ph dng nh FoxPro, Access v.v... y chng ta mun thng qua v d ny lm r hn nhng cng vic, cc bc cn thc hin trong qu trnh phn tch hng i tng.

671

1.3.2. Phn tch h thng Bi ton nu trn tng i r rng. Yu cu xy dng h thng phn mm qun l cc cun sch. Phn tch hng i tng l vic lp li nhiu ln vic phn tch bi ton xc nh cc i tng v xy dng cc c t bi ton. Nhng phn tch hng i tng cn c yu t tng hp. Vic thc hin tru tng ho nhng yu cu ca ngi s dng v xc nh r c cc i tng chnh cho php tp hp chng to ra cu trc h thng logic h tr cho giai on thit k tip theo. Nhim v chnh ca giai on phn tch l xy dng m hnh khi nim cho th gii thc. Th gii thc ca chng ta y gm nhng cun sch v bn c. Nhng cun sch s c u , trong phng lm vic hoc cho ai mn. hiu r hn v cc thc th v mi quan h ca chng trong th gii thc m bi ton t ra y l sch v bn c, chng ta cn tm hiu k v h thng c lin quan nh h thng th vin. Trn c s , xy dng cc c t yu cu cho bi ton. Phn tch k bi ton, da vo vn bn m t bi ton chng ta thy c hai lp i tng l: SACH v BAN_DOC. Trong cc h thng th vin, mt cun sch c th c xc nh thng cc thuc tnh nh: m s th vin, tn tc gi, tn gi cun sch, nh xut bn, nm xut bn v.v... n gin chng ta c th dng tn tc gi xc nh cun sch, hoc tn gi cng tn tc gi nu nh c hai cun cng tc gi, cn bn c th s c xc nh thng qua h v tn ca tng ngi. V d: Peter Norton l cun sch Cm nang lp trnh do Peter Norton vit, l mt i tng trong lp SACH. Lan Anh l tn mt c gi, l mt i tng trong lp BAN_DOC v.v... H thng phn mm m chng ta xy dng s phi gii quyt cc vn sau: + Lan Anh mn cun Peter Norton. + Hoang Trung mn nhng cun sch no? + Ai mn cun sch Peter Hendenson? + Lan Anh tr cun Peter Norton. + Mt cun sch mi c b sung. y chnh l danh sch cc yu cu ca h thng. Sau khi xc nh c cc yu cu ca bi ton v lp cc i tng, chng ta thc hin bc tip theo l xc nh cc thuc tnh, hm v mi quan h gia cc lp i tng.

672

Sch l i tng c xc nh v c biu din nh sau: SACH Peter Norton ... Trong , SACH l tn gi lp tt c cc cun sch c trong th vin. Peter Norton l tn mt cun sch, mt i tng c th. Tng t i tng bn c s c m t nh sau: BAN_DOC Lan Anh ... Trong , BAN_DOC l lp cc c gi v Lan Anh l mt bn c, mt i tng trong lp . Trong h thng th vin, nhng cun sch v c gi s c m t tng ng l cc i tng SACH v BAN_DOC. Bng nhiu cch khc nhau, chng ta phn tch v xc nh c cc thuc tnh, cc hm cho hai lp SACH, BAN_DOC. class SACH { Attribute //Thuc tnh Tac_gia : Tc gi cun sch,

Ten_sach : Tn gi hoc tiu ca cun sch Xuat_ban : Nh, nm xut bn Noi_giu : Sch cho ai mn hay c ti th vin

Function //Hm Nhap_sach() : Nhp cc thng tin v cun sch vo th vin Cho_muon() : Xc nh l sch cho mn

673

Hoan_tra() : Sch c tr li th vin Display() : Hin cc thng tin v cun sch } class BAN_DOC { Attribute //Thuc tnh Ho_ten Dia_chi : H v tn ngi mn sch, : a ch, in thoi ca bn c

Ten_sach : Tn nhng cun sch mn Function //Hm Nhan_HT() Muon() Tra() : Nhp h tn, a ch ca mt bn c

: Nhp thm nhng cun sch mi mn : Tr sch cho th vin

Display() : Cho bit nhng thng tin v bn c } By gi chng ta cn xc nh mi quan h gia hai lp SACH v BAN_DOC. V d, Lan Anh mn cun Peter Norton c th c m t nh th sau:
BAN_DOC Lan Anh SACH Ian Graham

Hnh 1-8. Lan Anh mn cun sch Peter Norton Mt cun sch c th cho nhiu nht mt ngi mn, ngc li mt ngi c th mn nhiu cun sch. Do vy BAN_DOC v SACH c quan h mt - nhiu.
BAN_DOC SACH

Hnh 1-9. Mi quan h gia c gi v sch

674

Trong m hnh th ca chng ta, mi quan h gia hai lp i tng c th hin chi tit hn nh hnh 1-10.

BAN_DOC Lan Anh

BAN_DOC Thu Ha

BAN_DOC Van Dung

BAN_DOC Quynh Lien

SACH OOD

SACH Peter Norton

SACH C++

SACH OOA

Hnh 1-10. Th hin mi quan h gia hai lp i tng SACH v BAN_DOC S trn m t s trao i thng tin gia cc lp i tng. Lan Anh mn hai cun Peter Norton v C++; Hoang Trung mn cun OOA, cun sch OOD vn cha c ai mn v.v... H thng ca chng ta lun hot ng bi v: + Thng xuyn c ngi mn sch. + Mt cun sch c tr li hoc c mua b sung. Da vo kt qu phn tch trn chng ta d dng xy dng thit k v ci t h thng qun l sch n gin nhng p ng c yu cu t ra l qun l c sch v d dng sa i, b sung khi cn thit.

2. Thit k hng i tng

675

2.1. Gii thiu chung Mc ny s m t phng php thit k phn mm da trn cc i tng. Phng php hng i tng (HT) nhm che du thng tin mc ti a v v vy h tr cho vic thit k nhng h thng vi nhng cp b gia cc thnh phn l cc tiu nhng mc c kt h thng li cao hn cch tip cn chc nng. Chng ta s tp trung nghin cu cc bc cn thc hin trong thit k hng i tng v v d m t cch thit k cc lp, xy dng cu trc h thng trong qu trnh pht trin phn mm. Che giu thng tin l chin thut thit k sao cho c th giu c nhiu nht lng thng tin bn trong cc thnh phn c s ca mt thit k. iu ny c ngha l s trao i gia cc thc th ca thit k l cc tiu v v vy thit k d dng thay i hn. Thit k hng i tng (TKHT) l phng php thit k c thc hin theo nguyn l che giu thng tin. Khc vi cch tip cn truyn thng (hng chc nng) l n xem h thng phn mm (HTPM) l tp hp cc i tng tng tc vi nhau. Mi i tng lm vic vi trng thi (d liu) ring ca mnh. i tng, khi nim c s c cp nhiu cc phn trc l mt thc th c tp cc thuc tnh v tp cc hm tc ng trn cc thuc tnh . Tp gi tr cc thuc tnh xc nh trng thi ca mt i tng. Mt i tng khng c quyn truy nhp trc tip hoc lm thay i trng thi ca i tng khc. iu ny dn n l cc i tng ch c th trao i vi nhau bng cc thng bo. Thng bo s kch hot cc hm ca i tng nhn thng tin tng ng. Hot ng ca c ch truyn thng bo gia cc i tng l d b (khng ng b) v vy chng trnh c thit k theo hng i tng c th c thc hin song song hoc tun t tu theo phng php lp trnh v nhng cng c m chng ta thc hin ci t c cho php thc hin song song hay khng. Thit k hng i tng l phng php thit k h thng phn mm khng ph thuc vo ngn ng lp trnh. Nhiu c tnh nh Che du, k tha lm cho vic thc hin thit k tr nn d dng hn, n gin hn. Nhng thit k ny cng c th c ci t bng ngn ng cha c c tnh nh Turbo C, hoc Pascal, nhng tt nht l nn s dng nhng ngn ng hng i tng ci t nhng thit k c thc hin theo cch tip cn hng i. Nhiu ngn ng lp trnh hng i tng nh Eiffel, Object Pascal, Smalltalk, C++ c nhng c tnh hng i tng h tr cho vic m t v thc hin ci t trc tip nhng thit k hng i tng hiu qu hn. Tm li thit k hng i tng c nhng u im chnh sau: - Loi b c nhng min d liu dng chung thng qua c ch trao i thng tin gia cc i tng bng cc thng bo.

676

- Cc i tng c thit k l cc thc th c lp (theo ngha khng s dng d liu chung), mi thay i v trng thi, b sung, sa i cc hot ng chc nng ca mt i tng ch sy ra bn trong ca i tng , khng nh hng n cc i tng khc. Mi s thay i trong thit k, trong h thng phn mm ch sy ra cc b i vi mt s i tng lin quan. iu ny m bo h thng c tnh d m rng v d thch nghi, p ng c nhiu tnh cht quan trng ca sn phm phn mm. Cc i tng c th c t chc phn tn hoc song song hay tun t theo yu cu ca bi ton ng dng v kh nng k thut thc t ca d n pht trin tin hc ng dng. 2.2. Cc bc thc hin trong thit k hng i tng Nhin v ca thit k hng i tng l xc nh cc i tng trong khng gian bi ton, chuyn chng sang khng gian li gii, xy dng m hnh kin trc v m hnh tnh ton cho h thng phn mm. xy dng kin trc tng th cho h thng chng ta s dng cch tip cn di - ln (bottom - up). iu quan trng l phi to ra c cu trc phn cp, xc nh c cc lp i tng tru tng v gim thiu c s trao i gia cc i tng. y chng ta cng cp n kh nng s dng li trong thit k, phn loi cc i tng thnh nhng h thng con trong cu trc phn cp. Cch tip cn TKHT gm cc bc sau: 1. Xc nh cc lp v cc i tng, cc thnh phn c bn ca li gii. 2. Xy dng cc c t cho cc i tng, cc lp v mi quan h gia chng. 3. Xy dng cu trc phn cp cho cc lp. 4. Thit k cc lp. 5. Thit k cc hm thnh phn ca lp. 6. Thit k chng trnh chnh. Xc nh cc i tng trong khng gian li gii Khi phn tch vn bn m t bi ton v cc yu cu ca ngi s dng, chng ta xc nh c cc thc th, nhng i tng trong khng gian bi ton. Bc tip theo l phn tch k cc i tng, xc nh cc thuc tnh v cc hm c t cho tng i tng. ng thi xc nh thm nhng i tng mi xut hin trong khng gian li gii. Khi xy dng cc c t cho i tng, chng ta phi xc nh c cc thuc tnh, d liu m t trng thi ca i tng v cc hm m t hnh vi ca i tng. Thuc tnh l min d liu ring ca lp i tng, l d liu

677

cc b trong mt lp. Thc hin nguyn l che giu thng tin, trong mt lp d liu c th t chc thnh hai vng: vng s hu ring, ch dnh ring cho nhng i tng trong cng lp v vng dng chung, cho php nhng i tng trong cc lp c quan h vi nhau c quyn s dng. Cc hm (nhiu sch cn gi l th tc, dch v, phng thc) c th dng chung cho mt s i tng. Qu trnh xc nh cc hm m t i tng (cn c gi l hm thnh phn ca lp) c thc hin nh sau: 1. Nu mt hm ch cn thit cho mt i tng th hm ny ch hot ng trong i tng yu cu. 2. Nu c hai hoc nhiu hn i tng cn yu cu v mt hm th cn phi xc nh vng hot ng ring ca hm trong cc i tng . 3. Nu c mt hm cn nhiu hn mt kiu i tng (lin quan n hai hoc nhiu hn cc lp i tng) th hm khng phi l mt hm c kt, do vy cn phi phn tch dch v ra thnh cc hm mn hn. Bng cch chng ta xy dng c danh sch cc hm m t hnh vi ca cc i tng. ng thi chng ta cng loi b c nhng d tha, nhng thnh phn ph khng cn thit trong cu trc v trong cc i tng. S ph thuc gia cc lp Mc tiu ca thit k l xy dng cu trc phn cp cho h thng. Do vy, nhim v tip theo ca chng ta l xc nh mi quan h gia cc lp i tng cu thnh h thng. Lp l tp hp cc i tng c chung mt s thuc tnh, mt s hm va phn bit vi nhng lp khc. i tng l th hin ca lp. Trong thit k, khi nim lp i tng v i tng l hu nh khng phn bit, cc lp biu din cho cc i tng trong khng gian li gii. xy dng c m hnh kin trc cho h thng phn mm, chng ta cn phn bit ba loi quan h quan trng gia cc lp: - Quan h k tha - Quan h thnh phn - Quan h v s dng Quan h k tha: Trong thc t, c nhiu lp c nhng thuc tnh, hm ging nhau khng nhng ch trong cng mt h thng m c th nhiu h thng khc nhau. Mt trong nhng mc tiu quan trng ca phng php hng i tng l xy dng cc lp i tng c kh nng s dng cho nhiu ng dng khc nhau trn c s khai thc trit nguyn l k tha. Quan h k tha gia cc lp l s ging nhau trong cc lp i tng v kh nng s dng mt

678

s c tnh k tha t nhng lp trc. Mt lp c th s dng li mt s thuc tnh, hm ca mt hay nhiu lp c nh ngha trc. Lp c nh ngha trc c nhng tnh cht chung cho nhng lp khc c th k tha c gi l lp c s v lp k tha lp c s c gi l lp dn xut (hoc l lp con). Lp dn xut k tha mt s hoc tt c cc c tnh ca mt hay nhiu lp c s. Mt lp c th k tha cc tnh cht ca nhiu lp nhiu mc khc nhau v c b sung thm mt s c tnh ring. C nm loi k tha: k tha n, k tha bi, k tha a mc, k tha phn cp, k tha phc hp. Trong quan h k tha, ch nhng thuc tnh, hm c khai bo s dng chung mi c quyn k tha. V d: Trong h thng qun l cc loi chim, lp c s u tin chng ta c th xy dng l lp CAC_LOAI_CHIM c thuc tnh, chc nng chung nht nh c lng, chng. Trong s cc loi chim th chng ta c th phn lm hai loi: loi chin khng bay c v loi chim bit bay. Hai lp CHIM_BIET_BAY v CHIM_KHONG_BIET_BAY k tha t lp CAC_LOAI_CHIM ngha l cc c tnh: c lng v chng khng cn phi m t trong cc lp na m ch cn b sung nhng c tnh m t thm v kh nng bit bay hoc khng bit bay ca cc loi chim. Tip tc phn tch lp CHIM_KHONG_BIET_BAY, gi s gm hai lp CANH_CUT v KIWI cn lp CHIM_BIET_BAY gm cc lp CHIM_CO_DO, CHIM_NHAN v.v... Trn c s xc nh quan h k tha cc loi chim chng ta c cu trc nh trong hnh 2-1.
CAC_LOAI_CHIM - C lng - trng ......

CAC_LOAI_CHIM - Lng cnh pht trin ......

CHIM_KHONG_BIET_BAY - Lng cnh khng pht trin ......

CHIM_CO_D O

CHIM_NHAN

CHIM_CANH_CUT

KIWI

.....

.....

.....

.....

Hnh 2-1. Quan h k tha

679

Quan h thnh phn: i tng ca lp ny cng l phn t ca lp khc. V d: Trong h thng qun l cn b khoa hc ca mt c quan th mt cn b n tr s l th hin ca LOP_CAN_BO_TRE v cng l thnh phn ca lp CAN_BO_NU. Quan h v s dng: Kh nng s dng ca mt lp c, x l cc i tng ca nhng lp khc. V d: Mt lp A c th s dng cc lp B v C theo cc cch nh sau: - A c cc phn t ca B - A gi ti cc phn t ca C - A to ra B bng cc s dng ton t new Mi quan h ca cc lp ng vai tr quan trng trong thit k chng trnh sau ny. T chc phn cp cc lp (theo nghuyn l tng qut ho) trn chng ta nghin cu mi quan h m ch yu l quan h k tha ca cc lp i tng. y chng ta da vo nhng mi quan h xy dng cu trc phn cp trn nguyn tc s dng li ti a cc thuc tnh v hm ca nhng lp c thit k trc. T chc phn cp cc lp l tp trung phn tch tng nhm lp c lin quan xc nh c nhng thuc tnh, hm chung nht ca c nhm v sau kt hp chng li to ra lp mi. Lp mi c gi l lp tru tng v cng l lp c s cho cc lp trong cng nhm k tha. Lp tru tng c th c hoc khng c th hin l i tng trong khng gian bi ton. N c to ra thun tu bng cch gp nhng thuc tnh chung li nhiu mc tru tng khc nhau cho n khi cm thy chc chn khng cn mt lp no mi c to ra na. V d: Sau khi phn tch k bi ton qun l nhn s ca mt x nghip chng ta c c cc lp i tng: CAN_BO_QUAN_LY, NHAN_VIEN_PHUC_VU,CONG_NHAN,CAN_BO_TRUNG_CAP, KY_SU, TREN_DAI_HOC. mc th nht chng ta thy hai lp : CAN_BO_QUAN_LY, NHAN_VIEN_PHUC_VU, c th gp nhng c tnh chung v nhng thuc tnh, chc nng lin quan n cng vic phc v, qun l x nghip to ra mt lp mi l CAN_BO_GIAN_TIEP. Tng t hai lp CONG_NHAN, CAN_BO_TRUNG_CAP c nhng thuc tnh, chc nng chung l tham gia trc tip sn xut ra sn phm ca x nghip v vy c th gp chung li to ra lp mi TRUC_TIEP_SAN_XUAT. Nhng cn b thuc lp TREN_DAI_HOC v KY_SU c chc

680

nng chung l nghin cu pht trin sn xut nn c th gp li thnh lp CAN_BO_NGHIEN_CUU. Cc mi quan h c th hin nh sau:
CAN_BO_QUAN_LY CAN_BO_GIAN_TIEP NHAN_VIEN_PHUC_VU

CONG_NHAN TRUC_TIEP_SAN_SUAT CAN_BO_TRUNG_CAP

KY_SU CAN_BO_NGHIEN_CUU TREN_DAI_HOC

Cc lp mi c xy dng: CAN_BO_GIAN_TIEP, TRUC_TIEP_SAN_XUAT, CAN_BO_NGHIEN_CUU li c nhng thuc tnh chung l cn b, nhn vin trong cng mt x nghip nn c th gp nhng c tnh chung li to ra mt lp tru tng mi l NHAN_VIEN. Nhng g m t trong cc lp c s th khng cn nu li trong cc lp dn xut. Sau khi phn tch k mi quan h gia cc i tng thit k lp, chng ta s c cu trc phn cp cc lp ca h thng qun l nhn s nh sau (theo nguyn l tng qut ho).
NHAN_VIEN

CAN_BO_ GIAN_TIEP

TRUC_TIEP_ SAN_XUAT

CAN_BO_

NGHIEN _CUU
CAN_BO_ QUAN_LY NHAN_VIEN _PHUC_VU CAN_BO_ QUAN_LY NHAN_VIEN _PHUC_VU

681

Hnh 2-2. Cu trc phn cp cc lp (dng cy) Cu trc m chng ta thu c hnh 2-2 c dng cu trc cy. Tuy nhin trong thc t c nhiu h thng trong cc lp tru tng mc cui khng c nhng c tnh chung gp to thnh mt lp mi. Khi chng ta c mt dng cu trc phn cp dng rng (c nhiu hn mt nt gc) nh hnh 2-3.

Hnh 2-3. Cu trc phn cp dng rng cy Thit k cc lp Trong bc phn tch, chng ta xc nh c cc lp vi cc thuc tnh v tp ti thiu cc hm chnh thc hin trn cc thuc tnh m t i tng ca lp . xy dng c thit k tng th cho h thng, chng ta cn xem xt cc lp mc chi tit, b sung thm nhng thuc tnh, hm cn thit cho cc lp i tng. Ngoi nhng hm th hin c tnh c bn ca i tng trong mt lp, chng ta cn b sung cc hm phc v sau: 1. Nhng hm qun l lp tr li cho cc cu hi sau: + Mt i tng c to lp nh th no? + Mt i tng c hu b nh th no? 2. Nhng hm thc hin ci t lp + Nhng php ton no c thc hin trn d liu kiu lp?

682

3. Nhng hm truy nhp vo lp + Lm th no chng ta nhn c thng tin v cc bin ni b ca mt lp. 4. Hm x l li + Lm th no x l c cc li xut hin khi thao tc vi cc i tng. thit k cc lp chng ta cn phi bit r cch thc trao i thng tin gia cc i tng, cc mi quan h v k tha, quan h thnh phn v quan h v s dng li trong cc lp. Chng ta phi tr li c nhng cu hi: 1. Cc loi iu khin truy nhp cn thit cho cc lp c s? 2. Nhng hm no l nhng hm o? Hm o l nhng hm c cng tn trong lp c s v lp dn xut, s c phn bit trong qu trnh thc hin bi tng i tng c th. 3. Nhng th vin cc lp no c s dng thit k lp. Kt qu thit k lp s nh hng rt lp n cht lng phn mm. V vy khi thit k lp chng ta cn ch nhng vn sau: 1. Cc lp ch trao i vi nhau thng qua cc hm. 2. Mt i tng ca mt lp khng c gi thng bo trc tip cho i tng ca lp khc. 3. Hm c khai bo l chung (public) ch khi n c s dng chung cho nhiu i tng ca mt lp. 4. Mi hm lm nhim v truy nhp hoc lm thay i mt s d liu ca lp m n biu din. 5. S ph thuc ca mt lp vo cc lp khc cng t cng tt. 6. Tng tc gia cc lp phi lun lun tng minh. 7. Lp dn xut l mt trng hp ca lp c s, c b sung thm mt s c tnh ring m t chi tit hn v lp con ca lp c s. 8. Lp trn cng ca cu trc phn cp biu din m hnh khi nim tru tng ca h thng. Thng thng khi thit k cc lp, hm v chng trnh chnh, chng ta nn s dng ngn ng lp trnh s c chn ci t (tt nht l chn ngn ng lp trnh hng i tng nh C++) m t. Thit k hm thnh phn

683

n giai on ny chng ta xy dng c: 1. Cc i tng v lp 2. Cc thnh phn d liu 3. Giao din gia cc i tng 4. S ph thuc ca cc lp 5. Cu trc phn cp cc lp By gi l lc chng ta cn xem xt n vic thit k cc hm thnh phn, nhng php ton thc hin trn cc d liu ca i tng. Cc hm ny cng ging nh cc hm trong ngn ng lp trnh C v vy chng ta c th s dng k thut phn r chc nng trn-xung (top-down) thit k chng. V d: Mt i tng c hai hm thnh phn F1, F2 tc ng ln vng d liu DL, trong F2 li c th phn tch thnh cc khi chc nng nh hn nh trong hnh 2-4.

DL DL DL DL DL DL DL DL DL DL DL DL

Hnh 2.4. Thit k top-down cc hm thnh phn Trong mi khi chng ta li c th s dng k thut thit k c cu trc to ra cu trc phn cp v chc nng cho nhng hm phc tp. Nhiu ngn ng lp trnh ph dng, nh C, C++ c xy dng h tr cho phng php m t thit k v lp trnh c cu trc. Chng ta c th ci t cc n th c cu thnh t nhng cu trc tun t, tuyn chn v vng lp. C th thit k cc hm thnh phn theo phng php c cu trc. Kt qu ca thit k c cu trc cho mt hm l mt cu trc c mt li vo v mt li ra c t hp t mt trong ba cu trc c bn: cu trc tun t, tuyn chn v vng lp.

684

Thit k chng trnh chnh Bc cui cng trong khu thit k h thng l xy dng chng trnh chnh, ging nh chng trnh main() trong ngn ng C++. H thng c bt u v kt thc ti chng trnh chnh. Do vy nhim v ca chng trnh chnh l: 1. Nhp d liu t ngi s dng. 2. To ra cc i tng theo nh ngha cc lp. 3. T chc thc hin trao i thng tin gia cc i tng. 4. Lu tr kt qu x l hoc hin ln mn hnh, my in, thit b ngoi vi theo yu cu ngi s dng. Mi hot ng, x l trong qu trnh thc hin chng trnh u l kt qu ca s trao i, tng tc gia cc i tng. V vy nhim v ch yu ca thit k chng trnh l xc nh th t logic ca qu trnh trao i thng tin gia cc i tng trong h thng. Chng trnh chnh lin quan trc tip n ngi s dng. V vy trong thit k chng ta cng cn cp n thit k giao din thn thin vi ngi s dng. Thit k giao din ngi my C nhiu kiu thit k giao din c to ra nhm phc v cho ngi s dng khai thc h thng phn mm sao cho c hiu qu nht. Mi kiu u c nhng c tnh v kh nng khc nhau. iu quan trng l thit k giao din phi ph hp vi lnh vc ng dng v nhng cng vic ca ngi s dng, nhng ngi tham gia trc tip i thoi vi my tnh. Nhn chung, cc h giao din vi ngi s dng u cn phi c nhng tnh cht sau: + D s dng: Giao din thn thin, d s dng ngay c vi nhng ngi s dng khng c kinh nghim. + D hc: Cc lnh, thao tc h thng c xy dng theo nhng qui nh chung, d tip thu v d nh. + Tc thao tc nhanh, hp l: Cc bc thao tc, n nt trn bn phm, con chut nhanh gn, tin li cho ngi s dng. Thi gian thc hin v tr li trn my tnh nhanh v chnh xc. + m bo an ton: Kim sot c cc tnh hung, nhng thao tc c tnh hay v ca ngi s dng u c x l tt.

685

D pht trin: H thng c tnh m, c kh nng thay i, b sung theo yu cu ca ngi s dng. Di y chng ta s cp n mt s kiu thit k giao din: dng hi p, thc n v biu tng. Bn c no quan tm su v thit k giao din vi ngi s dng c th tham kho cun "Phn tch, thit k v ci t h thng tin qun l, Vin Tin hc". Thit k giao din i thoi: Vic thit k i thoi bt u bng vic chia cc chc nng v giao din ca h thng thnh nhng n th. Mi n th s m nhn ng mt chc nng ca h thng. V d, n th nhp d liu ch lm nhim v kim sot d liu nhp vo sao cho ph hp vi qui nh ca ngi thit. Bng i thoi thng bao gm mt lot nhng cu hi, thng bo nhc v nhng cng vic ca h thng cn thc hin. Thit k hi p phi bao qut ht cc trng hp, c y ch thch, hng dn tr gip ngi s dng. Cch thit k ny ph hp vi nhng ngi s dng t kinh nghim. Thit k bng thc n (Menu): Bng thc n cho bit tt c cc cng vic la chn. Thng thng bng thc n nn t chc thnh cu trc phn cp. Mi mc trong bng thc n chnh li c t chc thnh bng thc n con gm mt s mc la chn v c th hin dng mn hnh ca s (Window). Thit k biu tng: Biu tng c s dng gii thiu cc chc nng ca h thng trn mn hnh. Mi chc nng c biu din bng mt biu tng (hnh v tng ng) sao cho d nh v d hnh dung nht. trn chng ta nu tt c cc bc ca qu trnh thit k hng i tng. Phn cn li ca chng ny chng ta xy dng thit k cho hai h: h qun l kt qu hc tp ca hc sinh v h iu khin h thng iu ho nhit . 2.3. V d 2.3.1. Bi ton th nht: Thit k h thng qun l Bi ton t ra: Hy xy dng chng trnh chy trn my tnh theo di kt qu hc tp ca sinh vin trong mt lp, v tm kim theo kt qu im trung bnh cc mn thi. Gio vin mun qun l sinh vin thng qua: H v tn, cc im thi: hc k 1, hc k 2, thi cui nm v im trung bnh qua cc k thi ca cc mn hc. Phn tch k bi ton trn chng ta xc nh c hai i tng l: SINH_VIEN v MON_HOC. Tng ng vi cc i tng ny trong thit k l cc lp SINH_VIEN v MON_HOC. V i tng l th hin ca lp, nn hai lp SINH_VIEN v MON_HOC xc nh
605 606

686

hai loi i tng c bn trong h thng theo di kt qu hc tp m gio vin cn phi pht trin. Bc tip theo trong thit k l m t chi tit cc lp i tng v mi quan h gia chng. Theo yu cu ca gio vin (ngi s dng) th mi i tng trong lp SINH_VIEN c m t bi cc thuc tnh: Ho_ten, Diem_thi_ky1, Diem_thi_ky2, Diem_thi_CN v Diem_TB; cn MON_HOC cho bit danh sch cc i tng SINH_VIEN theo mn hc . Mi thnh phn d liu c mt kiu xc nh v gi tr cc d liu thnh phn m t trng thi ca i tng. Cui cng chng ta c danh sch cc thuc tnh m t lp SINH_VIEN v MON_HOC nh sau: class SINH_VIEN {// Danh sch cc thuc tnh m t SINH_VIEN a. Ho_ten : string (kiu xu k t) : float : float : float

b. Diem_thi_ky1 c. Diem_thi_ky2 d. Diem_thi_CN e. Diem_TB : float } class MON_HOC

{// Danh sch cc thuc tnh m t MON_HOC a. Mon_hoc : string // tn mn hc :SINH_VIEN // Bng danh sch cc // sinh vin theo hc c. Si_so } Sau khi xc nh c cc i tng, lp v danh sch cc thuc tnh m t i tng, bc tip theo l xc nh cc hm thnh phn ca cc lp. Hm thnh phn m t hnh vi ca i tng bao gm: + Truy nhp vo thnh phn d liu ca i tng : integer // S hc sinh trong lp

b. Danh_sach_SV

687

+ Cho php cp nht, thay i d liu thnh phn + Kim tra d liu theo nhiu cch kh nhau + Hin cc thng tin d liu ln mn hnh, thit b ngoi vi Mc tiu ca thit k lp l to ra cc lp cho nhiu ng dng khc nhau nhng cng lin quan n mt loi d liu. Ngi thit k cc lp mun xy dng cc class p ng c mi nhu cu ca ngi lp trnh (khch hng). Quan h gia ngi pht trin vi ngi lp trnh, cng ging nh quan h ch hng - khch hng, dn n trng hp l ch hng mong sao c nhiu ngi s dng nht, ngha l lp s c xy dng vi mt s lng ln cc hm thnh phn. Nhng khch hng li ch s dng nhng hm no lin quan n ng dng ca h m thi. Do vy chng ta phi c gng xy dng c nhng hm thnh phn c bn, c trng nht cho lp ang xt, sau s dng quan h k tha to ra nhng lp mi thch hp cho nhiu ng dng khc nhau. Trong bi ton ca chng ta, cc hm thnh phn c th l: 1. Cc hm thnh phn ca lp SINH_VIEN a. Hm khi to i tng sinh vin: b. Hm hu b i tng sinh vin: c. Hm c tn sinh vin: d. Hm gn tn ca mt sinh vin: e. Hm c d liu: f. Hm tnh trung bnh: g. Hm hin kt qu: 2. Cc hm ca lp MON_HOC a. Hm khi to mn hc: b. Hm hu b i tng mn hc: c. Hm c tn mn hc: d. Hm c d liu: e. Hm tnh trung bnh: MON_HOC() ~MON_HOC() DOC_TEN() DOC_DL() T_BINH() SINH_VIEN() ~SINH_VIEN() DOC_TEN() GAN_TEN() DOC_DL() T_BINH() DISPLAY()

688

f. Hm b sung sinh vin vo lp: g. Hm sp xp sinh vin theo tn: h. Hm tm kim mt sinh vin:

THEM_SV() SAP_XEP() TIM()

Hm lm nhim v khi to cc i tng ca mt lp thng c cng tn ca lp i tng v c gi l cu t, cn hm hu b mt i tng cng cng tn nhng c du "~" ng trc c gi l hu t. Hai hm ny s c gi thc hin mt cch t ng khi cn thit. Hm cu t c gi khi cn nh ngha, to lp mt i tng, cn hm hu t c gi khi chng trnh thot ra khi phm vi m i tng c nh ngha. Mt lp c th c nhiu hm cu t v chng c phn bit bi danh sch v kiu ca cc tham bin. Nhng ch c duy nht mt hm hu t cho mt lp v l hm khng c tham s. 2.3.2. Bi ton th hai: Thit k h thng iu ho nhit Pht biu bi ton: Mt to nh c N phng, mi phng c my iu ho, my cm nhit v my iu nhit. Hy xy dng h thng phn mm iu khin cc my iu ho nhit theo yu cu ngi s dng. Theo cch tip cn truyn thng th chng ta ngh ngay n vic dng cu trc mng mt chiu lu tr nhit m ngi s dng yu cu, nhit v trng thi ca my iu ho hin ti trong cc phng. Khi h thng iu ho nhit cc phng s c thit k da theo thut ton sau: 1. Ln lt xem xt cc phng I=1 . . N. 2. Nu nhit trong phng khc vi nhit yu cu th my iu ho chuyn sang trng thi On (ng) nu n ang trng thi Off (tt). 3. Ngc li nu nhit trong phng lm vic t c nh nhit ngi s dng yu cu th my iu ho chuyn sang trng thi Off nu n ang trng thi On. Cch th hai chng ta thc hin thit k theo cch tip cn hng i tng. Nhim v trc tin ca chng ta l xc nh cc i tng thnh phn c s ca h thng iu ho nhit . Phn tch bi ton chng ta thy y c hai lp i tng: 1. i tng PHONG 2. i tng DIEU_HOA

689

Trong mi phng: nhit hin thi c xc nh bi my iu nhit. My iu ho c hai trng thi On (ng) v Off (tt). Trng thi ca my iu ho s thay i tu thuc vo thng bo ca PHONG: nhit trong phng c cn phi thay i hay khng. Sau khi xc nh c cc lp, cc thuc tnh m t trng thi ca cc i tng v mi quan h gia hai lp i tng chng ta cn xc nh cc hm thnh phn ca chng. i vi lp PHONG chng ta c: 1. Hm khi to i tng: 2. Hm xo b i tng: PHONG() ~PHONG() NHIET_KE() T_YEU_CAU()

3. Hm xc nh nhit qua my cm nhit: 4. Hm t nhit yu cu vo my iu nhit: i vi lp DIEU_HOA: 1. Hm khi to i tng: 2. Hm xo b i tng: 3. Hm xc nh trng thi On, Off:

DIEU_HOA() ~DIEU_HOA() DONG_MO() PHONG_MAY()

4. Hm xc nh s phng t my iu ho:

H iu khin h thng iu ho nhit cc phng khng nht thit phi c s tng ng 1-1 gia s phng v my iu ho nh iu kin ban u bi ton t ra. Trong trng hp cn thay i, v d nh i vi hi trng ln th cn phi t nhiu my mi cng sut iu ho nhit hoc nhiu phng dng chung mt my. Khi c s thay i nh trn th thit k theo cch tip cn th nht phi thay i t nhiu, chng trnh gn nh phi vit li ton b v chng ta gi thit rng mi phng c mt my iu ho. Nhng cch tip cn th hai (thit k hng i tng) th ch cn sa i nhng i tng lin quan. sa i h thng theo yu cu th hm DONG_MO() ca i tng DIEU_HOA phi thit k li sao cho n c th bt tt nhiu hn mt my v hm T_YEU_CAU() ca cc i tng PHONG dng chung mt DIEU_HOA cn c thit k li sao cho xc nh c nhit bnh qun ca cc phng , cn cu trc h thng, m hnh tnh ton khng c g thay i. 2.3.3. Bi ton th 3: Thit k h thng kh tng thu vn Ni dung bi ton: H thng gm nhiu trm o s liu v thu nhn thng tin d liu v kh tng thu vn d bo thi tit. H thng thu nhn d liu theo nh k, x l d liu cc b

690

v truyn nhng d liu, thng tin cn thit v cho my tnh trung tm x l tip. D liu m h thng tp hp bao gm: nhit kh quyn, lng t; tc , hng gi; p sut v lu lng ma. Mt trong nhng u im ca cch tip cn hng i tng l c th tin hnh thit k ngay khi cha c tt c cc c t yu cu v sau c th d dng thay i khi cn b sung hay sa i cc yu cu nu. Bi ton m t trn cha cho bit v tn s thu thp d liu cng nh cch x l d liu, nhng chng ta c th tin hnh ngay xy dng thit k cho h thng. Trc tin chng ta cn xc nh nhng thnh phn c bn ca h thng, ngha l cc thc th s tng ng vi khi nim i tng ca h thng phn mm m chng ta cn xy dng. Ni chung, vic xc nh cc i tng c thc hin theo cch lm mn dn trong qu trnh thit k. H thng m chng ta xy dng y l h kh tng thu vn s c c i tng "cng" ln i tng "mm". i tng "cng" khng phi l hon ton my mc, thit b phn cng m l nhng thc th lin quan n my mc, thit b. Nhng i tng ny c nhng vo h thng phn mm iu khin cc phn cng tng ng. Ngc li, i tng "mm" l nhng i tng ch tng tc vi cc i tng khc trong h thng, ngha l gip cc i tng "cng" trao i thng tin vi nhau. Phn tch k bi ton chng ta c th xc nh c cc i tng "cng" nh sau: + Trm kh tng thu vn + My o nhit kh quyn + My o nhit lng t + My o sc gi + My o hng gi + My o p sut khi quyn + My o lu lng ma + ng h (xc nh thi gian thu nhn d liu v truyn thng bo) + Modem (truyn v nhn thng bo t my tnh trung tm) Nhim v ca tng i tng c m t nh trong Bng 2.1. Bng 3.1. Xc nh cng vic ca cc i tng "cng"

691

i tng

Nhim v Operate

M t cng vic c th Khi ng bng cch bm nt khi ng my. TRAM_KT thu nhn thng tin v lm bo co d bo thi tit. Kim tra li cc kt qu thu nhn

TRAM_KT Self_test Shut_down May_DKH May_DLD May_DSG May_DHG May_DLA May_DLM Evaluate Evaluate Evaluate Evaluate Evaluate Evaluate Reset

Bm nt dng hot ng ca my

o nhit khng kh o nhit lng t o sc gi o hng gi, tnh theo o gc o p sut ca khng kh Xc nh lng nc ma k t lc Reset li t li my o, xo cc thng s c

DONG_HO

Time_now() Reset

Xc nh thi gian theo yu cu t li thi gian theo yu cu Truyn thng bo cho my tnh trung tm Nhn thng bo t my tnh trng tm

Modem

Transmit Receive

d theo di, chng ta nn s dng s khi m t thit k. trn chng ta xc nh l trong h thng s c hai loi i tng: cng v mm. Nhng i tng s c m t nh sau:
Object Attr. ...... Functions ...... Object Attr. ...... Functions ......

a) i tng cng

b) i tng mm

692

Cc i tng "cng" c quan h vi nhau trong h thng nh trong hnh 2-6. i tng TRAM_KT thu nhn cc thng tin t cc i tng con l May_DKH, May_DLD, May_DSG, May_DHG, May_DKA, May_DLM, DONG_HO v Modem x l s b ri chuyn thng bo v cho my tnh trung tm. Mt iu chng ta cn lu y l nhng i tng "cng" khng th trao i thng tin trc tip vi nhau m phi thng qua cc i tng "mm". Bc tip theo l xc nh cc i tng "mm". lm c iu chng ta cn tm hiu thm mt s thng tin v tn sut thu nhn d liu v cch x l d liu ca h thng. Trong qu trnh tip xc vi nhng chuyn gia, nhng ngi s dng h thng kh tng thu vn xc nh bi ton, chng ta c thm nhng m t nh sau:

Tram_KT ............ Operate Self_test Shut_down

May_KH ......... Evaluate

May_KH ......... Evaluate

May_KH ......... Evaluate

May_KH ......... Evaluate

May_KH .........

May_KH .........

May_KH .........

May_KH .........

Evaluate

Evaluate

Evaluate

Evaluate

Hnh 2-6. Cu trc phn cp ca phn cng "Tt c cc tham s v thi tit, ngoi tr lng ma s c thu thp theo chu k tng pht mt. Sau mi gi (sau 60 ln nhn d liu) th nhit , tc gi, p sut s c x l tnh

693

gi tr trung bnh, gi tr cc i, cc tiu v trong 1 gi , lng ma cng c ghi nhn. Cc hng gi c o theo o gc ( < 150) cng s c ghi nhn. Tt c nhng thng s s c tnh ton s b v c truyn v my tnh trung tm x l v d bo v thi tit" Phn tch m t bi ton chng ta thy c nhng i tng "mm" sau: + SUC_ GIO Xc nh tc ca gi + H_GIO + ND_KH + ND_LD + L_MUA + A_SUAT Xc nh hng gi o nhit khng kh o nhit lng t o lu lng nc ma o p sut kh quyn

Nhng i tng ny cung cp thng tin cho mt i tng lm nhim v tng hp d liu l: + TH_DL To ra cc bn ghi thng tin t cc i tng con, kin tra, truyn v nhn thng bo.

Chc nng v nhim v ca cc i tng trn c m t chi tit trong Bng 2-2. Bng 2-2. M t cng vic ca cc i tng mm
i tng Thao tc Create TH_DL Check Transmit Collect SUC_GIO Max Min Mean Collect H_GIO Variances M t cng vic To lp DL d bo thi tit Kim tra tnh hp l ca DL Gi thng bo v trung tm Ghi nhn tc ca gi theo tng pht Xc nh tc cc i ca gi Xc nh tc cc tiu ca gi Xc nh tc trung bnh ca gi Ghi nhn cc hng gi Danh sch hng gi ln hn

694

Mean Collect Max DN_KH Min Mean DN_LD Collect Max Min Mean

Xc nh o trung bnh Ghi nhn nhit khng kh theo chu k Xc nh gi tr cc i ca nhit Xc nh gi tr cc tiu ca nhit Xc nh gi tr trung bnh ca nhit Ghi nhn nhit ca lng t Xc nh gi tr cc i Xc nh gi tr cc tiu Xc nh o trung bnh

L_MUA

Collect Max Min Mean

Ghi nhn lng nc ma Xc nh gi tr cc i Xc nh gi tr cc tiu Xc nh o trung bnh o o p sut khng kh Xc nh gi tr cc i Xc nh gi tr cc tiu Xc nh o trung bnh

A_SUAT

Collect Max Min Mean

Nhim v tip theo ca thit k hng i tng l thit k cc lp v xc nh mi quan h gia chng. y chng ta s dng C++ c t thit k cc lp i tng. Trc tin chng ta xt lp TH_DL. Lp ny lm nhim v tng hp d liu, to ra cc record d liu nhn t cc i tng con v nhit , sc, hng gi, lng nc ma, p sut kh quyn, kim tra tnh hp l ca d liu, truyn v nhn thng bo t trung tm. Lu rng, TH_DL khng cn bit g v cch thu nhp d liu ca cc i tng con. Trong C++ chng ta m t TH_DL nh sau: class TH_DL {

695

private: ... // Khai bo cc bin lu tr nhit , sc gi ... // hng gi, p sut, lng ma... public: void Create(void); // To lp cc record d liu void Check(void); // Kim tra d liu void Transmit(void); // Nhn v truyn d liu } Tng t, chng ta c th xy dng cc lp con SUC_GIO, H_GIO, ND_KH, ND_LD, L_MUA, A_SUAT. V d, lp ND_KH c th s c m t nh sau: class ND_KH { private: float t[60]; // Bng s liu o nhit ca khng kh // ghi c trong mt chu k 1 gi public: float *Collect(); // Thu nhn d liu t i tng "cng" float Max(); // Tnh gi tr cc i ca nhit o c float Min(); // Tnh gi tr cc tiu float Mean(); // Tnh gi tr trung bnh } Cc lp SUC_GIO, H_GIO, ND_KH, ND_LD, L_MUA, A_SUAT cung cp d liu cho lp TH_DL v quan h gia chng c m t nh trong hnh 2-7.

696

TH_DL ................ Creat Check Transmit

SUC_GIO ............... Collect Max Min Mean

H_GIO ................ Collect Variances Mean

N_KH ................ Collect Max Min Mean

ND_L ................ Collect Max Min Mean

L_MUA ............... Collect Max Min Mean

A_SUAT ................ Collect Max Min Mean

Hnh 2-7. M t quan h ca cc lp i tng "mm" trn chng ta khng nh: cc i tng "cng" mun trao i thng bo vi nhau phi s dng cc giao din l cc i tng "mm". Da vo cc chc nng, nhim v ca tng lp i tng v nhim v chung ca h thng chng ta c th a ra thit k tng th cho h thng kh tng thu vn nh sau:

697

Tram_KT ............... Operate

Modem .............. Transmit Receive

Hnh 2-8. Cu trc h thng kh tng thu vn

Self_test Shut_down

TH_DL ........... Creat Check Transmit Mean

DONG_HO ........... Time_now Reset

SUC_GIO ........... Collect Max Min Mean

H_GIO ............ Collect Variances Mean

N_KH ............ Collect Max Min Mean

TH_DL ........... Collect Max Min Mean

A_SUAT .......... Collect Max Min Mean

May_SG ........... Evaluate

May_HG ........... Evaluate

May_KH ........... Evaluate

May_L ........... Evaluate

May_KA .......... Evaluate

May_LM ........... Evaluate Reset

698

3. Lp Trnh Hng i Tng


3.1. Gii thiu Vi lp trnh c cu trc, nhng h thng ln, phc hp, th phc tp ca chng trnh s tng ln, s ph thuc ca n vo cc kiu d liu m n x l cng tng theo. Cc kiu d liu c x l trong nhiu th tc bn trong chng trnh c cu trc, v khi c s thay i trong kiu d liu th cng phi thc hin thay i mi ni m d liu c s dng. Mt nhc im na ca lp trnh c cu trc l khi c nhiu ngi tham gia xy dng chng trnh, mi ngi c giao vit mt s hm ring bit nhng li c th s dng chung d liu. Khi c nhu cu cn thay i d liu s nh hng rt ln n cng vic ca nhiu ngi. Lp trnh hng i tng da trn nn tng l cc i tng. i tng c xy dng trn c s gn cu trc d liu vi cc php ton s th hin c ng cch m chng ta suy ngh, bao qut v th gii thc. Chng hn, t c bnh xe, di chuyn c v hng ca n thay i c bng cch thay i tay li. Tng t, cy l loi thc vt c thn g v l. Cy khng phi l t v nhng g thc hin c vi t s khng lm c vi cy. Lp trnh hng i tng cho php chng ta kt hp nhng tri thc bao qut v cc qu trnh vi nhng khi nim tru tng c s dng trong my tnh. Chng trnh hng i tng xc nh chnh xc cc c trng v hnh vi ca cc kiu d liu, trong c th to ra nhng i tng mi c xy dng t nhng khun kh c sn hay t hp to ra nhng c trng mi. Trong chng ny chng ta s gii thiu nhng khi nim c bn v cc bc cn thc hin trong lp trnh hng i tng. 3.2. Lp trnh hng th tc (chc nng) Nhng ngn ng lp trnh bc cao truyn thng nh COBOL, FOTRAN, PASCAL, C v.v..., c gi chung l ngn ng lp trnh hng th tc. Theo cch tip cn hng th tc th mt h thng phn mm c xem nh l dy cc cng vic cn thc hin nh c d liu, tnh ton, x l, lp bo co v in n kt qu v.v... Mi cng vic s c thc hin bi mt s hm nht nh. Nh vy trng tm ca cch tip cn ny l cc hm chc nng. Cu trc ca chng trnh c xy dng theo cch tip cn hng th tc c dng nh hnh 3-1.

699

Chng trnh chnh MAIN()

Hm_1

Hm_2

Hm_3

Hm_4

Hm_5

Hm_6

Hm_7

Hm_8

Hm_9

Hnh 3-1. Cu trc ca chng trnh hng th tc Lp trnh hng th tc (LTHTT) s dng k thut phn r hm chc nng theo cch tip cn top-down to ra cu trc phn cp. Chng trnh c xy dng theo cch tip cn hng th tc thc cht l danh sch cc cu lnh m theo my tnh cn thc hin. Danh sch cc lnh c t chc thnh tng nhm theo n v cu trc c php ca ngn ng c t hay ngn ng lp trnh v c gi l hm (hay th tc). m t cc hot ng ca cc hm, cc dng iu khin v d liu t hot ng ny sang hot ng khc ngi ta thng dng s khi. Khi tp trung vo trng tm pht trin cc hm th chng ta li t ch n d liu, nhng ci m cc hm s dng thc hin cng vic ca mnh. Ci g s xy ra i vi d liu v gn d liu vi cc hm nh th no? cng nhiu vn khc cn phi gii quyt khi chng ta mun xy dng cc phng php thch hp pht trin h thng trong th gii thc. Trong chng trnh c nhiu hm, thng th c nhiu thnh phn d liu quan trng s c khai bo tng th (global) cho nhiu hm c th truy nhp, c v lm thay i gi tr ca bin tng th. Mi hm c th c vng d liu ring cn gi l d liu cc b (local). Mi quan h gia d liu v hm trong chng trnh hng th tc c m t trong hnh 3-2.

D liu chung (Global)

D liu chung (Global)

Hm_1 D liu ring (Local)

Hm_2 D liu ring (Local)

Hm_3 D liu ring (Local)

700

Hnh 3-2. Quan h d liu v hm trong LTHTT Nhiu hm c th truy nhp, s dng d liu chung, lm thay i gi tr ca chng v v vy rt kh kim sot. Nht l i vi cc chng trnh ln, phc tp th vn cng tr nn kh khn hn. Khi chng ta mun thay i, b sung cu trc d liu dng chung cho mt s hm th chng ta phi thay i hu nh tt c cc hm lin quan n d liu . Ngoi nhng tr ngi m chng ta nu trn th m hnh c xy dng theo cch tip cn hng th tc khng m t c y , trung thc h thng trong thc t. Bi v cch t trng tm vo hm l hng ti hot ng s khng thc s tng ng vi cc thc th trong h thng ca th gii thc. Tm li nhng c tnh chnh ca lp trnh hng th tc l: + Tp trung vo cng vic cn thc hin (thut ton). + Chng trnh ln c chia thnh cc hm nh hn. + Phn ln cc hm s dng d liu chung. + D liu trong h thng c chuyn ng t hm ny sang hm khc. + Hm bin i d liu t dng ny sang dng khc. + S dng cch tip cn top-down trong thit k chng trnh.

3.3. Lp trnh hng i tng Nh cc phn trc chng ta nu, gii quyt c nhng vn tn ti trong cng ngh phn mm th chng ta cn phi s dng nhng phng php, cng c thch hp pht trin phn mm. Trong cc mc 1 v 2 chng ta cp n phng php phn tch, thit k hng i tng. Trong mc ny chng ta tip tc nghin cu v phng php lp trnh hng i tng. Lp trnh hng i tng t trng tm vo i tng, yu t quan trng trong qu trnh pht trin chng trnh v n khng cho php d liu chuyn ng t do trong h thng. D liu c gn cht vi tng hm thnh cc vng ring m cc hm tc ng ln v n c bo

701

v cm cc hm bn ngoi khng c truy nhp mt cch tu tin. LTHT cho php chng ta phn tch bi ton thnh tp cc thc th c gi l cc i tng v sau xy dng cc d liu cng vi cc hm xung quanh cc i tng . T chc d liu v hm trong cc chng trnh hng i tng c m t nh trong hnh 3-3.
i tng A D liu Hm i tng B D liu Hm

i tng C D liu Hm

Hnh 3-3. T chc d liu v hm trong chng trnh HT D liu ca mt i tng ch c th c truy nhp bi chnh cc hm xc nh trong i tng . Tuy nhin cc hm ca i tng ny c th truy nhp ti cc hm ca i tng khc, ngha l cc i tng trao i vi nhau thng qua vic trao i thng bo. Lp trnh hng i tng c nhng c tnh ch yu sau: 1. Tp chung vo d liu thay cho cc hm. 2. Chng trnh c chia thnh cc i tng. 3. Cc cu trc d liu c thit k sao cho c t c cc i tng. 4. Cc hm xc nh trn cc vng d liu ca i tng c gn vi nhau trn cu trc d liu . 5. D liu c bao bc, che giu v khng cho php cc hm ngoi lai truy nhp t do. 6. Cc i tng trao i vi nhau thng qua cc hm. 7. D liu v cc hm mi c th d dng b sung vo i tng no khi cn thit. 8. Chng trnh c thit k theo cch tip cn bottom-up (di-ln). Lp trnh hng i tng l khi nim mi v c hiu rt khc nhau i vi nhiu ngi. y chng ta c th hiu lp trnh hng i tng l cch tip cn phn chia chng trnh thnh cc n th (module) bng cch to ra cc vng b nh cho c d liu ln hm v chng

702

s c s dng nh cc mu to ra bn sao tng n th khi cn thit. i tng y c xem nh l vng phn chia b nh trong my tnh lu tru d liu v tp cc hm tc ng trn d liu gn vi chng. Bi v cc vng phn hoch b nh l c lp vi nhau nn cc i tng c th s dng bi nhiu chng trnh khc nhau m khng nh hng ln nhau. Khi nim "hng i tng" nhiu ngi hiu rt khc nhau. V vy, hiu r bn cht v c th i n thng nht quan im, chng ta cn phi nghin cu k nhng khi nim c bn trong LTHT. Trong phn ny chng ta cp n nhng khi nim sau: 1. i tng 2. Lp 3. Tru tng ho d liu 4. K tha 5. Tng ng bi 6. Lin kt ng 7. Truyn thng bo i tng Trong cc mc trc chng ta nu cch xc nh i tng trong qu trnh phn tch v thit k hng i tng. y chng ta tm hiu chi tit hn hiu r vai t ca i tng trong cch tip cn hng i tng ni chung v LTHT ni ring. i tng l thc th c xc nh trong thi gian h thng hng i tng hot ng. Nh vy i tng c th biu din l con ngi, vt, hay mt bng d liu hoc bt k mt hng thc no cn x l trong chng trnh. i tng cng c th l cc d liu c nh ngha bi ngi s dng (ngi lp trnh) nh vector, danh sch, cc record v.v... Nhim v ca LTHT l phn tch bi ton thnh cc i tng v xc nh c bn cht ca s trao i thng tin gia chng. i tng trong chng trnh cn phi c chn sao cho n th hin c mt cch gn nht so vi nhng thc th trong th gii thc. Khi chng trnh thc hin, cc i tng s trao i vi nhau bng cch gi hay nhn thng bo. V d BAN_DOC v CHO_MUON l hai i tng trong h thng th vin, i tng BAN_DOC c th gi mt thng bo (bng phiu yu cu chng hn) cho i tng CHO_MUON yu cu mn cun "Lp trnh hng i tng vi c++". Mi i tng c d liu v cc hm x l d liu . Cc i tng trao i vi nhau m khng cn bit chi tit

703

v d liu v cc thut ton x l ca i tng khc. trao i c vi nhau, mi i tng ch cn bit kiu thng bo m n nhn v kiu thng bo m n s gi cho cc i tng khc. Cc lp i tng Nh trn chng ta xc nh, i tng trong chng trnh gm c d liu v cc hm x l trn d liu . Mt tp d liu v cc hm ca mt i tng c th c xem nh mt kiu d liu c nh ngha bi ngi s dng. Kiu d liu y c gi l lp (class). Trong lp trnh, cc i tng l cc bin c kiu class. Khi mt lp c nh ngha, th n c th to ra s lng cc i tng tu ca lp . Nh vy, TOA, LE, BUOI, CAM l cc loi qu trong lp HOA_QUA. Lp l kiu c ngi s dng nh ngha v n cng c cc tnh cht nh cc kiu chun integer, float trong cc ngn ng lp trnh. Tng t nh kiu d liu c nh ngha trong chng trnh, lnh khai bo HOA_QUA TAO; s to ra i tng TAO trong lp HOA_QUA. Tru tng ho d liu v bao gi thng tin Vic ng gi d liu v cc hm vo mt n v cu trc (c gi l lp) c xem nh mt nguyn tc bao gi (che giu) thng tin. D liu c t chc sao cho th gii bn ngoi (cc i tng lp khc) khng truy nhp c vo m ch cho php cc hm trong cng lp hoc trong nhng lp c quan h k tha vi nhau c quyn truy nhp. Chnh cc hm thnh phn ca lp s ng vai tr nh l giao din gia d liu ca i tng v phn cn li ca chng trnh. Nguyn tc bao gi d liu ngn cm s truy nhp trc tip trong lp trnh c gi l s che giu thng tin. Tru tng ho l cch biu din nhng c tnh v b qua nhng chi tit vn vt hoc nhng gii thch. xy dng cc lp, chng ta phi s dng khi nim tru tng ho. V d chng ta c th nh ngha mt lp l danh sch cc thuc tnh tru tng nh l kch thc, hnh dng, mu v cc hm xc nh trn cc thuc tnh ny m t cc i tng trong khng gian hnh hc. Trong lp trnh, lp s dng nh kiu d liu tru tng. K tha K tha l qu trnh m cc i tng ca lp ny c quyn s dng mt s tnh cht ca cc i tng ca lp khc. Nguyn l k tha h tr cho vic to ra cu trc phn cp cc lp. V d, mt trng i hc o to sinh vin theo ba khi: X hi, Cng ngh, v Khoa hc c bn. Mi khi li c cc khoa. Khi cng ngh c cc khoa: C kh, in, My dn dng; cn khi

704

Khoa hc c bn c cc khoa: Ton, L, Ho, Sinh. H thng s t chc thnh cu trc phn cp cc lp k nhau nh sau:

SINH_VIEN

XA_HOI

CONG_NGHE

CO_BAN

CO_KHI

DIEN

MAY_D D

TOAN

LY

HOA

SINH

Hnh 3.4. Cu trc phn cp cc lp trong qun h k tha Lp SINH_VIEN m t nhng thuc tnh chung nht ca sinh vin tt c cc khi trong trng v d nh: H v tn, qu, tui. Nhng c tnh c k tha trong cc lp XA_HOI, CONG_NGHE, CO_BAN. Cc lp dn xut c b sung thm nhng thuc tnh, cc hm tng ng m t cho sinh vin. Cc lp XA_HOI, CONG_NGHE, CO_BAN c b sung thm nhng thuc tnh mi phn bit gia cc khi vi nhau. Trong khi CO_BAN li chia thnh nhiu khoa nh: TOAN, LY, HOA, SINH; khi CONG_NGHE chia thnh cc khoa: CO_KHI, DIEN v MAY_DD. Nhng lp sau c nhng thuc tnh m t cho sinh vin ca tng khoa. Trong LTHT, khi nim k tha ko theo tng s dng li. Ngha l t mt lp c xy dng chng ta c th b sung thm mt s tnh cht to ra mt lp mi k tha lp c m khng lm thay i nhng ci c. Khi nim k tha c hiu nh c ch sao chp o khng n iu. Trong thc t, mi vic xy ra ta nh nhng lp c s u c sao vo trong lp con (lp dn xut) mc d iu ny khng c ci t tng minh (nn gi l sao chp o) v vic sao chp ch thc hin i vi nhng thng tin cha c xc nh trong cc lp c s (sao chp khng n iu). Do vy, c th din t c ch k tha nh sau:

705

1. Lp A k tha lp B s c (khng tng minh) tt c cc thuc tnh, hm c xc nh trong B. 2. B sung thm mt s thuc tnh, hm m t c ng cc hnh vi ca nhng i tng m lp A qun l. Tng ng bi Mt khi nim quan trng na trong LTHT l khi nim tng ng bi. Tng ng bi l kh nng ca mt khi nim (nh cc php ton) c th c xut hin nhiu dng khc nhau. V d, php + c th biu din cho php "cng" cc s nguyn (int), s thc (float), s phc (complex) hoc xu k t (string) v.v... Hnh vi ca php ton tng ng bi ph thuc vo kiu d liu m n s dng x l. Hnh 3-5 cho chng ta thy hm c tn l VE c th s dng v cc hnh khc nhau ph thuc vo tham s (c phn bit bi s lng, kiu ca tham s) khi gi thc hin.
HINH_HOC VE()

HINH_TRON VE(TRON)

DA_GIAC VE(DA_GIAC)

DUONG_THANG VE(DUONG_TH)

Hnh 3-5. Tng ng bi ca hm VE() Hm VE() l hm tng ng bi v n c xc nh tu theo ng cnh khi s dng. Tng ng bi ng vai tr quan trng trong vic to ra cc i tng c cu trc bn trong khc nhau nhng c kh nng cng dng chung mt giao din bn ngoi (nh tn gi). iu ny c ngha l mt lp tng qut cc php ton c nh gnha theo cng mt cch ging nhau. Tng ng bi l m rng khi nim s dng li trong nguyn l k tha. Lin kt ng Lin kt ng l dng lin kt cc hm, th tc khi chng trnh thc hin cc li gi ti cc hm, th tc . Nh vy trong lin kt ng, ni dung ca on chng trnh ng vi th tc, hm s khng c bit cho n khi thc hin li gi ti th tc, hm . Lin kt ng lin quan cht ch ti tng ng bi v k tha. Chng ta hy lu hm VE() trong Hnh 4-5. Theo nguyn l k tha th mi i tng u c th s dng hm ny v hnh theo yu cu. Tuy nhin, thut ton thc hin hm VE() l duy nht i vi tng i tng HINH_TRON, DA_GIAC, DUONG_THANG v v vy hm VE() s c nh ngha li khi cc i tng

706

tng ng c xc nh. Khi thc hin, v d nh khi v mt hnh trn, on chng trnh ng vi hm VE() hnh trn c gi ra thc hin. Truyn thng bo Chng trnh hng i tng (c thit k v lp trnh theo hng i tng) bao gm mt tp cc i tng v mi quan h gia cc i tng vi nhau. V vy, lp trnh trong ngn ng hng i tng bao gm cc bc sau: 1. To ra cc lp xc nh cc i tng v hnh vi ca chng. 2. To ra cc i tng theo nh ngha ca cc lp. 3. Xc nh s trao i gia cc i tng. Cc i tng gi v nhn thng tin vi nhau ging nh con ngi trao i vi nhau. Chnh nguyn l trao i thng tin bng cch truyn thng bo cho php chng ta d dng xy dng c h thng m phng gn hn nhng h thng trong th gii thc. Truyn thng bo cho mt i tng tc l bo cho n phi thc hin mt vic g . Cch ng x ca i tng s c m t trong lp thng qua cc hm (hay cn c gi l lp dch v). Trong chng trnh, thng bo gi n cho mt i tng chnh l yu cu thc hin mt cng vic c th, ngha l s dng nhng hm tng ng x l d liu c khai bo trong i tng . V vy, trong thng bo phi ch ra c hm cn thc hin trong i tng nhn thng bo. Hn th na,thng bo truyn i phi xc nh tn i tng, tn hm (thng bo) v thng tin truyn i. V d, lp CONG_NHAN c th hin l i tng c th c i din bi Ho_Ten nhn c thng bo cn tnh lng thng qua hm TINH_LUONG c xc nh trong lp CONG_NHAN. Thng bo s c x l nh sau: CONG_NHAN.TINH_LUONG (Ho_Ten)

i tng

Thng bo

Thng tin

Mi i tng ch tn ti trong thi gian nht nh. i tng c to ra khi n c khai bo v s b hu b khi chng trnh ra khi min xc nh ca i tng . S trao i thng tin ch c th thc hin trong thi gian i tng tn ti. Cc u im ca lp trnh hng i tng Nh trn chng ta phn tch, lp trnh hng i tng em li mt s li th cho c ngi thit k ln ngi lp trnh. Cch tip cn hng i tng gii quyt c nhiu vn tn ti

707

trong qu trnh pht trin phn mm v to ra c nhng sn phm phn mm c cht lng cao. Nhng phng php ny m ra mt trin vng to ln cho nhng ngi lp trnh. Hy vng s c nhiu sn phm phn mm tt hn, p ng c nhng tnh cht v sn phm cht lng cao trong cng ngh phn mm v nht l bo tr h thng t tn km hn. Nhng u im chnh ca LTHT l: 1. Thng qua nguyn l k tha, chng ta c th loi b c nhng on chng trnh lp li, d tha trong qu trnh m t cc lpp v m rng kh nng s dng cc lp c xy dng. 2. Chng trnh c xy dng t nhng n th (i tng) trao i vi nhau nn vic thit k v lp trnh s c thc hin theo quy trnh nht nh ch khng phi da vo kinh nghim v k thut nh trc. iu ny m bo rt ngn c thi gian xy dng h thng v tng nng sut lao ng. 3. Nguyn l giu thng tin gip ngi lp trnh to ra c nhng chng trnh an ton khng b thay bi nhng on chng trnh khc. 4. C th xy dng c nh x cc i tng ca bi ton vo i tng ca chng trnh. 5. Cch tip cn thit k t trng tm vo i tng, gip chng ta xy dng c m hnh chi tit v gn vi dng ci t hn. 6. Nhng h thng hng i tng d m rng, nng cp thnh nhng h ln hn. 7. K thut truyn thng bo trong vic trao i thng tin gia cc i tng gip cho vic m t giao din vi cc h thng bn ngoi tr nn n gin hn. 8. C th qun l c phc tp ca nhng sn phm phn mm. Khng phi trong h thng hng i tng no cng c tt c cc tnh cht nu trn. Kh nng c cc tnh cht cn ph thuc vo lnh vc ng dng ca d n tin hc v vo phng php thc hin ca ngi pht trin phn mm. 3.4. Cc ngn ng hng i tng Lp trnh hng i tng khng l c quyn ca mt ngn ng no c bit. Cng ging nh lp trnh c cu trc, nhng khi nim trong lp trnh hng i tng c th ci t trong nhng ngn ng lp trnh nh C hoc Pascal. Tuy nhin, i vi nhng chng trnh ln, phc hp th vn lp trnh s tr nn phc tp, nu s dng nhng ngn ng khng phi l ngn ng hng i tng th phi thc hin nhiu tho hip. Nhng ngn ng c thit k c bit, h tr cho vic m t, ci t cc khi nim ca phng php hng i tng c gi chung l ngn ng hng i tng.

708

Da vo kh nng p ng cc khi nim v hng i tng, chng ta c th chia ra lm hai loi: 1. Ngn ng lp trnh da trn i tng (object - based) 2. Ngn ng lp trnh hng i tng (object - oriented) Lp trnh da trn i tng l kiu lp trnh h tr chnh cho vic bao gi, che giu thng tin v nh danh cc i tng. Lp trnh da trn i tng c nhng c tnh sau: + Bao gi d liu + C ch che giu v truy nhp d liu + T ng to lp v xo b cc i tng + Php ton ti bi Ngn ng h tr cho kiu lp trnh trn c gi l ngn ng lp trnh da trn i tng. Ngn ng trong lp ny khng h tr cho vic thc hin k tha v lin kt ng. Ada l ngn ng lp trnh da trn i tng. Lp trnh hng i tng l kiu lp trnh da trn i tng v b sung thm nhiu cu trc ci t nhng quan h v k tha v lin kt ng. V vy c tnh ca LTHT c th vit mt cch ngn gn nh sau: Cc c tnh da trn i tng + k tha + lin kt ng. Ngn ng h tr cho nhng c tnh trn c gi l ngn ng LTHT, v d nh C++, Smalltalk, Object Pascal hay Eiffel v.v... Vic chn mt ngn ng ci t phn mm ph thuc nhiu vo cc c tnh v yu cu ca bi ton ng dng, vo kh nng s dng li ca nhng chng trnh c v vo t chc ca nhm tham gia xy dng phn mm. Tng t nh ngn ng lp trnh C, C++ ang c s dng rng ri, v rt thnh cng trong vic s dng ci t cc h thng phn mm phc tp. 3.5. Nhng ng dng ca LTHT LTHT l mt trong nhng thut ng c nhc n nhiu nht hin nay trong cng ngh phn mm v n c ng dng pht trin phn mm trong nhiu lnh vc khc nhau. Trong s , c ng dng quan trng v ni ting nht hin nay l lnh vc thit k giao din vi ngi s dng, v d nh Windows. Hng trm h thng vi giao din Windows c pht trin da trn k thut LTHT. Nhng h thng tin doanh nghip trong thc t rt phc tp, cha nhiu

709

i tng vi cc thuc tnh v hm phc tp. gii quyt nhng h thng phc hp th th LTHT l t ra kh hiu qu. Tm li, nhng lnh vc ng dng ca k thut LTHT bao gm: + Nhng h thng lm vic theo thi gian thc. + Trong lnh vc m hnh ho hoc m phng cc qu trnh. + Cc c s d liu hng i tng. + Nhng h siu vn bn, multimedia. + Lnh vc tr tu nhn to v cc h chuyn gia. + Lp trnh song song v mng n-ron. + Nhng h t ng ho vn phng v tr gip quyt nh. + Nhng h CAM/CAM. Vi nhiu c tnh phong ph ca LTHT ni ring, ca phng php pht trin hng i tng ni chung, chng ta hy vng nn cng nghip phn mm s ci tin khng nhng v cht lng m cn gia tng nhanh v s lng trong tng lai. K ngh hng i tng s lm thay i cch suy ngh v cch thc hin qu trnh phn tch, thit k v ci t cc h thng, gp phn gii quyt nhng vn tn ti trong cng ngh phn mm.

710

You might also like