图书借阅管理.docx
《图书借阅管理.docx》由会员分享,可在线阅读,更多相关《图书借阅管理.docx(56页珍藏版)》请在冰豆网上搜索。
图书借阅管理
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2011年春季学期
数据结构课程设计
题目:
专业班级:
姓名:
学号:
指导教师:
成绩:
__________________
目录
摘要2
前言3
正文4
1.采用类c语言定义相关的数据类型4
2.各模块的伪码算法5
3.函数的调用关系图7
4.调试分析9
5.测试结果10
6.源程序(带注释)11
总结13
参考文献14
致谢15
附件Ⅰ部分源程序代码16
摘要
图书借阅管理系统是一个学校不可缺少的部分,它的内容对于学校的管理者和读者来说都至关重要,直接关系到图书的借用率,所以开发图书管理系统能够为管理员和读者提供充足的信息和快捷的查询手段。
编写程序系统主要实现图书馆的增加图书、查询图书、删除图书、借阅图书、还书;增加会员、查询会员、删除会员、借书信息、到期书催还等智能化管理过程。
图书的结构体包括的数据项有:
图书编号、书名、书的价格、借阅人、判断书是否存在或者已经借出的数据项(1存在,0借出)等;会员的结构包括的数据项有:
会员的姓名、会员的性别、会员的年龄、等。
图书管理者只需略懂电脑知识就可以简易的操作该图书借阅管理系统。
关键字:
图书信息管理;查询;修改;读者;借阅
前言
随着计算机技术的不断发展,计算机作为知识经济时代的产物,已被广泛应用于社会各个行业和领域。
目前,我国的科技水平高速发展,计算机作为今天使用最广的现代化工具已深入到各个领域,并且正在成为未来社会——信息社会的重要支柱。
在这样的大背景下,现代图书馆的管理方式,资源建设等方面都发生了重大变化,这种变化表现在图书馆工作,管理和服务平台发生的变化图书馆不再是传统的手工操作,人工管理,而是全面实行计算机管理。
图书馆的正常运营中总是面对大量的读者信息,图书信息以及两者相互作用产生的借书信息,因此要对读者资源,图书资源,借书信息进行管理。
本系统的开发就是在于提高图书管理的工作效率,加强图书馆的管理,全面实行计算机管理
正文
1.采用类c语言定义相关的数据类型
存储结构的定义
1.1书的结构体
typedefstructbook
{
floatprice;//图书单价
intmembernum;//借书人编号
charname[80];//图书名
longnum;//图书编号
charwritername[20];//作者姓名
charpublish[30];//出版社名称
intyes;//判断书是否存在或者已经借出,1存在,0借出
structbook*next;//结点指针
}Book,*BookList;
1.2借书时间结构体
typedefstructTime
{
intyear;
intmonth;
intday;
}data;
1.3会员借的书的结构体
typedefstructBorrowBook
{
longnum;//借的书的编号
structTimetime;//借书时间
structTimeborrowtime;//借书期限
}BBook;
1.4会员的结构体
typedefstructmember
{
charname[20];//会员姓名
charsex;//会员性别,男m,女f
longnum;//会员编号
intstyle;//会员类型,1:
本科生;2:
研究生;3:
教师;4:
管理员;
intmax;//会员借书数目,初始为0
intyes;//会员是否借书,1是,0否
BBookt[MAX];//会员借的书的数组
structmember*next;//结点指针
}Member,*MemberList;
2.各模块的伪码算法
2.1图书查询
输入要查询的方法,选择相应的查询函数,如果选择的是按书名查询则显示所有书名相同的图书信息;如果选择的是按编号进行查询,则一次只显示一本书,因为图书是以编号作为主键的,一个编号对应唯一的一本书;如果选择的是按作者名进行查询,则显示所有作者名相同的图书;如果选择的是按出版社查询,则显示出所有出版社相同的图书;如果选择查询所有图书,则显示出所有图书的信息;如果没有相应的图书,则显示相关信息。
(如图-3)
图-3
2.2图书借阅
先输入会员编号,判断是否为会员。
如果是会员,就输入要借的图书编号,在图书链表当中查找这本书,如果找到,再判断这本书是否被借出;如果没有借出,则判断这个会员借的书是否超出了他(她)的最大借阅量,如果没有超出,则在会员借的书的链表中查找适当位置,将借的这本书的书名、编号等信息保存在链表中,完成图书借阅操作。
如果不是会员,或者这本书不存在,或者这本书已经被借出,或者会员超出了他(她)的最大借阅量,则借阅都不成功。
(如图-4)
2.3还书
输入要归还的图书编号。
在图书链表当中查找这本书。
如过在链表中找到这本书,并且它被借出,则找到借这本书的会员编号,然后再在会员链表当中查
找该会员;找到会员后,则再在该会员借了的书的链表当中查找这本书的信息,将这本书从借了的书的链表当中删除,并且将这个会员借的书的数目减1,完成还书。
如果这本书不存在或者没借出,则还书不成功。
(如图-5)
2.4借书信息
输入会员编号,在会员链表中查找相应的会员,如果该会员借了书,则继续查找该会员借的书的链表,在链表中查找该会员借的书的详细信息,如借了的本数、编号、借书时间和到期时间;如果借的书的链表中没有记录,则说明他没有借书,则显示“无借书记录”。
(如图-6)
图-6
图-7
2.5到期书催还
在图书链表中逐个查询,如果书被借出,则进一步判断;获取当前系统的时间,用来与借出的书的到期时间作比较;因为到期时间保存在会员借的书的链表当中,因此,只有找到借这本书的会员编号,然后根据编号再在会员链表中找到改会员,再在他借的书的链表中查找他的书,获取到期时间,那它与当前的系统时间作比较,如果系统的时间超过了到期时间,则显示出催还信息。
(如图-7)
3.函数的调用关系图
3.1总体功能实现
图-1.总体功能实现框图
通过需求分析,设计出本程序的总体功能设计框图。
分为七个方面:
1、选择检查类型;2、编辑图书的信息;3、查询图书的信息;4、编辑读者的信息;5、查询读者的信息;6、借阅书刊;7、还书。
连线之间说明了他们之间的相互联系以及设计时的要求
3.2图书借阅管理简略功能框图
4.调试分析
a、调试中遇到的问题及对问题的解决方法
intSearch_BookNum(BookList&H)//按编号查询
{
Book*p;
p=H->next;
intn;
intflag=0;
……
}
上述函数中,对变量的定义出现了错误,导致数据无法正常显示计算,应将“intn”改为“longint”,使数据的输入合法化。
b、算法的时间复杂度和空间复杂度
单链表来存放图书信息存储:
空间复杂度为O(n)时间复杂度都为O(n)。
单链表来存放会员信息存储:
空间复杂度为O(n)时间复杂度都为O(n)。
图书的管理及借阅、会员管理,时间复杂度都为O(n)。
5.测试结果
5.1增加图书和增加会员系统,加入5本书和5个用户作为测试用户。
详细内容如下表:
图-8图书清单
图-9用户清单
5.2图书借阅功能:
(如图-10)
5.3图书归还功能:
(如图-11)
5.4会员借书信息显示:
(如图-12)
5.5过期催还功能:
(如图-13)
总结
这次基础强化训练的课程设计对于我们来说,有一定的难度。
因为他要求我们较完整的去实现一个比较可行的程序。
将其应用到实际的生活中去。
我被分配到的题目是图书借阅系统的实现与设计。
这个题目相对来说贴近生活,比较容易理解。
但是设计一个较为完整的程序却不是这么简单的。
首先我分析了相关的题目内容,并由此而进行了相关资料和书籍的查询工作然后才开始正式进行设计。
一开始不知从何下手但后来分析了一下题目,并结合这学期所学的知识,再加上相关提示我决定用指针、链表和文件的内容来编写程序。
图书管理主要就是有一些操作来完成,这些操作包括:
新进图书基本信息的输入、图书基本信息的查询、对撤消图书信息的删除、为借书人办理注册、办理借书手续(非注册会员不能借书)、办理还书手续等等。
我想这正好用C++的知识来实现函数:
添加图书,图书查询,删除图书,增加会员,会员查询,删除会员,借阅图书,归还图书,借书信息,到期书催还。
最后编写退出系统的函数。
在具体编写程序时考虑到图书的相关操作与会员基本相同,所以实际上只要编写前三个函数,后面的函数把相应变量改变就可以了。
添加图书:
考虑到图书的信息较多,所以用结构体对其定义。
又考虑到图书量大,所以添加后要保存到文件中去。
图书查询:
用所学过的顺序查找法来写。
删除图书:
把保存到文件中的内容写到链表中去,用链表删除结点的方法来删除图书。
我们所学过的指针这时正好用上。
最后把各函数同主函数相连,用主函数调用它们,编写好好看的界面就可以了。
同时通过这几天的程序及报告编写,我也发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还是比较脆弱。
尤其是编写大型的程序所要拥有的知识和技能比较缺乏。
程序编好了,还要经过调试和修改,这步也很关键,好的程序是经过了无数次的修改和调试才产生的。
我的程序基本上能够满足要求,但还有一些地方需要改进,在今后我应该在多看书的同时还要加强实践的练习。
才能进一步提高自己的编程能力。
最后,还要感谢我们实验室指导老师的细心指导、热心帮助。
路漫漫其修远兮,虽然本学期数据结构课程结束了,但仍觉得自己还有很多东西要学,我会在自己在以后的学习生活中不断努力、不断提高,争取更大的进步。
参考文献
[1]闵联营,何克右.《C++程序设计教程》.武汉理工大学出版社;
[2]严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社;
[3]张文祥,肖四友.《C++实验与案例分析》.科学出版社;
[4]谭浩强.《C++程序设计》.清华大学出版社;
[5]朱战立.《数据结构(C++语言描述)》(第二版本).高等教育出版社。
致谢
在编写程序的过程中,我们得到了卢鹏丽老师的精心指导以及孜孜不倦的教诲,在老师的指导下,我们的能力得到了提高,同时养成了科学、严谨的作风和习惯,在此,我们对老师的精心栽培表示衷心的感谢!
感谢我们小组同学对我的帮助和指点,尤其感谢我的舍友在非常时期,在生活和学习上帮我许多忙。
在课设即将完成之际,我的心情无法平静,从开始进入课题到课设的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意.
附件Ⅰ部分源程序代码
#include
#include
#include
#include
#include
#include
#include
#defineMAX100
#defineMAX12//本科生最大借阅量
#defineMAX25//研究生最大借阅量
#defineMAX310//教师最大借阅量
#defineMAX4100//管理员最大借阅量
//书的结构体
typedefstructbook
{
floatprice;//图书单价
intmembernum;//借书人编号
charname[80];//图书名
longnum;//图书编号
charwritername[20];//作者姓名
charpublish[30];//出版社名称
intyes;//判断书是否存在或者已经借出,1存在,0借出
structbook*next;//结点指针
}Book,*BookList;
//借书时间结构体
typedefstructTime
{
intyear;
intmonth;
intday;
}data;
//会员借的书的结构体
typedefstructBorrowBook
{
longnum;//借的书的编号
structTimetime;//借书时间
structTimeborrowtime;//借书期限
}BBook;
//会员的结构体
typedefstructmember
{
charname[20];//会员姓名
charsex;//会员性别,男m,女f
longnum;//会员编号
intstyle;//会员类型,1:
本科生;2:
研究生;3:
教师;4:
管理员;
intmax;//会员借书数目,初始为0
intyes;//会员是否借书,1是,0否
BBookt[MAX];//会员借的书的数组
structmember*next;//结点指针
}Member,*MemberList;
//查询图书
intSearch_BookName(BookList&H)//按书名查询
{
Book*p;
p=H->next;
charn[80];
intflag=0;
cout<<"○输入要查询的书名:
";
cin>>n;
for(;p!
=NULL;p=p->next)
{
if(strcmp(p->name,n)==0)
{
if(flag==0)
cout<cout<<""<name<<""<num<price<writername<publish;
if(p->yes==1)
cout<else
cout<flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<if(p==NULL&&flag==0)
{
cout<<"※没有相关信息!
※"<cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<}
return1;
}
//增加图书
Book*Init_B()//初试化图书链表
{
Book*H;
H=(Book*)malloc(sizeof(Book));
if(!
H)exit
(1);
H->next=NULL;
returnH;
}
intBookAdd(BookList&H)//建立一个带头结点的链表用来存储图书信息
{
inti=0;//统计要增加的图书量
Book*p,*q;
p=(Book*)malloc(sizeof(Book));
if(!
p)exit
(1);
if(H->next==NULL)
{
cout<<"○输入图书编号:
";
cin>>p->num;
if(p->num==0)//退出"增加图书"
{
cout<<"共计"<
"<cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<return1;
}
cout<<"○输入书名:
";
cin>>p->name;
cout<<"○输入图书价格:
";
cin>>p->price;
cout<<"○输入作者姓名:
";
cin>>p->writername;
cout<<"○输入出版社名称:
";
cin>>p->publish;
p->yes=1;//1表示没有借出
p->next=NULL;
H->next=p;
q=p;
++i;
cout<}
else
{
q=H;
while(q->next!
=NULL)
q=q->next;
p->num=1;//进入循环的条件
p->next=NULL;
}
while(p->num!
=0)//以图书编号作为判断链表是否结束
{
p=(Book*)malloc(sizeof(Book));
if(!
p)exit
(1);
cout<<"○输入图书编号:
";
cin>>p->num;
if(p->num==0)//退出"增加图书"
{
cout<<"共计"<
"<cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<break;
}
cout<<"○输入书名:
";
cin>>p->name;
cout<<"○输入图书价格:
";
cin>>p->price;
cout<<"○输入作者姓名:
";
cin>>p->writername;
cout<<"○输入出版社名称:
";
cin>>p->publish;
p->yes=1;//1表示没有借出
p->next=NULL;
q->next=p;
q=p;
++i;
cout<}
return1;
}
//查询图书方式
intSearch_BookNum(BookList&H)//按编号查询
{
Book*p;
p=H->next;
longn;
intflag=0;
cout<<"○输入要查询的书的编号:
";
cin>>n;
for(;p!
=NULL;p=p->next)
{
if(n==p->num)
{
if(flag==0)
cout<cout<<""<name<<""<num<price<writername<publish;
if(p->yes==1)
cout<else
cout<flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<if(p==NULL&&flag==0)
{
cout<<"※没有相关信息※!
"<cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<}
return1;
}
intSearch_BookWritername(BookList&H)//按作者名查询
{
Book*p;
p=H->next;
intflag=0;
charn[30];
cout<<"○输入要查询的书的作者名:
";
cin>>n;
for(;p!
=NULL;p=p->next)
{
if(strcmp(p->writername,n)==0)
{
if(flag==0)
cout<cout<<""<name<<""<num<price<writername<publish;
if(p->yes==1)
cout<else
cout<flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<if(p==NULL&&flag==0)
{
cout<<"※没有相关信息!
※"<cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<}
return1;
}
intSearch_Publish(BookList&H)//按出版社查询
{
Book*p;
p=H->next;
intflag=0;
charn[50];
cout<<"○输入要查询的书的出版社名称:
";
cin>>n;
for(;p!
=NULL;p=p->next)
{
if(strcmp(p->publish,n)==0)
{
if(flag==0)
cout<cout<<""<name<<""<num<price<writername<publish;
if(p->yes==1)
cout<else
cout<flag=1;
continue;
}
}
cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<if(p==NULL&&flag==0)
{
cout<<"※没有相关信息!
※"<cout<<"┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈"<}
return1;
}
intSearch_AllB(BookList&H)//查询所有图书信息
{
Book*p;
p=H->next;
inti=0,flag=0;
for(;p!
=NULL;p=p->next)
{
if(flag==0)
cout<cout<<""<name<<""<num<price<writername<publish;
if(p->yes==1)
cout<else
cout<