Sau khi học môn “Cấu trúc dữ liệu ” và tiếp đến là môn “Phân tích và thiết kế giải thuật”, chúng em được giao thực hiện đồ án môn học “Cấu trúc dữ liệu và thuật toán ”để giải quyết một
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO ĐỒ ÁN: CẤU TRÚC DỮ LIỆU & THUẬT TOÁN
GVHD : PHAN THANH TAO NHÓM : 12 LỚP : 07T2
SVTH : Trần Thanh Liêm Nguyễn Hữu Nhân Lê Phương Tiến
Đà Nẵng, tháng 12 năm 2009
Trang 2Mục lục
Mục lục 2
Lời nói đầu 3
I Giới thiệu đề tài và đề tài 4
Giới thiệu đề tài : 4
Đề tài 4
II Nghiên cứu lý thuyết 5
III Các giải pháp có thể và cấu trúc đề xuất 6
IV Mô tả thuật toán 8
V Lập trình 11
1.Chương trình 11
2.Kết quả 20
VI Kết luận 26
Trang 3Lời nói đầu
Cấu trúc dữ liệu là một môn học quan trọng trong lĩnh vực CNTT Nó là cơ
sở vững chắc để ta giải quyết các bài toán trong quá trình học tập cũng như trong cuộc sống Một điều quan trọng nữa là nó cung cấp cho chúng ta những hiểu biết về các giải thuật tác động lên dữ liệu cũng như cách tổ chức dữ liệu
để giải quyết các bài toán sao cho dễ nhất, tối ưu nhất.
Sau khi học môn “Cấu trúc dữ liệu ” và tiếp đến là môn “Phân tích và thiết
kế giải thuật”, chúng em được giao thực hiện đồ án môn học “Cấu trúc dữ liệu
và thuật toán ”để giải quyết một số bài toán liên quan đến môn học và đề tài chúng em được nghiên cứu ở đây là bài toán cây gia phả.
Đây là đồ án đầu tiên của chúng em nên không thể tránh khỏi sai sót, rất mong sự giúp đỡ tận tình của các thầy cô trong khoa Em cũng xin cảm ơn
thầy Phan Thanh Tao đã hướng dẫn và giúp chúng em hoàn thành đồ án
này
Nhóm sinh viên thực hiện
Trần Thanh Liêm
Nguyễn Hữu Nhân
Lê Phương Tiến
Nhóm 12 Lớp 07T2
Khoa Công Nghệ Thông Tin
Trang 4I Giới thiệu đề tài và đề tài
Giới thiệu đề tài :
Đối với mỗi dòng họ đều có một tài liệu ghi chép lại tất cả những người có liên quan với nhau trong dòng họ, tài liệu đó chính là gia phả Hay gia phả là bản ghi chép tên họ, tuổi tác, vai trò và công đức của cha mẹ, ông bà, tiên tổ trong thời đại mà họ đã sinh ra và lớn lên của một gia đình hay một dòng họ
Gia phả đã xuất hiện từ thời xa xưa ở phương Tây cũng như ở phương Đông Tại các nước Đông Á, v iệc xây dựng và lưu truyền gia phả được xem là một cách ghi nhớ công ơn tổ tiên, gây dựng lòng tự hào trong dòng tộc.
Ở Tây phương, người ta có tập tục làm cây phả hệ, tương tự như Tông đồ của người Hoa hay người Việt
Một Tông đồ, một Gia phả, một Phả ký, một Phổ truyền dù đơn sơ hay súc tích cũng đều trở nên những tài liệu quý báu cho nhà xã hội học , nhà sử học về sau
Nó còn có thể hữu dụng cho những nghiên cứu về tâm lý, về di truyền học , huyết học , y học nữa.
Để thấy rõ một cách tổng quát các chi lớn, nhỏ, xa, gần của một họ, người ta còn lập ra các phả đồ, với những hình vẽ đơn giản kèm theo tên tuổi ghi vắn tắt ở bên dưới.
Do đó,bài toán cây gia phả rất thông dụng trong cuộc sống hiện nay.Và với sự phát triển của Công Nghệ Thông Tin thì sẽ giúp cho việc tạo lập và quản lý cây gia phả sẽ tốt hơn.
Đề tài : Quản lý thông tin gia phả của một dòng họ Thông tin về một con người trong gia phả gồm : họ tên, ngày sinh, tình trạng gia đình, cha,mẹ,…
a Hãy định nghĩa cấu trúc dữ liệu thích hợp để quản lý gia phả,sau đó cài đặt cấu trúc
dữ liệu này.
b Giả sử không có hai người trùng tên,hãy viết chương trình con nhập vào họ tên của một người,sau đó cho biết người đó có trong gia phả không?Nếu có thì in ra tất cả các thế hệ con,cháu … của người này và in ra những người cùng thế hệ với người này.
Trang 5II Nghiên cứu lý thuyết
Gia phả đã xuất hiện từ thời xa xưa ở phương Tây cũng như ở phương Đông
Tại Việt Nam, gia phả sơ giản ghi chép tên cúng cơm, ngày giỗ và địa điểm an táng của ông cha Theo các nhà sử học phỏng đoán thì gia phả đã xuất hiện từ thời Sĩ Nhiếp làm Thái thú ở Giao Chỉ, hoặc gần hơn tức là từ thời Lý Nam Đế (khoảng nǎm 476-545) Nhưng phải đến thời nhà Lý, nhà Trần mới xuất hiện những cuốn tộc phả, thế phả (ghi cả thế thứ, tông tích toàn họ), phả ký (ghi lại hành trạng, sự nghiệp của tổ tiên).
Mới đầu gia phả xuất hiện chỉ trong Hoàng tộc cùng giới quan lại, nhà Lý có Hoàng Triều
Ngọc Điệp - năm 1026; nhà Trần có Hoàng Tông Ngọc Điệp, nhà Lê có Hoàng Lê Ngọc Phả Cùng với sự xuất hiện các gia phả của Hoàng tộc là gia phả của các danh gia,
quan lại và cứ thế lan rộng, phổ biến ghi chép gia phả trong nhân dân.
Trước đây, gia phả chủ yếu được ghi chép bằng chữ Hán-Nôm, nhưng số người giỏi không nhiều, qua nhiều năm chiến tranh, nhiều bộ, cuốn gia phả của nhiều dòng họ cũng mất dần
Tục làm gia phả phát triển mạnh ở hai miền Bắc và Trung, miền Nam rất ít gia đình làm gia phả ở đấy còn được gọi là "gia phổ" và biến thái thành "tông chi" tức tờ "tông chi tông đồ".
Trong gia phả, người đứng đầu ngành trưởng (trưởng họ, trưởng tộc) có bổn phận ghi hết những chi tiết về thân thích và dòng dõi; những người con khác sao lại bản gia phả chính đó Các gia đình giữ gìn kỹ lưỡng và truyền từ đời cha tới đời con "Họ" theo nghĩa gốc có liên hệ với nhà và dưới chế độ phong kiến, nối kết con người với đất ruộng: một mái nhà, một gia đình, một họ Họ và tên của một người định vị trí của cá nhân người đó trong xã hội, xác định cá thể trong một toàn thể.
Và trong một cây gia phả thì chỉ chú ý đến con trai,còn con gái thì chỉ lưu thông tin, không
mở rộng trong gia phả.
Trang 6III Các giải pháp có thể và cấu trúc đề xuất
Các giải pháp :
Cấu trúc thông tin dưới dạng bảng.
o Ưu điểm : - Dễ quản lý
- Nó thể hiện được mối quan hệ giữa các thành viên trong dòng họ.
o Nhược điểm : Tốn dung lượng bộ nhớ.
Ví dụ : Để thể hiện mối quan hệ giữa 4 người A,B,C,D Ta cần bảng 4x4.
Nếu số người là n là cần bảng là nxn.
Minh hoạ :
Cấu trúc theo kiểu danh sách đa liên kết
Danh sách đa liên kết là danh sách có nhiều mối liên kết
o Ưu : - Ít tốn bộ nhớ
- Thể hiện được đầy đủ các mối quan hệ.
o Nhược : - Quá nhiều đường thể hiện quan hệ
- Khó quản lý
Trang 7Ví dụ mô tả :
Cấu trúc theo kiểu đơn liên kết
Danh sách đơn liên kết là danh sách mà các phần tử được kết nối với nhau nhờ
vùng(trường) liên kết Ví dụ như trong struct human có human *next.
o Ưu điểm : Dễ cài đặt, dễ lập trình, dễ quản lý
o Nhược điểm : Không thấy rõ được cái mối quan hệ Các mối quan hệ chỉ được thể hiện qua các biến.
Sơ đồ minh hoạ
Qua các cấu trúc được mô tả thì nhóm chúng em chọn cấu trúc đơn liên kết.Vì với cấu trúc này sẽ dễ dàng cho việc quản lý,thêm,sửa,xoá,update,tìm kiếm trong gia phả,vì mỗi gia phả sẽ luôn được thay đổi theo năm tháng.Khắc phục nhược điểm : là không chỉ rõ mối quan hệ nhưng các mối quan hệ thể hiện qua các biến nên người đọc hoặc người sử dụng chương trình vẫn có thể hiểu được.
Trang 8IV Mô tả thuật toán
Gia phả giả định :
Với cấu trúc chọn là Danh Sách đơn liên kết thì mô hình đề xuất như sau:
+ ) Trường liên kết để nối giữa 2 phần tử
hunman *next;
+ ) Trường thông tin liên quan đến một phần tử
Cấu trúc đc khái báo như sau :
Trang 9Trong đó infor thongtin là :
Quản lý dữ liệu bằng con trỏ kiểu Family;
typedef hunman *Family;
Các hàm điều khiển chương trình:
+ ) được phân 2 loại :
- Quản lý chung cho cả chương trình ( begin()… )
- Quản lý việc thực hiện các hàm con trong thân chương trình ( list(),chon()
…) + ) các hàm đều được sử dụng nhiều lần để thực hiện các yêu cầu từ bài toán
Thuật toán riêng chư từng hàm được sử dụng
1) Dữ liệu: được bắt buộc nhập khi thực hiện cách lệnh theo yêu cầu của bài toán ,chủ yếu lấy dự liệu từ file “gia_pha.bin” vì để tiện cho việc thao tác
Thuật toán : dung con trỏ FILE để lấy dữ liệu trong file “gia_pha.bin” theo
kiểu dữ liệu human
t=(*t).next;
(*t).next=p;
} else f=p;
Trang 103) Xuất dữ liệu:
- File ( cũng dung con trõ FILE để thao tác trên 2 loại file là txt và bin )
- Màng hình ( xuất từng phần tữ trong danh sách ra màng hình,sử dụng vòng lặp để thực hiện việc xuất dữ liệu)
4) Các hàm có chức năng tìm kiếm:
- Gồm: tìm một người trong gia phả ( tim(F) ), tìm người cùng thế hệ (
ng_cung_thehe(F) ),tìm con cháu của một người ( timconchau(F))
- Sử dụng thuật toán chung là tìm kiếm 1 phần tử trong danh sách và trả về kiểu con trỏ Family
- Code như sau:
Family search(Family &f,char ten[50]) { Family p;
5 ) Hàm reset với mục đính đưa danh sách về lại trạng thái ban đầu (là NULL )
Khi sự quản lý không đủ khả năng ( do các hàm và các biến gọi lẫn nhau nên dễ xảy ra tình trạng chồng chất dự liệu).Có thể khắc phục bằng các ghi dự liệu ra mà đưa chứ về lại trại trái ban đầu
Hàm này dùng để xóa hết các phần tử trong Danh sách ,khôi phục và giải phóng các vùng nhớ đã sử dụng
Trang 11typedef hunman *Family;
// -bien toan cuc -//
int ch,ch2;
Family F;
// -Ten Ham con -//
void Infor(Family &p);
void them(Family &f);
void nhap(Family &f);
void xuat(Family f);
Family search(Family &f,char ten[50]);
void tim(Family &f);
void in_thongtin(Family &p);
void ng_cung_thehe(Family &f);
void conchau(char s[50],Family f);
void timconchau(Family f);
void doc(Family &f,char *s);
void them2(Family &f,Family p);
void xuat2(Family &f);
Trang 12void Infor(Family &p)
printf("|| Vo hay chong:%s",(*p).thongtin.vc);
else printf("|| Vo hay chong: << ko >>");
Trang 13printf("\n Cha: %s",(*p).thongtin.pa);
else printf("\n << Nguoi ban tim KO CO trong GIA PHA >>");
getch();
Trang 14void conchau(char s[50],Family f)
// - DOC DU LIEU tu FILE BIN -//
void doc(Family &f,char *s)
{ Family p;
FILE *tep;
tep=fopen(s,"r+b");
Trang 15printf("\n <<< GHI FILE >>> ");
if(tep==NULL) printf("\n KO MO DC FILE ");
else {
while(p!=NULL) { if(p==NULL) break;
printf("\n <<< GHI FILE >>> ");
if(tep==NULL) printf("\n KO MO DC FILE ");
else {
fprintf(tep,"<<<<< DANH SACH GIA PHA >>>>> ");
while(p!=NULL) { if(p==NULL) break;
Trang 16fprintf(tep,"\n Ten Vo hoac Chong : %s",(*p).thongtin.vc);
fprintf(tep,"\n The he : %d",(*p).thehe);fprintf(tep,"\n ===========");
i++;
p=(*p).next;
}} fclose(tep);
{ t=p;
p=(*p).next;
} (*t).next=NULL;
delete p;
} i ;
Trang 17printf("\n\n\n =====> Chon:");
scanf("%d",&i);
} while(i<1 || i>2);
switch(i)
{ case 1: doc(F,s); break;
case 2: nhap(F); break;
printf(" 1) Tim nguoi trong gia pha\n");
printf(" 2) Tim nguoi cung the he\n");
printf(" 3) Tim con chau cua mot nguoi\n");
printf(" 4) Them 1 nguoi vao gia pha\n");
printf(" 5) Reset Danh sach\n");
printf(" 6) Ghi lai Danh Sach Gia pha\n");
printf("\n <<< Tim kiem nguoi cung the he >>>\n");
printf("\n <<< Tim con chau cua 1 nguoi >>>\n");
printf("\n <<< Them mot nguoi vao Danh Sach >>>\n");
them(F);
list();
Trang 18} case 5 : {
printf("\n <<< Reset danh sach gia pha >>>\n");
printf("\n <<< Xuat du lieu ra FILE TXT >>>\n");
printf("\n <<< Xuat Danh sach GIA PHA >>>\n");
Trang 202 Kết quả chạy chương trình
(Kết quả cho gia phả ở trên)
Giao diện chính của chương trình
Trang 22Trường hợp chọn 1 : Tìm thử xem người đó có trong gia phả hay không?
Trang 23Trường hợp chọn 2 : Tìm kiếm những người cùng thế hệ với người có tên nhập từ bàn phím
Trang 24Trường hợp chọn 3 : Tìm tất cả con cháu của người có tên nhập từ bàn phím
Trang 25 Trở lại menu chính
Nếu chọn 2 thì sẽ in ra thông tin sinh viên và giảng viên hướng dẫn
Nếu chọn 3 thì sẽ thoát.
Trang 26VI Kết luận
Chương trình bài toán cây gia phả ở trên đã thực hiện đúng theo yêu cầu của đề bài.Hi vọng rằng chương trình này sẽ được ứng dụng nhiều trong cuộc sống.
Trong quá trình chạy thì không phát sinh lỗi.
Cho ra kết quả nhanh chóng với độ chính xác cao đúng với thuật toán.
Có sử dụng đồ hoạ trực quan.
Trang 27Xin chân thành cám ơn sự theo dõi của thầy và những người xem!!! Rất mong được sự đóng góp ý kiến của tất cả mọi người!!