C++实现图书管理系统(作业报告)

任务内容:
根据在寒假第一阶段学习的C语言指针,结构体,链表,文件操作等相关内容,自主完成一个图书管理系。

要求:
1.能够输入输出图书的书名,书号,类型,作者等相关内容。
2.能够对书目进行增添,删除,修改图书信息的操作。
3.能够实现对图书的借出归还的管理,包括记录图书借出归还的日期,借书人姓名等。(可能会有一定的困难,但尽力去完成,会学到很多东西)。

#include<bits/stdc++.h>
using namespace std;
const int BMAX = 50;   //书最多个数
/*
* 	@author 芳芳
*	@goal 图书管理系统
*	@requires 
*	1.能够输入输出图书的书名,书号,类型,作者等相关内容。
*	2.能够对书目进行增添,删除,修改图书信息的操作。
*	3.能够实现对图书的借出归还的管理,包括记录图书借出归还
* 	的日期,借书人姓名等。*/

//图书管理模块

//图书类
class book{
	public:
		int no;                                      //图书编号
		char name[20];                               //图书名称
		char author[10];                             //作者
		int price;                                   //价格
		int b_flag;                                  //1为在架,2为借出
		int b_del;                                   //1为存在, 2为删除
		public:
	 		book(){}                               //构造函数
	 	void setno(int n){
	  		no = n;                             //图书编号取值
	 	}
	int getno(){
	  	return no;           //返回图书编号值
	 	}
	void setprice(int p){
	  	price = p;                             //图书价格取值
	}
	int getprice(){
	  	return price;           //返回图书价格值
	 	}
	void setname(char na[]){
	  	strcpy(name, na);   //字符串复制
		}
	char* getname(){
	 	 return name;  //返回图书名称
	}
	void setauthor(char a[]){
	 	 strcpy(author, a);   //字符串复制
	 	}
	char* getauthor(){
	  	return author;  //返回图书作者
	 	}
	void borbook(){
	  	b_flag = 2;     //借书标志
	 	}
	void delbook(){
	  	b_del = 2;   //删除标志
		}
	void addbook(int no, char na[], char author[], int price){
	  	setno(no);
	  	setname(na);
	  	setauthor(author);
	  	setprice(price);
	  	b_flag = 1;
	  	b_del = 1;
	}
}; 
//图书数据库类

class bdatabase{
	public:
 		book btarray[BMAX];                                         //图书集合
 		int top;
	public:
 		bdatabase(){
  		book b;
  		top = -1;
  		fstream file("book.txt", ios::in);    //打开文件
  		while (1){
   			file.read((char *)&b, sizeof(b));
   			if (!file) break;
   			top++;
   			btarray[top] = b;
  			}
  		file.close();     //关闭文件
 		}

	~bdatabase(){
  		fstream file("book.txt", ios::out);
  		for (int i = 0; i <= top; i++){
   			if (btarray[i].b_del == 1)
    			file.write((char *)&btarray[i], sizeof(btarray[i]));
				}
  			file.close();
 		}

void addbooks(){
  	book bk;
  	int no;
  	char bname[20];
  	char bau[10];
  	int pr;
  	cout << endl << "请输入书号: ";
  	cin >> no;
  	cout << endl << "请输入书名: ";
  	cin >> bname;
  	cout << endl << "请输入作者: ";
  	cin >> bau;
  	cout << endl << "请输入价格: ";
  	cin >> pr;
  	cout << endl;
  	bk.b_flag = 1;
  	bk.addbook(no, bname, bau, pr);
  	top++;
  	btarray[top] = bk;
  	return;
}
int findbooks(int suffix){      //查找图书,这个函数用于借书这书操作,suffix是数组下标
  	int no;
  	cout << "请输入书号: ";
  	cin >> no;
  	for (int i = 0; i <= top; i++){
   		if (btarray[i].no == no && btarray[i].b_del == 1){
    		return i;
   		}
  	}
  	return -1;
}
int findbooks(){                                //查找图书,这个函数用于图书维护  
  	int no;
	char value[6];
	cout << "请输入书号: ";
	cin >> no;
	for (int i = 0; i <= top; i++){
	   if (btarray[i].no == no && btarray[i].b_del == 1){
	    	if (btarray[i].b_flag == 1) 
				strcpy(value, "在架");
	    	if (btarray[i].b_flag == 2) 
				strcpy(value, "借出");
	    	cout << "书号: " << btarray[i].no << " 书名: " << btarray[i].name << " 作者: " << btarray[i].author << " 价格: " << btarray[i].price << " 图书状态 :" << value << endl;
	    	return i;
	   	}
	}
  return -1;
}
void editbooks(){                                          //编辑图书
	int cur;
	cur = findbooks();
	if (cur == -1){
	   cout << "没有这本书" << endl;
	   return;
	}
	cout << "书号: " << btarray[cur].no << " 书名: " << btarray[cur].name << " 作者: " << btarray[cur].author << " 价格: " << btarray[cur].price << endl;
	cout << "请修改数据:" << endl;
	cout << endl << "书的名称: ";
	cin >> btarray[cur].name;
	return;
	}
void delbooks(){                                             //删除图书	 
	int cur;
	cur = findbooks();
	if (cur == -1){
	   return;
	}
	if (btarray[cur].b_flag == 2){                              //删除时判断图书是否借出	  
	   cout << "该图书已经借出,请在归还后再删除。" << endl;
	   return;
	}
  	btarray[cur].b_del = 2;
  	return;
 }

void listbooks(){                                            //显示全部图书 
  	char value[6];
  	for (int i = 0; i <= top; i++){
   		if (btarray[i].b_del == 1){
    		if (btarray[i].b_flag == 1)
				strcpy(value, "在架");
    		if (btarray[i].b_flag == 2) 
				strcpy(value, "借出");
    		cout << "书号: " << btarray[i].no << " 书的名称: " << btarray[i].name << " 图书状态 :" << value << endl;
   			}
  		}
  return;
 	}
}
;
//读者管理模块
//读者类
class reader{
	public:
 		int no;
 		int sex;     //读者性别,1表示男,0表示女
 		char name[20];
 		int r_del;  //1存在,2删除
 		int r_bor;  //1借过书,2没有借书
 		book brbook;
	public:
 		void addreader(int id, char na[], int s){//增加读者 
  		no = id;
  		sex = s;
  		strcpy(name, na);
  		r_del = 1;
	}
void setbrbook(book bt){  //设置借书标记
  	brbook = bt;
  	}

book getbrbook(){
  	return brbook;   //返回借书信息
	}
};
//读者数据库类
class rdatabase{
	public:
 		reader rdarray[BMAX];
 		int top;

	public:
 		rdatabase(){
  			reader rd;
  			top = -1;
  			fstream file("reader.txt", ios::in); //打开文件
	while (1){
	   	file.read((char *)&rd, sizeof(rd));
	   	if (!file) break;
	   	top++;
	   	rdarray[top] = rd;
	}
		file.close();  //关闭文件  
}

 ~rdatabase(){//析构函数 
  	fstream file("reader.txt", ios::out);
  	for (int i = 0; i <= top; i++){
   		if (rdarray[i].r_del == 1)
   			 file.write((char *)&rdarray[i], sizeof(rdarray[i]));
  	}
  	file.close();
}



void addreaders(){
	reader rd;
	int no;
	int rs;
	char rname[20];
	cout << "请输入学号: ";
	cin >> no;
	cout << endl << "请输入姓名: ";
	cin >> rname;
	cout << endl << "请输入性别(1为男,0为女):";
	cin >> rs;
	cout << endl;
	rd.addreader(no, rname, rs);
	rd.r_bor = 2;
	top++;
	rdarray[top] = rd;
	return;
}
int findreaders(int suffix){     //查找读者,这个函数用于借书还书操作。 参数suffix是数组下标 
  	int no;
  	cout << "请输入学号: ";
  	cin >> no;
  	for (int i = 0; i <= top; i++){
   		if (rdarray[i].no == no && rdarray[i].r_del == 1){
    		return i;
   		}
  	}
  	return -1;
}


int findreaders(){                              //查找读者,这个函数用于读者维护操作 
 	 int no;
  	char value[3];
  	cout << "请输入学号: ";
  	cin >> no;
  	for (int i = 0; i <= top; i++){
   		if (rdarray[i].no == no && rdarray[i].r_del == 1){
    		if (rdarray[i].r_bor == 1) 
				strcpy(value, "借");
    		if (rdarray[i].r_bor == 2) 
				strcpy(value, "无");
    		cout << "学号: " << rdarray[i].no << " 姓名: " << rdarray[i].name << " 是否借书: " << value << endl;
    		return i;
   		}
  	}
 	return -1;
}
void editreaders(){                                            //编辑读者信息
  	int cur;
  	cur = findreaders();
  	if (cur == -1){
   		cout << "没有该学生" << endl;
   		return;
  	}
  	cout << "请修改数据:" << endl;
  	cout << endl << " 姓名: ";
  	cin >> rdarray[cur].name;
  	return;
}
void delreaders(){                            //删除读者,读者如果借书要还书后才能删除 
  	int cur;
  	cur = findreaders();
  	if (cur == -1){
   		return;
  	}
  	if (rdarray[cur].r_bor == 1){
   		cout << "该用户借了图书,请还书后再删除" << endl;
   		return;
  	}
  	rdarray[cur].r_del = 2;
  	return;
}
void listreaders(){                                                 //显示所有读者 
  	char value[3];
  	for (int i = 0; i <= top; i++){
   		if (rdarray[i].r_del == 1){
    	if (rdarray[i].r_bor == 1) 
			strcpy(value, "借");
    	if (rdarray[i].r_bor == 2) 
			strcpy(value, "无");
    	cout << "学号: " << rdarray[i].no << " 姓名: " << rdarray[i].name << " 是否借书: " << value << endl;
   			}
  		}
  		return;
	}
}
;
void book_interface(){                                                     //图书维护子菜单
 	cout << "****************************" << endl;
 	cout << "*         图书维护         *" << endl;
 	cout << "*        (1)增 加          *" << endl;
 	cout << "*        (2)更 改          *" << endl;
 	cout << "*        (3)删 除          *" << endl;
 	cout << "*        (4)查 找          *" << endl;
 	cout << "*        (5)显 示          *" << endl;
 	cout << "*        (6)返回上一层     *" << endl;
 	cout << "****************************" << endl;
 	cout << "请输入对应的数字:";
}
void read_interface()                                                       //读者维护子菜单
{
 	cout << "****************************" << endl;
 	cout << "*         读者维护         *" << endl;
 	cout << "*        (1)增 加          *" << endl;
 	cout << "*        (2)更 改          *" << endl;
 	cout << "*        (3)删 除          *" << endl;
 	cout << "*        (4)查 找          *" << endl;
 	cout << "*        (5)显 示          *" << endl;
 	cout << "*        (6)返回上一层     *" << endl;
 	cout << "****************************" << endl;
 	cout << "请输入对应的数字:";
}

void main_interface(){                                                               //主界面
 	cout << "***********************************************" << endl;
 	cout << "*               图 书 管 理 系 统             *" << endl;
 	cout << "*                                             *" << endl;
 	cout << "*               (1) 借 书                     *" << endl;
 	cout << "*                                             *" << endl;
 	cout << "*               (2) 还 书                     *" << endl;
 	cout << "*                                             *" << endl;
 	cout << "*               (3) 图 书 管 理               *" << endl;
 	cout << "*                                             *" << endl;
 	cout << "*               (4) 用 户 管 理               *" << endl;
 	cout << "*                                             *" << endl;
 	cout << "*               (0) 退 出                     *" << endl;
 	cout << "***********************************************" << endl;
 	cout << "请输入对应的数字:";
}

void borrowtoreturn(char br){
//借书还书函数.参数br用来判断是“借书”还是“还书”.1为“借书”,2为“还书”
 	int rdid = 0;
 	int bkid = 0;
 	int rsuffix, bsuffix;
 	bdatabase t_bd;
 	rdatabase t_rd;
 	if (br == '1'){           //借书 
  		rsuffix = t_rd.findreaders(rdid);
  		bsuffix = t_bd.findbooks(bkid);
  	if (rsuffix == -1 || bsuffix == -1)
   		return;
  	if (t_bd.btarray[bsuffix].b_flag == 2){
   		cout << "图书已经借出,请选择其它图书" << endl;
   	return;
  	}
  	if (t_rd.rdarray[rsuffix].r_bor == 1){
  		cout << "你已经借过图书,请先归还再借其它图书" << endl;
   		return;
  	}
  	t_bd.btarray[bsuffix].b_flag = 2;
  	t_rd.rdarray[rsuffix].r_bor = 1;
  	t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
  	return;
	}
 	if (br == '2'){
  		rsuffix = t_rd.findreaders(rdid);
  		bsuffix = t_bd.findbooks(bkid);
  		if (rsuffix == -1 || bsuffix == -1)
   			return;
  		if (t_rd.rdarray[rsuffix].brbook.no == t_bd.btarray[bsuffix].no){
   			t_bd.btarray[bsuffix].b_flag = 1;
   			t_rd.rdarray[rsuffix].r_bor = 2;
   			t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
  		}else{
   			cout << "请重新输入,读者借的图书号不正确" << endl;
   			return;
		}
 	return;
 	}
}

void booksmange(){
 	char in;
 	bdatabase  bd;
 	do{
  		book_interface();
  		cin >> in;
  		switch (in){
  			case '1':
   				bd.addbooks();
   				break;
  			case '2':
   				bd.editbooks();
   				break;
  			case '3':
   				bd.delbooks();
   				break;
  			case '4':
   				bd.findbooks();
   				break;
  			case '5':
   				bd.listbooks();
   				break;
  			case '6':
   				break;
			default:cout << "输入错误,请重新输入。" << endl;;
  		}
 	} 
	while(in != '6');
 		return;
}

void readersmange(){
 	char in;
 	rdatabase  bd;
 	do{
  		reader();
  		cin >> in;
  		switch (in){
  			case '1':
   				bd.addreaders();
   				break;
  			case '2':
   				bd.editreaders();
   				break;
  			case '3':
   				bd.delreaders();
   				break;
  			case '4':
   				bd.findreaders();
   				break;
  			case '5':
   				bd.listreaders();
   				break;
  			case '6':
   				break;
  			default:cout << "输入错误,请重新输入。" << endl;
  		}
 	} 
	while (in != '6');
 		return;
}


int main(int argc, char* argv[]){
 	char in;
 	do{
  		main_interface();
  		cin >> in;
  		switch (in){
  			case '1':
   				borrowtoreturn(in);
   				break;
  			case '2':
   				borrowtoreturn(in);
   				break;
  			case '3':
   				booksmange();
   				break;
  			case '4':
   				readersmange();
   				break;
  			case '0':
   				break;
  			default:
			  	cout << "输入错误,请重新输入。" << endl;
  		}
 	} 
	while (in != '0');
 		return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值