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.
Trang 1TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI
TRUNG TÂM ĐÀO TẠO ELEARING
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
Trang 2II Đề tài quản lý Mỹ phẩm gồm các thành phần chính: 2
I Giới thiệu đề tài
Bài tập lập trình quản lý mỹ phẩm là một bài toán thực tế trong việc quản lý thông tin về hóa đơn mua bán sản phẩm mỹ phẩm của một cửa hàng Bài toán này yêu cầu xây dựng một chương trình để thực hiện các thao tác cơ bản như thêm, sửa, xóa và hiển thị thông tin hóa đơn
Trang 3Trong 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
Ngoài ra, cũng cần triển khai các hàm để thống kê thông tin về số lượng hóa đơn đã nhập, tổng tiền đã bán và trung bình tổng tiền các hóa đơn Đồng thời, cũng cần có khả năng ghi danh sách hóa đơn vào file và đọc danh sách hóa đơn từ file
Bài toán này giúp rèn kỹ năng lập trình C cơ bản và áp dụng kiến thức về cấu trúc dữ liệu và tệp tin Ngoài ra, nó cũng giúp bạn làm quen với việc xử lý các thao tác thêm, sửa, xóa và tìm kiếm trên danh sách liên kết
Hy vọng rằng bài tập này sẽ giúp chúng nắm vững kiến thức lập trình và phát triển kỹ năng trong việc quản lý thông tin trong một ứng dụng thực tế
II Đề tài quản lý mỹ phẩm gồm các thành phần chính:
Chương trình gồm 02 đối tượng chính là SanPham và HoaDon được khai báo và viết các hàm cấu trúc dưới dạng sau:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Định nghĩa cấu trúc sản phẩm
typedefstruct {
char ten[50];
int soLuong;
char congDung[100];
} SanPham;
// Định nghĩa cấu trúc hóa đơn
typedefstruct {
int maHoaDon;
char tenKhachHang[50];
char tenSanPham[50];
Trang 4int soLuongBan;
float donGia;
float tongTien;
} HoaDon;
// Định nghĩa cấu trúc danh sách liên kết
typedefstruct Node {
void* data;
struct Node* next;
} Node;
// Hàm tạo một node mới
Node* createNode(void* data) {
Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data;
newNode->next = NULL;
return newNode;
}
// Hàm thêm một 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() {
Trang 5HoaDon* 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);
Trang 6printf("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", >maHoaDon,
>tenKhachHang, >tenSanPham, >soLuongBan, >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;
Trang 7while (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 thanh 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 thanh cong!\n");
return head;
}
Trang 8prev = 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 trong 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 trong 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;
}
Trang 9current = current->next;
}
printf("Khong tim thay hoa don.\n");
}
// Hàm sắp xếp các 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 sắp xếp các hóa đơn theo số lượng bán nhiều nhất void sapXepTheoSoLuongBan(Node** head) {
Node* current = *head;
Node* index = NULL;
HoaDon* temp;
if (*head == NULL) {
return;
} else {
while (current != NULL) {
index = current->next;
Trang 10while (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 sắp xếp các sản phẩm có cùng công dụng
void sapXepTheoCongDung(Node** head) {
// Sử dụng thuật toán sắp 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;
Trang 11Node* current = head;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
// Hàm tính tổng tiền tất cả các 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 của một 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);
Trang 12printf("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 hơn 1 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;
do {
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");
Trang 13printf("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 1 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);
Trang 14break;
}
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;
}