BỘ TÀI CHÍNH
TRƯỜNG ĐẠI HỌC TÀI CHÍNH - MARKETING
Báo cáo bài tập lớn môn: “Cấu trúc dữliệu và Giải thuật”
TP Hồ Chí Minh, 2022
Trang 2Lời cảm ơn
Lời nói đầu tiên em xin gửi lời cảm ơn đến giáo viên trong toàn khoa CNTTcủa Trường Đại Học Tài chính Marketing nói chung và giáo viên chuyên ngành giảngdạy bộ môn cấu trúc dữ liệu và giải thuật nói riêng Em cũng xin gửi lời cảm ơn đặcbiệt nhất đến Thầy Nguyễn Quốc Thanh, giáo viên trực tiếp giảng dạy và hướng dẫnem thực hiện tốt bài tập lớn này
Em xin trân trọng cảm ơn!
Sinh viên Lương Mạnh Nhã Vy.
Trang 3Nhận xét của Giáo viên
- Điểm chữ:
Thành phố Hồ Chí Minh, ngày……tháng……năm 2022
Trang 4Danh mục hình ảnh
Hình 2.1 Kết quả nhập thông tin đơn hàng 12
Hình 2.2 Kết quả in thông tin đơn hàng 14
Hình 2.3 Kết quả tìm kiếm thông tin đơn hàng theo mã 16
Hình 2.4 Kết quả in ra sau khi sắp xếp 17
Hình 3.1 Kết quả nhập danh sách liên kết đơn hàng 20
Hình 3.2 Kết quả in ra DSLK 22
Hình 3.3 Danh sách liên kết sau khi sắp xếp bằng Bubble sort 23
Hình 3.4 Kết quả tìm kiếm bằng Binary search 25
Hình 3.5 Kết quả sau khi sắp xếp bằng selection sort 27
Hình 3.6 Kết quả sau khi xóa các đơn hàng giao điện thoại 29
Trang 5Chương 1 Giới thiệu 8
1.1 Giới thiệu đề bài 8
1.2 Cấu trúc 8
1.2.1 Các thông tin đơn hàng cần quản lý 8
1.2.2 Cấu trúc dữ liệu hỗ trợ quản lý thông tin sinh viên 8
1.2.3 Định nghĩa cấu trúc đơn hàng 8
1.3 Dữ liệu mẫu 9
1.4 Các chức năng sẽ xây dựng 9
1.4.1 Các chức năng trên Mảng cấu trúc 9
1.4.2 Các chức năng trên Danh sách liên kết 10
Chương 1 Quản lý danh sách với mảng tĩnh 10
Trang 62.3 Tìm thông tin đơn hàng theo mã bằng thuật toán binary search 14
Trang 73.5 Sắp xếp danh sách đơn hàng theo ngày giao hàng bằng Selection Sort 26
4.1.2 Trên Danh sách liên kết 30
4.2 Các chức năng chưa thực hiện 30
Trang 8Chươ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ý thông
● TrongLuong: Trọng lượng đơn hàng
1.2.2 Cấu trúc dữ liệu hỗ trợ quản lý thông tin sinh viên.● MaDH: Số nguyên
● TenSP: Xâu ký tự có bao gồm dấu cách● NVGH: Xâu ký tự có bao gồm dấu cách● Tien: Số nguyên không âm
● ThanhToan: Xâu ký tự, (COD nếu Tien > 0 và ViDT nếu Tien = 0)● NgayGH: Xâu ký tự dạng ddmmyy
● TrongLuong: Số thực dương
1.2.3 Định nghĩa cấu trúc đơn hàng.
// Cấu trúc dữ liệu của 1 đơn hàngstructDonHang
Trang 9Tien;int
// Phương thức thanh toán của đơn hàng là 1 xâu ký tự
// Nếu số tiền = 0 thì thanh toán bằng ví điện tử
// Nếu số tiền > 0 thì thanh toán bằng tền mặt
1.3 Dữ liệu mẫu.
1.4 Các chức năng sẽ xây dựng.
1.4.1 Các chức năng trên Mảng cấu trúc.
● Nhập danh sách đơn hàng.● Xuất danh sách đơn hàng.
● Tìm thông tin đơn hàng theo mã đơn hàng bằng thuật toán Binary Search.● Sắp xếp sách đơn hàng theo mã đơn hàng dùng thuật toán Bubble Sort.
1.4.2 Các chức năng trên Danh sách liên kết.
● Nhập danh sách đơn hàng.● Xuất danh sách đơn hàng.
Trang 10● Tìm thông tin đơn hàng theo mã đơn hàng bằng thuật toán Binary Search.● Sắp xếp sách đơn hàng theo mã đơn hàng dùng thuật toán Bubble Sort.● Sắp xếp danh sách đơn hàng theo ngày giao hàng bằng Selection Sort.● Xóa thông tin các đơn hàng giao điện thoại.
Chương 1 Quản lý danh sách với mảng tĩnh
2.1 Nhập danh sách đơn hàng.
2.1.1 Chương trình con.
Để nhập danh sách đơn hàng, cần xây dựng hai chương trình con gồm:
// Nhập thông tin cho 1 đơn hàngvoid nhapDonHang(DonHang* donhang);
// Nhập dữ liệu cho 1 mảng đơn hàngvoid nhapMang(DonHangdonhangs[], intn);
Nhập thông tin cho một đơn hàng:
void nhapDonHang(DonHang* donhang) {
cout <<"Nhập mã đơn hàng: "; cin >>donhang->MaDH; cout <<"Nhập tên sản phẩm: "; cin.ignore();
getline(cin, donhang->TenSP);
cout <<"Nhập tên nhân viên giao hàng: "; //cin.ignore();
getline(cin, donhang->NVGH); {do
cout <<"Nhập số tiền (>=0): "; cin >>donhang->Tien; } while (donhang->Tien < 0); // Tiền > 0 thì COD tiền = 0 thì ViDT
donhang->ThanhToan (= donhang->Tien == 0) ? "ViDT" "COD" : ; cout <<"Nhập ngày giao hàng (ddmmyy): ";
cin >>donhang->NgayGH;
cout <<"Nhập trọng lượng đơn hàng: "; cin >>donhang->TrongLuong;}
Trang 11Nhập thông tin cho một mảng đơn hàng:
void nhapMang(DonHangdonhangs[], intn){
for int ( i = 0; i < ; i++) {n
cout <<"\nNhập thông tin sản phẩm thứ "<< i + 1 <<"\n"; nhapDonHang(&donhangs[i]);
}}
2.1.2 Kiểm tra (Hàm main kiểm tra ctc)
int main(){ n = 0;int
DonHang* donhangs = NULL; cout <<"Nhập số lượng đơn hàng: "; cin >> n;
donhangs = newDonHang[n]; nhapMang(donhangs, n);}
Trang 122.1.3 Kết quả chạy
Hình 2.1 Kết quả nhập thông tin đơn hàng
2.2 Xuất danh sách đơn hàng
2.2.1 Chương trình con
Để xuất danh sách đơn hàng, cần xây dựng 2 chương trình con:
// In thông tin đơn hàng trên 1 dòng
void inDonHangmotDong(DonHangdonhang);
Trang 13// In thông tin của 1 mảng đơn hàngvoid inMang(DonHangdonhangs[], intn);
In thông tin đơn hàng trên một dòng:
void inDonHangmotDong(DonHangdonhang) {
cout << setw(10) <<donhang.MaDH <<"\t"
<< setw(25) <<donhang.TenSP <<"\t"
<< setw(15) <<donhang.NVGH <<"\t"
<< setw(10) <<donhang.Tien <<"\t"
<< setw(15) <<donhang.ThanhToan <<"\t"
<< setw(10) <<donhang.NgayGH <<"\t"
<< setw(10) <<donhang.TrongLuong <<"\n";}
inDonHangmotDong(donhangs[i]); }
2.2.2 Kiểm tra (Hàm main kiểm tra ctc)
int main() { n = 0;int
DonHang* donhangs = NULL; cout <<"Nhập số lượng đơn hàng: "; cin >> n;
donhangs = newDonHang[n]; nhapMang(donhangs, n);
//Kiểm tra in danh sách đơn hàng
inMang(donhangs, n);}
Trang 142.2.3 Kết quả chạy
Hình 2.2 Kết quả in thông tin đơn hàng
2.3 Tìm thông tin đơn hàng theo mã bằng thuật toánbinary search
2.3.1 Chương trình con
Để tìm kiếm thông tin đơn hàng theo mã bằng thuật toán binary search, cần xâydựng hai chương trình con:
// In thông tin 1 đơn hàng
void inDonHang(DonHangdonhang);
// Tìm kiếm đơn hàng bằng thuật toán tìm kiếm nhị phân
void BinarySearchMaDH(DonHangdonhangs[], intmaDH, , intlintr);
In thông tin 1 đơn hàng:
void inDonHang(DonHangdonhang) {
cout <<"Mã đơn hàng: "<<donhang.MaDH <<"\n"; cout <<"Tên sản phẩm: "<<donhang.TenSP <<"\n";
cout <<"Tên nhân viên giao hàng: "<<donhang.NVGH <<"\n"; cout <<"Số tiền: "<<donhang.Tien <<"\n";
cout <<"Phương thức thanh toán: "<<donhang.ThanhToan <<"\n"; cout <<"Ngày giao hàng (ddmmyy): "<<donhang.NgayGH <<"\n"; cout <<"Trọng lượng đơn hàng: "<<donhang.TrongLuong <<"\n";}
Tìm kiếm sản phẩm theo mã bằng binary search:
int getMid( , int intl r) {
Trang 15return + (r - l) / 2;}
void BinarySearchMaDH(DonHangdonhangs[], intmaDH, , )intlintr
( >= ) {if r l
mid = getMid( , int l r);
(if donhangs[mid].MaDH == maDH) {
cout <<"Đơn hàng "<<maDH<<" xuất hiện ở vị trí "<< mid + 1 <<"\n";
inDonHang(donhangs[mid]); return;
}
(if donhangs[mid].MaDH >= maDH) {
return BinarySearchMaDH(donhangs maDH l, , , mid - 1); }
return BinarySearchMaDH(donhangs maDH, , mid + 1, r); }
cout <<"Đơn hàng "<<maDH<<" không tồn tại\n"; return;
Hàm getMid giúp rút gọn code trong chương trình tìm kiếm.
2.3.2 Kiểm tra
int main(){ n = 0;int
DonHang* donhangs = NULL; cout <<"Nhập số lượng đơn hàng: "; cin >> n;
donhangs = newDonHang[n]; nhapMang(donhangs, n);
//Kiểm tra tìm đơn hàng theo mã bằng Binary search
inMang(donhangs, n);
cout <<"Nhập vào mã đơn hàng mà bạn muốn tìm kiếm: "; cin >> maDH
BinarySearchMaDH(donhangs, maDH, 0, n - 1);}
Trang 162.3.3 Kết quả chạy
Hình 2.3 Kết quả tìm kiếm thông tin đơn hàng theo mã
2.4 Sắp xếp đơn hàng theo mã đơn hàng dùng thuật toánBubble sort
2.4.1 Chương trình con
Cần xây dựng một chương trình con để sắp xếp đơn hàng theo mã bằng thuậttoán Bubble sort:
// Sắp xếp mảng theo mã đơn hàng từ bé đến lớnvoid BubbleSortMaDH(DonHangdonhangs[], intn);
flag = true; }
} (!flag) {if
break; } }
Trang 172.4.2 Kiểm tra
int main(){ n = 0;int
DonHang* donhangs = NULL; cout <<"Nhập số lượng đơn hàng: "; cin >> n;
donhangs = newDonHang[n]; nhapMang(donhangs, n);
// sắp xếp đơn hàng theo mã
BubbleSortMaDH(donhangs, n);
// In ra danh sách đơn hàng sau sắp xếp để kiểm tra
inMang(donhangs, n);}
2.4.3 Kết quả chạy
Hình 2.4 Kết quả in ra sau khi sắp xếp
Trang 18Chương 2 Quản lý danh sách với DSLK
Xây dựng cấu trúc dữ liệu của một danh sách liên kết:// Cấu trúc dữ liệu của một nút trong DSLK
// Cấu trúc dữ liệu của 1 DSLKstructDSLK {
// Biến kiểu nguyên lưu số lượng nút trong DSLK
3.1 Nhập danh sách đơn hàng.
3.1.1 Chương trình con
Để nhập danh sách đơn hàng, cần xây dựng 2 chương trình con:// Nhập thông tin cho 1 đơn hàng
void nhapDonHang(DonHang* donhang);
// Nhập dữ liệu cho 1 dslk các sản phẩm tồn khovoid nhapDSLK(DSLK& dslk, intn);
Nhập thông tin 1 đơn hàng:
void nhapDonHang(DonHang* donhang) {
cout <<"Nhập mã đơn hàng: "; cin >>donhang->MaDH; cout <<"Nhập tên sản phẩm: "; cin.ignore();
getline(cin, donhang->TenSP);
Trang 19cout <<"Nhập tên nhân viên giao hàng: "; getline(cin, donhang->NVGH); {do
cout <<"Nhập số tiền (>=0): "; cin >>donhang->Tien; } while (donhang->Tien < 0); // Tiền > 0 thì COD tiền = 0 thì ViDT
donhang->ThanhToan (= donhang->Tien == 0) ? "ViDT" "COD" : ; cout <<"Nhập ngày giao hàng (ddmmyy): ";
cin >>donhang->NgayGH;
cout <<"Nhập trọng lượng đơn hàng: "; cin >>donhang->TrongLuong;}
3.1.2 Kiểm tra
int main() { n = 0;int
DSLK donhangs; khoiTaoDSLK(donhangs); cout <<"Nhập số lượng đơn hàng: "; cin >> n;
nhapDSLK(donhangs, n);}
Trang 203.1.3 Kết quả chạy
Hình 3.5 Kết quả nhập danh sách liên kết đơn hàng
3.2 Xuất danh sách đơn hàng.
3.2.1 Chương trình con
Để xuất danh sách đơn hàng, ta xây dựng 2 chương trình con:
Trang 21// Xuất đơn hàng trên một dòng
void inDonHangmotDong(DonHangdonhang);
// Xuất dữ liệu của 1 dslk các sản phẩm tồn khovoid inDSLK(DSLK& dslk);
Xuất đơn hàng trên một dòng:
void inDonHangmotDong(DonHangdonhang) {
cout << setw(10) <<donhang.MaDH <<"\t"
<< setw(25) <<donhang.TenSP <<"\t"
<< setw(15) <<donhang.NVGH <<"\t"
<< setw(10) <<donhang.Tien <<"\t"
<< setw(15) <<donhang.ThanhToan <<"\t"
<< setw(10) <<donhang.NgayGH <<"\t"
<< setw(10) <<donhang.TrongLuong <<"\n";}
Xuất danh sách liên kết đơn hàng:
void inDSLK(DSLK& dslk) {
while (it != NULL) {
inDonHangmotDong(it->duLieu); it = it->tiepTheo;
}}
3.2.2 Kiểm tra
int main(){ n = 0;int
Trang 22DSLK donhangs; khoiTaoDSLK(donhangs); cout <<"Nhập số lượng đơn hàng: "; cin >> n;
nhapDSLK(donhangs, n); // Kiểm tra in DSLK
inDSLK(donhangs);}
it = it->tiepTheo;
Trang 23} (!flag) {if
break; } }}
3.3.2 Kiểm tra
int main(){ n = 0;int
DSLK donhangs; khoiTaoDSLK(donhangs); cout <<"Nhập số lượng đơn hàng: "; cin >> n;
BubblesortMaDH(donhangs, n);
// Kiểm tra DSLK sau khi sắp xếp bằng BubbleSort
inDSLK(donhangs);}
3.3.3 Kết quả chạy
Hình 3.7 Danh sách liên kết sau khi sắp xếp bằng Bubble sort
3.4 Tìm thông tin đơn hàng theo mã đơn hàng bằng thuậttoán Binary Search.
3.4.1 Chương trình con
Để tìm thông tin đơn hàng theo Binary search, cần xây dựng hai chương trìnhcon:
// In thông tin 1 đơn hàng
void inDonHang(DonHangdonhang);
Trang 24// Tìm kiếm vị trí sản phẩm theo Mã sản phẩm bằng thuật toán Binary Search
void BinarySearchMaDH(DSLK& dslk, intmaDH, Node* batDau, Node*
void inDonHang(DonHangdonhang) {
cout <<"Mã đơn hàng: "<<donhang.MaDH <<"\n"; cout <<"Tên sản phẩm: "<<donhang.TenSP <<"\n";
cout <<"Tên nhân viên giao hàng: "<<donhang.NVGH <<"\n"; cout <<"Số tiền: "<<donhang.Tien <<"\n";
cout <<"Phương thức thanh toán: "<<donhang.ThanhToan <<"\n"; cout <<"Ngày giao hàng (ddmmyy): "<<donhang.NgayGH <<"\n"; cout <<"Trọng lượng đơn hàng: "<<donhang.TrongLuong <<"\n";}
Node* getMid(Node* batDau, Node* ketThuc) { (if batDau == NULL) {
returnNULL; }
Node* itSlow = batDau; Node* itFast = batDau->tiepTheo; while (itFast != ketThuc) { itFast = itFast->tiepTheo; (itFast != if ketThuc) { itSlow = itSlow->tiepTheo; itFast = itFast->tiepTheo; }
}
return itSlow;}
void BinarySearchMaDH(DSLK& dslk, intmaDH, Node* batDau, Node*
(giua->duLieu.MaDH >= if maDH) {
Trang 25return BinarySearchMaDH(dslk maDH batDau, , , giua); }
return BinarySearchMaDH(dslk maDH, , giua->tiepTheo, ketThuc); }
cout <<"Đơn hàng có mã "<<maDH<<" không tồn tại\n"; return;
3.4.2 Kiểm tra
int main(){ n = 0;int
DSLK donhangs; khoiTaoDSLK(donhangs); cout <<"Nhập số lượng đơn hàng: "; cin >> n;
nhapDSLK(donhangs, n); // Kiểm tra tìm k
cout <<"Nhập vào mã đơn hàng mà bạn muốn tìm kiếm: "; cin >> maDH;
BinarySearchMaDH(donhangs, maDH, donhangs.dau, donhangs.duoi);}
3.4.3 Kết quả chạy
Hình 3.8 Kết quả tìm kiếm bằng Binary search
Trang 263.5 Sắp xếp danh sách đơn hàng theo ngày giao hàng bằngSelection Sort.
return true; }
else if (nam1 == nam2) { (thang1 > thang2) {if
return true; }
else if (thang1 == thang2) { (ngay1 > ngay2) {if
return true; }
else { return false; }
} else { return false; }
} else { return false; }
Trang 27for (Node* innerIt = it->tiepTheo; innerIt != NULL; innerIt = >tiepTheo) {
(soSanhNgayGH(minNode->duLieu.NgayGH, innerIt-if
>duLieu.NgayGH)) { minNode = innerIt; }
3.5.2 Kiểm tra
int main(){ n = 0;int
DSLK donhangs; khoiTaoDSLK(donhangs); cout <<"Nhập số lượng đơn hàng: "; cin >> n;
SelectionSortNgayGH(donhangs, n);
// Kiểm tra DSLK sau khi sắp xếp bằng SelectionSort
inDSLK(donhangs);}
3.5.3 Kết quả chạy
Hình 3.9 Kết quả sau khi sắp xếp bằng selection sort