图书借阅管理.docx
- 文档编号:11543815
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:28
- 大小:272.47KB
图书借阅管理.docx
《图书借阅管理.docx》由会员分享,可在线阅读,更多相关《图书借阅管理.docx(28页珍藏版)》请在冰豆网上搜索。
图书借阅管理
目录
摘要2
前言3
正文4
1.问题描述4
2.逻辑设计5
3.详细设计7
4.程序编码11
5.程序调试与测试21
6.结果分析22
7.软件安装和使用说明26
设计总结27
参考文献28
致谢29
摘要
数据结构是计算机科学及相关专业的重要核心课程。
要完成图书管理基本业务,如果采用数据结构的算法,它能使我们的能够更好的对图书馆进行管理。
图书管理系统是智能办公系统(IOA)的重要组成部分,因此,图书管理系统也以方便、快捷的优点正慢慢地进入人们的生活,将传统的图书管理方式彻底的解脱出来,提高效率,减轻工作人员以往繁忙的工作,减小出错的概率,使读者可以花更多的时间在选择书和看书上。
从而使人们有更多时间来获取信息、了解信息、掌握信息。
其开发主要运用数据结构和C语言两个方面。
采用VisualC++编程语言作为开发工具,主要完成读者管理、借阅管理、图书管理、用户维护、系统维护等系统功能。
系统运行结果证明,本文所设计的图书管理系统可以满足借阅者、图书管理员两方面的需要,达到了设计要求。
关键词:
数据结构;算法;图书借阅管理
前言
随着计算机及网络技术的飞速发展,Internet的应用在全球范围内日益普及,当今社会正快速向信息化社会前进,信息系统的作用也越来越大。
图书馆在正常运营中总是面对大量的读者信息,书籍信息以及由两者相互作用产生的借书信息,还书信息。
因此图书管理信息化是发展的必然趋势。
用结构化系统分析与设计的方法,建立一套有效的图书信息管理系统,可以减轻工作,将工作科学化、规范化,提高了图书馆信息管理的工作质量因此根据图书馆目前实际的管理情况开发一套图书管理系统是十分必要的。
图书借阅管理系统是一个学校不可缺少的部分,它的内容对于学校的管理者和读者来说都至关重要,直接关系到图书的借用率,所以开发图书管理系统能够为管理员和读者提供充足的信息和快捷的查询手段。
正文
1.问题描述
图书借阅管理是图书馆一个最基本的工作系统主要实现图书信息和学生信息的管理,图书查询及图书借阅管理
图书管理系统要求使用数据结构编程进行模拟课程设计。
要声明一个图书、管理员和读者结构,在图书结构中,包括对图书的录入、借出、归还、显示和查询。
在管理员结构中,包括新增,删除和查询选项,修改管理员,读者和删除管理员、读者。
要实现以下六个功能:
①采编入库:
新购入一种书,如果该书在图书账目中已经存在,则将其库存量增加(包括总库存量和现库存量),如果该书不存在,则在图书账目中增加一种书,总库存量和现库存量均为
②清空库存:
某一种书已无保留价值,将它从图书账目中注销。
③图书借阅:
如果一种书的现库存量大于零,则借出一本书,将现库存量减1,并登记借阅者的图书证号和归还期限。
④图书归还:
注销对借阅者的登记,改变该书的现存量。
⑤图书查找:
实现按三种查询条件之一查找:
按书号查找、按书名查找、按作者查找。
注:
可不实现组合查找,即几个条件组合查找。
⑥显示信息:
显示借阅者的借书情况。
2.逻辑设计
1.功能模块图
图书管理系统
图书管理模块
理
读者管理模块
借阅操作模块
信息查询模块
借书系统
读者信息查询
图书信息查询
输入读者信息
还书系统
采编入库
初始化图书信息
图1系统功能模块图
2.功能模块定义
(1)main函数的设计:
调用主菜单函数显示需要选择的操作。
(2)查看某借书证号借阅的全部图书和全部超期未还的图书ViewCard()、ViewBook()。
(3)图书信息管理模块包括5个函数:
Buy()、Delete()、SearchByNum()、SearchByAuth()、SearchByName()
函数Buy()用来实现采编新书。
函数Delete()用来实现删除无保留价值的书。
函数SearchByNum()用书的编号查询图书信息。
函数SearchByAuth()用作者查询图书信息。
函数SearchByName()用书名来查询图书信息。
(4)图书借阅管理模块包括2个函数:
Borrow()和Return()函数。
函数Borrow()用来实现借书管理。
由学生类型定义可知,每个学生有5张借书卡,借书卡的信息包括:
借阅标记、所借图书的书号和借阅时间。
借书时,首先查找学生是否有空闲的借书卡(即判断该生借书卡的借阅标记flag是否为0),若flag为0,则可以借书,这时要求学生输入要借图书的书号,然后在图书数组book中查找该书,若在数组book中没找到该书,则提示“输入的书号有误,请重新输入!
”;若找到该书,则先判断该书的库存量是否为0,若库存量为0则提示"抱歉!
该书库存量为0,无法借阅!
”。
若库存量大于0,则将该书借给学生。
我们还能需要使用其中的3个成员:
tm_year、tm_mon和tm_mday。
通过调用函数_getsystime(&d);可以得到系统时间,假设用下面语句输出日期:
printf("%d.%d.%d",d.tm_year,d.tm_mon,d.tm_mday);
若借书日期是1998.5.12,则会输出98.4.12,若借书日期为2005.5.12,则会输出105.4.12,这样的输出结果显然不好,为了正确输出1998.5.12或2005.5.12,必须对成员tm_year和tm_mon进行处理,对于tm_mon的处理比较简单,直接加1即可(d.tm_mon+1),对于tm_year按下面方法处理:
如果年份整除100等于0(即年份<2000),则年份=1900+d.tm_year;如果年份整除100等于1(即年份>=2000),则年份=2000+d.tm_year%100。
最后提示用户借书成功。
(5)用二分法查找比较书号BinarySearch()
3.各程序模块之间的调用关系
从上面每个方法差不多也可以知道每个方法之间的关系了。
入库之前,我们也需要将已经入库的图书和已经注册好的学生信息读取到内存中,以便后面的操作。
入库图书后,需要voidsave(),之后还要voidreadBook()也就是更新图书信息。
借书和还书的过程都是将图书和学生联系起来,每次借书时都需要同时更新图书的信息和学生的信息,借了书后,学生的记录中应该保存了他所借的书证号以及要还书的日期,而此时图书的信息也要相应的改变,借出后图书的数量或书目上要体现出来。
3.详细设计
1.数据结构设计
系统共定义了四个结构体类型,包括借书行为类型、借书人类型、借书证类型、图书信息类型,定义如下:
typedefstructBoro//借书行为类型
{charBNum[20];//借书的书号
charRetDate[8];//归还日期
structBoro*next;
}Bor;
typedefstructLinkBook//借书人类型
{Bor*next;//该借书证的借书行为
charCNum[20];//证号
intTotal;//借书的数量
}lend[LIST_INIT_SIZE];//借书人
typedefstructLNode//借书证类型
{charCardNum[20];//借书证号
structLNode*next;
}LinkList;
typedefstructbook//图书的结构体信息
{charnum[20];//书号
charname[20];//书名
charauth[20];//作者
charpub[20];//出版社
intTotNum;//总库存
intNowNum;//现库存
LinkList*next;//借了该书的人
}ook[MAXSIZE];
系统定义了两个全局变量数组,分别存放图书信息和借书证信息,因数组大小是固定的,为使用方便在系统中定义两个符号常量,具体定义如下:
#defineMAXSIZE100//最大值定义为100
#defineLIST_INIT_SIZE100//借书证使用者最大值定义为100
intRetotal;//读者数量
inttotal;//定义外部变量.书的种类数
2.函数流程图
初始化、定义主菜单、分支菜单指针数组及变量
读键盘按键的键值
判断键值并弹出对应菜单
Y
用户按了0键吗?
N
根据按键执行菜单选项对应的函数
N
从被调用函数中返回并转移
退出管理系统
图2系统主函数流程图
图3图书借阅流程图
图4图书归还流程图
3.函数的伪码算法
用二分法查找比较书号BinarySearch()
boolBinarySearch(ookboo,charSearchNum[])//二分法查找比较书号
{//用bool函数,但由于函数不能有两个返回值,所以设置一个外部变量mid,用来返回查找到的位置
intlow=0,high=total-1;
intfound=0;
while(low<=high)
{mid=(low+high)/2;//中间点
if(strcmp(boo[mid].num,SearchNum)==0)//书号相同
{
found=1;
returntrue;
}//查找成功
if(strcmp(boo[mid].num,SearchNum)!
=0)//书号不同
high=mid-1;
elselow=mid+1;
}
if(found==0)
returnfalse;//查找失败
}
4.程序编码
#include
#include
#include
#defineMAXSIZE100//最大值定义为100
#defineLIST_INIT_SIZE100//借书证使用者最大值定义为100
typedefstructBoro//借书行为
{charBNum[20];//借书的书号
charRetDate[8];//归还日期
structBoro*next;
}Bor;
typedefstructLinkBook
{Bor*next;//该借书证的借书行为
charCNum[20];//证号
intTotal;//借书的数量
}lend[LIST_INIT_SIZE];//借书人数组
typedefstructLNode
{charCardNum[20];//借书证号
structLNode*next;
}LinkList;//借书人
typedefstructbook//图书的结构体信息
{charnum[20];//书号
charname[20];//书名
charauth[20];//作者
charpub[20];//出版社
intTotNum;//总库存
intNowNum;//现库存
LinkList*next;//借了该书的人
}ook[MAXSIZE];
intRetotal;//读者数量
inttotal;//定义外部变量.书的种类数
voidInitBo(ook&boo)//初始化图书信息
{for(inti=0;i 结构体初始化 {boo[i].NowNum=0; boo[i].TotNum=0; boo[i].next=NULL;} } voidInitRe(lend&Lin)//初始化借阅者信息 {for(inti=0;i Lin[i].next=NULL; } intmid=0;//外部函数mid,用来返回查找到的位置 boolBinarySearch(ookboo,charSearchNum[])//二分法查找比较书号 {intlow=0,high=total-1; intfound=0;//用bool函数,但由于函数不能有while(low<=high)//两个返回值,所以设置一个外部变量 {mid=(low+high)/2;//中间点//用来返回查找到的位置 if(strcmp(boo[mid].num,SearchNum)==0)//书号相同 {found=1; returntrue; }//查找成功 if(strcmp(boo[mid].num,SearchNum)! =0)//书号不同 high=mid-1; elselow=mid+1; } if(found==0) returnfalse;//查找失败 } voidBuy(ook&boo,charBuyNum[]) {if(BinarySearch(boo,BuyNum))//如果书库中有此书 {boo[mid].TotNum++;//总库存加1 boo[mid].NowNum++;//现库存加1 printf("入库成功.\n"); printf("已更改书库中该书的信息。 编号%s的书%s作者是%s,出版社是%s,目前的总库存是%d,现库存是%d。 \n",boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].TotNum,boo[mid].NowNum); } if(! BinarySearch(boo,BuyNum)) {inti; for(i=total;i>mid&&total;i--)//插在适合位置保持有序 boo[i]=boo[i-1];//空出插入位置 printf("该书在书库中不存在。 设立新书目,请补全书的详细信息。 \n"); strcpy(boo[i].num,BuyNum); printf("该书购入的数量是: "); scanf("%d",&boo[i].NowNum);//采编入库: 新购入一种书,如果该 boo[i].TotNum=boo[i].NowNum;//书在图书账目中已经存在,则将其 printf("该书的名字是: ");//库存量增加(包括总库存量和现库存量), scanf("%s",&boo[i].name);//如果该书不存在,则在图书账目中增加printf("该书的作者是: ");//一种书,总库存量和现库存量均为1。 scanf("%s",&boo[i].auth); printf("该书的出版社是: "); scanf("%s",&boo[i].pub);//补全信息 boo[i].next=NULL; total++;//总量+1 printf("已增加该书的信息。 编号%s的书%s作者是%s,出版社是%s,目前的总库存是%d,现库存是%d。 \n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum); printf("入库成功.\n"); } } voidDelete(ook&boo,charDeleteNum[]) {if(BinarySearch(boo,DeleteNum)==false||total==0)//如果无此书 printf("书库中没有该书.\n"); if(BinarySearch(boo,DeleteNum))//若有 {if(! boo[mid].next) {intj; for(j=mid;j boo[j]=boo[j+1]; strcpy(boo[j].num,boo[j+1].num); strcpy(boo[j].name,boo[j+1].name); strcpy(boo[j].auth,boo[j+1].auth); strcpy(boo[j].pub,boo[j+1].pub); boo[j].TotNum=boo[j+1].TotNum; boo[j].NowNum=boo[j+1].NowNum; printf("已成功删除该书.\n");//注释: 清空库存: 某一种书已无保留价值,将 }//它从图书账目中注销。 elseprintf("该书有借阅者,无法删除。 \n"); } } voidBorrow(ook&boo,lend&Lin,charBorrowNum[],charCaNum[]) {Bor*p,*q; LinkList*m,*n; if(! BinarySearch(boo,BorrowNum)||total==0)//如果没有找到此书 printf("书库里没这书。 \n");//如果有这书 if(BinarySearch(boo,BorrowNum))//书库里有 {if(boo[mid].NowNum>0)//看现库存是否大于0 {boo[mid].NowNum--;//借出一本,少1 if(boo[mid].next==NULL)//若该书信息下显示该种书还没被人借过 {m=(LinkList*)malloc(sizeof(LNode));//分配 boo[mid].next=m;//该图书信息中的链表的第一个结点 strcpy(m->CardNum,CaNum); m->next=NULL;//后一个结点为空 } else//如果已经有人在借这书了 {m=boo[mid].next; while(m->next)//遍历到最后一个结点 m=m->next; n=(LinkList*)malloc(sizeof(LNode));//分配空间,增加1个结点 m->next=n; strcpy(n->CardNum,CaNum);//记录证号 n->next=NULL; } inti=0; for(i=0;i {if(! strcmp(Lin[i].CNum,CaNum))//如果已经有该图书证的信息 {p=Lin[i].next; while(p->next)p=p->next;//遍历到最后一个结点 q=(Bor*)malloc(sizeof(Boro));//分配空间 p->next=q; strcpy(q->BNum,BorrowNum);//记录书号 printf("输入归还日期: "); scanf("%s",&q->RetDate); q->next=NULL; printf("借阅成功.\n"); break;//找到证了就跳出循环 }//注释: 借阅: 如果一种书的现库存量大于零,则借出一本书,将现库存量减1, }//并登记借阅者的图书证号和归还期限。 if(i==Retotal)//如果没有这张证的信息 {strcpy(Lin[i].CNum,CaNum);//记录证号 p=(Bor*)malloc(sizeof(Boro));//分配空间 Lin[i].next=p; strcpy(p->BNum,BorrowNum); printf("输入归还日期: "); scanf("%s",&p->RetDate); p->next=NULL; Retotal++;//借阅证号信息总数加1 printf("借阅成功.\n"); } } elseprintf("借阅失败.该书现在库存为0.\n"); } } voidReturn(ook&boo,lend&Lin,charReturnNum[],charBorrowerNum[]) {Bor*p,*q; LinkList*m,*n; intflag=0;//设置一个参数 if(! BinarySearch(boo,ReturnNum)||! total)//没书 printf("书库中无此书.\n"); if(BinarySearch(boo,ReturnNum))//有书 {m=boo[mid].next; if(! strcmp(m->CardNum,BorrowerNum))//如果是第一个借的人还的 {boo[mid].NowNum++;//现库存加1 boo[mid].next=m->next;//删除结点 free(m);//释放该结点的空间空间 } else {while(m->next)//查找归还者的借阅者结点 {if(! strcmp(m->next->CardNum,BorrowerNum))//如果找到 {n=m->next;//n为归还者的借阅结点 m->next=n->next;//m指向归还者的借阅结点的下一结点 free(n);//释放空间 boo[mid].NowNum++;//现库存加1 break; } m=m->next; } } }//在借阅者表里查找借阅者信息 for(inti=0;i {if(! strcmp(Lin[i].CNum,BorrowerNum))//如果找到借阅者 {p=Lin[i].next; if(! strcmp(p->BNum,ReturnNum))//如果是归还的是借的第一本书 {Lin[i].next=p->next;//指向下一借书结点 free(p);//释放结点空间 printf("成功归还该书.\n"); flag=1; break; } else//找不到 {while(p->next)//找到归还书的借书结点 {if(! strcmp(p->next->BNum,ReturnNum))//如果找到 {q=p->next;//q为归还书的借书结点 p->next=q->next;//p指向下一借书结点 free(q);//释放空间 printf("成功归还该书.\n"); flag=1; break; } p=p->next; } } } } for(intk=0;k if(! Lin[k].next) {intj; for(j=k;j Lin[j]=Lin[j+1];//其后都往前移一位,覆盖掉当前信息 strcpy(Lin[j].CNum,"");//删除图书证号 Retotal--;//图书证数减1 }//删除当前状态下没借书的图书证的信息,节省空间 if(flag==0)printf("无该证信
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 借阅 管理