1
编号:
设计报告文档成绩
设计作品分数成绩
课程设计成绩
程序设计课程设计文档
2018 年 9 月 13 日
2
一. 题目意义和设计思想
1、题目意义
图书馆,作为文献的聚集地和展示平台,常常扮演着引领文化前进的角色,
是每个大学不可或缺的基础设施,而图书管理系统则是一个图书馆能够正常运
转的关键。本次课程设计使用 C 语言制作程序来实现图书的登记,删除,查询,
浏览以及读者的借阅,还书,会员登录,修改密码等功能。程序中涉及到数据
链表和文件指针的操作,包括结构体数据定义,使用及文件的读写,定位,修
改等。
2、设计思想
①新建账号密码,然后通过二者的匹配登录系统,这样可以保证是本校同学才能使用,另
外还可以修改密码。
②添加图书的基本信息,如 书号,书名,作者,出版社,类别,进库量;
③删除图书,通过图书的书名进行删除;
④图书查询,通过图书的书号,书名,作者或者类别进行检索;
⑤浏览图书的库存,将所有数目展示出来;
⑥借书登记,先判断是否有这本数,然后进行借书人学号,姓名,归还截止期限,借书书
名进行登记
⑦还书情况查看。
⑧借阅情况查看。
⑨会员登录,通过数据文件中的已注册的账号密码来登录到图书管理系统。
⑩修改密码
2.1 总设计框架图
3
二、采用的主要技术、遇到的难点和解决方法
1.采用的主要技术
①switch()函数
在多级菜单的功能选择上,需要大量运用 switch()函数来实现函数与函数之间的联系,
功能与功能之间的交替。如通过 switch 语句来选择打开图书管理系统还是结束管理系统
②循环结构
为了实现一些文件的遍历和链表的创建等,需要用到各种循环结构,如,查询图书功能,
修改密密码功能等。
③文件的新建,打开,读取,写入,关闭。
图书管理系统每次的功能执行都是需要产生持续性的影响,因此就需要大量使用文件来
保存各种数据,如储存注册的账号密码,储存读者的借阅信息等。
④结构体及链表的创建,修改,遍历。
整个图书管理系统包含的数据结构非常复杂,有字符型,字符数组型,指针型,整型,
浮点型等等,通过结构体可以将其中有关联但类型不相同的数据集中到一起,方便数据的保
存和修改,另外通过链表将数组相连,更方便对文件件中的数据进行修改和删除。如,删除
图书信息,删除旧的密码。
⑤指针
通过指针可以很好的对数据进行访问,在链表和文件的使用中指针的功能无可替代,如
在还书功能和修改密码中,都有很大的作用。
2.遇到的难点及解决办法
(1)不知道如何停止程序,以及只让程序在 ESC 和回车按下后才继续工作。
解:查阅资料 getch()
所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上
函数原型:int getch(void)
返回值:读取的字符
代码: for(;i!=13&&i!=27;)
i=getch();
(2)不知道 C 语言未初始化的变量的值,导致无限循环。
解:全局变量 、静态变量初始值为 0
局部变量,自动变量初始值随机分配
(3)不知道如何快速清理文件和新建文件
解:查阅览书本后知道,先只写文件,如果文件名和已存在的相同,那么就会先删除原
有文件,而且如果不存在文件将会之间新建文件。
fp=fopen("library.txt","w"); \\清空
4
fclose(fp);
if ((fp=fopen("library.txt","r"))==NULL)//快速新建
{
fp=fopen("library.txt","w");
fclose(fp);
}
(4)对 a!=2 和 a=!2 弄混淆
解:a!=2:表示 a 不等于“2”;
a=!2:表示 a 等于“!2”(0);
(5)编译正确,但是有的时候 scanf 语句好像没有执行,输入数据回车,程序没反应
解:查阅得知:
这种情况通常发生在前面已经有了输入语句,而当前的 scanf 是在接收字符(即用
%c 控制输入)时。由于前面的输入语句(不一定是 scanf)把最后输入的'\n'遗留在了输入
缓冲区,而当前的 scanf("%c",...);又会把'\n'当一个字符接收,又由于 scanf 在%c 控制
下只接收一个字符,所以就不能接收正式输入的字符了。解决这一问题的最简单办法
是在接收字符的 scanf 的控制符"%c"中的%前加一个空格写成" %c",把前一次输入遗
留在输入缓冲区里的所有广义空格(' '、'\t'、'\n'等)都吸收掉。在接收字符的 scanf 前加
getchar()等的办法其实是有漏洞的——当缓冲区里只遗留了一个广义字符时可正常
工 作 , 若 多 于 一 个 则 同 样 出 错 。
按回车没反应
(6),关于“feof”的误区
For(;!feof(fp););
n++;
n--;来判断文件里面字符的个数为什么错误,
查阅得知:
1.EOF
EOF 是一个计算机术语,为 End Of File 的缩写,在操作系统中表示资料源无
更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字
符表示资料结束。这个定义的意思是,文档的结尾都有一个隐藏字符”EOF”,
当程序读取它的时候,就会知道文件已经到达结尾。通常使用 while 循环加
EOF 判断作为读取结束的标志。
EOF 的值通常为 -1,但它依系统有所不同。
2.feof()
feof()的原理:
feof()函数,并不是通过读取到文件的 EOF 来评判,这个文件是否为空。
5
对 feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如
果有,返回 0;如果没有,返回非 0。它并不会读取相关信息,只是查看光标后
是否还有内容。
直接使用时的错误分析:
对于一个空文件来说,当程序打开它的时候,它的光标会停在文件的开头,但是由于
文件里什么内容都没有存(但是 EOF 是存在的),即整个文件就存贮了一个 EOF。当
程序打开文件,并直接调用 feof()时,这个函数就会站在光标的位置向后张望,结果就
看见了 EOF,然后就当然返回 0 了。所以使用 feof()函数时,必须要读取文件,让
光标移动。
(7)错因:用正确的格式写入文件,结果却没有数据
解:没有及时 fclose(fp),不弥补数据储存的原理。
打开文件 fopen 函数把返回值赋给 fp,用 fclose 关闭文件,如果不关闭文件就结束
程序将会丢失数据,因为,在向文件里面写入数据时,是先将数据输入到缓冲区,待缓
冲区从满后才正式输出给文件。因此用 fclose 函数关闭文件时,先把缓冲区中的数据输
出到磁盘文件,然后才撤销文件信息区。
三、实现的主要功能和系统结构
1.实现的主要功能
登录功能
(1)登录系统