图书馆管理系统程序的设计方案.docx
《图书馆管理系统程序的设计方案.docx》由会员分享,可在线阅读,更多相关《图书馆管理系统程序的设计方案.docx(27页珍藏版)》请在冰豆网上搜索。
图书馆管理系统程序的设计方案
图书馆管理系统程序设计方案
.系统分析
2.1数据需求
本系统主要是某图书馆的图书信息简单管理的系统。
需要向系统输入图书的信息,例如:
图书名、编号、作者、图书类别、、图书定价、图书简介。
2.2功能需求
本系统需要有添加,删除,查询,修改,循环显示主菜单,保存信息功能,读取信息,可以按书名实现模糊查询,可以按类别统计图书数量,可以统计图书总数。
2.3性能需求
在运行本程序时只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠。
3.总体设计
3.1功能模块设计
根据分析整个系统主要划分为8个功能模块,分别执行要求中的功能。
该系统需要有删除,修改,添加,查询,保存信息功能,按类图书别统计,统计总数,模糊查询。
功能模块如图1所示。
图1功能模块图
(1)添加图书信息模块
添加图书基本信息:
图书编号、图书名、作者、图书类别、、图书定价、图书简介。
(2)修改图书信息模块
对会图书部信息的修改,修改图书的基本信息:
图书名、图书编号、作者、图书类别、、图书定价、图书简介。
(3)查询图书信息模块
对图书部信息的查询包括通过书名查询和按类别查询。
查询的结果显示为图书名、图书编号、作者、图书类别、、图书定价、图书简介。
(4)删除图书信息模块
可以删除图书的所有基本信息。
(5)按类别统计模块
可将图书按类别统计其图书个数。
(6)统计总数模块
对图书总数进行统计。
(7)图示借阅模块
可实现对图书的借阅,需输入学生信息。
(8)图书归还模块
归还图书,增加图书的现存量。
(9)读取模块
读取储存的图书基本信息。
3.2系统设计方案
(1)菜单
设计一个总菜单,1添加图书信息,2根据书名查找图书,3修改图书信息,4删除图书信息,5图书归还,6图书总数统计,7图书借阅,8储存,9按类别查询图书,10读取图书信息,基本功能的实现都将体现在菜单选项中。
(2)数据结构
建立结构体如下:
structbook
{
longdigit;//图书编号
charname[50];//书名
charauthor[20];//作者
chargategory[20];//图书类别
charphouse[20];//
longprice;//定价
charsynopsis[20];//图书简介
structbook*next;//structbook类型的结构体成员
}*head;//定义一个指向结构体的指针
根据模块需要本系统需要用到链表结构。
(3)函数
定义了12个函数,都实现以下功能:
voidmenu();//主菜单
voidprint();//输出
voidcreat();//创建
voidsearch_name()//按查询;
voidsearchgategory();//按类别查询
voidmodify();//修改
voiddel();//删除
voidl();//按类别统计
voidw();//统计总数
voidMH(structbook*p,chara[])//;模糊查询
voidsave();//储存
voidread()//读取
4.详细设计和实现
4.1创建模块
创建模块:
分为2个部分1输出、2创建。
(1)输出部分流程图:
如图2所示。
图2输出流程图
输出部分创建一个结构体structbook结构体有成员7个:
编号,名字,作者,类别,,价格简介。
输出程序流程如图2所示。
(2)创建部分如图3所示。
图3创建模块流程图
所谓创建是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。
设3个指针变量:
head、P1、P2它们都是用来指向structbook类型数据的。
先用malloc函数开辟第一个结点,并使P1P2,它们都用来指向它。
然后从键盘读入一个图书的数据给p1所指的第一个结点。
我们设定编号不能为0如果输入图书编号为0,则表示链表建立的过程完成,该结点不应该连接到链表中。
先使head的值为NULL,这是链表为空的情况。
当建立第一个结点的时候head指向该结点。
如果输入的p1->num不等于0则输入第一个结点数据(n=1),令head=p1,即把p1的值赋给head,也就是使head也指向新开辟的结点。
然后在开辟另一个结点并使p1指向它,接着输入该结点的数据。
如果输入的p1->num!
=0,则应链入第二个结点(n=2),由于n!
=1,则将p1的值赋给p2->next,此时p2指向第一个节点,因此执行“p2->next=p1”就将新结点的地址赋给第一个结点的next成员,使第一个结点的next成员指向第二个结点。
接着使p2=p1,也就是使p2指向刚才建立的结点。
接着在开辟一个结点并使p1指向它,并输入该结点的数据。
在第三次循环中,由于n=3(n!
=1),又将p1的值赋给p2->next,也就是将第三个结点连接到第二个结点之后,并使p2=p1,使p2指向最后一个结点。
再开辟一个新的结点,并使p1指向它,输入该结点的数据。
由于p1->num的值是0,不再执行循环,此新结点不应被连接到链表中。
此时将NULL赋给p2->next,建立链表的过程至此结束。
P1最后指向的结点未链入链表中,第三个结点的next成员的值为NULL,它不指向任何结点。
虽然p1指向新开辟的结点,但从链表中无法找到该结点。
4.2查询模块
该模块包括三种可查询的选项:
按图书名查找,按图书名模糊查询,按图书类别查找。
对图书部信息的查询包括通过图书名查询,按图书类别查询,每一个子模块基本思想相同,先输入需要查寻的方式然后输入查询所需要的信息,如果输入信息与系统中的图书信息相匹配则输出此图书所有信息。
对图书名可以实现模糊查询,模糊查询既是只需要输入图书名的一个字母就可以显示出所有图书名含有该字母的图书。
(1)按书名查询的流程图:
如图4所示。
图4按书名查找图书信息流程图
由于按图书名查找图书信息和按图书类别查找图书信息的流程基本一致所以只画出一个流程图。
按查找:
定义一个名字数组,这个数组是structbook这个结构体的成员,定义一个指针*p。
当首结点是NULL时则输出listNULL。
首结点不是空,P作为首结点,判断P是否是空,如果P不是空,用strcmp函数来查找与输入相对应的名字,然后输出该名字图书的所有信息。
如果没有可以和输入名字对应的名字则输出notbeenfound。
4.3修改图书信息信息模块
修改图书信息模块,是在已经存在的图书信息的基础上对图书的基本信息,例如:
图书编号、图书名、图书作者、图书、图书类别、图书定价,进行修改,并且保存。
如图6所示。
4.4删
图7删除图书信息流程图
先定义两个头指针p1,p2,找到要删除的图书名,如果图书名是链表的头则将head赋给此图书所存结点的next,此图书所存结点不是头结点就将此图书上一个结点的next与此图书的结点的next相连。
4.5统计图书信息模块
统计图书模块分为两类:
一类是按图书类别统计不同类别的图书数量,另一类是直接统计所有图书总数。
如图8所示。
图8按类别统计流程图流程图
按类别统计是按照图书类别将图书分累统计,输入图书类别用strcmp函数将输入的图书类别和已经存有的图书类别进行比较,找到相同的类别输出该类所有图书数量。
统计总数就是统计结点所以只需要n++即可统计图书总数。
4.6保存模块
保存所存储的图书信息,以二进制写的方式打开一个名字为book的文本文件,调用fwrite()函数将信息存储到名为book的文本文件中,最后关闭文件。
如图9所示。
图9保存图书信息流程图
用保存函数将图书的所有基本信息进行保存,定义一个文件指针,然后判断文件不等于NULL,然后将输入图书基本信息图书编号、图书名、图书作者、图书、图书类别、图书定价,进行修改,并且保存,然后关闭文件。
4.7读取模块:
对已经存储的图书今本信息进行读取,如图10所示。
图10读取图书信息流程图
利用读取函数对已经储存的图书信息进行读取。
可以显示已经存入图书的基本信息例如:
图书编号、图书名、图书作者、图书、图书类别、图书定价,进行读取。
并且显示图书基本信息。
5.调试与测试
5.1调试
调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。
调试的任务是及时改正测试过程中发现的软件错误。
具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。
然后仔细研究推断代码以确定问题的原因,并设法改正。
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。
本系统调试过程中遇到问题、原因和解决方法如下面介绍。
(1)程序在储存图书信息时只能一次存入,并且读取。
再次添加新的程序时将会把原来添加的图书信息覆盖。
原因时存储函数只能只写2进制文件不能追加填写2进制文件。
(2)运行完程序一次有错误提醒
原因是上次运行程序后没有关闭操作界面当点击编译时会有一个错误提示,解决方法:
将上一次运行时的操作界面关闭。
(3)程序不能运行
程序运行到添加新图书时自动提示错误需要调试,其原因是指针指向的位置出现错误导致程序传参错乱无法运行,解决办法:
使程序进入调试状态在传参出现错误的位置一句一句查找传递的参数是否是你所希望的,如若不是就加以修正。
5.2测试
软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。
或者说,软件测试应该根据软件开发各阶段的规格说明和程序的部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。
过度测试则会浪费许多宝贵的资源。
到测试后期,即使找到了错误,然而付出了过高的代价。
测试数据过程如下。
当图书管理系统已经具备对图书基本信息进行添加,删除,查询,修改,保存信息,读取信息的功能。
现在测试系统是否能够正确显示所有已输入的图书基本信息,当系统中已存入图书信息当执行显示功能时,系统会将部图书信息全部列出。
添加一个图书信息:
digit:
1name:
lunyuauthor:
kongzigategory:
jiaoyuphouse:
Chinaprice10synopsis:
youpengziyuanfanglaibuyiyuehu。
显示该图书信息:
digit:
1name:
lunyuauthor:
kongzigategory:
jiaoyuphouse:
Chinaprice10synopsis:
youpengziyuanfanglaibuyiyuehu。
6.结论
课程设计顺利完成,任务书中所提出的要求全部实现,可以对图书信息进行添加、修改、删除以及按各种信息查找,并且将各种信息保存到文本文件中。
不过这个程序还有些不够完善,例如:
只能手动储存图书信息,不能自动存入。
而且读取时受到字符限制。
结束语
为期一个星期的C语言综合课程设计实习终于顺利完成,在这期间真正的学到了一些经验,能够熟练的掌握一些C语言的编程思路,能够熟练的运用学到的函数,学会了在曾经编写过的函数上加以修改实现了我期望实现的功能,知道学习编程必须亲手将每一个字符输入电脑中这样才能真正的学到课本或一些理论中学不到的知识,这才达到了实践的目的,当程序编写完成而且能够正常运行心里一种说不出的自豪感,虽然这对于一名程序员来说可能非常简单,但这是我编程的开始,如果希望在编程这方面能够有所发展我所要走过的路还很长,还需要不断的学习!
再学习!
参考文献
[1]谭浩强.C语言程序设计(第三版).:
清华大学2005
[2]林碧英.C语言程序设计教程.中国电力,2006
[3]美赫伯特.希尔特,王子恢等译.C语言大全.电子工业,2003
附录1-用户手册
点击运行,首先出现的是菜单界面,选择菜单选项进行操作,可进行如图11所示。
图11菜单界面
按1进入添加图书信息界面,如图12所示。
图12添加界面
输入4后点击回车执行对图书删除,如图13所示。
图13图书删除界面
输入2后点击回车进行图书借阅操作,如图14所示
图14图书借阅界面
输入3后点击回车进行图书归还功能的操作。
如图15所示
图15删除界面
输入2后点击回车进行对图书信息显示操作。
如图16所示
图16显示图书信息界面
附录2-源程序
#include
#include
#include
#include
#defineLENsizeof(structbook)
inti=0;
structbook
{
longdigit;//定义图书编号
charname[50];//定义图书名
charauthor[20];//定义图书作者
chargategory[20]//;定义图书类别
charphouse[20];//定义图书
longprice;//定义图书定价
charsynopsis[20];//定义图书简介
structbook*next;
}
book[1000];
#defineNULL0
intn;
structbook*head,*end;
voidmain()
{
intp;
chara[10];
voidmenu();//菜单显示
voidprint();//输出
voidcreat();//创建函数
voidsearch_name();//按图书名查询函数
voidmodify();//修改图书信息函数
voiddel();//删除图书信息函数
voidl();//按图书类别统计函数
voidw();//按图书总数统计函数
voidMH(structbook*p,chara[]);//模糊查询函数
voidsave();//保存函数
voidsearch_gategory();//按图书类别查询函数
voidread();//读取函数
head=NULL;//
end=NULL;//
loop:
menu();
printf("\npleasetochoice:
\n");
scanf("%d",&p);
if(p>=1&&p<=10)
{
switch(p)
{
case1:
creat();break;
case2:
search_name();break;
case3:
modify();break;
case4:
del();break;
case5:
l();break;
case6:
w();break;
case7:
{
printf("请输入要查找的信息\n");
scanf("%s",a);
MH(head,a);break;
}
case8:
save();break;
case9:
search_gategory();break;
case10:
read();break;
}
gotoloop;
}
}
voidmenu()
{
printf("***************************************************\n");
printf("1.添加图书信息\n");
printf("2.根据书名查找图书\n");
printf("3.修改图书信息\n");
printf("4.删除图书信息\n");
printf("5.图书类别统计\n");
printf("6.图书总数统计\n");
printf("7.模糊查询\n");
printf("8.储存\n");
printf("9.按类别查询图书\n");
printf("10.读取\n");
printf("####################################################\n");
}
voidprint()/*显示当前情况*/
{
structbook*p;
printf("Now,These%drecordsare:
\n",n);
p=head;
while(p!
=NULL)
{
printf("%ld,%s,%s,%s,%s,%d,%s\n",p->digit,p->name,p->author,p->gategory,p->phouse,p->price,p->synopsis);
p=p->next;
}
}
voidcreat()//创建
{
structbook*p1,*p2;
p2=end;
p1=(structbook*)malloc(LEN);
printf("请输入编号图书名作者类别价格简介\n");
scanf("%ld%s%s%s%s%d%s",&p1->digit,p1->name,p1->author,p1->gategory,p1->phouse,&p1->price,p1->synopsis);
while(p1->digit!
=0)
{
n++;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structbook*)malloc(LEN);
scanf("%ld%s%s%s%s%d%s",&p1->digit,p1->name,p1->author,p1->gategory,p1->phouse,&p1->price,p1->synopsis);
}p2->next=NULL;end=p2;print();
}
voidsearch_name()/*搜名字*/
{
charname[50];
structbook*p;
intw=0;
printf("inputthesearchedname:
\n");
scanf("%s",name);
if(head==NULL)
printf("listnull!
\n");
else
{
p=head;
while(p!
=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("%ld%s%s%s%s%d%s\n",p->digit,p->name,p->author,p->gategory,p->phouse,p->price,p->synopsis);
w=1;
}
p=p->next;
}
if(!
w)printf("%snotbeenfound!
\n",name);
}
}
voidsearch_gategory()//搜类别
{
chargategory[20];
structbook*p;
intw=0;
printf("inputthesearchgategory:
\n");
scanf("%s",gategory);
if(head==NULL)
printf("不存在\n");
else
{
p=head;
while(p!
=NULL)
{
if(strcmp(gategory,p->gategory)==0)
{
printf("%ld%s%s%s%s%d%s\n",p->digit,p->name,p->author,p->gategory,p->phouse,p->price,p->synopsis);
w=1;
}
p=p->next;
}
}if(!
w)printf("%snotbeenfound!
\n",gategory);
}
voidmodify()/*修改*/
{
structbook*p;
charname[50];
printf("inputnames:
\n");
scanf("%s",name);
p=head;
while(p!
=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("Nownewrecords:
\n");
scanf("%ld%s%s%s%s%d%s",&p->digit,p->name,p->author,p->gategory,p->phouse,&p->price,p->synopsis);
}
p=p->next;
}
print();
}
voiddel()/*删除*/
{
structbook*p1,*p2;
charname[50];
{if(head==NULL)
{
printf("listnull!
\n");
gotoend;
}
}
p1=head;
printf("inputthedeletedname:
\n");
scanf("%s",name);
while(strcmp(name,p1->name)!
=0&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(name,p1->name)==0)
{
if(p1==head)head=p1->next;
else
{
if(p1->next==NULL)
{
p2->next=NULL;
end=p2;
}
else
p2->next=p1->next;
}
free(p1);
printf("delete:
%s\n",name);
n=n-1;
}
elseprintf("%snotbeenfound!
\n",name);
print();
end:
return;
}
voidl()//按类别统计
{
structbook*p1,*p2;
intz=0;
chargategory[20];
printf("请输入图书类别:
\n");
scanf("%s",gategory);
if(head==NULL)
{
printf("listnull!
\n");
gotoend;
}
p1=head;
while(p1->next!
=NULL)
{
while(strcmp(gateg