⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reader.h

📁 小型图书管理系统
💻 H
字号:
#include "Book.h"

const int MRN=104;
static int RN=1;//静态读者编号
const int MBor=5;//每次最大借阅量
const int MDes=5;//最多预定图书数目


class Book;

class Reader
{
private:
	//读者存储结构
	Book B;
	int bAdd;//临时保存读者选定图书的物理地址
	int eb;//记录书库是否为空
	int rNum[MRN];
	char rName[MRN][20];
	int brNum[MRN][MBor]; //当前借阅图书编号,初始值为-1
	int deNum[MRN][MDes]; //记录当前预借图书书号 初始值为-1
	int rtop;
	int Irtop;

	//读者用户名索引结构,便于读者快速登陆
	char IrName[MRN][20];
	int IrAdd[MRN];
public:
	Reader();//读者构造函数(读取书库与读者文件)
	~Reader();
	int IsEmpty();
	int CheckR(int bnum,int rn);//还书核实返回-1错误 返回i可以还书 返回-2该读者还未借书
    int CheckD(int bnum,int rn);//取消预借核实返回-1错误 返回i可以取消 返回-2该读者还未预借
	void ReadReader();//读取读者信息

//********************************管理员对读者操作函数**********************************
	void CleanReader();  //清空读者信息

//***********************************读者自身操作函数***********************************

	void ViewReader(int num);//读者查看自身信息(这里num为主函数中记录的读者物理地址)
	int AddReader(char rname[]);//添加读者(读者注册)返回新建读者编
	int Login(char rname[]);   //读者登陆函数,返回值为读者编号
	
//************************************读者对图书操作函数*********************************
    int BorBooks(int rn);//借书函数
	int DestineBooks(int rn);//预借图书
	int ReturnBooks(int bnum,int rn);//还书函数
	int DesRBooks(int bnum,int rn);//取消预借
	//图书检索函数
	int FindName(char bname[]);  //书名 
	int FindWriter(char bwriter[]);//作者
};

////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////Reader.cpp



Reader::Reader()
{
	int i;
	//初始化
	rtop =-1;
	Irtop =-1;
	bAdd=-1;
	for(i=0; i<MRN; i++)
	{
		rNum[i]=-1;
		rName[i][0]='\0';
		IrAdd[i]=-1; 
		IrName[i][0] ='\0';
		for(int j=0; j<MBor; j++)
		{
			brNum[i][j] =-1;
			deNum[i][j] =-1;
		}
	}
}


void Reader::ReadReader()
{
	int i,j,k;
	B.ReadBook();//调用读取图书文件函数


	//读者结构读取
	i=0;
	ifstream rfile("Reader.txt",ios::in);
	rfile >>rtop >>RN;
	while(!rfile.eof())
	{
		rfile >>rNum[i] >>rName[i] ;
		for(j=0; j<MBor; j++)
			rfile >>brNum[i][j];
		i++;
	}
	rfile.close();
	
	//读者索引读取
	
	ifstream irfile("IndexReader.txt",ios::in);
	while(!irfile.eof())
	{
		irfile >>k;
		irfile >>IrName[k];
		irfile >>IrAdd[k];
		
	}
	irfile.close();
}

//检查空
int Reader::IsEmpty()
{
	if(rtop!=-1) 
		return 1;
	else 
		return 0;
}



int Reader::CheckR(int bnum,int rn)
{
	int temp=0;//记录当前读者所借图书数量
	for(int i=0;i<MBor;i++)
	{
		if(brNum[rn][i]!=-1)
			temp++;
	}
	if(temp!=0)
	{
		for(int i=0; i<MBor; i++)
		{
			if(brNum[rn][i] ==bnum)
			{
				return i;
			}
		}
		return -1;
	}
	else return -2;
}


int Reader::CheckD(int bnum,int rn)
{
	int temp=0;//记录当前读者所借图书数量
	for(int i=0;i<MDes;i++)
	{
		if(deNum[rn][i]!=-1)
			temp++;
	}
	if(temp!=0)
	{
		for(int i=0; i<MDes; i++)
		{
			if(deNum[rn][i] ==bnum)
			{
				return i;
			}
		}
		return -1;
	}
	else return -2;
}


Reader::~Reader()
{
	int i,j;
	//读者结构保存
	ofstream rfout("Reader.txt",ios::out);
	rfout <<rtop <<" " <<RN <<" ";
	for ( i=0; i<=rtop; i++)
	{
		rfout <<rNum[i] <<" "
			<<rName[i] <<" ";
		for(j=0; j<MBor; j++)
			rfout <<brNum[i][j] <<" ";
	}
	rfout.close();
	
	//读者索引保存
	ofstream irfout("IndexReader.txt",ios::out);
	for ( i=0; i<MRN; i++)
	{
		if(IrName[i][0]!='\0')
		{
			irfout <<i <<" "
				<<IrName[i] <<" "
				<<IrAdd[i] <<" ";
		}
	}
	irfout.close();
	B.~Book();
}

//*************************************************************************管理员操作函数

//清空读者信息
void Reader::CleanReader()
{
	RN=1;
	rtop =-1;
	Irtop =-1;
	for(int i=0; i<MRN; i++)
	{
		IrAdd[i]=-1; 
		IrName[i][0] ='\0';
		for(int j=0; j<MBor; j++)
		{
			brNum[i][j] =-1;
		}
	}
}



//************************************************************************读者自身操作函数


//读者查看自身信息
void Reader::ViewReader(int num)
{
	int j;
	if(rNum[num]!=-1)
	{
		cout<<"编号:"<<rNum[num]<<"\t"
			<<"用户名:"<<rName[num]<<"\t"<<endl;
		cout<<"以下为您已借阅的图书信息~~~\n"
			<<"序号"<<"\t"
			<<"书名"<<"\t\t"
			<<"作者"<<"\t\t"
			<<"剩余量"<<"\t"
			<<"总量"<<endl;
		cout<<"-------------------------------------------------------------------"<<endl;
		for( j=0;j<MBor;j++)
		{
			if(brNum[num][j]!=-1)       //读者借书编号初始值为-1	
				B.ViewOne(brNum[num][j]);
		}
		cout<<endl;
		cout<<"********************************************************************"<<endl;
		cout<<endl;
		cout<<"以下为您已预借的图书信息~~~\n"
			<<"序号"<<"\t"
			<<"书名"<<"\t"
			<<"作者"<<"\t"
			<<"剩余量"<<"\t"
			<<"总量"<<endl;
		cout<<"-------------------------------------------------------------------"<<endl;
		for( j=0;j<MDes;j++)
		{
			if(deNum[num][j]!=-1)       //读者借书编号初始值为-1	
				B.ViewOne(deNum[num][j]);
		}
	}
	else
		cout<<"不存在指定编号的读者信息"<<endl;
}


//读者登陆函数
int Reader::Login(char rname[]) //-1无该读者 其他_为该读者编号
{
	int h=4*(rname[0] -'a');
	while(IrName[h][0]!= '\0')
	{
		if(strcmp(IrName[h],rname) ==0)
		{
			return IrAdd[h];
		}
		h++;
		if(h>103) h=h-104;
	}
	return -1;
}

//读者注册
int Reader::AddReader(char rname[])
{
	rtop++;
	strcpy(rName[rtop],rname);
	//系统分配读者号
	rNum[rtop] =RN++;
	
	//建立读者姓名散列
	int h=B.H(rname);
	while(IrName[h][0]!='\0')
	{
		h++;
		if(h>103) h=h-104;
	}
	strcpy(IrName[h],rname);
	IrAdd[h] =rtop;
	return rNum[rtop];
}


//***********************************************************************读者检索图书函数

int Reader::FindName(char bname[])//返回-1则不进行其他操作,其他为要进行操作的图书物理地址
{
	eb=B.IsEmpty();
	if(eb==1)
	{
		B.FiEmpty();
		bAdd=B.FindName(bname,1);
		return bAdd;
	}
	else
	{
		cout<<"书库为空"<<endl;
		return -1;
	}
}


int Reader::FindWriter(char bwriter[])//返回-1则不进行其他操作,其他为要进行操作的图书物理地址
{
	eb=B.IsEmpty();
	if(eb==1)
	{
		B.FiEmpty();
		bAdd=B.FindWriter(bwriter,1);
		return bAdd;
	}
	else
	{
		cout<<"书库为空"<<endl;
		return -1;
	}
}


//*********************************************************************************借还书操作

//借书
int Reader::BorBooks(int rn) //返回1为借阅成功  0为借阅量满  -1为此类书无库存
{
	int temp;
	for(int j=0; j<MBor; j++)
	{
		if(brNum[rn][j]==-1)
		{
			temp=B.BorBook(bAdd);
			if(temp!=0)
			{
				brNum[rn][j]=temp; //读者rn 借书编号添加
				return 1;
			}
			else
				return -1;
		}
	}
	return 0;
}

//预借
int Reader::DestineBooks(int rn) //返回1为预借阅成功  0为预借阅量满  -1为此类书无库存
{
	int temp;
	for(int j=0; j<MDes; j++)
	{
		if(deNum[rn][j]==-1)
		{
			temp=B.DesBook(bAdd);
			if(temp!=0)
			{
				deNum[rn][j]=temp; //读者rn 借书编号添加
				return 1;
			}
			else
				return -1;
		}
	}
	return 0;
}


//还书
int Reader::ReturnBooks(int bnum,int rn)//返回-1操作错误  -2当前借书量为空,返回1还书成功
{
	int n=CheckR(bnum,rn);
	if(n==-1)
		return -1;
	else if(n==-2) 
		return -2;
	else
	{
		brNum[rn][n]=-1;
		B.ReturnBook(bnum);
		return 1;
	}
}

//取消预定
int Reader::DesRBooks(int bnum,int rn)//返回-1操作错误  -2当前预借量为空,取消成功1
{
	int n=CheckD(bnum,rn);
	if(n==-1)
		return -1;
	else if(n==-2) 
		return -2;
	else
	{
		deNum[rn][n]=-1;
		B.ReturnBook(bnum);
		return 1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -