C++大作业源文件(1)

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(&lt, &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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值