数据结构课程设计图书管理系统.docx
《数据结构课程设计图书管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图书管理系统.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构课程设计图书管理系统
《数据结构》
课程设计报告
(图书管理系统)
一.需求分析……………………………………………………….3
二.概要设计……………………………………………………….3
三.详细设计……………………………………………………….4
四.调试分析……………………………………………………….6
五.用户使用说明………………………………………………….6
六.测试结果……………………………………………………….7
七.附录:
带注释的源代码……………………………………….8
一.需求分析
大学的图书馆藏书是非常庞大的,原始的人工借书也是非常麻烦的,因此用一种自动系统来管理图书是非常有必要的,所以设计一个图书管理系统,要能够自如管理借书,还书,以及注册,注销书本,这样就能节省很多资源,提高效率。
明确规定:
1.每种书的登记内容包括书号、书名、著作者、现存量和库存量;
2.对书号建立索引表(线性表)以提高查找效率;
3.系统主要功能如下:
*采编入库:
新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
*借阅:
如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;
*归还:
注销对借阅者的登记,改变该书的现存量。
二.概要设计
1.本题中用到了以下函数和结构体:
本程序首先命名头文件:
#include
#include
#include
以实现对各种函数的调用以及可能用到的各种循环。
用“structBOOK”结构体,用来存放书籍以及借书信息;
并用到“voidpage_title”的页头函数,通过“voidbook_out”,“voidbook_in”来实现对书本的借出以及还书,定义“search_book”来实现对书本各种信息的搜索任务,“voidbook_add”实现对书本的购进时的注册,用“voidbook_del”实现对书本的注销。
最后通过“gotomenu”语句跳出整个循环语句,在各种操作做完后能够返回到主菜单。
用到goto语句原则上一般不符合结构化一些规定,但是此题中大大提高了效率,因此我采用了。
2.主程序的流程及各程序模块之间的层次:
本程序运用到的是用数组作为线性表的一种代替方式,实现各种查询,对各种数据的管理,运用线性表的话可能会更加简便,但是我在用了数组代替后发现其实这样更容易看懂。
“structBook”结构体就保证了各种信息的存放和管理,接下来便是定义各种函数来一一实现对书籍的借出,归还,注销和注册,而在这些函数中,有包括了一些小的函数以及循环,例如在搜索函数中,我用到了“for,if”等循环语句,当然少不了数组的添加,一个大的程序就是这些小的部分而组成的。
也可以简单的归纳为:
整个程序是由搜索,借书,还书,注册书,注销书这几个模块组成,这些又都是在整个“structBook”结构体中。
三.详细设计
structBOOK为主结构体;
voidpage_title(char*menu_item)为页头函数也就是登录界面的显示;
voidreturn_confirm(void)为返回确认函数,以便返回主菜单;
intsearch_book(void)为搜索书本信息的变量定义;
voidbook_out(void)为借出书本的变量定义;
voidbook_in(void)为归还书本的变量定义;
voidbook_add(void)为注册书本的变量定义;
voidbook_del(void)为注销书本的变量定义;
switch(getch())为多分支选择语句,即输入一个数,即选择了一个操作;
gotomenu返回主菜单的语句;
001
高等数学
樊映川
S01
….
002
理论力学
罗运祥
L01
….
003
高等数学
华罗庚
S01
….
004
线性代数
栾汝书
S02
….
…
…
…
…
…
——图书目录文件示例图
structBook
intsearch_bookvoidbook_outvoidbook_invoidbook_addvoidbook_del
——函数调用关系图
详细流程为:
Start
Home
useroption
MemberloginBorrowReturnRegisteration
Searchbook
四.调试分析
(1).调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析:
在调试过程中主要遇到的问题是对函数的定义是出现过一些错误,最后是翻看教材找到了对这些函数的准确定义和使用解决了问题。
(2).算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想:
一个能执行的程序除了需要存储空间来寄存本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需要的信息的辅助空间。
我的算法应当说是挺简单的一种方法实现的,空间可能做得不够好,但是时间我想是有保证的,这也就是弥补了那方面的不足了。
需要改进的地方就是:
每输入完一个操作,就得返回原来的操作界面,不能够继续在现有的面板上操作,这挺不方便的,需要改进。
(3).经验和体会:
经过了这次编程体验,我感想蛮多的,一个好的程序最起码要能运行成功,其次是里边的算法的简便度,这能够为你节省很多时间和空间,当然如果自己还不能运用高级算法,那么我们就用自己会的东西编,这也是一种达到目标的方法。
五.用户使用说明
首先成功运行程序后,会弹出一个运行窗口,窗口会有一个简单的介绍操作步骤:
如
按照步骤,你可以很简便的实现各种操作,完成一个操作后,你必须按任意键返回到最初的界面然后继续接下来的操作。
六.测试结果
七.附录:
带注释的源代码
#include
#include
#include
structBOOK
{
intid,usr[10],total,store,days[10];
charname[30],author[20];
}books[100];
/*结构体,存放书籍及借书信息。
*/
voidpage_title(char*menu_item)
{
printf(">>>以下是图书管理系统--请按要求操作<<<\n\n-%s-\n\n",menu_item);
}
/*页头函数,可以通过参数menu_item,显示当前状态。
*/
voidreturn_confirm(void)
{
printf("\n任意键返回……\n");
getch();
}
/*返回前请求确认函数,方便返回前观察结果*/
intsearch_book(void)
{
intn,i;
printf("请输入图书序号:
");
scanf("%d",&i);
for(n=0;n<100;n++)
{
if(books[n].id==i)
{
printf("书名:
%s\n",books[n].name);
printf("作者:
%s\n",books[n].author);
printf("存数:
%d\n",books[n].store);
printf("总数:
%d\n",books[n].total);
returnn;
}
}
printf("\n输入有错或图书序号不存在.\n");
return-1;
}
/*上面是在数组中找到图书号匹配的记录,显示其信息并返
回数组下标,如果找不到相应记录则提示错误并返回-1。
*/
voidbook_out(void)
{
intn,s,l,d;
page_title("借书");
if((n=search_book())!
=-1&&books[n].store>0)
{
printf("请输入借书证序号:
");
scanf("%d",&s);
printf("请输入可借天数:
");
scanf("%d",&d);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==0)
{
books[n].usr[l]=s;
books[n].days[l]=d;
break;
}
}
books[n].store--;
}
if(n!
=-1&&books[n].store==0)printf("此书已经全部借出.\n");
return_confirm();
}
/*借书的函数,首先调用找书函数*/
voidbook_in(void)
{
intn,s,l;
page_title("还书");
if((n=search_book())!
=-1&&books[n].store{
printf("借阅者图书证列表:
\n");
for(l=0;l<10;l++)
if(books[n].usr[l]!
=0)
printf("[%d]-%d天\n",books[n].usr[l],books[n].days[l]);
printf("请输入借书证序号:
");
scanf("%d",&s);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==s)
{
books[n].usr[l]=0;
books[n].days[l]=0;
break;
}
}
books[n].store++;
}
if(n!
=-1&&books[n].store==books[n].total)
printf("全部入藏.\n");
return_confirm();
}
voidbook_add(void)
{
intn;
page_title("注册书");
for(n=0;n<100;n++)
if(books[n].id==0)break;
printf("序号:
");
scanf("%d",&books[n].id);
printf("书名:
");
scanf("%s",&books[n].name);
printf("作者:
");
scanf("%s",&books[n].author);
printf("数量:
");
scanf("%d",&books[n].total);
books[n].store=books[n].total;
return_confirm();
}
voidbook_del(void)
{
intn;
page_title("注销书");
if((n=search_book())!
=-1)books[n].id=0;
printf("该书已注销.\n");
return_confirm();
}
voidmain(void)
{
menu:
page_title("操作选择单子");
printf("请按以上要求选择操作\n\n");
printf("1借书\n2还书\n\n");
printf("3注册书\n4注销书\n\n");
printf("\n0退出\n");
switch(getch())
{
case'1':
book_out();break;
case'2':
book_in();break;
case'3':
book_add();break;
case'4':
book_del();break;
case'0':
exit(0);
}
gotomenu;
}