You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

396 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "MangerBook.h"
#include "Book.h"
#include <fstream>
#include <string>
#include <algorithm>
#include <cmath>
MangerBook::MangerBook()//构造函数
{
this->Book_Array = new vector<Book*>;
this->Init_Book();//初始化
}
void MangerBook::Init_Book()
{
/*
ifstream fi;
fi.open("D:/c++一些代码/library class版/library class版/图书信息.txt",ios::in);
if (!fi.is_open()) {
std::cerr << "无法打开文件" << std::endl;
return;
}
string _name;
int _year,_month,_day;
int _isleadbook;
int _times;
while(fi>>_name&&fi>>_year&&fi>>_month && fi>>_day&&fi>>_isleadbook&&fi>>_times)
{
Date _data(_year,_month,_day);
Book *_pstu = NULL;
if(_isleadbook==0)
_pstu = new Book(_name,_data,true,_times);
else
_pstu = new Book(_name,_data,false,_times);
this->Book_Array->push_back(_pstu);
}
fi.close();
*/
//初始六本书,本来想用文件输入,但是无法输出,最后也没有解决,上面注释是输入失败的代码
Book* _pstu1 = NULL;
Date _data1(2024, 3, 4);
_pstu1 = new Book("数据结构基础", _data1, false, 117);
this->Book_Array->push_back(_pstu1);
Book* _pstu2 = NULL;
Date _data2(2023, 10, 17);
_pstu2 = new Book("红楼梦", _data2, true, 11);
this->Book_Array->push_back(_pstu2);
Book* _pstu3 = NULL;
Date _data3(2024, 5, 16);
_pstu3 = new Book("计算机网络", _data3, false, 98);
this->Book_Array->push_back(_pstu3);
Book* _pstu4 = NULL;
Date _data4(2023, 10, 4);
_pstu4 = new Book("离散数学", _data1, true, 11);
this->Book_Array->push_back(_pstu4);
Book* _pstu5 = NULL;
Date _data5(2023, 2, 16);
_pstu5 = new Book("操作系统", _data5, false, 110);
this->Book_Array->push_back(_pstu5);
Book* _pstu6 = NULL;
Date _data6(2023, 10, 1);
_pstu6 = new Book("工科数学分析", _data6, false, 111);
this->Book_Array->push_back(_pstu6);
}
void MangerBook::ShowMenu()
{
cout << "-----------------------------------------------------------" << endl;
cout << "-------------------某某大学图书管理系统---------------------" << endl;
cout << "----------------------0、退出系统--------------------------" << endl;
cout << "---------------------1、借出排行榜-------------------------" << endl;
cout << "---------------------2、新增图书---------------------------" << endl;
cout << "---------------------3、查看图书---------------------------" << endl;
cout << "---------------------4、删除图书---------------------------" << endl;
cout << "---------------------5、借出图书---------------------------" << endl;
cout << "---------------------6、归还图书---------------------------" << endl;
cout << "---------------------7、显示书库---------------------------" << endl;
cout << "-----------------------------------------------------------" << endl;
cout << endl;
}
void MangerBook::Exit_Sys()//退出系统函数
{
cout << "谢谢使用" << endl;
exit(-1);
}
bool cmp(Book* book1, Book* book2)//设置排列顺序从大到小
{
return book1->getTimes() > book2->getTimes();
}
void MangerBook::LoanRanking()//借出排行使用STL从大到小排列
{
sort(Book_Array->begin(), Book_Array->end(), cmp);
for (int i = 0; i < (int)Book_Array->size(); i++) {
this->Book_Array->at(i)->ShowInfo();
}
system("pause");
system("cls");
}
void MangerBook::ShowBook()//显示在库图书信息
{
for (int i = 0; i < (int)Book_Array->size(); i++) {
this->Book_Array->at(i)->ShowInfo();
}
system("pause");
system("cls");
}
void MangerBook::AddBook()//添加书籍
{
int i = 1;//记录添加
while (true)
{
char flag;
string _name;
cout << "请输入添加第" << i << "本书的名字" << endl;
cin >> _name;
Book* _pstu = NULL;
Date _data(0, 0, 0);
_pstu = new Book(_name, _data, false, 0);//新入库图书默认借出次数为零
this->Book_Array->push_back(_pstu);
i++;
cout << "是否继续录入信息?" << endl;
cout << "Y/y继续录入N/n结束录入" << endl;
while (true) { //非法检测
cin >> flag;
if (flag == 'Y' || flag == 'y' || flag == 'N' || flag == 'n')
{
break;
}
else {
cout << "输入的指令非法!请重新输入!" << endl;
}
}
if (flag == 'Y' || flag == 'y') {
continue;
}
else {
break;
}
}
cout << "成功录入了" << i - 1 << "本书信息!" << endl;
system("pause");
system("cls");
}
void MangerBook::SearchBook()
{
cout << "请输入待查询书籍名称" << endl;
string searchname;
cin >> searchname;
int index;
index = IndexBook(searchname);//寻找在数组中位置
if (index != -1) {
this->Book_Array->at(index)->ShowInfo();
}
system("pause");
system("cls");
}
int MangerBook::IndexBook(string name)//索引函数
{
int ret = -1;
for (int i = 0; i < (int)Book_Array->size(); i++) {
if (this->Book_Array->at(i)->getName() == name) {
ret = i;
break;
}
}
return ret;
}
void MangerBook::SelectBook()
{
cout << "请输入待删除书籍名称" << endl;
string searchname;
cin >> searchname;
int index;
index = IndexBook(searchname);
if (index != -1) {
if (this->Book_Array->at(index)->getStatue() == false) {//书籍不在库则无法删除
this->Book_Array->erase(this->Book_Array->begin() + index);
cout << "删除成功!" << endl;
}
else {
cout << "书籍不在库!,删除失败!" << endl;
}
}
else {
cout << "书籍信息不存在!,删除失败!" << endl;
}
system("pause");
system("cls");
}
void MangerBook::LoanBook()//借出
{
cout << "请输入书籍名称" << endl;
string searchname;
cin >> searchname;
int c_year, c_month, c_day;
int index;
index = IndexBook(searchname);
if (index != -1) {
if (this->Book_Array->at(index)->getStatue() == false) {//书籍不在库则无法借出
cout << "请输入借出日期(年 月 日)" << endl;
cin >> c_year >> c_month >> c_day;
Date c_data(c_year, c_month, c_day);
// 检查还书日期的合法性
if (!LegalDate(c_data)) {
cout << "日期非法,请重新输入!" << endl;
// 添加循环以重复要求有效日期
while (true) {
cout << "请输入借出日期(年 月 日)" << endl;
cin >> c_year >> c_month >> c_day;
c_data = Date(c_year, c_month, c_day);
if (LegalDate(c_data)) {
break;
}
else {
cout << "日期非法,请重新输入!" << endl;
}
}
}
Book* _pstu1 = NULL;
Date _data1(c_year, c_month, c_day);
_pstu1 = new Book(searchname, _data1, true, this->Book_Array->at(index)->getTimes() + 1);
int insertIndex = index; // 要插入的位置(可以根据需求修改)
if (insertIndex >= 0 && insertIndex < (int)this->Book_Array->size()) {
delete this->Book_Array->at(insertIndex); // 删除原来的对象,避免内存泄漏
this->Book_Array->at(insertIndex) = _pstu1; // 插入新的 Book 对象
}
else {
cout << "插入位置无效!" << endl;
}
cout << "借出成功,请妥善保管" << endl;
}
else {
cout << "书籍不在库!,借出失败!" << endl;
}
}
else {
cout << "书籍信息不存在!,借出失败!" << endl;
}
system("pause");
system("cls");
}
bool isLeapyear(int year)//判断是否是闰年
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
return false;
}
bool MangerBook::LegalDate(const Date& date) //检测日期合法性
{
int y = date.getYear();
int m = date.getMonth();
int d = date.getDay();
bool ret = true;
if (m > 12 || m < 1)
ret = false;
else if (((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12)) && d > 31)
ret = false;
else if (((m == 4) || (m == 6) || (m == 9) || (m == 11)) && d > 30)
ret = false;
if (isLeapyear(y) && m == 2 && d > 29)
ret = false;
else if (!isLeapyear(y) && m == 2 && d > 28)
ret = false;
return ret;
}
int diffDay(int year1, int year2, int month2, int day2)//计算相差多少年转化为天,即总天数差
{
int ans = 0;
if (year1 == year2)
return 0;
else if (year1 > year2)
return -1e6;
int cntyear = abs(year2 - year1);
for (int i = 0; i < cntyear; i++) {
ans += 365;
}
for (int i = min(year1, year2); i <= max(year1, year2); i++) {
if (isLeapyear(i)) {
ans++;
}
}
if (isLeapyear(year2) && ((month2 < 2) || (month2 == 2 && day2 < 29)))
ans--;
return ans;
}
int Daytoend(int y, int m, int d) //计算到年底的天数
{
int tm = 0, tEY = 0;
int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (isLeapyear(y))
month[1] = 29;
for (m -= 1; m <= 11; m++)
tm += month[m];
tEY = tm - d;
return tEY;
}
int MangerBook::CntDay(const Date& date1, const Date& date2)//计算相差多少天
{
int cntday1 = diffDay(date1.getYear(), date2.getYear(), date2.getMonth(), date2.getDay());
int cnt_day_end1 = Daytoend(date1.getYear(), date1.getMonth(), date1.getDay());
int cnt_day_end2 = Daytoend(date2.getYear(), date2.getMonth(), date2.getDay());
int CalculateDateDifference = cntday1 + cnt_day_end1 - cnt_day_end2;
//用总天数差加上两个日期到当年年底天数之差即为结果
return CalculateDateDifference;
}
void MangerBook::ReturnkBook()//归还书籍
{
cout << "请输入归还书籍名称" << endl;
string searchname;
cin >> searchname;
int r_year;
int r_month;
int r_day;
int index;
index = IndexBook(searchname);
if (index != -1) {
if (this->Book_Array->at(index)->getStatue() == true) {
cout << "请输入归还日期(年 月 日)" << endl;
cin >> r_year >> r_month >> r_day;
Date r_data(r_year, r_month, r_day);
// 检查还书日期的合法性
if (!LegalDate(r_data)) {
cout << "日期非法,请重新输入!" << endl;
// 添加循环以重复要求有效日期
while (true) {
cout << "请输入归还日期(年 月 日)" << endl;
cin >> r_year >> r_month >> r_day;
r_data = Date(r_year, r_month, r_day);
if (LegalDate(r_data)) {
break;
}
else {
cout << "日期非法,请重新输入!" << endl;
}
}
}
// 计算租借天数
int chargeDay = CntDay(this->Book_Array->at(index)->getDate(), r_data);
while (chargeDay < 0) {
cout << "日期非法,请重新输入!" << endl;
cout << "请输入归还日期(年 月 日)" << endl;
cin >> r_year >> r_month >> r_day;
r_data = Date(r_year, r_month, r_day);
chargeDay = CntDay(this->Book_Array->at(index)->getDate(), r_data);
}
//
this->Book_Array->at(index)->outTurnin();
double charge = chargeDay * 0.1;
this->Book_Array->at(index)->Show_LoanTime();
cout << "借出" << chargeDay << "日租1角" << "共需支付" << charge << "" << endl;
cout << "归还成功,谢谢使用!" << endl;
}
else {
cout << "已归还,请勿重复归还!" << endl;
}
}
else {
cout << "书籍信息不存在!,归还失败!" << endl;
}
system("pause");
system("cls");
}
MangerBook::~MangerBook()//析构函数
{
//dtor
if (this->Book_Array) {
this->Book_Array->clear();
delete[] this->Book_Array;
this->Book_Array = NULL;//删除后,让对象指针指向空
}
}