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

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

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

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

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

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

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

// Thiu 2 tham s cui

f(3,3.4) ;

// Thiu 3 tham s cui

Cc li gi sau l sai:
f(3) ;

// Thiu tham s cho i khng mc nh d2

f(3,3.4, ,10) ;

// 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

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:
-1

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

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

mt i tng kiu DIEM

d3

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

// Ho n bn hng

{
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

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

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

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

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;

// So mon hoc co the day

MON_HOC *mh ; //Danh sach cac mon hoc


public:
GV()
{
ht[0]= ns= sm= 0 ;
mh = NULL;
}
GS: Phm Vn t

200

tenshi3003@gmail.com

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 tr ti i tng b ca lp B

p->hien_thi() ; // Gi ti B::hien_thi()
p = &c;

// p tr ti i tng c ca lp C

p->hien_thi() ; // Gi ti C::hien_thi()
p = &d;

// p tr ti i tng d ca lp D

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

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:

-87.15

S thc 23.45425 c in:

23.4543

S thc 678.0 c in:

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:

-87.1500

S thc 23.45425 c in:

23.4543

S thc 678.0

678.0000

c in:

+ 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:

-8.715e+01

S thc 23.45425 c in:

2.3454e+01

S thc 678.0

6.78e+02

c in:

+ 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:

-8.7150e+01

S thc 23.45425 c in:

2.3454e+01

S thc 678.0
c in:
Nhm 4 gm cc hin th:

6.7800e+01

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


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

050

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

50

dng in h 16 l 28
C ios::uppercase
+ 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

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

ofstream

istream

ifstream
fstream

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

GS: Phm Vn t

fstreambase

301

ostream

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


ifstream

ofstream
fstream

18.2. Cc phng thc ca lp ios


1. int bad()
2. void clear(int=0)
3. int eof()
4. int fail()
5. int fill()
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()

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

Kiu mn hnh ha

ATT.BGI

ATT & T6300 (400 dng)

CGA.BGI

IBMCGA, MCGA v cc my tng thch

EGAVGA.BGI

IBM EGA, VGA v cc my tng thch

HERC.BGI

Hercules monochrome v cc my tng thch

IBM8514.BGI

IBM 8514 v cc my tng thch

PC3270.BGI

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

graphmode

phn gii

Detect (0)
CGA (1)

CGAC0 (0)
CGAC1 (1)

320 x 200
320 x 200

CGAC2 (2)

320 x 200

CGAC3 (3)

320 x 200

CGAHi (4)

640 x 200

MCGA0 (0)

320 x 200

MCGA1 (1)

320 x 200

MCGA2 (2)

320 x 200

MCGA3 (3)

320 x 200

MCGAMed (4)

640 x 200

MCGAHi (5)

640 x 480

EGALO (0)

640 x 200

EGAHi (1)

640 x 350

EGA64LO (0)

640 x 200

EGA64Hi (1)

640 x 350

EGAMONO (5)

EGAMONOHi (0)

640 x 350

VGA (9)

VGALO (0)

640 x 200

VGAMED (1)

640 x 350

VGAHI (2)

640 x 480

HERCMONO (7)

HERCMONOHI

720 x 348

ATT400 (8)

ATT400C0 (0)
ATT400C1 (1)

320 x 200
320 x 200

ATT400C2 (2)

320 x 200

ATT400C3 (3)

320 x 200

ATT400MED (4)

640 x 400

ATT400HI (5)

640 x 400

PC3270 (10)

PC3270HI (0)

720 x 350

IBM8514 (6)

IBM8514LO (0)

640 x 480, 256 mu

IBM8514HI (1)

1024 x 768, 256 mu

MCGA (2)

EGA (3)
EGA64 (4)

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

Tr

Li pht hin

grOk

Khng c li

grNoInitGraph

-1

Cha khi ng h ha

grNotDetected

-2

Khng c phn cng ha

grFileNotFound

-3

Khng tm thy trnh iu khin ha

grInvalidDriver

-4

Trnh iu khin khng hp l

grNoLoadMem

-5

Khng RAM cho ha

grNoScanMem

-6

Vt vng RAM trong Scan fill

grNoFloodMem

-7

Vt vng RAM trong flood fill

grFontNoFound

-8

Khng tm thy tp tin Font

grNoFontMem

-9

Khng RAM np Font

GS: Phm Vn t

307

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++


grInvalidMode

-10

Kiu ha khng hp l cho trnh iu khin

grError

-11

Li ha tng qut

grIOerror

-12

Li ha vo ra

grInvalidFont

-13

Tp tin Font khng hp l

grInvalidFontNum

-14

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

Gi tr s

Mu hin th

BLACK

en

BLUE

Xanh da tri

GREEN

Xanh l cy

CYAN

Xanh l

RED

MAGENTA

Tm

BROWN

Nu

LIHGTGRAY

Xm nht

DARKGRAY

Xm sm

LIGHTBLUE

Xanh da tri nht

LIGHTGREEN

10

Xanh l cy nht

LIGHTCYAN

11

Xanh l nht

LIGHTRED

12

nht

LIGHTMAGENTA

13

Tm nht

YELLOW

14

Vng

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

Gi tr s

M t kiu t

EMPTY_FILL

T bng mu nn

SOLID_FILL

T bng ng nt lin

LINE_FILL

T bng - - -

LTSLASH_FILL

T bng ///

SLASH_FILL

T bng /// in m

BKSLASH_FILL

T bng \\\ in m

LTBKSLASH_FILL

T bng \\\

HATCH_FILL

T bng ng gch bng nht

XHATCH_FILL

T bng ng gch bng ch thp

INTERLEAVE_FILL

T bng ng t qung

WIDE_DOT_FILL

10

T bng du chm tha

CLOSE_DOT_FILL

11

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

GS: Phm Vn t

double
else
enum
extern
float
for
friend
goto
if
inline
int
long

new
operator
private
protected
public
register
return
short
signed
sizeof
static
struct

379

switch
template
this
throw
try
typedef
union
unsigned
virtual
void
volatile
while

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

GS: Phm Vn t

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

Lp Trnh Hng i Tng Vi C++


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

$
%
&

(
)
*
+
,
.
/
0
1
2
3

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M

78

95

112

79

96

113

80

97

114

81

98

115

82

99

116

83

100

117

84

101

118

85

102

119

86

103

120

87

104

121

88

105

122

89

106

123

90

107

124

91

108

125

92

109

126

93

110

127

DEL

94

111

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

GS: Phm Vn t

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

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

GS: Phm Vn t

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

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

GS: Phm Vn t

5 ca bn tnh
Mi tn xung
Ins
Scroll Lock
PgUp
Mi tn phi
PgDn
Del
Sys
*, PrtScr
+

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
564in cc gi tr
V d sau y minh ho cch xy dng cc hm vi tham s bt
nh. Hm dng
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

GS: Phm Vn t

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

395

tenshi3003@gmail.com

Lp Trnh Hng i Tng Vi C++

GS: Phm Vn t

396

tenshi3003@gmail.com

You might also like