1.book.cpp
/*
本文件实现book类的各个函数,包括显示图书信息函数,设置图书各私有变量的函数,
获得所有私有变量的函数
*/
#include<iostream>
#include"book.h"
using namespace std;
void book::show()
{
cout << "图书名为:" << name << endl;
cout << "图书编号为:" << code << endl;
cout << "图书作者名为:" << author << endl;
cout << "图书出版日期为:" << time << endl;
cout << "图书价格为:" << price << endl;
cout << "图书可借日期数为:" << lend_time << endl;
cout << "图书是否可借:";
if (available == true)
cout << "可借" << endl;
else if (available == false)
cout << "不可借" << endl;
return;
}
void book::set_name(string n)
{ this->name = n; }
void book::set_code(string c)
{ this->code = c; }
void book::set_author(string a)
{ this->author = a; }
void book::set_price(float p)
{ this->price = p; }
void book::set_lend_time(int le)
{ this->lend_time = le; }
void book::set_time(string t)
{ this->time = t; }
void book::lend_or_return(bool mode)
{ this->available = mode; }
string book::get_name()
{ return this->name; }
string book::get_code()
{ return this->code; }
string book::get_author()
{ return this->author; }
string book::get_time()
{ return this->time; }
bool book::get_available()
{ return this->available; }
float book::get_price()
{ return this->price; }
int book::get_lendtime()
{ return this->lend_time; }
istream &operator >> (istream& stream, book& b)
{
cout << "请输入书名:";
stream >> b.name;
cout << "请输入书籍编号:";
stream >> b.code;
cout << "请输入作者名:";
stream >> b.author;
cout << "请输入出版时间:";
stream >> b.time;
cout << "请输入价格:";
stream >> b.price;
cout << "请输入可借时间长度:";
stream >> b.lend_time;
b.available = 1; //新书可借
return stream;
}
ostream &operator << (ostream& stream, book& b)
{
stream << "--------------------------------------------------------------------" << endl
<< "书名:" << b.name << endl
<< "书籍编号:" << b.code << endl
<< "作者名:" << b.author << endl
<< "出版时间:" << b.time << endl
<< "价格:" << b.price << endl
<< "当前是否可借(1为可借,0为不可借):" << b.available << endl
<< "可借时间长度" << b.lend_time << endl
<< "***********************************************************************" << endl;
return stream;
}
2.CatchTime.cpp
#include"CatchTime.h"
string CatchTime()
{
time_t t;
time(&t);
struct tm lt;
localtime_s(<, &t);//转为时间结构。
char date[60] = { 0 };
sprintf_s(date, "%d-%02d-%02d %02d:%02d:%02d",
(int)lt.tm_year + 1900, (int)lt.tm_mon + 1, (int)lt.tm_mday,
(int)lt.tm_hour, (int)lt.tm_min, (int)lt.tm_sec);
return string(date);
}
3.Librarian.cpp
#include<iostream>
#include<fstream>//控制文件读取
#include<vector>
#include"Librarian.h"
#include"book.h"
Librarian_user::Librarian_user(string name, int account, string password, User* pu)
{
//处理本对象以及User数组
this->name = name;
this->account = account;
this->password = password;
pu[User::User_num].change_name(name);
pu[User::User_num].change_account(account);
pu[User::User_num].change_mode(Librarian);
pu[User::User_num].set_pass(password);
User::User_num++;
}
//添加图书
void Librarian_user::Add_book(book* B)
{
cout << "开始增加图书:" << endl;
string order;
while (true)
{
cin >> B[book::book_num]; //接下来调用book类的友元函数operator >>,读取新书的信息
ofstream book_info("book_info.txt", ios::app); //以追加模式打开这个txt文件
if (book_info.is_open())
{
book_info << CatchTime(); //记录当前操作时间到txt文件。
book_info << "操作为:增加图书。"<<endl;
book_info << B[book::book_num] << endl; //这样,新的图书对象的信息就流到book_info中了
book_info.close(); //关闭文件
}
book::book_num++; //图书数量+1
cout << "新的图书添加成功!" << endl;
order = cin.get(); //要先把输入的换行处理掉?
cout << "请按任意键继续添加图书(或者按‘0’以退出):" << endl;
order = cin.get();
if (order == "0") break; //退出循环的条件
}
return;
}
//删除图书
void Librarian_user::Delete_book(book* B)
{
cout << "开始删除图书:" << endl;
string bookname; //需要删除的图书名
int booknumber = -1; //该图书在图书数组中的编号
bool flag = false; //判断该图书是否存在
string d;
if (book::book_num == 0)
{
cout << "当前图书数量为0,请添加图书后再进行删除!" << endl;
return;
}
else
{
cout << "请输入书名:" << endl;
cin >> bookname;
for (int i = 0; i < book::book_num; i++)
{
if (bookname == B[i].get_name())
{
flag = true;
booknumber = i;
break;
}
}
if (flag == true) //如果已经找到该图书
{
cout << "该图书存在,图书信息为:" << endl;
B[booknumber].show();
cout << "是否确认删除该图书(y or n):" << endl;
cin >> d;
if (d == "y")
{
ofstream book_info("book_info.txt", ios::app); //以追加模式打开这个txt文件
if (book_info.is_open())
{
book_info << CatchTime(); //记录当前操作时间到txt文件。
book_info << "操作为:删除图书。" << endl;
book_info << B[booknumber] << endl; //这样,删除图书对象的信息就流到book_info中了
book_info.close(); //关闭文件
}
for (int k = booknumber; k <= book::book_num - 1; k++)//删除操作需要将后面所有书的位置提前一个单位
{
B[k] = B[k + 1];
}
book::book_num--;
cout << "删除图书成功!" << endl;
}
else if (d == "n")
{
cout << "您取消了删除图书的操作。" << endl;
}
else
cout << "您输入的不是合适的命令!" << endl;
}
else
{
cout << "图书馆目前并没有这本书。" << endl;
}
}
}
//修改图书
void Librarian_user::Change_book(book* B)
{
string bookname; //需要删除的图书名
int booknumber = -1; //该图书在图书数组中的编号
bool flag = false; //判断该图书是否存在
string d; //确认修改的命令
int which; //修改书的哪一项
string new_info; //用来修改书的name, code, author, time
float new_price=20; //用来修改书的价格
int new_lend_time = 20;
cout << "开始修改图书信息:" << endl;
if (book::book_num == 0)
{
cout << "当前图书数量为0,请添加图书后再进行修改!" << endl;
return;
}
else
{
cout << "请输入书名:" << endl;
cin >> bookname;
for (int i = 0; i < book::book_num; i++)
{
if (bookname == B[i].get_name())
{
flag = true;
booknumber = i;
break;
}
}
if (flag == true) //如果已经找到该图书
{
cout << "该图书存在,图书信息为:" << endl;
B[booknumber].show();
cout << "是否确认修改该图书(y or n):" << endl;
cin >> d;
if (d == "y")
{
cout << "请输入修改的内容:" << endl;
cout << "0为书名;" << endl;
cout << "1为书编号;" << endl;
cout << "2为书作者;" << endl;
cout << "3为书出版时间;" << endl;
cout << "4为书价格;" << endl;
cout << "5为书可外借时间;" << endl;
cin >> which;
switch (which)
{
case 0:
cout << "请输入新的书名:";
cin >> new_info;
B[booknumber].set_name(new_info);
break;
case 1:
cout << "请输入新的书编号:";
cin >> new_info;
B[booknumber].set_code(new_info);
break;
case 2:
cout << "请输入新的书作者:";
cin >> new_info;
B[booknumber].set_author(new_info);
break;
case 3:
cout << "请输入新的书出版时间:";
cin >> new_info;
B[booknumber].set_time(new_info);
break;
case 4:
cout << "请输入新的书价格:";
cin >> new_price;
B[booknumber].set_price(new_price);
break;
case 5:
cout << "请输入新的书可借阅时间:";
cin >> new_lend_time;
B[booknumber].set_lend_time(new_lend_time);
break;
default:
cout << "您输入的信息有误!" << endl;
break;
}
ofstream book_info("book_info.txt", ios::app); //以追加模式打开这个txt文件
if (book_info.is_open())
{
book_info << CatchTime(); //记录当前操作时间到txt文件。
book_info << "操作为:修改图书。" << endl;
book_info << B[booknumber] << endl; //这样,删除图书对象的信息就流到book_info中了
book_info.close(); //关闭文件
}
}
else if (d == "n")
{
cout << "您选择了取消图书修改操作." << endl;
}
else
{
cout << "您输入的不是合适的命令!" << endl;
}
}
else
{
cout << "图书馆没有这本书!" << endl;
}
}
}
//查找图书,我们支持通过编号或者书名查找
void Librarian_user::Find_book(book* B)
{
string info;
vector<int> bianhao;
bool flag = false; //判断是否有这本书
int count = 0; //这本书可能不止一本
cout << "开始查询图书信息。" << endl;
if (book::book_num == 0)
{
cout << "当前图书数量为0,请添加图书后再进行修改!" << endl;
return;
}
else
{
cout << "请输入图书的书名或者编号:" << endl;
cin >> info;
for (int i = 0; i < book::book_num; i++)
{
if (info == B[i].get_name() || info==B[i].get_code())
{
flag = true;
bianhao.push_back(i);
count++;
}
}
if (count == 0)
{
cout << "没有这本书" << endl;
}
else
{
cout << "共找到" << count << "本书。" << endl;
cout << "图书信息为:" << endl;
for (int i = 0; i < count; i++)
{
cout << B[bianhao[i]];
}
}
}
}
//统计所有图书
void Librarian_user::Addup_book(book* B)
{
cout << "现在的图书数量为:" << book::book_num<<endl;
cout << "下面是所有图书的信息:" << endl;
for (int i=0; i < book::book_num; i++)
{
cout << B[i];
}
return;
}
4.main.cpp
//我们需要提供一个程序入口界面
//还有很多其他的界面,为:注册界面,登陆界面,图书馆理员操作界面,读者操作界面,
//主要就是这5个界面之间相互调用
#include<iostream>
#include"user.h"
#include"book.h"
#include"Librarian.h"
#include<Windows.h>
#include<sstream>
#include<vector>
#include"Reader.h"
using namespace std;
//定义一些全局变量
User us[100];
Reader_user ru[100]{ Reader_user("小刚", 103, "103", us), Reader_user("小强", 104, "104", us) };
Librarian_user lu[100]{ Librarian_user("小明", 101, "101", us), Librarian_user("小红", 102,"102", us) };
Log mylog; //用来进行登陆的
int book::book_num = 0;
int User::User_num = 0;
int Librarian_user::Librarian_num = 2;
int Reader_user::Reader_num = 2;
//从txt文件中读取图书信息并初始化到B中
void initial_books(book* B)
{
//SetConsoleOutputCP(65001);
ifstream in("books.txt");
string line;
string line_info, input_result;
float b_p;
int b_le;
bool b_a;
if (in) // 有该文件
{
while (getline(in, line)) // line中不包括每行的换行符
{
stringstream input(line);
input >> input_result;
B[book::book_num].set_name(input_result);
input >> input_result;
B[book::book_num].set_code(input_result);
input >> input_result;
B[book::book_num].set_author(input_result);
input >> input_result;
B[book::book_num].set_time(input_result);
input >> b_p;
B[book::book_num].set_price(b_p);
input >> b_le;
B[book::book_num].set_lend_time(b_le);
input >> b_a;
B[book::book_num].lend_or_return(b_a);
book::book_num++;
}
}
else // 没有该文件
{
cout << "no such file" << endl;
}
}
//将图书信息重新写入txt文件中
void summary_books(book* B)
{
ofstream out("books.txt");
out.clear();
for (int i = 0; i < book::book_num; i++)
{
out << B[i].get_name() << " "
<< B[i].get_code() << " "
<< B[i].get_author() << " "
<< B[i].get_time() << " "
<< B[i].get_price() << " "
<< B[i].get_lendtime() << " "
<< 1 << endl; //下次运行程序时,都可借
}
out.close();
}
//注册的界面
void zhuce(book* B)
{
cout << "-----------------------------------------------------------------------" << endl;
cout << "进入读者注册页面" << endl;
ru[Reader_user::Reader_num].zc(us, mylog, ru);
return;
}
//登陆的界面
void denglu(book* B)
{
cout << "-----------------------------------------------------------------------" << endl;
cout << "进入登陆页面" << endl;
mylog.login(us);
if (mylog.Log_success == 1)
{
if (mylog.us.get_mode() == Reader) //如果是读者登陆
{
int mode;
while (true)
{
cout << "请输入要操作的模式:" << endl;
cout << "0为借阅图书;" << endl;
cout << "1为归还图书;" << endl;
cout << "2为查询已经借了的图书;" << endl;
cout << "3为查询所有图书;" << endl;
cout << "4为退出登陆。" << endl;
cin >> mode;
switch (mode)
{
case 0:
ru[mylog.number].lend_book(B);
break;
case 1:
ru[mylog.number].return_book(B);
break;
case 2:
ru[mylog.number].lend_show();
break;
case 3:
ru[mylog.number].book_show(B);
break;
case 4:
return;
break;
default:
cout << "您输入的命令不对,请重新输入!" << endl;
break;
}
}
}
else if (mylog.us.get_mode() == Librarian)
{
int mode;
int doit = 1;
while (doit)
{
cout << "请输入要操作的模式:" << endl;
cout << "0为添加图书;" << endl;
cout << "1为删除图书;" << endl;
cout << "2为修改图书;" << endl;
cout << "3为查询图书;" << endl;
cout << "4为统计所有图书。" << endl;
cout << "5为退出登陆。" << endl;
cin >> mode;
switch (mode)
{
case 0:
lu[mylog.number].Add_book(B);
break;
case 1:
lu[mylog.number].Delete_book(B);
break;
case 2:
lu[mylog.number].Change_book(B);
break;
case 3:
lu[mylog.number].Find_book(B);
break;
case 4:
lu[mylog.number].Addup_book(B);
break;
case 5:
doit = 0;
break;
default:
cout << "您输入的命令不对!" << endl;
break;
}
}
}
}
}
//入口界面
void rukou(book* B)
{
cout << User::User_num << endl;
cout << "-------------------------------------------------------------------" << endl;
cout << "*****************欢迎进入图书管理系统!****************************" << endl;
cout << "您当前可以进行的操作为:" << endl;
cout << "注册(输入0)" << endl;
cout << "登陆(输入1)" << endl;
cout << "退出(输入2)" << endl;
cout << "-------------------------------------------------------------------" << endl;
cout << endl;
int mode;
cin >> mode;
switch (mode)
{
case 0:
zhuce(B); //注册后,可能会进行相应人员的操作
rukou(B); //不过应该还是能退回到入口界面
break;
case 1:
denglu(B); //登陆后,可能会进行相应人员的操作
rukou(B); //不过应该还是能退回到入口界面
break;
case 2:
return;
break; //这里就直接退出程序了
default:
cout << "您输入的信息有误,请重新输入!" << endl;
rukou(B);
break;
}
}
int main()
{
book B[100];
initial_books(B);
SetConsoleOutputCP(936);
rukou(B);
//最后将所有图书信息写入books.txt,以便下次打开程序时直接录入
summary_books(B);
//system("pause");
return 0;
}
6.User.cpp
/*
这个文件实现User类的功能函数
*/
#include<iostream>
#include"user.h"
User::User(string name, int account, string password, User_mode mode)
{
this->name = name;
this->account = account;
this->password = password;
this->mode = mode;
cout << "创建账号成功!" << endl;
}
User::~User()
{}
void User::show()
{
cout << "您的姓名是:"<<this->name << endl;
cout << "您的账号是:"<<this->account << endl;
cout << "您的用户模式是:" << endl;
switch (this->mode)
{
case(Librarian):
cout << "**********图书管理员**********" << endl;
break;
case(Reader):
cout << "**********读者**********" << endl;
break;
default:
cout << "**********没有这种用户类型!**********" << endl;
}
}
void User::set_pass(string password)
{
this->password = password;
return;
}
void User::change_pass()
{
while (true)
{
string old_pass, new_pass;
cout << "请输入您当前的密码:" << endl;
cin >> old_pass;
if (old_pass == this->password)
{
cout << "请输入新的密码:" << endl;
cin >> new_pass;
break;
}
else
{
cout << "您输入的密码不对,请重新输入!" << endl;
}
}
return;
}
void User::change_name(string name)
{
this->name = name;
return;
}
void User::change_mode(User_mode mode)
{
this->mode = mode;
return;
}
void User::change_account(int a)
{
this->account = a;
return;
}
string User::get_name()
{
return this->name;
}
User_mode User::get_mode()
{
return this->mode;
}
int User::get_account()
{
return this->account;
}
string User::get_password()
{
return this->password;
}