c++图书管理系统报告.docx
《c++图书管理系统报告.docx》由会员分享,可在线阅读,更多相关《c++图书管理系统报告.docx(30页珍藏版)》请在冰豆网上搜索。
![c++图书管理系统报告.docx](https://file1.bdocx.com/fileroot1/2023-4/20/2b5f0e29-7d4f-441c-8747-4828933a250d/2b5f0e29-7d4f-441c-8747-4828933a250d1.gif)
c++图书管理系统报告
图书管理系统
一.需求分析
图书管理在生活中运用非常广泛,因此需要用许多的程序来对它们进行管理。
此程序包含了图书信息的录入、图书信息的浏览、图书的查询和排序、图书信息的删除与修改,借书,还书,统计等。
通过编译一个C语言函数,其中包含一个主函数,多个子函数,主函数调用其余的子函数实现人们能够简易、快捷的了解并找到自己所学要的信息的功能。
二.系统主要功能
1、查询所有图书信息:
将所有图书信息包括编号、书名、出版社、作者、价格等显示在屏幕上。
2、查找一本图书的信息:
通过输入图书编号完成图书信息的查找,并在屏幕上显示。
3、修改图书信息:
通过输入编号,判断此图书是否存在,若不存在则提示用户重新输入图书编号。
4、删除图书信息:
通过输入编号,判断此图书是否存在,若存在,则提示用户是否显示删除后的信息,若不存在则提示用户重新输入图书编号。
5、借书:
通过输入图书编号,判断此图书是否存在,若不存在则提示用户重新输入图书编号,若图书已借出则提示用户是否继续借书,若没借出则将此图书的编号和学生的学号存入图书借阅文件中。
6、退出系统:
返回主页面。
三.流程图
四.数据结构设计
4.1main()函数模块
根据图书馆信息管理系统的要求,可设计一个主函数,及定义多个用户自定义函数。
在主函数中定义全局变量,即是在函数外部定义的变量,其不属于某一个函数,而属于一个源程序文件,在整个程序内可以多次被引用。
通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
运用fscanf语句在主函数中将文件中的内容赋给结构体变量,便于在自定义函数中对结构体的调用。
具体如下:
在主函数中定义一个存放图书信息的结构体
structlist{
charnum[20];/*图书编号*/
charname[40];/*书名*/
charauthor[40];/*作者*/
charpublish[40];/*出版社*/
doubleprice;/*价格*/
};
以及各函数的申明
voidsearch_allinformation(structlistb[]);/*查看全部书信息*/
voidcheck_bookinformation(structlistb[]);/*查找图书信息*/
voidadd_bookinformation(structlistb[]);/*添加图书信息*/
voiddelete_bookinformation(structlistb[]);/*删除图书信息*/
voidborrow_book(structlistb[]);/*借阅图书*/
通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
switch(choice1)
{case1:
search_allinformation(b);
break;
case2:
check_bookinformation(b);
break;
case3:
add_bookinformation(b);
break;
case4:
delete_bookinformation(b);
break;
case5:
borrow_book(b);
break;
case0:
break;
}
4.2查询所有图书信息函数模块
voidsearch_allinformation(structlistb[])
通过printf()语句将所有的图书信息包括包括编号、书名、出版社、作者、价格等信息显示在屏幕上。
运用for语句加printf()实现图书信息的循环输出显示。
4.3查询一本图书信息函数模块
voidcheck_bookinformation(structlistb[])
用户先输入图书编号后,先用strcmp(s1,s2)函数进行比较两个字符串数组的大小,从而查找出该图书是否存在,若不存在则提示用户是否要继续查找,运用switch语句,若继续则再次调用函数本身进行第二次查找,直到找到为止,若否则结束循环,不再进行查找。
通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
运用fscanf语句在主函数中将文件中的内容赋给结构体。
其主要流程图如下:
关键代码:
strcmp(比较字符串)case….break(判断)printf(输出信息)
switch(实现选择功能分支)
4.4添加图书信息函数模块
voidadd_bookinformation(structlistb[])
输入图书的基本信息包括编号、书名、出版社、作者、价格,由于原有的图书信息是按照编号的大小顺序排列的,所以只需运用for循环和strcmp函数找出输入的图书
应该插入的位置,再将所添加的图书信息插入即可。
其主要流程图如下:
关键代码:
printf(输出信息)
scanf(输入信息)
switch(实现多分支结构程序设计)
case-break(实现功能的选择)
4.5删除图书信息函数模块
voiddelete_bookinformation(structlistb[])
用户输入所要删除的图书编号,先查找该图书编号是否存在,若存在,这提示用户是否要显示删除后的信息,若不存在则提示重新输入。
关键代码:
strcmp(比较两个字符串的大小)
switch(实现多分支结构程序设计)
if(条件选择)
4.6借阅图书模块
voidborrow_book(structlistb[])
用户先输入所借图书的编号,调用函数查找该图书有没有借出,若已借出,则提示用户该图书已借出,并提示用户是否继续借阅其他书籍。
若继续,则继续进行新的查找。
关键代码:
if-else(实现分支选择)
getchar(从键盘上输入一个字符)
goto(使程序的执行流程直接转接到标号对应的那条语句)
strcmp(比较两个字符串的大小)
五.主要代码
#include
#include
#include
#include
#defineMaxbor100
#defineMaxr100
#defineMaxb100
usingnamespacestd;
classReader
{
private:
inttag;//删除标记1:
已删0:
未删
intno;//读者编号
charname[10];//读者姓名
intborbook[Maxbor];//所借图书
public:
Reader(){}
char*getname(){returnname;}//获取姓名
intgettag(){returntag;}//获取删除标记
intgetno(){returnno;}//获取读者编号
voidsetname(charna[])//设置姓名
{
strcpy(name,na);
}
voiddelbook(){tag=1;}//设置删除标记1:
已删0:
未删
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;
return1;
}
}
return0;
}
voiddisp()//读出读者信息
{
cout<[";
for(inti=0;iif(borbook[i]!
=0)
cout<cout<<"]"<}
};
//读者类库,实现建立读者的个人资料
classRDatabase
{
private:
inttop;//读者记录指针
Readerread[Maxr];//读者记录
public:
RDatabase()//构造函数,将reader.txt读到read[]中
{
Readers;
top=-1;
fstreamfile("E:
\reader.txt",ios:
:
in);//打开一个输入文件
while
(1)
{
file.read((char*)&s,sizeof(s));
if(!
file){cout<<"打开失败"<top++;
read[top]=s;
}
file.close();//关闭reader.txt
}
voidclear()//删除所有读者信息
{
top=-1;
}
intaddreader(intn,char*na)//添加读者时先查找是否存在
{
Reader*p=query(n);
if(p==NULL)
{
top++;
read[top].addreader(n,na);
return1;
}
return0;
}
Reader*query(intreaderid)//按编号查找
{
for(inti=0;i<=top;i++)
if(read[i].getno()==readerid&&
read[i].gettag()==0)
{
return&read[i];
}
returnNULL;
}
voiddisp()//输出所有读者信息
{
for(inti=0;i<=top;i++)
read[i].disp();
}
voidreaderdata();//读者库维护
~RDatabase()//析构函数,将read[]写到reader.txt文件中
{
fstreamfile("E:
\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()
{
charchoice;
charrname[20];
intreaderid;
Reader*r;
while(choice!
='0')
{
cout<<"\n\n\t\t\t读者维护\n\n\n\t\t1新增\n\n\t\t2更改\n\n\t\t3删除\n\n\t\t4查找\n\n\t\t5显示\n\n\t\t6全删\n\n\t\t0退出"<cin>>choice;
switch(choice)
{
case'1':
cout<<"输入读者编号:
";
cin>>readerid;
cout<<"输入读者姓名:
";
cin>>rname;
addreader(readerid,rname);
break;
case'2':
cout<<"输入读者编号:
";
cin>>readerid;
r=query(readerid);
if(r==NULL)
{
cout<<"该读者不存在"<break;
}
cout<<"输入新的姓名:
";
cin>>rname;
r->setname(rname);
break;
case'3':
cout<<"输入读者编号:
";
cin>>readerid;
r=query(readerid);
if(r==NULL)
{
cout<<"该读者不存在"<break;
}
r->delbook();
break;
case'4':
cout<<"读入读者编号:
";
cin>>readerid;
r=query(readerid);
if(r==NULL)
{
cout<<"该读者不存在"<break;
}
r->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:
cout<<"输入错误,请从新输入:
";break;
}
}
}
//图书类,实现对图书的描述,图书的编号,书名,借出,还入等
classBook
{
private:
inttag;//删除标记1:
已删0:
未删
intno;//图书编号
charname[20];//书名
intonshelf;//是否再架1:
再架2:
已借
public:
Book(){}
char*getname(){returnname;}//获取姓名
intgetno(){returnno;}//获取图书编号
intgettag(){returntag;}//获取删除标记
voidsetname(charna[])//设置书名
{
strcpy(name,na);
}
voiddelbook(){tag=1;}//删除图书
voidaddbook(intn,char*na)//增加图书
{
tag=0;
no=n;
strcpy(name,na);
onshelf=1;
}
intborrowbook()//借书操作
{
if(onshelf==1)
{
onshelf=0;
return1;
}
return0;
}
voidretbook()//还书操作
{
onshelf=1;
}
voiddisp()//输出图书
{
cout<<<(onshelf==1?
"在架":
"已借")<}
};
//图书库类,实现对图书的维护,查找,删除等
classBDatabase
{
private:
inttop;//图书记录指针
Bookbook[Maxb];//图书记录
public:
BDatabase()//构造函数,将book.txt读到book[]中
{
Bookb;
top=-1;
fstreamfile("E:
\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)//增加图书
{
Book*p=query(n);
if(NULL==p)
{
top++;
book[top].addbook(n,na);
return1;
}
return0;
}
Book*query(intbookid)//查找图书
{
for(inti=0;i<=top;i++)
if(book[i].getno()==bookid&&book[i].gettag()==0)
{
return&book[i];
}
returnNULL;
}
六.系统运行结果样例
6.1主菜单运行界面
图4.1主菜单运行界面图
6.2查询所有图书信息模块运行界面
按1操作查询所有图书信息,
(1)打开源程序,编译程序,单击Compile按钮,出现错误,如图:
(2)错误均指向55行,经检查发现调用函数时调用的是整个结构体,而非某一个,所以应该为search_allinformation(b).
(3)改正后重新运行,即的如下所示的界面如下:
图4.2查询所有图书信息模块界面
6.3查找某一本图书信息模块运行界面
按2选择按书名查询某一本图书信息,
若图书编号存在则界面如下:
图4.3按编号查询图书信息界面
若图书编号不存在,
(1)输入y,没有进行继续查找的操作
(2)调试程序,可查出输入的y对程序无影响,由于输入的是一个字符,而”\0”本身也是一个字符,则可将scanf(“%s”,&a)改为getchar()即可。
该后则界面如下:
图4.4图书编号查询图书界面
6.4添加图书信息模块运行界面
按3选择,输入编号,界面如下:
图4.5按图书编号添加图书界面
6.5删除图书信息模块运行界面
按4选择,输入编号,
如果编号不存在,界面如下:
图4.6按图书编号删除图书界面
如果编号存在,界面如下:
图4.7按图书编号删除图书界面
6.6借阅图书模块信息运行界面
按5选择,输入编号,
出现如下界面:
图4.8借阅图书界面(有错误)
调试后找出错误为文件SendInfo.txt扩展名是隐藏的,应将文件名改为SendInfo,得到如下正确界面:
图4.9借阅图书界面
如果编号不存在,界面如下:
图4.10借阅图书界面
七.总结
通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,所以后在学习过程中,我会更加注视实践操作。
在课程设计过程中,收获知识,提高能力的同时,我也懂得怎么样去制定、实现计划,课程设计是培养学生综合运用所学知识发现提出分析和解决实际问题锻炼实践能力的重要环节是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,在设计中我们遇到了很多编程问题,最后在各位老师的辛勤指导下,我们慢慢的进入状态,我做的是一个图书馆信息管理系统的设计,内容包括很多。
运用的函数也是非常的复杂,所以设计程序一定要仔细,不容一点的马虎。
当然也有大问题,关于文件的操作,是我们最大的问题。
要有模块化思维能力,化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,
指导教师评语:
成绩:
签名: