C课程报告图书管理系统.docx
- 文档编号:9948201
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:36
- 大小:342.72KB
C课程报告图书管理系统.docx
《C课程报告图书管理系统.docx》由会员分享,可在线阅读,更多相关《C课程报告图书管理系统.docx(36页珍藏版)》请在冰豆网上搜索。
C课程报告图书管理系统
图书管理系统
摘要
图书馆管理系统对于图书馆来说是不可或缺的。
它方便快捷的管理图书的库存量、类别、查阅,借阅等环节。
本系统使用C语言作为程序开发的语言,开发图书馆管理系统,实现图书的查询、书名查询、编号查询,可以对图书信息进行添加,查询和读者信息的查询。
本文从分析课题的题目背景、题目意义、题目要求等出发,分别从系统需求,总体设计、详细设计、调试测试等方面介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。
关键词:
图书查询;借书登记;还书管理;
1.绪论
图书馆管理系统是一个图书馆不可或缺的部分,它的内容对于学校图书馆的管理非常重要,所以图书管理系统不但要为图书管理者提供充足的信息和快捷的查询手段。
而且要为学生提供必要快捷的查询手段。
随着计算机技术的日益成熟,强大的功能已为人们深刻认识。
使用计算机对图书管理具有快速、准确、方便、保密好、寿命长、成本低等特点。
这些优点能够极大的提高图书管理的效率、也是图书馆科学化、正规化管理的重要条件。
这也是编写本系统的目的所在,现在的图书馆都在使用类似的能够用计算机辅助管理员完成对图书信息的管理,本系统可以大大提高管理员的工作效率,节省工作时间,使他们能够用更多的时间为读者提供一些其它的服务。
根据课程设计任务书要求,本系统开发主要完成以下功能和性能。
(1)新书入库系统:
包括存储图书基本信息:
书名,书号,库存量,现存量。
(2)图书信息查询系统:
可以按书号查询图书的基本信息。
(3)借书登记系统:
可以输入读者编号和所借书号来借书。
(4)还书管理系统:
可以输入读者编号和所借书号来还书。
(5)输出信息系统:
输出全部图书信息和全部读者信息。
2.系统分析
2.1数据需求
本系统主要是图书馆的图书信息管理的系统。
一、新书入库:
图书信息包括书名,书号,库存量,现存量共4项.首先输入3本书的信息,并将其存入文件”book.dat”中.当有新书入库时,先判断文件中是否有此书(即比较书名),若有则修改库存量,现存量的信息;若无此书,则将该书的信息添加到文件中.
二、图书查询:
输入一个书号,在文件中查找此书,若找到则输出此书的全部信息;若找不到则输出查找失败的信息.
三、借阅管理
(1)每个读者的信息包括姓名,编号,1张借书卡(限借一本书),输入3个读者的信息存入文件“reader.dat”中.
(2)借书登记:
输入读者的编号,所借图书的书号,先判断姓名是否在文件”reader.dat”中,若有则将书号存入一张借书卡上(注:
初始时借书卡的信息都为零,借书后借书卡的信息改为所借书的书号),并修改文件”reader.dat”的相应内容,同时修改文件”book.dat”中此书的现存量.若”reader.dat”无此姓名,则应提示错误
(3)还书管理:
输入读者的编号,所还图书的书号,将借书卡的信息置为零,并修改文件”reader.dat”的相应内容,同时修改文件”book.dat”中此书的现存量.
四、输出全部图书信息和全部读者信息
五、退出系统.
2.2功能需求
本系统有新书入库,查询,借书管理,还书管理,保存信息功能,显示读者信息和图书信息,可以按书号实现图书查询。
2.3性能需求
在运行本程序时只要按照正确的操作方法就能正常运行,系统稳定性好,安全,可靠。
3.总体设计
3.1功能模块设计
根据分析整个系统主要划分为6个功能模块,分别执行要求中的功能。
该系统新书入库,图书查询,借阅管理,输出图书信息,输出读者信息,退出系
仔细阅读系统要求,首先将此系统化分为如下模块
1)新书入库模块:
可用一个函数insert_new_book(charbook_num[],charbook_name[],intnumber)来实现。
形参分别为:
书名,书号,以及有多少本书要入库,再根据要求将信息写入文件boot.dat中。
又由于最开始要输入三本新书,故可以加一个初始化函数init_book(),但是初始化函数只执行一次,也就是在系统第一次运行的时候执行,此时可以根据判断是否存在boot.dat这个文件来决定是否执行初始化函数.
2)查询模块:
可用一个函数voidfind_book(charbook_num[])来实现。
找到就输出此书全部信息,找不到就输出查找失败信息。
3)借阅管理模块:
(1)三个读者的信息可以在系统初始化时完成.即可用初始化函数init_reader()来实现对读者的初始化。
因为读者初始化函数也只是在系统第一次运行的时候执行一次,故也可以根据是否存在reader.dat文件来确定是否执行此函数。
(到现在可以发现在系统初始化函数里,至少已经需要调用两个初始化函数了)
(2)借书登记模块:
可用一个函数borrow_book(charreader_num[],charbook_num[])来实现。
在函数中要分别判断
A该读者的编号是否已经存在,如果不存在,则提示错误。
B该读者的借阅书是否已满(即最多只能借1本书)如果是,则提醒该用户先去还书
C输出的书号对应的书是否存在,如果不存在,则提醒读者不存在此书。
借书过程完成后,则对读者信息里的借书信息写上所借书号,并修改库存量。
(3)还书管理模块:
可用一个函数return_book(charreader_num[],
charbook_num[])来实现。
在实现此函数时要判断:
A该读者的姓名是否已经存在,如果不存在,则提示错误。
B该读者是否已经借阅此书。
如果没有,则提示错误。
C还书过程完成后,则对读者信息里的借书信息清零,并修改库存量。
(4)输出图书和读者信息:
可分别用模块print_book()和print_reader()来实现
直接从book.dat文件和reader.dat文件中读取信息并输出。
(5)退出系统:
可用一个函数exit()来实现。
首先将信息保存到文件,释放动态创建的内存空间,再退出此程序。
3.2系统设计方案
(1)菜单
设计一个总菜单,1、新书入库2、图书查询3、借书登记、4还书登记5、输出图书信息6、输出读者信息。
(2)数据结构
建立结构体如下:
图书类型:
typedefstructbk{
charbook_num[11];/*书号采用10位编码最后1位为字符串结束标志(下同).*/
charbook_name[41];/*书名规定不超过40个字母(20个汉字)*/
unsignedbook_kc,book_xc;/*book_kc代表库存量,book_xc代表现存量*/
structbk*next;
}book;
读者类型:
typedefstructrd{
charreader_num[11];/*读者编号采用10位编码*/
charreader_name[11];/*读者姓名*/
charreader_book_num[11];/*表示所借书号,初始值为“0”*/
structrk*next;
}reader;
(3)函数
定义了15个函数,都实现以下功能:
voidForm_Insert_New_Book();/*新书入库菜单*/
voidForm_Find_Book();/*查询图书菜单*/
voidForm_Borrow_Book();/*借书菜单*/
voidForm_Return_Book();/*还书菜单*/
voidFind_Book(char*);/*查询图书*/
voidInsert_New_Book(char*,char*,int);/*新书入库,即在链表中插入一个新节点*/
voidBorrow_Book(char*,char*);/*借书,修改读者借阅信息和图书的现存信息*/
voidReturn_Book(char*,char*);/*还书,修改读者借阅信息和图书的现存信息*/
voidprint_book(structbk*);/*输出全部图书信息*/
voidprint_reader(structrd*);/*输出全部读者信息*/
voidload_data();/*从文件中读取数据,链表头指针指向第一个节点*/
voidinit_reader();/*第一次运行程序时对三个读者的初始化*/
voidinit_book();/*第一次运行程序时对三本图书的初始化*/
voidsave();/*将链表中的信息保存到文件中*/
voidM_Form()/*主菜单*/
4.详细设计
4.1页面设计模块
此系统界面采用图形和数字化菜单设计。
主界面设计如下:
图书管理系统主系统
请选择相应的数字执行相应的功能:
0:
退出此系统
1:
新书入库
2:
图书查询
3:
借书登记
4:
还书管理
5:
输出全部图书信息和读者信息
各子界面如下:
1.新书入库界面:
请选择相应的数字执行相应的功能:
10:
返回主菜单
11:
新书入库
请输入新书名:
请输入新书号:
请输入新书数量:
(注:
新书入库成功后,程序返回到子界面1)
2.图书查询界面界面:
请选择相应的数字执行相应的功能:
20:
返回主菜单
21:
图书查询
请输入需要查询的书号:
(注:
图书查询完成后,返回到子界面2)
`3、借书登记界面:
请选择相应的数字执行相应的功能:
30:
返回主菜单
31:
借书登记
请输入读者编号:
请输入所借书号:
(注:
借书过程完成后,返回到子界面3)
``4、还书管理:
请选择相应的数字执行相应的功能:
40:
返回主菜单
41:
还书登记
请输入读者编号:
请输入所借书号:
(注:
还书过程完成后,返回到子界面4)
5、输出全部图书和读者信息:
请选择相应的数字执行相应的功能:
50:
返回主菜单
51:
输出全部图书信息:
书号书名:
库存量现存量
52:
输出全部读者信息:
读者编号读者姓名所借书号
(注:
输出图书和读者信息后,返回到子界面5)
4.2主要功能模块
2、新书入库流程图
Y
根据数量修改库存
Y
N
N
book.dat中增加此新
书,根据数量设置库存
3、图书查询程序结构图:
N
Y
NY
4、借书登记程序结构流程图:
Y
NN
Y
YN
NY
N
YN
借书登记,修改book.dat
中的现存信息,reader.dat
中的借书卡信息Y
5、还书登记程序结构流程图:
Y
N
Y
N
错误
正确
还书将读者信息借书卡清0
修改book.dat现存信息
N
Y
6、输出读者和图书信息
图书
图书
4.3保存模块
可执行文件book.dat、reader.dat,都存储在c:
文件夹下。
5.调试与测试
5.1调试
调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。
调试的任务是及时改正测试过程中发现的软件错误。
具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。
然后仔细研究推断代码以确定问题的原因,并设法改正。
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。
本系统调试过程中遇到问题、原因和解决方法如下面介绍。
(1)程序在储存图书信息时只能一次存入,并且读取。
再次添加新的程序时将会把原来添加的图书信息覆盖。
原因时存储函数只能只写2进制文件不能追加填写2进制文件。
(2)运行完程序一次有错误提醒
原因是上次运行程序后没有关闭操作界面当点击编译时会有一个错误提示,解决方法:
将上一次运行时的操作界面关闭。
(3)程序不能运行
程序运行到添加新图书时自动提示错误需要调试,其原因是指针指向的位置出现错误导致程序传参错乱无法运行,解决办法:
使程序进入调试状态在传参出现错误的位置一句一句查找传递的参数是否是你所希望的,如若不是就加以修正。
5.2测试
软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。
或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。
过度测试则会浪费许多宝贵的资源。
到测试后期,即使找到了错误,然而付出了过高的代价。
问题:
借书管理模块中,当正确输入存在的读者编号和所借的书的编号,系统进行判断时,提示不存在此读者。
解决办法及步骤:
1、一个个输出所有的读者的编号,检查文件中是否有此读者,发现有。
2、既然有此读者,那么检查循环判断是否有此读者的语句发现没有错
3、输出用于循环检查语句中的读者信息,发现乱码
4、仔细分析乱码的原因,最后发现是变量的类型错误,错将读者类型的结构体指针变量定义为了图书类型的指针变量。
6.结论
课程设计顺利完成,任务书中所提出的要求全部实现,可以对图书信息进行查询、借阅及各种信息查找,并且将各种信息保存到文本文件中。
不过这个程序还有些不够完善,例如:
没有删除、修改功能。
结束语
通过这次课程设计,我对复杂程序的开发有了一个深刻的认识,使我进一步明白了模块化思想在程序开发中的重要性。
两个星期的C语言综合课程设计实习终于顺利完成,在这期间真正的学到了一些经验,能够熟练的掌握一些C语言的编程思路,能够熟练的运用学到的函数,意识到编程并不是一件很简单的事情,知道学习编程必须亲自动手去做,只有自己做的程序才能找出错误,这样才能真正的达到目的。
当程序编写完成而且能够正常运行心里非常高兴,虽然这对于一名程序员来说可能非常简单,但对我来说,如果要想在编程方面能够有所发展的话,我面临的困难还很多,要继续加强,努力,达到一种较高的水平。
参考文献
[1]谭浩强.C语言程序设计(第三版).北京:
清华大学出版社2005
[2]高涛,陆丽娜.C语言设计.西安:
西安交通大学出版社2007.
[3]林碧英.C语言程序设计教程.北京:
中国电力出版社2006.
[4]王立武,陈艳,张宇,汪晔君.C语言程序设计.北京.清华大学出版社2009
附录1-用户手册
点击运行,首先是进入菜单选择界面,可进行如图1所示。
图1进入菜单选择界面
输入1回车进入新书入库功能系统,可进行如图2所示。
图2进入新书入库选择界面
输入1回车输入新书功能系统,可进行如图3所示。
图3进入新书入库选择界面
输入2回车进入图书查询功能系统,可进行如图4所示。
图4进入新书入库选择界面
输入1回车开始时图书查询系统,可进行如图5所示。
图5进入图书查询界面
输入3回车借书登记系统,可进行如图6所示
图6进入借书登记界面
输入4回车还书管理系统,可进行如图7所示
图7进入图书查询界面
输入5回车显示信息系统,可进行如图8所示
图8输出信息界面
附录2-源程序
#include
#include
#include
typedefstructbk{
charbook_num[11];
charbook_name[41];
intbook_kc;
intbook_xc;
structbk*next;
}book;/*图书信息*/
typedefstructrd{
charreader_num[11];
charreader_name[11];
charreader_book_num[11];
structrd*next;
}reader;/*读者信息*/
structbk*h_book,*h_reader;/*全局变量,分别为指向图书信息链表和读者信息链表的头指针*/
voidForm_Insert_New_Book();/*新书入库菜单*/
voidForm_Find_Book();/*查询图书菜单*/
voidForm_Borrow_Book();/*借书菜单*/
voidForm_Return_Book();/*还书菜单*/
voidFind_Book(char*);/*查询图书*/
voidInsert_New_Book(char*,char*,int);/*新书入库,即在链表中插入一个新节点*/
voidBorrow_Book(char*,char*);/*借书,修改读者借阅信息和图书的现存信息*/
voidReturn_Book(char*,char*);/*还书,修改读者借阅信息和图书的现存信息*/
voidprint_book(structbk*);/*输出全部图书信息*/
voidprint_reader(structrd*);/*输出全部读者信息*/
voidload_data();/*从文件中读取数据,链表头指针指向第一个节点*/
voidinit_reader();/*第一次运行程序时对三个读者的初始化*/
voidinit_book();/*第一次运行程序时对三本图书的初始化*/
voidsave();/*将链表中的信息保存到文件中*/
voidM_Form()/*主菜单*/
{charch;
printf("\n图书管理系统主窗口");
printf("\n0:
退出系统");
printf("\n1:
新书入库");
printf("\n2:
图书查询");
printf("\n3:
借书登记");
printf("\n4:
还书管理");
printf("\n5:
输出全部信息");
do{/*此循环用来保证选择正确的数字键执行相应的功能*/
printf("\n\n请选择相应的功能代码:
");
scanf("%c",&ch);
fflush(stdin);/*用于清除键盘缓冲区中的多余字符*/
}while(ch!
='0'&&ch!
='1'&&ch!
='2'&&ch!
='3'&&ch!
='4'&&ch!
='5');
switch(ch)/*根据输入的字符进行选择执行相应的模块*/
{case'0':
exit(0);
case'1':
Form_Insert_New_Book();break;
case'2':
Form_Find_Book();break;
case'3':
Form_Borrow_Book();break;
case'4':
Form_Return_Book();break;
case'5':
load_data();print_book(h_book);print_reader(h_reader);M_Form();
default:
printf("error\n");exit(0);
}
}
voidForm_Find_Book()
{charch;
charbook_num[11];
printf("\n图书查询功能模块,请选择相应的功能代码:
\n");
printf("0:
返回到主菜单\n");
printf("1:
图书查询");
do{
printf("\n\n请选择相应的功能代码:
");
scanf("%c",&ch);
fflush(stdin);
}while(ch!
='0'&&ch!
='1');
switch(ch)
{case'0':
M_Form();break;/*选择0,则返回到上一级目录,即主菜单*/
case'1':
{printf("\n请输入需要需要查询的书的编号:
");
scanf("%s",book_num);
fflush(stdin);
Find_Book(book_num);/*执行查询*/
Form_Find_Book();/*查询完毕后继续返回到查询窗口,执行下一个查询*/
}
default:
printf("error\n");exit(0);
}
}
voidFind_Book(charbook_num[])/*查询图书模块,根据图书编号查询*/
{structbk*p;
p=h_book;
while(p!
=NULL&&strcmp(p->book_num,book_num)!
=0)
p=p->next;/*此循环用于查找,如果在中间找到,则p就不可能到末尾指向空*/
if(p==NULL)printf("\n\t此编号对应的图书不存在!
\n");
else{printf("\n\t图书编号\t图书名\t库存量\t现存量\n");
printf("%10s\t%10s\t%d\t%d\t\n",p->book_num,p->book_name,p->book_kc,p->book_xc);
}
getch();
}
voidinit_book()/*初始化图书模块*/
{bookba[3];
FILE*fp;
inti;
printf("\n系统即将进行初始化,图书初始化模块:
\n");
printf("\n请分别输入三本书的书号,书名,数量(以空格隔开):
\n");
for(i=0;i<3;i++)/*输入3本图书进行初始化*/
scanf("%s%s%d",ba[i].book_num,ba[i].book_name,&ba[i].book_kc);
for(i=0;i<3;i++){ba[i].book_xc=ba[i].book_kc;}/*开始时库存=现存*/
if((fp=fopen("book.dat","wb"))==NULL)/*建立新文件book.dat准备写入数据*/
{printf("不能建立图书文件,初始化失败!
请重新启动系统!
\n");return;}
for(i=0;i<3;i++)/*将初始化的3本图书写入文件book.dat中*/
{if(fwrite(&ba[i],sizeof(structbk),1,fp)!
=1)
{printf("\写数据错误!
\n");exit(0);}
}
fclose(fp);
}
voidinit()
{intdrive=DETECT,mode=0;
initgraph(&drive,&mode,"");
init_book
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程 报告 图书 管理 系统