63图书管理.docx
《63图书管理.docx》由会员分享,可在线阅读,更多相关《63图书管理.docx(25页珍藏版)》请在冰豆网上搜索。
![63图书管理.docx](https://file1.bdocx.com/fileroot1/2023-1/22/e661ca0f-6a65-4c8c-bb60-26f3991a51f6/e661ca0f-6a65-4c8c-bb60-26f3991a51f61.gif)
63图书管理
图书管理
一.实验目的
【问题描述】
图书管理系统基本业务包括:
对一本书的采编入库,清除库存、借阅和归还等等。
试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。
【基本要求】
1)每种书的登记内容至少包括书号、书名、著者、现存量和总库存量等五项;
2)作为演示系统,不必使用文件,全部数据可以都在内存存放。
但是由于上述四项基本业务活动都是通过书号(即关键字)进行的,所以要用B树(2-3树)对书号建立索引,以获得高效率。
3)系统应实现的操作及其功能定义如下:
●采编入库:
新购入的一种书,经分类和确定书号之后登记到图书账目中去。
如果这种书在账中已有,则只将总库存量增加。
●清除库存:
某种书已无保留价值,将它从图书账目中注销。
●借阅:
如果一种书的现存量大于零,则借出一本,登记借阅者的图书证号和归还期限。
●归还:
注销对借阅者的登记,改变该书的现存量。
●显示:
以凹入表的形式显示B树。
这个操作是为了调试和维护的目的而设置的。
【测试数据】
入库书号:
35、16、18、70、5、50、22、60、13、17、12、45、25、42、15、90、30、7
然后清除:
45、90、50、22、42
其余数据自行设计。
由空树开始,每插入删除一个关键字后就显示B树的状态。
二.实验内容
原程序代码
classBook
{//图书类,实现对图书的描述,图书的编号,书名,借出,还入等功能
private:
inttag;//删除标记1:
已删0:
未删
intno;//图书编号
charname[20];//书名
charauthor[20];//作者
charcbs[20];//出版社
#include"iostream.h"
#include"conio.h"
#include"fstream.h"
#include"iomanip.h"
#include"string.h"
constintMaxr=100;//最多的读者数
constintMaxb=100;//最多的图书数
constintMaxbor=5;//每位读者最多借的书
intonshelf;//是否再架1:
再架2:
已借
public:
Book(){;}
char*getname()
{//获取书名
returnname;
}
char*getauthorname()
{//获取作者名
returnauthor;
}
char*getcbsname()
{//获取出版社名
returncbs;
}
intgetno()
{//获取图书编号
returnno;
}
intgettag()
{//获取删除标记
returntag;
}
voidsetname(charna[])
{//设置书名
strcpy(name,na);
}
voidsetonshelf(intoa)
{
onshelf=oa;
}
voiddelbook()
{//删除图书
tag=1;
}
voidaddbook(intn,char*na,char*aa,char*ca,intoa)
{//增加图书
tag=0;
no=n;
strcpy(name,na);
strcpy(author,aa);
strcpy(cbs,ca);
onshelf=oa;
}
intborrowbook()
{//借书操作
if(onshelf>0)
{
onshelf--;
return1;
}
return0;
}
voidretbook()
{//还书操作
onshelf++;
}
voiddisp()
{//输出图书
cout<}
};
classBDatabase
{//图书库类,实现对图书的维护,查找,删除等
private:
inttop;//图书记录指针
Bookbook[Maxb];//图书记录
public:
BDatabase()
{//构造函数,将book.txt读到book[]中
Bookb;
top=-1;
fstreamfile("book.txt",ios:
:
in);
while
(1)
{
file.read((char*)&b,sizeof(b));
if(!
file)
break;
top++;
book[top]=b;
}
file.close();
}
voidclear()
{//全删
top=-1;
}
intaddbook(intn,char*na,char*aa,char*ca,intoa)
{//增加图书
Book*p=query1(n);
if(NULL==p)
{
top++;
book[top].addbook(n,na,aa,ca,oa);
return1;
}
return0;
}
Book*query1(intbookid)
{//按编号查找图书
for(inti=0;i<=top;i++)
if(book[i].getno()==bookid&&book[i].gettag()==0)
{
return&book[i];
}
returnNULL;
}
Book*query2(chara[])
{//按书名查找图书
Book*e;
intr=0;
for(inti=0;i<=top;i++)
if(strcmp(book[i].getname(),a)==0&&book[i].gettag()==0)
{
if(r==0)
cout<e=&book[i];
e->disp();
r++;
}
if(r==0)
cout<<"找不到该书!
"<returnNULL;
}
Book*query3(chara[])
{//按作者查找图书
Book*e;
intr=0;
for(inti=0;i<=top;i++)
if(strcmp(book[i].getauthorname(),a)==0&&book[i].gettag()==0)
{
if(r==0)
cout<e=&book[i];
e->disp();
r++;
}
if(r==0)
cout<<"找不到该书!
"<returnNULL;
}
Book*query4(chara[])
{//按出版社查找图书
Book*e;
intr=0;
for(inti=0;i<=top;i++)
if(strcmp(book[i].getcbsname(),a)==0&&book[i].gettag()==0)
{
if(r==0)cout<e=&book[i];
e->disp();
r++;
}
if(r==0)
cout<<"找不到该书!
"<returnNULL;
}
voidbookdata();//图书库信息
voiddisp()
{
for(inti=0;i<=top;i++)
if(book[i].gettag()==0)
book[i].disp();
}
cin>>bname;
cout<<"请输入新书作者名:
";
cin>>auname;
cout<<"请输入新书出版社:
";
cin>>cname;
cout<<"请输入新书数量:
";
cin>>bookod;
addbook(bookid,bname,auname,cname,bookod);
cout<<"添加图书成功!
";
getch();
break;
case'2':
cout<<"请输入图书编号:
";
cin>>bookid;
b=query1(bookid);
if(b==NULL)
{
cout<<"该图书不存在!
"<break;
}
cout<<"该图书的信息是:
"<cout<b->disp();
cout<<"是否修改?
(y/n):
";
cin>>ch;
if(ch=='y')
{
cout<<"请输入新的书名:
";
cin>>bname;
cout<<"请输入新的作者:
";
cin>>auname;
cout<<"请输入新书出版社:
";
cin>>cname;
cout<<"请输入新的存量:
";
cin>>bookod;
b->setname(bname);
b->setonshelf(bookod);
}
cout<<"修改图书成功!
";
getch();
break;
~BDatabase()
{//析构函数,将book[]写到book.txt文件中
fstreamfile("book.txt",ios:
:
out);
for(inti=0;i<=top;i++)
if(book[i].gettag()==0)
file.write((char*)&book[i],sizeof(book[i]));
file.close();
}
};
voidBDatabase:
:
bookdata()
{
charchoice3;
charbname[40];
charauname[40];
charcname[40];
charch;
intchoice4;
intbookid;
intbookod;
Book*b;
while(choice3!
='0')
{
cout<<"\n\t\t\t**图书信息**\n"<cout<<"\t\t\t**1.新增**"<cout<<"\t\t\t**2.更改**"<cout<<"\t\t\t**3.删除**"<cout<<"\t\t\t**4.查找**"<cout<<"\t\t\t**5.显示**"<cout<<"\t\t\t**6.全删**"<cout<<"\t\t\t**0.返回**"<cout<<"\t\t\t请选择:
";
cin>>choice3;
switch(choice3)
{
case'1':
cout<<"请输入新书编号:
";
cin>>bookid;
b=query1(bookid);
if(b!
=NULL)
{
cout<<"该编号已经存在,不能添加!
"<break;
}
cout<<"请输入新书书名:
";
case'3':
cout<<"请输入图书编号:
";
cin>>bookid;
b=query1(bookid);
if(b==NULL)
{
cout<<"该图书不存在,无法删除!
"<break;
}
b->delbook();
cout<<"删除成功!
";
getch();
break;
case'4':
cout<<"\t\t\t**1.按图书编号查找**"<cout<<"\t\t\t**2.按图书书名查找**"<cout<<"\t\t\t**3.按图书作者查找**"<cout<<"\t\t\t**4.按图书出版社查找**"<cout<<"\t\t\t**0.返回**"<cout<<"\t\t\t请选择:
";
cin>>choice4;
switch(choice4)
{
case1:
cout<<"请输入图书编号:
";
cin>>bookid;
b=query1(bookid);
if(b==NULL)
{
cout<<"该图书不存在!
";
break;
}
cout<b->disp();
break;
case2:
cout<<"请输入图书书名:
";
cin>>bname;
b=query2(bname);
break;
case3:
cout<<"请输入图书作者:
";
cin>>auname;
b=query3(auname);
break;
case4:
cout<<"请输入图书出版社:
";
cin>>cname;
b=query4(cname);
break;
case0:
break;
}
break;
case'5':
cout<disp();
getch();
break;
case'6':
clear();
break;
default:
break;
}
}
}
classReader
{//读者的信息描述
private:
inttag;//删除标记1表示已删0表示未删
intno;//读者编号
charname[10];//读者姓名
intborbook[Maxbor];//所借图书
public:
Reader()
{;}
char*getname()
{//获取姓名
returnname;
}
cout<<"未借该书,还书失败!
"<return0;
}
voiddisp()
{//读出读者信息
inthave=0;
intbz=0;
cout<for(inti=0;iif(borbook[i]!
=0)
{
if(bz==0)
{
have=1;
cout<<"["<bz++;
}
else
{
cout<<"\r\t\t\t\t\t""["<}
}
if(have==0)
cout<<"\t还未借书"<}
};
classRDatabase
{//读者类库,实现建立读者的个人资料
private:
inttop;//读者记录指针
Readerread[Maxr];//读者记录
public:
RDatabase()
{//构造函数,将reader.txt读到read[]中
Readers;
top=-1;
fstreamfile("reader.txt",ios:
:
in);//打开一个输入文件
while
(1)
{
file.read((char*)&s,sizeof(s));
if(!
file)
break;
intgettag()
{//获取删除标记
returntag;
}
intgetno()
{//获取读者编号
returnno;
}
voidsetname(charna[])
{//设置姓名
strcpy(name,na);
}
voiddelbook()
{//设置删除标记1:
已删0:
未删
tag=1;
}
voidaddreader(intn,char*na)
{//增加读者
tag=0;
no=n;
strcpy(name,na);
for(inti=0;iborbook[i]=0;
}
voidborrowbook(intbookid)
{//借书操作
for(inti=0;i{
if(borbook[i]==0)
{
borbook[i]=bookid;
return;
}
}
}
intretbook(intbookid)
{//还书操作
for(inti=0;i{
if(borbook[i]==bookid)
{
borbook[i]=0;
cout<<"还书成功!
"<return1;
}
}
voiddisp()
{//输出所有读者信息
for(inti=0;i<=top;i++)
read[i].disp();
}
voidreaderdata();//读者库信息
~RDatabase()
{//析构函数,将read[]写到reader.txt文件中
fstreamfile("reader.txt",ios:
:
out);
for(inti=0;i<=top;i++)
if(read[i].gettag()==0)
file.write((char*)&read[i],sizeof(read[i]));
file.close();
}
};
voidRDatabase:
:
readerdata()
{
charchoice1;
charrname[20];
intreaderid;
charreadername[10];
intchoice2;
Reader*r;
while(choice1!
='0')
{
cout<<"\n\t\t\t**读者信息**\n"<cout<<"\t\t\t**1.新增**"<cout<<"\t\t\t**2.更改**"<cout<<"\t\t\t**3.删除**"<cout<<"\t\t\t**4.查找**"<cout<<"\t\t\t**5.显示**"<cout<<"\t\t\t**6.全删**"<cout<<"\t\t\t**0.返回**"<cout<<"\t\t\t请选择:
";
cin>>choice1;
switch(choice1)
{
case'1':
cout<<"请输入读者编号:
";
cin>>readerid;
cout<<"请输入读者姓名:
";
cin>>rname;
addreader(readerid,rname);
read[top]=s;
}
file.close();//关闭reader.txt文件
}
voidclear()
{//删除所有读者信息
top=-1;
}
intaddreader(intn,char*na)
{//添加读者时先查找是否存在
Reader*p=queryid(n);
if(p==NULL)
{
top++;
read[top].addreader(n,na);
return1;
}
else
cout<<"该编号已经存在!
";
return0;
}
Reader*queryid(intreaderid)
{//按读者编号查找
for(inti=0;i<=top;i++)
if(read[i].getno()==readerid&&read[i].gettag()==0)
{
return&read[i];
}
returnNULL;
}
Reader*queryname(charreadername[10])
{//按读者姓名查找
for(inti=0;i<=top;i++)
if(strcmp(read[i].getname(),readername)==0&&read[i].gettag()==0)
{
return&read[i];
}
returnNULL;
}
cout<<"添加读者成功!
"<getch();
break;
case'2':
cout<<"请输入读者编号:
";
cin>>readerid;
r=queryid(readerid);
if(r==NULL)
{
cout<<"该读者不存在!
"<break;
}
cout<<"请输入新的姓名:
";
cin>>rname;
r->setnam