Bài tập lớn Cấu trúc dữ liệu và giải thuật: Trong chương trình này, sẽ sử dụng kiến thức về cấu trúc dữ liệu danh sách liên kết để lưu trữ thông tin về hóa đơn. Mỗi hóa đơn sẽ bao gồm các thông tin như mã hóa đơn, tên khách hàng, tên sản phẩm, số lượng bán, đơn giá sản phẩm và tổng tiền. Cần triển khai các hàm để thực hiện các thao tác trên danh sách hóa đơn như thêm, sửa, xóa, tìm kiếm và sắp xếp.
TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI TRUNG TÂM ĐÀO TẠO ELEARING HỌ VÀ TÊN……… LỚP…… QUẢN LÝ BÁN HÀNG MỸ PHẨM BÁO CÁO BÀI TẬP LỚN MÔN: CẤU TRÚC DỮ LIỆU Giảng viên hướng dẫn: Hà Nội – 2023 MỤC LỤC Tran g I Giới thiệu đề tài II Đề tài quản lý Mỹ phẩm gồm thành phần chính: III Các chức chưng trình: 16 IV Chạy chương trình 17 V Kết luận 17 VI Tài liệu tham khảo 18 I Giới thiệu đề tài Bài tập lập trình quản lý mỹ phẩm toán thực tế việc quản lý thơng tin hóa đơn mua bán sản phẩm mỹ phẩm cửa hàng Bài toán yêu cầu xây dựng chương trình để thực thao tác thêm, sửa, xóa hiển thị thơng tin hóa đơn Trong chương trình này, sử dụng kiến thức cấu trúc liệu danh sách liên kết để lưu trữ thông tin hóa đơn Mỗi hóa đơn bao gồm thơng tin mã hóa đơn, tên khách hàng, tên sản phẩm, số lượng bán, đơn giá sản phẩm tổng tiền Cần triển khai hàm để thực thao tác danh sách hóa đơn thêm, sửa, xóa, tìm kiếm xếp Ngồi ra, cần triển khai hàm để thống kê thông tin số lượng hóa đơn nhập, tổng tiền bán trung bình tổng tiền hóa đơn Đồng thời, cần có khả ghi danh sách hóa đơn vào file đọc danh sách hóa đơn từ file Bài tốn giúp rèn kỹ lập trình C áp dụng kiến thức cấu trúc liệu tệp tin Ngồi ra, giúp bạn làm quen với việc xử lý thao tác thêm, sửa, xóa tìm kiếm danh sách liên kết Hy vọng tập giúp chúng nắm vững kiến thức lập trình phát triển kỹ việc quản lý thông tin ứng dụng thực tế II Đề tài quản lý mỹ phẩm gồm thành phần chính: Chương trình gồm 02 đối tượng SanPham HoaDon khai báo viết hàm cấu trúc dạng sau: #include #include #include // Định nghĩa cấu trúc sản phẩm typedef struct { char ten[50]; int soLuong; char congDung[100]; } SanPham; // Định nghĩa cấu trúc hóa đơn typedef struct { int maHoaDon; char tenKhachHang[50]; char tenSanPham[50]; int soLuongBan; float donGia; float tongTien; } HoaDon; // Định nghĩa cấu trúc danh sách liên kết typedef struct Node { void* data; struct Node* next; } Node; // Hàm tạo node Node* createNode(void* data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } // Hàm thêm node vào đầu danh sách void addNode(Node** head, void* data) { Node* newNode = createNode(data); newNode->next = *head; *head = newNode; } // Hàm nhập thông tin sản phẩm SanPham* nhapSanPham() { SanPham* sp = (SanPham*)malloc(sizeof(SanPham)); printf("Nhap ten san pham: "); scanf("%s", sp->ten); printf("Nhap so luong san pham: "); scanf("%d", &(sp->soLuong)); printf("Nhap cong dung san pham: "); scanf("%s", sp->congDung); return sp; } // Hàm nhập thông tin hóa đơn HoaDon* nhapHoaDon() { HoaDon* hd = (HoaDon*)malloc(sizeof(HoaDon)); printf("Nhap ma hoa don: "); scanf("%d", &(hd->maHoaDon)); printf("Nhap ten khach hang: "); scanf("%s", hd->tenKhachHang); printf("Nhap ten san pham: "); scanf("%s", hd->tenSanPham); printf("Nhap so luong ban: "); scanf("%d", &(hd->soLuongBan)); printf("Nhap don gia: "); scanf("%f", &(hd->donGia)); hd->tongTien = hd->soLuongBan * hd->donGia; return hd; } // Hàm in danh sách sản phẩm void inDanhSachSanPham(Node* head) { Node* current = head; printf("Danh sach san pham:\n"); while (current != NULL) { SanPham* sp = (SanPham*)(current->data); printf("Ten: %s\n", sp->ten); printf("So luong: %d\n", sp->soLuong); printf("Cong dung: %s\n", sp->congDung); printf(" \n"); current = current->next; } } // Hàm in danh sách hóa đơn void inDanhSachHoaDon(Node* head) { Node* current = head; printf("Danh sach hoa don:\n"); while (current != NULL) { HoaDon* hd = (HoaDon*)(current->data); printf("Ma hoa don: %d\n", hd->maHoaDon); printf("Ten khach hang: %s\n", hd->tenKhachHang); printf("Ten san pham: %s\n", hd->tenSanPham); printf("So luong ban: %d\n", hd->soLuongBan); printf("Don gia: %.2f\n", hd->donGia); printf("Tong tien: %.2f\n", hd->tongTien); printf(" \n"); current = current->next; } } // Hàm lưu danh sách sản phẩm vào file void luuDanhSachSanPham(Node* head) { FILE* file = fopen("sanpham.txt", "w"); Node* current = head; while (current != NULL) { SanPham* sp = (SanPham*)(current->data); fprintf(file, "%s %d %s\n", sp->ten, sp->soLuong, sp->congDung); current = current->next; } fclose(file); } // Hàm lưu danh sách hóa đơn vào file void luuDanhSachHoaDon(Node* head) { FILE* file = fopen("hoadon.txt", "w"); Node* current = head; while (current != NULL) { HoaDon* hd = (HoaDon*)(current->data); fprintf(file, "%d %s %s %d %.2f %.2f\n", hd->maHoaDon, hd>tenKhachHang, hd->tenSanPham, hd->soLuongBan, hd->donGia, hd>tongTien); current = current->next; } fclose(file); } // Hàm chọn sửa sản phẩm void suaSanPham(Node* head) { int maHoaDon; printf("Nhap ma hoa don can sua: "); scanf("%d", &maHoaDon); Node* current = head; while (current != NULL) { HoaDon* hd = (HoaDon*)(current->data); if (hd->maHoaDon == maHoaDon) { printf("Nhap thong tin moi cho hoa don:\n"); HoaDon* newHd = nhapHoaDon(); hd->soLuongBan = newHd->soLuongBan; hd->donGia = newHd->donGia; hd->tongTien = hd->soLuongBan * hd->donGia; free(newHd); printf("Da sua hoa don cong!\n"); return; } current = current->next; } printf("Khong tim thay hoa don co ma %d!\n", maHoaDon); } // Hàm chọn xóa sản phẩm Node* xoaSanPham(Node* head) { int maHoaDon; printf("Nhap ma hoa don can xoa: "); scanf("%d", &maHoaDon); Node* current = head; Node* prev = NULL; while (current != NULL) { HoaDon* hd = (HoaDon*)(current->data); if (hd->maHoaDon == maHoaDon) { if (prev == NULL) { head = current->next; } else { prev->next = current->next; } free(hd); free(current); printf("Da xoa hoa don cong!\n"); return head; } prev = current; current = current->next; } printf("Khong tim thay hoa don co ma %d!\n", maHoaDon); return head; } // Hàm tìm kiếm tên sản phẩm danh sách liên kết void timKiemSanPham(Node* head, char* tenSanPham) { Node* current = head; while (current != NULL) { SanPham* sp = (SanPham*)(current->data); if (strcmp(sp->ten, tenSanPham) == 0) { printf("Tim thay san pham:\n"); printf("Ten: %s\n", sp->ten); printf("So luong: %d\n", sp->soLuong); printf("Cong dung: %s\n", sp->congDung); return; } current = current->next; } printf("Khong tim thay san pham.\n"); } // Hàm tìm kiếm tên khách hàng danh sách liên kết void timKiemKhachHang(Node* head, char* tenKhachHang) { Node* current = head; while (current != NULL) { HoaDon* hd = (HoaDon*)(current->data); if (strcmp(hd->tenKhachHang, tenKhachHang) == 0) { printf("Tim thay hoa don:\n"); printf("Ma hoa don: %d\n", hd->maHoaDon); printf("Ten khach hang: %s\n", hd->tenKhachHang); printf("Ten san pham: %s\n", hd->tenSanPham); printf("So luong ban: %d\n", hd->soLuongBan); printf("Don gia: %.2f\n", hd->donGia); printf("Tong tien: %.2f\n", hd->tongTien); return; } current = current->next; } printf("Khong tim thay hoa don.\n"); } // Hàm xếp hóa đơn theo tổng tiền giảm dần void sapXepHoaDon(Node** head) { Node* current = *head; Node* index = NULL; HoaDon* temp; if (*head == NULL) { return; } else { while (current != NULL) { index = current->next; while (index != NULL) { HoaDon* hd1 = (HoaDon*)(current->data); HoaDon* hd2 = (HoaDon*)(index->data); if (hd1->tongTien < hd2->tongTien) { temp = hd1; current->data = hd2; index->data = temp; } index = index->next; } current = current->next; } } } // Hàm xếp hóa đơn theo số lượng bán nhiều void sapXepTheoSoLuongBan(Node** head) { Node* current = *head; Node* index = NULL; HoaDon* temp; if (*head == NULL) { return; } else { while (current != NULL) { index = current->next; while (index != NULL) { HoaDon* hd1 = (HoaDon*)(current->data); HoaDon* hd2 = (HoaDon*)(index->data); if (hd1->soLuongBan < hd2->soLuongBan) { temp = hd1; current->data = hd2; index->data = temp; } index = index->next; } current = current->next; } } } // Hàm xếp sản phẩm có cơng dụng void sapXepTheoCongDung(Node** head) { // Sử dụng thuật toán xếp chọn Node* current = *head; while (current != NULL) { Node* minNode = current; Node* temp = current->next; while (temp != NULL) { SanPham* sp1 = (SanPham*)minNode->data; SanPham* sp2 = (SanPham*)temp->data; if (strcmp(sp2->congDung, sp1->congDung) < 0) { minNode = temp; } temp = temp->next; } void* tempData = current->data; current->data = minNode->data; minNode->data = tempData; current = current->next; } } // Hàm đếm số lượng hóa đơn nhập int demSoLuongHoaDon(Node* head) { int count = 0; 10 Node* current = head; while (current != NULL) { count++; current = current->next; } return count; } // Hàm tính tổng tiền tất hóa đơn float tinhTongTien(Node* head) { float tongTien = 0; Node* current = head; while (current != NULL) { HoaDon* hd = (HoaDon*)(current->data); tongTien += hd->tongTien; current = current->next; } return tongTien; } // Hàm tính trung bình hóa đơn float tinhTrungBinh(Node* head) { int soLuongHoaDon = demSoLuongHoaDon(head); float tongTien = tinhTongTien(head); return tongTien / soLuongHoaDon; } void timHoaDonTongTienNhoNhat(Node* head) { Node* current = head; HoaDon* minHoaDon = (HoaDon*)current->data; while (current != NULL) { HoaDon* hd = (HoaDon*)current->data; if (hd->tongTien < minHoaDon->tongTien) { minHoaDon = hd; } current = current->next; } printf("Hóa đơn có tổng tiền nhỏ nhất:\n"); printf("Mã hóa đơn: %d\n", minHoaDon->maHoaDon); printf("Tên khách hàng: %s\n", minHoaDon->tenKhachHang); 11 printf("Tên sản phẩm: %s\n", minHoaDon->tenSanPham); printf("Số lượng bán: %d\n", minHoaDon->soLuongBan); printf("Đơn giá sản phẩm: %.2f\n", minHoaDon->donGia); printf("Tổng tiền: %.2f\n", minHoaDon->tongTien); } void timHoaDonTongTienLonHon1Trieu(Node* head) { Node* current = head; printf("Các hóa đơn có tổng tiền lớn triệu:\n"); while (current != NULL) { HoaDon* hd = (HoaDon*)current->data; if (hd->tongTien > 1000000) { printf("Mã hóa đơn: %d\n", hd->maHoaDon); printf("Tên khách hàng: %s\n", hd->tenKhachHang); printf("Tên sản phẩm: %s\n", hd->tenSanPham); printf("Số lượng bán: %d\n", hd->soLuongBan); printf("Đơn giá sản phẩm: %.2f\n", hd->donGia); printf("Tổng tiền: %.2f\n", hd->tongTien); } current = current->next; } } int main() { Node* danhSachSanPham = NULL; Node* danhSachHoaDon = NULL; int choice; { printf(" QUAN LY BAN HANG MY PHAM \n"); printf("1 Them san pham\n"); printf("2 Them hoa don\n"); printf("3 In danh sach san pham\n"); printf("4 In danh sach hoa don\n"); printf("5 Luu danh sach san pham\n"); printf("6 Luu danh sach hoa don\n"); printf("7 Sua hoa don\n"); printf("8 Xoa danh sach hoa don\n"); 12 printf("9 Tim kiem ten san pham \n"); printf("10 Tim kiem ten khach hang \n"); printf("11 Sap xep hoa don tong tien giam dan\n"); printf("12 Sap xep hoa don so luong giam dan\n"); printf("13 Sap xep san pham theo cong dung\n"); printf("14 Dem tong so luong hoa don\n"); printf("15 Tinh tong tien ban \n"); printf("16 Tinh trung binh\n"); printf("17 Tim hoa don co tong tien nho nhat\n"); printf("18 Tim cac hoa don co tong tien lon hon trieu\n"); printf("0 Thoat\n"); printf("Nhap lua chon cua ban: "); scanf("%d", &choice); switch (choice) { case 1: { SanPham* sp = nhapSanPham(); addNode(&danhSachSanPham, sp); break; } case 2: { HoaDon* hd = nhapHoaDon(); addNode(&danhSachHoaDon, hd); break; } case 3: { inDanhSachSanPham(danhSachSanPham); break; } case 4: { inDanhSachHoaDon(danhSachHoaDon); break; } case 5: { luuDanhSachSanPham(danhSachSanPham); break; } case 6: { luuDanhSachHoaDon(danhSachHoaDon); 13 break; } case 7: { suaSanPham(danhSachHoaDon); break; } case 8: { danhSachHoaDon = xoaSanPham(danhSachHoaDon); break; } case 9: { char tenSanPham[50]; printf("Nhap ten san pham can tim: "); scanf("%s", tenSanPham); timKiemSanPham(danhSachSanPham, tenSanPham); break; } case 10: { char tenKhachHang[50]; printf("Nhap ten khach hang can tim: "); scanf("%s", tenKhachHang); timKiemKhachHang(danhSachHoaDon, tenKhachHang); break; } case 11: { sapXepHoaDon(&danhSachHoaDon); printf("Da sap xep cac hoa don theo tong tien giam dan.\n"); break; } case 12: { sapXepTheoSoLuongBan(&danhSachHoaDon); break; } case 13: { sapXepTheoCongDung(&danhSachSanPham); break; } 14 case 14: { int soLuongHoaDon = demSoLuongHoaDon(danhSachHoaDon); printf("So luong hoa don da nhap: %d\n", soLuongHoaDon); break; } case 15: { float tongTien = tinhTongTien(danhSachHoaDon); printf("Tong tien cua tat ca cac hoa don: %.2f\n", tongTien); break; } case 16: { float trungBinh = tinhTrungBinh(danhSachHoaDon); printf("Trung binh cua mot hoa don: %.2f\n", trungBinh); break; } case 17:{ timHoaDonTongTienNhoNhat(danhSachHoaDon); break;} case 18:{ timHoaDonTongTienLonHon1Trieu(danhSachHoaDon); break; } case 0: { printf("Tam biet!\n"); break; } default: { printf("Lua chon khong hop le Vui long chon lai!\n"); break; } } } while (choice != 0); return 0; } III Các chức chưng trình: 15 Nhập thêm sản phẩm hóa đơn: giúp nhập thêm thông tin sản phẩm: In danh sách đối tương: Đọc lưu: Sửa, xố đối tượng: Tìm kiếm đối tượng Sắp xếp đối tượng Các yêu cầu tìm phần tử lớn nhất, nhỏ nhất: Các yêu cầu tỉnh tổng, trung bình Các yêu cầu thống kê theo điều kiện 10.Thốt: IV Chạy chương trình: Khi chạy chương trình có bảng lựa chọn, chọn chức mà mong muốn: 16 V Kết luận: Chương trình ứng dụng quản lý bán hàng mỹ phẩm đơn giản, phát triển khai thác ngơn ngữ lập trình C sử dụng cấu trúc danh sách liên kết để lưu trữ thơng tin sản phẩm hóa đơn Chương trình cung cấp chức thêm sản phẩm hóa đơn, sửa thơng tin sản phẩm hóa đơn, xóa sản phẩm hóa đơn, tìm kiếm sản phẩm theo tên, tìm kiếm sản phẩm hóa đơn theo tên khách hàng, mắt Xếp hạng đơn hóa theo tổng tiền giảm dần số lượng bán nhiều nhất, đếm số lượng đơn hóa nhập, tính tổng tiền đơn hóa, tính trung bình đơn hóa, hiển thị đơn hóa theo giá sản phẩm tổng số tiền Tuy chương trình đáp ứng yêu cầu quản lý bán hàng mỹ phẩm, chưa áp giải hết yêu cầu thực tế toán Chương trình cịn phát triển Như quản lý nhân viên, quản lý khách hàng, quản lý hạn sử dụng mỹ phẩm VI Tài liệu tham khảo: 17 - Nhóm tác giả , Giáo trình Cấu trúc liệu, Khoa CNTT, Viện ĐH Mở Hà Nội - Đỗ Xuân Lôi, “ Cấu trúc liệu giải thuật”, NXB Khoa học kỹ thuật 18