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-
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:
giao_trinh_lap_trinh_huong_doi_tuong_voi_c_phu_luc_3.pdf

