
Phô lôc 3: 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.ư ướ
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 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ướ ợ ể ả ờ ỏ ề ố ệ ầ
- 230 -
Con ng iườ
Tên
Cha mẹ
Anh em
Con cái
Gi i tính ớ
C iướ
Nam
VợNữ
Ch ngồ
Sinh con
Thi t k s b các l p c a bài ế ế ơ ộ ớ ủ
toán

Phô lôc 3: Bµi to¸n quan hÖ gia ®×nh
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.ướ ế ế ớ ủ
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;
char Ten[25];
Nam *Bo;
Nu *Me;
Nguoi *AnhChi[10], *CacEm[10], *CacCon[10];
int SoAnhChi, SoEm, SoCon;
- 231 -
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
Vợ
Gi i tínhớ
C iướ
Nữ
Ch ngồ
Sinh con
Gi i tínhớ
C iướ
Thi t k các l p c a bài toánế ế ớ ủ

Phô lôc 3: Bµi to¸n quan hÖ gia ®×nh
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 *);
int LaAnh(Nguoi *);
int LaChi(Nguoi *);
int LaEm(Nguoi *);
int LaCo(Nguoi *);
int LaDi(Nguoi *);
int LaChu(Nguoi *);
int LaCau(Nguoi *);
- 232 -

Phô lôc 3: Bµi to¸n quan hÖ gia ®×nh
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);
};
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) {}
- 233 -

Phô lôc 3: Bµi to¸n quan hÖ gia ®×nh
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;
}
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]);
}
}
- 234 -