Giáo trình Lập trình hướng đối tượng với C++ - Bài toán quan hệ gia đình

Phô lôc 3  
Bµi to¸n quan hÖ gia ®×nh  
Trong môc nµy, ta sÏ x©y dùng ch-¬ng tr×nh cho bµi to¸n quan hÖ gia  
®×nh ®· ®-îc ph©n tÝch ë ch-¬ng mét. Theo nh- sù ph©n tÝch ban ®Çu cña bµi  
to¸n, ta cã mét tËp c¸c c¸ thÓ vµ m« t¶ b»ng líp Con ng-êi bao gåm c¸c  
thuéc tÝnh tªn, anh em, cha mÑ, ... vµ c¸c ph-¬ng thøc sinh, c-íi, ... Nh-ng  
ta cã nhËn xÐt r»ng ph-¬ng thøc sinh chØ thùc hiÖn ®-îc trªn nh÷ng c¸ thÓ lµ  
n÷ vµ ph-¬ng thøc c-íi chØ x¶y ra cho hai c¸ thÓ kh¸c giíi. Nh- vËy cã sù  
ph©n chia tËp ®èi t-îng cña bµi to¸n thµnh hai líp kh¸c nhau lµ Nam vµ N÷.  
Râ rµng, hai líp nµy ph¶i kÕ thõa tõ líp Con ng-êi. Líp con ng-êi sÏ chøa  
c¸c thuéc tÝnh vµ ph-¬ng thøc chung, dï c¸ thÓ lµ Nam hay N÷ còng ®Òu  
ph¶i cã. Ngoµi c¸ thµnh phÇn ®-îc kÕ thõa tõ líp Con ng-êi, líp Nam cã  
thªm thuéc tÝnh Vî, líp N÷ cã thªm thuéc tÝnh Chång vµ ph-¬ng thøc Sinh  
con. ThiÕt kÕ c¸c líp ban ®Çu cña bµi to¸n nh- h×nh d-íi ®©y.  
Con ng-êi  
Tªn  
Cha mÑ  
Anh em  
Con c¸i  
Giíi tÝnh  
C-íi  
Nam  
N÷  
Vî  
Chång  
Sinh con  
ThiÕt kÕ s¬ bé c¸c líp cña bµi to¸n  
Ph-¬ng thøc Giíi tÝnh dïng ®Ó tr¶ lêi xem mét c¸ thÓ ®ã lµ Nam hay  
N÷. NÕu lµ Nam kÕt qu¶ lµ 1 cßn lµ kÕt qu¶ lµ 0. Râ rµng t¹i líp Con ng-êi  
-297-  
Ng«n ng÷ C++  
ph-¬ng thøc Giíi tÝnh kh«ng thÓ tr¶ lêi ®-îc ®ã lµ Nam hay N÷. C©u tr¶ lêi  
chØ x¸c ®Þnh t¹i c¸c ph-¬ng thøc Giíi tÝnh ë líp kÕ thõa Nam vµ N÷. Ph-¬ng  
thøc Giíi tÝnh ë líp Nam tr¶ kÕt qu¶ lµ 1 cßn ë líp N÷ tr¶ kÕt qu¶ lµ 0. §Ó  
thùc hiÖn ®-îc kÜ thuËt nµy, ta dïng kÜ thuËt hµm ¶o trong LTH§T. LËp luËn  
t-¬ng tù cho ph-¬ng thøc C-íi, bëi v× ph-¬ng thøc nµy cÇn biÕt c-íi chång  
hay c-íi vî. §Ó tr¶ lêi cho c¸c c©u hái vÒ mèi quan hÖ gia ®×nh chóng ta  
còng cÇn ph¶i x©y nh÷ng ph-¬ng thøc ®Ó tr¶ lêi c¸c c©u hái nh- Lµ Anh, Lµ  
¤ng(X), v.v... H×nh d-íi ®©y thiÕt kÕ c¸c líp cña bµi to¸n.  
Con ng-êi  
Tªn  
Cha mÑ  
Anh em  
Con c¸i  
Giíi tÝnh <¶o>  
C-íi <¶o>  
Lµ Anh  
Lµ ¤ng  
. . . .  
Nam  
N÷  
Vî  
Chång  
Giíi tÝnh  
C-íi  
Sinh con  
Giíi tÝnh  
C-íi  
ThiÕt kÕ c¸c líp cña bµi to¸n  
Sau ®©y lµ thÓ hiÖn cña c¸c líp d-íi ng«n ng÷ C++ cã bæ sung thªm  
mét sè thuéc tÝnh vµ ph-¬ng thøc phôc vô viÖc cµi ®Æt líp.  
class Nguoi {  
friend class Nam;  
friend class Nu;  
-298-  
Bµi to¸n quan hÖ gia ®×nh  
char Ten[25];  
Nam *Bo;  
Nu *Me;  
Nguoi *AnhChi[10], *CacEm[10], *CacCon[10];  
int SoAnhChi, SoEm, SoCon;  
Nguoi(char *ten, Nam *bo, Nu *me) :  
Bo(bo), Me(me), SoAnhChi(0), SoEm(0), SoCon(0)  
{
}
strcpy(Ten, ten);  
void ThemAnhChi(Nguoi* nguoi)  
{
AnhChi[SoAnhChi++] = nguoi;  
}
void ThemEm(Nguoi* nguoi)  
{
CacEm[SoEm++] = nguoi;  
}
void ThemCon(Nguoi* nguoi)  
{
CacCon[SoCon++] = nguoi;  
}
public:  
// 1 la Nam, 0 la Nu  
virtual int GioiTinh()=0;  
virtual int Cuoi(Nguoi*)=0;  
int LaCha(Nguoi *);  
int LaMe(Nguoi *);  
int LaCon(Nguoi *);  
-299-  
Ng«n ng÷ C++  
int LaAnh(Nguoi *);  
int LaChi(Nguoi *);  
int LaEm(Nguoi *);  
int LaCo(Nguoi *);  
int LaDi(Nguoi *);  
int LaChu(Nguoi *);  
int LaCau(Nguoi *);  
int LaMo(Nguoi *);  
int LaBac(Nguoi *);  
int LaOngNoi(Nguoi *);  
int LaBaNoi(Nguoi *);  
int LaOngNgoai(Nguoi *);  
int LaBaNgoai(Nguoi *);  
int LaAnhHo(Nguoi *);  
int LaChiHo(Nguoi *);  
int LaEmHo(Nguoi *);  
virtual int LaVo(Nguoi*)=0;  
virtual int LaChong(Nguoi*)=0;  
};  
class Nam : public Nguoi  
{
Nu *Vo;  
int LaVo(Nguoi *) { return 0; }  
public:  
Nam(char *ten, Nam *bo=0, Nu *me=0) :  
Nguoi(ten, bo, me), Vo(0) {}  
int GioiTinh() { return 1; }  
int Cuoi(Nguoi *vo);  
int LaChong(Nguoi * nguoi);  
-300-  
Bµi to¸n quan hÖ gia ®×nh  
};  
class Nu : public Nguoi  
{
Nam *Chong;  
int LaChong(Nguoi *) { return 0; }  
public:  
Nu(char *ten, Nam *bo=0, Nu *me=0):  
Nguoi(ten, bo, me), Chong(0) {}  
int GioiTinh() { return 0; }  
int Cuoi(Nguoi *chong);  
void SinhCon(char* ten, int gioitinh);  
int LaVo(Nguoi * nguoi);  
};  
Ph-¬ng thøc c-íi chØ thùc hiÖn ®èi víi c¸ thÓ ch-a lËp gia ®×nh. Trong  
tr-êng hîp ®· lËp gia ®×nh th× nã sÏ tr¶ ra 0.  
int Nam::Cuoi(Nguoi *vo)  
{
if (Vo||vo->GioiTinh()) return 0;  
Vo = (Nu*)vo;  
Vo->Cuoi(this);  
return 1;  
}
int Nu::Cuoi(Nguoi *chong)  
{
if (Chong||chong->GioiTinh()==0) return 0;  
Chong = (Nam*)chong;  
Chong->Cuoi(this);  
return 1;  
}
-301-  
Ng«n ng÷ C++  
void Nu::SinhCon(char *ten, int gioitinh)  
{
Nguoi* nguoi = TaoNguoi(ten, gioitinh, Chong, this);  
ThemCon(nguoi);  
if (Chong) Chong->ThemCon(nguoi);  
for (int i=0; i<SoCon; i++)  
{
CacCon[i]->ThemEm(nguoi);  
nguoi->ThemAnhChi(CacCon[i]);  
}
}
Trong ph-¬ng thøc sinh con ®· dïng hµm TaoNguoi ®Ó t¹o ra mét thÓ  
hiÖn cña líp Nam hay Nu phô thuéc vµo giíi tÝnh. §èi t-îng míi t¹o ra sÏ  
®-îc gia nhËp vµo céng ®ång vµ ®-îc xem xÐt c¸c mèi quan hÖ sau nµy, chi  
tiÕt vÒ hµm nµy chóng ta sÏ bµn luËn sau. Sau khi ®· cã ®èi t-îng th× c¸c mèi  
quan hÖ gia ®×nh cha, mÑ, con c¸i, anh, chÞ, em ph¶i ®-îc x¸c lËp.  
Thùc hiÖn cµi ®Æt c¸c ph-¬ng thøc tr¶ lêi c©u hái quan hÖ cña líp Con  
ng-êi. §èi víi c¸c mèi quan hÖ gÇn nh- LaAnh, LaCha th× viÖc kiÓm tra rÊt  
®¬n gi¶n th«ng qua c¸c thuéc tÝnh Bo, Me, AnhChi,... cña ®èi t-îng. Nh-ng  
®èi víi mèi quan hÖ xa h¬n chót Ýt nh- LaOngNoi, LaCo, LaChu,... th× trë  
nªn khã kh¨n h¬n nhiÒu. Chóng ta dïng mét ph-¬ng ph¸p kiÓm tra ®¬n gi¶n  
theo m« h×nh to¸n häc. VÝ dô, A lµ «ng néi cña B khi vµ chØ khi trong céng  
®ång tån t¹i mét ®èi t-îng X mµ A lµ cha cña X vµ X lµ cha cña B. Nh- vËy  
®Ó thùc hiÖn ®-îc kiÓm tra nµy th× cÇn ph¶i l-u ®-îc toµn bé c¸c ®èi t-îng  
trong céng ®ång ®Ó phôc vô t×m kiÕm X. Trong ch-¬ng tr×nh dïng mét m¶ng  
tÜnh c¸c con trá tíi ®èi t-îng Con ng-êi ®Ó qu¶n lý céng ®ång ng-êi nµy.  
M¶ng nµy ®-îc khai b¸o nh- mét thµnh phÇn tÜnh cña líp Con ng-êi.  
Ph-¬ng thøc TaoNguoi sÏ t¹o mét ®èi t-îng lµ Nam hoÆc N÷ phô thuéc giíi  
tÝnh truyÒn vµo. §èi t-îng míi t¹o ra sÏ ®-îc thªm vµo céng ®ång. Ph-¬ng  
thøc TimNguoi t×m ®èi t-îng trong céng ®ång cã tªn nh- tªn ®-a vµo, nÕu  
kh«ng t×m thÊy tr¶ vÒ NULL. D-íi ®©y lµ mét sè bæ sung cho líp Con ng-êi.  
class Nguoi  
{
. . .  
-302-  
Bµi to¸n quan hÖ gia ®×nh  
static Nguoi* NhanDan[100];  
static int SoDan;  
public:  
. . .  
static int LaySoDan() { return SoDan; }  
static Nguoi* ThemDan(Nguoi* nguoi)  
{
return NhanDan[SoDan++] = nguoi;  
}
static Nguoi* TaoNguoi(char*, int, Nam *bo=0, Nu *me=0);  
static Nguoi* TimNguoi(char* ten);  
};  
Nguoi* Nguoi::NhanDan[];  
int  
Nguoi::SoDan = 0;  
Nguoi*  
Nguoi::TaoNguoi(char* ten, int gioitinh, Nam *bo, Nu *me)  
{
return gioitinh ? ThemDan(new Nam(ten, bo, me))  
: ThemDan(new Nu(ten, bo, me));  
}
Nguoi* Nguoi::TimNguoi(char* ten)  
{
for (int i=0; i<SoDan; i++)  
if (strcmp(ten, NhanDan[i]->LayTen())==0)  
return NhanDan[i];  
return 0;  
}
-303-  
Ng«n ng÷ C++  
Sau khi ®· tæ chøc ®-îc d÷ liÖu l-u tr÷ con ng-êi chóng ta cã thÓ x©y  
dùng c¸c hµm kiÓm tra quan hÖ nh- d-íi ®©y. A lµ ®èi t-îng gäi hµm kiÓm  
tra, B lµ ®èi t-îng truyÒn vµo, X lµ ®èi t-îng t×m kiÕm NhanDan[i] (dïng  
vßng for ®Ó duyÖt).  
int Nguoi::LaOngNoi(Nguoi *nguoi)  
{
if (GioiTinh()==0) return 0;  
for (int i=0; i<SoDan; i++)  
if (LaCha(NhanDan[i])&&NhanDan[i]->LaCha(nguoi))  
return 1;  
return 0;  
}
int Nguoi::LaBaNoi(Nguoi *nguoi)  
{
if (GioiTinh()) return 0;  
for (int i=0; i<SoDan; i++)  
if (LaMe(NhanDan[i])&&NhanDan[i]->LaCha(nguoi))  
return 1;  
return 0;  
}
Môc ®Ých cña ch-¬ng tr×nh lµ sau khi ®· cã d÷ liÖu ph¶i tr¶ lêi ®-îc c©u  
hái quan hÖ khi ®-a tªn hai ng-êi vµo. Sau khi ng-êi sö dông ®-a tªn vµo  
chóng ta sÏ t×m ®èi t-îng ®ã trong céng ®ång. NÕu t×m thÊy th× gäi hµm ®-a  
ra th«ng b¸o quan hÖ cña hai ®èi t-îng võa t×m thÊy. Trong hµm d-íi ®©y  
thùc hiÖn b»ng c¸ch kiÓm tra c¸c quan hÖ bÒ trªn nÕu tÊt c¶ kh«ng tho¶ m·n  
th× l¹i ®æi ng-îc l¹i ®èi t-îng gäi ph-¬ng thøc ®Ó kiÓm tra.  
char qh[256];  
// ®-a ra th«ng b¸o vÒ quan hÖ cña 2 ®èi t-îng  
char* QuanHe(Nguoi* A, Nguoi* B)  
{
for (int i=1; i<=2; i++)  
{
-304-  
Bµi to¸n quan hÖ gia ®×nh  
strcpy(qh, A->LayTen());  
strcat(qh, " va ");  
strcat(qh, B->LayTen());  
strcat(qh, " co quan he ");  
if (A->LaOngNoi(B))  
return strcat(qh, "ong chau noi");  
if (A->LaBaNoi(B))  
return strcat(qh, "ba chau noi");  
if (A->LaOngNgoai(B))  
return strcat(qh, "ong chau ngoai");  
if (A->LaBaNgoai(B))  
return strcat(qh, "ba chau ngoai");  
if (A->LaCha(B))  
return strcat(qh, "cha con");  
if (A->LaMe(B))  
return strcat(qh, "me con");  
if (A->LaCo(B))  
return strcat(qh, "co chau");  
if (A->LaDi(B))  
return strcat(qh, "di chau");  
if (A->LaChu(B))  
return strcat(qh, "chu chau");  
if (A->LaBac(B))  
return strcat(qh, "bac chau");  
if (A->LaAnh(B))  
return strcat(qh, "anh em");  
if (A->LaChi(B))  
return strcat(qh, "chi em");  
if (A->LaAnhHo(B))  
return strcat(qh, "anh em ho");  
-305-  
Ng«n ng÷ C++  
if (A->LaChiHo(B))  
return strcat(qh, "chi em ho");  
if (A->LaVo(B))  
return strcat(qh, "vo chong");  
Nguoi* temp = A;  
A = B;  
B = temp;  
}
strcpy(qh, A->LayTen());  
strcat(qh, " va ");  
strcat(qh, B->LayTen());  
return strcat(qh, " khong co quan he gia dinh");  
}
// t×m quan hÑ cña hai ®èi t-îng cã tªn nhËp vµo tõ bµn phÝm  
void TimQuanHe()  
{
clrscr();  
char ten1[25];  
cout << "Ten nguoi thu nhat: ";  
gets(ten1);  
Nguoi *A = Nguoi::TimNguoi(ten1);  
if (A==0)  
{
cout << "Khong co nguoi ten " << ten1 << endl;  
getch();  
return;  
}
char ten2[25];  
cout << "Ten nguoi thu hai: ";  
-306-  
Bµi to¸n quan hÖ gia ®×nh  
gets(ten2);  
Nguoi *B = Nguoi::TimNguoi(ten2);  
if (B==0)  
{
cout << "Khong co nguoi ten " << ten2 << endl;  
getch();  
return;  
}
cout << QuanHe(A, B) << endl;  
getch();  
}
§Ó ®¬n gi¶n trong viÖc thiÕt kÕ nhËp d÷ liÖu cho ch-¬ng tr×nh, chóng ta  
dïng ph-¬ng ph¸p nhËp d÷ liÖu tõ tÖp. ViÖc h×nh thµnh con ng-êi vµ c¸c  
mèi quan hÖ cña chóng lµ th«ng qua c¸c sù kiÖn chÝnh: T¹o mét con ng-êi,  
§¸m c-íi cña hai ng-êi, Sinh con cña ng-êi phô n÷. Do vËy tÖp d÷ liÖu ph¶i  
thÓ hiÖn ®-îc ®iÒu nµy. Dïng tÖp v¨n b¶n ®Ó m« t¶ c¸c sù kiÖn tá ra thÝch  
hîp trong tr-êng hîp nµy. D-íi ®©y lµ mét tÖp v¨n b¶n m« t¶ cho mét quan  
hÖ gia ®×nh ®¬n gi¶n.  
Th¾ng (Nam)  
Mai (N÷)  
Nga (N÷)  
TÖp v¨n b¶n d÷ liÖu:  
TuÊn (Nam)  
Tao  
Thang  
1
Tao  
Mai  
0
T¹o ng-êi tªn Th¾ng lµ nam  
T¹o ng-êi tªn Mai lµ n÷  
Cuoi  
Thang  
Mai  
Sinh  
Mai  
Nga  
0
Sinh  
Mai  
Tuan  
1
Th¾ng c-íi Mai  
-307-  
Mai sinh con g¸i tªn lµ Nga  
Mai sinh con trai tªn lµ TuÊn  
Ng«n ng÷ C++  
Hµm nhËp d÷ liÖu tõ tÖp v¨n b¶n.  
void NhapDuLieu() {  
clrscr();  
char s[80];  
cout << "Ten tep nhap du lieu: ";  
cin >> s;  
ifstream input(s, ios::in|ios::nocreate);  
input.seekg(0L, ios::end );  
if ( input.tellg() < 0) {  
cout << "Loi mo tep ! \n";  
getch();  
return;  
}
input.seekg(0L, ios::beg);  
cout << "Dang nhap du lieu........\n";  
int dong = 1;  
while (1) {  
input.getline(s, sizeof(s));  
if (input.gcount()==0) break;  
if (strcmp(s, "")==0)  
dong++;  
{
continue;  
-308-  
Bµi to¸n quan hÖ gia ®×nh  
}
if (strcmp(s, "Tao")==0) {  
char ten[25];  
input.getline(ten, sizeof(ten));  
if (strcmp(ten, "")) {  
int gt;  
input >> gt;  
cout << "Tao nguoi ten " << ten << endl;  
if (Nguoi::TimNguoi(ten))  
cout << "Da co nguoi ten la " << ten << endl;  
else  
Nguoi::TaoNguoi(ten, gt);  
dong += 2;  
continue;  
}
}
if (strcmp(s, "Cuoi")==0) {  
char ten1[25];  
input.getline(ten1, sizeof(ten1));  
char ten2[25];  
input.getline(ten2, sizeof(ten2));  
Nguoi* A = Nguoi::TimNguoi(ten1);  
Nguoi* B = Nguoi::TimNguoi(ten2);  
cout << "Cuoi " << ten1 << " va "<< ten2 << endl;  
if (A==0)  
cout << "Khong co nguoi ten " << ten1 << endl;  
if (B==0)  
cout << "Khong co nguoi ten " << ten2 << endl;  
if (A&&B&&A->Cuoi(B)==0)  
cout << "Khong cuoi duoc\n";  
-309-  
Ng«n ng÷ C++  
dong += 2;  
continue;  
}
if (strcmp(s, "Sinh")==0)  
{
char ten1[25];  
input.getline(ten1, sizeof(ten1));  
char ten2[25];  
input.getline(ten2, sizeof(ten2));  
if (strcmp(ten2, "")) {  
cout << ten1 << " sinh con "<< ten2 << endl;  
Nguoi* A = Nguoi::TimNguoi(ten1);  
if (A==0)  
cout << "Khong co nguoi ten " << ten1 << endl;  
int gt;  
input >> gt;  
if (Nguoi::TimNguoi(ten2))  
cout << "Da co nguoi ten la " << ten2 << endl;  
else {  
if ( A )  
if ( A->GioiTinh() )  
cout << ten1 <<" la nam khong sinh con duoc\n";  
else  
((Nu*)A)->SinhCon(ten2, gt);  
}
dong += 3;  
continue;  
}
}
cout << "Loi o dong thu " << dong << endl;  
-310-  
Bµi to¸n quan hÖ gia ®×nh  
break;  
}
cout << "Ket thuc nhap.\n";  
getch();  
}
ViÕt thªm menu cho ch-¬ng tr×nh cã d¹ng nh- sau:  
Lua chon cong viec theo so  
1. Nhap du lieu  
2. Tim quan he  
3. Ket thuc  
void Menu() {  
clrscr();  
cout << "\n\n Lua chon cong viec theo so\n\n";  
cout << " 1. Nhap du lieu\n";  
cout << " 2. Tim quan he\n";  
cout << " 3. Ket thuc\n";  
}
void main(){  
int i;  
Menu();  
do  
{
i = getch();  
switch (i)  
case '1':  
{
Nguoi::XoaDuLieu();  
NhapDuLieu();  
Menu();  
break;  
-311-  
Ng«n ng÷ C++  
case '2':  
TimQuanHe();  
Menu();  
}
}while (i!='3');  
Nguoi::XoaDuLieu();  
}
VÝ dô sau khi nhËp d÷ liÖu cho ch-¬ng tr×nh tõ tÖp d÷ liÖu nh- ta cã ë  
trªn vµ thùc hiÖn t×m quan hÖ mµn h×nh sÏ cã d¹ng nh- sau  
Ten nguoi thu nhat: Thang  
Ten nguoi thu hai: Mai  
Mai va Thang co quan he vo chong  
-312-  
pdf 16 trang Thùy Anh 19240 Free
Bạn đang xem tài liệu "Giáo trình Lập trình hướng đối tượng với C++ - Bài toán quan hệ gia đình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_lap_trinh_huong_doi_tuong_voi_c_phu_luc_3.pdf