Input: mã sách,tên sách,năm xuất bản,số lượng,đơn giá Input: mã nhân viên, Input: Nhập mã sách, tên sách, nhà xuất bản, năm xuât bản, đơn giá 2 Xuất danh sách trên file Output: Da
Trang 1VIỆN ĐẠI HỌC MỞ HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
-BÁO CÁO BÀI TẬP LỚN
Môn: Cấu trúc dữ liệu và giải thuật
Đề tài:
Bài toán quản lý bán sách tại của hàng
Giáo viên hướng dẫn: Nguyễn Thùy Linh
Sinh viên thực hiện: Đoàn Ngô Hiếu - 1710A02
Phan Hoài Nam - 1710A02 Trần Hà Vi - 1710A02 Chu Thị Trang - 1710A02
Hà Nội - 2018
Trang 21 Mô tả bài toán
Bài toán quản lý bán sách tại cửa hàng sách nhằm hỗ trợ cho các nhân viên quản lý bán hàng kiểm tra lượng sách trong cửa hàng, số lượng sách thêm,bớt trong quá trình xuất và bán hàng của cửa hàng trên máy tính nhằm giúp choviệc quản lý các hoạt động của cửa hàng thuận tiện và nhanh chóng hơn Đồngthời bài toán quản lí bán sách còn giúp nhân viên của cửa hàng sách sắp xếp,tìm kiếm, thống kê các đầu sách của cửa hàng mọi cách chính xác và nhanhchóng Ngoài ra còn cho biết doanh thu của cửa hàng qua mỗi tháng để cửahàng có thể đưa ra chiến lược kinh doanh hợp lí
2 Các đối tượng cần quản lí
- Sách : Tên sách, Nhà xuất bản, Giá bán, Giá nhập, Số lượng bán, Số lượng nhập
- Hóa đơn : Tên sách bán, Số lượng bán, Nhân viên bán,…
- Nhân viên: Họ tên, Ngày sinh, Số giờ làm, Lượng sách bán được,…
- Khách hàng:Mã khách hàng, Tên khách hàng, Địa chỉ, Số lượng sách đã mua,
…
II Cấu trúc dữ liệu
1 Danh sách liên kết đơn
Trang 3struct Node{
sach info;
Trang 4 Input: mã sách,tên sách,năm xuất bản,số lượng,đơn giá
Input: mã nhân viên,
Input: Nhập mã sách, tên sách, nhà xuất bản, năm xuât bản, đơn giá
2 Xuất danh sách trên file
Output: Danh sách sách bao gồm: mã sách,tên sách,năm xuất bản,số lượng,đơn giá
Output : Danh sách bao gồm: mã sách, tên sách, nhà xuất bản, năm xuât bản, đơn giá
3 Thêm sách vào đầu danh sách
Input: mã sách,tên sách,năm xuất bản,số lượng,đơn giá
Output: Danh sách sách sau khi thêm
4 Thêm dữ liệu vào cuối danh sách
Input: mã sách,tên sách,năm xuất bản,số lượng,đơn giá
Output: Danh sách sách sau khi thêm sách
5 Xoá sách đầu tiên trong danh sách
Input: Danh sách sách đầy đủ bao gồm: mã sách,tên sách,năm xuấtbản,số lượng,đơn giá
Output: Danh sách đã xóa sách đầu tiên
6 Xoá sách cuối cùng của danh sách
Input: Danh sách sách đầy đủ bao gồm: mã sách,tên sách,năm xuấtbản,số lượng,đơn giá
Output: Danh sách đã xóa sách cuối cùng
7 Xoá sách theo mã sách
Input: mã sách cần xóa
Output: Danh sách sách sau khi xóa
8 Sắp xếp danh sách theo năm xuất bản
Input: Sắp xếp theo năm xuất bản, so sánh năm xuất bản của từng sách
Trang 510 Tính tổng số tiền sách đã bán được
Input: Nhập số tiền đã bán được
Output: Tổng số tiền sách đã bán
11 Đếm số sách có giá bán được nhỏ hơn 1 số x nào đó
Input: Đếm theo soluong, so sánh với x
Output: soluong sách nhỏ hơn x
12 Đếm số lượng sách có giá trị lớn hơn 1 số x nào đó
Input: : Đếm theo soluong, so sánh với x
Output: soluong sách lớn hơn x
IV Xác định thuật toán
1.Danh sách liên kết đơn
Để thực hiện các chức năng trên ta cần:
• Khai báo cấu trúc dữ liệu
• Khai báo cấu trúc một nút trong danh sách liên kết đơn
• Khai báo danh sách liên kết đơn
• Khởi tạo danh sách rỗng
• Tạo nút mới với thành phần dữ liệu x
1 Nhập danh sách:
* Mô tả thuật toán:
ο Nhập n danh sách và thông tin của từng đầu sách
ο Cho i chạy từ i=1->n, nếu i<= n thì sau mỗi lần duyệt them 1 phần tử vào sau danh sách
ο Nếu i>n thì kết thúc thuật toán
* sơ đồ thuật toán:
Trang 62.In danh sách:
*Mô tả thuật toán: Duyệt từ đầu đến cuối danh sách Với mỗi lần duyệt, xuất
ra màn hình thông tin của mỗi đầu sách
*Sơ đồ thuật toán:
Trang 73 Thêm dữ liệu vào đầu danh sách:
* Mô tả thuật toán:
• Nếu danh sách rỗng thì:
o Phần tử đầu là phần tử mới chèn vào p
o Phần tử cuối cũng chính là phần tử đầu
• Nếu danh sách khác rỗng thì :
o Phần tử mới trỏ tới phần tử đầu
o Phần tử đầu là phần tử mới chèn vào p
* Sơ đồ thuật toán:
4 Xóa dữ liệu của danh sách:
a, xóa phần tử ở đầu danh sách:
* Mô tả thuật toán:
ο Kiểm tra danh sách không rỗng
ο Lưu phần tử đầu tạm thời vào p
ο Chuyển phần tử đầu tới phần tử tiếp theo
ο Xóa phần tử đầu đã được lưu tạm- xóa p
ο Kiểm tra: nếu danh sách chỉ có 1 phần tử, khi xóa phần tử đi thì phần
tử cuối cùng không còn
* Sơ đồ thuật toán:
Trang 8• Ngược lại thông báo không có đầu sách mã x
* Sơ đồ thuật toán:
Trang 95 Sắp xếp:
*Mô tả thuật toán:
+ Mô tả thuật toán: Sử dụng 2 con trỏ p, q dể duyệt và so sánh với nhau
Trang 10thì hoán đổi giá trị của p và q cho nhauVd: Sắp xếp tăng dần, nếu p -> infor.tt > q -> infor.tt Hoan doi(p-> infor.tt , q -> infor.tt);
q = q -> next;
o p = p -> next;
* Sơ đồ thuật toán:
Trang 11o Ngược lại thì không tìm thấy phần tử cần tìm
* Sơ đồ thuật toán :
Trang 12* Sơ đồ:
Trang 132.Danh sách liên kết đôi
1.Xử lý nhập:
+ Mô tả thuật toán
• Khởi tạo danh sách rỗng
• Tạo nút mới p với thành phần dữ liệu x
• Nhập n sản phẩm
• Duyệt từ i=1 đến i<= n Với mỗi lần duyệt, lưu 1 phần tử vào p
• Ngược lại i>n thì kết thúc
+ Sơ đồ thuật toán
K t thúc ế
Nh p â n
Thêm node
B t đ u ắ ầ
Trang 14+ Mô tả thuật toán: Duyệt từ đầu đến cuối danh sách Với mỗi lần duyệt, xuất
ra màn hình thông tin của mỗi sản phẩm
+ Sơ đồ thuật toán:
3 Thêm sản phẩm vào danh sách
3.1 Thêm vào đầu danh sách
+ Mô tả thuật toán:
Trang 15K t thúc ế
Sai
Trang 16+ Mô tả thuật toán:
3.3 Thêm vào sau sản phẩm có mã x
+ Mô tả thuật toán:
• Tìm phần tử chứa mã x (q), nếu q rỗng => không chèn được
• Nếu q là phần tử cuối danh sách => chèn p vào cuối, ngược lại thì:
Phần tử mới trỏ tới phần tử đứng sau phần tử q
Phần tử mới trỏ về q
Phần tử q trỏ tới phần tử mới chèn vào
Phần tử sau q trỏ về phần tử mới chèn vào + Sơ đồ:
DQ.Head==NULL
DQ.Head = p DQ.Tail = DQ.Head
Đúng
DQ.Tail -> next = p
p -> prev = DQ.Tail DQ.Tail = p
K t thúc ế
Sai
B t đ uắ ầ
Trang 174 Xoá sản phẩm khỏi danh sách
4.1 Xoá phần tử ở đầu danh sách
+ Mô tả thuật toán:
• Kiểm tra danh sách không rỗng
• Lưu phần tử đầu tạm thời vào p
• Chuyển phần tử đầu tới phần tử tiếp theo
Trang 184.2 Xóa sản phẩm ở cuối danh sách
+ Mô tả thuật toán:
• Kiểm tra danh sách không rỗng
• Lưu phần tử cuối tạm thời vào p
• Chuyển phần tử cuối tới phần tử bên trái
DQ.Tail = DQ.Tail -> prev
DQ.Tail -> next = NULL
Đúng
K t thúc ế
Sai
Trang 19o Lặp trong khi (q != NULL)
So sánh giá trị của phần tử p và q nếu không đúng trật tự thì hoán đổi giá trị của p và q cho nhau
Vd: Sắp xếp tăng dần, nếu p -> infor.tt > q -> infor.tt Hoan doi(p-> infor.tt , q -> infor.tt);
q = q -> next;
q==NULL
q = q -> prev
q -> next = NULL
Trang 213 Ngăn xếp
1. Nhập danh sách trên file
- Khởi tạo danh sách rỗng
Kết thúc
Bắt đầu
Nh p n â
Thêm node
Trang 22Cho con trỏ tiếp của của nút đầu trỏ đến nó Nút này bây giờ trở thành nút
đầu của ngăn xếp
Trang 23Node p p=(Node)malloc(sizeof(Node))
p->item=x
p->info=info p->next=s->top s->top=p
q->head=q->tail
End
Đúng
Sai p!=NULL
4 Xóa phần tử đầu
-Kiểm tra danh sách không rỗng
-Lưu phần tử đầu vào p
-Chuyển phần tử đầu tới phần tử bên cạnh
-Xóa phần tử đã được lưu trong p -> Xóa p
-Kiểm tra: nếu danh sách chỉ có 1 phần tử, khi xóa đi phần tử cuối không còn
Trang 24Begin
End
p=new node p=Q.head q.head=q.head->next free(p)
Trang 25
6.Tìm kiếm
p= Q.Head; //p trỏ từ đầu danh sách
- Bước 2: Kiểm tra danh sách còn phần tử và nếu chưa tìm thấy phần tử thì lặp trong khi (p!=NULL) và (p->Info != k) thì
p = p -> Next;
- Bước 3:
Nếu p != NULL thì p trỏ đến phần tử cần tìmNgược lại thì không tìm thấy phần tử cần tìm
Trang 267.Đếm phần tử trong ngăn xếp
- Bước 1: khởi tạo biến đếm = 0
- Bước 2: Kiểm tra danh sách còn phần tử và duyệt từ phần tử đầu đến phần tử cuối của danh sách
Nếu p -> Info == k thì tăng biến đếm lên 1
In ra màn hình giá trị biến đếmVD: Đếm số sách có giá nhỏ hơn x
p=p->Next
Trang 27Đúng Sai
4.Hàng đợi
Để thực hiện các chức năng trên ta cần:
• Khai báo cấu trúc dữ liệu
• Khai báo cấu trúc một nút trong h àng đ ợi
• Khởi tạo hàng đợi
• Kiểm tra hàng đợi rỗng
1 Nhập danh sách
* Mô tả thuật toán:
ο Nhập n danh sách và thông tin của từng đầu sách
Bắt đầu
Kết thúc
p=Q.head
p=p-> Next tổng ++ p=!NULL
Trang 28sau danh sách
ο Nếu i>n thì kết thúc thuật toán
* sơ đồ thuật toán:
2.Xuất danh sách
*Mô tả thuật toán: Duyệt từ đầu đến cuối danh sách Với mỗi lần duyệt,
xuất ra màn hình thông tin của mỗi đầu sách
*Sơ đồ thuật toán:
Trang 293.Thêm dữ liệu vào danh sách
Mô tả thuật toán:
• Nếu hàng đợi rỗng thì p->next=NULL,p->prev=NULL,Ta gán
end Q.Tail==NULL
p->next=NULL p->prev=NULL Q.Head=p Q.Tail=p Đúng
Q.Tail->N ext=p Q.Tail=p
Trang 31Mô tả thuật toán:
• Nếu Q.head==NULL thì kết thúc chương trình
• Nếu Q.head khác NULL ta gán p=Q.head; Q.Head=p->nextQ.Head->prev=NULL
5.Sắp xếp danh sách theo giá bán tăng dần
Mô tả thuật toán
Sai
Trang 32N ếu i->info.gia > j->info.gia thì đổi chỗ i->info.gia
Sai Đúng
j=i->next
j!=NULL
Đúng Sai
i=i->next
i->info.gia > j->info.gia
Đổi chỗ i->info.gia và j->info.gia Đúng Sai j=j->next
end
Trang 336.Tìm kiếm dữ liệu theo mã sách
Mô tả thuật toán
• Gán p=Q.head
• Trong khi p!=NULL(b2)Nếu p-> info masach==k thì in ra thông tin rồi kết thúcNếu không thì p=p->next rồi lặp lại b2
begin
I
p=Q.head p!=NULL
Sai
Đ úng
end
p=p->next p-> info.masach==k
Đ S
Nhap k
In thông tin
q=p
Trang 35Mô tả thuật toán
• Gán max =Q.head-> info.slxuat
• Trong khi p!=NULL(b2)
N ếu max<p->info.slxuat thì max= p->info.slxuat
N ếu không p=p->next rồi lặp lại b2
Trang 36Mô tả thuật toán
• Nhập x
• Gán dem=0,p=Q.head
• Trong khi p!=NULL(b2)
N ếu p-> info >x th ì dem++
N ếu kh ông p=p->next rồi lặp lại b2
p!=NULL
p-> info.sl>x
p=p->next
Đúng dem+=1
end Hiển thị dem
Trang 42printf("\nDoc File thanh cong."); }
Trang 43for(q=p->Next;q!=NULL;q=q->Next) {
Trang 44%d",dem);
Trang 47printf("\nTen sach: %s",p->info.ten);
printf("\nNam xuat ban: %d",p->info.nxb); printf("\nSo luong: %d",p->info.sl);
printf("\nDon gia: %2.2f",p->info.dg);
Trang 48struct Dnode// nut lien ket
{
KH info;
Dnode * next;
Trang 51void Nhap(KH &x)
Trang 52}
Trang 53void xoadau(list &Q)
free(p);
Trang 54{
p=Q.tail;
}}
inds(Q);
Trang 55r->next=p->next;
delete p;
break;
}r=p;
}}
if(Q.head==NULL)
Trang 56tg=p->info;
p->info=q->info;
q->info=tg;
}}
inds(Q);
}
void sxgiam(list &Q)
{
Trang 57Dnode *p,*q;
KH tg;
for(p=Q.head;p;p=p->next)
for(q=p->next;q;q=q->next){
if(p->info.slsachmua<q->info.slsachmua){
tg=p->info;
p->info=q->info;
q->info=tg;
}}
dem++;
break;
}
Trang 58break;
}else dem=0;
}
Trang 59break;
}else dem=0;
Trang 61if(p->info.slsachmua<min->info.slsachmua){
Trang 62printf("\n | 0.thoat ");
Trang 63printf("\n | 1.nhap danh sach ");
printf("\n | 2.in danh sach ");
Trang 64printf("\n nhap sp them cuoi ds:");
Nhap(x);p=getnode(x);chencuoi(Q,p);break;case 6:system("cls");xoadau(Q);break;
/*case 7:system("cls");xoacuoi(Q);break;
case 8:system("cls");xoatheoma(Q);break;*/case 9:system("cls");
printf("\n danh sach sap xep theo chieu tang so luong:");
sxtang(Q);break;
case 10:system("cls");
Trang 65printf("\n danh sach sap xep theo chieu giam so luong");
Trang 67// them 1 phan tu vao queue
void Put(Queue &Q,KH x)
Trang 69printf("\n Nhap thong tin hoa don thu %d: ",i);
printf("\n Nhap ma hoa don: ");
Trang 71//ham doc du lieu hoa don tu file DSKHQ.DAT
int DocFileKHQ(Queue &Q)
Trang 74printf("\n1.Nhap danh sach hoa don (Queue)");
printf("\n2.Doc du lieu hoa don tu file (Queue)");
printf("\n3.In danh sach hoa don (Queue)");
printf("\n4.Tim kiem hoa don theo ma (Queue)");
printf("\n5.Dem so luong tat ca cac hoa don co trong danh sach (Queue)");
printf("\n6.Liet cac hoa don co sach xuat ban nam \"2018\" (Queue)");
printf("\n7.Xoa hoa don o dau danh sach (Queue)");
Trang 75printf("\n->Moi ban chon: ");
Trang 80printf("\nNhap ma nhan vien: ");
Trang 8210s","MaGV","HoTen","NgaySinh","Gioitinh","tongluon g");
Trang 84{
Trang 86printf("\t1:Nhap danh sach nhan vien\n");
printf("\t2:Hien danh sach nhan vien\n");
printf("\t3:Xoa giang vien theo ma nhan vien\n");
printf("\t4:Tim kiem mot giang vien theo ma nhan vien\n");
printf("\t5:Tim kiem mot giang vien theo ten nhan vien\n");
printf("\t6:Luu file nhan vien\n");
printf("\t7:Doc file nhan vien\n");