CH 6

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 26

Ch¬ng 6 class B:public A

T¬ng øng béi vµ ph¬ng thøc ¶o {


public:
T¬ng øng béi vµ ph¬ng thøc ¶o lµ c«ng cô
void xuat()
m¹nh cña C++ cho phÐp tæ chøc qu¶n lý c¸c ®èi tîng
{
kh¸c nhau theo cïng mét lîc ®å. Mét kh¸i niÖm kh¸c
cout << "\n Lop B " ;
liªn quan lµ: líp c¬ së trõu tîng. Ch¬ng nµy sÏ tr×nh 317 318
}
bÇy c¸ch sö dông c¸c c«ng cô trªn ®Ó x©y dùng ch-
};
¬ng tr×nh qu¶n lý nhiÒu ®èi tîng kh¸c nhau theo mét
class C:public B
lîc ®å thèng nhÊt.
{
§ 1. Ph¬ng thøc tÜnh public:
void xuat()
1.1. Lêi gäi tíi ph¬ng thøc tÜnh {
Nh ®· biÕt mét líp dÉn xuÊt ®îc thõa kÕ c¸c ph¬ng cout << "\n Lop C " ;
thøc cña c¸c líp c¬ së tiÒn bèi cña nã. VÝ dô líp A lµ
c¬ së cña B, líp B l¹i lµ c¬ së cña C, th× C cã 2 líp c¬ }
së tiÒn bèi lµ B vµ A. Líp C ®îc thõa kÕ c¸c ph¬ng };
thøc cña A vµ B. C¸c ph¬ng thøc mµ chóng ta vÉn nãi
Líp C cã 2 líp c¬ së tiÒn bèi lµ A , B vµ C kÕ thõa c¸c
lµ c¸c ph¬ng thøc tÜnh. §Ó t×m hiÓu thªm vÒ c¸ch gäi
ph¬ng thøc cña A vµ B. Do ®ã mét ®èi tîng cña C sÏ
tíi c¸c ph¬ng thøc tÜnh, ta xÐt vÝ dô vÒ c¸c líp A, B vµ
cã tíi 3 ph¬ng thøc xuat. H·y theo râi c¸c c©u lÖnh
C nh sau:
sau:
class A
C h ; // h lµ ®èi tîng kiÓu C
{
h.xuat() ; // Gäi tíi ph¬ng thøc h.D::xuat()
public:
h.B::xuat() ; // Gäi tíi ph¬ng thøc h.B::xuat()
void xuat()
h.A::xuat() ; // Gäi tíi ph¬ng thøc h.A::xuat()
{
C¸c lêi gäi ph¬ng thøc trong vÝ dô trªn ®Òu xuÊt
cout << "\n Lop A " ; ph¸t tõ ®èi tîng h vµ mäi lêi gäi ®Òu x¸c ®Þnh râ ph-
} ¬ng thøc cÇn gäi.
};
B©y giê chóng ta h·y xÐt c¸c lêi gäi kh«ng ph¶i tõ (trong sè c¸c ph¬ng thøc trïng tªn cña c¸c líp cã quan
mét biÕn ®èi tîng mµ tõ mét con trá. XÐt c¸c c©u hÖ thõa kÕ) ®îc gäi:
lÖnh: 1. NÕu lêi gäi xuÊt ph¸t tõ mét ®èi tîng cña líp nµo,
A *p, *q, *r; // p, q, r lµ con trá kiÓu A th× ph¬ng thøc cña líp ®ã sÏ ®îc gäi.
A a; // a lµ ®èi tîng kiÓu A 2. NÕu lêi gäi xuÊt ph¸t tõ mét con trá kiÓu líp nµo,
B b; // b lµ ®èi tîng kiÓu B th× ph¬ng thøc cña líp ®ã sÏ ®îc gäi bÊt kÓ con trá
chøa ®Þa chØ cña ®èi tîng nµo.
C c; // c lµ ®èi tîng kiÓu c
Chóng ta h·y ghi nhí mÖnh ®Ò sau vÒ con trá 1.2. VÝ dô
cña c¸c líp dÉn xuÊt vµ c¬ së: XÐt 4 líp A, B, C vµ D. Líp B vµ C cã chung líp c¬ së
PhÐp g¸n con trá: Con trá cña líp c¬ së cã thÓ A. Líp D dÉn xuÊt tõ C. C¶ 4 líp ®Òu cã ph¬ng thøc
dïng ®Ó chøa ®Þa chØ c¸c ®èi tîng cña líp dÉn xuÊt. xuat(). XÐt hµm:
Nh vËy c¶ 3 phÐp g¸n sau ®Òu hîp lÖ: void hien(A *p)
p = &a ; {
q = &b ; p->xuat();
r = &c ; }
Kh«ng cÇn biÕt tíi ®Þa chØ cña ®èi tîng nµo sÏ
Chóng ta tiÕp tôc xÐt c¸c lêi gäi ph¬ng thøc tõ c¸c truyÒn cho ®èi con trá p, lêi gäi trong hµm lu«n lu«n
319 320
con trá p, q, r: gäi tíi ph¬ng thøc A::xuat() v× con trá p kiÓu A. Nh
vËy bèn c©u lÖnh:
p->xuat();
hien(&a);
q->xuat();
hien(&b);
r->xuat();
hien(&c);
vµ h·y lý gi¶i xem ph¬ng thøc nµo (trong c¸c ph¬ng
thøc A::xuat, B::xuat vµ C::xuat) ®îc gäi. C©u tr¶ lêi hien(&d);
nh sau: trong hµm main (cña ch¬ng tr×nh díi ®©y) ®Òu gäi
C¶ 3 c©u lÖnh trªn ®Òu gäi tíi ph¬ng thøc A::xuat() tíi A::xuat().
, v× c¸c con trá p, q vµ r ®Òu cã kiÓu A. //CT6-01
Nh vËy cã thÓ tãm lîc c¸ch thøc gäi c¸c ph¬ng thøc // Phuong thuc tinh
tÜnh nh sau: #include <conio.h>
Quy t¾c gäi ph¬ng thøc tÜnh: Lêi gäi tíi ph¬ng #include <stdio.h>
thøc tÜnh bao giê còng x¸c ®Þnh râ ph¬ng thøc nµo
#include <iostream.h> }
#include <ctype.h> B(int n1):A(n1)
class A {
{ }
private: void xuat()
int n; {
public: cout << "\nLop B: "<<getN();
A()
}
{
};
n=0;
} class C:public A
A(int n1) {
{ public:
n=n1; C():A()
} {
void xuat()
}
{
cout << "\nLop A: "<< n; C(int n1):A(n1)
} {
int getN() }
{ void xuat()
return n; { 321 322
} cout << "\nLop C: "<<getN();
};
}
class B:public A
};
{
class D:public C
public:
{
B():A() public:
{ D():C()
{ VÝ dô sau cho thÊy sù h¹n chÕ cña ph¬ng thøc tÜnh
} trong viÖc sö dông tÝnh thõa kÕ ®Ó ph¸t triÓn ch¬ng
tr×nh.
D(int n1):C(n1)
{ Gi¶ sö cÇn x©y dùng ch¬ng tr×nh qu¶n lý thÝ sinh.
Mçi thÝ sinh ®a vµo ba thuéc tÝnh: Hä tªn, sè b¸o
} danh vµ tæng ®iÓm. Ch¬ng tr×nh gåm ba chøc n¨ng:
void xuat() NhËp d÷ liÖu thÝ sinh, in d÷ liÖu thÝ sinh ra m¸y in vµ
{ xem - in (in hä tªn ra mµn h×nh, sau ®ã lùa chän
cout << "\nLop D: "<<getN(); hoÆc in hoÆc kh«ng). Ch¬ng tr×nh díi ®©y sö dông
líp TS (ThÝ sinh) ®¸p øng ®îc yªu cÇu ®Æt ra.
}
}; //CT6-02
// Han che phuong thuc tinh
void hien(A *p)
// Lop TS
{
#include <conio.h>
p->xuat();
#include <stdio.h>
}
#include <iostream.h>
void main() #include <ctype.h>
{ class TS
A a(1); {
B b(2); private:
C c(3); char ht[25];
D d(4); int sobd;
clrscr(); float td;
hien(&a); public:
hien(&b); void nhap()
hien(&c); {
hien(&d); cout << "\nHo ten: " ;
fflush(stdin); gets(ht); 323 324
getch();
} cout << "So bao danh: " ;
cin >> sobd;
cout << "Tong diem: " ;
§ 2. Sù h¹n chÕ cña ph¬ng thøc tÜnh
cin >> td; t[i].xem_in();
} getch();
void in() }
{ Gi¶ sö Nhµ trêng muèn qu¶n lý thªm ®Þa chØ cña
fprintf(stdprn,"\n\nHo ten: %s", ht); thÝ sinh. V× sù thay ®æi ë ®©y lµ kh«ng nhiÒu, nªn
chóng ta kh«ng ®¶ ®éng ®Õn líp TS mµ x©y dùng líp
fprintf(stdprn,"\nSo bao danh: %d", sobd); míi TS2 dÉn xuÊt tõ líp TS. Trong líp TS2 ®a thªm
fprintf(stdprn,"\nTong diem: %0.1f", td); thuéc tÝnh dc (®Þa chØ) vµ c¸c ph¬ng thøc nhap, in.
} Cô thÓ líp TS2 ®îc ®Þnh nghÜa nh sau:
void xem_in() class TS2:public TS
{ {
int ch; private:
cout << "\nHo ten: " << ht ; char dc[30] ; // Dia chi
cout << "\nCo in khong? - C/K" ; public:
ch = toupper(getch()); void nhap()
if (ch=='C') {
this->in(); TS::nhap();
} cout << "Dia chi: " ;
}; fflush(stdin); gets(dc);
}
void main()
void in()
{
{
TS t[100];
TS::in();
int i, n;
fprintf(stdprn,"\nDia chi: %s", dc);
cout << "\nSo thi sinh: ";
}
cin >> n;
};
for (i=1; i<=n; ++i)
Trong líp TS2 kh«ng x©y dùng l¹i ph¬ng thøc
t[i].nhap();
xem_in, mµ sÏ dïng ph¬ng thøc xem_in cña líp TS. Ch-
for (i=1; i<=n; ++i) ¬ng tr×nh míi nh sau:
325 326
//CT6-03 fprintf(stdprn,"\nTong diem: %0.1f", td);
// Han che phuong thuc tinh }
// Lop TS TS2 void xem_in()
#include <conio.h> {
#include <stdio.h> int ch;
#include <iostream.h> cout << "\nHo ten: " << ht ;
#include <ctype.h> cout << "\nCo in khong? - C/K" ;
class TS ch = toupper(getch());
{ if (ch=='C')
private: this->in(); //Goi den TS::in() (Vi this la con
char ht[25]; tro
int sobd; //kieu TS)
float td; }
public: };
void nhap() class TS2:public TS
{ {
cout << "\nHo ten: " ; private:
fflush(stdin); gets(ht); char dc[30] ; // Dia chi
cout << "So bao danh: " ; public:
cin >> sobd; void nhap()
cout << "Tong diem: " ; {
cin >> td; TS::nhap();
} cout << "Dia chi: " ;
void in() fflush(stdin); gets(dc);
{ }
fprintf(stdprn,"\n\nHo ten: %s", ht); void in()
fprintf(stdprn,"\nSo bao danh: %d", sobd); {
TS::in();
fprintf(stdprn,"\nDia chi: %s", dc); cout << "\nHo ten: " << ht ;
} cout << "\nCo in khong? - C/K" ;
}; ch = toupper(getch());
void main() if(ch=='C')
{ this->in(); //Goi den TS::in() (Vi this la con tro
327 328
kieu TS)
TS2 t[100];
}
int i, n;
cout << "\nSo thi sinh: "; C¸c lÖnh ®Çu cña ph¬ng thøc sÏ in hä tªn thÝ sinh.
NÕu chän cã (bÊm phÝm C), th× c©u lÖnh:
cin >> n;
this->in() ;
for (i=1; i<=n; ++i)
sÏ ®îc thùc hiÖn. MÆc dï ®Þa chØ cña t[i] (lµ ®èi tîng
t[i].nhap(); cña líp TS2) ®îc truyÒn cho con trá this, thÕ nhng
for (i=1; i<=n; ++i) c©u lÖnh nµy lu«n lu«n gäi tíi ph¬ng thøc TS::in(), v×
t[i].xem_in(); con trá this ë ®©y cã kiÓu TS vµ v× in() lµ ph¬ng
thøc tÜnh. KÕt qu¶ lµ kh«ng in ®îc ®Þa chØ cña thÝ
getch();
sinh.
}
Nh vËy viÖc sö dông c¸c ph¬ng thøc tÜnh in() (trong
Khi thùc hiÖn ch¬ng tr×nh nµy, chóng ta nhËn thÊy: c¸c líp TS vµ TS2) ®· kh«ng ®¸p øng ®îc yªu cÇu ph¸t
D÷ liÖu in ra vÉn kh«ng cã ®Þa chØ. §iÒu nµy cã thÓ triÓn ch¬ng tr×nh. Cã mét gi¶i ph¸p rÊt ®¬n gi¶n lµ:
gi¶i thÝch nh sau: §Þnh nghÜa c¸c ph¬ng thøc in() trong c¸c líp TS vµ
XÐt c©u lÖnh (thø 2 tõ díi lªn trong hµm main): TS2 nh c¸c ph¬ng thøc ¶o (virtual).
t[i].xem_in() ;
C©u lÖnh nµy gäi tíi ph¬ng thøc xem_in cña líp TS2 § 3. Ph¬ng thøc ¶o vµ t¬ng øng béi
(v× t[i] lµ ®èi tîng cña líp TS2). Nhng líp TS2 kh«ng
®Þnh nghÜa ph¬ng thøc xem_in, nªn ph¬ng thøc 3.1. C¸ch ®Þnh nghÜa ph¬ng thøc ¶o
TS::xem_in() sÏ ®îc gäi tíi. H·y theo râi ph¬ng thøc Gi¶ sö A lµ líp c¬ së, c¸c líp B, C, D dÉn xuÊt (trùc
nµy: tiÕp hoÆc d¸n tiÕp) tõ A. Gi¶ sö trong 4 líp trªn ®Òu
void xem_in() cã c¸c ph¬ng thøc trïng dßng tiªu ®Ò (trïng kiÓu, trïng
tªn, trïng c¸c ®èi). §Ó ®Þnh nghÜa c¸c ph¬ng thøc
{
nµy lµ c¸c ph¬ng thøc ¶o, ta chØ cÇn:
int ch;
+ HoÆc thªm tõ kho¸ virtual vµo dßng tiªu ®Ò cña cout << “\n §©y lµ líp C” ;
ph¬ng thøc bªn trong ®Þnh nghÜa líp c¬ së A. };
+ HoÆc thªm tõ kho¸ virtual vµo dßng tiªu ®Ò bªn };
trong ®Þnh nghÜa cña tÊt c¶ c¸c líp A, B, C vµ D.
class D : public A
VÝ dô: {
C¸ch 1: ...
class A void hien_thi()
{ {
... cout << “\n §©y lµ líp D” ;
virtual void hien_thi() };
{ };
cout << “\n §©y lµ líp A” ;
C¸ch 2:
};
class A
}; 329 330 {
class B : public A ...
{ virtual void hien_thi()
... {
void hien_thi() cout << “\n §©y lµ líp A” ;
{ };
cout << “\n §©y lµ líp B” ; };
}; class B : public A
}; {
...
class C : public B
virtual void hien_thi()
{
{
... cout << “\n §©y lµ líp B” ;
void hien_thi() };
{ };
class C : public B class A
{ {
... ...
virtual void hien_thi() virtual void hien_thi() ;
{
};
cout << “\n §©y lµ líp C” ;
void hien_thi() // §óng
};
}; {
class D : public A cout << “\n §©y lµ líp A” ;
{ };
...
3.2. Quy t¾c gäi ph¬ng thøc ¶o
virtual void hien_thi()
{ §Ó cã sù so s¸nh víi ph¬ng thøc tÜnh, ta nh¾c l¹i
cout << “\n §©y lµ líp D” ; quy t¾c gäi ph¬ng thøc tÜnh nªu trong §1.
}; 3.2.1. Quy t¾c gäi ph¬ng thøc tÜnh
}; Lêi gäi tíi ph¬ng thøc tÜnh bao giê còng x¸c ®Þnh
Chó ý: Tõ kho¸ virtual kh«ng ®îc ®Æt bªn ngoµi râ ph¬ng thøc nµo (trong sè c¸c ph¬ng thøc trïng tªn
®Þnh nghÜa líp. VÝ dô nÕu viÕt nh sau lµ sai (CTBD331
sÏ cña c¸c líp cã quan hÖ thõa kÕ) ®îc gäi:
332
b¸o lçi). 1. NÕu lêi gäi xuÊt ph¸t tõ mét ®èi tîng cña líp nµo,
class A th× ph¬ng thøc cña líp ®ã sÏ ®îc gäi.
{ 2. NÕu lêi gäi xuÊt ph¸t tõ mét con trá kiÓu líp nµo,
th× ph¬ng thøc cña líp ®ã sÏ ®îc gäi bÊt kÓ con trá
... chøa ®Þa chØ cña ®èi tîng nµo.
virtual void hien_thi() ;
3.2.2. Quy t¾c gäi ph¬ng thøc ¶o
};
Ph¬ng thøc ¶o chØ kh¸c ph¬ng thøc tÜnh khi ®îc
virtual void hien_thi() // Sai
gäi tõ mét con trá (trêng hîp 2 nªu trong môc 3.2.1).
{ Lêi gäi tíi ph¬ng thøc ¶o tõ mét con trá cha cho biÕt
cout << “\n §©y lµ líp A” ; râ ph¬ng thøc nµo (trong sè c¸c ph¬ng thøc ¶o trïng
}; tªn cña c¸c líp cã quan hÖ thõa kÕ) sÏ ®îc gäi. §iÒu
nµy phô thuéc vµo ®èi tîng cô thÓ mµ con trá ®ang
CÇn söa l¹i nh sau:
trá tíi: Con trá ®ang trá tíi ®èi tîng cña líp nµo th× ph- 3.4. Liªn kÕt ®éng
¬ng thøc cña líp ®ã sÏ ®îc gäi. Cã thÓ so s¸nh sù kh¸c nhau gi÷ ph¬ng thøc tÜnh
VÝ dô A, B, C vµ D lµ c¸c líp ®· ®Þnh nghÜa trong vµ ph¬ng thøc ¶o trªn khÝa c¹nh liªn kÕt mét lêi gäi víi
3.1. Ta khai b¸o mét con trá kiÓu A vµ 4 ®èi tîng: mét ph¬ng thøc. Trë l¹i vÝ dô trong 3.2:
A *p ; // p lµ con trá kiÓu A A *p ; // p lµ con trá kiÓu A
A a ; // a lµ biÕn ®èi tîng kiÓu A A a ; // a lµ biÕn ®èi tîng kiÓu A
B b ; // b lµ biÕn ®èi tîng kiÓu B B b ; // b lµ biÕn ®èi tîng kiÓu B
C c ; // c lµ biÕn ®èi tîng kiÓu C C c ; // c lµ biÕn ®èi tîng kiÓu C
D d ; // d lµ biÕn ®èi tîng kiÓu D D d ; // d lµ biÕn ®èi tîng kiÓu D
XÐt lêi gäi tíi c¸c ph¬ng thøc ¶o hien_thi sau: NÕu hien_thi() lµ c¸c ph¬ng thøc tÜnh, th× dï p
p = &a; // p trá tíi ®èi tîng a cña líp A chøa ®Þa chØ cña c¸c ®èi tîng a, b, c hay d, th× lêi
gäi:
p->hien_thi() ; // Gäi tíi A::hien_thi()
p->hien_thi() ;
p = &b; // p trá tíi ®èi tîng b cña líp B
lu«n lu«n gäi tíi ph¬ng thøc A::hien_thi()
p->hien_thi() ; // Gäi tíi B::hien_thi()
Nh vËy mét lêi gäi (xuÊt ph¸t tõ con trá) tíi ph¬ng
p = &c; // p trá tíi ®èi tîng c cña líp C thøc tÜnh lu«n lu«n liªn kÕt víi mét ph¬ng thøc cè
p->hien_thi() ; // Gäi tíi C::hien_thi() ®Þnh vµ sù liªn kÕt nµy x¸c ®Þnh trong qu¸ tr×nh
biªn dÞch ch¬ng tr×nh.
p = &d; // p trá tíi ®èi tîng d cña líp D
Còng víi lêi gäi:
p->hien_thi() ; // Gäi tíi D::hien_thi()
p->hien_thi() ;
nh trªn, nhng nÕu hien_thi() lµ c¸c ph¬ng thøc ¶o, th×
3.3. T¬ng øng béi lêi gäi nµy kh«ng liªn kÕt cøng víi mét ph¬ng thøc cô
333 334
thÓ nµo. Ph¬ng thøc mµ nã liªn kÕt (gäi tíi) cßn cha
Chóng ta nhËn thÊy cïng mét c©u lÖnh x¸c ®Þnh trong giai ®o¹n dÞch ch¬ng tr×nh. Lêi gäi
p->hien_thi(); nµy sÏ:
t¬ng øng víi nhiÒu ph¬ng thøc kh¸c nhau. §©y chÝnh + liªn kÕt víi A::hien_thi() , nÕu p chøa ®Þa chØ
lµ t¬ng øng béi. Kh¶ n¨ng nµy râ rµng cho phÐp xö lý ®èi tîng líp A
nhiÒu ®èi tîng kh¸c nhau, nhiÒu c«ng viÖc, thËm chÝ + liªn kÕt víi B::hien_thi() , nÕu p chøa ®Þa chØ
nhiÒu thuËt to¸n kh¸c nhau theo cïng mét c¸ch thøc, ®èi tîng líp B
cïng mét lîc ®å. §iÒu nµy sÏ ®îc minh ho¹ trong c¸c
+ liªn kÕt víi C::hien_thi() , nÕu p chøa ®Þa chØ
môc tiÕp theo.
®èi tîng líp C
+ liªn kÕt víi D::hien_thi() , nÕu p chøa ®Þa chØ q = &a;
®èi tîng líp D Sai v×: G¸n ®Þa chØ ®èi tîng cña líp c¬ së A cho
Nh vËy mét lêi gäi (xuÊt ph¸t tõ con trá) tíi ph¬ng con trá cña líp dÉn xuÊt B
thøc ¶o kh«ng liªn kÕt víi mét ph¬ng thøc cè ®Þnh,
3.6. VÝ dô
mµ tuú thuéc vµo néi dung con trá. §ã lµ sù liªn kÕt
®éng vµ ph¬ng thøc ®îc liªn kÕt (®îc gäi) thay ®æi Ta söa ch¬ng tr×nh trong §1 b»ng c¸ch ®Þnh nghÜa
mçi khi cã sù thay ®æi néi dung con trá trong qu¸ c¸c ph¬ng thøc xuat() lµ ¶o. Khi ®ã bèn c©u lÖnh:
tr×nh ch¹y ch¬ng tr×nh.
hien(&a); 335 336
3.5. Quy t¾c g¸n ®Þa chØ ®èi tîng cho con trá hien(&b);
líp c¬ së hien(&c);
+ Nh ®· nãi trong §1, C++ cho phÐp g¸n ®Þa chØ hien(&d);
®èi tîng cña mét líp dÉn xuÊt cho con trá cña líp c¬ trong hµm main (cña ch¬ng tr×nh díi ®©y) sÏ lÇn lît
së. Nh vËy c¸c phÐp g¸n sau (xem 3.2) lµ ®óng: gäi tíi 4 ph¬ng thøc kh¸c nhau:
A *p ; // p lµ con trá kiÓu A A::xuat()
A a ; // a lµ biÕn ®èi tîng kiÓu A B::xuat()
B b ; // b lµ biÕn ®èi tîng kiÓu B C::xuat()
C c ; // c lµ biÕn ®èi tîng kiÓu C
D::xuat()
D d ; // d lµ biÕn ®èi tîng kiÓu D
//CT6-01B
p = &a; // p vµ a cïng líp A
// Phuong thuc ¶o vµ t¬ng øng béi
p = &b; // p lµ con trá líp c¬ së, b lµ ®èi tîng líp
#include <conio.h>
dÉn xuÊt
#include <stdio.h>
p = &c; // p lµ con trá líp c¬ së, c lµ ®èi tîng líp
dÉn xuÊt #include <iostream.h>
p = &d; // p lµ con trá líp c¬ së, d lµ ®èi tîng líp #include <ctype.h>
dÉn xuÊt class A
+ Tuy nhiªn cÇn chó ý lµ: Kh«ng cho phÐp g¸n {
®Þa chØ ®èi tîng cña líp cë së cho con trá cña líp dÉn private:
xuÊt. Nh vËy vÝ dô sau lµ sai:
int n;
B *q ;
public:
A a;
A()
{ }
n=0; };
} class C:public A
A(int n1) {
{ public:
n=n1; C():A()
} {
virtual void xuat() }
{
C(int n1):A(n1)
cout << "\nLop A: "<< n; 337 338
{
}
}
int getN()
{ void xuat()
return n; {
} cout << "\nLop C: "<<getN();
}; }
class B:public A };
{ class D:public C
public: {
B():A() public:
{ D():C()
{
}
}
B(int n1):A(n1)
D(int n1):C(n1)
{ {
} }
void xuat() void xuat()
{ {
cout << "\nLop B: "<<getN(); cout << "\nLop D: "<<getN();
} § 4. Sù linh ho¹t cña ph¬ng thøc ¶o trong ph¸t
}; triÓn n©ng cÊp ch¬ng tr×nh
void hien(A *p)
{ VÝ dô vÒ c¸c líp TS vµ TS2 trong §2 ®· chØ ra sù h¹n
p->xuat(); chÕ cña ph¬ng thøc tÜnh trong viÖc sö dông tÝnh
thõa kÕ ®Ó n©ng cÊp, ph¸t triÓn ch¬ng tr×nh. Trong
}
§2 còng ®· chØ ra líp TS2 cha ®¸p øng ®îc yªu cÇu
void main() nªu ra lµ in ®Þa chØ cña thÝ sinh. Gi¶i ph¸p cho vÊn
{ ®Ò nµy rÊt ®¬n gi¶n: Thay c¸c ph¬ng thøc tÜnh in()
A a(1); b»ng c¸ch dïng chóng nh c¸c ph¬ng thøc ¶o. Ch¬ng
tr×nh khi ®ã sÏ nh sau:
B b(2);
C c(3); //CT6-03B
D d(4); // Sù linh ho¹t cña ph¬ng thøc ¶o
clrscr(); // Lop TS TS2
hien(&a); #include <conio.h>
hien(&b); #include <stdio.h>
hien(&c); #include <iostream.h>
hien(&d); 339 340
#include <ctype.h>
getch();
class TS
}
{
3.5. Sù thõa kÕ cña c¸c ph¬ng thøc ¶o private:
Còng gièng nh c¸c ph¬ng thøc th«ng thêng kh¸c, char ht[25];
ph¬ng thøc ¶o còng cã tÝnh thõa kÕ. Ch¼ng h¹n trong int sobd;
ch¬ng tr×nh trªn (môc 3.4) ta bá ®i ph¬ng thøc
float td;
xuat() cña líp D, th× c©u lÖnh:
public:
hien(&d) ;
void nhap()
(c©u lÖnh gÇn cuèi trong hµm main) sÏ gäi tíi C::xuat()
, ph¬ng thøc nµy ®îc kÕ thõa trong líp D (v× D dÉn {
xuÊt tõ C). cout << "\nHo ten: " ;
fflush(stdin); gets(ht);
cout << "So bao danh: " ; {
cin >> sobd; TS::nhap();
cout << "Tong diem: " ; cout << "Dia chi: " ;
cin >> td; fflush(stdin); gets(dc);
} }
virtual void in() void in()
{ {
fprintf(stdprn,"\n\nHo ten: %s", ht); TS::in();
fprintf(stdprn,"\nSo bao danh: %d", sobd); fprintf(stdprn,"\nDia chi: %s", dc);
fprintf(stdprn,"\nTong diem: %0.1f", td); }
} };
void xem_in() void main()
{ {
int ch; TS2 t[100];
cout << "\nHo ten: " << ht ; int i, n;
cout << "\nCo in khong? - C/K" ; cout << "\nSo thi sinh: ";
ch = toupper(getch()); cin >> n;
if (ch=='C')
for (i=1; i<=n; ++i)
this->in(); // V× in() lµ ph¬ng thøc ¶o nªn
t[i].nhap(); 341 342
//cã thÓ gäi ®Õn TS::in() hoÆc TS2::in()
for (i=1; i<=n; ++i)
}
t[i].xem_in();
};
getch();
class TS2:public TS
}
{
private: Khi thùc hiÖn ch¬ng tr×nh nµy, chóng ta nhËn thÊy:
D÷ liÖu thÝ sinh in ra ®· cã ®Þa chØ. §iÒu nµy cã thÓ
char dc[30] ; // Dia chi
gi¶i thÝch nh sau:
public:
XÐt c©u lÖnh (thø 2 tõ díi lªn trong hµm main):
void nhap()
t[i].xem_in() ;
C©u lÖnh nµy gäi tíi ph¬ng thøc xem_in cña líp TS2 5.1. Líp c¬ së trõu tîng
(v× t[i] lµ ®èi tîng cña líp TS2). Nhng líp TS2 kh«ng Mét líp c¬ së trõu tîng lµ mét líp chØ ®îc dïng
®Þnh nghÜa ph¬ng thøc xem_in, nªn ph¬ng thøc lµm c¬ së cho c¸c líp kh¸c. Kh«ng hÒ cã ®èi tîng nµo
TS::xem_in() sÏ ®îc gäi tíi. H·y theo râi ph¬ng thøc cña mét líp trõu tîng ®îc t¹o ra c¶, bëi v× nã chØ ®îc
nµy: dïng ®Ó ®Þnh nghÜa mét sè kh¸i niÖm tæng qu¸t,
void xem_in() chung cho c¸c líp kh¸c. Mét vÝ dô vÒ líp trõu tîng lµ líp
{ CON_VAT (con vËt), nã sÏ dïng lµm c¬ së ®Ó x©y dùng
int ch; c¸c líp con vËt cô thÓ nh líp CON_CHO (con chã),
CON_MEO (con mÌo),... (xem vÝ dô bªn díi)
cout << "\nHo ten: " << ht ;
cout << "\nCo in khong? - C/K" ; Trong C++ , thuËt ng÷ “Líp trõu tîng” ®Æc biÖt ¸p
dông cho c¸c líp cã chøa c¸c ph¬ng thøc ¶o thuÇn tuý.
ch = toupper(getch());
Ph¬ng thøc ¶o thuÇn tuý lµ mét ph¬ng thøc ¶o mµ néi
this->in(); // V× in() lµ ph¬ng thøc ¶o nªn dung cña nã kh«ng cã g×. C¸ch thøc ®Þnh nghÜa mét
//cã thÓ gäi ®Õn TS::in() hoÆc ph¬ng thøc ¶o thuÇn tuý nh sau:
TS2::in()
virtual void tªn_ph¬ng_thøc() = 0 ;
}
VÝ dô:
C¸c lÖnh ®Çu cña ph¬ng thøc sÏ in hä tªn thÝ sinh.
NÕu chän Cã (bÊm phÝm C), th× c©u lÖnh: class A
this->in() ; {
sÏ ®îc thùc hiÖn. §Þa chØ cña t[i] (lµ ®èi tîng cña líp public:
TS2) ®îc truyÒn cho con trá this (cña líp c¬ së TS). V× virtual void nhap() = 0 ;
in() lµ ph¬ng thøc ¶o vµ v× this ®ang trá tíi ®èi tîng virtual void xuat() = 0 ;
t[i] cña líp TS2, nªn c©u lÖnh nµy gäi tíi ph¬ng thøc
void chuong();
TS2::in(). Trong ph¬ng thøc TS2::in() cã in ®Þa chØ
cña thÝ sinh. };
Nh vËy viÖc sö dông c¸c ph¬ng thøc tÜnh in() (trong Trong vÝ dô trªn, th× A lµ líp c¬ së trõu tîng. C¸c ph-
c¸c líp TS vµ TS2) ®· kh«ng ®¸p øng ®îc yªu cÇu ph¸t ¬ng thøc nhap vµ xuat ®îc khai b¸o lµ c¸c líp ¶o thuÇn
triÓn ch¬ng tr×nh. Cã mét gi¶i ph¸p rÊt ®¬n gi¶n lµ: tuý (b»ng c¸ch g¸n sè 0 cho chóng thay cho viÖc cµi
§Þnh nghÜa c¸c ph¬ng thøc in() trong c¸c líp TS vµ ®Æt c¸c ph¬ng thøc nµy). Ph¬ng thøc chuong() lµ
TS2 nh c¸c ph¬ng thøc ¶o (virtual). mét ph¬ng thøc b×nh thêng vµ sÏ ph¶i cã mét ®Þnh
nghÜa ë ®©u ®ã cho ph¬ng thøc nµy. 343 344
§ 5. Líp c¬ së trõu tîng Kh«ng cã ®èi tîng nµo cña mét líp trõu tîng l¹i cã
thÓ ®îc ph¸t sinh. Tuy nhiªn c¸c con trá vµ c¸c biÕn
tham chiÕu ®Õn c¸c ®èi tîng cña líp trõu tîng th× vÉn + XuÊt (®em b¸n) mét con vËt (hoÆc chã, hoÆc
hîp lÖ. BÊt kú líp nµo dÉn xuÊt tõ mét líp cí së trõu tîng mÌo).
ph¶i ®Þnh nghÜa l¹i tÊt c¶ c¸c ph¬ng thøc thuÇn ¶o + Thèng kª c¸c con vËt ®ang nu«i trong 20 «.
mµ nã thõa hëng, hoÆc b»ng c¸c ph¬ng thøc ¶o
Ch¬ng tr×nh ®îc tæ chøc nh sau:
thuÇn tuý, hoÆc b»ng nh÷ng ®Þnh nghÜa thùc sù. VÝ
dô: + Tríc tiªn ®Þnh nghÜa líp CON_VAT lµ líp c¬ së ¶o.
Líp nµy cã mét thuéc tÝnh lµ tªn con vËt vµ mét ph-
class B : public A
¬ng thøc ¶o dïng ®Ó xng tªn.
{
+ Hai líp lµ CON_MEO vµ CON_CHO ®îc dÉn xuÊt tõ
public: líp CON_VAT
virtual void nhap() = 0 ; + Cuèi cïng lµ líp DS_CON_VAT (Danh s¸ch con vËt)
virtual void xuat() dïng ®Ó qu¶n lý chung c¶ mÌo vµ chã. Líp nµy cã 3
{ thuéc tÝnh lµ: sè con vËt cùc ®¹i (chÝnh b»ng sè «), sè
con vËt ®ang nu«i vµ mét m¶ng con trá kiÓu
// C¸c c©u lÖnh CON_VAT. Mçi phÇn tö m¶ng sÏ chøa ®Þa chØ cña mét
} ®èi tîng kiÓu CON_MEO hoÆc CON_CHO.
}; Líp sÏ cã 3 ph¬ng thøc ®Ó thùc hiÖn 3 chøc n¨ng
nªu trªn cña ch¬ng tr×nh. Néi dung ch¬ng tr×nh nh
Theo ý nghÜa vÒ híng ®èi tîng, ta vÉn cã thÓ cã
sau:
mét líp trõu tîng mµ kh«ng nhÊt thiÕt ph¶i chøa ®ùng
nh÷ng ph¬ng thøc thuÇn tuý ¶o. //CT6-04
Mét c¸ch tæng qu¸t mµ nãi th× bÊt kú líp nµo mµ // Lop co so truu tuong
nã chØ ®îc dïng lµm c¬ së cho nh÷ng líp kh¸c ®Òu cã // Lop CON_VAT
thÓ ®îc gäi lµ “líp trõu tîng”. Mét c¸ch dÔ dµng ®Ó #include <conio.h>
nhËn biÕt mét líp trõu tîng lµ xem cã dïng líp ®ã ®Ó #include <stdio.h>
khai b¸o c¸c ®èi tîng hay kh«ng? . NÕu kh«ng th× ®ã
#include <iostream.h>
lµ líp c¬ së trõu tîng.
#include <ctype.h>
5.2. VÝ dô #include <string.h>
Gi¶ sö cã 20 «, mçi « cã thÓ nu«i mét con chã hoÆc class CON_VAT
mét con mÌo. Yªu cÇu x©y dùng ch¬ng tr×nh gåm c¸c {
chøc n¨ng: protected:
+ NhËp mét con vËt míi mua (hoÆc chã, hoÆc mÌo) char *ten;
vµo « rçng ®Çu tiªn.
public:
CON_VAT() {
{ public:
ten = NULL; CON_CHO() : CON_VAT()
} {
CON_VAT(char *ten1)
}
{ 345 346 CON_CHO(char *ten1) : CON_VAT(ten1)
ten = strdup(ten1);
{
}
}
virtual void xung_ten()
virtual void xung_ten()
{
{
}
cout << "\nToi la chu cho: " << ten ;
};
}
class CON_MEO:public CON_VAT
};
{
class DS_CON_VAT // Danh sach con vat
public: {
CON_MEO() : CON_VAT() private:
{ int max_so_con_vat;
} int so_con_vat;
CON_MEO(char *ten1) : CON_VAT(ten1) CON_VAT **h ;
{ public:
} DS_CON_VAT(int max);
virtual void xung_ten() ~DS_CON_VAT();
{ int nhap(CON_VAT *c);
cout << "\nToi la chu meo: " << ten ; CON_VAT* xuat(int n);
} void thong_ke();
}; };
DS_CON_VAT::DS_CON_VAT(int max)
class CON_CHO:public CON_VAT
{ --n ;
max_so_con_vat = max; if (h[n])
so_con_vat = 0; {
h = new CON_VAT*[max]; CON_VAT *c = h[n];
for (int i=0; i<max; ++i) h[n]=NULL;
h[i] = NULL; so_con_vat-- ;
} return c;
DS_CON_VAT::~DS_CON_VAT() }
347 348 else
{
return NULL;
max_so_con_vat = 0;
}
so_con_vat = 0;
void DS_CON_VAT::thong_ke()
delete h;
{
}
if (so_con_vat)
int DS_CON_VAT::nhap(CON_VAT *c) {
{ cout << "\n" ;
if (so_con_vat==max_so_con_vat) for (int i=0; i<max_so_con_vat; ++i)
return 0; if (h[i])
int i=0; h[i]->xung_ten();
while (h[i]!=NULL) ++i; }
h[i]=c; }
so_con_vat++ ; CON_CHO c1("MUC");
return (i+1); CON_CHO c2("VEN");
} CON_CHO c3("LAI");
CON_VAT* DS_CON_VAT::xuat(int n) CON_CHO c4("NHAT");
{ CON_CHO c5("BONG");
if (n<1 || n > max_so_con_vat) CON_MEO m1("MUOP");
return NULL ; CON_MEO m2("DEN");
CON_MEO m3("TRANG"); }
CON_MEO m4("TAM THE"); lµ ph¬ng thøc ¶o, ®îc ®Þnh nghÜa ®Çy ®ñ , mÆc dï
CON_MEO m5("VANG"); th©n cña nã lµ rçng.
void main() Do vËy khai b¸o:
{ CON_VAT cv(“Con vat chung”);
DS_CON_VAT d(20); vÉn ®îc C++ chÊp nhËn.
clrscr(); B©y giê nÕu ®Þnh nghÜa l¹i ph¬ng thøc xung_ten
nh sau:
d.nhap(&c1);
virtual void xung_ten() = 0 ;
int im2 = d.nhap(&m2);
th× nã trë thµnh ph¬ng thøc thuÇn ¶o vµ C++ sÏ quan
d.nhap(&c3); niÖm líp CON_VAT lµ líp trõu tîng. Khi ®ã c©u lÖnh
d.nhap(&m1); khai b¸o:
int ic4 = d.nhap(&c4); 349 350 CON_VAT cv(“Con vat chung”);
d.nhap(&c5); sÏ bÞ C++ b¾t lçi víi th«ng b¸o:
d.nhap(&m5); Cannot create instance of abstruct class ‘CON_VAT’
d.nhap(&c2);
d.nhap(&m3);
§ 6. Sö dông t¬ng øng béi vµ ph¬ng thøc ¶o
d.thong_ke();
d.xuat(im2); 6.1. ChiÕn lîc sö dông t¬ng øng béi
d.xuat(ic4); T¬ng øng béi cho phÐp xÐt c¸c vÊn ®Ò kh¸c nhau,
d.thong_ke(); c¸c ®èi tîng kh¸c nhau, c¸c ph¬ng ph¸p kh¸c nhau,
getch(); c¸c c¸ch gi¶i quyÕt kh¸c nhau theo cïng mét lîc ®å
} chung.
Chó ý: Theo quan ®iÓm chung vÒ c¸ch thøc sö C¸c bíc ¸p dông t¬ng øng béi cã thÓ tæng kÕt l¹i nh
dông, th× líp CON_VAT lµ líp c¬ së trõu tîng. Tuy nhiªn sau:
theo quan ®iÓm cña C++ th× líp nµy cha ph¶i lµ líp 1. X©y dùng líp c¬ së trõu tîng bao gåm nh÷ng
c¬ së trõu tîng, v× trong líp kh«ng cã c¸c ph¬ng thøc thuéc tÝnh chung nhÊt cña c¸c thùc thÓ cÇn qu¶n lý. §-
thuÇn tuý ¶o. Ph¬ng thøc xung_ten: a vµo c¸c ph¬ng thøc ¶o hay thuÇn ¶o dïng ®Ó x©y
virtual void xung_ten() dùng c¸c nhãm ph¬ng thøc ¶o cho c¸c líp dÉn xuÊt
sau nµy. Mçi nhãm ph¬ng thøc ¶o sÏ thùc hiÖn mét
{
chøc n¨ng nµo ®ã trªn c¸c líp.
2. X©y dùng c¸c líp dÉn xuÊt b¾t ®Çu tõ líp c¬ së vµ VUONG. Sö dông ph¬ng thøc draw gäi tõ 4 phÇn tö
¶o. Sè møc dÉn xuÊt lµ kh«ng h¹n chÕ. C¸c líp dÉn m¶ng nãi trªn sÏ nhËn ®îc mét bøc tranh. B»ng c¸ch
xuÊt sÏ m« t¶ c¸c ®èi tîng cô thÓ cÇn qu¶n lý. ho¸n vÞ c¸c phÇn tö nµy, sÏ nhËn ®îc tÊt c¶ c¸c bøc
3. X©y dùng c¸c ph¬ng thøc ¶o trong c¸c dÉn xuÊt. tranh kh¸c nhau.
C¸c ph¬ng thøc nµy t¹o thµnh c¸c nhãm ph¬ng thøc //CT6-05
¶o trong s¬ ®å c¸c líp cã quan hÖ thõa kÕ. // Lop co so truu tuong
4. X©y dùng líp qu¶n lý c¸c ®èi tîng. D÷ liÖu cña líp // Lop hinh hoc
nµy lµ mét dÉy con trá cña líp c¬ së trõu tîng ban
#include <conio.h>
®Çu. C¸c con trá nµy cã thÓ chøa ®Þa chØ ®èi tîng
cña c¸c líp dÉn xuÊt. Do vËy cã thÓ dïng c¸c con trá #include <graphics.h>
nµy ®Ó thùc hiÖn c¸c thao t¸c trªn c¸c ®èi tîng cña class HINH
bÊt kú líp dÉn xuÊt nµo. {
private:
6.2. VÝ dô
int mau;
Ch¬ng tr×nh qu¶n lý c¸c con vËt trong §5 lµ mét vÝ
public:
dô vÒ c¸ch sö dông t¬ng øng béi. Díi ®©y lµ mét vÝ
dô kh¸c. Gi¶ sö cã 4 h×nh vÏ: §o¹n th¼ng, h×nh trßn, HINH(int m)
h×nh ch÷ nhËt vµ h×nh vu«ng. Bèn h×nh cho hiÖn {
th¼ng hµng trªn mµn h×nh t¹o thµnh mét bøc tranh. mau = m;
NÕu thay ®æi thø tù c¸c h×nh sÏ nhËn ®îc c¸c bøc }
tranh kh¸c nhau. Ch¬ng tr×nh díi ®©y sÏ cho hiÖn tÊt
getmau()
c¶ c¸c bøc tranh kh¸c nhau. Ch¬ng tr×nh ®îc tæ chøc
theo c¸c bíc nªu trong 6.1: {
+ Líp c¬ së trõu tîng lµ líp HINH (h×nh) gåm mét return mau;
thuéc tÝnh mau (mÇu) vµ mét ph¬ng thøc ¶o thuÇn }
tuý: virtual void draw(int x, int y) = 0;
virtual void draw(int x, int y) = 0 ;
351 352 };
+ C¸c líp dÉn xuÊt trùc tiÕp tõ líp h×nh lµ : DTHANG class DTHANG : public HINH
, HTRON vµ CHUNHAT. {
+ Líp VUONG dÉn xuÊt tõ líp CHUNHAT. private:
+ Líp qu¶n lý chung lµ líp picture cã thuéc tÝnh lµ int dodai;
mét m¶ng con trá kiÓu HINH gåm 4 phÇn tö dïng ®Ó public:
chøa ®Þa chØ 4 ®èi tîng: DTHANG, HTRON, CHUNHAT
DTHANG(int d, int m):HINH(m) {
{ public:
dodai = d ; VUONG(int a, int m): CHUNHAT(a,a,m)
} {
virtual void draw(int x, int y) }
{ };
setcolor(getmau()) ; class HTRON: public HINH
line(x,y,x+dodai,y); {
} private:
}; int bk; //Ban kinh
class CHUNHAT: public HINH public:
{ HTRON(int bk1, int m):HINH(m)
private: {
int rong, cao; bk = bk1;
public: }
CHUNHAT(int r, int c, int m):HINH(m) virtual void draw(int x, int y)
{ {
rong = r; cao = c; setcolor(getmau()) ;
} circle(x+bk,y+bk,bk);
virtual void draw(int x, int y ) setfillstyle(1,getmau());
floodfill(x + bk, y + bk,getmau());
{
}
setcolor(getmau()) ;
};
rectangle(x,y,x+rong,y+cao);
class picture
setfillstyle(1,getmau());
{
floodfill(x+rong/2,y+cao/2, getmau() );
private:
} HINH *h[4];
}; 353 354
public:
class VUONG : public CHUNHAT
picture(HINH *h0,HINH *h1,HINH *h2,HINH k[2]=i3;k[3]=i4;
*h3) paint(k);
{ getch(); 355 356
h[0]=h0;
cleardevice();
h[1]=h1;
}
h[2]=h2;
}
h[3]=h3;
} DTHANG dt(120,14);
void paint(int *k); HTRON ht(60,RED);
void listpaint(); CHUNHAT cn(120,100,MAGENTA);
}; VUONG v(120,CYAN);
void picture::paint(int *k) };
{ void main()
for (int i=0; i<4; ++i) {
h[k[i]]->draw(10+i*150, 200); int mh=0,mode=0;
} initgraph(&mh,&mode,"");
void picture::listpaint() picture pic(&dt,&ht,&cn,&v);
{ pic.listpaint();
int k[4],i1,i2,i3,i4; getch();
for (i1=0;i1<4;++i1) closegraph();
for (i2=0;i2<4;++i2) }
if (i2!=i1)
for (i3=0;i3<4;++i3) § 7. Xö lý c¸c thuËt to¸n kh¸c nhau
if (i3!=i2 && i3!=i1)
Cã thÓ sö dông t¬ng øng béi ®Ó tæ chøc thùc hiÖn
for (i4=0;i4<4;++i4)
c¸c thuËt to¸n kh¸c nhau trªn cïng mét bµi to¸n nh sau:
if (i4!=i3 && i4!=i2 && i4!=i1)
+ Líp c¬ së trõu tîng sÏ chøa d÷ liÖu bµi to¸n vµ mét
{ ph¬ng thøc ¶o.
k[0]=i1;k[1]=i2;
+ Mçi líp dÉn xuÊt øng víi mét thuËt to¸n cô thÓ. Ph- + Ba líp dÉn xuÊt lµ: SELECT_SORT, QUICK_SORT vµ
¬ng thøc ¶o cña líp dÉn xuÊt sÏ thùc hiÖn mét thuËt HEAP_SORT. Mçi líp ®Òu cã ph¬ng thøc ¶o:
to¸n cô thÓ. virtual void sapxep(int *a1, long n) ;
+ Sö dông mét m¶ng con trá cña líp c¬ së vµ g¸n ®Ó thùc hiÖn hiÖn viÖc s¾p xÕp theo theo mét thuËt
cho mçi phÇn tö m¶ng ®Þa chØ cña mét ®èi tîng to¸n cô thÓ.
cña líp dÉn xuÊt. Sau ®ã dïng c¸c phÇn tö m¶ng con
+ Trong hµm main() sÏ t¹o ra mét dÉy 30000 sè
trá ®Ó gäi tíi c¸c ph¬ng thøc ¶o. B»ng c¸ch ®ã sÏ thùc
nguyªn mét c¸ch ngÉu nhiªn, sau ®ã lÇn lît sö dông 3
hiÖn cïng mét bµi to¸n theo c¸c thuËt to¸n kh¸c nhau
thuËt to¸n s¾p xÕp ®Ó so s¸nh. KÕt qu¶ nh sau:
vµ dÔ dµng so s¸nh hiªô qu¶ cña c¸c thuËt to¸n.
Thêi gian s¾p xÕp theo thuËt to¸n Select sort lµ:
VÝ dô sau minh ho¹ viÖc thùc hiÖn bµi to¸n s¾p xÕp
19.20 gi©y
dÉy sè nguyªn theo thø tù t¨ng b»ng c¸ch dïng ®ång
thêi 3 thuËt to¸n: ThuËt to¸n lùa chän (Select_Sort), Thêi gian s¾p xÕp theo thuËt to¸n Quick sort lµ:
357 358
thuËt to¸n s¾p xÕp nhanh (Quick_Sort) vµ thuËt to¸n 0.11 gi©y
vun ®èng (Heap_Sort). Ch¬ng tr×nh gåm 4 líp: Thêi gian s¾p xÕp theo thuËt to¸n Heap sort lµ:
+ Líp c¬ së trõu tîng: 0.44 gi©y
class sort Néi dung ch¬ng tr×nh nh sau:
{ //CT6-06
protected: // Lop co so truu tuong
int *a; // Lop sort
void hoan_vi(long i, long j) ; #include <conio.h>
#include <stdio.h>
public:
#include <time.h>
virtual void sapxep(int *a1, long n) ;
#include <stdlib.h>
}; #include <iostream.h>
Líp nµy gåm: #include <dos.h>
- Mét thµnh phÇn d÷ liÖu lµ con trá a trá tíi mét class sort
vïng nhí chøa dÉy sè nguyªn cÇn s¾p xÕp.
{
- Ph¬ng thøc hoan_vi(i,j) dïng ®Ó ho¸n vÞ c¸c phÇn
tö a[i] vµ a[j]. Ph¬ng thøc nµy ®îc dïng trong 3 líp dÉn protected:
xuÊt bªn díi. int *a;
- Ph¬ng thøc ¶o sapxep(a1,n) dïng ®Ó s¾p xÕp dÉy void hoan_vi(long i, long j)
n sè nguyªn chøa trong m¶ng a1. {
int tg = a[i]; class quick_sort : public sort
a[i] = a[j]; {
a[j] = tg; private:
} void q_sort(long l, long r);
public: public:
virtual void sapxep(int *a1, long n) virtual void sapxep(int *a1, long n) ;
{ };
void quick_sort::q_sort(long l, long r)
a = a1;
{
}
int x;
};
long i,j;
class select_sort : public sort
if (l < r)
{
{
public: x = a[l]; i = l; j = r+1;
virtual void sapxep(int *a1, long n) ; do 359 360
}; {
void select_sort::sapxep(int *a1, long n) ++i; --j;
{ while (i<r && a[i] < x) ++i ;
long i,j,r; while (a[j] > x) --j ;
sort::sapxep(a1,n); if (i<j) hoan_vi(i,j);
for (i=1; i<n; ++i) } while (i<j);
{ hoan_vi(l,j);
r=i; q_sort(l,j-1);
for (j=i+1; j<=n; ++j) q_sort(j+1,r);
if(a[j] < a[r]) r = j; }
if(r!=i) hoan_vi(i,r); }
} void quick_sort::sapxep(int *a1, long n)
} {
sort::sapxep(a1,n);
q_sort(1,n); hoan_vi(i,k);
} shift(k,n);
class heap_sort : public sort }
{ }
private: void heap_sort::sapxep(int *a1, long n)
void shift(long i, long n); {
public: long i;
virtual void sapxep(int *a1, long n) ; sort::sapxep(a1,n);
}; /* Tao dong */
void heap_sort::shift(long i, long n) for (i=n/2 ; i>=1; --i) shift(i,n);
{ /* Lap */
long l,r,k; for (i=n ; i>=2; --i)
l = 2*i; r = l+1; {
if (l>n) return; hoan_vi(1,i);
if (l==n) shift(1,i-1);
{ }
361 362
if (a[i]<a[l]) hoan_vi(i,l); }
return; void main()
} {
if (a[l] > a[r]) long i,n;
k = l; struct time t1,t2;
else int *a, k, tg, sec, hund;
k = r; n=30000;
if (a[i]>=a[k]) a=(int*) malloc((n+1)*sizeof(int));
return; if (a==NULL)
else {
{ puts("\nLoi BN");
getch(); }
exit(0);
}
sort *s[3];
select_sort ss;
quick_sort qs;
heap_sort hs;
s[0]=&ss; s[1]=&qs; s[2]=&hs;
clrscr();
for (k=0; k<3; ++k)
{
srand(5000);
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;
363
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();

You might also like