1、数据结构课程设计报告题目:6。3图书管理学 院 计算机学院专 业 软件工程年级班别 2012级2班 学 号 3112006200学生姓名 林迅玄指导教师 李藜 难度选做独立完成率自评 5有成 绩 2014年7月1日一、需求分析【设计任务描述】设计一个计算机管理系统完成图书管理基本业务.图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。【输入的形式和输入值的范围】进入管理界面输入整型数据07选择需要的操作书号、现存量、总存量为大于零的整型数据,输入值的范围由系统整型数据范围而定。书名、作者名、出版社名称为字符串类型数据,长度不大于20。借书证号码,归还时间均先由字符串输入再
2、由函数转换为整型数据,借书证号码长度不大于5位字符,归还时间长度不大于8位。【程序所能达到的主要功能】1. 图书信息录入功能:每种书的登记内容包括书号、书名、著作者、出版社名称、现存量和总存量等。2. 图书查询功能:分别可按书号、书名、作者、出版社名称查询图书,还可查询图书的当前借阅信息。3. 排序功能:对书库中的图书按书号排序。4. 图书修改功能:对选定图书信息进行修改.5. 图书删除功能:某本书已无保留价值,将其从书库中注销。6. 图书借阅功能:若图书现存量大于零,登记借阅者图书证号和归还日期,图书现存量减1.7. 图书归还功能注销对借阅者的登记,改变该书的现存量.【测试数据】输入1进入图
3、书录入信息:输入需要录入的图书信息的个数,依次录入以下信息书号书名作者出版社名称现存量总存量1weg554xhj447yez992sap16166rej10108ift20203dfg18185clg171711mlg13139qat141410bop88成功则输出“录入成功错误则输出“此图书已存在!”、“请重新输入输入2进入图书查询:1. 按书号查询输入2成功则输出书号书名作者出版社名称现存量总存量2sap1616错误则输出“对不起,不存在此图书!”2. 按书名查询 输入c 成功则输出书号书名作者出版社名称现存量总存量5clg1717错误则输出“对不起,不存在此图书!3. 按作者名查询 输入
4、e 成功则输出书号书名作者出版社名称现存量总存量1weg556rej10107yez99 错误则输出“对不起,不存在此作者的图书!4。按出版社名称查询 输入g 成功则输出书号书名作者出版社名称现存量总存量1weg553dfg18185clg171711mlg1313错误则输出“对不起,不存在此出版社出版的图书!”输入4进入图书修改 输入w 正确则重新录入该书信息书号书名作者出版社名称现存量总存量1weg66 错误则输出“不存在此图书”输入5进入图书删除 输入d 成功则输出“删除成功” 错误则输出“你输入的书名不存在,请核实后重新输入!”输入3进入图书排序 输出书号书名作者出版社名称现存量总存量
5、1weg662sap16164xhj445clg17176rej10107yez998ift20209qat141410bop8811mlg1313输入6进入图书借阅 输入w 成功则继续输入 错误则输出“此图书不存在!输入15成功则继续输入 错误则输出“输入有误,请重新输入 输入20140101 成功输出“借书成功! 错误则输出“此图书不存在!”、“不好意思,此书已借完!、“你已经借了 这本书,不能够重复借!”输入6进入图书借阅 重复输入w 17 20140715 w 25 20141109输入2进入图书查询 输入2按书名查询输入w成功则输出书号书名作者出版社名称现存量总存量1weg36错误则
6、输出“对不起,不存在此图书!”输入2进入图书查询 输入5查询图书借阅信息输入w成功则输出借阅者图书证号归还时间152014010117201407152520141109错误则输出“不存在此图书”输入7进入图书归还 输入w 成功则继续输入 错误则输出“此图书不存在!”输入17成功则输出“该书归还成功!”错误则输出“你输入的图书证号不正确!请重 新操作!”输入2进入图书查询 输入5查询图书借阅信息输入w成功则输出借阅者图书证号归还时间15201401012520141109错误则输出“不存在此图书”输入0退出系统成功则输出“谢谢使用二、 概要设计所用数据结构:线性表、查找、排序借阅者的存储结构体
7、数据类型是无表头单链表.typedef struct User /借阅者的存储结构体 int number; /借书证号码 int limitdate; /归还时间 struct User next; /下一个借阅者User; /定义用户的的信息图书信息的存储结构是带表头单链表.typedef struct int num; /图书的书号 char name20; /书名 char author20; /著者 char press20; /出版社名称 int left; /现存量 int count; /总存量 User user; /借阅该书的人ElemType; /定义书的信息typede
8、f struct LNode /定义单链表结点类型ElemType data; struct LNode next; LinkList;主程序流程以及各程序模块之间的调用关系:主程序模块图书管理系统借阅者信息模块图书信息的录入添加图书信息的查询模块图书信息的排序模块图书信息的修改模块图书信息的删除模块图书的借阅模块图书的归还模块退出图书管理系统开始输入功能所对应的数字输入的数字小于0大于7执行所选功能 N Y重新输入 1。图书信息录入功能输入需要录入的图书信息的个数n循环输入n个图书信息是否有此图书向系统录入此书信息 Y Y N 2. 图书查询功能选择查询方式输入的数字小于0大于6执行所选功能
9、 Y N按书号查询遍历书库查找输出书本信息不存在此书 1. N Y按书名查询遍历书库查找输出书本信息不存在此书 2。 N Y按作者查询遍历书库查找输出书本信息不存在此作者的书 3。 N Y按出版社查询遍历书库查找输出书本信息不存在此作者的书 4. N Y查询图书借阅信息遍历书库查找输出借阅信息不存在此书 5。 N Y返回6。按书号递增有序排序(直接插入排序法)3. 图书排序功能输入书名遍历书库查找修改书本信息不存在此书4. 图书修改N Y输入书名遍历书库查找删除书本信息不存在此书5. 图书删除N Y6。图书借阅输入书名遍历书库查找登记信息不存在此书是否可借借出失败NY Y N输入书名遍历书库查
10、找注销信息归还不存在此书是否借过此书归还失败7.图书归还 N Y N Y三、 详细设计原理:图书管理系统要求实现许多的功能.将软件的设计任务分成许多小的功能模块进行设计。本程序经过分析分成以下几个子任务:图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。伪码算法:主程序:(1) 创建单链表L,分配内存并置空;(2) 输出选择菜单;(3) 输入选择操作数s;(4) Switch(s)执行所选操作;图书录入功能:(1) 输入需要录入的图书信息的个数n;(2) For(i=1;i=n;i+)n次循环建立新结点s输入图书信息num、
11、name、author、press、left、count;(3) if(s存在L) 重新输入;(4) else 录入成功;图书查询功能:(t=书号、书名、作者、出版社,p=Lnext)(1) 输入k(与t对应);x=0;(2) While(若原单链表中有数据结点) if(k不等于p的t)p指向下一个结点; else 输出p的信息为所找信息并指向下一个结点,x+; Endwhile(3) if(p为空x为0)查询k不存在;查询图书借阅信息:(1) 输入k(书名);p=L-next;x=0;(2) while(p不为空) if(k不等于p的书名) p指向下一个结点; else user指向p的第一
12、个借阅者信息结点; for(;user不为空;user指向下一个结点) 循环输出借阅者图书证号和归还时间 x加1; p指向下一个结点; Endelse Endwhile(3)if(p为空&x=0)不存在此图书;图书排序功能:(直接插入排序法)(1) p指向L第一个数据结点;(2) if(若原单链表中有数据结点) r保存p结点直接后继结点的指针; p后继指针置空,构造只含一个数据结点的有序表L; While(r不为空) 将r中的结点按递增顺序插入L中; Endwhile Endif图书修改功能:(1)输入k(书名);p指向L第一个数据结点;(2)While(若原单链表中有数据结点) if(k等于
13、p的书名)p修改信息并返回; p指向下一个结点; Endwhile;(3) 输出图书不存在;(4) 返回;图书删除功能:(1)输入k(书名);p指向L第一个数据结点;q指向p前驱结点;(2)while(p不为空k不等于p的书名) p,q各自指向下一个结点;(3) if(p不是最后的结点)q指向p的下一个结点,删除成功;(4) if(p是最后的结点&k不等于p的书名)书名不存在;(5) else q下一个结点置空,删除成功;图书借阅功能:(1) 输入k(借阅书名);p指向L第一个数据结点;(2) while(p不为空&k不等于p的书名) p指向下一个结点;(3) if(p是最后的结点&k不等于p
14、的书名)书名不存在;(4) else if(p书现存量小于1)此书已借完!;(5) else 注册借阅者信息结点s(图书证号和归还日期); if 1(p图书尚无人借阅) 借书成功;p结点的借阅者信息结点保存s;现存量减1; else 1 u保存p结点的第一个借阅者信息结点; while(u不为空u的图书证号不等于s的图书证号) u指向下一个结点; if 2(u为空&u的图书证号不等于s的图书证号) 借书成功;u下一个结点结点保存s;现存量减1; else if(u的图书证号等于s的图书证号)不能够重复借; Endelse 1 Endelse图书归还功能(1)输入k(归还书名);p指向L第一个数
15、据结点;(2)while(p不为空&k不等于p的书名) p指向下一个结点;(3) if(p是最后的结点k不等于p的书名)书名不存在;(4) else if(k等于p的书名) 输入图书证号n; user指向p的第一个借阅者信息结点; if 1(n等于p的第一个借阅者信息结点的图书证号) 归还成功;p的第一个借阅者信息结点指向下一个结点;现存量加1; else 1 while(user后继指针不为空&user的图书证号不等于n) pre保存user指针; user指向下一个结点; Endwhile if(user的图书证号等于n) 归还成功;pre的第一个结点指向user的下一个结点;现存量加1;
16、 else 输入图书证号不正确,重新操作; Endelse 1 Endelse函数调用关系图mainSwitch()()CreateListR(L)Search(L)Sort(L);Display(L);ModifyList(L);ListDelete(L);Borrow(L); Return(L);InitList(L)InUserMess(user)四、 调试分析(一) 问题:录入图书信息后,输出图书信息时有些项目输出乱码。采取的措施:检查代码在输入语句中,定义为int型的项目在输入语句中加上取地址符号“”。(二)问题:添加图书信息,虽然显示“录入成功!”,但是实际上并没有与之前已经存在的
17、图书信息存放在一起。采取的措施:修改录入添加图书信息的算法,修改结点的指向,使之后添加的图书信息与之前已经存在的图书信息存放在一起.(三)问题:多个借阅者借阅同一本图书,借阅成功后查询该书借阅者信息,发现只有最新的借阅者信息。采取的措施:修改借阅信息插入算法,修改结点指针指向,使之不会有旧结点被新结点覆盖的情况发生。算法时空分析基本操作时间复杂度CreateListR(L)O(n)O(mn)Search(L)O(n)Sort(L)O(n)O(n2)Display(L)O(n)ModifyList(L)O(n)ListDelete(L)O(n)Borrow(L)O(n)Return(L)O(n)
18、由上表知除录入和排序函数,其它函数的时间复杂度都是O(n),但录入函数是受录入图书信息个数m影响,因此在录入一种书的信息时的时间复杂度也是O(n);此外排序函数在时间复杂度O(n)O(n2)之间仍有改进的空间,这需要算法的改进,这也是需要继续努力学习的方面.心得与体会选择了“图书管理系统这个课题。程序的大部分函数的算法在很短的时间内就差不多写好了,可是在调试的过程中却发现了不少问题。譬如录入图书的信息后,在进行图书信息排序时有些项目的输出会出现乱码。仔细检查后才发现在录入int型的数据时,没有添加取地址符号。还有在信息录入的过程中,程序也出现了漏洞。添加图书信息,虽然显示“录入成功!”,但是实
19、际上并没有与之前已经存在的图书信息存放在一起。最后修改了录入图书信息的算法,修改了结点的指向,使之后添加的图书信息与之前已经存在的图书信息存放在一起.多个借阅者借阅同一本图书,借阅成功后查询该书借阅者信息,发现只有最新的借阅者信息。修改借阅信息插入算法,修改结点指针指向,使之不会有旧结点被新结点覆盖的情况发生。在整个课程设计的过程中,遇到了很多困难,花费了很多时间去解决,也让我深刻体会到要圆满完成一个程序的不易.大到算法,小到一个符号,都会影响整个程序的执行状况。这也警惕我要注意细节.五、 用户使用说明开发软件环境: 操作系统为XP 开发环境软件为Ms visual C+6。0 开发语言为C语
20、言程序运行说明:登入界面后输入07选择需要执行的操作;选择1图书录入则输入需要录入的图书信息的个数n,然后依次录入图书信息,输出录入成功即可继续;选择2图书查询输入0-6选择需要执行的操作; 选择1按书号查询 输入书号即可 成功则输出该书信息; 选择2按书名查询 输入书名即可 成功则输出该书信息; 选择3按作者查询 输入作者即可 成功则输出书库中该作者的所有著作; 选择4按出版社查询 输入出版社即可 成功则输出书库中该出版社出版的所有书籍; 选择5查询图书借阅信息 输入书名即可 成功则输出该书当前所有借阅者的信息(图书证号和归还日期);选择3图书排序 程序自动将书库中的书按书号排序输出;选择4
21、图书修改 输入书名 成功则依次输入该书更新后的信息,成功后系统便会更新信息;选择5图书删除 输入书名即可 成功则在书库中注销该书的信息;选择6图书借阅 输入书名 成功则登记借阅者信息 输入图书证号和归还日期,若信息正确和该书现存量大于0,则借阅成功,该书现存量减1,并将该借阅者信息录入该书借阅信息中;选择7图书归还 输入书名 成功则输入图书证号 若信息正确则该书现存量加1,注销该图书证号在该书借阅信息中的信息;选择0退出系统。六、 测试结果程序运行开始界面按照测试数据的步骤进行:选择1。图书信息录入功能输入需要录入的图书信息个数n=11;依次按照测试数据输入11个图书信息选择2图书查询功能选择
22、1按书号查询输入书号2继续选择2图书查询功能 选择2按书名查询 输入书名c继续选择2图书查询功能 选择3按作者查询输入作者名e继续选择2图书查询功能 选择4按出版社查询输入出版社名称g选择4图书修改功能输入要修改的书名w按照测试数据输入修改信息选择5图书删除功能输入要删除的书名d选择3图书信息排序功能选择6图书借阅输入要借阅的图书w输入图书证号15输入归还日期20140101重复选择6输入w 17 20140715 w 25 20141109选择2图书查询功能 选择5查询图书借阅信息输入书名w选择7图书归还输入归还书书名w输入图书证17选择2图书查询功能 选择5查询图书借阅信息输入图书名w七、
23、 附录head。h /头文件includestdio。hincludeinclude#define TRUE 1define FALSE 0typedef struct User /借阅者的存储结构体 int number; /借书证号码 int limitdate; /归还时间 struct User *next; /下一个借阅者User; /定义用户的的信息typedef struct int num; /图书的书号 char name20; /书名 char author20; /著者 char press20; /出版社名称 int left; /现存量 int count; /总存量
24、 User user; /借阅该书的人ElemType; /定义书的信息typedef struct LNode /定义单链表结点类型ElemType data; struct LNode next; LinkList;void InitList(LinkList *&L); /初始化线性表int CreateListR(LinkList L); /录入图书void Search(LinkList &L); /查询图书int Sort(LinkList &L); /图书按书号递增有序排序void Display(LinkList *&L); /输出排序结果int ListDelete(Link
25、List L); /删除图书int ModifyList(LinkList L); /修改图书信息void InUserMess(User user); /输入借阅者的信息void Borrow(LinkList *L); /借阅图书void Return(LinkList &L); /归还图书main。cpp /主函数文件includevoid main() /主函数 int s; LinkList *L; L=(LinkList )malloc(sizeof(LinkList); InitList(*L); w:while(s!=0) printf(”- n”); printf(*-欢迎光
26、临图书管理系统!- n); printf( 1.图书信息录入功能:- 2。图书信息查询功能:* n”); printf(”*- -|* n”); printf(” 3。图书信息排序功能:- 4。图书的修改功能: | n”); printf(”- - n”); printf(”* 5.图书的删除功能: - 6.图书借阅功能: n”); printf(”|- - n”); printf(”* 7.图书归还功能: - 0。退出系统: * n”); printf(”- 请选择你需要的操作: -|* n”); printf(”-| n); scanf(d,&s); switch(s)case 1: Cr
27、eateListR(L);break;case 2: Search(L);break; case 3: Sort(L);Display(L);break; case 4: ModifyList(L);break; case 5: ListDelete(L); break; case 6: Borrow(L); break; case 7: Return(L); break; case 0: printf(谢谢使用n);break;goto w; InitList。cpp /线性表初始化函数includevoid InitList(LinkList *L) /初始化线性表 L=(LinkList
28、 *)malloc(sizeof(LinkList); /创建头结点 L-next=NULL;CreateListR。cpp /图书录入函数文件includehead.hint CreateListR(LinkList &L) /尾插法建表 int i,n; LinkList *s,q,p; p=L; while(pnext!=NULL) p=p-next; printf(请输入需要录入的图书信息的个数:n=”); scanf(”%d”,&n); for(i=1;in+1;i+) s=(LinkList )malloc(sizeof(LinkList)); printf(”书号 书名 作者 出
29、版社名称 现存量 总存量n”); scanf(”dsssdd”,sdata。num,sdata。name,s-data。author,sdata.press,sdata。left,sdata。count); sdata。user=NULL; q=Lnext; if(q=NULL) pnext=s; p=s; p-next=NULL; printf(”录入成功!n”); continue; while(q!=NULL) if(strcmp(sdata.name,q-data.name)=0) printf(”此图书已存在!); printf(请重新输入:n); printf(”书号 书名 作者
30、出版社名称 现存量 总存量n);scanf(%dsssd%d”,sdata.num,s-data。name,sdata。author,sdata。press,sdata。left,s-data.count); q=qnext; p-next=s; p=s; pnext=NULL; printf(录入成功!n); return 0;Search。cpp /图书查询函数文件includevoid Search(LinkList &L) /查询 LinkList p=Lnext; /p指向第一个数据结点 int c; int x=0,n; char name110,author110,press11
31、0; printf(” 1 按书号查询: n”); printf(” 2 按书名查询: n); printf( 3 按作者名查询: n); printf(”* 4 按出版社名称查询: n”); printf( 5 查询图书借阅信息 n”); printf( 6 返回 n); printf(” 请选择16进行操作: n”); scanf(”d”,c); if(c6|cdata。left,p-data.count); printf(”n”); p=p-next; x+; if (p=NULLx=0) printf(”对不起,不存在此图书!n”); break; case 2:printf(请输入图
32、书书名: n”); scanf(”s”,name1); while(p!=NULL) if(strcmp( name1,pdata。name)!=0) /查找图书书名 p=pnext; else printf(”书号 书名 作者 出版社名称 现存量 总存量n”); printf(”d s s s d %d,pdata。num,pdata.name,pdata。author,pdata。press,pdata。left,pdata。count); printf(”n”); p=pnext; x+; if (p=NULL&x=0) printf(对不起,不存在此图书!n”); break; case 3:printf(”请输入图书作者:n”); scanf(%s,author1); while(p!=NULL) if(strcmp( author1,pdata。author)!=0)/查找图书作者 p=p-next; else printf(书号 书名 作者 出版社名称 现存量 总存量n); printf(”%d %s s s %d %d,p-data。num,pdata.name,pdata。author,pdata。press,p-data.left,pdata.count); printf(”n”); p=pnext ; x+;