1 设计内容、任务及基本要求 (2)1.1 设计内容 (2)1.2 设计任务 (2)1.3 设计基本要求 (2)2 总体设计思路 (4)2.1 系统功能 (4)2.2 各个模块之间的主要关系 (4)2.3 总体程序框图 (5)2.4 系统的总体流程图 (5)3 功能模块的具体设计 (7)3.1 main() 函数模块 (7)3.2查询所有图书信息函数模块 (8)3.3查询一本图书信息函数模块 (8)3.4添加图书信息函数模块 (9)3.5删除图书信息函数模块 (10)3.6 借阅图书模块 (12)4 功能模块的调试与测试 (13)4.1主菜单运行界面 (13)4.2查询所有图书信息模块运行界面 (13)4.3查找某一本图书信息模块运行界面 (14)4.4 添加图书信息模块运行界面 (16)4.5 删除图书信息模块运行界面 (17)4.6 借阅图书模块信息运行界面 (79)5 总结 (22)6 致谢 (23)7 参考文献 (24)9 程序清单 (25)1.设计内容、任务以及基本要求1.1设计内容主要利用c语言的文件操作能力设计开发一个小型的图书管信息管理系统,至少具有如下功能:查寻所有图书信息、通过输入图书编号来完成查找某一本图书信息、添加图书信息、删除图书信息以及通过学生学号实现图书借阅功能。
操作界面要符合用户的一般习惯,界面易于读者明白理解,图形或文本界面都可以。
1.2设计任务要求:明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识;提高学生用高级语言进行程序设计的能力,重点提高用C语言进行文件操作和绘图应用的编程技术水平;初步了解软件开发的一般方法和步骤;提高撰写技术文档的能力。
掌握模块化编程的基本方法与步骤;巩固和加深学生对C语言课程基本知识的理解与掌握,培养学生利用C语言进行软件操作的能力和技巧。
1.3基本要求(1)通过提示菜单选择可以进行的操作。
(2)将图书的信息存入文件中,并命名为BookInfo.txt。
(3)将图书借阅情况信息存入文件中,并命名为SendInfo.txt。
(4)在本系统中可以进行管理系统包含的基本操作,其中包括a)查看所有图书的信息。
b)输入一本图书的图书编号,从当前图书中进行查找,如果找到则显示该图书的相关信息,如果没有找到则给出提示信息。
c)添加一本图书的基本信息,通过输入图书编号,首先查找是否存在该图书编号的图书,如果存在则提示重新输入,否则将该图书按照顺序插入到相应位置。
d)删除一本图书的基本信息,通过输入图书编号,首先查找是否存在该图书编号的图书,如果存在则将该图书删除,否则给出提示信息,提示该图书不存在。
e)借阅一本图书,需要给出学号和图书编号,如果图书编号不存在则重新输入,直到输入正确为止,并将学号和相应的图书编号存入SendInfo.txt文件中。
(5)图书基本信息包括图书编号、书名、作者、出版社和价钱这些简单信息。
(6)图书信息文件中每一行存放一本图书的信息。
(7)借阅信息文件中每一行存放一本书的借阅情况。
2 总体设计思路2.1系统功能图书管理在生活中运用非常广泛,因此需要用许多的程序来对它们进行管理。
此程序包含了图书信息的录入、图书信息的浏览、图书的查询和排序、图书信息的删除与修改,借书,还书,统计等。
通过编译一个C语言函数,其中包含一个主函数,多个子函数,主函数调用其余的子函数实现人们能够简易、快捷的了解并找到自己所学要的信息的功能。
1、查询所有图书信息:将所有图书信息包括编号、书名、出版社、作者、价格等显示在屏幕上。
2、查找一本图书的信息:通过输入图书编号完成图书信息的查找,并在屏幕上显示。
3、修改图书信息:通过输入编号,判断此图书是否存在,若不存在则提示用户重新输入图书编号。
4、删除图书信息:通过输入编号,判断此图书是否存在,若存在,则提示用户是否显示删除后的信息,若不存在则提示用户重新输入图书编号。
5、借书:通过输入图书编号,判断此图书是否存在,若不存在则提示用户重新输入图书编号,若图书已借出则提示用户是否继续借书,若没借出则将此图书的编号和学生的学号存入图书借阅文件中。
6、退出系统:返回主页面。
2.2各个模块之间的主要关系图书信息管理系统可划分为5个模块:查询所有图书模块、查找一本图书信息模块、修改图书信息模块、删除图书信息模块、借阅图书模块。
各模块之间均有着或多或少的联系,比如:查找一本图书信息模块、修改信息模块、删除信息模块、借阅图书模块都需要先判断该图书是否存在,然后再进行其它操作。
理解了各模块之间的主要关系有利于程序的设计与完成,使程序的层次结构清晰,便于程序的编写、阅读和调试。
2.3总体程序框图图2.1 系统总框架图2.4图2.2 系统总流程图3 功能模块的具体设计3.1 main() 函数模块根据图书馆信息管理系统的要求,可设计一个主函数,及定义多个用户自定义函数。
在主函数中定义全局变量,即是在函数外部定义的变量,其不属于某一个函数,而属于一个源程序文件,在整个程序内可以多次被引用。
通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
运用fscanf语句在主函数中将文件中的内容赋给结构体变量,便于在自定义函数中对结构体的调用。
具体如下:在主函数中定义一个存放图书信息的结构体struct list{char num[20] ; /*图书编号*/char name[40] ; /*书名*/char author[40] ; /*作者*/char publish [40]; /*出版社*/double price; /*价格*/};以及各函数的申明void search_allinformation(struct list b[]) ; /*查看全部图书信息*/void check_bookinformation (struct list b[] ); /*查找图书信息*/void add_bookinformation (struct list b[] ); /*添加图书信息*/void delete_bookinformation (struct list b[] ); /*删除图书信息*/void borrow_book (struct list b[] ) ; /*借阅图书*/ 通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
switch (choice1){ case 1 : search_allinformation (b);break ;case 2 : check_bookinformation( b );break ;case 3 : add_bookinformation (b );break ;case 4 : delete_bookinformation( b);break ;case 5 : borrow_book( b);break ;case 0 : break ;}3.2查询所有图书信息函数模块void search_allinformation (struct list b[])通过printf()语句将所有的图书信息包括包括编号、书名、出版社、作者、价格等信息显示在屏幕上。
运用for语句加printf()实现图书信息的循环输出显示。
3.3 查询一本图书信息函数模块void check_bookinformation(struct list b[] )用户先输入图书编号后,先用strcmp(s1, s2)函数进行比较两个字符串数组的大小,从而查找出该图书是否存在,若不存在则提示用户是否要继续查找,运用switch语句,若继续则再次调用函数本身进行第二次查找,直到找到为止,若否则结束循环,不再进行查找。
通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
运用fscanf语句在主函数中将文件中的内容赋给结构体。
其主要流程图如下:关键代码:strcmp(比较字符串) case ….break(判断) printf (输出信息)switch(实现选择功能分支)3.4 添加图书信息函数模块void add_bookinformation(struct list b[] )输入图书的基本信息包括编号、书名、出版社、作者、价格,由于原有的图书信息是按照编号的大小顺序排列的,所以只需运用for 循环 和strcmp 函数找出输入的图书 应该插入的位置,再将所添加的图书信息插入即可。
其主要流程图如下:关键代码: printf(输出信息)scanf (输入信息)switch(实现多分支结构程序设计)case-break (实现功能的选择)3.5删除图书信息函数模块void delete_bookinformation (struct list b[] )用户输入所要删除的图书编号,先查找该图书编号是否存在,若存在,这提示用户是否要显示删除后的信息,若不存在则提示重新输入。
关键代码switch(实现多分支结构程序设计)if(条件选择)3.6 借阅图书模块void borrow_book(struct list b[] )用户先输入所借图书的编号,调用函数查找该图书有没有借出,若已借出,则提示用户该图书已借出,并提示用户是否继续借阅其他书籍。
若继续,则继续进行新的查找。
关键代码:if-else(实现分支选择)getchar (从键盘上输入一个字符)goto (使程序的执行流程直接转接到标号对应的那条语句)strcmp (比较两个字符串的大小)4功能模块的调试及测试4.1主菜单运行界面图4.1 主菜单运行界面图4.2查询所有图书信息模块运行界面按1操作查询所有图书信息,(1)打开源程序,编译程序,单击Compile按钮,出现错误,如图:(2)错误均指向55行,经检查发现调用函数时调用的是整个结构体,而非某一个,所以应该为 search_allinformation (b) .(3)改正后重新运行,即的如下所示的界面如下:图4.2查询所有图书信息模块界面4.3查找某一本图书信息模块运行界面按2选择按书名查询某一本图书信息,若图书编号存在则界面如下:图4.3 按编号查询图书信息界面若图书编号不存在,(1)输入y ,没有进行继续查找的操作(2)调试程序,可查出输入的y对程序无影响,由于输入的是一个字符,而”\0”本身也是一个字符,则可将scanf(“%s” , &a) 改为getchar ()即可。
该后则界面如下:图4.4图书编号查询图书界面4.4 添加图书信息模块运行界面按3选择,输入编号,界面如下:图4.5按图书编号添加图书界面4.5 删除图书信息模块运行界面按4选择,输入编号,如果编号不存在,界面如下:图4.6按图书编号删除图书界面如果编号存在,界面如下:图4.7按图书编号删除图书界面4.6 借阅图书模块信息运行界面按5选择,输入编号,出现如下界面:图4.8借阅图书界面(有错误)调试后找出错误为文件SendInfo.txt扩展名是隐藏的,应将文件名改为SendInfo,得到如下正确界面:图4.9借阅图书界面如果编号不存在,界面如下:图4.10借阅图书界面总结通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,所以后在学习过程中,我会更加注视实践操作。