📄 reader.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 + -