数据结构课程设计图书管理.docx
- 文档编号:8410893
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:45
- 大小:723.71KB
数据结构课程设计图书管理.docx
《数据结构课程设计图书管理.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图书管理.docx(45页珍藏版)》请在冰豆网上搜索。
数据结构课程设计图书管理
数据结构课程设计报告
题目:
6.3 图书管理
学院计算机学院
专业软件工程
年级班别2012级2班
学号**********
学生姓名林迅玄
指导教师李藜
难度
选做
独立完成率%
自评
5
有
成绩
2014年7月1日
一、需求分析
【设计任务描述】
设计一个计算机管理系统完成图书管理基本业务。
图书管理基本业务活动包括:
对一本书的采编入库、清除库存、借阅和归还等等。
【输入的形式和输入值的范围】
进入管理界面输入整型数据0-7选择需要的操作
书号、现存量、总存量为大于零的整型数据,输入值的范围由系统整型数据范围而定。
书名、作者名、出版社名称为字符串类型数据,长度不大于20。
借书证号码,归还时间均先由字符串输入再由函数转换为整型数据,借书证号码
长度不大于5位字符,归还时间长度不大于8位。
【程序所能达到的主要功能】
1.图书信息录入功能:
每种书的登记内容包括书号、书名、著作者、出版社名称、现存量和总存量等。
2.图书查询功能:
分别可按书号、书名、作者、出版社名称查询图书,还可查询图书的当前借阅信息。
3.排序功能:
对书库中的图书按书号排序。
4.图书修改功能:
对选定图书信息进行修改。
5.图书删除功能:
某本书已无保留价值,将其从书库中注销。
6.图书借阅功能:
若图书现存量大于零,登记借阅者图书证号和归还日期,图书现存量减1。
7.图书归还功能注销对借阅者的登记,改变该书的现存量。
【测试数据】
输入1进入图书录入信息:
输入需要录入的图书信息的个数,依次录入以下信息
书号
书名
作者
出版社名称
现存量
总存量
1
w
e
g
5
5
4
x
h
j
4
4
7
y
e
z
9
9
2
s
a
p
16
16
6
r
e
j
10
10
8
i
f
t
20
20
3
d
f
g
18
18
5
c
l
g
17
17
11
m
l
g
13
13
9
q
a
t
14
14
10
b
o
p
8
8
成功则输出“录入成功”错误则输出“此图书已存在!
”、“请重新输入”
输入2进入图书查询:
1.按书号查询
输入2
成功则输出
书号
书名
作者
出版社名称
现存量
总存量
2
s
a
p
16
16
错误则输出“对不起,不存在此图书!
”
2.按书名查询
输入c
成功则输出
书号
书名
作者
出版社名称
现存量
总存量
5
c
l
g
17
17
错误则输出“对不起,不存在此图书!
”
3.按作者名查询
输入e
成功则输出
书号
书名
作者
出版社名称
现存量
总存量
1
w
e
g
5
5
6
r
e
j
10
10
7
y
e
z
9
9
错误则输出“对不起,不存在此作者的图书!
”
4.按出版社名称查询
输入g
成功则输出
书号
书名
作者
出版社名称
现存量
总存量
1
w
e
g
5
5
3
d
f
g
18
18
5
c
l
g
17
17
11
m
l
g
13
13
错误则输出“对不起,不存在此出版社出版的图书!
”
输入4进入图书修改
输入w
正确则重新录入该书信息
书号
书名
作者
出版社名称
现存量
总存量
1
w
e
g
6
6
错误则输出“不存在此图书”
输入5进入图书删除
输入d
成功则输出“删除成功”
错误则输出“你输入的书名不存在,请核实后重新输入!
”
输入3进入图书排序
输出
书号
书名
作者
出版社名称
现存量
总存量
1
w
e
g
6
6
2
s
a
p
16
16
4
x
h
j
4
4
5
c
l
g
17
17
6
r
e
j
10
10
7
y
e
z
9
9
8
i
f
t
20
20
9
q
a
t
14
14
10
b
o
p
8
8
11
m
l
g
13
13
输入6进入图书借阅
输入w
成功则继续输入错误则输出“此图书不存在!
”
输入15
成功则继续输入错误则输出“输入有误,请重新输入”
输入20140101
成功输出“借书成功!
”
错误则输出“此图书不存在!
”、“不好意思,此书已借完!
”、“你已经借了
这本书,不能够重复借!
”
输入6进入图书借阅
重复输入w1720140715w2520141109
输入2进入图书查询
输入2按书名查询
输入w
成功则输出
书号
书名
作者
出版社名称
现存量
总存量
1
w
e
g
3
6
错误则输出“对不起,不存在此图书!
”
输入2进入图书查询
输入5查询图书借阅信息
输入w
成功则输出
借阅者图书证号
归还时间
15
20140101
17
20140715
25
20141109
错误则输出“不存在此图书”
输入7进入图书归还
输入w
成功则继续输入错误则输出“此图书不存在!
”
输入17
成功则输出“该书归还成功!
”错误则输出“你输入的图书证号不正确!
请重新操作!
”
输入2进入图书查询
输入5查询图书借阅信息
输入w
成功则输出
借阅者图书证号
归还时间
15
20140101
25
20141109
错误则输出“不存在此图书”
输入0退出系统
成功则输出“谢谢使用”
二、概要设计
所用数据结构:
线性表、查找、排序
借阅者的存储结构体数据类型是无表头单链表。
typedefstructUser{//借阅者的存储结构体
intnumber;//借书证号码
intlimitdate;//归还时间
structUser*next;//下一个借阅者
}User;//定义用户的的信息
图书信息的存储结构是带表头单链表。
typedefstruct{
intnum;//图书的书号
charname[20];//书名
charauthor[20];//著者
charpress[20];//出版社名称
intleft;//现存量
intcount;//总存量
User*user;//借阅该书的人
}ElemType;//定义书的信息
typedefstructLNode//定义单链表结点类型
{
ElemTypedata;
structLNode*next;
}LinkList;
主程序流程以及各程序模块之间的调用关系:
N
Y重新输入
1.图书信息录入功能
Y
Y
N
2.图书查询功能
Y
N
1.
N
Y
2.
N
Y
3.
N
Y
4.
N
Y
5.
N
Y
6.
3.
图书排序功能
4.
图书修改
N
Y
5.
图书删除
N
Y
6.图书借阅
N
Y
Y
N
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、name、author、press、left、count;
(3)if(s存在L)重新输入;
(4)else录入成功;
图书查询功能:
(t=书号、书名、作者、出版社,p=L->next)
(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的第一个借阅者信息结点;
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等于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)elseq下一个结点置空,删除成功;
图书借阅功能:
(1)输入k(借阅书名);p指向L第一个数据结点;
(2)while(p不为空&&k不等于p的书名)
p指向下一个结点;
(3)if(p是最后的结点&&k不等于p的书名)书名不存在;
(4)elseif(p书现存量小于1)此书已借完!
;
(5)else
注册借阅者信息结点s(图书证号和归还日期);
if1(p图书尚无人借阅)
借书成功;p结点的借阅者信息结点保存s;现存量减1;
else1
u保存p结点的第一个借阅者信息结点;
while(u不为空&&u的图书证号不等于s的图书证号)
u指向下一个结点;
if2(u为空&&u的图书证号不等于s的图书证号)
借书成功;u下一个结点结点保存s;现存量减1;
elseif(u的图书证号等于s的图书证号)不能够重复借;
Endelse1
Endelse
图书归还功能
(1)输入k(归还书名);p指向L第一个数据结点;
(2)while(p不为空&&k不等于p的书名)
p指向下一个结点;
(3)if(p是最后的结点&&k不等于p的书名)书名不存在;
(4)elseif(k等于p的书名)
输入图书证号n;
user指向p的第一个借阅者信息结点;
if1(n等于p的第一个借阅者信息结点的图书证号)
归还成功;p的第一个借阅者信息结点指向下一个结点;现存量加1;
else1
while(user后继指针不为空&&user的图书证号不等于n)
pre保存user指针;
user指向下一个结点;
Endwhile
if(user的图书证号等于n)
归还成功;pre的第一个结点指向user的下一个结点;现存量加1;
else输入图书证号不正确,重新操作;
Endelse1
Endelse
函数调用关系图
四、调试分析
(一)问题:
录入图书信息后,输出图书信息时有些项目输出乱码。
采取的措施:
检查代码在输入语句中,定义为int型的项目在输入语句中加上取地址符号“&”。
(二)问题:
添加图书信息,虽然显示“录入成功!
”,但是实际上并没有与之前已经存在的图书信息存放在一起。
采取的措施:
修改录入添加图书信息的算法,修改结点的指向,使之后添加的图书信息与之前已经存在的图书信息存放在一起。
(三)问题:
多个借阅者借阅同一本图书,借阅成功后查询该书借阅者信息,发现只有最新的借阅者信息。
采取的措施:
修改借阅信息插入算法,修改结点指针指向,使之不会有旧结点被新结点覆盖的情况发生。
算法时空分析
基本操作
时间复杂度
CreateListR(L)
O(n)~O(m·n)
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)
由上表知除录入和排序函数,其它函数的时间复杂度都是O(n),但录入函数是受录入图书信息个数m影响,因此在录入一种书的信息时的时间复杂度也是O(n);此外排序函数在时间复杂度O(n)~O(n2)之间仍有改进的空间,这需要算法的改进,这也是需要继续努力学习的方面。
心得与体会
选择了“图书管理系统”这个课题。
程序的大部分函数的算法在很短的时间内就差不多写好了,可是在调试的过程中却发现了不少问题。
譬如录入图书的信息后,在进行图书信息排序时有些项目的输出会出现乱码。
仔细检查后才发现在录入int型的数据时,没有添加取地址符号。
还有在信息录入的过程中,程序也出现了漏洞。
添加图书信息,虽然显示“录入成功!
”,但是实际上并没有与之前已经存在的图书信息存放在一起。
最后修改了录入图书信息的算法,修改了结点的指向,使之后添加的图书信息与之前已经存在的图书信息存放在一起。
多个借阅者借阅同一本图书,借阅成功后查询该书借阅者信息,发现只有最新的借阅者信息。
修改借阅信息插入算法,修改结点指针指向,使之不会有旧结点被新结点覆盖的情况发生。
在整个课程设计的过程中,遇到了很多困难,花费了很多时间去解决,也让我深刻体会到要圆满完成一个程序的不易。
大到算法,小到一个符号,都会影响整个程序的执行状况。
这也警惕我要注意细节。
五、用户使用说明
开发软件环境:
操作系统为XP
开发环境软件为MsvisualC++6.0
开发语言为C语言
程序运行说明:
登入界面后输入0-7选择需要执行的操作;
选择1图书录入则输入需要录入的图书信息的个数n,然后依次录入图书信息,输出录入成功即可继续;
选择2图书查询输入0-6选择需要执行的操作;
选择1按书号查询输入书号即可成功则输出该书信息;
选择2按书名查询输入书名即可成功则输出该书信息;
选择3按作者查询输入作者即可成功则输出书库中该作者的所有著作;
选择4按出版社查询输入出版社即可成功则输出书库中该出版社出版的所有书籍;
选择5查询图书借阅信息输入书名即可成功则输出该书当前所有借阅者的信息(图书证号和归还日期);
选择3图书排序程序自动将书库中的书按书号排序输出;
选择4图书修改输入书名成功则依次输入该书更新后的信息,成功后系统便会更新信息;
选择5图书删除输入书名即可成功则在书库中注销该书的信息;
选择6图书借阅输入书名成功则登记借阅者信息输入图书证号和归还日期,若信息正确和该书现存量大于0,则借阅成功,该书现存量减1,并将该借阅者信息录入该书借阅信息中;
选择7图书归还输入书名成功则输入图书证号若信息正确则该书现存量加1,注销该图书证号在该书借阅信息中的信息;
选择0退出系统。
六、测试结果
程序运行开始界面
按照测试数据的步骤进行:
选择1.图书信息录入功能
输入需要录入的图书信息个数n=11;
依次按照测试数据输入11个图书信息
选择2图书查询功能
选择1按书号查询
输入书号2
继续选择2图书查询功能选择2按书名查询
输入书名c
继续选择2图书查询功能选择3按作者查询
输入作者名e
继续选择2图书查询功能选择4按出版社查询
输入出版社名称g
选择4图书修改功能
输入要修改的书名w
按照测试数据输入修改信息
选择5图书删除功能
输入要删除的书名d
选择3图书信息排序功能
选择6图书借阅
输入要借阅的图书w
输入图书证号15
输入归还日期20140101
重复选择6输入w1720140715w2520141109
选择2图书查询功能选择5查询图书借阅信息
输入书名w
选择7图书归还
输入归还书书名w
输入图书证17
选择2图书查询功能选择5查询图书借阅信息
输入图书名w
七、附录
head.h//头文件
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
typedefstructUser{//借阅者的存储结构体
intnumber;//借书证号码
intlimitdate;//归还时间
structUser*next;//下一个借阅者
}User;//定义用户的的信息
typedefstruct{
intnum;//图书的书号
charname[20];//书名
charauthor[20];//著者
charpress[20];//出版社名称
intleft;//现存量
intcount;//总存量
User*user;//借阅该书的人
}ElemType;//定义书的信息
typedefstructLNode//定义单链表结点类型
{
ElemTypedata;
structLNode*next;
}LinkList;
voidInitList(LinkList*&L);//初始化线性表
intCreateListR(LinkList*&L);//录入图书
voidSearch(LinkList*&L);//查询图书
intSort(LinkList*&L);//图书按书号递增有序排序
voidDisplay(LinkList*&L);//输出排序结果
intListDelete(LinkList*&L);//删除图书
intModifyList(LinkList*&L);//修改图书信息
voidInUserMess(User*user);//输入借阅者的信息
voidBorrow(LinkList*&L);//借阅图书
voidReturn(LinkList*&L);//归还图书
main.cpp//主函数文件
#include
voidmain(){//主函数
ints;
LinkList*L;
L=(LinkList*)malloc(sizeof(LinkList));
InitList(*&L);
w:
while(s!
=0){
printf("*|-----------------------------------------------------------------|*\n");
printf("*|----------------------欢迎光临图书管理系统!
----------------------|*\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){
case1:
CreateListR(L);break;
case2:
Search(L);break;
case3:
Sort(L);Display(L);break;
case4:
ModifyList(L);break;
case5:
ListDelete(L);break;
case6:
Borrow(L);break;
case7:
Return(L);break;
case0:
printf("谢谢使用\n");break;gotow;
}
}
}
InitList.cpp//线性表初始化函数
#include
voidInitList(LinkList*&L){//初始化线性表
L=(LinkList*)malloc(sizeof(LinkList));//创建头
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 图书 管理