ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC SƯ PHẠM
KHOA TOÁN
Đề tài:
Giáo viên hướng dẫn : Phan Đoàn Ngọc Phương
Sinh viên thực hiện : Lưu Thị The
Ngô Thị Nhung
Nguyễn Thị Hoàng Anh
Lớp : 07CTT2
Đà Nẵng, tháng 05/ 2010
LỜI NÓI ĐẦU
Cấu trúc dữ liệu và giải thuật là một trong những môn học quan trọng đối với
những sinh viên ngành cử nhân toán tin, với mục đích nhằm củng cố kiến thức cơ sở đã
học về cấu trúc dữ liệu và tăng thêm sự hiểu biết về cây và file.
Được sự đồng ý của cô Phan Đoàn Ngọc Phương nhóm em chọn đề tài “Quản lý
hộ khẩu” để thực hiện.
Tuy nhóm em đã cố gắng nhưng chắc hẳn sẽ không tránh khỏi những thiếu xót do
hạn chế về kinh nghiệm và kiến thức. Chúng em rất mong nhận được ý kiến đóng góp, bổ
sung của cô giáo và các bạn.
Chúng em xin chân thành cảm ơn !
Đà Nẵng, tháng 05 năm 2010
I. MỞ ĐẦU
1. Lý do chọn đề tài
Trong thực tế, việc quản lý hộ khẩu của một số địa phương còn tồn tại cách quản
lý thủ công, lưu trữ dưới các loại văn bản giấy tờ. Công tác quản lý trên đã lỗi thời và gây
nhiều bất cập cho việc lưu trữ, bảo vệ cũng như cập nhật dữ liệu, nó còn làm mất thời
gian cho công tác truy cập dữ liệu, nguy cơ không đồng bộ dữ liệu là rất lớn. Do đó, việc
xây dựng các chương trình quản lý trên máy tính là rất cần thiết.
2. Mục đích của đề tài
Chương trình quản lý hộ khẩu được xây dựng nhằm mục đích giúp cho việc quản
lý hộ khẩu được dễ dàng, thuận tiện hơn, việc nắm bắt thông tin của các hộ khẩu nhanh
nhất.
3. Nội dung
Đầu vào: 1 file chứa: mã hộ khẩu, họ tên chủ hộ, giới tính, địa chỉ.
Xây dựng cấu trúc cây nhị phân mà có node bao gồm các trường : mã hộ khẩu và
con trỏ ( trái, phải ).
Các công việc có thể làm trên file:
+ Xử lí dữ liệu trên file
+ Ghi lại dữ liệu trên file khi cần
Các công việc có thể làm trên cây:
+ Tạo cây
+ Thêm mới hộ khẩu
+ Chỉnh sửa thông tin của một hộ khẩu
+ Tìm kiếm và xem thông tin của một hộ khẩu
+ Xóa thông tin của một hộ khẩu
+ Liệt kê danh sách các hộ khẩu hiện có.
II. CƠ SỞ LÝ THUYẾT
2.1. Cấu trúc cây
2.1.1 Định nghĩa
Cây là một tập hợp T các phần tử (gọi là nút của cây) trong đó có một nút đặc biệt
được gọi là gốc, các nút còn lại được chia thành những tập rời nhau T
1
, T
2
…,T
n
theo quan
hệ phân cấp trong đó T
i
(i =
n,1
) cũng là một cây. Mỗi nút ở cấp I sẽ quản lý một số nút ở
cấp I+1. Quan hệ này gọi là quan hệ cha – con.
2.1.2 Một số khái niệm cơ bản
- Bậc của một nút: là số lượng nút con của nút đó.
- Bậc của một cây: là bậc lớn nhất của nút trong cây. Cây có bậc n thì gọi là cây n-
phân.
- Nút góc là nút không có nút cha.
- Nút lá là nút có bậc bằng 0
- Nút nhánh: là nút có bậc khác 0 và không phải là nút gốc.
- Mức của một nút:
+ Mức (gốc(T)) = 1
+ Gọi T
1,
T
2
,…,T
n
là các nút con của T
0
+ Mức (T
1
)= Mức (T
2
) =…= Mức (T
0
)
+1
- Độ dài đường đi từ gốc đến nút x: là số nhánh cần đi qua kể từ gốc đến x.
- Chiều cao(độ sâu) của cây: Là mức lớn nhất trong cây
- Cây có thứ tự: Nếu trong một cây ta quan tâm đến thứ tự của các nút con của một
nút bất kỳ thì ta gọi là cây có thứ tự, ngược lại thì cây không có thứ tự.
- Rừng cây: Là một tập hữu hạn các cây phân biệt.
2.1.3 Một số ví dụ về đối tượng các cấu trúc dạng cây
● Sơ đồ tổ chức của một công ty
● Cuốn gia phả
● Cấu trúc cây thư mục trong DOS/WIN
● Cấu trúc thư viện,….
Nhận xét:
- Trong một cây không tồn tại chu trình
- Tổ chức 1 cấu trúc cây cho phép truy cập nhanh đến các phần tử của cây.
GIẦY DÉPQUẦN ÁO
TRUNG QUỐC THÁI LAN CAMPUCHIA
NỘI ĐỊA QUỐC TẾ
KINH DOANH TÀI VỤ SẢN XUẤT
GIÁM ĐỐC
2.2 Cây nhị phân
2.2.1 Định nghĩa
Cây nhị phân là cây mà mỗi nút có tối đa 2 nút con .gồm nút con bên trái và nút
con bên phải. Cây nhị phân có thể được ứng dụng trong nhiều bài toán thông dung, ví dụ
dưới đây cho ta hình ảnh của một biểu thức toán học .
2.2.2 Biễu diễn cây nhị phân T:
Cây nhị phân là một cấu trúc bao gồm các phần tử (nút) được kết nối với nhau theo
quan hệ “cha - con”, với mỗi cha có tối đa 2 con. Để biểu diễn cây nhị phân ta chọn
phương pháp cấp phát liên kết. Ứng với một nút ta dùng một biến động lưu trữ các thông
tin:
+ Thông tin lưu trữ tại nút
+ Địa chỉ nút gốc của cây con trái trong bộ nhớ
+ Địa chỉ nút gốc của cây con phải trong bộ nhớ
Khai báo 1 nút của cây tương ứng trong ngôn ngữ Pascal như sau:
Type tree =^node
Node = record
Info: integer;
Left: tree;
Right: tree;
End;
Do tính chất mềm dẻo của cách biểu diễn bằng cấp phát liên kết, phương pháp này
được dùng chủ yếu trong biểu diễn cây nhị phân.
2.2.3 Duyệt cây nhị phân
Có nhiều kiểu duyệt cây khác nhau và chúng cũng có những ứng dụng khác nhau.
Đối với cây nhị phân, do cấu trúc đệ quy của nó, việc duyệt cây tiếp cận theo kiểu đệ quy
là hợp lý và đơn giản nhất. Có 3 cách duyệt thông dụng: duyệt theo thứ tự trước (NLR),
duyệt theo thứ tự giữa (LNR), duyệt theo thứ tứ sau (LRN), với 3 công việc chính:
+ Thăm nút gốc
+ Duyệt cây con bên trái
+ Duyệt cây con bên phải
2.2.4 Cây tìm kiếm nhị phân
a. Định nghĩa:
Cây tìm kiếm nhị phân là cây thoả mãn: với mọi nút của cây thì giá trị khoá của
các nút cây con bên trái nhỏ hơn giá trị của nút và giá trị khoá của các cây con bên phải
lớn hơn giá trị khoá của nút đó.
Ví dụ sau minh hoạ một cây TKNP có khoá là số nguyên (với quan hệ thứ tự trong
tập số nguyên).
Nhận xét:
+ Trên cây TKNP không có hai nút cùng khoá
+ Cây con của một cây TKNP là cây TKNP
+ Khi duyệt trung tự (InOrder) cây TKNP ta được một dãy có thứ tự tăng
b. Cài đặt cây tìm kiếm nhị phân
Cây TKNP, trước hết, là một cây nhị phân. Do đó ta có thể áp dụng các cách cài
đặt như đã trình bày trong phần cây nhị phân. Sẽ không có sự khác biệt nào trong việc cài
đặt cấu trúc dữ liệu cho cây TKNP so với cây nhị phân, nhưng tất nhiên sẽ có sự khác biệt
trong các giải thuật thao tác trên cây TKNP như tìm kiếm, thêm hoặc xoá một nút trên cây
TKNP để luôn đảm bảo tính chất của cây TKNP. Một cách cài đặt cây TKNP thường gặp
20
17
15
10
5
22
30
42
35
là cài đặt bằng con trỏ. Mỗi nút của cây như là một mẩu tin (record) có ba trường: một
trường chứa khoá, hai trường kia là hai con trỏ trỏ đến hai nút con (nếu nút con vắng mặt
ta gán con trỏ bằng NIL).
*Tìm kiếm một nút có khóa cho trước trên cây TKNP: để tìm kiếm 1 nút có khoá
x trên cây TKNP, ta tiến hành từ nút gốc bằng cách so sánh khoá của nút gốc với khoá x.
+ Nếu nút gốc bằng NULL thì không có khoá x trên cây.
+ Nếu x bằng khoá của nút gốc thì giải thuật dừng và ta đã tìm được nút chứa khoá
x.
+ Nếu x lớn hơn khoá của nút gốc thì ta tiến hành (một cách đệ qui) việc tìm khoá
x trên cây con bên phải.
+ Nếu x nhỏ hơn khoá của nút gốc thì ta tiến hành (một cách đệ qui) việc tìm khoá
x trên cây con bên trái.
*Thêm một nút có khóa cho trước vào cây TKNP
Theo định nghĩa cây tìm kiếm nhị phân ta thấy trên cây tìm kiếm nhị phân không
có hai nút có cùng một khoá. Do đó nếu ta muốn thêm một nút có khoá x vào cây TKNP
thì trước hết ta phải tìm kiếm để xác định có nút nào chứa khoá x chưa. Nếu có thì giải
thuật kết thúc (không làm gì cả!). Ngược lại, sẽ thêm một nút mới chứa khoá x này. Việc
thêm một khoá vào cây TKNP là việc tìm kiếm và thêm một nút, tất nhiên, phải đảm bảo
cấu trúc cây TKNP không bị phá vỡ. Giải thuật cụ thể như sau:
- Ta tiến hành từ nút gốc bằng cách so sánh khóa cuả nút gốc với khoá x
+ Nếu nút gốc bằng NULL thì khoá x chưa có trên cây, do đó ta thêm một nút
mới chứa khoá x
+ Nếu x bằng khoá của nút gốc thì giải thuật dừng, trường hợp này ta không thêm
nút
+ Nếu x lớn hơn khoá của nút gốc thì ta tiến hành (một cách đệ qui) giải thuật này
trên cây con bên phải
+ Nếu x nhỏ hơn khoá của nút gốc thì ta tiến hành (một cách đệ qui) giải thuật
này trên cây con bên trái.
*Xóa một nút có khóa cho trước ra khỏi cây TKNP
Giả sử ta muốn xoá một nút có khoá x, trước hết ta phải tìm kiếm nút chứa khoá x
trên cây. Việc xoá một nút như vậy, tất nhiên, ta phải bảo đảm cấu trúc cây TKNP không
bị phá vỡ
- Nếu không tìm thấy nút chứa khoá x thì giải thuật kết thúc
- Nếu tìm gặp nút N có chứa khoá x, ta có ba trường hợp sau:
+ Nếu N là lá ta thay nó bởi NULL
+ N chỉ có một nút con ta thay nó bởi nút con của nó
+ N có hai nút con ta thay nó bởi nút lớn nhất trên cây con trái của nó (nút cực
phải của cây con trái) hoặc là nút bé nhất trên cây con phải của nó (nút cực trái của cây
con phải). Trong giải thuật sau, ta thay x bởi khoá của nút cực trái của cây con bên phải
rồi ta xoá nút cực trái này. Việc xoá nút cực trái của cây con bên phải sẽ rơi vào một trong
hai trường hợp trên.
2.3 Giới thiệu ngôn ngữ lập trình
Pascal là ngôn ngữ lập trình cấp cao do Niklaus Wirth – người Thuỵ Sỹ thiết kế
vào đầu năm 1970, với tên Pascal để kỷ niệm nhà toán học người Pháp Balaise Pascal.
Ngôn ngữ lập trình Pascal có ưu điểm là ngữ pháp, ngữ nghĩa đơn giản và có tính
logic; câu trúc chương trình rõ ràng, dễ hiểu; dễ sữa chữa, cải tiến. Có thể nói tính cấu
trúc của Pascal được thể hiện trên ba mặt:
1. Dữ liệu: từ các dữ liệu đã có, có thể xây dựng thành các kiểu dữ liệu phức tạp.
2. Lệnh: từ các lệnh đã có, có thể nhóm chúng lại với nhau và đặt giữa hai từ khóa
Begin và End thành lệnh ghép.
3. Chương trình: một chương trình có thể chia thành nhiều chương trình con.
Từ những ưu điểm trên, nhóm chúng em sử dụng ngôn ngữ lập trình Pascal cho đề
tài.
III. CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
3.1 Cấu trúc dữ liệu
Đề tài Quản lý hộ khẩu sử dụng kiểu bản ghi, và kiểu File – văn bản để cài đặt
thuật toán
3.1.1 Kiểu bản ghi
Khai báo: type tên kiểu =record
Field 1: kiểu 1;
Field 2: kiểu 2;
Field n: kiểu n;
End;
Var biến: tên kiểu;
3.1.2 Kiểu File – văn bản
a. Một số thủ tục và các hàm chung
*Một số thủ tục:
- Gán tên file
ASSIGN(F, filename);
Gán một file trên đĩa có tên là filename cho biến F,mọi truy xuất trên file cụ thể
được thực hiện thông qua biến file này.
- Mở một file mới
REWRITE(F); mở file mới rỗng
Tạo file mới có tên đã gán cho biến file F. Nếu file đã có trên đĩa thì mọi dữ liệu
trên đó sẽ bị xoá và con trỏ file ở vị trí đầu tiên của file.
- Mở file đã có trên đĩa
RESET(F);
Mở file có tên đã gán cho biến file F. Nếu file chưa có trên đĩa thì chương trình sẽ
dừng vì gặp lỗi xuất/ nhập
- Đọc dữ liệu
Read(F, các biến);
Readln(F, các biến);
- Ghi dữ liệu
Write(F, các biến);
Writeln(F, các biến);
- Đóng file
Close(F);
b. Các hàm chung
- Hàm kiểm tra cuối file
Eof(F);trả về giá trị true hoặc false
- Hàm kiểm tra cuối dòng
Eoln(F);trả về giá trị true hoặc false
3.2 Giải thuật
*Hàm liệt kê Output( ):
Bước 1: gọi hàm Duyetdexuat( )
Bước 2: nếu có thì xuất ngược lại thông báo “ không có gì để xuất cả”
Bước 3: kết thúc.
*Hàm nhập mã hộ khẩu mới update( ):
Bước 1: Nhập dữ liệu từ bàn phím
Bước 2: Kiểm tra mã hộ khẩu muốn nhập, nếu mã hộ khẩu đã có trong danh
sách thì hiện thông báo” mã hộ khẩu đã có rồi, bạn muốn thay thế không?”, nếu “không”
chuyến bước 4, nếu “có” thì thay đổi thông tin chủ hộ, ngược lại chuyển bước 3
Bước 3 : Gọi thủ tục CapNhap() để chèn một nút mới vào cây
Bước 4: kết thúc
*Hàm sửa thông tin sửa( ):
Bước 1: Nhập mã hộ khẩu cần chỉnh sửa
Bước 2: Kiểm tra xem mã hộ khẩu cần sửa có trong danh sách vừa nhập hay
không, nếu có thí sửa thông tin chủ hộ ngược lại hiện thông báo “không có mã hộ khẩu
nào như vậy”. Nếu hộ khẩu rỗng thì hiện thông báo “không có gì để sửa”.
Bước 3: Kết thúc
*Hàm tìm kiếm theo mã hộ khẩu search( )(Tìm theo khoá)
Bước 1: Nhập mã hộ khẩu cần tìm kiếm
Bước 2: Duyệt cây theo thủ tục duyệt trước không đệ quy, nếu tìm thấy thì in
thông tin chủ hộ ( họ tên, giới tính, địa chỉ), nếu không tìm thấy thì hiện thông báo không
có.
Bước 3: kết thúc
*Hàm xoá dữ liệu: xoa( ), được gọi khi ta muốn xoá dữ liệu hộ khẩu đó
Bước 1: Nhập mã hộ khẩu muốn xoá
Bước 2: Kiểm tra xem mã hộ khẩu có đúng với mã hộ khẩu có trong danh sách
hay ko. Nếu đúng thì xoá nút khỏi cây, ngược lại thì không có mã hộ khẩu cần xoá
Bước 3: kết thúc
* Hàm ghi file():
Bước 1 : Tạo file( HOKHAU.TXT)
Bước 2: ghi dữ liệu vào file (HOKHAU.TXT)
Bước 3: Đóng file
KẾT LUẬN
1. Đánh giá
Chương trình được viết dựa vào cấu trúc tìm kiếm nhị phân là một cấu trúc dữ liệu
hay và rất linh hoạt. Các thao tác trong chương trình được xây dựng giúp cho người quản
lý làm chủ công việc một cách đơn giản, hiệu quả và không mất nhiều thời gian như việc
quản lý thủ công.
Tuy nhiên, do kiến thức còn hạn chế và thiếu kinh nghiệm trong việc xây dựng một
đề tài quản lý cho nên chương trình còn có nhiều thiếu sót, tính bảo mật chưa cao, các
chức năng trong chương trình còn đơn giản, giao diện được cài đặt trên nền DOS nên
chưa thực sự ấn tượng.
2. Hướng phát triển
+ Cài đặt chương trình trên nền Windows.
+ Hoàn thiện các chức năng nâng cao.
+ Mở rộng với các đối tượng quản lý khác.
TÀI LIỆU THAM KHẢO
1.Giáo trình cấu trúc dữ liệu và giải thuật GV - Phan Đoàn Ngọc Phương
2. Giáo trình lập trình Pascal GV- Đoàn Duy Bình
3. Giáo trình Turbo Pascal 7.0 PGS.TS - Bùi Thế Tâm
4. Giải thuật TH.S – Nguyễn Văn Linh
5.Giáo trình cấu trúc dữ liệu và giải thuật PGS.TSKH Trần Quốc Chiến
. 6. Giáo trình cấu trúc dữ liệu và giải thuật Đỗ Xuân Lôi
7.
Và các tài liệu có liên quan khác.