在社区中有一个小小图书馆,居民可以来阅读或借阅图书,现在要帮助图书管理员管理读者和图书,编写程序完成图书和读者信息的自动管理。
一、目标与要求
要求程序是一个简单的图书馆管理系统,主要完成的工作有:
● 借书
● 还书
● 图书管理
● 读者维护
其中,图书管理和读者维护功能中可以进行日常的数据添加、删除、查找、显示等功能,使日常图书借阅工作能正常进行。读者信息记录在reader.dat文件中,图书信息在book.dat文件中。编程基于字符界面的的控制台应用程序来实现。源代码如下:(略)
系统模块级别结构图
各类的定义及主函数使用的对象
(1)
classBook //图书类
{ private:
intnote; //删除标记(1:已删,0:未删)
intnumber; //图书编号
charname[100]; //书名
intonshelf; //上架标志
intonshelf1;
public:
Book(){}
char*getname(); //获得书名
intgetnote(); //获得删除标记
intgetnumber(); //获得图书编号
voidsetname(char na[]); //设置书名
void delbook(); //删除图书
voidaddbook(int n,char*na); //添加图书
intborrowbook(); //借书操作
voidretbook(); //还书操作
voidlist(); //输出图书
};
(2)
classReader //读者类
{
private:
intnote; //删除标记(1:已删,0:未删)
intnumber; //读者编号
charname[10]; //读者姓名
intborbook[Maxbor]; //所借图书
public:
Reader(){}
char*getname(); //获得姓名
intgetnote(); //获得删除标记
intgetnumber(); //获得读者编括号
voidsetname(char na[]); //设置姓名
voiddelbook(); //设置删除标记
voidaddreader(int n,char*na); //添加读者
voiddelreader();
void borrowbook(int bookid,Book *b); //借书操作
int retbook(int bookid); //还书操作
voidlist(); //输出读者信息
int i;
};
(3)
classRDatabase //读者库类
{
private:
inttop; //读者记录指针
Reader read[Maxr]; //读者记录
public:
RDatabase(); //构造函数初始化:读文件
voidclear(); //删除所有读者信息
intaddreader(int n,char*na); //添加读者记录时,先确定他是否已经存在
Reader *query(intreaderid); //按编括号查找
voidlist(); //输出所有读者信息
voidreaderdata(); //读者库维护
~RDatabase(); //析构函数:写文件
voiddelreader(Reader *r);
};
(4)
classBDatabase //图书库类
{
private:
int top; //图书记录指针
Book book[Maxb]; //图书记录
public:
BDatabase(); //构造函数初始化:读文件
void clear(); //全部删除
int addbook(int n,char *na); //添加图书
Book *query(int bookid); //查找图书
void list(); //输出图书信息
void bookdata(); //图书库维护
~BDatabase(); //析构函数:写文件
void delbook(Book *b);
};
主函数使用的对象:
RDatabaseReaderDB;
BDatabaseBookDB;
Reader *r;
Book *b;
各模块的流程图
借书:
还书:
图书维护:
1.新增
2.更改
3.删除
4.查找
5.显示
6.删除
5.列明完善的程序及注释
1.book.h(图书类)
#ifndef_book_h_
#define_book_h_
#include<iostream>
usingnamespace std;
classBook //图书类
{private:
int note; //删除标记(1:已删,0:未删)
int number; //图书编号
char name[100]; //书名
int onshelf; //上架标志
int onshelf1;
public:
Book(){}
char *getname(); //获得书名
int getnote(); //获得删除标记
int getnumber(); //获得图书编号
void setname(char na[]); //设置书名
void delbook(); //删除图书
void addbook(int n,char *na); //添加图书
int borrowbook(); //借书操作
void retbook(); //还书操作
void list(); //输出图书
};
#endif
2.book.CPP(图书类实现)
#include<iomanip>
#include"book.h"
char*Book::getname() //获得书名
{ returnname;}
intBook::getnote() //获得删除标志
{ returnnote;}
int Book::getnumber() //获得图书编号
{ returnnumber;}
voidBook::setname(char na[])//设置书名
{strcpy_s(name,na);}
voidBook::addbook(int n,char *na)//添加图书
{ note=0;
number=n;
strcpy_s(name,na);
onshelf=1;}//上架
voidBook::delbook()//删除图书
{ note=1;
number=0;
name[0]='\0';
onshelf=0;}//下架
intBook::borrowbook()//结束操作
{
onshelf1=onshelf;
onshelf=0;
return onshelf1;}
void Book::retbook()//还数操作
{ onshelf=1;}
voidBook::list()//输出图书
{ if(onshelf==1)//判断是否上架
cout<<setw(5)<<number<<setw(10)<<name<<setw(10)<<"已上架"<<endl;
else
cout<<setw(5)<<number<<setw(10)<<name<<setw(10)<<"未上架"<<endl;
}
3.reader.h(读者类)
#ifndef_reader_h_
#define_reader_h_
#include<iostream>
#include"book.h"
usingnamespace std;
constint Maxbor=5; //最大借阅量
classReader //读者类
{
private:
int note; //删除标记(1:已删,0:未删)
int number; //读者编号
char name[10]; //读者姓名
int borbook[Maxbor]; //所借图书
public:
Reader(){}
char *getname(); //获得姓名
int getnote(); //获得删除标记
int getnumber(); //获得读者编号
void setname(char na[]); //设置姓名
void delbook(); //设置删除标记
void addreader(int n,char *na); //添加读者
void delreader();
void borrowbook(int bookid,Book *b); //借书操作
int retbook(int bookid); //还书操作
void list(); //输出读者信息
int i;
};
#endif
4.reader.cpp(读者类实现)
#include<iomanip>
#include"reader.h"
//constint Maxbor=5;
#include<iostream> //最大借阅量
char*Reader::getname()//获得姓名
{ returnname;}
intReader::getnote()//获得删除标记
{ returnnote;}
intReader::getnumber()//获得读者编号
{ returnnumber;}
voidReader::setname(char na[])//设置姓名
{strcpy_s(name,na);
}
void Reader::addreader(intn,char *na)//添加读者
{
note=0;
number=n;
strcpy_s(name,na);
for(int i=0;i<Maxbor;i++)
borbook[i]=0;}//借书编号清零
voidReader::delreader()//删除读者
{
note=1;
number=0;
name[0]='\0';
}
voidReader::delbook()//获得删除标记
{ note=1;}
voidReader::borrowbook(int bookid,Book *b)//借书操作
{ for(i=0;i<Maxbor;i++)
{
if(borbook[i]==0)
{borbook[i]=bookid;//获得图书编号
break;}
}
if(i==5)//判断是否超出最大借阅量
{
cout<<"该读者已经超出最大借阅量,不能再借书。"<<endl;
b->retbook();
}
elsecout<<"借书成功。"<<endl;
}
intReader::retbook(int bookid)//还书操作
{
for(inti=0;i<Maxbor;i++)
{
if(borbook[i]==bookid) { borbook[i]=0; return1;}
}
return0;
}
voidReader::list()//输出图书
{
cout<<setw(5)<<number<<setw(10)<<name<<"借书编号:[";
for(int i=0;i<Maxbor;i++)
cout<<borbook[i]<<" ";
cout<<"]"<<endl;}
5.bdatabase.h(图书信息库类)
#ifndef_bdatadase_h_
#define_bdatabase_h_
#include"book.h"
#include<iostream>
usingnamespace std;
constint Maxb=100; //最大图书数量
classBDatabase //图书库类
{
private:
int top; //图书记录指针
Book book[Maxb]; //图书记录
public:
BDatabase(); //构造函数初始化:读文件
void clear(); //全部删除
int addbook(int n,char *na); //添加图书
Book *query(int bookid); //查找图书
void list(); //输出图书信息
void bookdata(); //图书库维护
~BDatabase(); //析构函数:写文件
void delbook(Book *b);
};
#endif
6.bdatabase.cpp(图书信息库类实现)
#include<fstream>
#include<iomanip>
#include<iostream>
#include"bdatabase.h"
usingnamespace std;
BDatabase::BDatabase()//构造函数初始化,读文件
{
Book s;
top=-1;
fstream file;
file.open("book.dat",ios::in|ios::binary);
while(1)
{
file.read((char*)&s,sizeof(s));
if(!file) break;
top++;
book[top]=s;
}
file.close();}
voidBDatabase::clear()//全部删除
{top=-1;}
Book*BDatabase::query(int bookid)//查找图书
{
for(int i=0;i<=top;i++)
if(book[i].getnumber()==bookid&&book[i].getnote()==0)
return&book[i];
return NULL;}
intBDatabase::addbook(int n,char *na)//添加图书
{
Book *p=query(n);
if(p==NULL)
{
top++;
book[top].addbook(n,na);
return1;
}
return 0;}
voidBDatabase::delbook(Book *b)
{
b->delbook();
//top--;
}
voidBDatabase::list()//输出图书信息
{for(int i=0;i<=top;i++)
book[i].list();
}
BDatabase::~BDatabase()//析构函数,写文件
{
fstream file;
file.open("book.dat",ios::out|ios::binary);
for(int i=0;i<=top;i++)
if(book[i].getnote()==0)
file.write((char*)&book[i],sizeof(book[i]));
file.close();
}
voidBDatabase::bookdata()//图书库维护
{
int choice=1;
char bookname[20];
int bookid;
Book *b;
while(choice!=0)
{
cout<<"图书维护:"<<endl;
cout<<"---------------------------------------------"<<endl;
cout<<"1:新增 2:更改 3:删除 4:查找 5:显示 6:全删 0:退出"<<endl;
cin>>choice;
cout<<"----------------------------------------"<<endl;
switch(choice)
{
case 1:cout<<"输入图书编号:";
cin>>bookid;
cout<<"输入图书名:";
cin>>bookname;
b=query(bookid);
if(b!=NULL)
cout<<"添加失败,该图书编号上已存在图书"<<endl;
else
addbook(bookid,bookname); break;
case 2:cout<<"输入图书编号:";
cin>>bookid;
b=query(bookid);
if(b==NULL)
{cout<<"该图书不存在!"<<endl;
break; }
cout<<"输入新的图书名:";
cin>>bookname;
b->setname(bookname);break;
case3:cout<<"输入图书编号:";
cin>>bookid;
b=query(bookid);//查找
if(b==NULL)
cout<<"该图书不存在!"<<endl;
else
{
delbook(b);//删除
cout<<"删除成功!"<<endl;
}
break;
case 4:cout<<"输入图书编号:";
cin>>bookid;
b=query(bookid);//查找
if(b==NULL)
{cout<<"该图书不存在!"<<endl;
break;}
b->list(); break;
case5:
list();break;//显示操作
case6:
clear();//全部删除
break;
}//end switch
} //end while
}
7.rdatabase.h(读者信息库类)
#ifndef_rdatadase_h_
#define_rdatabase_h_
#include"reader.h"
#include<iostream>
usingnamespace std;
constint Maxr=100; //最大读者数
classRDatabase //读者库类
{
private:
int top; //读者记录指针
Reader read[Maxr]; //读者记录
public:
RDatabase(); //构造函数初始化:读文件
void clear(); //删除所有读者信息
intaddreader(int n,char *na); //添加读者记录时,先确定他//是否已经存在
Reader *query(int readerid); //按编号查找
void list(); //输出所有读者信息
void readerdata(); //读者库维护
~RDatabase(); //析构函数:写文件
void delreader(Reader *r);
};
#endif
8.rdatabase.cpp(读者信息库类实现)
#include<fstream>
#include<iostream>
#include"rdatabase.h"
usingnamespace std;
RDatabase::RDatabase()//构造函数初始化,读文件
{
Reader s;
top=-1;
ifstream file;
file.open("reader.dat",ios::in|ios::binary);
while(1)
{file.read((char*)&s,sizeof(s));
if(!file) break;
top++;
read[top]=s;}
file.close();
}
voidRDatabase::clear()//删除所有读者信息
{top=-1;}
Reader*RDatabase::query(int readerid)//按编号查找
{
for(int i=0;i<=top;i++)
if(read[i].getnumber()==readerid&&read[i].getnote()==0)return &read[i];
return NULL;}
intRDatabase::addreader(int n,char *na)//添加读者记录时,先确定他是否已经存在
{
Reader *p=query(n);
if(p==NULL)
{
top++;
read[top].addreader(n,na);
return1;
}
return 0;}
voidRDatabase::delreader(Reader *r)//删除读者
{
//top--;
r->delreader();
}
voidRDatabase::list()//输出读者信息
{ for(inti=0;i<=top;i++)
read[i].list();
}
RDatabase::~RDatabase()//析构函数,写文件
{ fstream file;
file.open("reader.dat",ios::out|ios::binary);
for(int i=0;i<=top;i++)
if(read[i].getnote()==0)
file.write((char*)&read[i],sizeof(read[i]));
file.close();}
voidRDatabase::readerdata()
{ int choice=1;
char readername[20];
int readerid;
Reader *r;
while(choice!=0)
{
cout<<"读者维护:"<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"1:新增 2:更改 3:删除 4:查找 5:显示 6:全删 0:退出"<<endl;
cin>>choice;
cout<<"--------------------------------------------"<<endl;
switch(choice)
{
case 1:cout<<"输入读者编号:";
cin>>readerid;
cout<<"输入读者姓名:";
cin>>readername;
r=query(readerid);
if(r!=NULL)
cout<<"添加失败,该读者编号上已存在读者!"<<endl;
else
addreader(readerid,readername);break;
case 2:cout<<"输入读者编号:";
cin>>readerid;
r=query(readerid);
if(r==NULL)
{cout<<"该读者不存在!"<<endl;
break; }
cout<<"输入新的姓名:";
cin>>readername;
r->setname(readername); break;
case3:cout<<"输入读者编号:";
cin>>readerid;
r=query(readerid);
if(r==NULL)
{ cout<<"该读者不存在!"<<endl;
break;}
else
{
delreader(r);
cout<<"删除成功!"<<endl;
}
break;
case 4:cout<<"输入读者编号:";
cin>>readerid;
r=query(readerid);
if(r==NULL)
{cout<<"该读者不存在!"<<endl;
break;}
r->list();break;
case5:list();break;
case6:
clear();
break;
}//end switch
} //end while
}
9.library.cpp(主函数实现)
#include"reader.h"
#include"rdatabase.h"
#include"book.h"
#include"bdatabase.h"
#include<iostream>
usingnamespace std;
intmain(int argc, char* argv[])
{ int choice=1,bookid,readerid;
RDatabase ReaderDB;
BDatabase BookDB;
Reader *r;
Book *b;
cout<<"欢迎进入“小小图书馆”管理软件"<<endl;
cout<<"------------------------------"<<endl;
while(choice!=0)
{cout<<"--------------------------------------"<<endl;
cout<<"1: 借书 2 还书 3: 图书维护 4: 读者维护 0: 离开";
cin>>choice;
cout<<"----------------------------------------------"<<endl;
switch(choice)
{case1:
cout<<"输入借书读者编号";
cin>>readerid;
cout<<"输入图书编号";
cin>>bookid;
r=ReaderDB.query(readerid);//查找读者
if(r==NULL)
{cout<<"该读者不存在,不能借书!"<<endl;
break;}
b=BookDB.query(bookid);//查找图书
if(b==NULL)
{cout<<"该图书不存在,不能借书!"<<endl;
break;}
if(b->borrowbook()==0)//判断是否借出
{cout<<"该图书已借出,不能借书!"<<endl;
break; }
else
{
r->borrowbook(b->getnumber(),b);//借出图书操作
break;
}
case2:
cout<<"输入还书读者编号";
cin>>readerid;
cout<<"输入图书编号";
cin>>bookid;
r=ReaderDB.query(readerid);
if(r==NULL)
{cout<<"该读者不存在,不能还书!"<<endl;
break;}
b=BookDB.query(bookid);
if(b==NULL)
{cout<<"该图书不存在,不能还书!"<<endl;
break;}
else
{
b->retbook();//还书操作
r->retbook(b->getnumber());
cout<<"还书成功!"<<endl;break;
}
case3:
BookDB.bookdata();break;//图书维护
case4:
ReaderDB.readerdata();break;//读者维护
}//endswitch
}//end while
return 0;
}