Untitled BỘ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC KINH TẾ TP HỒ CHÍ MINH (UEH) TRƯỜNG CÔNG NGHỆ VÀ THIẾT KẾ ĐỒ ÁN MÔN HỌC ĐỀ TÀI CÂY TÌM KIẾM NHỊ PHÂN VÀ ỨNG DỤNG TRONG QUẢN LÝ HỒ SƠ TRONG MÁY TÍNH Học Phần[.]
Trang 1B Ộ GIÁO DỤC VÀ ĐÀO TẠO ĐẠI HỌC KINH TẾ TP HỒ CHÍ MINH (UEH)
TRƯỜNG CÔNG NGHỆ VÀ THIẾT KẾ
ĐỒ ÁN MÔN HỌC
ĐỀ TÀI
CÂY TÌM KIẾM NHỊ PHÂN VÀ ỨNG DỤNG
H ọc Phần: Cấu Trúc Dữ Liệu & Giải Thuật Danh Sách Nhóm:
Trang 22
M ỤC LỤC 2
CHƯƠNG 1 CÂY NHỊ PHÂN TÌM KIẾM 3
1.1 Các Khái Niệm Liên Quan 3
1.2 C ấu Trúc và Cài Đặt Cây BST 3
1.3 Các Thuật Toán Trên Cây BST 4
a) Thu ật Toán Thêm nút vào BST 4
b) Thu ật Toán Thăm nút BST 4
c) Thu ật Toán Tìm nút Min/Max 7
d) Thu ật Toán Xác định độ cao BST 8
e) Thu ật Toán Tìm nút BST 9
f) Thu ật Toán Xóa nút BST 9
CHƯƠNG 2 PHÂN TÍCH VÀ THIẾT KẾ LỚP 10
2.1 Phân Tích Bài Toán Tìm Kiếm Hồ Sơ Bằng Cây BST 10
2.2 Sơ Đồ Lớp 10
2.3 Cài Đặt Lớp 10
CHƯƠNG 3 THIẾT KẾ GIAO DIỆN 14
3.1 Giao Di ện Menu Chính 14
3.2 Chi Ti ết Chức Năng 14
CHƯƠNG 4 THẢO LUẬN & ĐÁNH GIÁ 18
5.1 Các Kết Quả Nhận Được 18
5.2 M ột Số Tồn Tại 19
5.3 Hướng Phát Triển 20
PH Ụ LỤC 21
TÀI LIỆU THAM KHẢO 23
Trang 3CHƯƠNG 1 CÂY NHỊ PHÂN TÌM KIẾM
Cây (Tree) là một dạng cấu trúc dữ liệu bao gồm: các đỉnh (Node) và cạnh (Edge) Các đỉnh chứa thông tin và được kết nối bởi các cạnh
Tập thứ tự các cạnh sẽ tạo thành một đường đi (Path)
Đỉnh ở trên cùng được gọi là gốc (Root)
Các đỉnh còn lại được gọi là nút con (Child)
Đỉnh không có nút con nào được gọi là lá (Leaf)
Các đỉnh được phân thành các mức khác nhau (level 0, level 1, v.v)
Một cây mà mỗi đỉnh có không quá hai nút con: nút trái (left) và nút phải (right) được gọi
là cây nhị phân (Binary tree)
CÂY TÌM KIẾM NHỊ PHÂN (BST – Binary Search Tree):
Giá trị của tất cả các nút ở cây con bên trái <= giá trị của nút gốc
Giá trị của tất cả các nút ở cây con bên phải > giá trị của nút gốc
Tất cả các cây con (bao gồm bên trái và phải) đều phải đảm bảo hai tính chất trên
Mỗi nút gồm có dữ liệu (Data), nút trái (Left) và nút phải (Right)
Trang 44
Mỗi BST có một nút gốc (Root)
public class Node
{
public Node LeftNode { get; set; }
public Node RightNode { get; set; }
public int Data { get; set; }
a) Thuật Toán Thêm nút vào BST
public bool Insert(int value)
{
Node before = null, after = this.Root;
while (after != null)
if (this.Root == null)
this.Root = newNode;
b) Thuật Toán Thăm nút BST
Duy ệt cây theo trung thứ tự:
Trang 5public void TraverseInOrder(Node parent)
Trang 7public void TraversePostOrder(Node parent)
int minv = node.Data;
while (node.LeftNode != null)
Trang 8Node current = Root;
while (current.LeftNode != null)
int maxv = node.Data;
while (node.RightNode != null)
Node current = Root;
while (current.RightNode != null)
current = current.RightNode;
return current.Data;
}
d) Thu ật Toán Xác định độ cao BST
public int GetTreeDepth()
Trang 9e) Thuật Toán Tìm nút BST
public Node Find(int value)
{ return this.Find(value, this.Root); }
private Node Find(int value, Node parent)
f) Thu ật Toán Xóa nút BST
public void Remove(int value)
{ this.Root = Remove(this.Root, value); }
private Node Remove(Node parent, int key)
{
if (parent == null) return parent;
if (key < parent.Data) parent.LeftNode = Remove(parent.LeftNode, key);
else if (key > parent.Data) parent.RightNode =
Remove(parent.RightNode, key);
else
{
if (parent.LeftNode == null) return parent.RightNode;
else if (parent.RightNode == null) return parent.LeftNode; parent.Data = MinValueOfNode(parent.RightNode);
parent.RightNode = Remove(parent.RightNode, parent.Data);
}
return parent;
}
Trang 1010
CHƯƠNG 2 PHÂN TÍCH VÀ THIẾT KẾ LỚP
Mô tả thuật toán:
Đầu tiên tạo class HoSo để lưu các thuộc tính của 1 đối tượng hồ sơ như: Mã hồ sơ, Họ
và tên, Giới tính, Lương, Ngày làm (ngày chính thức làm việc)
Tạo class Node để định nghĩa các nút trái, nút phải và dữ liệu của cây để hổ trợ cho class BinarySearchTree
Tạo class BinarySearchTree để lưu thuộc tính của các đối tượng theo đề bài Trong class này chứa các phương thức chèn đối tượng vào cây, sắp xếp theo thứ tự thời gian từ cũ nhất đến mới nhất và in ra danh các hồ sơ, tìm kiếm theo tên, tìm kiếm theo khoảng thời gian t ừ A đến B
Yêu cầu: cần có kiến thức về lớp, cây tìm kiếm nhị phân, biết áp dụng thuật toán tìm kiếm trong cây BST và không kém phần quan trọng là khả năng làm winform để hoàn thành phần giao diện của bài ở chương 3
2.2 Sơ Đồ Lớp
2.3 Cài Đặt Lớp
Downloaded by vu ga (vuchinhhp2@gmail.com)
Trang 11public string MaHoSo { get; set; }
public string Ten { get; set; }
public string GioiTinh { get; set; }
public int Luong { get; set; }
public DateTime NgayLam { get; set; }
}
public class Node
{
public Node LeftNode { get; set; }
public Node RightNode { get; set; }
public HoSo Data { get; set; }
}
public class BinarySearchTree
{
public Node Root { get; set; }
public bool Insert(HoSo value)
{
Node before = null, after = this.Root;
while (after != null)
if (this.Root == null)
this.Root = newNode;
Trang 1212
parent.Data.MaHoSo, parent.Data.Ten, parent.Data.GioiTinh, parent.Data.Luong, parent.Data.NgayLam.ToString("d",viVn)); TraverseInOrder(parent.RightNode);
finddate(parent.LeftNode, date1, date2);
if (parent.Data.NgayLam <= date2 && parent.Data.NgayLam >= date1)
HoSo h = new HoSo();
Console.WriteLine("Nhap Ma ho so: ");
Console.WriteLine("Nhap Luong: ");
h.Luong = int.Parse(Console.ReadLine());
Console.WriteLine("Nhap Ngay lam: ");
BinarySearchTree binaryTree = new BinarySearchTree();
Console.WriteLine("Nhap so luong ho so can them:");
int n = int.Parse(Console.ReadLine());
for (int i = 1; i <= n; i++)
Downloaded by vu ga (vuchinhhp2@gmail.com)
Trang 13Console.WriteLine("nhap ten can tim kiem: ");
string name = Console.ReadLine();
binaryTree.findname(binaryTree.Root, name);
Console.WriteLine("nhap khoang thoi gian can tim kiem");
DateTime date1 = DateTime.Parse(Console.ReadLine());
DateTime date2 = DateTime.Parse(Console.ReadLine());
binaryTree.finddate(binaryTree.Root, date1, date2);
Console.ReadLine();
}
}
}
Trang 14binaryTree = new BinarySearchTree();
dataTable = new DataTable();
Trang 15HoSo hs = new HoSo(txtMahs.Text, txtHoten.Text, txtGioitinh.Text, txtLuong.Text, dtpNgaylam.Value);
Trang 16List<HoSo> lsths = new List<HoSo>();
string value = txtTimkiemtheoten.Text;
public string MaHoSo { get; set; }
public string Ten { get; set; }
public string GioiTinh { get; set; }
public string Luong { get; set; }
public DateTime NgayLam { get; set; }
public HoSo(string maHoSo, string ten, string gioiTinh, string luong, DateTime ngayLam)
{
this.MaHoSo = maHoSo;
this.Ten = ten;
this.GioiTinh = gioiTinh;
this.Luong = luong;
this.NgayLam = ngayLam;
}
}
public class Node
{
public Node LeftNode { get; set; }
public Node RightNode { get; set; }
public HoSo Data { get; set; }
}
public class BinarySearchTree
{
public Node Root { get; set; }
public bool Insert(HoSo value)
{
Node before = null, after = this.Root;
while (after != null)
{
Downloaded by vu ga (vuchinhhp2@gmail.com)
Trang 17if (this.Root == null)
this.Root = newNode;
Trang 1818
CHƯƠNG 4 THẢO LUẬN & ĐÁNH GIÁ
Kết quả của thuật toán:
Kết quả chạy trên winform:
Chức năng thêm dữ liệu:
Downloaded by vu ga (vuchinhhp2@gmail.com)
Trang 1919
Chức năng tìm kiếm theo tên:
Chức năng tìm kiếm theo thời gian:
5.2 M ột Số Tồn Tại
Những hạn chế trong việc lưu trữ thông tin trên BST đó là với lượng dữ liệu lớn sẽ mất nhiều thời gian và gặp khó khăn trong việc quản lý và truy xuất dữ liệu
Trang 2020
Biện pháp của vấn đề này là liên kết các dữ liệu đã lưu trữ trong database với window forms Khi ta cần truy xuất hay cập nhật thông tin chỉ cần truy vấn theo cú pháp SQL
5.3 Hướng Phát Triển
Từ thuật toán Cây tìm kiếm nhị phân ta có thể ứng dụng trong việc quản lý sinh viên, quản
lý khách sạn, quản lý nhân sự trong 1 công ty
Downloaded by vu ga (vuchinhhp2@gmail.com)
Trang 2121
- Đưa Link Toàn Bộ Mã Nguồn Lên GitHub và Đưa Link Vào Đây
https://github.com/PhongNguyen25/Do_An_CTDL.git
- Viết Hướng Dẫn Cách Cài Đặt Để Chạy
Các bước tạo Form:
Bước 1: Việc đầu tiên cần làm là tạo 1 Window Forms
Bước 2: Tạo các label và đặt tên dữ liệu cần nhập ở phần Text trong Properties tương ứng với tên của các cột trong 1 bảng
Ví dụ: Họ và tên, Lương
Bước 3: Tạo các textbox để nhập dữ liệu và textbox cho phần tìm kiếm theo tên và đặt tên cho textbox ở phần Name trong Properties để ta truy cập đến ô đó khi tạo sự kiện Do ta tìm kiếm theo thời gian nên sẽ tạo datetimepicker để chọn thời gian mà không cần nhập và
dễ dành cho việc tìm kiếm
(đây là kết quả khi tạo datetimepicker) (đây là textbox)
Lưu ý tạo textbox tương ứng với label
Bước 4: Tạo các button với chức năng thêm và tìm kiếm (tìm kiếm ở đây có 2 buttons là tìm kiếm theo tên và tìm kiếm theo thời gian)
Bước 5: Tạo một datagridview để xuất dữ liệu đã nhập
Trang 2222
Lưu ý: tạo 1 datagridview trống và không cần tạo cột vì phần này được xử lý trong code Tất cả button, datetimepicker, textbox phải được đặt tên ở phần Name để xử lý sự kiện Code chi tiết đã được trình bày ở phần Chi tiết chức năng
Chạy chương trình:
Cần nhập đầy đủ tất cả thông tin trước khi click “thêm”, nếu không sẽ có thông báo lỗi
Ở phần tìm kiếm theo tên khi ta nhập bất kể họ hoặc tên hoặc tên đệm đã có thì form sẽ xuất ra thông tin nếu không sẽ hiện thông báo không tìm thấy và quay lại bảng có đầy đủ đối tượng Khi cần reset lại phần tìm kiếm theo tên chỉ cần xóa những gì đã nhập ở ô text tìm kiếm và click “Tìm”, giao diện sẽ thông báo không tìm thấy và quay lại với đầy đủ tất
cả các đối tượng và ta sẽ thực các thao tác tiếp theo
Ở phần tìm kiếm theo thời gian thì ta chỉ việc chọn khung thời gian và click “Tìm”, thông tin đối tượng cần tìm sẽ xuất hiện Nếu không tìm thấy sẽ thông báo và quay lại giao diện ban đầu Khi muốn reset tìm kiếm ta chọn khung thời gian ngoài phạm vi các đối tượng và click “Tìm”, tương tự phần reset tìm kiếm theo tên
- Phân Công Công Việc
Nguyễn Nhựt Phong Viết code phần thuật toán và code
Winform, báo cáo chương 3
Nguyễn Tôn Minh Quân Làm báo cáo chương 2
Lưu ý: nhiệm vụ cần phân công rõ ràng, ko có kiểu là “cùng nhau” làm cái này !
Downloaded by vu ga (vuchinhhp2@gmail.com)
Trang 2323
TÀI LIỆU THAM KHẢO
1 Tham khảo kiểu dữ liệu DateTime và phương thức liên quan:
https://openplanning.net/10457/csharp-date-time
2 Tham khảo DataTable và các phương thức:
https://freetuts.net/datatable-trong-c-sharp-5447.html