【设计题目】 图书馆借阅管理
【问题描述】图书馆,适合用C++面向对象的功能来描述。图书馆管理系统分为借书、还书、图书管理和读者服务等四个部分。设计一个读者类Reader,记录每个读者基本信息;读者库类Rdatabase,记录所有读者信息;图书类Book, 记录每本书的基本信息;图书库类Bdatabase, 记录所有图书信息。
【基本要求】
1读者库类RDatabase中,其构造函数中,将read.txt文件中所有读入读者记录rede[]中。处理完毕,在析构函数中将read[]中的所有未删记录写入到read.txt中。
2图书库类BDatabase中,其构造函数中,将book.txt文件中所有读入图书记录book[]中。处理完毕,在析构函数中将book[]中的所有未删记录写入到book.txt中。
3 利用构造函数完成读者和图书数据初始化,完成内存分配。程序结束前,析构函数完成所申请的堆内存空间。
4 编写主函数,对所编写的矩阵类进行全面测试。要求用户界面采用菜单方式。测试中需要读者和图书数据通过I/O流从磁盘文件读入,同时显示在屏幕上。得到的数据通过I/O流写入磁盘文件保存,同时显示在屏幕上。
5 源程序中要有充分的注释,报告中要有详细的流程图和文字材料。
【类的设计】
该程序包含了四个类,如下:
1.Reader类,有读者的基本管理功能,具有以下私有数据:
int tag//删除标记 1:已删;0:未删
int no//读者编号
char name[10]//读者姓名
int borbook[Maxbor]//所借图书
2.读者库类Rdatabase, 具有以下私有数据:
int top//读者记录指针
Reader read[Maxr]//读者记录
3.图书库类Book,有一本图书的基本功能,有以下私有数据:
int tag//删除标记 1:已删;0:未删
int no//图书编号
char name[20]//书名
int onshelf//是否在架 1在架 0已借
4.图书库类BDatabase,有以下私有数据:
int top//图书记录指针
Book book[Maxb]//图书记录
【特殊函数的设计说明】
构造函数
1.Reader类中构造函数Reader(),初始化函数;
2.读者库类RDatabase中,其构造函数Rdatabase(),将read.txt文件中所有读入读者记录rede[]中。
3.Book类中构造函数Book(),初始化函数;
4.图书库类BDatabase中,其构造函数中,将book.txt文件中所有读入图书记录book[]中。
拷贝构造函数
Reader类中的拷贝构造函数将getname()的返回值读者姓名拷贝到setname()中,Book类中的拷贝构造函数将getname()函数的返回值图书名拷贝到图书名设置函数setname()中。
析构函数
1.读者库类RDatabase中,其析构函数~Rdatabase(),将read[]中的所有未删记录写入到read.txt中;
2.图书库类BDatabase中,其析构函数~Bdatabase(),将book[]中的所有未删记录写入到book.txt中。
运算符重载
重载了“=”,当比较读者编号和图书编号时,重载;重载位运算符“〈〈”和“〉〉”等。
【主要函数算法流程图】
【程序的使用方法】
1.进入 *** 作页面,按提示 *** 作;
2.首先,新增图书和读者信息,之后就可以对以存在的信息进行 *** 作;
3. *** 作当中,可以随时增加,更改和删除图书或读者信息;
4.当选择退出时,进行清屏。
二 程序上机调试报告
【语法错误及其排除】
1.在敲程序时,有很多拼写错误,例好多处把Readdata()误打Readdate();结束的分号,在不同的输入法状态下输入,这些小错误刚开始很难发现,不过有了经验,就很容易了。
2.创建新的构造函数时,使用出现了错误。重载构造函数要注意函数的访问权限,结果就不会出现错误。
【算法错误及其排除】
1.读者类中借书 *** 作函数中,采用循环语句时判断读者已借图书量时for(int i=0i<Maxbori++)误写为for(int i=1i<Maxbori++),使循环发生错误。
2.指针使用错误,指针b和r混淆,导致编译错误得到“error C2660: 'retbook' : function does not take 1 parameters”错误报告。
#include<iostream>#include<fstream>
#include<windows.h>
#include<stdlib.h>
using namespace std
void mainmenu()
void Manage_Book()
void input_Book()
void input_Reader()
void New_Book()
void Seek_Book()
void Borrow_Manage()
void Borrow_Book()
void Return_Book()
void Output_Message()
void Exit_System()
int u,v=3,k=0
struct Book
{
char name[20]
int booknumber
int num_present
int num_all
}book[1000]
struct Reader
{
char name[20]
int readernumber
int card
}reader[3]
void mainmenu()
{
int Num_Choice1,flag=1
system("color E")
for(k<=0k++)
{
input_Book()
input_Reader()
}
while(flag==1)
{
system("cls")
cout<<"\t\t\t◆◆◆◆◆主菜单◆◆◆◆◆"<<endl
<<"\t\t\t☆ 1.图书管理 ☆"<<endl
<<"\t\t\t☆ 2.借阅管理 ☆"<<endl
<<"\t\t\t☆ 3.输出信息 ☆"<<endl
<<"\t\t\t☆ 4.退出系统 ☆"<<endl
<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl
cout<<"请输入所需要的服务编码"<<endl
cin>>Num_Choice1
switch(Num_Choice1)
{
case 1:
Manage_Book()
break
case 2:
Borrow_Manage()
break
case 3:
Output_Message()
break
case 4:
Exit_System()
flag=0
break
default:
flag=0
cout<<"输入有误!!"<<endl
}
}
}
void Manage_Book()
{
int flag1=1,Num_Choice2
system("cls")while(flag1==1)
{
cout<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl
<<"\t\t\t☆ 1.新书入库 ☆"<<endl
<<"\t\t\t☆ 2.图书查询 ☆"<<endl
<<"\t\t\t☆ 3.返回主菜单☆"<<endl
<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl
cin>>Num_Choice2
switch(Num_Choice2)
{
case 1:
flag1=2
New_Book()
break
case 2:
flag1=2
Seek_Book()
break
case 3:
mainmenu()
default:
flag1=1
cout<<"输入有误!"<<endl
system("pause")
system("cls")
}
}}
void input_Book()
{
cout<<"请依照提示输入现有的三本图书的信息:"<<endl
for(int i=0i<3i++)
{
cout<<"书名:"<<endl
cin>>book[i].name
cout<<"书号:"<<endl
cin>>book[i].booknumber
cout<<"库存量:"<<endl
cin>>book[i].num_all
cout<<"现存量:"<<endl
cin>>book[i].num_present
}
}
void New_Book()
{
system("cls")
int j
char newbook_name[20]
cout<<"请输入新书书名:"<<endl
cin>>newbook_name
for(j=0j<1000j++)
{
if(strcmp(newbook_name,book[j].name)==0)
{
book[j].num_all++
book[j].num_present++
break
}
}
if(j==1000)
{
cout<<"请为此新书编号:"<<endl
v++
cin>>book[v].booknumber
strcpy(book[v].name,newbook_name)
book[v].num_all=1
book[v].num_present=1
}
else cout<<"已有此书,库存量加一"<<endl
system("pause")
}
void Seek_Book()
{
system("cls")
int k,booknumber
cout<<"请输入所要查询的书号:"<<endl
cin>>booknumber
for(k=0k<1000k++)
{
if(book[k].booknumber==booknumber)
{
cout<<"书号:"<<booknumber<<endl
cout<<"书名:"<<book[k].name<<endl
cout<<"库存量:"<<book[k].num_all<<endl
cout<<"现存量:"<<book[k].num_present<<endl
system("pause")
break
}
}
if(k==1000)
{
cout<<"未找到此书!!"<<endl
system("pause")
}
}
void Borrow_Manage()
{
int flag=1
system("cls")
int Num_Choice3
while(flag==1)
{
cout<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl
<<"\t\t\t☆ 1.借书登记 ☆"<<endl
<<"\t\t\t☆ 2.还书管理 ☆"<<endl
<<"\t\t\t☆ 3.返回主菜单☆"<<endl
<<"\t\t\t◆◆◆◆◆◆◆◆◆◆◆◆◆"<<endl
cin>>Num_Choice3
switch(Num_Choice3)
{
case 1:
flag=2
Borrow_Book()
break
case 2:
flag=2
Return_Book()
break
case 3:
mainmenu()
default:
flag=1
cout<<"输入有误!!"<<endl
system("pause")
}
system("cls")
}
}
void input_Reader()
{
system("cls")
cout<<"请依照提示输入现有的三位读者的信息:"<<endl
for(int m=0m<3m++)
{
cout<<"姓名:"<<endl
cin>>reader[m].name
cout<<"编号:"<<endl
cin>>reader[m].readernumber
reader[m].card=0
}
}
void Borrow_Book()
{
system("cls")
char reader_name[20]
int n,book_number
cout<<"请输入读者姓名:"<<endl
cin>>reader_name
for(n=0n<3n++)
{
if(strcmp(reader_name,reader[n].name)==0)
{
if(reader[n].card!=0)
{
cout<<"已借书,不能再借,请按任意键返回"<<endl
system("pause")
mainmenu()
}
else
break
}
}
if(n==3)
{
cout<<"无此读者!输入有误!!按任意键返回主菜单"<<endl
system("pause")
mainmenu()
}
cout<<"请输入所借图书书号:"<<endl
cin>>book_number
for(n=0n<vn++)
{
if(strcmp(reader_name,reader[n].name)==0)
reader[n].card=book_number
}
for(n=0n<vn++)
{
if(book[n].booknumber==book_number)
{
if(book[n].num_present==0)
{
cout<<"该书已经被借完,请按任意键返回"<<endl
system("pause")
for(n=0n<vn++)
{
if(strcmp(reader_name,reader[n].name)==0)
reader[n].card=0
}
mainmenu()
}
else
{
book[n].num_present--
cout<<"借书成功,请按任意键返回"<<endl
system("pause")
break
}
}
}
if(n==v)
{
for(n=0n<vn++)
{
if(strcmp(reader_name,reader[n].name)==0)
reader[n].card=0
}
cout<<"所输入的书号不存在,请按任意键返回主菜单"<<endl
system("pause")
mainmenu()
}
}void Return_Book()
{
system("cls")
int j
char reader_name[20]
int book_number
cout<<"请输入读者姓名:"<<endl
cin>>reader_name
for(j=0j<3j++)
{
if(strcmp(reader_name,reader[j].name)==0)
break
}
if(j==3)
{
cout<<"无此读者!输入有误!!按任意键返回主菜单"<<endl
system("pause")
mainmenu()
}
cout<<"请输入所还图书书号:"<<endl
cin>>book_number
for(j=0j<3j++)
{
if(strcmp(reader_name,reader[j].name)==0)
{
if(book_number==reader[j].card)
{
reader[j].card=0
for(j=0j<vj++)
{
if(book[j].booknumber==book_number)
{
book[j].num_present++
cout<<"还书成功,请按任意键返回"<<endl
system("pause")
break
}
}
}
else
{
cout<<"该读者未借此书"<<endl
system("pause")
}
}
if(j==v)
cout<<"所输入的书号不存在:"<<endl
}
}
void Output_Message()
{
system("cls")
int q
cout<<"以下是图书信息"<<endl<<endl
for(q=0q<vq++)
{
cout<<"书号:"<<book[q].booknumber<<'\t'
cout<<"书名:"<<book[q].name<<'\t'
cout<<"库存量:"<<book[q].num_all<<'\t'
cout<<"现存量:"<<book[q].num_present<<endl
}
cout<<"以下是读者信息"<<endl<<endl
for(q=0q<3q++)
{
cout<<"姓名:"<<reader[q].name<<'\t'
<<"编号:"<<reader[q].readernumber<<'\t'
<<"所借书号:"<<reader[q].card<<endl
}
system("pause")
}
void Exit_System()
{
system("cls")
cout<<"欢迎下次使用,谢谢"<<endl
system("pause")
}
void main()
{
mainmenu()
}
#include<stdio.h>#include<math.h>
#include<stdlib.h>
#include<string.h>
#define N 100 //书籍的最多本数
struct book
{ char title[30]
int number
char author[30]
float price
int store
char borrower_name[20]
char borrower_gender[5]
int borrower_number
}s[N]
int m=0
void input(structbook *p) //输入图书信息
void save(structbook *p) //保存图书信息
void read(structbook *p) //读取图书信息
void search(structbook *p) //查找图书信息
void del(structbook *p)//删除图书信息
void borrow(structbook *p) //借阅图书
void retur(structbook *p) //归还图书
void main()
{
int x
do
{
printf("**************************************菜单**************************************\n"
" ***********1.输入图书信息********** \n"
" ***********2.查找图书信息********** \n"
" ***********3.删除图书信息********** \n"
" ***********4.借阅图书********** \n"
" ***********5.归还图书********** \n"
" ***********0.退出********** \n")
printf("********************************************************************************\n")
printf("请在0-5中选择,以回车键结束\n")
scanf("%d",&x)
switch(x)
{ case 1: input(&s[0])break
case 2: search(&s[0])break
case 3: del(&s[0])break
case 4: borrow(&s[0])break
case 5: retur(&s[0])break
case 0: break
}
}while(x!=0)
}
void input(structbook *p)
{int y
for(p<(&s[0]+N)p++)
{ printf("请输入书名:")scanf("%s",p->title)
printf("请输入编号:")scanf("%d",&p->number)
printf("请输入作者:")scanf("%s",p->author)
printf("请输入图书价格:")scanf("%f",&p->price)
printf("请输入图书数量:")scanf("%d",&p->store)
m++
printf("第%d个信息已经输入完毕,是否继续?\n按任意键继续,按0键结束.",m)
scanf("%d",&y)//读取是否继续
if(y==0)
{ save(&s[0])
read(&s[0])//调用读取文件函数
break
}
}
}
void search(structbook *p)//查询模块
{ int n
char name1[20]
char name2[20]
char c[3]
do
{ p=&s[0]
printf("\t请选择查找方式:\n")//打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n")
printf("请在0-2中选择:\n\n")
scanf("%d",&n)//读取查找方式
if(n==0) break
switch(n)
{ case 1: printf("请输入书名:\n")scanf("%s",name1)break
case 2: printf("请输入作者:\n")scanf("%s",name2)break
}
for(p<&s[m]p++)
{ read(&s[0])//调用读取函数
if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)
{ printf("\n查找图书信息成功!\n")
printf("书名 编号 作者 价格 数量\n")
printf("%-10s%-10d%-10s%-10.2f%-10d\n",p->title,p->number,p->author,p->price,p->store)//打印信息
break
}
}
printf("是否继续查找?\n“是”请键入“yes”, “否”请按任意键,返回菜单\n")
scanf("%s",c)
}while(strcmp(c,"yes")==0)//判断是否结束
}
void del(structbook *p)//删除模块
{ int i
struct book *p1,*p2
char name1[20]
char name2[20]
char c[3]
int n
do
{ p=&s[0]
printf("请选择删除以方式回车键结束:\n")//打印删除方式菜单
printf( " 1.按书名删除\n 2.按作者删除\n 0.返回\n")
printf("请在0-2中选择:\n\n")
scanf("%d",&n)//读取查找方//
if(n==0) break
switch(n)
{case 1:printf("请输入书名:\n")
scanf("%s",name1)break
case 2: printf("请输入作者:\n")
scanf("%s",name2)break
}
read(&s[0])//调用读取函数
for(i=0i<mi++,p++)
{
if(strcmp(p->title,name1)==0||strcmp(p->author,name2)==0)
{ p1=p
for(p2=p1+1p2<=&s[m]p1++,p2++)
{
strcpy(p1->title,p2->title)
strcpy(p1->author,p2->author)
p1->number=p2->number
p1->store=p2->store
p1->price=p2->price
m--
printf("删除成功!!\n")
}
}
else {printf("没有该书记录!!")
break}
}
printf("是否继续删除?“是”请键入“yes”, “否”请按任意键,返回菜单\n")
scanf("%s",c) //读取是否继续
save(&s[0])//调用保存函数
}while(strcmp(c,"yes")==0)//判断是否继续删除
}
void borrow(structbook *p)//借书模块
{ int z
char name3[20],name4[20]
char w[3]
do
{ p=&s[0]
printf("请先查找您要借阅的图书!")
printf("请选择查找方式:\n")//打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n")
printf("请在0-2中选择:\n")
scanf("%d",&z)//读取查找方式
if(z==0) break
switch(z)
{ case 1: printf("请输入书名:\n")scanf("%s",name3)break
case 2: printf("请输入作者:\n")scanf("%s",name4)break
}
read(&s[0])//调用读取函数
for(p<&s[m]p++)
{ if(strcmp(p->title,name3)==0||strcmp(p->author,name4)==0)
{
printf("\n查找图书信息成功!\n")
printf("书名 编号 作者 价格 数量\n")
printf("%-10s%-10d%-10s%-10.2fs%-10d\n",p->title,p->number,
p->author,p->price,p->store)//打印信息
printf("请输入您的姓名:")scanf("%s",p->borrower_name)
printf("请输入您的性别:")scanf("%s",p->borrower_gender)
printf("请输入您的学号:")scanf("%d",&p->borrower_number)
p->store--
printf("借书成功!\n")
printf("书名 编号 作者 价格 数量 借书人 性别 学号\n")
printf("%-10s%-10d%-10s%-10.2f%-10d%-10s%-10s%-10d\n",p->title,p->number,p->author,
p->price,p->store,p->borrower_name,p->borrower_gender,p->borrower_number)
break
}
}
printf("是否继续借书??")
printf("“是”请键入“yes”, “否”请按任意键,返回菜单\n")
scanf("%s",w) //读取是否继续
save(&s[0])//调用保存函数
}while(strcmp(w,"yes")==0)//判断是否继续借书
}
void retur(structbook *p)//还书模块
{int e,f
char name5[20]
char name6[20]
char t[3]
do
{ p=&s[0]
printf("请先查找您要还的图目!")
printf("请选择查找方式:\n") //打印查询方式菜单
printf(" 1.按书名查找\n 2.按作者查找\n 0.返回\n")
printf("请在0-2中选择:\n\n")
scanf("%d",&e) //读取查找方式
if(e==0) break
switch(e)
{ case 1: printf("请输入书名:\n")scanf("%s",name5)break
case 2: printf("请输入作者:\n")scanf("%s",name6)break
}
read(&s[0])//调用读取函数
for(p<&s[m]p++)
{ if(strcmp(p->title,name5)==0||strcmp(p->author,name6)==0)
{ printf("\n查找图书信息成功!\n")
printf("确认还书请按“1”!")//确认是否还书
scanf("%d",&f)
if(f==1)
{ strcpy(p->borrower_name,"0")
strcpy(p->borrower_gender,"0")
p->borrower_number=0
p->store++
printf("书名 编号 作者 价格 数量 借书人 性别 学号\n")
printf("%-10s%-10d%-10s%-10.2f%-10d%-10s%-10s%-10d\n",p->title,p->number,p->author,
p->price,p->store,p->borrower_name,p->borrower_gender,p->borrower_number)
//打印信息
}
break
}
else {printf("没有该书记录!!")
break}
}
printf("是否继续还书?\n")
printf("“是”请键入“yes”, “否”请按任意键,返回菜单\n")
scanf("%s",t) //读取是否继续
save(&s[0])//调用保存函数
}while(strcmp(t,"yes")==0)//判断是否继续还书
}
void save(structbook *p)//保存文件
{ FILE *fp,*fp1
int i
if((fp=fopen("tushu.txt","wb"))==NULL)//打开文件并判断是否出错
{ printf("创建文件失败!\n\n")//打印出错提示
getchar()return
}
if((fp1=fopen("book.txt","wb"))==NULL)//打开文件并判断是否出错
{ printf("创建文件失败!\n\n")//打印出错提示
getchar()return
}
for(i=0i<mi++,p++)
if(fwrite(p,sizeof(structbook),1,fp)==0)//向文件写入数据,并判断是否出错
printf("向文件输入数据失败!\n\n")
fprintf(fp1,"%d",m)
fclose(fp)//关闭文件
fclose(fp1)//关闭文件
}
void read(structbook *p)//从文件读取信息模块
{FILE *fp,*fp1
int i
if((fp=fopen("tushu.txt","rb"))==NULL)//打开文件,并判断是否出错
{ printf("出错,请检查文件是否存在,按任意键返回住菜单")//打印出错提示
getchar()
}
if((fp1=fopen("book.txt","rb"))==NULL)//打开文件并判断是否出错
{ printf("创建文件失败!\n\n")//打印出错提示
getchar()return
}
fscanf(fp1,"%d",&m)
fclose(fp1)//关闭文件
for(i=0i<mi++,p++)
{ fread(p,sizeof(struct book),1,fp)//从文件中读取信息
}
fclose(fp)//关闭文件
}
你把保存的文件地址自己修改一下就可以了。。希望能帮到你
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)