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ý thông tin sản phẩm tồn kho bao gồm: Mã sản phẩm MaSP, Mã KhoMaKho, Lượng sản phẩm tồn trong kho LuongTon, Chi phí
Trang 1Danh sách liên kết đơn”
Giảng viên hướng
Trang 2Mục lục
1 Giới thiệu đề bài 6
2.1 Các thông tin cần quản lý 62.2 Cấu trúc dữ liệu hỗ trợ quản lý thông tin sinh viên 62.3 Định nghĩa cấu trúc tồn kho 72.4 Nhập một sản phẩm tồn kho 72.5 Xuất một sản phẩm tồn kho 82.6 Hoán đổi dữ liệu 2 sản phẩm 9
4 Các chức năng 114.1 Các chức năng trên mảng cấu trúc 114.2 Các chức năng trên Danh sách liên kết đơn 11
Chương II Tìm kiếm và sắp xếp trên Mảng cấu trúc 12
7 Sắp xếp mảng theo Mã sản phẩm bằng Shaker Sort 19
8 Sắp xếp mảng theo Mã kho bằng Selection Sort 21
Trang 39 Sắp xếp mảng theo Mã sản phẩm bằng Interchange Sort 21
10 Sắp xếp mảng theo Mã kho bằng Bubble Sort 22
11 Sắp xếp mảng theo Ngày kiểm tra bằng Insertion Sort 22
12 Sắp xếp mảng theo Lượng tồn bằng Merge Sort 23
13 Sắp xếp mảng theo Lượng tồn bằng Quick Sort 25
14 Kiểm thử các tính năng của chương trình 26
14.1 Menu các lựa chọn cho người dùng 2614.2 Hàm main() 2614.3 Kiểm thử nhập dữ liệu 30
1 Nhập dữ liệu từ bàn phím 30
2 Nhập dữ liệu từ file 3114.4 Kiểm thử các tính năng tìm kiếm và sắp xếp 31
6 Sắp xếp mảng theo Mã sản phẩm bằng Shaker Sort 34
7 Sắp xếp mảng theo Mã kho bằng Selection Sort 34
8 Sắp xếp mảng theo Mã sản phẩm bằng Interchange Sort
35
9 Sắp xếp mảng theo Mã kho bằng Bubble Sort 36
10 Sắp xếp mảng theo Ngày kiểm tra bằng Insertion Sort
37
11 Sắp xếp mảng theo Lượng tồn bằng Merge Sort 38
12 Sắp xếp mảng theo Lượng tồn bằng Quick Sort 40
Trang 4Chương III Tìm kiếm và sắp xếp trên Danh sách liên kết đơn.
40
1 Định nghĩa DSLK 40
2 Một số thao tác trên DSLK 412.1 Tạo mới một Node 412.2 Khởi tạo DSLK rỗng 422.3 Thêm 1 node vào cuối DSLK 422.4 Truy cập con trỏ giữa DSLK 422.5 Truy cập con trỏ cuối DSLK 43
9 Sắp xếp DSLK theo Mã kho bằng Selection Sort 48
10 Sắp xếp DSLK theo Mã sản phẩm bằng Interchange Sort 48
11 Sắp xếp DSLK theo Mã kho bằng Bubble Sort 49
12 Sắp xếp DSLK theo Ngày kiểm tra bằng Insertion Sort 49
13 Sắp xếp DSLK theo Lượng tồn bằng Merge Sort 51
14 Sắp xếp DSLK theo Lượng tồn bằng Quick Sort 53
15 Kiểm thử các tính năng của chương trình 5515.1 Menu các lựa chọn cho người dùng 5515.2 Hàm main() 56
Trang 515.3 Kiểm thử nhập dữ liệu 60
1 Nhập dữ liệu từ bàn phím 60
2 Nhập dữ liệu từ file 6115.4 Kiểm thử các tính năng tìm kiếm và sắp xếp 61
6 Sắp xếp DSLK theo Mã kho bằng Selection Sort 64
7 Sắp xếp DSLK theo Mã sản phẩm bằng Interchange Sort
64
8 Sắp xếp DSLK theo Mã kho bằng Bubble Sort 65
9 Sắp xếp DSLK theo Ngày kiểm tra bằng Insertion Sort.66
10 Sắp xếp DSLK theo Lượng tồn bằng Merge Sort 67
11 Sắp xếp DSLK theo Lượng tồn bằng Quick Sort 68
Trang 6Chương I Giới thiệu.
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ý thông tin sản phẩm tồn kho bao gồm: Mã sản phẩm (MaSP), Mã Kho(MaKho), Lượng sản phẩm tồn trong kho
(LuongTon), Chi phí lưu kho mỗi ngày (ChiPhi), Ngày kiểm tra sản phẩm lần cuối (NgayKT)
2 Cấu trúc.
2.1 Các thông tin cần quản lý.
● MaSP: Mã sản phẩm, gồm một chuỗi ký tự với 2 phần, những
ký tự chữ cái đầu là tên viết tắt của sản phẩm, những ký tự số theo sau là số thứ tự sản phẩm Mỗi sản phẩm có mã sản phẩm duy nhất
● MaKho: Mã kho, gồm một chuỗi ký tự với 2 phần, những ký tự chữ cái đầu là tên viết tắt của kho, những ký tự số theo sau là
số thứ tự kho
● LuongTon: Lượng sản phẩm tồn trong kho, là một số nguyên không âm
● ChiPhi: Chi phí lưu kho mỗi ngày, là một số thực không âm
● NgayKT: Ngày kiểm tra sản phẩm lần cuối được viết dưới dạngtháng trước ngày sau (MM/DD)
2.2 Cấu trúc dữ liệu hỗ trợ quản lý thông tin sinh viên.
● MaSP: xâu ký tự
● MaKho: xâu ký tự
● LuongTon: số nguyên không âm (LuongTon >= 0)
● ChiPhi: số thực không âm (ChiPhi >= 0.00)
● NgayKT: chuỗi ký tự
Trang 72.3 Định nghĩa cấu trúc tồn kho.
Trang 8Kết quả gọi hàm:
Hàm hỗ trợ xuất dữ liệu cho 1 sản phẩm tồn kho trong mảng cấu
trúc, kèm thứ tự
Kết quả gọi hàm:
Trang 92.6 Hoán đổi dữ liệu 2 sản phẩm.
Hàm thay đổi dữ liệu 2 biến TONKHO hỗ trợ cho các hàm sắp xếp
Trang 10● Sắp xếp mảng theo Mã sản phẩm bằng Shaker Sort
● Sắp xếp mảng theo Mã kho bằng Selection Sort
● Sắp xếp mảng theo Mã sản phẩm bằng Interchange Sort
● Sắp xếp mảng theo Mã kho bằng Bubble Sort
● Sắp xếp mảng theo Ngày kiểm tra bằng Insertion Sort
● Sắp xếp mảng theo Lượng tồn bằng Merge Sort
● Sắp xếp mảng theo Lượng tồn bằng Quick Sort
4.2 Các chức năng trên Danh sách liên kết đơn.
● Sắp xếp DSLK theo Mã kho bằng Selection Sort
● Sắp xếp DSLK theo Mã sản phẩm bằng Interchange Sort
● Sắp xếp DSLK theo Mã kho bằng Bubble Sort
● Sắp xếp DSLK theo Ngày kiểm tra bằng Insertion Sort
● Sắp xếp DSLK theo Lượng tồn bằng Merge Sort
Trang 11● Sắp xếp DSLK theo Lượng tồn bằng Quick Sort
Trang 12Chương II Tìm kiếm và sắp xếp trên
Trang 13Kết quả gọi hàm:
2 Xuất mảng.
Hàm xuất dữ liệu cho 1 mảng cấu trúc, mỗi lần lặp sẽ gọi đến hàm xuất dữ liệu cho 1 biến kèm số thứ tự
Trang 14Kết quả gọi hàm:
3 Tìm kiếm sản phẩm theo mã sản phẩm bằng thuật toán Linear Search.
Thuật toán Linear Search sẽ duyệt qua mảng cấu trúc để tìm sản phẩm có mã cần tìm Ưu điểm của thuật toán này là mảng không cần được sắp xếp, phù hợp với bộ dữ liệu nhỏ Nhược điểm làvới bộ dữ liệu lớn thì trường hợp tệ nhất phải so sánh n lần Độ phứctạp O(n)
Nếu tìm thấy sẽ gọi hàm in thông tin sản phẩm này ra và trả
về vị trí xuất hiện của sản phẩm
Nếu không tìm thấy hàm sẽ in ra là sản phẩm không tồn tại vàtrả về -1
Trang 15Kết quả gọi hàm:
4 Tìm kiếm sản phẩm theo Mã sản phẩm bằng thuật toán Binary Search.
Thuật toán Binary Search sẽ chặt đôi mảng cấu trúc để tìm sản phẩm có mã cần tìm Ưu điểm của thuật toán này là tốc độ tìm kiếm nhanh, phù hợp với bộ dữ liệu lớn Nhược điểm là bộ dữ liệu phải được sắp xếp Độ phức tạp O(log2(n))
Nếu tìm thấy sẽ gọi hàm in thông tin sản phẩm này ra và trả
về vị trí xuất hiện của sản phẩm
Nếu không tìm thấy hàm sẽ in ra là sản phẩm không tồn tại vàtrả về -1
Trang 16Nếu tìm thấy sẽ gọi hàm in thông tin sản phẩm này ra và trả
về vị trí xuất hiện của sản phẩm
Nếu không tìm thấy hàm sẽ in ra là sản phẩm không tồn tại vàtrả về -1
Trang 17Nếu tìm thấy sẽ gọi hàm in thông tin sản phẩm này ra và trả
về vị trí xuất hiện của sản phẩm
Nếu không tìm thấy hàm sẽ in ra là sản phẩm không tồn tại vàtrả về -1
Trang 18Kết quả gọi hàm:
Trang 197 Sắp xếp mảng theo Mã sản phẩm bằng Shaker Sort.
Shaker Sort duyệt từ đầu đến cuối mảng và so sánh 2 phần tử liên tiếp nhau và đưa về đúng vị trí Rồi duyệt ngược từ cuối mảng
về và cũng so sánh 2 phần tử liên tiếp Như vậy sau mỗi lần lặp phần tử lớn nhất và nhỏ nhất trong đoạn chưa được sắp xếp sẽ đượcđưa về đúng vị trí
Trang 20Thuật toán Interchange Sort sẽ bắt đầu duyệt từ phần tử đầu tiên và so sánh nó với tất cả các phần tử còn lại trong đoạn chưa được sắp xếp và thực hiện đổi chỗ nếu cần thiết Sau mỗi vòng lặp phần tử nhỏ nhất trong đoạn chưa được sắp xếp sẽ được đưa về
đầu
Trang 2110 Sắp xếp mảng theo Mã kho bằng Bubble Sort.
Thuật toán sắp xếp bubble sort thực hiện sắp xếp dãy số bằng cách lặp lại công việc đổi chỗ 2 số liên tiếp nhau nếu chúng đứng sai vị trí Sau mỗi vòng lặp phần tử lớn nhất sẽ được đưa về cuối đoạn chưa được sắp xếp
11 Sắp xếp mảng theo Ngày kiểm tra bằng Insertion Sort.
Thuật toán sắp xếp chèn thực hiện sắp xếp dãy số theo cách duyệt từng phần tử và chèn từng phần tử đó vào đúng vị trí trong mảng con (dãy số từ đầu đến phần tử phía trước nó) đã sắp xếp sao cho dãy số trong mảng sắp đã xếp đó vẫn đảm bảo tính chất của
Trang 22một dãy số tăng dần.
12 Sắp xếp mảng theo Lượng tồn bằng Merge Sort.
Thuật toán này chia mảng cần sắp xếp thành 2 nửa Tiếp tục lặp lại việc này ở các nửa mảng đã chia Sau cùng gộp các nửa đó thành mảng đã sắp xếp
Trang 23Hàm merge() được sử dụng để gộp hai nửa mảng Hàm merge(arr, l, m, r) là tiến trình quan trọng nhất sẽ gộp hai nửa mảng thành 1 mảng sắp xếp, các nửa mảng là arr[l…m] và arr[m+1…r] sau khi gộp sẽ thành một mảng duy nhất đã sắp xếp
Trang 2413 Sắp xếp mảng theo Lượng tồn bằng Quick Sort.
Quick Sort chọn một phần tử trong mảng làm điểm đánh dấu(pivot) Thuật toán sẽ thực hiện chia mảng thành các mảng con dựa vào pivot đã chọn Việc lựa chọn pivot ảnh hưởng rất nhiều tới tốc độ sắp xếp Nhưng máy tính lại không thể biết khi nào thì nên chọn theo cách nào
Trang 2514 Kiểm thử các tính năng của chương trình.
14.1 Menu các lựa chọn cho người dùng.
Trang 2614.2 Hàm main().
Trang 2814.3 Kiểm thử nhập dữ liệu.
1 Nhập dữ liệu từ bàn phím.
Trang 292 Nhập dữ liệu từ file.
14.4 Kiểm thử các tính năng tìm kiếm và sắp xếp.
1 Xuất mảng.
Trang 302 Tìm kiếm sản phẩm theo mã sản phẩm bằng thuật toán Linear Search.
3 Tìm kiếm sản phẩm theo Mã sản phẩm bằng thuật toán Binary Search.
Trang 314 Tìm kiếm vị trí sản phẩm theo Mã kho bằng thuật toán Linear Search.
5 Tìm kiếm vị trí sản phẩm theo Mã kho bằng thuật toán Binary Search.
Trang 326 Sắp xếp mảng theo Mã sản phẩm bằng Shaker Sort.
7 Sắp xếp mảng theo Mã kho bằng Selection Sort.
Trang 338 Sắp xếp mảng theo Mã sản phẩm bằng Interchange Sort.
Trang 349 Sắp xếp mảng theo Mã kho bằng Bubble Sort.
Trang 3510 Sắp xếp mảng theo Ngày kiểm tra bằng Insertion Sort.
Trang 3611 Sắp xếp mảng theo Lượng tồn bằng Merge Sort.
Trang 3812 Sắp xếp mảng theo Lượng tồn bằng Quick Sort.
Chương III Tìm kiếm và sắp xếp trên
Danh sách liên kết đơn.
1 Định nghĩa DSLK.
Danh sách liên kết đơn gồm có 1 Node head trỏ vào phần tử đầu tiên trong DSLK và 1 Node tail trỏ vào phần tử cuối cùng trong
Trang 39DSLK Ngoài ra có 1 biến size kiểu nguyên để tiện cho việc đếm số lượng phần tử trong DSLK
Ưu điểm của DSLK là tính linh động, ta có thể thay đổi kích thước của DSLK thoải mái nhưng bù lại nhược điểm của DSLK là tốc
độ truy cập chậm, không thể truy cập bằng chỉ số mà phải duyệt lầnlượt từ phần tử đầu đến phần tử cần truy cập
Mỗi Node lưu trữ 1 biến data có kiểu dữ liệu TONKHO và 1 con trỏ next trỏ đến phần tử tiếp theo
2 Một số thao tác trên DSLK.
2.1 Tạo mới một Node.
Hàm tạo mới một Node với data và con trỏ next được truyền vào mặc định là NULL
Trang 402.2 Khởi tạo DSLK rỗng.
Để khởi tạo DSLK ta gán con trỏ head và tail = NULL và kích thước = 0
2.3 Thêm 1 node vào cuối DSLK.
Nếu DSLK rỗng thì thêm vào đầu, nếu không thì thêm vào cuối
2.4 Truy cập con trỏ giữa DSLK.
Hàm này trả về con trỏ trỏ vào phần tử nằm giữa DSLK
Trang 412.5 Truy cập con trỏ cuối DSLK.
3 Nhập DSLK.
Hàm nhập 1 list các sản phẩm tồn kho Mỗi lần lặp sẽ nhập dữliệu cho biến TONKHO và thêm sản phẩm này vào cuối DSLK
a Nhập từ bàn phím.
Trang 42Duyệt qua từng phần tử trong DSLK đến khi tìm thấy hoặc đến hết DSLK.
Trang 436 Tìm kiếm sản phẩm theo Mã sản phẩm bằng thuật toán Binary Search.
Chặt nhị phân trên DSLK đến khi tìm thấy hoặc không thể chặt nhỏ hơn
Trang 447 Tìm kiếm vị trí sản phẩm theo Mã kho bằng thuật toán Linear Search.
Duyệt qua từng phần tử trong DSLK đến khi tìm thấy hoặc đến hết DSLK
8 Tìm kiếm vị trí sản phẩm theo Mã kho bằng thuật toán Binary Search.
Chặt nhị phân trên DSLK đến khi tìm thấy hoặc không thể chặt nhỏ hơn
Trang 45Thuật toán Interchange Sort sẽ bắt đầu duyệt từ phần tử đầu tiên và so sánh nó với tất cả các phần tử còn lại trong đoạn chưa được sắp xếp và thực hiện đổi chỗ nếu cần thiết Sau mỗi vòng lặp phần tử nhỏ nhất trong đoạn chưa được sắp xếp sẽ được đưa về đầu.
Trang 4611 Sắp xếp DSLK theo Mã kho bằng Bubble Sort.
Thuật toán sắp xếp bubble sort thực hiện sắp xếp dãy số bằng cách lặp lại công việc đổi chỗ 2 số liên tiếp nhau nếu chúng đứng sai vị trí Sau mỗi vòng lặp phần tử lớn nhất sẽ được đưa về cuối đoạn chưa được sắp xếp
12 Sắp xếp DSLK theo Ngày kiểm tra bằng Insertion Sort.
Thuật toán sắp xếp chèn thực hiện sắp xếp dãy số theo cách duyệt từng phần tử và chèn từng phần tử đó vào đúng vị trí trong mảng con (dãy số từ đầu đến phần tử phía trước nó) đã sắp xếp sao cho dãy số trong mảng sắp đã xếp đó vẫn đảm bảo tính chất của một dãy số tăng dần
Trang 4813 Sắp xếp DSLK theo Lượng tồn bằng Merge Sort.
Thuật toán này chia mảng cần sắp xếp thành 2 nửa Tiếp tục lặp lại việc này ở các nửa mảng đã chia Sau cùng gộp các nửa đó thành mảng đã sắp xếp
Hàm merge() được sử dụng để gộp hai nửa mảng Hàm merge(arr, l, m, r) là tiến trình quan trọng nhất sẽ gộp hai nửa mảng thành 1 mảng sắp xếp, các nửa mảng là arr[l…m] và arr[m+1…r] sau khi gộp sẽ thành một mảng duy nhất đã sắp xếp
Trang 4914 Sắp xếp DSLK theo Lượng tồn bằng Quick Sort.
Quick Sort chọn một phần tử trong mảng làm điểm đánh dấu(pivot) Thuật toán sẽ thực hiện chia mảng thành các mảng con dựa vào pivot đã chọn Việc lựa chọn pivot ảnh hưởng rất nhiều tới tốc độ sắp xếp Nhưng máy tính lại không thể biết khi nào thì nên chọn theo cách nào
Trang 5115 Kiểm thử các tính năng của chương trình.
15.1 Menu các lựa chọn cho người dùng.
15.2 Hàm main().
Trang 5415.3 Kiểm thử nhập dữ liệu.
1 Nhập dữ liệu từ bàn phím.
Trang 552 Nhập dữ liệu từ file.
15.4 Kiểm thử các tính năng tìm kiếm và sắp xếp.
1 Xuất DSLK.
Trang 562 Tìm kiếm sản phẩm theo mã sản phẩm bằng thuật toán Linear Search.
3 Tìm kiếm sản phẩm theo Mã sản phẩm bằng thuật toán Binary Search.
Trang 574 Tìm kiếm vị trí sản phẩm theo Mã kho bằng thuật toán Linear Search.
5 Tìm kiếm vị trí sản phẩm theo Mã kho bằng thuật toán Binary Search.
Trang 586 Sắp xếp DSLK theo Mã kho bằng Selection Sort.
7 Sắp xếp DSLK theo Mã sản phẩm bằng
Interchange Sort.
Trang 598 Sắp xếp DSLK theo Mã kho bằng Bubble Sort.
Trang 609 Sắp xếp DSLK theo Ngày kiểm tra bằng Insertion Sort.
Trang 6110 Sắp xếp DSLK theo Lượng tồn bằng Merge Sort.
Trang 6211 Sắp xếp DSLK theo Lượng tồn bằng Quick Sort.