基于c++的简单图书管理系统

大一老师教的一个小例子

#include<iostream>//标准输入输出头文件
#include<string>//字符串头文件
#include<fstream>//文件头文件
#include <conio.h>//“通用输入输出库”,主要是文件和标准控制台的输入输出。
using namespace std;
const int BMAX=50;//书最多个数
//图书类
class book
{
public:
	int no;//图书编号
	char name[20];//图书名称
	int b_flag;//1在架,2借出
	int b_del;//1存在,2删除
public:
	book(){}//无参构造函数
	void setno(int n)//设置图书编号
	{
		no=n;//图书编号取值
	}
	int getno()//返回图书编号值
	{
		return no;
	}
	void setname(char na[])//设置图书名称
	{
		strcpy(name,na);//字符串赋值
	}
	char *getname()//返回图书名称
	{
		return name;
	}
	void borbook()
	{
		b_flag=2;//借书标志
	}
	void delbook()
	{
		b_del=2;//删除标志
	}
	void addbook(int no,char na[])//增加图书功能
	{
		setno(no);
		setname(na);
		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];
		cout<<"请输入书号:";
		cin>>no;
		cout<<endl<<"请输入书名:";
		cin>>bname;
		cout<<endl;
		bk.b_flag=1;//上架图书
		bk.addbook(no,bname);
		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<<"图书状态:"<<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<<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;//读者账号
	char name[20];//姓名
	int r_del;//1存在,2删除
	int r_bor;//1借过书,2没有借书
	book brbook;
public:
	void addreader(int id,char na[])//添加读者
	{
		no=id;
		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;
		char rname[20];
		cout<<"请输入学号:";
		cin>>no;
		cout<<endl<<"请输入姓名:";
		cin>>rname;
		cout<<endl;
		rd.addreader(no,rname);
		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 bookjiemian()
{
	cout<<"|----------------------------|"<<endl;
	cout<<"|        图 书 维 护         |"<<endl;
	cout<<"|        (1)增 加            |"<<endl;
	cout<<"|        (2)更 改            |"<<endl;
	cout<<"|        (3)删 除            |"<<endl;
	cout<<"|        (4)查 找            |"<<endl;
	cout<<"|        (5)显 示            |"<<endl;
	cout<<"|        (6)返回上一级       |"<<endl;
	cout<<"|----------------------------|"<<endl;
}
//读者维护子菜单
void readjiemian()
{
	cout<<"|----------------------------|"<<endl;
	cout<<"|        读 者 维 护         |"<<endl;
	cout<<"|        (1)增 加            |"<<endl;
	cout<<"|        (2)更 改            |"<<endl;
	cout<<"|        (3)删 除            |"<<endl;
	cout<<"|        (4)查 找            |"<<endl;
	cout<<"|        (5)显 示            |"<<endl;
	cout<<"|        (6)返回上一级       |"<<endl;
	cout<<"|----------------------------|"<<endl;
}

//借书还书函数,参数br判断是借书还是还书
void borrowtotreturn(char br)
{
	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
	{
		bookjiemian();
		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 readerssmange()
{
	char in;
	rdatabase bd;
	do
	{
		readjiemian();
		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 ;
}
void mainjiemian()//主界面
{
	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<<"*     (5)退 出               *"<<endl;
	cout<<"*                            *"<<endl;
	cout<<"******************************"<<endl;

}
bool CheckPassWord(string password)/*以"*"输入密码,三次机会*/
{
    bool judge = false;
    int i = 0;
    int times = 1;
    string s;
    char ch;
    char pw[50];
    while(times <= 3)
    {
        i = 0;
        while((ch = _getch()) != '\r')
        {
            if(ch == '\b' && i > 0)//退格
            {
                printf("\b \b");
                i--;
            }
            else
            {
                pw[i++] = ch;
                cout << '*';
            }
        }
        pw[i] = '\0';
        cout << endl;
        if(password.compare(pw) != 0)
        {
            if(times == 3)
                cout << "密码错误,退出!" << endl << endl;
            else
                cout << "密码错误,剩余" << (3-times) << "次机会:";
            times++;
        }
        else
        {
            cout << "密码正确!" << endl << endl;
            judge = true;
            return judge;
        }
    }
    if(times == 4)
        return judge;
    return judge;
}

int main()
{

	string password = "luo123"; //原始密码
    cout << "输入6位查询密码(luo123):";
    if(CheckPassWord(password)!=true)
	//	return 0;
	return 1;
	char in;
	bdatabase bd;
	do
	{
		mainjiemian();//进入界面
		cin>>in;
		switch(in)
		{
		case '1':
			borrowtotreturn(in);
			break;
		case '2':
			borrowtotreturn(in);
			break;
		case '3':
			booksmange();
			break;
		case '4':
			readerssmange();
			break;
		default:
			cout<<"输入错误,请重新输入!"<<endl;
		}
	}while(in!='0');
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值