Chương 1: Giới thiệu1.1 Giới thiệu đề bài Xây dựng chức năng tìm kiếm và sắp xếp trên các cấu trúc hỗ trợ quản lý danh mục đồng hồ được bán một đơn vị gồm các thông tin: Mã sản phẩm MaSP
Trang 1TRƯỜNG ĐẠI HỌC TÀI CHÍNH – MARKETING
ĐỒ ÁN MÔN HỌC CẤU TRÚC DỮ LIỆU VÀ GIẢI
THUẬT
Giảng viên : Nguyễn Quốc ThanhSinh viên thực hiện : Đỗ Tường Vy
MSSV : 2021010354Lớp : 20DHT05
Trang 2ĐỒ ÁN MÔN HỌC CẤU TRÚC DỮ LIỆU VÀ GIẢI
THUẬT
Giảng viên : Nguyễn Quốc ThanhSinh viên thực hiện : Đỗ Tường Vy
MSSV : 2021010354Lớp : 20DHT05
TPHCM - 12/2020
Trang 3MỤC LỤC
Lời Cam Đoan 4
Lời Cảm Ơn 5
Chươ ng 1: Giớ i thiệu 6
1.1 Gi ớithi uệ đềề bài 6
1.2 Cấấu trúc 6
1.3 Dữ liệu mấẫu 7
1.4 Các chức năng 8
Ch ngươ2: Tìm kiềấm và săấp xềấp trền m ảng cấấu trúc 9
2.1 Nh pậdanh sách đồềng hồề 9
2.2 Xuấất thồng tin đồềng hồề 11
2.3 Tìm kiềấm mã sản phẩm với Linearsearch và Binarysearch: 13
2.4 Tìm thồng tin ĐH theo hãng s nả xuấất dùng Linearsearch và Binarysearch 16
2.5 Săấp xềấp danh sách theo Mã sả n phẩm dùng Shaker Sort 20
2.6 Săấp xềấp danh sách theo Mã sản phẩm dùng Selection Sort 22
2.7 Săấp xềấp danh sách theo Hãng s ản xuấất dùng Interchange Sort 24
2.8 Săấp xềấp danh sách theo Trọ ng lượng dùng Bubble Sort 26
2.9 Săấp xềấp danh sách theo Giá dùng Insertion Sort 28
2.10 Săấp xềấp danh sách theo thờ i gian Bảo hành dùng Quick Sort 30
Ch ngươ3: Tìm kiềấm và săấp xềấp trền danh sách liền kềất 33
3.1 Định nghĩa DSLK 33
3.2 Các thao tác cơ bản trền DSLK 34
3.3 Tìm kiềấm thồng tin đồềng hồề theo mã sản phẩm 39
3.4 Tìm thồng tin ĐH theo tền hãng s nả xuấất dùng Linear Search 42
3.5 Săấp xềấp danh sách theo mã sản phẩm dùng Sharker Sort 44
3.6 Săấp xềấp danh sách theo Mã sản phẩm dùng Selection Sort 44
3.7 Săấp xềấp danh sách theo Mã sả n phẩm dùng Interchange Sort 46
3.8 Săấp xềấp danh sách theo Trọ ng lượng dùng Bubble Sort 48
3.9 Săấp xềấp danh sách theo thờ i gian Bảo hành dùng Insertion Sort 50
3.10 Săấp xềấp danh sách theo thờ i gian Bảo hành dùng Quick Sort 52
Trang 5Lời Cam Đoan
Tôi xin cam đoan bài đồ án này là do chính tôi thực hiện cùng với sựu hổ trợ từ giáo viên giảng dạy bộ môn hướng dẫn và các bạn bè trong nhóm học tập không đánh cắp đồ án của người khác làm của riêng cho mình và hưởng quyền lợi trên công sức của người khác
Tôi xin chịu hoàn toàn trách nhiệm về lời cam đoan trên !
Sinh Viên
Đỗ Tường Vy
Trang 6dạy bộ môn cấu trúc dữ liệu và giải thuật nói riêng.Và em xin gửi lời cám ơn đặc biệt nhất đến Thầy Nguyễn Quốc Thanh giáo viên giảng dạy và hướng dẫn em thực hiện tốt bài đồ án lần này
Em xin trân trọng cảm ơn !
Sinh Viên
Đỗ Tường Vy
Trang 7Chương 1: Giới thiệu
1.1 Giới thiệu đề bài
Xây dựng chức năng tìm kiếm và sắp xếp trên các cấu trúc hỗ trợ quản lý danh mục đồng hồ được bán một đơn vị gồm các thông tin: Mã sản phẩm (MaSP); Hãng sản xuất (HangSX); Giới tính (đồng hồ nữ, đồng hồ nam, trung tính, ) (GioiTinh); Trọng lượng của đồng hồ (TrongLuong); Thời gian bảo hành (tháng) (BaoHanh); Giá bán (Gia)
1.2 Cấu trúc
Mô tả cấu trúc được yêu cầu, chọn CTDL để thể hiện, khai báo/định nghĩa cấu trúc
Thông tin sản phẩm đồng hồ cần quản lý gồm:
- MaSP: Mã sản phẩm, gồm một chuỗi ký tự số có chiều dài 11 ký tự
- HangSX: Hãng sản xuất, chiều dài mỗi chữ khoảng 10 ký tự
- GioiTinh: Giới tính, chỉ gồm 1 chữ với chiều dài chữ khoảng 10 ký tự
- TrongLuong: Trọng lượng đồng hồ
- BaoHanh: Thời gian bảo hành của đồng hồ
- Gia: Giá bán của đồng hồ
Cấu trúc dữ liệu hỗ trợ quản lý thông tin các đồng hồ:
- MaSP: chuỗi gồm 11 ký tự số
- HangSX: chuỗi tối đa 10 ký tự
- GioiTinh: chuỗi tối đa 10 ký tự
- TrongLuong: số nguyên không âm (TrongLuong >= 0)
- BaoHanh: số nguyên không âm (BaoHanh >= 0)
Trang 91.4 Các chức năng (Liệt kê các chức năng sẽ xây dựng)
Các chức năng trên mảng cấu trúc
- Nhập danh sách đồng hồ
- Xuất danh sách đồng hồ
- Tìm thông tin ĐH theo mã số x (dùng Linear Search và Binary Search)
- Tìm thông tin ĐH theo hãng sản xuất (dùng Linear Search và Binary Search)
- Sắp xếp danh sách theo Mã sản phẩm (dùng Shaker Sort)
- Sắp xếp danh sách theo Mã sản phẩm (dùng Selection Sort)
- Sắp xếp danh sách theo Mã sản phẩm (dùng Interchange Sort)
- Sắp xếp danh sách theo Trọng lượng (dùng Bubble Sort)
- Sắp xếp danh sách theo Giá (dùng Insertion Sort)
- Sắp xếp danh sách theo thời gian Bảo hành (dùng Quick Sort)
- Sắp xếp danh sách theo Mã sản phẩm (dùng Merge Sort)
Các chức năng trên danh sách liên kết
- Nhập danh sách đồng hồ
- Xuất danh sách đồng hồ
- Tìm thông tin ĐH theo mã sp x (dùng Linear Search )
- Tìm thông tin ĐH theo tên (dùng Linear Search )
- Sắp xếp danh sách theo Mã sản phẩm (dùng Shaker Sort)
- Sắp xếp danh sách theo Mã sản phẩm (dùng Selection Sort)
- Sắp xếp danh sách theo Mã sản phẩm (dùng Interchange Sort)
- Sắp xếp danh sách theo Trọng lượng (dùng Bubble Sort)
- Sắp xếp danh sách theo Giá (dùng Insertion Sort)
- Sắp xếp danh sách theo thời gian Bảo hành (dùng Quick Sort)
- Sắp xếp danh sách theo Trọng lượng (dùng Merge Sort)
Trang 102.1.1 Chương trình con
Để nhập danh sách đồng hồ, cần xây dựng hai chương trình con gồm:
- void nhap_o(dongho &a): hỗ trợ nhập thông tin một sinh viên gồm MaSp, HangSX, GioiTinh, TrongLuong, Baohanh, Gia
- void nhap_mang(dongho a[], int n) hỗ trợ nhập danh sách đồng hồ
Trang 112.2.2 Kiểm tra (Hàm main kiểm tra ctc)
Trang 13+Xuất ô :void xuat_o(dongho a ):hỗ trợ xuất thông tin đã nhập của một sản phẩm
Trang 142.3 Tìm kiếm mã sản phẩm với Linearsearch và Binarysearch:
2.3.1 Chương trình con
Thực hiện tìm kiếm với khóa chính là Mã sản phẩm (dữ liệu khóa)
Để tìm thông tin theo mã số của đồng hồ, cần xây dựng như sau:
void_LinearSearch(dongho a[], int n): giải thuật tìm kiếm tuyến tính, hỗ trợ tìm
ra đồng hồ có mã số cần tìm
void BinarySearch(dongho a[], int n): giải thuật tìm kiếm nhị phân, hỗ trợ tìm
ra đồng hồ có mã số cần tìm
Trang 152.3.2 Kiểm tra
Trang 16Hàm main test cho phần tìm kiếm theo mã sp bằng Linear Search
Hàm main test cho phần tìm kiếm theo mã số bằng Binary Search
2.3.3 Kết quả chạy
Kết quả chạy tìm thông tin đồng hồ có mã số 1903 có trong danh sách hàm test
Trang 17Kết quả chạy tìm thông tin đồng hồ có mã số 1902 không có trong danh sách test
2.4 Tìm thông tin ĐH theo hãng sản xuất dùng Linearsearch và Binarysearch
2.4.1 Chương trình con
Thực hiện tìm kiếm với khóa chính là Hãng sản xuất (dữ liệu khóa)
Để tìm thông tin theo mã số của đồng hồ, cần xây dựng như sau:
void_LinearSearch_h(dongho a[], int n): giải thuật tìm kiếm tuyến tính, hỗ trợ tìm ra đồng hồ có hãng sản xuất cần tìm
Trang 18void BinarySearch_h(dongho a[], int n): giải thuật tìm kiếm nhị phân, hỗ trợ tìm ra đồng hồ có hãng sản xuất cần tìm.
Trang 192.4.2 Kiểm tra
Trang 20Hàm main test cho phần tìm kiếm theo hãng sản xuất bằng Linear Search
Hàm main test cho phần tìm kiếm theo hãng dản xuất bằng Binary Search
2.4.3 Chạy kết quả
Kết quả chạy tìm thông tin đồng hồ có hãng sản xuất Omega có trong danh sách hàm test
Trang 21Kết quả chạy tìm thông tin đồng hồ có hãng sản xuất Casio không có trong danh sách hàm test
2.5 Sắp xếp danh sách theo Mã sản phẩm dùng Shaker Sort
2.5.1 Chương trình con
void ShakerSort(dongho arr[],int n): giải thuật sắp xếp các thông tin theo mã số Về
thì hoán vị hai phần tử này với mục đích đẩy phần tử bé nhất về đầu dãy Trong mỗi lần sắp xếp sẽ thựchiện 2 lượt:
Lượt đi: đẩy phần tử bé nhất về đầu dãy
Lượt về: đẩy phần tử lớn nhất về cuối dãy
void swap(dongho &a, dongho &b): hàm hoán vị hỗ trợ cho phần sắp xếp trong chương trình con
Trang 222.5.2 Kiểm tra
Trang 23Hàm main test cho phần sắp xếp thông tin theo mã sản phẩm bằng Shaker Sort.
2.5.3 Chạy kết quả
2.6 Sắp xếp danh sách theo Mã sản phẩm dùng Selection Sort
2.6.1 Chương trình con
Để sắp xếp thông tin theo mã sản phầm, ta cần xây dựng như sau:
void SelectionSort(dongho arr[], int n): giải thuật sắp xếp bằng chọn trực tiếp Với ý tưởng chọn phần tử nhỏ nhất trong mảng, đưa phần tử này về đầu mảng,tiếp tục lặp lại để sắp xếp mảng từ vị trí thứ 2
void hoanvi(dongho &a, dongho &b): hàm hoán vị hỗ trợ việc hoán vị các phần tử trong chương trình con SelectionSort
Trang 242.6.2 Kiểm tra
Hàm main test cho phần sắp xếp thông tin theo mã sản phẩm bằng Selection Sort.
2.6.3 Chạy kết quả
Trang 252.7 Sắp xếp danh sách theo Hãng sản xuất dùng Interchange Sort
2.7.1 Chương trình con
Để sắp xếp thông tin theo Hãn sản xuất, ta cần xây dựng như sau:
void InterchangeSort(dongho arr[], int n): giải thuật sắp xếp bằng đổi chỗ trựctiếp Với ý tưởng bắt đầu từ đầu mảng, tìm các nghịch thế (phần tử sau bé hơnphần tử trước) của phần tử này, thực hiện hoán vị nếu có, sau đó lặp lại từ phần tử kế tiếp cho đến khi mảng được sắp xếp
void hoanvi(Bangdiem &a, Bangdiem &b): thuật toán hoán vị hỗ trợ hoán vị các phần tử nghịch thế trong chương trình con Interchange Sort
Trang 262.7.2 Kiểm tra
Hàm main test cho phần sắp xếp thông tin theo mã sản phẩm bằng Interchange Sort.
2.7.3 Chạy kết quả
Trang 272.8 Sắp xếp danh sách theo Trọng lượng dùng Bubble Sort
2.8.1 Chương trình con
Để sắp xếp thông tin theo trọng lượng, ta cần xây dựng như sau:
void BubbleSort(dongho a[], int n): giải thuật sắp xếp nổi bọt Với ý tưởng xuất phát từ cuối dãy, hoán vị các cặp nghịch thế kế tiếp nhau và cứ lặp lại cho đến khi mảng được sắp xếp
void hoanvi(dongho &a, dongho &b): hàm hoán vị hỗ trợ cho việc hoán vị cácnghịch thế trong chương trình con Bubble Sort
Trang 28Hàm main test cho phần sắp xếp thông tin theo trọng lượng bằng Bubble Sort.
2.8.3 Chạy kết quả
Trang 292.9 Sắp xếp danh sách theo Giá dùng Insertion Sort
2.9.1 Chương trình con
Để sắp xếp thông tin theo giá, ta cần xây dựng như sau:
void InsertionSort(dongho arr[], int n): giải thuật sắp xếp chèn trực tiếp Với
ý tưởng chia mảng cần sắp xếp thành 2 mảng con, mảng T chứa arr[0], mảng
P chứa phần còn lại Chọn 1 phần tử arr[i] trong P, tìm vị trí thích hợp và chèn arr[i] vào mảng T Lặp lại cho đến khi mảng P rỗng
void hoanvi(dongho &a, dongho &b): hàm hoán vị hỗ trợ cho việc hoán vị cácnghịch thế trong chương trình con Insertion Sort
Trang 302.9.2 Kiểm tra
Hàm main test cho phần sắp xếp thông tin theo giá bằng Insertion Sort.
2.9.3 Chạy kết quả
Trang 312.10 Sắp xếp danh sách theo thời gian Bảo hành dùng Quick Sort
2.10.1 Chương trình con
Để sắp xếp thông tin theo thời gian bảo hành, ta cần xây dựng như sau:
void QuickSort(dongho arr[], int n): Giải thuật sắp xếp với ý tưởng phân chia mảng ban đầu thành 3 mảng con Mảng con 1 gồm các phần tử nhỏ hơn x, mảng con 2 gồm 1 phần tử x, mảng con 3 gồm các phần tử lớn hơn x Sau đó tiếp tục áp dụng Quick Sort cho dãy con 1 và dãy con 3
Trang 322.10.2 Kiểm tra
Hàm main test cho phần sắp xếp thông tin theo thời gian bảo hành bằng Quick
Sort.
2.10.3 Chạy kết quả
Trang 34Đầu tiên, chúng ta xem xét cách cài đặt DSLK hỗ trợ quản lý danh sách Đồng hồ.Nội dung gồm 3 bước:
Định nghĩa phần thông tinĐịnh nghĩa nút
Định nghĩa DSLK
3.1.1 Định nghĩa phần thông tin
3.1.2 Định nghĩa nút
Nút là 1 phần tử của danh sách gồm 2 phần
Phần thông tin (data)
Phần con trỏ tiep dùng để chỉ vào nút sau và tạo liên kết với phần tử sau
3.1.3 Định nghĩa DSLK
Một DSLK được quản lý bởi 2 con trỏ
Head chỉ vào con trỏ đầu
Trang 353.2 Các thao tác cơ bản trên DSLK
3.2.1 Khởi tạo DSLK
DSLK ban đầu chưa có phần tử nào nên con trỏ pHead và pTail sẽ chỉ vào giá trị NULL.Việc khởi tạo 1 DSLK đơn giản là cho 2 con trỏ này chỉ
Trang 36Bước 3: Đưa Node (nút) vào DSLK
Bước 4: Tạo yêu cầu nhập tiếp và ngừng nhập
Trang 37Hàm main test
Chạy kết quả
Trang 383.2.3 Xuất DSLK
Xuất thông tin
Trang 39In Node ra màn hình
In danh sách liên kết ra màn hình
Hàm main kiểm tra
Trang 40Nguyên tắc hoạt động
Trang 41So sánh với phần tử đầu tiên nếu đúng kết thúc chương trình và đưa ra dữ liệu trong Node đó, nếu sai chuyển sang so sách với Node kế tiếp
3.3.2 Kiểm tra
Trang 423.3.3 Chạy kết quả
Trang 433.4 Tìm thông tin ĐH theo tên hãng sản xuất dùng Linear Search
3.4.1 Chương trình con
3.4.2 Kiểm tra
Trang 443.4.3 Chạy kết quả
Trang 453.5 Sắp xếp danh sách theo mã sản phẩm dùng Sharker Sort
Giống với BinarySearch, để thực hiện ShakerSort cần xác định được phần tử cuối cùng Thế nên, ShakerSort không thể thực hiện trên DSLK
3.6 Sắp xếp danh sách theo Mã sản phẩm dùng Selection Sort
Trang 463.6.3 Chạy kết quả
Trang 473.7 Sắp xếp danh sách theo Mã sản phẩm dùng Interchange Sort
Trang 483.7.3 Chạy kết quả
Trang 493.8 Sắp xếp danh sách theo Trọng lượng dùng Bubble Sort
3.8.1 Chương trình con
Nguyên tắc hoạt động
Giống với các bọt nước càng nhẹ thì nổi lên càng nhanh, tương tự với các hòn đá càng nặng chìm xuống đáy càng nhanh Theo ý tưởng đó ta đưa các phần tử lớn về cuối dãy và giảm dần về đầu dãy
Trang 503.8.2 Kiểm tra
Trang 513.9 Sắp xếp danh sách theo thời gian Bảo hành dùng Insertion Sort
3.9.1 Chương trình con
3.9.2 Kiểm tra
Trang 523.9.3 Chạy kết quả
Trang 533.10 Sắp xếp danh sách theo thời gian Bảo hành dùng Quick Sort
3.10.1 Chương trình con
Ý tưởng: Chia các phần tử trong DSLK đơn ra thành 2 danh sách con và 1
node cờ (node x trong vd dưới đây) 1 danh sách l1 sẽ chứa các node có trường data<= data của node x Danh sách l2 còn lại sẽ chứa các có trường data>= trường data của node x, sắp xếp từng danh sách l1,l2 sau đó nối l1,x,l2 lại với nhau ta có danh sách liên kết đã được sắp xếp theo thứ tự
3.10.2 Kiểm tra
Trang 543.10.3 Chạy kết quả