Phôc 3: Bµi to¸n quan hÖ gia ®×nh
Ph l c 3
Bài tn quan h gia đình
Trong m cy, ta s xây d ng ch ng trình cho bài toán quan h gia đình đã ươ
đ c pnch ch ng m t. Theo nh s phân tích ban đ u c a bài tn, taượ ươ ư
m t t p c th 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 n ph ng th cươ ượ ươ
c i ch x y ra cho hai th khác gi i. Nh v y s phân chia t p đ i t ngướ ư ượ
c a bài toán thành hai l p khác nhau NamN. Rõ ràng, hai l py 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, th Nam hay N ng đ u ph i có. Ngi 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 thêm thu c
tính Ch ng ph ng th c ươ Sinh con. Thi t k các l p ban đ u c a bài toánế ế
nh nh d i đây.ư ướ
Ph ng th c ươ Gi i tính ng đ tr l i xem m t th đó Nam hay N .
N u là Nam k t qu 1 còn là k t qu là 0.ràng t i l p Con ng i ph ngế ế ế ườ ươ
th c Gi i tính không th tr l i đ c đó Nam hay N . Câu tr l i ch 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 1 còn l p N tr k t qu 0. Đ th c ế ế
hi n đ c kĩ thu t này, ta ngthu t hàm o trong LTHĐT. L p lu n t ng ượ ươ
t cho ph ng th c ươ C iướ , b i 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 ng c nướ
- 230 -
Con ng iườ
Tên
Cha m
Anh em
Con cái
Gi i tính
C iướ
Nam
VN
Ch ng
Sinh con
Thi t k s b các l p c a bài ế ế ơ
toán
Phôc 3: Bµi to¸n quan hÖ gia ®×nh
ph i y nh ng ph ng th c đ tr l i c u h i nh ươ ư Anh, Là Ông(X),
v.v...nh d i đây thi t k c l p c ai toán.ướ ế ế
Sau đây là th hi n c a các l p d i nn ng C++ có b sung thêm m t s ướ
thu c tính 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ô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 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 -