Download as pdf or txt
Download as pdf or txt
You are on page 1of 396

Lp Trnh Hng i Tng Vi C++

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.

GS: Phm Vn t

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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

GS: Phm Vn t

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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 Bi 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++ cngg 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. Bi 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, nn 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() GS: Phm Vn t 3 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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)); 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 trn thnh mt chng trnh C++ cn: + t tn chng chng vi ui CPP + Thm 2 cu lnh #include khai bo nguyn mu cho cc hm sqrt, getch: #include <math.h> #include <conio.h> Bi 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. 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);

GS: Phm Vn t

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 trn 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; 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; } } 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); GS: Phm Vn t 5 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. Cngg 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 ngha 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, nn 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. + 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 GS: Phm Vn t 6 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ - 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> #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]); } } 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) GS: Phm Vn t 7 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } Bi 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 trn nhiu dng hoc trn mt dng. Ngoi ra trong C++ cng cho php vit ghi ch trn 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) { printf("\nX[%d]= ",i); GS: Phm Vn t 8 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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. GS: Phm Vn t 9 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + Hng nguyn: const int maxsize = 1000; int a[maxsize] ; + Cu trc hng: typedef struct { int x, y ; // To ca im 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); } 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 trn 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: GS: Phm Vn t 10 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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]; imax=i ; jmax = j; } GS: Phm Vn t 11 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } Bi 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 trn). 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. 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 trn 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]; GS: Phm Vn t 12 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ float t,l,h,td; } ts[50],tg; int n,i,j; clrscr(); cout << " So thi sinh: " ; cin >> n ; 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; } 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. GS: Phm Vn t 13 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + 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 trn 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) { 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) for (j=1;j<=n;++j) if (smax<a[i][j]) GS: Phm Vn t 14 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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(); } Bi 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 cngg c nh ngha nh C theo mu: 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 GS: Phm Vn t 15 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Trong C++ mt kiu hp (union) cngg c nh ngha nh C theo mu: union Tn_kiu_hp { // 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 nguyn 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 ; }; 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 GS: Phm Vn t 16 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 6.4. Kiu lit k (enum) + Cngg 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 ; 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

Bi 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) 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 ) GS: Phm Vn t 17 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 GS: Phm Vn t 18

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Ch : C th dng lnh gn gn tn hm x l li cho con tr _new_handler nh trong on chng trnh trn, hoc dng hm: set_new_handler(Tn hm) ; (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; }; 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); } GS: Phm Vn t 19 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; } 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) { cout << "\nLoi bo nho khi cap phat bo nho cho q[" << k << "]"; getch(); exit(0); } void main() GS: Phm Vn t 20 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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(); } Bi 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 Trong C, nhn kt qu ca hm cn dng i con tr, lm cho vic xy dng cngg 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 cngg 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

GS: Phm Vn t

21

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ton hc. Trong C++ cho php dng cc php ton chun 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 trn. Nh vy mt php ton mang nhiu ngha, v d php + c th hiu l cng 2 s nguyn, 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.

GS: Phm Vn t

22

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


chng 2

Hm trong C++
Chng ny trnh by nhng 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; 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: GS: Phm Vn t 23 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ int u, v, &r = u; r = 10 ; // u=10 cout << u ; // in ra s 10 r++ ; // u = 11 ++ u ; // r = 12 cout << r ; // in ra s 12 v=r; // v=12 &r; // 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' 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() GS: Phm Vn t 24 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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(); } 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 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. GS: Phm Vn t 25 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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) GS: Phm Vn t 26 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { for (int i=1; i <= n-1 ;++i) for (int j=i+1 ; j<=n ;++j) if (a[i] > a[j]) 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> #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 ; } GS: Phm Vn t 27 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; } } 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; cout << " Diem chuan: " ; cin >> dc; cout << "\n\nDanh sach trung tuyen\n" ; for (i=1;i<=n;++i) if (ts[i].td >= dc) GS: Phm Vn t 28 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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) GS: Phm Vn t 29 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { if (x[i] > x[vtmax]) vtmax = i; if (x[i] < x[vtmin]) vtmin = i; } } 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(); } 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 by mt 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) GS: Phm Vn t 30 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { f()=50; // z = 50 cout <<"\nz= " << z; getch(); }

V d 2 trnh by mt 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. #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(); } V d 3 trnh by mt 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 GS: Phm Vn t 31 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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 ; 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 " ; xit(1); } return ts[i]; } void main() { int n, i ; cout << "\n So thi sinh : " ; cin >> n; cap_phat_bo_nho_nhapsl(n); while (1) { cout << "\nCan xem thi sinh thu may: " ; GS: Phm Vn t 32 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) ; } 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 GS: Phm Vn t 33 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) + 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 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) ; GS: Phm Vn t 34 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) 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"); // In dng ch DEF trn 10 dng getch(); } V d di y trnh by hm 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 GS: Phm Vn t 35 tenshi3003@gmail.com // Thiu 2 tham s cui // Thiu 3 tham s cui

Lp Trnh Hng i Tng Vi C++ } void main() { 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 by hm 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 ) { 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); GS: Phm Vn t 36 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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() { int s ; s = f(5,6); GS: Phm Vn t 37 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 58 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); GS: Phm Vn t 38 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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) { 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: " ; 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(); GS: Phm Vn t 39 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) 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); GS: Phm Vn t 40 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ void f(int a); 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 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 GS: Phm Vn t 41 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; // Ly a ch ca hm th hai int (*f3)(int *, int ); f3 = tinh_max ; // Ly a ch ca hm th ba double (*f4)(double *, int ); f4 = tinh_max ; // Ly a ch ca hm th t 6.6. Cc v d 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) { for (int i=1;i<=n;++i) { cout << "Phan tu " << i << " = " ; cin >> x[i] ; } } GS: Phm Vn t 42 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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]; 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(); GS: Phm Vn t 43 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } V d 2: 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) { 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) GS: Phm Vn t 44 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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) 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(); } 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 GS: Phm Vn t 45 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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) { GS: Phm Vn t 46 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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; GS: Phm Vn t 47 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) ; 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+ (nh ngha chng php +) operator(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 }; 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: GS: Phm Vn t 48 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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: GS: Phm Vn t 49 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) 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); 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; GS: Phm Vn t 50 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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) { 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) { 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; GS: Phm Vn t 51 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: operator- c mt i dng o du mt a thc operator+ c 2 i dng cng 2 a thc operator- c 2 i dng tr 2 a thc operator* c 2 i dng nhn 2 a thc operator^ c 2 i dng tnh gi a thc ti x operator<< c 2 i dng in a thc operator>> 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 GS: Phm Vn t 52 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) 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 ; GS: Phm Vn t 53 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } DT operator-(DT d1, DT d2) { return (d1 + (-d2)); } 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; 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 ; GS: Phm Vn t 54 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; // Cp ma trn }; struct VT { 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); // Nhp ma trn istream& operator>> (istream& is, VT &v); // 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: (hng i) = (hng i) - x[i,k]*(hng k) , vi mi i khc k

GS: Phm Vn t

55

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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)) u 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); 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; GS: Phm Vn t 56 tenshi3003@gmail.com
-1

Lp Trnh Hng i Tng Vi C++ } 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; } 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] ; } 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 GS: Phm Vn t 57 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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 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; } else { MT x; int n, i, j,k; GS: Phm Vn t 58 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 { 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) GS: Phm Vn t 59 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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; 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] ; GS: Phm Vn t 60 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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(); }

GS: Phm Vn t

61

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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 by cch 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. Bi 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 { A x ; // Khng cho php, v x c kiu lp A 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. GS: Phm Vn t 62 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: int x ; // honh (ct) int y ; // tung (hng) 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 ; cout << \nNhp m mu ca im: cin >> m ; } void DIEM::hien() { int mau_ht ; GS: Phm Vn t 63 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. Bi 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: 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 // Thuc tnh x ca i tng d1 d2.x // Thuc tnh x ca i tng d2 d3.y // 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

GS: Phm Vn t

64

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 ; 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() GS: Phm Vn t 65 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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); d1.hien(); d2.hien(); d3.hien(); getch(); d1.an(); d2.an(); d3.an(); getch(); closegraph(); } Bi 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 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. GS: Phm Vn t 66 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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); GS: Phm Vn t 67 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ; 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(); } Bi 4. i ca phng thc, con tr this 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: GS: Phm Vn t 68 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() : 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); GS: Phm Vn t 69 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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) + pow(d1.y - d2.y,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() GS: Phm Vn t 70 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ""); } void DIEM::ve_doan_thang(DIEM d2, int mau) { 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(); 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: GS: Phm Vn t 71 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) ; 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 d2 v d3 cnh 3 i qua 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) { DIEM d1; GS: Phm Vn t 72 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ d1.x = x; d1.y = y; d1.ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(d1,mau); } Bi 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. + 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 GS: Phm Vn t 73 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ HINH_CN *hinh_cv_max() ; // Tr v con tr ti HCN c // chu vi max #include <conio.h> #include <iostream.h> class HINH_CN { 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 { 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 = " ; GS: Phm Vn t 74 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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 + 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)

GS: Phm Vn t

75

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: - 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: " ; GS: Phm Vn t 76 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) ); } }; 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 - " ; d1.nhapsl(); cout << "\nDinh 2 - " ; d2.nhapsl(); cout << "\nDinh 3 - " ; d3.nhapsl(); } void TAM_GIAC::in() { cout << "\nDinh 1: " ; d1.in(); GS: Phm Vn t 77 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; 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]); tmax = tmax.maxdt(t); } GS: Phm Vn t 78 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 by trong 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() GS: Phm Vn t 79 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { cout << " x = " << x << " y = " << y; } 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(); 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(); 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(); } GS: Phm Vn t 80 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; 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); } cout << "\n\nTam giac co dien tich lon nhat: " ; tmax.in(); GS: Phm Vn t 81 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; return t; } Nhn xt: Khng cho php dng t kho friend khi xy dng hm (bn ngoi lp) Bi 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 ; GS: Phm Vn t 82 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } void in() { cout << " x = " << x << " y = " << y; } }; 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; } 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; GS: Phm Vn t 83 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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)); } void main() GS: Phm Vn t 84 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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: " ; 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: GS: Phm Vn t 85 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ double x,y; // Toa do cua diem public: 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]); 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(); GS: Phm Vn t 86 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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; 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(...) ; ... }; // Xy dng cc hm f1, f2, f3 void f1(...) { ... } GS: Phm Vn t 87 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(...) { ... } 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 GS: Phm Vn t 88 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { private: double a; // Phn thc double b; // Phn o 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 ; return u; } }; Cch dng SP u, u1, u2; u = cong(u1, u2); Phng n 3: Dng hm t do class SP { private: GS: Phm Vn t 89 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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 B; // Khai bo trc lp A class B; // Khai bo trc lp B class 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 friend void f(...) ; }; // Xy dng hm f GS: Phm Vn t 90 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 { 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(); }; GS: Phm Vn t 91 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ void VT::nhapsl() { cout << "\n Cap vec to = "; cin >> n ; for (int i=1; i<=n ; ++i) { 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) { 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"; GS: Phm Vn t 92 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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(); }

Bi 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: GS: Phm Vn t 93 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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: ... }; 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. Bi 8. Cc phng thc ton t 8.1. Cch t tn

GS: Phm Vn t

94

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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: class SP { private: double a; // Phn thc double b; // Phn o GS: Phm Vn t 95 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 operator+ dng cng 2 a thc operatordng tr 2 a thc operator* dng nhn 2 a thc operator^ dng tnh gi tr a thc operator[] dng cho bit bc v h s ca a thc + Cc hm bn: operator<< operator>> dng in cc h s a thc dng nhp cc h s a thc

+ Hm (t do) 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) GS: Phm Vn t 96 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ - 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 #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]; } }; // 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) GS: Phm Vn t 97 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; 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 ; 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]; GS: Phm Vn t 98 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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; GS: Phm Vn t 99 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); }

GS: Phm Vn t

100

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


Chng 4

Hm to, hm hu v cc vn lin quan


Chng ny trnh by mt 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 Bi 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. + 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 GS: Phm Vn t 101 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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: //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. V d: DIEM_DH d; // Gi ti hm to khng i. // Kt qu d.x=0, d.y=0, d.m=1 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

GS: Phm Vn t

102

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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, ... 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; GS: Phm Vn t 103 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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; GS: Phm Vn t 104 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() getch(); } Bi 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 ; } }; 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) GS: Phm Vn t 105 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ (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 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. Theo phng n 2, chng trnh c th sa nh sau: #include <conio.h> GS: Phm Vn t 106 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #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 d2= DIEM_DH(300,300); // Gi ti hm to, dng 1 tham s // mc nh d1.in(); d2.in(); getch(); } Bi 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]; } GS: Phm Vn t 107 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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 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 { 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); GS: Phm Vn t 108 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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]; } }; // 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) { if (d.a!=NULL) delete d.a; cout << " - Bac da thuc: " ; cin >> d.n; d.a = new double[d.n+1]; GS: Phm Vn t 109 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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; GS: Phm Vn t 110 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ k = n + d2.n ; DT d(k); 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; 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(); GS: Phm Vn t 111 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } Bi 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: 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: int t,m ; public: friend ostream& operator<< (ostream& os,const PS &p) { os << " = " << p.t << "/" << p.m; return os; } GS: Phm Vn t 112 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 + 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. GS: Phm Vn t 113 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + Khi lp khng c cc thuc tnh kiu con tr hoc tham chiu, th dng hm to sao chp mc nh l . + 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 ; // 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 GS: Phm Vn t 114 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi 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: 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) { 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) GS: Phm Vn t 115 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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 ; 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. GS: Phm Vn t 116 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ //CT4_08.CPP // 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); }; 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): " ; for (int i=0 ; i<= d.n ; ++i) os << d.a[i] <<" " ; return os; } istream& operator>> (istream& is,DT &d) GS: Phm Vn t 117 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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 ; cout <<"\nNhap da thuc u " ; cin >> u; cout << "\nDa thuc d " << d ; cout << "\nDa thuc u " << u ; getch(); }

Bi 5. Hm hu (Destructor) 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. GS: Phm Vn t 118 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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,... 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 bi 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. GS: Phm Vn t 119 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 5.4.2. Cch khc phc 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; // Con tr tr ti vng nh cha nh hnh trn int hienmh; // Trng thi hin (hienmh=1), n (hienmh=0) 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) - 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. GS: Phm Vn t 120 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ //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> #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; pht=NULL; } HT::HT(int r1,int m1) { r=r1; m=m1; hienmh=0; xhien=yhien=0; GS: Phm Vn t 121 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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() { GS: Phm Vn t 122 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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); GS: Phm Vn t 123 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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. Bi 6. Ton t gn 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.

GS: Phm Vn t

124

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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) GS: Phm Vn t 125 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ pht = NULL; else { 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: 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. GS: Phm Vn t 126 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ //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> #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); void an(); const HT &operator=(const HT &h); }; const HT & HT::operator=(const HT &h) { GS: Phm Vn t 127 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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; } 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]; GS: Phm Vn t 128 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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() { an(); if (pht!=NULL) { delete pht; pht=NULL; } } void ktdh() { GS: Phm Vn t 129 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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. Bi 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, + Hm to c i + Hm to sao chp + Hm hu 3. Cc phng thc ton t

GS: Phm Vn t

130

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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> #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) GS: Phm Vn t 131 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { t=t1; m=m1; } 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(); } Bi 8. Hm to v i tng thnh phn 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: GS: Phm Vn t 132 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ double x, y, z; ... }; class C { private: int m, n; A u; B p, q; ... }; Trong v d trn th: C l lp bao 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.

GS: Phm Vn t

133

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + 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() { 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 GS: Phm Vn t 134 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi 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; } }; 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> class DIEM { private: int x,y ; public: GS: Phm Vn t 135 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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; } }; GS: Phm Vn t 136 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ void main() { DT u, v(1,100,100,200,200), s(2,DIEM(300,300), 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 { private: int x,y ; public: Diem() { x=y=0; } Diem(int x1, int y1) { x= x1; y=y1; } int getx() { return x; GS: Phm Vn t 137 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } int gety() { return y; } }; class DTron // Duong tron { private: Diem t ; // tam 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: DTron dt; Diem d; int m; public: HTron() { m=0; GS: Phm Vn t 138 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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,""); setbkcolor(1); DTron dt(100,100,80,6); HTron ht(300,300,150,15,300,300,4); dt.ve(); ht.ve(); getch(); closegraph(); }

Bi 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 x; .... }; + Thnh phn tnh c cp pht mt vng nh c nh. N tn ti ngay c khi lp cha c 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: 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 GS: Phm Vn t 139 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 static double tstienban ; // Tng s tin bn public: static void in() { 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 GS: Phm Vn t 140 tenshi3003@gmail.com // Ho n bn hng

Lp Trnh Hng i Tng Vi C++ // thanh phan tinh // Lop HDBH (hoa don ban hang) #include <conio.h> #include <iostream.h> 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; } }; 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) 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: GS: Phm Vn t 141 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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

GS: Phm Vn t

142

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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() { --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; GS: Phm Vn t 143

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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() { 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(); }

Bi 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] ; 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 GS: Phm Vn t 144 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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] GS: Phm Vn t 145 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. + 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) { this->td = ts2.td; strcpy(this->ht,ts2.ht); return ts2; } void nhap(int i); void in(); double gettd() { return td; GS: Phm Vn t 146 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } void hv(TS &ts2) { TS tg; tg = *this ; *this = ts2 ; ts2 = tg; } }; void TS::in() { cout << "\nHo ten: " << ht << " Tong diem: " << td; } void TS::nhap(int i) { 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(); getch(); } Bi 11. cp pht b nh cho i tng GS: Phm Vn t 147 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 (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) GS: Phm Vn t 148 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); 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) #include <conio.h> #include <iostream.h> #include <string.h> #include <ctype.h> #include <stdio.h> class TS { private: char *ht; double td; TS *dc; GS: Phm Vn t 149 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ public: TS() { ht = new char[20]; td = 0; dc=NULL; } ~TS() { delete ht; dc=NULL ; } int nhap(int i); void in(); double gettd() { return td; } void setdc(TS *dc1) { dc=dc1; } TS *getdc() { return dc; } }; void TS::in() { cout << "\nHo ten: " << ht << " }

Tong diem: " << td;

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; cout << "Tong diem: " ; cin >> td; dc=NULL; return 1; } void main() GS: Phm Vn t 150 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; } } /* 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(); } Bi 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; GS: Phm Vn t 151 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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). //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; } GS: Phm Vn t 152 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ PS(int t1, int m1) { t = t1; m = m1; } PS operator++() { t += m ; return *this ; } 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. 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 GS: Phm Vn t 153 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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 ; } 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; GS: Phm Vn t 154 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ clrscr(); q.nhap(); p.in(); q.in(); getch(); } Bi 13. Hm bn, lp bn 13.1. Hm bn (xem mc bi 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 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 ... GS: Phm Vn t 155 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi 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 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 { private: double a[10][10]; int n; public: friend class VT; MT() { GS: Phm Vn t 156 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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) cout << a[i][j] << " " ; GS: Phm Vn t 157 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } } 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) { 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; } GS: Phm Vn t 158 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ VT VT::tich(const MT &b) { VT z; 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(); 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"; GS: Phm Vn t 159 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ v.in(); cout << "\n\nMa tran D"; d.in(); cout << "\n\nVec to y\n"; y.in(); cout << "\n\nS= vDy = " << s; getch(); }

GS: Phm Vn t

160

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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. Bi 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 A

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

GS: Phm Vn t

161

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 { 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)

GS: Phm Vn t

162

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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: ... }; 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: GS: Phm Vn t 163 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + 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. + 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; } }; class HINH_TRON : public DIEM { private: double r; public: GS: Phm Vn t 164 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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; GS: Phm Vn t 165

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } DIEM (double x1, double y1) { 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() { 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(); }

GS: Phm Vn t

166

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Bi 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: 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 by trong 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 bi 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 bi 6, v d 2) 2.4. V d xt cc lp + Lp NGUOI gm: - Cc thuc tnh char *ht ; // H tn int ns ; - 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 GS: Phm Vn t 167 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 { 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; } } void in() { GS: Phm Vn t 168 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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 { GS: Phm Vn t 169 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ bomon=NULL; } GIAO_VIEN(char *ht1, int ns1, char *monhoc1,int st1, char *bomon1 ): NGUOI(ht1,ns1),mh(monhoc1, st1) { 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 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(); } Bi 3. Phm vi truy nhp n cc thnh phn ca lp c s GS: Phm Vn t 170 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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: int a1; public: int a2; A() { a1=a2=0; } GS: Phm Vn t 171 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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; } GS: Phm Vn t 172 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ void in() { 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. Bi 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). + 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: GS: Phm Vn t 173

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: - 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 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: GS: Phm Vn t 174 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 by trong cch 1. 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 a[20]; public: void nhap(); void xuat(): }; class B { private: int m,n; float a[20][20]; 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

GS: Phm Vn t

175

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ B::nhap(); // Nhp cc thuc tnh m D tha k t B } // 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() ; Bi 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: #include <iostream.h> class A { public: int a; }; class B : public A { public: int b; }; class C : public A { public: int c; GS: Phm Vn t 176 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ }; class D : public B , public C { public: int d; }; void main() { D h; 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; }; 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. Bi 6. Mt s v d v hm to, hm hu trong tha k nhiu mc

GS: Phm Vn t

177

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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; } B(int b1,char *str1) { b=b1; str=strdup(str1); GS: Phm Vn t 178 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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); } 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; public: D():C(),u() { d=0; str=NULL; } D(int a1, char *stra,int b1,char *strb,int c1, char *strc, GS: Phm Vn t 179 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ int d1, char *strd) : u(a1,stra), C(b1,strb,c1,strc) { d=d1; str=strdup(strd); } void xuat() { 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 // Ham huy #include <conio.h> #include <iostream.h> #include <string.h> class A { private: int a; char *str ; public: A() { GS: Phm Vn t 180 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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; if (str!=NULL) delete str; } void xuat() { cout << "\n" << "So nguyen lop B = " << b << " Chuoi lop B: " << str ; } }; GS: Phm Vn t 181 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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 u; 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) { GS: Phm Vn t 182 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); 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(); } Bi 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:

GS: Phm Vn t

183

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ - 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. 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) { 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 } ... }; GS: Phm Vn t 184 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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() { cout << "\n" << "So nguyen lop A= " << a GS: Phm Vn t 185 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ << " 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; } 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 GS: Phm Vn t 186 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; } 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 ; GS: Phm Vn t 187 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } }; class D : public C { private: int d; char *str ; A u; public: D():C(),u() { d=0; str=NULL; } 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(); 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 GS: Phm Vn t 188 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ << " 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(); }

Bi 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. GS: Phm Vn t 189 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + 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> #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; 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 ; } GS: Phm Vn t 190 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ }; 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; } 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: GS: Phm Vn t 191 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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 ; } }; GS: Phm Vn t 192 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ class D : public C { private: int d; char *str ; A u; 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(); 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() { GS: Phm Vn t 193 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); h1.nhap(); cout<<"\n\nH2:"; h2.xuat(); cout<<"\n\nH1:"; h1.xuat(); getch(); } Bi 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. //CT5-10 GS: Phm Vn t 194 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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; } 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) { GS: Phm Vn t 195 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ r=r1; md=md1; } void ve() { setcolor(md); circle ( (*this)[1],(*this)[2],r); } 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); floodfill((*this)[1],(*this)[2],this->getmd()); } }; class DOAN_THANG { private: DIEM d1, d2; int md; public: DOAN_THANG() : d1(), d2() { md=0; GS: Phm Vn t 196 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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 { 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() { int mh=0,mode=0; initgraph(&mh,&mode,""); } void main() GS: Phm Vn t 197 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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(); }

Bi 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 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 sotiet ; // S tit public: MON_HOC() ; // Hm to const MON_HOC& operator=(const MON_HOC& m) ; // Gn void nhap() ; // Nhp void xuat() ; // Xut }; class GV { GS: Phm Vn t 198 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ private: char ht[25]; // Ho ten int ns; // Nam sinh int sm; // So mon hoc co the day MON_HOC *mh ; //Danh sach cac mon hoc 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 // Bo mon { 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. 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 GS: Phm Vn t 199 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; } void xuat() { cout << "\nTen mon hoc:" << tenmh << " so tiet: " << sotiet; } }; class GV { private: char ht[25]; // Ho ten int ns; // Nam sinh int sm; public: GV() { ht[0]= ns= sm= 0 ; mh = NULL; } GS: Phm Vn t 200 tenshi3003@gmail.com // So mon hoc co the day MON_HOC *mh ; //Danh sach cac mon hoc

Lp Trnh Hng i Tng Vi C++ ~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; 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]; GS: Phm Vn t 201 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ for (int i=1; i<=sm; ++i) this->mh[i].nhap(); } } 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 // Bo mon { private: char tenbm[20]; int n; // So giao vien GV *gv; // Danh sach giao vien public: BM() { tenbm[0] = n = 0; 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) { GS: Phm Vn t 202 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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(); 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() GS: Phm Vn t 203 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; // Nam bao ve luan van public: LV() ; // Hm to 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> #include <string.h> class MON_HOC GS: Phm Vn t 204 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; } 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; // Nam sinh int sm; // So mon hoc co the day MON_HOC *mh ; //Danh sach cac mon hoc public: GV() { ht[0]= ns= sm= 0 ; GS: Phm Vn t 205 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ mh = NULL; } ~GV() { ht[0]= ns= sm= 0 ; 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) { 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: " ; GS: Phm Vn t 206 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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; // Nam bao ve luan van public: LV() { tenlv[0]=tensv[0] = nambv = 0; } const LV& operator=(const LV& l) { strcpy(this->tenlv,l.tenlv); strcpy(this->tensv,l.tensv); GS: Phm Vn t 207 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 { 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) { GS: Phm Vn t 208 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ GV *g1, *g2; g1 = this->getGV(); g2 = g.getGV(); *g1 = *g2; int n = g.solv; 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() { 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(); } } GS: Phm Vn t 209 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // Sua lop BM: thay GV bang GV2 #define GV GV2 class BM // Bo mon { private: char tenbm[20]; int n; // So giao vien GV *gv; // Danh sach giao vien public: BM() { tenbm[0] = n = 0; 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; if (n) { cout << "\n Danh sach giao vien cua bo mon:"; for (int i=1; i<=n; ++i) gv[i].xuat(); GS: Phm Vn t 210 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } } 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(); getch(); }

Bi 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 GS: Phm Vn t 211 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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 { cout <<"\n Hien n = " << n; cout << "\n Co thay doi n? - C/K"; ch=toupper(getch()); if (ch=='C') { cout << "\nN= "; cin >> n; } } GS: Phm Vn t 212 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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); }; 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]; } } GS: Phm Vn t 213 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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]; } 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() GS: Phm Vn t 214 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { int n,i; n = this->getN(); if (n) { 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(); } Bi 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

GS: Phm Vn t

215

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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 by cch s dng cc cng c trn xy dng chng trnh qun l nhiu i tng khc nhau theo mt lc thng nht. Bi 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 { 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: C h ; // h l i tng kiu C h.xuat() ; // Gi ti phng thc h.D::xuat() GS: Phm Vn t 216 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); 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. Nh vy bn cu lnh: hien(&a); hien(&b); GS: Phm Vn t 217 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ hien(&c); hien(&d); trong hm main (ca chng trnh di y) u gi ti A::xuat(). //CT6-01 // Phuong thuc tinh #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; } }; class B:public A { public: B():A() { } B(int n1):A(n1) { } void xuat() { GS: Phm Vn t 218 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { } 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); GS: Phm Vn t 219 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ clrscr(); hien(&a); hien(&b); hien(&c); hien(&d); getch(); } Bi 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> #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); } GS: Phm Vn t 220 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } 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); GS: Phm Vn t 221 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } }; 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 // 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); 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') GS: Phm Vn t 222 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi 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); } 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() ; 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: GS: Phm Vn t 223 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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). Bi 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: + 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() { GS: Phm Vn t 224 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ cout << \n y l lp B ; }; }; class C : public B { ... 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 { ... virtual void hien_thi() { cout << \n y l lp B ; }; }; class C : public B { ... virtual void hien_thi() { cout << \n y l lp C ; GS: Phm Vn t 225 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi 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). 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: 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 GS: Phm Vn t 226 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 = &c; p = &d; // p tr ti i tng b ca lp B // p tr ti i tng c ca lp C // p tr ti i tng d ca lp D p->hien_thi() ; // Gi ti B::hien_thi() p->hien_thi() ; // Gi ti C::hien_thi() p->hien_thi() ; // Gi ti D::hien_thi()

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()

GS: Phm Vn t

227

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: + 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 3.6. V d Ta sa chng trnh trong bi 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() GS: Phm Vn t 228 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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) { } void xuat() { GS: Phm Vn t 229 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { } 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(); GS: Phm Vn t 230 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ hien(&a); hien(&b); hien(&c); 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). Bi 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> 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; GS: Phm Vn t 231 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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() { 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); } }; void main() { TS2 t[100]; int i, n; cout << "\nSo thi sinh: "; cin >> n; for (i=1; i<=n; ++i) GS: Phm Vn t 232 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; 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). Bi 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: class A GS: Phm Vn t 233 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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. 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. GS: Phm Vn t 234 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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> #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() { } CON_MEO(char *ten1) : CON_VAT(ten1) { } virtual void xung_ten() { cout << "\nToi la chu meo: " << ten ; } }; GS: Phm Vn t 235 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 { 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; GS: Phm Vn t 236 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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 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"); GS: Phm Vn t 237 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ CON_MEO m1("MUOP"); CON_MEO m2("DEN"); CON_MEO m3("TRANG"); CON_MEO m4("TAM THE"); CON_MEO m5("VANG"); void main() { 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: 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

GS: Phm Vn t

238

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Bi 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. 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) { mau = m; GS: Phm Vn t 239 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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 { 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 { GS: Phm Vn t 240 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ public: VUONG(int a, int m): CHUNHAT(a,a,m) { } }; class HTRON: public HINH { 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; 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); } GS: Phm Vn t 241 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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(); } Bi 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: + 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.

GS: Phm Vn t

242

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + 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) ; 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: GS: Phm Vn t 243 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ int *a; void hoan_vi(long i, long j) { int tg = a[i]; a[i] = a[j]; 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); } } 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; GS: Phm Vn t 244 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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; } if (a[l] > a[r]) k = l; else k = r; GS: Phm Vn t 245 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); } } 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(); GS: Phm Vn t 246 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ for (k=0; k<3; ++k) { srand(5000); 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(); }

GS: Phm Vn t

247

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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. Bi 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). 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. Bi 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. GS: Phm Vn t 248 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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 x=3.14 ch=Z ten=HONG que = HAI GS: Phm Vn t 249 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. Bi 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: 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 GS: Phm Vn t 250 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ char ch1, ch2; th 2 cu lnh: cin.get(ch1); 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 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: GS: Phm Vn t 251 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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: 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: GS: Phm Vn t 252 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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; } GS: Phm Vn t 253 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } void nhap(); 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::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; } } void main() { int n; clrscr(); cout << "\nSo thi sinh: "; cin>>n; TSINH *t = new TSINH(n); t->nhap() ; GS: Phm Vn t 254 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ t->xuat(); getch(); delete t; } Bi 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. 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: + Cc phng thc nh dng GS: Phm Vn t 255 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + Cc cc c nh dng + Cc hm v b phn nh dng Mc sau s trnh by cch nh dng gi tr xut. Bi 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. + 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 GS: Phm Vn t 256 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ cout.width(8); cout.fill(0) ; cout << x ; th kt qu in ra l: 0034.46 // rng quy c 8 // K t n l s 0

5.2. Cc phng thc nh dng 1. Phng thc 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() 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 GS: Phm Vn t 257 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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(); } Sau khi thc hin, chng trnh in ra mn hnh 2 dng sau: ***-3.16 **-23.45 Bi 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 by cc 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::right ios::internal ios::dec ios::oct ios::hex ios::fixed ios::scientific ios::showpos ios::uppercase ios::showpoint 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**

GS: Phm Vn t

258

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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; GS: Phm Vn t 259 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ getch(); } Sau khi thc hin chng trnh in ra 6 dng nh sau: -87.16** 23.45*** **-87.16 ***23.45 -**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 c in: S thc 23.45425 c in: S thc 678.0 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. 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: -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: GS: Phm Vn t 260 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ S thc -87.1500 c in: S thc 23.45425 c in: S thc 678.0 c in: Nhm 4 gm cc hin th: 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: C ios::uppercase + 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 by trong 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: GS: Phm Vn t 261 tenshi3003@gmail.com 50 dng in h 16 l 28 -8.7150e+01 2.3454e+01 6.7800e+01

ios::showpos ios::showbase ios::uppercase

Lp Trnh Hng i Tng Vi C++ cout.flags(ios::showpoint | ios::scientific) ; s bt cc c ios::showpoint v ios::scientific. + Phng thc long cout.flags() ; s tr v mt gi tr long biu th cc c ang bt. Bi 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 // nh c ios::dec oct // 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; 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) // nh cout.width(int n) setpecision(int n) // nh cout.pecision(int n) setfill(char ch) // nh cout. fill(char ch) setiosflags(long l) // 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. GS: Phm Vn t 262 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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: 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; 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 GS: Phm Vn t 263 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; }; 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; } } GS: Phm Vn t 264 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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); GS: Phm Vn t 265 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) << 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; } Bi 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. 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> GS: Phm Vn t 266 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; clog << "\n"; clog.width(10); clog << z; clog.flush(); getch(); } Bi 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 dng to dng nhp ofstream 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. + 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) ;

GS: Phm Vn t

267

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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; GS: Phm Vn t 268 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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; } GS: Phm Vn t 269 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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; } } 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); t->nhap() ; t->sapxep(); t->xuat(); GS: Phm Vn t 270 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ getch(); delete t; } Bi 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

fstreambase

istream

ofstream fstream

ifstream

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. GS: Phm Vn t 271 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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). Bi 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: 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 nu tp cha c th khng lm g (b qua) ios::noreplace 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. ( 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, GS: Phm Vn t 272 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 GS: Phm Vn t 273 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { cin.get(str,n); if (str[0]) 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 { private: int sots; TSINH *ts; public: TS() { sots=0; ts = NULL; } void nhap(); void sapxep(); void ghitep(char *ttep); }; GS: Phm Vn t 274 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; } } 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); 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 ; GS: Phm Vn t 275 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } 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(); } GS: Phm Vn t 276

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ while(1) { 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 { 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) { GS: Phm Vn t 277 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; } } 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(); f.open(ttep) ; } else exit(1); GS: Phm Vn t 278 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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(); } Bi 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. GS: Phm Vn t 279 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ + 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) 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. 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 GS: Phm Vn t 280 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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()) { 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 bi 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 #include <iostream.h> #include <iomanip.h> GS: Phm Vn t 281 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #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; } 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 GS: Phm Vn t 282 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ << setw(5) << ts[i].dh ; cout << "\nTong diem: " << ts[i].td ; } } 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(); 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 GS: Phm Vn t 283 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ << 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(); 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"); t.xuat(); cout << "\n Hoan thanh"; getch(); GS: Phm Vn t 284 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } Bi 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 ios::nocreate nu tp cha c th khng lm g (b qua) ios::noreplace nu tp c th khng lm g (b qua) Ch : + 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. GS: Phm Vn t 285

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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() ; 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: GS: Phm Vn t 286 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); 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"; int ch=getch(); if (toupper(ch)=='C') GS: Phm Vn t 287 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi 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 ; 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; GS: Phm Vn t 288 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ f >> sobd >> dt >> dl >> dh >> td; f.ignore(); cout << "\nThi sinh thu: " << stt ; cout << "\nHo ten: "<< ht; cout << " \nTinh - thanh pho: " << ttinh; 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(); }

Bi 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() ; 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() ; GS: Phm Vn t 289 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; ifstream f(ten_tep); if (f.bad()) { cout << \n Tp << ten_tep << khng tn ti ; 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; GS: Phm Vn t 290 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } Bi 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 // 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() ) GS: Phm Vn t 291 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { cout << "\n Loi mo tep nguon hoac dich " ; getch(); exit(1); } while(fnguon.get(ch),!fnguon.eof()) fdich.put(ch) ; fnguon.close(); 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() { 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); GS: Phm Vn t 292 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } Bi 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 { private: TSINH ts; GS: Phm Vn t 293 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 ; } } 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) { GS: Phm Vn t 294 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ cout << "\nThi sinh thu: " << (sots+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) ; 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 { 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: "; GS: Phm Vn t 295 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ cin >> ts.sobd; cout << "\nTong diem: "; cin >> ts.td; f.write((char*)(&ts),size) ; ++stt; } sots += stt ; f.close(); } void TS::xem_sua() { 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') { f.seekg(-size,ios::cur) ; cout << "\nHo ten: "; fflush(stdin); gets(ts.ht); cout << "\nSo bao danh: "; cin >> ts.sobd; GS: Phm Vn t 296 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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" ; 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(); } Bi 17. Xy dng ton t nhp xut i tng trn tp Trong cc mc trn trnh by cch 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 GS: Phm Vn t 297 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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> #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(); GS: Phm Vn t 298 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ return fs; } ostream& operator<<(ostream& os,const TS &t) { os << "\nHo ten: " << t.ht ; os << "\nTong diem: " << t.td; return os; } 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); f>>t4>>t5>>t6; cout << t4 << t5 << t6; f.seekg(0); while (f>>t ,!f.eof()) cout << t; f.close(); cout << "\n Xong"; getch(); GS: Phm Vn t 299 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ }

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 { 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; os << t.td << endl; GS: Phm Vn t 300 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() ) cout << t; f.close(); cout << "\n Xong"; getch(); } Bi 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

fstreambase

ostream

GS: Phm Vn t

301

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ ifstream 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() 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) 13. long tellg() ofstream

18.4. Cc phng thc ca lp ostream 1. operator<< 2. ostream& flush() GS: Phm Vn t 302 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) 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)

GS: Phm Vn t

303

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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. Bi 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 CGA.BGI EGAVGA.BGI HERC.BGI IBM8514.BGI PC3270.BGI Kiu mn hnh ha ATT & T6300 (400 dng) IBMCGA, MCGA v cc my tng thch IBM EGA, VGA v cc my tng thch 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 :

GS: Phm Vn t

304

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++

(0,0)

(639,0)

(0,479)

(639,479) Hnh 8.1. H ta VGA

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. Bi 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"); ... }
Bng 8-2. Cc gi tr kh d ca graphdriver, graphmode

GS: Phm Vn t

305

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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) EGA64 (4) EGAMONO (5) VGA (9) EGALO (0) EGAHi (1) EGA64LO (0) EGA64Hi (1) EGAMONOHi (0) VGALO (0) VGAMED (1) VGAHI (2) 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) 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 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 graphmode phn gii

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 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. GS: Phm Vn t 306 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ - 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. Bi 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 grFileNotFound grInvalidDriver grNoLoadMem grNoScanMem grNoFloodMem grFontNoFound grNoFontMem Tr 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 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 Li pht hin

GS: Phm Vn t

307

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


grInvalidMode grError grIOerror grInvalidFont grInvalidFontNum -10 -11 -12 -13 -14 Kiu ha khng hp l cho trnh iu khin Li ha tng qut Li ha vo ra Tp tin Font khng hp l S hiu Font khng hp l

Bi 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 84, 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 Tn hng BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIHGTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW Gi tr s 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 Mu hin th

GS: Phm Vn t

308

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


WHITE 15 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; 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_FILL SLASH_FILL BKSLASH_FILL LTBKSLASH_FILL HATCH_FILL XHATCH_FILL INTERLEAVE_FILL WIDE_DOT_FILL CLOSE_DOT_FILL Gi tr s 0 1 2 3 4 5 6 7 8 9 10 11 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

6. Hm getcolor tr v mu xc nh trc bng hm setcolor. 7. Hm getbkcolor tr v mu xc nh trc bng hm setbkcolor. 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. Bi 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 454 GS: Phm Vn t 309 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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; mode=EGALO; initgraph(&mh, &mode,""); GS: Phm Vn t 310 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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 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); GS: Phm Vn t 311 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ drawpoly (3, poly1); // ng gp khc fillpoly (3, poly2); // Hnh a gic fillpoly(4, poly3); // Hnh a gic closegraph(); } C. ng thng 7. Hm 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 di chuyn n v tr mi. (x + dx,y + dy). Con chy c

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); lineto(620,20); closegraph(); } D. Hnh ch nht 11. Hm void rectangle(int x1,int y1,int x2,int y2);

GS: Phm Vn t

312

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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> 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(); } Bi 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 GS: Phm Vn t 313 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ CENTER_LINE = 2 Nt chm gch DASHED_LINE = 3 Nt gch 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 #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); GS: Phm Vn t 314 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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); 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(); 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; GS: Phm Vn t 315 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ goto tt; } setwritemode(COPY_PUT); // Tr v overwrite mode closegraph(); } Bi 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. 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 464 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; GS: Phm Vn t 316 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ setviewport(xc, yc, getmaxx(), getmaxy(), 0); 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); 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.

GS: Phm Vn t

317

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } Bi 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. 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. GS: Phm Vn t 318 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); } 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; GS: Phm Vn t 319 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ struct viewporttype v; getviewsettings(&v); 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); } if(kbhit()) { ch=getch(); if (ch==ESC) break; } } } // Kt thc hm putpixelplay

Bi 9. X l vn bn trn mn hnh ho 1. Hin th vn bn trn mn hnh ho Hm void outtext (char *s); GS: Phm Vn t 320 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. 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); 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 GS: Phm Vn t 321 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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. #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. GS: Phm Vn t 322 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 #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; } 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: "); GS: Phm Vn t 323 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ text_read (&x,&y,name); text_writeln (&x,&y,"" ); text_write(&x,&y,"chao ban "); text_write(&x,&y,name); getch(); closegraph(); }

Bi 10. Ct hnh, Dn hnh v To nh chuyn ng 1. Hm unsigned imagesize(int x1,int y1,int x2,int y2) 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 Sao chp nguyn xi. XOR_PUT = 1 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. V d 1: Chng trnh di y minh ho cch dng imagesize, malloc, getimage v putimage. GS: Phm Vn t 324 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #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) - 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. Bi 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 GS: Phm Vn t 325 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> 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]); } // 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 GS: Phm Vn t 326 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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> #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); line(x0,y0,x,y); } // Hm ke kim giay void ke_giay(unsigned giay) { GS: Phm Vn t 327 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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) { GS: Phm Vn t 328 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ ke_phut(phutht); phutht=phut; ke_phut(phutht); } } // 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; 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); GS: Phm Vn t 329 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); 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 // Tu v tr chuyn ng trn bu tri y sao nhp nhy #include <graphics.h> #include <stdio.h> #include <conio.h> #include <alloc.h> GS: Phm Vn t 330 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #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); 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 GS: Phm Vn t 331 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // dng iu khin chuyn ng tu goc= 2*M_PI + M_PI/2; 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; 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; } } GS: Phm Vn t 332 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Bi 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); 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; 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) GS: Phm Vn t 333 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); } } } fprintf(stdprn,"%c%c%c",27,'A',m); fprintf(stdprn,"\n"); } } ket: fprintf(stdprn,"%c%c",27,'@'); }

GS: Phm Vn t

334

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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 Bi 1. Cc hm truy nhp theo a ch phn on 1. Hm pokeb: Gi mt k t vo b nh. + Nguyn 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. + Nguyn 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 nguyn vo b nh. + Nguyn mu trong dos.h nh sau: void poke(unsigned seg, unsigned off, int value); + Cng dng: Gi gi tr nguyn value vo b nh ti a ch phn on seg:off 4. Hm peek: Nhn mt s nguyn t b nh. + Nguyn 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. + Nguyn 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 Bi 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)

GS: Phm Vn t

335

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Khi a mt k t vo vng nh mn hnh, th n s hin ln mn hnh. Mi k t trn 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 nguyn 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 nguyn t 0 n 15 v biu th 16 mu ca k t. 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() { union REGS v,r; clrscr(); //Mc nh hin th trang 0 for (int i=0;i<8;++i) pokeb(0xb800,i,d1[i]); getch(); GS: Phm Vn t 336 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ //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(); } Bi 3. Chuyn i a ch 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. Bi 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 trn-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 GS: Phm Vn t 337 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 trn a ch thc. Trong hm main() s s dng cc hm cuaso v duarmh to hai ca s v vit hai dng ch trn 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); 495 496 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; 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 */ GS: Phm Vn t 338 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); } } } 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 */ for (i=0;i<=cotc-cotd;++i) { if ((kt=day[i])==0) break; buf[p+2*i]=kt; buf[p+2*i+1]=mau; } } GS: Phm Vn t 339 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); 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'}; GS: Phm Vn t 340 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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> GS: Phm Vn t 341 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #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}; 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 for (i=0; i<28; ++i) p_mh[i] = buf_luu[i]; } void main() { int ch1, ch2; clrscr(); GS: Phm Vn t 342 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); } }

GS: Phm Vn t

343

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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. Bi 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); 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 GS: Phm Vn t 344 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ // 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 . + 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; 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 GS: Phm Vn t 345 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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) { ptr=VPOS(i,j); *p=ptr->x.kt; ++p; } } // Hien noi dung dang soan thao tren cua so GS: Phm Vn t 346 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } 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) GS: Phm Vn t 347 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ for (j=posy;j<=posy+cao-1;++j) { 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; } //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; } GS: Phm Vn t 348 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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(); 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); GS: Phm Vn t 349 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ if(ch==1)break; } s.del(); s.del(); s.del(); } Bi 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 tiu 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); 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; GS: Phm Vn t 350 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ struct kt_word { 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); 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) GS: Phm Vn t 351 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { 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; } 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); 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; GS: Phm Vn t 352 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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(); } else break; GS: Phm Vn t 353 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } } Bi 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. /* CT10_03.CPP LOP hinh hoc 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; } GS: Phm Vn t 354 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ hinh(int m) { mau=m; } virtual void dchuyen(int b)=0; }; 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) { 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: GS: Phm Vn t 355 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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) { 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); } void an(void) { GS: Phm Vn t 356 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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))) { if (ch2==80) dy=1; else if (ch2==72) dy=-1; else if (ch2==77) dx=1; else dx=-1; return(0); } } } 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) { GS: Phm Vn t 357 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ hien(); if (getkey(dx,dy)=='q') break; an(); x1+=b*dx; x2+=b*dx; 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(); 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(); GS: Phm Vn t 358 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } Bi 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; 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. /* CT10_05.CPP Lop vat chua (container) Lop danh sach moc noi Lop ngan xep GS: Phm Vn t 359 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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)(); 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 () GS: Phm Vn t 360 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ { count=0; errhandler= defaulthandler; } 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 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); GS: Phm Vn t 361 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ ~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) { 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() { head=NULL; tail=NULL; } s_list::s_list(const s_list &s1):container(s1) { GS: Phm Vn t 362 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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 GS: Phm Vn t 363 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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; 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() { GS: Phm Vn t 364 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } queue::queue(const queue &q):stack(q) { } void queue::operator=(const queue &q) { this->stack::operator=(q); //Dung toan tu gan cua stack } 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]; int sobd; float td; public: void nhap() { cout << "\nHo ten: " ; fflush(stdin); gets(ht); cout << "So bao danh: " ; GS: Phm Vn t 365 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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() { 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; str = (char*)s2.retrieve(); GS: Phm Vn t 366 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); } Bi 5. Cc lp sp xp 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 GS: Phm Vn t 367 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 Di y l ni dung tp C_SORT.H //C_SORT.H // Lop co so truu tuong // Lop sort #include <conio.h> GS: Phm Vn t 368 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ #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); 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, GS: Phm Vn t 369 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ int (*ss_nho_hon)(void*,void*)) { 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]; 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); } GS: Phm Vn t 370 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ } 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 { 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; 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 { 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; GS: Phm Vn t 371 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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); } } Bi 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 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: " ; cin >> sobd; cout << "Tong diem: " ; cin >> td; } GS: Phm Vn t 372 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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" ; GS: Phm Vn t 373 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; 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 #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; GS: Phm Vn t 374 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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(); 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"; } getch(); }

GS: Phm Vn t

375

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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) & 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) GS: Phm Vn t 376 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ >> 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) 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) |= 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 GS: Phm Vn t 377 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ .* :: ?: Gi gin tip ti thnh phn t mt bin i tng Ton t xc nh phm vi truy nhp Ton t iu kin

GS: Phm Vn t

378

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++

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

GS: Phm Vn t

379

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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); }

m (S TT) 0 1 2 3 4 5 6 7 8 9

k t NUL SOH STX ETX EOT ENQ ACK BEL BS HT

Bng m ASCII m k t m k t (S TT) (S TT) 26 SUB 52 4 27 ESC 53 5 28 FS 54 6 29 GS 55 7 30 RS 56 8 31 US 57 9 32 Space 58 : 33 ! 59 ; 34 60 < 35 # 61 = 380 tenshi3003@gmail.com

GS: Phm Vn t

Lp Trnh Hng i Tng Vi C++ 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM N O P Q R S t U V W X Y Z [ \ ] ^ 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 $ % & ( ) * + , . / 0 1 2 3 _ * a b c d e f g h i J k l m n o 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 > ? @ A B C D E F G H I J K L M p q r s t u v w x y z { | } ~ 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. GS: Phm Vn t 381 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ Hex 1 2-B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 Thp phn 1 2-11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 Phm ca PC ESC 1-9,0 tr, gch di =, + Backspace Tab Q W E R T Y U I O P [ ] Enter Ctrl A S D F G H J K L Chm phy, : Nhy Tidle Shift \, thanh ng Z X C V B 382 Phm ca PC-AT Tilde 1-9,0 tr, gch di =, + \,thanh ng Backspace Tab Q W E R T Y U I O P [ ] Ctrl A S D F G H J K L Chm phy,: Nhy tri Enter Shift tri Z X C tenshi3003@gmail.com

GS: Phm Vn t

Lp Trnh Hng i Tng Vi C++ 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4F 50 51 52 53 5A 5B 5C 5D 5F 60 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 90 91 92 93 95 96 N M Phy Chm /,? Shift phi *, PrtScr Alt Space bar Caps Lock F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 Num Lock Scroll Lock,Break Home mi tn ln PgUp Du tr bn tnh Mi tn tri 5 Mi tn phi End Mi tn xung PgDn Ins Del V B N M Phy Chm /, ? Shift phi Alt

Space bar

Caps Lock F2 F4 F6 F8 F10 F1 F3 F5 F7 F9 ca bn tnh

ESC Home Mi tn tri End Num Lock Mi tn ln 383 tenshi3003@gmail.com

GS: Phm Vn t

Lp Trnh Hng i Tng Vi C++ 61 62 63 64 65 66 67 68 69 6A 6B 6C 97 98 99 100 101 102 103 104 105 106 107 108 5 ca bn tnh Mi tn xung Ins Scroll Lock PgUp Mi tn phi PgDn Del Sys *, PrtScr +

GS: Phm Vn t

384

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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) + 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 ;

GS: Phm Vn t

385

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 *((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* 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. 563 564 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: GS: Phm Vn t 386 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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; GS: Phm Vn t 387 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ case 'f' : gt_float = (float) (*((double*)list)); if(!lap) ((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 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 = ... ; GS: Phm Vn t 388 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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; } }

GS: Phm Vn t

389

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


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 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 GS: Phm Vn t <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> <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> 390 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 GS: Phm Vn t <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> <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> 391 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 GS: Phm Vn t <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> <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> 392 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 131. memchr 132. memcmp 133. memcpy 134. memicmp 135. memset 136. MK_FP 137. mkdir 138. movedata 139. movedata 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 155. putchar 156. putimage 157. putpixel GS: Phm Vn t <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 <string.h> <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> <stdio.h> <graphics.h> <graphics.h> 393 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 195. strcspn 196. strdup 197. stricmp GS: Phm Vn t <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> <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> <string.h> <string.h> <string.h> 394 tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++ 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 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 <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> <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>

GS: Phm Vn t

395

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++

GS: Phm Vn t

396

tenshi3003@gmail.com

You might also like