Tải bản đầy đủ (.docx) (18 trang)

Bài tập lớn Cấu trúc dữ liệu và giải thuật it05

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (163.75 KB, 18 trang )

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

2
1


II

Đề tài quản lý Mỹ phẩm gồm các thành phần chính:

2


III

Các chức năng của 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 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.

2


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.
Ngồ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 tố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. Ngồ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
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];
3


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 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() {

4


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);

5



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;

6


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 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;
}

7


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 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;
}

8



current = 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;

9


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 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;

10


Node* 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);

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 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");

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 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);

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 năng của chưng trình:

15


1. Nhập và thêm sản phẩm và hóa đơn: sẽ giúp chúng ta nhập và thêm thông
tin sản phẩm:

2. In danh sách đối tương:

3. Đọc và lưu:

4. Sửa, xoá đối tượng:


5. Tìm kiếm đối tượng

6. Sắp xếp đối tượng

7. Các yêu cầu tìm phần tử lớn nhất, nhỏ nhất:

8. Các yêu cầu tỉnh tổng, trung bình

9. 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 chúng ta có một bảng lựa
chọn, chọn các chức năng mà mình mong muốn:

16


V.

Kết luận:

Chương trình trên là một ứng dụng quản lý bán hàng mỹ phẩm đơn giản, được
phát triển khai thác bằng ngơn ngữ lập trình C và sử dụng cấu trúc danh sách liên
kết để lưu trữ thông tin sản phẩm và hóa đơn. Chương trình cung cấp các chức
năng cơ bản như thêm sản phẩm và hóa đơn, sửa thơng tin sản phẩm và hóa đơn,
xóa sản phẩm và 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, sắp ra mắt Xếp hạng đơn hóa theo tổng tiền giảm dần và số
lượng bán nhiều nhất, đếm số lượng đơn hóa đã nhập, tính tổng tiền của các đơn

hóa, tính trung bình của một đơn hóa, hiển thị các đơn hóa theo giá sản phẩm và
tổng số tiền. Tuy chương trình có thể đáp ứng các yêu cầu cơ bản về quản lý bán
hàng mỹ phẩm, nhưng vẫn chưa áp giải quyết hết các u cầu thực tế của bài tốn.
Chương trình cịn có thể phát triển được hơn. Như quản lý nhân viên, quản lý
khách hàng, quản lý hạn sử dụng của 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 dữ liệu, Khoa CNTT, Viện ĐH Mở Hà
Nội.
- Đỗ Xuân Lôi, “ Cấu trúc dữ liệu và giải thuật”, NXB Khoa học và kỹ thuật

18



×