Untitled
unknown
plain_text
4 years ago
55 kB
125
Indexable
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <math.h>
#include <random>
#include <ctime>
#include <iomanip>
#include <list> // Danh sach lien ket don va kep
#include <bitset> // Bit set (cu coi la mot bool array)
#include <fstream> // File
#include <sstream>
#include <set>
using namespace std;
// constants
const int MAX_DMS = 10; // max danh muc sach cua moi dau sach
const int MAX_SACH_MUON = 3; // moi lan muon toi da 3 sach
const int MAX_SACH = 100; // max sach cua moi dau sach
const int MAX_THE_DOCGIA = 1000; // max the doc gia
long long danh_so_the_muon = 0; // dung de luu the muon sach
const int MAX_DAU_SACH = 100000; // max dau sach
const int MAX_NGAY_MUON = 7; // max ngay muon
bitset<MAX_THE_DOCGIA * 10> kiem_tra_ma_the; // check xem ma the da ton tai hay chua
bitset<MAX_DAU_SACH * 10> kiem_tra_ISBN;
// cac ham random
string random_ISBN()
{
default_random_engine engine(static_cast<long long int>(time(0)));
uniform_int_distribution<long long int> randomInt(1000000000000, 9999999999999);
long long ISBN = randomInt(engine);
string ISBN_str = to_string(ISBN);
return ISBN_str;
}
int random_ma_the()
{
int ma_the;
do
{
ma_the = rand() % (MAX_THE_DOCGIA * 10 - 1) + 1;
} while (kiem_tra_ma_the[ma_the]);
kiem_tra_ma_the[ma_the] = 1;
return ma_the;
}
/* Phan khai bao cau truc du lieu */
struct Dau_sach;
struct Sach;
struct The_doc_gia;
struct Phieu_muon_tra_sach;
struct Ngay_thang;
/* hien thuc struct */
struct Dau_sach
{
string ISBN; // ma ISBN gom 13 chu so
string ten_sach;
int so_trang;
string tac_gia;
int nam_xuat_ban;
string the_loai;
int so_lan_muon;
list<Sach*> danh_muc_sach;
~Dau_sach()
{
for (auto& i : danh_muc_sach)
{
delete i;
}
}
};
struct Sach
{
string ma_sach;
int trang_thai; // 0 muon duoc, 1 da muon, 2 da hu
string vi_tri;
~Sach()
{
}
};
struct The_doc_gia
{
int ma_the;
string ho_ten;
string gioi_tinh;
Phieu_muon_tra_sach* sach_dang_muon[MAX_SACH_MUON];
int so_sach_dang_muon;
int trang_thai; // 0: khoa the. 1: mo the.
~The_doc_gia()
{
for (int i = 0; i < so_sach_dang_muon; i++)
{
delete sach_dang_muon[i];
}
}
};
struct Phieu_muon_tra_sach
{
string ma_phieu;
Sach* sach;
Ngay_thang* ngay_muon;
Ngay_thang* ngay_tra;
The_doc_gia* the_doc_gia;
int trang_thai; // 0: chua tra. 1: da tra. 2: lam mat
~Phieu_muon_tra_sach()
{
delete ngay_muon;
delete ngay_tra;
}
};
struct Ngay_thang
{
int ngay;
int thang;
int nam;
~Ngay_thang()
{
}
};
// ham tinh do lech giua 2 ngay https://www.geeksforgeeks.org/find-number-of-days-between-two-given-dates/
const int monthDays[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
// This function counts number of
// leap years before the given date
int countLeapYears(Ngay_thang* d)
{
int years = d->nam;
// Check if the current year needs to be
// considered for the count of leap years
// or not
if (d->thang <= 2)
years--;
// An year is a leap year if it
// is a multiple of 4,
// multiple of 400 and not a
// multiple of 100.
return years / 4 - years / 100 + years / 400;
}
// This function returns number of
// days between two given dates
int getDifferenceDay(Ngay_thang* dt1, Ngay_thang* dt2)
{
// COUNT TOTAL NUMBER OF DAYS
// BEFORE FIRST DATE 'dt1'
// initialize count using years and day
long int n1 = dt1->nam * 365 + dt1->ngay;
// Add days for months in given date
for (int i = 0; i < dt1->thang - 1; i++)
n1 += monthDays[i];
// Since every leap year is of 366 days,
// Add a day for every leap year
n1 += countLeapYears(dt1);
// SIMILARLY, COUNT TOTAL NUMBER OF
// DAYS BEFORE 'dt2'
long int n2 = dt2->nam * 365 + dt2->ngay;
for (int i = 0; i < dt2->thang - 1; i++)
n2 += monthDays[i];
n2 += countLeapYears(dt2);
// return difference between two counts
return (n2 - n1);
}
// chuan hoa chuoi
string chuan_hoa_chuoi(string s)
{
// xoa ky tu trong dau
s.erase(0, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
// xoa 2 ky tu trong o giua
while (s.find(" ") != string::npos)
{
s.erase(s.find(" "), 1);
}
return s;
// chuan hoa chuoi
}
string viet_in_hoa(string s)
{
string s1 = "";
for (int i = 0; i < s.length(); i++)
{
if (s[i] == ' ')
{
s1 += ' ';
}
else
{
s1 += toupper(s[i]);
}
}
return s1;
}
string toString(Ngay_thang* d)
{
stringstream ss;
ss << d->ngay << "/" << d->thang << "/" << d->nam;
return ss.str();
}
// * binaray search tree (cay nhi phan tim kiem) */
struct Node_tree
{
The_doc_gia* data;
Node_tree* left;
Node_tree* right;
~Node_tree()
{
delete data;
if (left != NULL)
{
delete left;
}
if (right != NULL)
{
delete right;
}
}
};
struct BST
{
Node_tree* root;
int size;
};
void init_BST(BST* bst)
{
bst->root = NULL;
bst->size = 0;
}
void add_BST(BST* bst, The_doc_gia* data)
{
Node_tree* p = bst->root;
Node_tree* parent = NULL;
while (p != NULL)
{
parent = p;
if (data->ma_the < p->data->ma_the)
p = p->left;
else
p = p->right;
}
Node_tree* new_node = new Node_tree;
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
if (parent == NULL)
bst->root = new_node;
else if (data->ma_the < parent->data->ma_the)
parent->left = new_node;
else
parent->right = new_node;
bst->size++;
}
void remove_BST(BST* bst, int ma_the)
{
Node_tree* p = bst->root;
Node_tree* parent = NULL;
while (p != NULL)
{
if (p->data->ma_the == ma_the)
break;
else
{
parent = p;
if (ma_the < p->data->ma_the)
p = p->left;
else
p = p->right;
}
}
if (p == NULL)
return;
if (p->left == NULL)
{
if (parent == NULL)
bst->root = p->right;
else if (p->data->ma_the < parent->data->ma_the)
parent->left = p->right;
else
parent->right = p->right;
}
else if (p->right == NULL)
{
if (parent == NULL)
bst->root = p->left;
else if (p->data->ma_the < parent->data->ma_the)
parent->left = p->left;
else
parent->right = p->left;
}
else
{
Node_tree* q = p->right;
Node_tree* parent_q = p;
while (q->left != NULL)
{
parent_q = q;
q = q->left;
}
p->data = q->data;
if (parent_q == p)
parent_q->right = q->right;
else
parent_q->left = q->right;
}
delete p;
bst->size--;
}
void in_order_BST_recursive(Node_tree* root, vector<The_doc_gia*>& v)
{
if (root == NULL)
return;
in_order_BST_recursive(root->left, v);
v.push_back(root->data);
in_order_BST_recursive(root->right, v);
}
vector<The_doc_gia*> in_order_BST(BST* bst)
{
vector<The_doc_gia*> v(0);
if (bst->root == NULL)
return v;
in_order_BST_recursive(bst->root, v);
return v;
}
The_doc_gia* search_BST(BST* bst, int ma_the)
{
Node_tree* p = bst->root;
while (p != NULL)
{
if (p->data->ma_the == ma_the)
return p->data;
else if (ma_the < p->data->ma_the)
p = p->left;
else
p = p->right;
}
return NULL;
}
void xoa_cay_BST(Node_tree* root)
{
if (root == NULL)
return;
xoa_cay_BST(root->left);
xoa_cay_BST(root->right);
delete root;
}
// * Phan bien toan cuc (global variable)
Dau_sach* danh_sach_dau_sach[MAX_SACH];
int so_luong_dau_sach;
list<Phieu_muon_tra_sach*> danh_sach_phieu_muon_tra_sach;
BST* danh_sach_the_doc_gia;
set<string> danh_sach_the_loai_sach;
Ngay_thang* ngay_thang_hien_tai;
/* Phan ham */
// * lien quan de tao struct (constructor)
Dau_sach* tao_dau_sach(string ISBN, string ten_sach, int so_trang, string tac_gia, int nam_xuat_ban, string the_loai);
Sach* tao_sach(string ma_sach, int trang_thai, string vi_tri);
The_doc_gia* tao_the_doc_gia(int ma_the, string ho_ten, string gioi_tinh);
Phieu_muon_tra_sach* tao_phieu_muon_tra_sach(Sach* sach, Ngay_thang* ngay_muon, Ngay_thang* ngay_tra, The_doc_gia* the_doc_gia, string, int);
Ngay_thang* tao_ngay_thang(int ngay, int thang, int nam);
// ham nguoi dung nhap
void nhap_dau_sach(/*Dau_sach *dau_sach*/);
void nhap_sach(/*Sach *sach*/);
// void nhap_the_doc_gia(The_doc_gia *the_doc_gia);
void nhap_phieu_muon_tra_sach(Phieu_muon_tra_sach* phieu_muon_tra_sach);
void nhap_ngay_thang(Ngay_thang* ngay_thang);
// ham in thong tin
void in_dau_sach();
void in_the_loai();
void in_sach();
// ham tim
void tim_sach();
void hien_main_menu();
void hien_menu_doc_gia();
void hien_menu_sach();
void hien_dau_sach();
void hien_menu_muon_tra();
void hien_menu_thong_ke();
// * cac ham trong doc gia
void nhap_the_doc_gia();
void in_the_doc_gia();
void in_the_doc_gia_theo_ma_the();
void in_the_doc_gia_theo_ho_ten();
void xoa_the_doc_gia();
void xin_chao_doc_giai(The_doc_gia* the_doc_gia);
// * cac ham trong muon tra
void muon_sach();
bool kiem_tra_dieu_kien_muon_sach(The_doc_gia*);
void tra_sach();
void in_sach_dang_muon();
void in_phieu_muon_tra_sach();
void in_danh_sach_the_thu_tu_tre_han();
void thong_ke_10_sach_cao_nhat();
// cac ham trong thong ke
// cac ham phu (search, sort, trim, Ngay_thang ...)
// luu file, doc file
void luu_file_dau_sach(); // luu luôn sách
void luu_file_the_doc_gia();
void luu_file_phieu_muon_tra_sach();
void luu_ngay_thang();
void doc_file_ngay_thang();
void doc_file_dau_sach();
void doc_file_the_doc_gia();
void doc_file_phieu_muon_tra_sach();
// cac ham find
vector<Dau_sach*> tim_sach_theo_ten(string ten_sach);
Sach* tim_sach_theo_ma_sach(string);
Phieu_muon_tra_sach* tim_phieu_muon_tra_theo_ma_phieu(string);
The_doc_gia* tim_the_doc_gia_theo_ma_the(int ma_the);
Dau_sach* tim_dau_sach_theo_ISBN(string);
void khoi_tao()
{
so_luong_dau_sach = 0;
ngay_thang_hien_tai = tao_ngay_thang(1,1, 2022);
danh_sach_the_doc_gia = new BST;
danh_sach_the_doc_gia->root = NULL;
danh_sach_the_doc_gia->size = 0;
doc_file_ngay_thang();
doc_file_dau_sach();
doc_file_phieu_muon_tra_sach();
doc_file_the_doc_gia();
}
void don_rac() // gabbage collector
{
luu_file_dau_sach();
luu_file_the_doc_gia();
luu_file_phieu_muon_tra_sach();
luu_ngay_thang();
// delete danh_sach_dau_sach;
for (int i = 0; i < so_luong_dau_sach; i++)
{
delete danh_sach_dau_sach[i];
}
xoa_cay_BST(danh_sach_the_doc_gia->root);
delete danh_sach_the_doc_gia;
// delete phieu muon tra sach
for (list<Phieu_muon_tra_sach*>::iterator it = danh_sach_phieu_muon_tra_sach.begin(); it != danh_sach_phieu_muon_tra_sach.end(); it++)
{
if (*it != NULL)
{
delete* it;
}
}
}
void cap_nhap_ngay_thang();
// Ham in
// void in_dau_sach(Dau_sach *dau_sach)
// {
// cout << left << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
// }
int main()
{
srand(time(NULL));
khoi_tao();
hien_main_menu();
don_rac();
return 0;
}
// menu
void hien_main_menu()
{
int choice;
do
{
system("cls");
cout << "\n==========================" << endl;
cout << "Hom nay la ngay: " << toString(ngay_thang_hien_tai) << endl
<< endl;
cout << "\t============== QUAN LY THU VIEN =============" << endl;
cout << "\t\t\t1. Doc gia\n";
cout << "\t\t\t2. Sach\n";
cout << "\t\t\t3. Muon tra\n";
cout << "\t\t\t4. Thong ke\n";
cout << "\t\t\t5. Cap nhap ngay thang\n";
cout << "\t\t\t0. Thoat\n";
cout << "\t\t============== END =============" << endl;
cout << "Nhap lua chon: ";
cin >> choice;
switch (choice)
{
case 1:
hien_menu_doc_gia();
break;
case 2:
hien_menu_sach();
break;
case 3:
hien_menu_muon_tra();
break;
case 4:
hien_menu_thong_ke();
break;
case 5:
cap_nhap_ngay_thang();
break;
case 0:
return;
break;
default:
cin.clear();
cout << "Lua chon khong hop le!\n";
break;
}
} while (choice != 0);
}
void hien_menu_doc_gia()
{
/*int luachon;
while (true)
{
system("cls");
cout << "\n==========================" << endl;
cout << "Hom nay la ngay: " << toString(ngay_thang_hien_tai) << endl
<< endl;
cout << "1. Nhap the doc gia\n";
cout << "2. In the doc gia\n";
cout << "3. Xoa the doc gia\n";
cout << "0. Thoat\n";
cout << "\n==========================" << endl;
cout << "Nhap lua chon: ";
//luachon = 0;
cin >> luachon;
if (luachon == 1)
{
nhap_the_doc_gia();
}
else if (luachon == 2)
{
in_the_doc_gia();
system("pause");
}
else if (luachon == 3)
{
xoa_the_doc_gia();
}
else if (luachon == 0)
{
return;
}
else
{
cout << "Lua chon khong hop le " << endl;
system("pause");
}
}*/
int choice;
do
{
cout << "\n==========================" << endl;
cout << "Hom nay la ngay: " << toString(ngay_thang_hien_tai) << endl
<< endl;
cout << "1. Nhap the doc gia\n";
cout << "2. In the doc gia\n";
cout << "3. Xoa the doc gia\n";
cout << "0. Thoat\n";
cout << "\n==========================" << endl;
cout << "Nhap lua chon: ";
choice = 0;
cin >> choice;
switch (choice)
{
case 1:
nhap_the_doc_gia();
break;
case 2:
in_the_doc_gia();
system("pause");
break;
case 3:
xoa_the_doc_gia();
break;
case 0:
return;
break;
default:
cout << "Lua chon khong hop le!\n";
cin.clear();
cin.ignore();
break;
}
} while (choice != 0);
}
void hien_menu_sach()
{
int choice;
do
{
cout << "\n==========================" << endl;
cout << "Hom nay la ngay: " << toString(ngay_thang_hien_tai) << endl
<< endl;
cout << "1. Cap nhat dau sach\n";
cout << "2. Hien thi cac dau sach\n";
cout << "3. Cap nhat danh muc sach\n";
cout << "4. Hien thi danh muc sach\n";
cout << "5. Tim thong tin sach\n";
cout << "0. Thoat\n";
cout << "\n==========================" << endl;
cout << "Nhap lua chon: ";
cin >> choice;
switch (choice)
{
case 0:
return;
break;
case 1:
nhap_dau_sach();
break;
case 2:
hien_dau_sach();
break;
case 3:
nhap_sach();
break;
case 4:
in_sach();
break;
case 5:
tim_sach();
break;
default:
cout << "Lua chon khong hop le!\n";
break;
}
} while (choice != 0);
}
void hien_dau_sach()
{
int choice;
do
{
cout << "\n==========================" << endl;
cout << "Hom nay la ngay: " << toString(ngay_thang_hien_tai) << endl
<< endl;
cout << "1. Hien thi tat ca dau sach\n";
cout << "2. Hien thi cac dau sach theo the loai\n";
cout << "0. Thoat\n";
cout << "\n==========================" << endl;
cout << "Nhap lua chon: ";
cin >> choice;
switch (choice)
{
case 0:
return;
break;
case 1:
in_dau_sach();
break;
case 2:
in_the_loai();
break;
default:
cout << "Lua chon khong hop le!\n";
break;
}
} while (choice != 0);
}
void hien_menu_muon_tra()
{
int choice;
do
{
cout << "\n==========================" << endl;
cout << "1. Muon sach\n";
cout << "2. Tra sach\n";
cout << "3. In phieu muon tra\n";
cout << "0. Thoat\n";
cout << "\n==========================" << endl;
cout << "Nhap lua chon: ";
cin >> choice;
switch (choice)
{
case 1:
muon_sach();
break;
case 2:
tra_sach();
break;
case 3:
in_sach_dang_muon();
break;
case 0:
return;
break;
default:
cout << "Lua chon khong hop le!\n";
break;
}
} while (choice != 0);
}
void hien_menu_thong_ke()
{
int choice;
do
{
cout << "\n==========================" << endl;
cout << "1. Thong ke doc gia muon qua han.\n";
cout << "2. Top 10 sach duoc muon nhieu nhat.\n";
cout << "0. Thoat\n";
cout << "\n==========================" << endl;
cout << "Nhap lua chon: ";
cin >> choice;
switch (choice)
{
case 1:
in_danh_sach_the_thu_tu_tre_han();
break;
case 2:
thong_ke_10_sach_cao_nhat();
break;
case 0:
return;
break;
default:
cout << "Lua chon khong hop le!\n";
break;
}
} while (choice != 0);
}
void cap_nhap_ngay_thang()
{
// the next day
ngay_thang_hien_tai->ngay++;
if (ngay_thang_hien_tai->ngay > monthDays[ngay_thang_hien_tai->thang - 1])
{
ngay_thang_hien_tai->ngay = 1;
ngay_thang_hien_tai->thang++;
}
if (ngay_thang_hien_tai->thang > 12)
{
ngay_thang_hien_tai->thang = 1;
ngay_thang_hien_tai->nam++;
}
// cout << "Ngay thang hien tai: " << toString(ngay_thang_hien_tai) << endl;
}
The_doc_gia* tao_the_doc_gia(int ma_the, string ho_ten, string gioi_tinh)
{
The_doc_gia* the_doc_gia = new The_doc_gia;
the_doc_gia->ma_the = ma_the;
the_doc_gia->ho_ten = viet_in_hoa(chuan_hoa_chuoi(ho_ten));
the_doc_gia->gioi_tinh = viet_in_hoa(chuan_hoa_chuoi(gioi_tinh));
the_doc_gia->trang_thai = 1;
for (int i = 0; i < MAX_SACH_MUON; i++)
the_doc_gia->sach_dang_muon[i] = NULL;
the_doc_gia->so_sach_dang_muon = 0;
return the_doc_gia;
}
Phieu_muon_tra_sach* tao_phieu_muon_tra_sach(Sach* sach,
Ngay_thang* ngay_muon,
Ngay_thang* ngay_tra,
The_doc_gia* the_doc_gia,
string ma_phieu = "", int trang_thai = 0)
{
Phieu_muon_tra_sach* phieu = new Phieu_muon_tra_sach;
if (ma_phieu == "")
{
phieu->ma_phieu = to_string(danh_so_the_muon);
danh_so_the_muon++;
}
else
phieu->ma_phieu = ma_phieu;
// cung la de luu lai ma phieu muon tra,
// neu dung so luong phieu muon tra thi se
// bi trung vi khi tra sach se xoa phieu muon tra
phieu->sach = sach;
phieu->ngay_muon = ngay_muon;
if (ngay_tra != NULL)
phieu->ngay_tra = ngay_tra;
else
phieu->ngay_tra = new Ngay_thang;
phieu->the_doc_gia = the_doc_gia;
phieu->trang_thai = trang_thai;
return phieu;
}
Ngay_thang* tao_ngay_thang(int ngay = 1, int thang = 1, int nam = 1970)
{
Ngay_thang* ngay_thang = new Ngay_thang;
ngay_thang->ngay = ngay;
ngay_thang->thang = thang;
ngay_thang->nam = nam;
return ngay_thang;
}
Dau_sach* tao_dau_sach(string ISBN, string ten_sach, int so_trang, string tac_gia, int nam_xuat_ban, string the_loai)
{
Dau_sach* dau_sach = new Dau_sach;
dau_sach->ISBN = ISBN;
dau_sach->ten_sach = ten_sach;
dau_sach->so_trang = so_trang;
dau_sach->tac_gia = tac_gia;
dau_sach->nam_xuat_ban = nam_xuat_ban;
dau_sach->the_loai = the_loai;
dau_sach->so_lan_muon = 0;
dau_sach->danh_muc_sach.clear();
danh_sach_the_loai_sach.insert(the_loai);
return dau_sach;
}
Sach* tao_sach(string ma_sach, int trang_thai, string vi_tri)
{
Sach* sach = new Sach;
sach->ma_sach = ma_sach;
sach->trang_thai = trang_thai;
sach->vi_tri = vi_tri;
return sach;
}
/* Phan hien thuc ham */
void nhap_dau_sach()
{
string ten_sach, tac_gia, the_loai, ISBN = random_ISBN(), ma_sach, vi_tri;
int nam_xuat_ban, so_trang, trang_thai;
cin.clear();
cin.ignore();
cout << "\n==========================" << endl;
cout << "Ma ISBN: " << ISBN << endl;
cout << "NHAP VAO CAC THONG TIN SAU" << endl;
cout << "Ten sach: ";
getline(cin, ten_sach);
ten_sach = viet_in_hoa(chuan_hoa_chuoi(ten_sach));
cout << "So trang: ";
cin >> so_trang;
cout << "Tac gia: ";
cin.ignore();
getline(cin, tac_gia);
tac_gia = viet_in_hoa(chuan_hoa_chuoi(tac_gia));
cout << "Nam xuat ban: ";
cin >> nam_xuat_ban;
cout << "The loai: ";
cin.ignore();
getline(cin, the_loai);
the_loai = viet_in_hoa(chuan_hoa_chuoi(the_loai));
Dau_sach* dau_sach = tao_dau_sach(ISBN, ten_sach, so_trang, tac_gia, nam_xuat_ban, the_loai);
// [1,2,3,x,x,x,], num = 3
danh_sach_dau_sach[so_luong_dau_sach++] = dau_sach;
cout << "\n==========================" << endl;
cout << left << setw(29) << "ISBN" << setw(29) << "Ten sach" << setw(20) << "So trang" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
cout << left << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
cout << "\n==========================" << endl;
int so_luong_sach{ 0 };
cout << "So luong sach: ";
cin >> so_luong_sach;
cout << "\n==========================" << endl;
for (int j = 0; j < so_luong_sach; j++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[so_luong_dau_sach - 1];
ma_sach = dau_sach->ISBN + to_string(j + 1);
cout << "Ma sach " << j + 1 << ": " << ma_sach << endl;
cout << "Trang thai sach (0: cho muon duoc - 1: da co doc gia muon - 2: sach da thanh ly): ";
cin >> trang_thai;
while (trang_thai != 0 && trang_thai != 1 && trang_thai != 2)
{
cout << "Nhap sai trang thai!\n";
cout << "Nhap lai trang thai (0: cho muon duoc - 1: da co doc gia muon - 2: sach da thanh ly): ";
cin >> trang_thai;
}
cout << "Vi tri sach: ";
cin >> vi_tri;
Sach* sach = tao_sach(ma_sach, trang_thai, vi_tri);
dau_sach->danh_muc_sach.push_back(sach);
cout << "\n==========================" << endl;
cout << left << setw(10) << "STT" << setw(29) << "Ma sach" << setw(29) << "Trang thai" << setw(20) << "Vi tri" << endl;
int n{ 0 };
for (list<Sach*>::iterator it = danh_sach_dau_sach[so_luong_dau_sach - 1]->danh_muc_sach.begin(); it != danh_sach_dau_sach[so_luong_dau_sach - 1]->danh_muc_sach.end(); it++)
{
cout << left << setw(10) << n + 1 << setw(29) << (*it)->ma_sach << setw(29) << (*it)->trang_thai << setw(20) << (*it)->vi_tri << endl;
n++;
}
cout << "\n==========================" << endl;
}
cin.ignore();
}
void in_dau_sach()
{
cout << "\n==========================" << endl;
cout << "BANG THONG TIN CAC DAU SACH THEO THU TU TEN SACH TANG DAN\n";
cout << left << setw(10) << "STT" << setw(29) << "ISBN" << setw(29) << "Ten sach" << setw(20) << "So trang" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
vector<string> ten_sach_sap_xep;
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach* dau_sach = danh_sach_dau_sach[i];
ten_sach_sap_xep.push_back(dau_sach->ten_sach);
}
sort(ten_sach_sap_xep.begin(), ten_sach_sap_xep.end());
for (int j = 0; j < ten_sach_sap_xep.size(); j++)
{
for (int k = 0; k < so_luong_dau_sach; k++)
{
Dau_sach* dau_sach = danh_sach_dau_sach[k];
if (ten_sach_sap_xep[j] == dau_sach->ten_sach)
{
Dau_sach* dau_sach = danh_sach_dau_sach[k];
cout << left << setw(10) << j + 1 << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
}
}
}
}
void nhap_sach()
{
int so_thu_tu{ 1 }, trang_thai, k{ 0 };
string ma_sach, vi_tri;
cout << setw(25) << "CHON DAU SACH DE CAP NHAT DANH MUC SACH" << endl;
cout << left << setw(10) << "STT" << setw(29) << "ISBN" << setw(29) << "Ten sach" << setw(20) << "So trang" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[i];
cout << left << setw(10) << i + 1 << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
}
cout << "NHAP VAO CAC THONG TIN SAU" << endl;
cout << "So thu tu: ";
cin >> so_thu_tu;
cout << left << setw(10) << "STT" << setw(29) << "Ma sach" << setw(29) << "Trang thai" << setw(20) << "Vi tri" << endl;
for (list<Sach*>::iterator it = danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.begin(); it != danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.end(); it++)
{
cout << left << setw(10) << k + 1 << setw(29) << (*it)->ma_sach << setw(29) << (*it)->trang_thai << setw(20) << (*it)->vi_tri << endl;
k++;
}
int so_luong_sach{ 0 };
cout << "So luong sach (lon hon 0): ";
cin >> so_luong_sach;
while (so_luong_sach < 0)
{
cout << "Nhap sai so luong sach!\n";
cout << "Nhap lai so luong sach (lon hon 0): ";
cin >> trang_thai;
}
for (int j = 0; j < so_luong_sach; j++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[so_thu_tu - 1];
ma_sach = dau_sach->ISBN + to_string(k + j + 1);
cout << "Ma sach " << k + j + 1 << ": " << dau_sach->ISBN + to_string(k + j + 1) << endl;
cout << "Trang thai sach (0: cho muon duoc - 1: da co doc gia muon - 2: sach da thanh ly): ";
cin >> trang_thai;
while (trang_thai != 0 && trang_thai != 1 && trang_thai != 2)
{
cout << "Nhap sai trang thai!\n";
cout << "Nhap lai trang thai (0: cho muon duoc - 1: da co doc gia muon - 2: sach da thanh ly): ";
cin >> trang_thai;
}
cout << "Vi tri sach: ";
cin >> vi_tri;
Sach* sach = tao_sach(ma_sach, trang_thai, vi_tri);
dau_sach->danh_muc_sach.push_back(sach);
cout << left << setw(10) << "STT" << setw(29) << "Ma sach" << setw(29) << "Trang thai" << setw(20) << "Vi tri" << endl;
int n{ 0 };
for (list<Sach*>::iterator it = danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.begin(); it != danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.end(); it++)
{
cout << left << setw(10) << n + 1 << setw(29) << (*it)->ma_sach << setw(29) << (*it)->trang_thai << setw(20) << (*it)->vi_tri << endl;
n++;
}
}
cin.ignore();
}
void in_sach()
{
int so_thu_tu{ 1 }, m{ 1 };
cout << setw(25) << "CHON DAU SACH DE XEM DANH MUC SACH" << endl;
cout << left << setw(10) << "STT" << setw(29) << "ISBN" << setw(29) << "Ten sach" << setw(20) << "So trang" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[i];
cout << left << setw(10) << i + 1 << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
}
cout << "NHAP VAO THONG TIN SAU" << endl;
cout << "So thu tu: ";
cin >> so_thu_tu;
cout << left << setw(10) << "STT" << setw(29) << "Ma sach" << setw(29) << "Trang thai" << setw(20) << "Vi tri" << endl;
for (list<Sach*>::iterator it = danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.begin(); it != danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.end(); it++)
{
cout << left << setw(10) << m++ << setw(29) << (*it)->ma_sach << setw(29) << (*it)->trang_thai << setw(20) << (*it)->vi_tri << endl;
}
}
void tim_sach()
{
string ten_sach_can_tim, ten_sach;
bool tim_thay{ false };
cout << "Nhap ten sach can tim: ";
cin.ignore();
getline(cin, ten_sach_can_tim);
ten_sach_can_tim = viet_in_hoa(chuan_hoa_chuoi(ten_sach_can_tim));
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[i];
ten_sach = dau_sach->ten_sach;
if (ten_sach.find(ten_sach_can_tim) != string::npos)
{
tim_thay = true;
}
}
if (tim_thay == true)
{
}
else
{
cout << "Khong tim thay sach!" << endl;
return;
}
cout << left << setw(10) << "STT" << setw(29) << "ISBN" << setw(29) << "Ten sach" << setw(20) << "So trang" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
int so_thu_tu, k{ 0 };
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[i];
ten_sach = dau_sach->ten_sach;
if (ten_sach.find(ten_sach_can_tim) != string::npos)
{
cout << left << setw(10) << i + 1 << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
}
}
cout << "Nhap STT de hien thi danh muc sach: ";
cin >> so_thu_tu;
cout << left << setw(10) << "STT" << setw(29) << "Ma sach" << setw(29) << "Trang thai" << setw(20) << "Vi tri" << endl;
for (list<Sach*>::iterator it = danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.begin(); it != danh_sach_dau_sach[so_thu_tu - 1]->danh_muc_sach.end(); it++)
{
cout << left << setw(10) << k + 1 << setw(29) << (*it)->ma_sach << setw(29) << (*it)->trang_thai << setw(20) << (*it)->vi_tri << endl;
k++;
}
}
void in_the_loai()
{
vector<string> danh_sach_the_loai;
int so_thu_tu{ 1 }, i{ 1 }, luong_sach_the_loai, index{ 0 };
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach* dau_sach = danh_sach_dau_sach[i];
danh_sach_the_loai_sach.insert(dau_sach->the_loai);
}
cout << "\n==========================" << endl;
cout << left << setw(10) << "STT" << setw(29) << "THE LOAI" << endl;
for (auto it = danh_sach_the_loai_sach.begin(); it != danh_sach_the_loai_sach.end(); it++)
{
danh_sach_the_loai.push_back(*it);
}
for (int i = 0; i < danh_sach_the_loai.size(); i++)
{
cout << left << setw(10) << i + 1 << setw(29) << danh_sach_the_loai[i] << endl;
}
cout << "\n==========================" << endl;
cout << "Nhap STT ung voi the loai: ";
cin >> so_thu_tu;
cout << "\n==========================" << endl;
cout << left << setw(10) << "STT" << setw(29) << "ISBN" << setw(29) << "Ten sach" << setw(20) << "So trang" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
vector<string> ten_sach_sap_xep;
Dau_sach* dau_sach_the_loai = danh_sach_dau_sach[so_thu_tu - 1];
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach* dau_sach = danh_sach_dau_sach[i];
if (dau_sach->the_loai == danh_sach_the_loai[so_thu_tu - 1])
{
ten_sach_sap_xep.push_back(dau_sach->ten_sach);
}
}
sort(ten_sach_sap_xep.begin(), ten_sach_sap_xep.end());
for (int j = 0; j < ten_sach_sap_xep.size(); j++)
{
for (int k = 0; k < so_luong_dau_sach; k++)
{
Dau_sach* dau_sach = danh_sach_dau_sach[k];
if (ten_sach_sap_xep[j] == dau_sach->ten_sach)
{
cout << left << setw(10) << j + 1 << setw(29) << dau_sach->ISBN << setw(29) << dau_sach->ten_sach << setw(20) << dau_sach->so_trang << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
}
}
}
}
void luu_file_dau_sach()
{
ofstream fout;
fout.open("./Data/dau_sach.txt");
for (int i = 0; i < so_luong_dau_sach; i++)
{
fout << danh_sach_dau_sach[i]->ISBN << endl;
fout << danh_sach_dau_sach[i]->ten_sach << endl;
fout << danh_sach_dau_sach[i]->so_trang << endl;
fout << danh_sach_dau_sach[i]->tac_gia << endl;
fout << danh_sach_dau_sach[i]->nam_xuat_ban << endl;
fout << danh_sach_dau_sach[i]->the_loai << endl;
fout << danh_sach_dau_sach[i]->so_lan_muon << endl;
fout << danh_sach_dau_sach[i]->danh_muc_sach.size() << endl;
// luu danh muc sach
for (list<Sach*>::iterator it = danh_sach_dau_sach[i]->danh_muc_sach.begin(); it != danh_sach_dau_sach[i]->danh_muc_sach.end(); it++)
{
fout << (*it)->ma_sach << endl;
fout << (*it)->trang_thai << endl;
fout << (*it)->vi_tri << endl;
}
}
fout.close();
}
void doc_file_dau_sach()
{
ifstream fin;
fin.open("./Data/dau_sach.txt");
if (!fin.is_open())
{
cout << "Khong mo duoc file dau sach!\n";
return;
}
while (!fin.eof())
{
string ISBN, ten_sach, tac_gia, the_loai;
int nam_xuat_ban;
int so_lan_muon;
int so_luong_sach, so_trang;
string tempt;
getline(fin, ISBN);
if (ISBN == "")
break;
getline(fin, ten_sach);
getline(fin, tempt);
so_trang = stoi(tempt);
getline(fin, tac_gia);
getline(fin, tempt);
nam_xuat_ban = stoi(tempt);
getline(fin, the_loai);
getline(fin, tempt);
so_lan_muon = stoi(tempt);
getline(fin, tempt);
so_luong_sach = stoi(tempt);
Dau_sach* dau_sach = tao_dau_sach(ISBN, ten_sach, so_trang, tac_gia, nam_xuat_ban, the_loai);
for (int i = 0; i < so_luong_sach; i++)
{
string ma_sach, vi_tri, tempt;
int trang_thai;
getline(fin, ma_sach);
getline(fin, tempt);
trang_thai = stoi(tempt);
getline(fin, vi_tri);
Sach* sach = tao_sach(ma_sach, trang_thai, vi_tri);
dau_sach->danh_muc_sach.push_back(sach);
}
dau_sach->so_lan_muon = so_lan_muon;
danh_sach_dau_sach[so_luong_dau_sach] = dau_sach;
so_luong_dau_sach++;
}
fin.close();
}
void luu_file_the_doc_gia()
{
ofstream fout;
fout.open("./Data/the_doc_gia.txt");
vector<The_doc_gia*> ds_the_doc_gia_tempt = in_order_BST(danh_sach_the_doc_gia);
for (int i = 0; i < ds_the_doc_gia_tempt.size(); i++)
{
The_doc_gia*& the_doc_gia = ds_the_doc_gia_tempt[i];
fout << the_doc_gia->ma_the << endl;
fout << the_doc_gia->ho_ten << endl;
fout << the_doc_gia->gioi_tinh << endl;
fout << the_doc_gia->trang_thai << endl;
fout << the_doc_gia->so_sach_dang_muon << endl;
for (int j = 0; j < the_doc_gia->so_sach_dang_muon; j++)
{
fout << the_doc_gia->sach_dang_muon[j]->ma_phieu << endl;
}
}
fout.close();
}
void luu_ngay_thang()
{
ofstream fout;
fout.open("./Data/ngay_thang.txt");
fout << ngay_thang_hien_tai->ngay << endl;
fout << ngay_thang_hien_tai->thang << endl;
fout << ngay_thang_hien_tai->nam << endl;
fout.close();
}
void luu_file_phieu_muon_tra_sach()
{
ofstream fout("./Data/phieu_muon_tra_sach.txt");
fout << danh_so_the_muon << endl;
for (auto it = danh_sach_phieu_muon_tra_sach.begin(); it != danh_sach_phieu_muon_tra_sach.end(); it++)
{
fout << (*it)->ma_phieu << endl;
fout << (*it)->sach->ma_sach << endl;
fout << (*it)->ngay_muon->ngay << endl;
fout << (*it)->ngay_muon->thang << endl;
fout << (*it)->ngay_muon->nam << endl;
fout << (*it)->ngay_tra->ngay << endl;
fout << (*it)->ngay_tra->thang << endl;
fout << (*it)->ngay_tra->nam << endl;
fout << (*it)->trang_thai << endl;
}
fout.close();
}
void doc_file_phieu_muon_tra_sach()
{
// doc file va tao lai danh sach
ifstream fin("./Data/phieu_muon_tra_sach.txt");
if (!fin.is_open())
{
cout << "Khong mo duoc file phieu muon tra sach!\n";
return;
}
The_doc_gia* the_doc_gia_tempt = NULL;
string tempt;
getline(fin, tempt);
danh_so_the_muon = stoi(tempt);
while (!fin.eof())
{
string ma_phieu, ma_sach;
int ngay, thang, nam;
int ngay_tra, thang_tra, nam_tra;
int trang_thai;
getline(fin, ma_phieu);
if (ma_phieu == "")
break;
getline(fin, ma_sach);
getline(fin, tempt);
ngay = stoi(tempt);
getline(fin, tempt);
thang = stoi(tempt);
getline(fin, tempt);
nam = stoi(tempt);
getline(fin, tempt);
ngay_tra = stoi(tempt);
getline(fin, tempt);
thang_tra = stoi(tempt);
getline(fin, tempt);
nam_tra = stoi(tempt);
getline(fin, tempt);
trang_thai = stoi(tempt);
Ngay_thang* ngay_muon = tao_ngay_thang(ngay, thang, nam);
Ngay_thang* ngay_thang_tra = tao_ngay_thang(ngay_tra, thang_tra, nam_tra);
Phieu_muon_tra_sach* phieu_muon_tra_sach = tao_phieu_muon_tra_sach(tim_sach_theo_ma_sach(ma_sach), ngay_muon, ngay_thang_tra, the_doc_gia_tempt, ma_phieu);
danh_sach_phieu_muon_tra_sach.push_back(phieu_muon_tra_sach);
}
fin.close();
}
void doc_file_the_doc_gia()
{
// doc va tao lai danh sach
ifstream fin("./Data/the_doc_gia.txt");
if (!fin.is_open())
{
cout << "Khong mo duoc file the doc gia!\n";
return;
}
string tempt;
while (!fin.eof())
{
string ho_ten, gioi_tinh;
int so_sach_dang_muon, ma_the, trang_thai;
getline(fin, tempt);
if (tempt == "")
break;
ma_the = stoi(tempt);
getline(fin, ho_ten);
getline(fin, gioi_tinh);
getline(fin, tempt);
trang_thai = stoi(tempt);
getline(fin, tempt);
so_sach_dang_muon = stoi(tempt);
The_doc_gia* the_doc_gia = tao_the_doc_gia(ma_the, ho_ten, gioi_tinh);
for (int i = 0; i < so_sach_dang_muon; i++)
{
getline(fin, tempt);
Phieu_muon_tra_sach* phieu_muon_tra_sach_tempt = tim_phieu_muon_tra_theo_ma_phieu(tempt);
phieu_muon_tra_sach_tempt->the_doc_gia = the_doc_gia;
the_doc_gia->sach_dang_muon[i] = phieu_muon_tra_sach_tempt;
the_doc_gia->sach_dang_muon[i]->the_doc_gia = the_doc_gia;
the_doc_gia->so_sach_dang_muon++;
}
add_BST(danh_sach_the_doc_gia, the_doc_gia);
}
fin.close();
}
void doc_file_ngay_thang()
{
ifstream fin("./Data/ngay_thang.txt");
if (!fin.is_open())
{
cout << "Khong mo duoc file ngay thang!\n";
return;
}
string tempt;
getline(fin, tempt);
ngay_thang_hien_tai->ngay = stoi(tempt);
getline(fin, tempt);
ngay_thang_hien_tai->thang = stoi(tempt);
getline(fin, tempt);
ngay_thang_hien_tai->nam = stoi(tempt);
fin.close();
}
Sach* tim_sach_theo_ma_sach(string ma_sach)
{
for (int i = 0; i < so_luong_dau_sach; i++)
{
if (danh_sach_dau_sach[i]->ISBN == ma_sach.substr(0, 13))
for (list<Sach*>::iterator it = danh_sach_dau_sach[i]->danh_muc_sach.begin(); it != danh_sach_dau_sach[i]->danh_muc_sach.end(); it++)
{
if ((*it)->ma_sach == ma_sach)
{
return *it;
}
}
}
return NULL;
}
Phieu_muon_tra_sach* tim_phieu_muon_tra_theo_ma_phieu(string ma_phieu)
{
for (auto it = danh_sach_phieu_muon_tra_sach.begin(); it != danh_sach_phieu_muon_tra_sach.end(); it++)
{
if ((*it)->ma_phieu == ma_phieu)
return *it;
}
return NULL;
}
The_doc_gia* tim_the_doc_gia_theo_ma_the(int ma_the)
{
return search_BST(danh_sach_the_doc_gia, ma_the);
}
void nhap_the_doc_gia()
{
int ma_the = random_ma_the();
string ho_ten, gioi_tinh;
cout << "Ma the: DG" << ma_the << endl;
cin.ignore();
cout << "Nhap ho ten: ";
getline(cin, ho_ten);
cout << "Nhap gioi tinh (NAM - NU): ";
getline(cin, gioi_tinh);
gioi_tinh = viet_in_hoa(chuan_hoa_chuoi(gioi_tinh));
while (gioi_tinh != "NAM" && gioi_tinh != "NU")
{
cout << "Nhap sai gioi tinh!\n";
cout << "Nhap lai gioi tinh: (NAM - NU)";
getline(cin, gioi_tinh);
gioi_tinh = viet_in_hoa(chuan_hoa_chuoi(gioi_tinh));
}
The_doc_gia* the_doc_gia = tao_the_doc_gia(ma_the, ho_ten, gioi_tinh);
add_BST(danh_sach_the_doc_gia, the_doc_gia);
}
void in_the_doc_gia_theo_ma_the()
{
vector<The_doc_gia*> danh_sach_the_doc_gia_tempt = in_order_BST(danh_sach_the_doc_gia);
// in danh sach
cout << left << setw(15) << "Ma the" << setw(15) << "Ho ten" << setw(15) << "Gioi tinh" << setw(5) << "TT" << setw(15) << "So sach dang muon" << endl;
for (int i = 0; i < danh_sach_the_doc_gia_tempt.size(); i++)
{
The_doc_gia*& t = danh_sach_the_doc_gia_tempt[i];
cout << left << setw(15) << t->ma_the << setw(15) << t->ho_ten << setw(15) << t->gioi_tinh << setw(5) << t->trang_thai << setw(15) << t->so_sach_dang_muon << endl;
}
}
string lay_ten(string ho_ten)
{
string ten;
size_t pos = ho_ten.rfind(' ');
if (pos != string::npos)
{
return ho_ten.substr(pos + 1);
}
else
return ho_ten;
// ten = ho_ten.substr(pos + 1);
}
bool so_sanh_ten_ho(string a, string b)
{
string a_tempt = chuan_hoa_chuoi(a);
string b_tempt = chuan_hoa_chuoi(b);
// get last word
string ten_a = lay_ten(a_tempt);
string ten_b = lay_ten(b_tempt);
if (ten_a == ten_b)
return a_tempt < b_tempt;
else
return ten_a < ten_b;
}
bool so_sanh_the_theo_ho_ten(The_doc_gia* a, The_doc_gia* b)
{
return so_sanh_ten_ho(a->ho_ten, b->ho_ten);
}
void in_the_doc_gia_theo_ho_ten()
{
vector<The_doc_gia*> danh_sach_the_doc_gia_tempt = in_order_BST(danh_sach_the_doc_gia);
// in danh sach
// sort theo ten
sort(danh_sach_the_doc_gia_tempt.begin(), danh_sach_the_doc_gia_tempt.end(), so_sanh_the_theo_ho_ten);
cout << left << setw(15) << "Ma the" << setw(15) << "Ho ten" << setw(15) << "Gioi tinh" << setw(5) << "TT" << setw(15) << "So sach dang muon" << endl;
for (int i = 0; i < danh_sach_the_doc_gia_tempt.size(); i++)
{
The_doc_gia*& t = danh_sach_the_doc_gia_tempt[i];
cout << left << setw(15) << t->ma_the << setw(15) << t->ho_ten << setw(15) << t->gioi_tinh << setw(5) << t->trang_thai << setw(15) << t->so_sach_dang_muon << endl;
}
}
void in_the_doc_gia()
{
cout << "1. In the theo ma the\n";
cout << "2. In the theo ho ten\n";
int chon;
cout << "Chon: (1 hoac 2) ";
cin >> chon;
while (chon != 1 && chon != 2)
{
cout << "Nhap sai!\n";
cout << "Nhap lai: ";
cin >> chon;
}
if (chon == 1)
in_the_doc_gia_theo_ma_the();
else
in_the_doc_gia_theo_ho_ten();
}
void xoa_the_doc_gia()
{
int ma_the;
cout << "Nhap ma the can xoa: ";
cin >> ma_the;
The_doc_gia* the_doc_gia = tim_the_doc_gia_theo_ma_the(ma_the);
if (the_doc_gia == NULL)
{
cout << "Khong tim thay the doc gia!\n";
return;
}
// In thong tin the doc gia
cout << left << setw(15) << "Ma the" << setw(15) << "Ho ten" << setw(15) << "Gioi tinh" << setw(5) << "TT" << setw(15) << "So sach dang muon" << endl;
cout << left << setw(15) << the_doc_gia->ma_the << setw(15) << the_doc_gia->ho_ten << setw(15) << the_doc_gia->gioi_tinh << setw(5) << the_doc_gia->trang_thai << setw(15) << the_doc_gia->so_sach_dang_muon << endl;
cout << "Ban co muon xoa the doc gia nay khong? (y/n): ";
char c;
cin >> c;
if (c == 'n' || c == 'N')
return;
for (int i = 0; i < the_doc_gia->so_sach_dang_muon; i++)
{
delete the_doc_gia->sach_dang_muon[i];
the_doc_gia->sach_dang_muon[i] = NULL;
}
remove_BST(danh_sach_the_doc_gia, the_doc_gia->ma_the);
cout << "Xoa thanh cong!\n";
}
void muon_sach()
{
int ma_the;
string ten_sach;
cout << "Nhap ma the: ";
cin >> ma_the;
The_doc_gia* the_doc_gia = tim_the_doc_gia_theo_ma_the(ma_the);
if (the_doc_gia == NULL)
{
cout << "Khong tim thay the doc gia!\n";
return;
}
xin_chao_doc_giai(the_doc_gia);
if (!kiem_tra_dieu_kien_muon_sach(the_doc_gia))
{
cout << "Doc gia khong du dieu kiem muon sach.\n";
return;
}
cout << "Tim sach\n";
cout << "Nhap ten sach: ";
cin.ignore();
getline(cin, ten_sach);
vector<Dau_sach*> danh_sach_sach_tempt = tim_sach_theo_ten(ten_sach);
if (danh_sach_sach_tempt.size() == 0)
{
cout << "Khong tim thay sach!\n";
return;
}
cout << "Danh sach sach tim duoc:\n";
cout << left << setw(4) << "STT" << setw(20) << "Ten sach" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
for (int i = 0; i < danh_sach_sach_tempt.size(); i++)
{
Dau_sach*& dau_sach = danh_sach_sach_tempt[i];
cout << left << setw(4) << i + 1 << setw(20) << dau_sach->ten_sach << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
// cout << left << setw(15) << s->ma_sach << setw(15) << s->ten_sach << setw(15) << s->tac_gia << setw(15) << s->nha_xuat_ban << setw(15) << s->gia_sach << endl;
}
cout << "Chon sach muon: (1 ->" << danh_sach_sach_tempt.size() << ") ";
int chon;
cin >> chon;
if (chon < 1 || chon > danh_sach_sach_tempt.size())
{
cout << "Chon khong hop le!\n";
return;
}
Dau_sach*& dau_sach = danh_sach_sach_tempt[chon - 1];
Sach* sach_muon = NULL;
// tim sach trong dau sach
for (list<Sach*>::iterator it = dau_sach->danh_muc_sach.begin(); it != dau_sach->danh_muc_sach.end(); it++)
{
if ((*it)->trang_thai == 0)
{
sach_muon = *it;
break;
}
}
if (sach_muon == NULL)
{
cout << "Sach da muon het!\n";
return;
}
Phieu_muon_tra_sach* phieu_muon_tra_sach = tao_phieu_muon_tra_sach(sach_muon, ngay_thang_hien_tai, NULL, the_doc_gia);
danh_sach_phieu_muon_tra_sach.push_back(phieu_muon_tra_sach);
the_doc_gia->sach_dang_muon[the_doc_gia->so_sach_dang_muon] = phieu_muon_tra_sach;
the_doc_gia->so_sach_dang_muon++;
sach_muon->trang_thai = 1;
dau_sach->so_lan_muon++;
cout << "Muon sach thanh cong!\n";
}
std::vector<Dau_sach*> tim_sach_theo_ten(std::string ten_sach)
{
vector<Dau_sach*> danh_sach_sach_tempt;
danh_sach_sach_tempt.clear();
string key_word = chuan_hoa_chuoi(viet_in_hoa(ten_sach));
for (int i = 0; i < so_luong_dau_sach; i++)
{
Dau_sach*& ds = danh_sach_dau_sach[i];
if (ds->danh_muc_sach.empty())
continue;
string ten_dau_sach = chuan_hoa_chuoi(viet_in_hoa(ds->ten_sach));
if (ten_dau_sach.find(key_word) != string::npos)
{
danh_sach_sach_tempt.push_back(ds);
}
}
return danh_sach_sach_tempt;
}
void in_sach_dang_muon_theo_the_doc_gia(The_doc_gia* the_doc_gia)
{
if (the_doc_gia == NULL)
{
return;
}
if (the_doc_gia->so_sach_dang_muon == 0)
{
cout << "Khong co sach dang muon!\n";
return;
}
cout << "Danh sach sach dang muon:\n";
cout << left << setw(4) << "STT" << setw(20) << "Ten sach" << setw(20) << "Tac gia" << setw(20) << "Nam xuat ban" << setw(20) << "The loai" << endl;
for (int i = 0; i < the_doc_gia->so_sach_dang_muon; i++)
{
Phieu_muon_tra_sach*& phieu_muon_tra_sach = the_doc_gia->sach_dang_muon[i];
Dau_sach* dau_sach = tim_dau_sach_theo_ISBN(phieu_muon_tra_sach->sach->ma_sach.substr(0, 13));
cout << left << setw(4) << i + 1 << setw(20) << dau_sach->ten_sach << setw(20) << dau_sach->tac_gia << setw(20) << dau_sach->nam_xuat_ban << setw(20) << dau_sach->the_loai << endl;
}
}
Dau_sach* tim_dau_sach_theo_ISBN(string ISBN)
{
for (int i = 0; i < so_luong_dau_sach; i++)
{
if (danh_sach_dau_sach[i]->ISBN == ISBN)
{
return danh_sach_dau_sach[i];
}
}
return NULL;
}
void tra_sach()
{
int ma_the;
cout << "Nhap ma the: ";
cin >> ma_the;
The_doc_gia* the_doc_gia = tim_the_doc_gia_theo_ma_the(ma_the);
in_sach_dang_muon_theo_the_doc_gia(the_doc_gia);
if (the_doc_gia == NULL)
{
cout << "Khong tim thay the doc gia!\n";
return;
}
xin_chao_doc_giai(the_doc_gia);
cout << "Chon sach muon tra: (1 ->" << the_doc_gia->so_sach_dang_muon << ") ";
int chon;
cin >> chon;
if (chon < 1 || chon > the_doc_gia->so_sach_dang_muon)
{
cout << "Chon khong hop le!\n";
return;
}
Phieu_muon_tra_sach* phieu = the_doc_gia->sach_dang_muon[chon - 1];
phieu->ngay_tra = ngay_thang_hien_tai;
phieu->trang_thai = 1;
phieu->sach->trang_thai = 0;
the_doc_gia->sach_dang_muon[chon - 1] = the_doc_gia->sach_dang_muon[the_doc_gia->so_sach_dang_muon - 1];
the_doc_gia->sach_dang_muon[the_doc_gia->so_sach_dang_muon - 1] = NULL;
the_doc_gia->so_sach_dang_muon--;
cout << "Tra sach thanh cong!\n";
}
void in_sach_dang_muon()
{
int ma_the;
cout << "Nhap ma the: ";
cin >> ma_the;
The_doc_gia* the_doc_gia = tim_the_doc_gia_theo_ma_the(ma_the);
if (the_doc_gia == NULL)
{
cout << "Khong tim thay the doc gia!\n";
return;
}
xin_chao_doc_giai(the_doc_gia);
in_sach_dang_muon_theo_the_doc_gia(the_doc_gia);
}
void xin_chao_doc_giai(The_doc_gia* the_doc_gia)
{
if (the_doc_gia == NULL)
{
return;
}
cout << "Xin chao " << the_doc_gia->ho_ten << "!\n";
}
bool kiem_tra_bi_tre_han(The_doc_gia* the_doc_gia)
{
if (the_doc_gia == NULL)
{
return false;
}
if (the_doc_gia->so_sach_dang_muon == 0)
{
return false;
}
for (int i = 0; i < the_doc_gia->so_sach_dang_muon; i++)
{
Phieu_muon_tra_sach*& phieu_muon_tra_sach = the_doc_gia->sach_dang_muon[i];
if (getDifferenceDay(phieu_muon_tra_sach->ngay_muon, ngay_thang_hien_tai) > MAX_NGAY_MUON)
{
return true;
}
}
return false;
}
bool kiem_tra_dieu_kien_muon_sach(The_doc_gia* the_doc_gia)
{
// TODO can lam
if (the_doc_gia->trang_thai == 0)
{
cout << "The doc gia bi khoa!\n";
return false;
}
if (the_doc_gia->so_sach_dang_muon >= MAX_SACH_MUON)
{
cout << "The doc gia da muon qua so luong sach!\n";
return false;
}
// ton tai sach qua han
if (kiem_tra_bi_tre_han(the_doc_gia))
{
cout << "The doc gia da muon qua thoi gian muon!\n";
return false;
}
return true;
}
bool so_sanh_ngay_thang(Ngay_thang* a, Ngay_thang* b)
{
return a->nam > b->nam;
return a->thang > b->thang;
return a->ngay > b->ngay;
}
int so_ngay_tre_han(The_doc_gia* t)
{
int res = 0;
for (int i = 0; i < t->so_sach_dang_muon; i++)
{
Phieu_muon_tra_sach*& phieu_muon_tra_sach = t->sach_dang_muon[i];
int tempt = getDifferenceDay(phieu_muon_tra_sach->ngay_muon, ngay_thang_hien_tai);
if (tempt > res)
res = tempt;
}
return res;
}
bool so_sanh_tre_han(The_doc_gia* a, The_doc_gia* b)
{
return so_ngay_tre_han(a) > so_ngay_tre_han(b);
}
void in_danh_sach_the_thu_tu_tre_han()
{
vector<The_doc_gia*> ds_the_doc_gia_dan_no = in_order_BST(danh_sach_the_doc_gia);
int i = 0;
while (i < ds_the_doc_gia_dan_no.size())
{
The_doc_gia*& the_doc_gia = ds_the_doc_gia_dan_no[i];
if (kiem_tra_bi_tre_han(the_doc_gia))
{
i++;
}
else
{
ds_the_doc_gia_dan_no.erase(ds_the_doc_gia_dan_no.begin() + i);
}
}
// sort theo ngay muon
sort(ds_the_doc_gia_dan_no.begin(), ds_the_doc_gia_dan_no.end(), so_sanh_tre_han);
cout << left << setw(15) << "Ma the" << setw(15) << "Ho ten" << setw(15) << "Gioi tinh" << setw(5) << "TT" << setw(15) << "So sach dang muon" << endl;
for (int i = 0; i < ds_the_doc_gia_dan_no.size(); i++)
{
The_doc_gia*& t = ds_the_doc_gia_dan_no[i];
cout << left << setw(15) << t->ma_the << setw(15) << t->ho_ten << setw(15) << t->gioi_tinh << setw(5) << t->trang_thai << setw(15) << t->so_sach_dang_muon << endl;
}
}
bool so_sanh_so_lan_muon(Dau_sach* a, Dau_sach* b)
{
return a->so_lan_muon > b->so_lan_muon;
}
void thong_ke_10_sach_cao_nhat()
{
// return 0;3
// sort dau sach theo so lan muon
sort(danh_sach_dau_sach, danh_sach_dau_sach + so_luong_dau_sach, so_sanh_so_lan_muon);
cout << left << setw(15) << "Ma sach" << setw(15) << "Ten sach" << setw(15) << "So luong" << endl;
for (int i = 0; i < 10; i++)
{
Dau_sach*& dau_sach = danh_sach_dau_sach[i];
if (dau_sach == NULL)
{
break;
}
cout << left << setw(15) << dau_sach->ISBN << setw(15) << dau_sach->ten_sach << setw(15) << dau_sach->so_lan_muon << endl;
}
}Editor is loading...