#include <iostream>
#include <string.h>
#include <iomanip>
#include <stdlib.h>
using
namespace
std
;
const
int
MAX_SIZE
=
100
;
// số lượng phần tử tối đa của mảng
const
char
*
DATA_PATH
=
“books.dat”
;
// đường dẫn tới file dữ liệu dùng đọc/ ghi
// Định nghĩa kiểu sách
struct
Book
{
char
maBook
[
50
]
;
char
tenBook
[
50
]
;
char
tacGia
[
50
]
;
char
nhaXB
[
50
]
;
int
namXB
;
float
donGia
;
int
soLuong
;
float
thanhTien
;
float
thueVAT
;
float
thucTien
;
}
;
typedef
struct
Book
Book
;
// Hàm nhập 1 cuốn sách
Book
NhapBook
(
)
{
Book
book
;
cin
.
ignore
(
)
;
cout
<
<
“Nhap ma book: “
;
cin
.
getline
(
book
.
maBook
,
50
)
;
cout
<
<
“Nhap ten book: “
;
cin
.
getline
(
book
.
tenBook
,
50
)
;
cout
<
<
“Nhap ten TG: “
;
cin
.
getline
(
book
.
tacGia
,
50
)
;
cout
<
<
“Nhap nha XB: “
;
cin
.
getline
(
book
.
nhaXB
,
50
)
;
cout
<
<
“Nhap nam XB: “
;
cin
>
>
book
.
namXB
;
cout
<
<
“Nhap don gia: “
;
cin
>
>
book
.
donGia
;
cout
<
<
“Nhap so luong: “
;
cin
>
>
book
.
soLuong
;
cout
<
<
“Nhap thue VAT: “
;
cin
>
>
book
.
thueVAT
;
book
.
thanhTien
=
0
;
// chưa tính thì khởi tạo là 0
book
.
thucTien
=
0
;
return
book
;
}
// Hàm nhập n cuốn sách
void
NhapBooks
(
Book
b
[
]
,
int
n
)
{
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
cout
<
<
“Nhap book thu “
<
<
i
+
1
<
<
“:\n”
;
Book
book
=
NhapBook
(
)
;
b
[
i
]
=
book
;
cout
<
<
“—————————-\n”
;
}
}
// Hàm in tiêu đề, phục vụ in danh sách dạng bảng
void
InTieuDe
(
)
{
cout
<
<
setw
(
20
)
<
<
“Ma Book”
;
cout
<
<
setw
(
20
)
<
<
“Ten Book”
;
cout
<
<
setw
(
20
)
<
<
“Tac gia”
;
cout
<
<
setw
(
20
)
<
<
“Nha XB”
;
cout
<
<
setw
(
20
)
<
<
“Nam XB”
;
cout
<
<
setw
(
20
)
<
<
“Don gia”
;
cout
<
<
setw
(
20
)
<
<
“So luong”
;
cout
<
<
setw
(
20
)
<
<
“Thanh tien”
;
cout
<
<
setw
(
20
)
<
<
“Thue VAT”
;
cout
<
<
setw
(
20
)
<
<
“Thuc tien”
<
<
“\n”
;
}
// hàm xuất thông tin 1 cuốn sách
void
XuatBook
(
Book
b
)
{
cout
.
setf
(
ios
:
:
fixed
)
;
cout
<
<
setw
(
20
)
<
<
b
.
maBook
;
cout
<
<
setw
(
20
)
<
<
b
.
tenBook
;
cout
<
<
setw
(
20
)
<
<
b
.
tacGia
;
cout
<
<
setw
(
20
)
<
<
b
.
nhaXB
;
cout
<
<
setw
(
20
)
<
<
b
.
namXB
;
cout
<
<
setw
(
20
)
<
<
b
.
donGia
;
cout
<
<
setw
(
20
)
<
<
b
.
soLuong
;
cout
<
<
setprecision
(
2
)
<
<
setw
(
20
)
<
<
b
.
thanhTien
;
cout
<
<
setprecision
(
2
)
<
<
setw
(
20
)
<
<
b
.
thueVAT
;
cout
<
<
setprecision
(
2
)
<
<
setw
(
20
)
<
<
b
.
thucTien
<
<
“\n”
;
}
// Hàm xuất thông tin n cuốn sách
void
XuatBooks
(
Book
b
[
]
,
int
n
)
{
// gọi hàm in tiêu đề trước
InTieuDe
(
)
;
// lặp để in ra thông tin từng cuốn
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
XuatBook
(
b
[
i
]
)
;
}
}
// hàm tính thành tiền cho n cuốn sách
void
TinhThanhTien
(
Book
b
[
]
,
int
n
)
{
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
b
[
i
]
.
thanhTien
=
b
[
i
]
.
donGia
*
b
[
i
]
.
soLuong
;
}
}
// hàm tính thực tiền cho n cuốn sách
void
TinhThucTien
(
Book
b
[
]
,
int
n
)
{
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
b
[
i
]
.
thucTien
=
b
[
i
]
.
thanhTien
*
(
1
+
b
[
i
]
.
thueVAT
)
;
// 100% số tiền + VAT * số tiền
}
}
// Hàm sắp xếp giảm dần theo năm XB
void
SapXep
(
Book
b
[
]
,
int
n
)
{
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
for
(
int
j
=
i
+
1
;
j
<
n
;
j
++
)
{
// Nếu cuốn trước có năm xuất bản nhỏ hơn cuốn sau thì hoán vị.
// vì j = i + 1 nên j luôn ở sau i
if
(
b
[
i
]
.
namXB
<
b
[
j
]
.
namXB
)
{
Book
temp
=
b
[
i
]
;
b
[
i
]
=
b
[
j
]
;
b
[
j
]
=
temp
;
}
}
}
}
// Hàm tìm và in thông tin sách có thực tiền lớn nhất.
void
MaxSach
(
Book
b
[
]
,
int
n
)
{
// khởi tạo cuốn đầu tiên là cuốn lớn nhất
int
maxTT
=
b
[
0
]
.
thucTien
;
int
maxIndex
=
0
;
// lưu chỉ số sách lớn nhất hiện tại
for
(
int
i
=
1
;
i
<
n
;
i
++
)
{
if
(
b
[
i
]
.
thucTien
>
maxTT
)
{
maxTT
=
b
[
i
]
.
thucTien
;
maxIndex
=
i
;
}
}
// in thông tin sách lớn nhất
cout
<
<
“Sach co thuc tien lon nhat la:\n”
;
InTieuDe
(
)
;
// in tiêu đề
XuatBook
(
b
[
maxIndex
]
)
;
// in thông tin sách
}
// Hàm đếm số lượng cuốn sách, tính tổng số lượng
void
TongSoCuonSach
(
Book
b
[
]
,
int
n
)
{
int
tong
=
0
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
tong
+=
b
[
i
]
.
soLuong
;
}
cout
<
<
“Tong so cuon sach la: “
<
<
tong
<
<
“\n”
;
}
// Hàm lọc theo thuế VAT, lặp và tìm cách sách có VAT lớn hơn thì in ra
void
LocTheoVAT
(
Book
b
[
]
,
int
n
)
{
float
value
;
cout
<
<
“Nhap gia VAT toi thieu: “
;
cin
>
>
value
;
int
count
=
0
;
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
if
(
b
[
i
]
.
thueVAT
>
value
)
{
if
(
count
==
0
)
{
// Nếu lần đầu tìm thấy thì in tiêu đề
InTieuDe
(
)
;
}
XuatBook
(
b
[
i
]
)
;
count
++
;
}
}
// Nếu tìm ko được cuốn nào thì báo ko có
if
(
count
==
0
)
{
cout
<
<
“Khong tim thay ket qua!\n”
;
}
}
// Hàm ghi các cuốn sách ra file
void
toFile
(
Book
b
[
]
,
int
n
)
{
FILE
*
fptr
;
// con trỏ file
fptr
=
fopen
(
DATA_PATH
,
“w”
)
;
// mở file
if
(
fptr
==
NULL
)
{
printf
(
“Loi mo file!”
)
;
exit
(
EXIT_FAILURE
)
;
// thoát chương trình nếu có lỗi mở file
}
fprintf
(
fptr
,
“%d\n”
,
n
)
;
// dòng đầu tiên ghi số cuốn sách
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
// một cuốn sách ăn sẽ ghi 8 dòng, không ghi thành tiền & thực tiền vào file
fprintf
(
fptr
,
“%s\n%s\n%s\n%s\n%d\n%f\n%d\n%f\n”
,
b
[
i
]
.
maBook
,
b
[
i
]
.
tenBook
,
b
[
i
]
.
tacGia
,
b
[
i
]
.
nhaXB
,
b
[
i
]
.
namXB
,
b
[
i
]
.
donGia
,
b
[
i
]
.
soLuong
,
b
[
i
]
.
thueVAT
)
;
}
printf
(
“Ghi %d cuon sach thanh cong tai %s!\n”
,
n
,
DATA_PATH
)
;
fclose
(
fptr
)
;
// đóng file
}
// Hàm đọc các cuốn sách từ file
// n là tham chiếu, vì ta cần thay đổi giá trị của n ở hàm main tại hàm này.
void
fromFile
(
Book
b
[
]
,
int
&n){
FILE *fptr;
fptr
=
fopen
(
DATA_PATH
,
“r”
)
;
if
(
fptr
==
NULL
)
{
printf
(
“Loi mo file!\n”
)
;
exit
(
EXIT_FAILURE
)
;
// thoát chương trình nếu có lỗi mở file
}
char
tmp
[
50
]
;
fgets
(
tmp
,
50
,
fptr
)
;
// đọc 1 dòng
n
=
atoi
(
tmp
)
;
// chuyển chuỗi về số, dòng đầu tiên là số lượng cuốn sách.
// Kiểm tra số món ăn trong file ko đc vượt qua MAX_SIZE, cũng ko được âm
if
(
n
<
0
|
|
n
>
MAX_SIZE
)
{
printf
(
“So luong cuon sach khong hop le!”
)
;
exit
(
EXIT_FAILURE
)
;
}
for
(
int
i
=
0
;
i
<
n
;
i
++
)
{
// đọc 8 dòng để lấy thông tin 1 cuốn sách
fgets
(
b
[
i
]
.
maBook
,
50
,
fptr
)
;
b
[
i
]
.
maBook
[
strcspn
(
b
[
i
]
.
maBook
,
“\n”
)
]
=
0
;
// xóa \n ở cuối
fgets
(
b
[
i
]
.
tenBook
,
50
,
fptr
)
;
b
[
i
]
.
tenBook
[
strcspn
(
b
[
i
]
.
tenBook
,
“\n”
)
]
=
0
;
fgets
(
b
[
i
]
.
tacGia
,
50
,
fptr
)
;
b
[
i
]
.
tacGia
[
strcspn
(
b
[
i
]
.
tacGia
,
“\n”
)
]
=
0
;
fgets
(
b
[
i
]
.
nhaXB
,
50
,
fptr
)
;
b
[
i
]
.
nhaXB
[
strcspn
(
b
[
i
]
.
nhaXB
,
“\n”
)
]
=
0
;
fgets
(
tmp
,
50
,
fptr
)
;
b
[
i
]
.
namXB
=
atoi
(
tmp
)
;
fgets
(
tmp
,
50
,
fptr
)
;
b
[
i
]
.
donGia
=
atof
(
tmp
)
;
fgets
(
tmp
,
50
,
fptr
)
;
b
[
i
]
.
soLuong
=
atoi
(
tmp
)
;
fgets
(
tmp
,
50
,
fptr
)
;
b
[
i
]
.
thueVAT
=
atof
(
tmp
)
;
b
[
i
]
.
thanhTien
=
b
[
i
]
.
donGia
*
b
[
i
]
.
soLuong
;
b
[
i
]
.
thucTien
=
(
1
+
b
[
i
]
.
thueVAT
)
*
b
[
i
]
.
thanhTien
;
}
printf
(
“Doc %d cuon sach tu %s thanh cong!\n”
,
n
,
DATA_PATH
)
;
fclose
(
fptr
)
;
}
// Hàm in menu
void
InMenu
(
)
{
cout
<
<
“=================== MENU ======================\n”
;
cout
<
<
“1. Nhap sach tu ban phim\n”
;
cout
<
<
“2. Hien thi thong tin cac cuon sach\n”
;
cout
<
<
“3. Tinh cot thanh tien\n”
;
cout
<
<
“4. Tinh cot thuc tien\n”
;
cout
<
<
“5. Sap xep giam dan theo nam xb\n”
;
cout
<
<
“6. Thong tin sach co thuc tien lon nhat\n”
;
cout
<
<
“7. In thong tin tong so cac cuon sach\n”
;
cout
<
<
“8. Loc danh sach theo thue VAT\n”
;
cout
<
<
“9. Luu ra tep\n”
;
cout
<
<
“10. Doc tu tep\n”
;
cout
<
<
“0. Thoat\nLua chon cua ban: “
;
}
int
main
(
)
{
int
n
=
0
,
luaChon
;
Book
books
[
MAX_SIZE
]
;
while
(
1
)
{
InMenu
(
)
;
cin
>
>
luaChon
;
switch
(
luaChon
)
{
case
1
:
cout
<
<
“Nhap so luong book: “
;
cin
>
>
n
;
if
(
n
<
=
0
|
|
n
>
MAX_SIZE
)
{
cout
<
<
“Vui long nhap n trong pham vi 1-100!\n”
;
continue
;
}
NhapBooks
(
books
,
n
)
;
break
;
case
2
:
XuatBooks
(
books
,
n
)
;
break
;
case
3
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
TinhThanhTien
(
books
,
n
)
;
break
;
case
4
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
if
(
books
[
0
]
.
thanhTien
==
0
)
{
cout
<
<
“Vui long tinh thanh tien truoc!”
;
continue
;
}
TinhThucTien
(
books
,
n
)
;
break
;
case
5
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
SapXep
(
books
,
n
)
;
break
;
case
6
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
MaxSach
(
books
,
n
)
;
break
;
case
7
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
TongSoCuonSach
(
books
,
n
)
;
break
;
case
8
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
LocTheoVAT
(
books
,
n
)
;
break
;
case
9
:
if
(
n
==
0
)
{
cout
<
<
“Vui long nhap du lieu truoc!”
;
continue
;
}
toFile
(
books
,
n
)
;
break
;
case
10
:
fromFile
(
books
,
n
)
;
XuatBooks
(
books
,
n
)
;
break
;
case
0
:
cout
<
<
“Tam biet!\n”
;
exit
(
0
)
;
default
:
cout
<
<
“Vui long lua chon cac chuc nang tu 0 – 10!\n”
;
continue
;
}
}
}