《c语言图书管理系统课程设计报告.pdf》由会员分享,可在线阅读,更多相关《c语言图书管理系统课程设计报告.pdf(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、合肥学院计算机科学与技术系课程设计报告20102011学年第二学期课程C 语言课程设计课 程 设 计 名 称图书管理系统学生姓名学号专业班级指导教师2011年 6 月一、需求分析为了满足图书管理的要求,通过计算机技术给图书管理人员和读者借、还书带来便利。使用 c 语言编写了图书管理系统。本系统主要实现图书信息管理的功能,通过此系统可对图书馆库存图书信息进行管理和维护操作。实现了图书馆内管理的一般功能,包括查询、借书、还书、添加、删除、修改图书信息等。所设计的系统以菜单方式工作,为用户提供清晰的使用提示,依据用户的选择来进行各种处理,并且在此过程中能够尽可能的兼容用户使用过程中可能出现的异常情况
2、。图书信息包括编号、书名、作者、出版社、出版日期、价格、在库状态等。图书信息的录入和显示要求有一定的规范格式,录入的图书信息用文件形式保存,并可以对其进行浏览、查询、修改、删除等基本操作。整个程序实现链表操作,对图书信息的操作逐个地进行,一个图书信息的更改不应影响其他的图书记录。二、算法设计:1设计思想:整个系统制造的而过程中,涉及了较多 C语言知识点,对于不同的数据类型、程序控制结构、数据结构作以分析和总结,并结合这个课题进行综合的应用,在一定程度上做到了对所学知识融会贯通。进一步加深、巩固了所学的专业的基本理论知识,培养了综合分析问题、解决问题的能力。在设计程序时,实现了程序的模块化、结构
3、化。在主函数中调用各种子函数,操作界面简单,易操作。2,设计表示:(1)、整个系统除了主函数外,另外还有各种功能子函数,利用无限次循环语句 while()和选择语句 swithch()实现各个子函数的调用,系统根据输入的数字选项来调用相应的函数,以实现相应的功能。主要实现了图书的录入、存储、查询、添加、删除、修改、借书、还书等功能。(2)、Cbook();这是一个指针函数,它主要实现了链表的创建,并且在创建过程中从文件读取信息到链表中,以用于后面其他函数的操作。它返回的时一个单向链表的头。其他函数调用时只需调用它返回的头即可。(3)、mainmenu();、menu1();、glmenu();
4、、cxmenu();、jhmenu();这五个函数时整个图书管理系统的全部菜单函数,mainmenu();为系统主界面,进入时可选择进入程序和退出程序。menu1();为进入程序时显示的功能菜单,在此菜单可以选择录入、保存图书信息,也可选择进入其他子系统。glmenu();此菜单为进入图书管理系统的菜单,在此可以选择添加、删除、修改图书等操作。cxmenu();为查询系统的菜单,在此可以选择按书名、编号、作者等方式进行查询图书。jhmenu();为借书还书的子菜单,在此可以选择借书还书操作。操作完成后按提示信息进行文件的保存操作。(4)、print();这个函数为链表的输出函数,把链表的头传给
5、函数后,可输出整个链表的所有信息。、(5)、hold();这个函数为保存信息到文件的函数,使用时将链表的头传给函数,函数可将整个链表的所有信息存入到磁盘文件中。并覆盖掉源文件,以便以后调用。(6)、holdcx();这个函数为保存查询信息到文件的函数,使用时将查询到的节点指针传给函数,函数会将该节点所有信息保存到文件中去,文件写入是以追加方式写入,以便用户查看。(7)、findnumber();findboookname();findauthor();这三个函数为查询图书信息函数,findnumber();按编号查询、findboookname();按书名查询、findauthor();按作者
6、查询。查询到信息后返回信息所在节点,查询不到则返回空指针。(8)、add();sortnumber();delbook();revamp();这四个函数为功能函数,add();添加一本图书信息、sortnumber();将图书按编号排序、delbook();删除一本图书信息、revamp();修改一本图书信息。调用时将链表头指针传递给函数,函数返回经过功能操作后的头指针。(9)、borrowbook();returnbook();这 两 个 函 数 是 借 书 还 书 的 函 数,borrowbook();借书 returnbook();还书。在借还后系统会修改图书的在库信息。调用时将链表头指
7、针传递给函数,函数返回经过功能操作后的头指针。并会出提示信息让用户返回菜单保存信息。3实现注释:这个实用的小型图书管理程序程序以链表操作完成,并实现文件信息的录入和保存等功能,所有信息以磁盘文件方式保存,方便用户使用。实现了图书管理的基本功能,包括了图书的录入、存储、查询、添加、删除、修改、借书、还书等功能。查询时可按书名、编号、作者等方式查询,找到后输出这本书的所有信息。在添加图书信息后,还增加了链表排序操作,并输出整个链表,方便用户检查信息。可查询图书的在库状态,方便用户进行借书、还书操作。在借书还书成功后图书的在库状态改变,并有提示信息让用户保存信息。系统中主要的数据结构就是图书的信息,
8、包含编号、书名、作者、出版社、出版时间、价格、在库状态等,在处理过程中各项可以作为一本图书的不同属性来进行处理。4结构体系设计:图书管理系统主界面流程图图书管理系统流程图录入所有书籍信息进入图书管理系统显示菜单进入图书查询系统进入图书借还系统保存所有图书信息返回上级菜单图书管理系统主界面开始返回上级菜单显示所有图书信息添加一本图书信息修改一本图书信息删除一本图书信息保存所有图书信息图书管理系统主界面图书查询系统主界面流程图图书借还系统主界面流程图5设计过程中的想法与程序中的不足:作为学期末的一项课程,主要靠编出来的系统来考察我们所掌握的基本理论知识及实际解决问题的能力,通过这次 c 语言课程设
9、计,很大程度上锻炼了我们写程序的动手能力和自主思考能力。利用所学知识,开发小型实用的应用系统,掌握运用 C语言编写调试应用系统程序,对于我们独立开发应用系统并进行数据处理的综合能力是一个很大的提高。总的来说这个程序大致实现了题目的要求,但是这套程序仍然存在着很多的显示所有图书信息按编号查询图书按书名查询图书按作者查询图书保存所查询图书的信息返回上级菜单图书查询系统主界面借书还书返回上级菜单图书借还系统问题与不足。比如,没有对界面进行操作,只是实现了简单的功能,程序写的有点繁琐,不是那么井然有序,条理清晰,程序注释也不是很完善,对信息处理功能还有些不足之处,提示信息不明确,对于数据的错误输入处理
10、不是很完善等等。这个系统主要是我自己编写的,同时也得到了老师和同学的一些帮助。我在做系统的过程中也遇到了很多问题,有的是知识不足,有的是考虑不够周全,。事实证明,只靠自己的知识面还是很窄,独立处理问题能力不是很强,以后还要加强对 c 语言的学习。我认为对于 C语言编写的程序来说,使用方法大致都是一样的,所以如果要改进的话,就是要改进一些算法,尽量把界面编写清楚,提示信息全面,方便易用。三、用户手册:下面,我大致介绍一下我的系统的主要功能和注意事项:当运行此程序时,首先进入系统主界面,然后可以选择1.进入系统,2.退出系统。选择 1 后进入系统,然后显示功能菜单按数字键选择所需服务。功能菜单中,
11、1 录入所有书籍信息,2 进入图书管理系统,3 进入图书查询系统,4 进入图书借还系统,5 保存所有图书信息,6 显示菜单,7 返回上级菜单。当出现 请选择 时,需要输入选项前的数字,输完之后按回车(下同)。首次运行系统需要先选择 1 录入库存书籍信息,然后再选择其他操作。当选择 2 时会进入图书管理系统,在这里可以选择添加、修改信息等操作,需要注意的是每次执行完添加、修改等操作后需要手动选择保存图书信息的操作,不然磁盘文件信息不会改变(下同)。返回上级菜单进入图书查询系统、图书借还系统的操作和管理系统的差不多,用户可自己尝试使用,所有信息最后均以磁盘文件方式保存,而且格式固定,在输入和输出均
12、按这种格式,用户在使用时必须要按这种格式输入,否则会出现文件信息错误。四、调试与测试:上机操作(截图)系统主界面(选择数字进入,退出系统)选择 1 进入系统,然后出现功能菜单;选择 3 进入查询系统,然后出现功能菜单;选择 2 输入图书编号,显示查询到图书;五、小节:在这一个星期的实践中,通过编写这个图书管理系统,我体会到了 c 语言学习的实用性。将理论和实践结合在一起,用先进的计算机工具方便人们的生活。C语言程序的编写首先要从大局考虑,把自己编写整个程序的思想都写在草稿上,这样有助于自己编写程序,在编写时要完善注释,方便其他人理解程序。编写的程序从理论上来说并没有错,但以上机就问题不断。甚至
13、有些课本上的知识照搬不变,也不能得到正确的结果。有时一个程序改了一遍又一遍,但就是不能成功,编程显得枯燥乏味,看似简单的程序题,在调试时却屡屡出错。经反复的修改后,结果正确了,这时所有的乏味都显得那么无力,一切都是值得的。我认为,开发一套系统,最重要的是细心,并且思考要全面,结合实际,充分考虑到客户的需求和现实意义。不管什么系统,只用运用到实际应用中,才具有先现实意义。所以 c 语言程序的实用性很强,我们以后还要更加努力认真地学习编程语言。参考文献:1 黄明等编著 C语言课程设计北京:电子工业出版社2 郭翠英编著 C语言课程设计案例精编北京:中国水利水电出版社3 宁正元数据结构(c 语言)南京
14、:东南大学出版社。2000 年 6 月第 1 版4 严蔚敏等数据结构(c 语言版)北京:清华大学出版社,1997 年 4 月第 1 版5 谭浩强编著C程序设计题解与上机指导(第 3 版)北京:清华大学出版社6 谭浩强编著 C程序设计(第 3 版)北京:清华大学出版社7 洪国胜 等编著 C+Builder程序设计轻松上手北京:清华大学出版社8 宁正元数据结构(c 语言)南京:东南大学出版社。2000 年 6 月第 1 版9 严蔚敏等数据结构(c 语言版)北京:清华大学出版社,1997 年 4 月第 1 版。10 明日科技编著Visual C+程序开发范例宝典北京:人民邮电出版社。11 胡学钢等数
15、据结构算法设计指导北京:清华大学出版社,1999年 第 1版。12 刘大有数据结构(面向 21 世纪课程教材)北京:高等教育出版社。2001年 6 月第 1 版。13 胡学钢等数据结构算法设计指导北京:清华大学出版社,1999年 第 1版。附录:源程序代码#include#include#include typedef struct link char number100;/编号char bookname100;/书名char author100;/作者char publish100;/出版社char time100;/出版时间float price;/价格char status100;/在库
16、状态struct link*next;link;/函数声明link*Cbook();void mainmenu();void menu1();void glmenu();void cxmenu();void jhmenu();void print(link*head);void hold(link*head);void holdcx(link*t);link*findnumber(link*head);link*findboookname(link*head);link*findauthor(link*head);link*add(link*head);link*sortnumber(link
17、*head);link*delbook(link*head);link*revamp(link*head);link*borrowbook(link*head);link*returnbook(link*head);/主函数main()int a,b,c,d,e;link*h,*t;L:system(cls);/L为一个标志位,用于从子函数返回主界面mainmenu();while(1)/主程序循环运行 scanf(%d,&a);switch(a)case 1:/进入主系统 B:system(cls);/B为一个标志位,用于从子函数返回主功能界面menu1();while(1)scanf(%d
18、,&b);switch(b)case 1:/图书信息的录入 h=Cbook();break;case 2:/进入图书管理的子系统 system(cls);glmenu();while(1)scanf(%d,&c);switch(c)case 1:/显示所有图书信息 print(h);break;case 2:/添加一本图书信息 h=add(h);h=sortnumber(h);print(h);break;case 3:/修改一本书的信息 revamp(h);break;case 4:/删除一本图书信息 h=delbook(h);print(h);break;case 5:/保存图书信息 ho
19、ld(h);break;case 6:goto B;break;break;case 3:/进入图书查询的子系统 system(cls);cxmenu();while(1)scanf(%d,&d);switch(d)case 1:/显示所有图书信息 print(h);break;case 2:/按编号查询图书 t=findnumber(h);if(t=NULL)printf(没有要查询的图书!);if(t!=NULL)printf(查询的图书为:);printf(n);printf(n*n);printf(n 编号 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt 价格 tt 状态
20、n);printf(n);printf(%st%st%st%st%s,t-number,t-bookname,t-author,t-publish,t-time);printf(tt%.2f,t-price);printf(tt%s,t-status);printf(n);break;case 3:/按书名查询图书 t=findboookname(h);if(t=NULL)printf(没有要查询的图书!);if(t!=NULL)printf(查询的图书为:);printf(n);printf(n*n);printf(n 编号 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt 价格
21、tt 状态 n);printf(n);printf(%st%st%st%st%s,t-number,t-bookname,t-author,t-publish,t-time);printf(tt%.2f,t-price);printf(tt%s,t-status);printf(n);break;case 4:/按作者查询图书 t=findauthor(h);if(t=NULL)printf(没有要查询的图书!);if(t!=NULL)printf(查询的图书为:);printf(n);printf(n*n);printf(n 编号 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt
22、价格 tt 状态 n);printf(n);printf(%st%st%st%st%s,t-number,t-bookname,t-author,t-publish,t-time);printf(tt%.2f,t-price);printf(tt%s,t-status);printf(n);break;case 5:/保存查询信息 holdcx(t);break;case 6:/返回上级菜单 goto B;break;break;case 4:/图书借还系统 system(cls);jhmenu();while(1)scanf(%d,&e);switch(e)case 1:/借书 borrow
23、book(h);break;case 2:/还书 returnbook(h);break;case 3:/返回上级菜单 goto B;break;break;case 5:/保存图书信息到文件 hold(h);break;case 6:/显示主功能菜单 system(cls);menu1();break;case 7:/返回系统主界面 goto L;break;break;case 0:/退出系统 printf(ttt感谢使用,再见!);exit(0);/链表的创建和信息的录入link*Cbook()int n=0;link*p,*q,*head;FILE*fp;fp=fopen(图书信息.t
24、xt,r+);if(fp=NULL)printf(没有找到文件,请检查);p=(link*)malloc(sizeof(link);if(p=NULL)printf(申请内存出错!n);fscanf(fp,%s%s%s%s%s,p-number,p-bookname,p-author,p-publish,p-time);fscanf(fp,%f,&p-price);fscanf(fp,%s,p-status);while(feof(fp)=0)n+;if(n=1)head=p;else q=p;p=(link*)malloc(sizeof(link);if(p=NULL)printf(申请内存
25、出错!n);fscanf(fp,%s%s%s%s%s,p-number,p-bookname,p-author,p-publish,p-time);fscanf(fp,%f,&p-price);fscanf(fp,%s,p-status);q-next=p;p-next=NULL;fclose(fp);printf(信息已录入!);return head;/系统主界面void mainmenu()printf(n*n);printf(n*欢迎使用图书管理系统*n);printf(n*1.进入系统);printf(t0.退出系统*n);printf(n*n);printf(n 请选择);/功能菜
26、单void menu1()printf(n*n);printf(n*1.录入所有书籍信息*n);printf(n*2.进入图书管理系统*n);printf(n*3.进入图书查询系统*n);printf(n*4.进入图书借还系统*n);printf(n*5.保存所有图书信息*n);printf(n*6.显示菜单*n);printf(n*7.返回上级菜单*n);printf(n*n);printf(n 请选择);/管理系统菜单void glmenu()printf(n*n);printf(n*1.显示所有图书信息*n);printf(n*2.添加一本图书信息*n);printf(n*3.修改一本图
27、书信息*n);printf(n*4.删除一本图书信息*n);printf(n*5.保存所有图书信息*n);printf(n*6.返回上级菜单*n);printf(n*n);printf(n 请选择);/查询系统菜单void cxmenu()printf(n*n);printf(n*1.显示所有图书信息*n);printf(n*2.按编号查询图书*n);printf(n*3.按书名查询图书*n);printf(n*4.按作者查询图书*n);printf(n*5.保存所查询图书的信息*n);printf(n*6.返回上级菜单*n);printf(n*n);printf(n 请选择);/借还系统菜单
28、void jhmenu()printf(n*n);printf(n*1.借书*n);printf(n*2.还书*n);printf(n*3.返回上级菜单*n);printf(n*n);printf(n 请选择);/输出链表函数void print(link*head)link*p;p=head;if(p=NULL)printf(文件中没有图书信息n);else printf(n);printf(n*n);printf(n 编号 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt 价格 tt 状态 n);while(p!=NULL)printf(n);printf(%st%st%st%s
29、t%s,p-number,p-bookname,p-author,p-publish,p-time);printf(tt%.2f,p-price);printf(tt%s,p-status);printf(n);p=p-next;/保存信息到文件子函数void hold(link*head)link*p;FILE*fp;fp=fopen(图书信息.txt,w+);if(fp=NULL)printf(文件操作出错!);exit(1);p=head;for(;p!=NULL;p=p-next)fprintf(fp,n);fprintf(fp,%st%st%st%st%s,p-number,p-bo
30、okname,p-author,p-publish,p-time);fprintf(fp,tt%.2f,p-price);fprintf(fp,tt%s,p-status);fclose(fp);printf(信息已保存。);/子函数保存查询的信息到文件void holdcx(link*t)link*p=NULL;FILE*fp;fp=fopen(查询.txt,a+);p=t;fprintf(fp,查询到的信息为:n);fprintf(fp,n);fprintf(fp,n*n);fprintf(fp,n编号 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt 价格 tt 状态 n);f
31、printf(fp,n);fprintf(fp,%st%st%st%st%s,p-number,p-bookname,p-author,p-publish,p-time);fprintf(fp,tt%.2f,p-price);fprintf(fp,tt%s,p-status);fprintf(fp,n);fclose(fp);printf(信息已保存!);/子函数按编号查询link*findnumber(link*head)char key100;link*h,*t1=NULL;printf(请输入图书的编号:);getchar();gets(key);for(h=head;h!=NULL;h
32、=h-next)if(strcmp(key,h-number)=0)t1=h;break;return t1;/子函数按书名查询link*findboookname(link*head)char key100;link*h,*t2=NULL;printf(请输入图书的书名:);getchar();gets(key);for(h=head;h!=NULL;h=h-next)if(strcmp(key,h-bookname)=0)t2=h;break;return t2;/子函数按作者查询link*findauthor(link*head)char key100;link*h,*t3=NULL;p
33、rintf(请输入作者姓名:);getchar();gets(key);for(h=head;h!=NULL;h=h-next)if(strcmp(key,h-author)=0)t3=h;break;return t3;/添加一本图书信息link*add(link*head)link*h,*h1;h1=head;h=(link*)malloc(sizeof(link);if(h=NULL)printf(申请内存出错!);exit(1);printf(请输入添加图书的信息);printf(n);printf(n*n);printf(n 编号 tt 书名 tt 作者 tt 出版社 tt 出版时间
34、 tt 价格 tt 状态 n);scanf(%s%s%s%s%s,h-number,h-bookname,h-author,h-publish,h-time);scanf(%f,&h-price);scanf(%s,h-status);h-next=h1;return h;/将链表按编号排序link*sortnumber(link*head)link*p,*q,*temp;temp=(link*)malloc(sizeof(link);if(temp=NULL)printf(申请内存出错!);exit(1);for(p=head;p!=NULL;p=p-next)for(q=p-next;q!
35、=NULL;q=q-next)if(strcmp(p-number,q-number)0)strcpy(temp-number,p-number);strcpy(temp-bookname,p-bookname);strcpy(temp-author,p-author);strcpy(temp-publish,p-publish);strcpy(temp-time,p-time);temp-price=p-price;strcpy(temp-status,p-status);strcpy(p-number,q-number);strcpy(p-bookname,q-bookname);strc
36、py(p-author,q-author);strcpy(p-publish,q-publish);strcpy(p-time,q-time);p-price=q-price;strcpy(p-status,temp-status);strcpy(q-number,temp-number);strcpy(q-bookname,temp-bookname);strcpy(q-author,temp-author);strcpy(q-publish,temp-publish);strcpy(q-time,temp-time);q-price=temp-price;strcpy(q-status,t
37、emp-status);return head;/删除一本图书信息link*delbook(link*head)int k=0;char str10;link*h,*t,*p;h=t=p=head;printf(请输入要删除图书的书名:);getchar();gets(str);for(;p!=NULL;p=p-next)k+;if(k2)t=t-next;if(strcmp(p-bookname,str)=0)&(k=1)h=p-next;else if(strcmp(p-bookname,str)=0&k1)t-next=p-next;else if(strcmp(p-bookname,s
38、tr)=0&p-next=NULL)t=NULL;return h;/修改一本书信息(除书名外)link*revamp(link*head)link*h,*t;h=head;t=findboookname(h);if(t=NULL)printf(没有找到);else printf(修改前图书信息为:);printf(n);printf(n*n);printf(n 编号 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt 价格 tt 状态 n);printf(n);printf(%st%st%st%st%s,t-number,t-bookname,t-author,t-publish,t
39、-time);printf(tt%.2f,t-price);printf(tt%s,t-status);printf(n);printf(请输入这本书的(除书名外)所有信息:n);printf(n*n);printf(n 编号 tt 作者 tt 出版社 tt 出版时间 tt 价格 tt 状态 n);printf(n);scanf(%s%s%s%s,t-number,t-author,t-publish,t-time);scanf(%f,&t-price);scanf(%s,t-status);printf(修改后图书信息为:);printf(n);printf(n*n);printf(n 编号
40、 tt 书名 tt 作者 tt 出版社 tt 出版时间 tt 价格 tt 状态 n);printf(n);printf(%st%st%st%st%s,t-number,t-bookname,t-author,t-publish,t-time);printf(tt%.2f,t-price);printf(tt%s,t-status);printf(n);return head;/借书link*borrowbook(link*head)link*h,*p;char ch,ch1100=在库,ch2100=不在库;h=head;printf(n*n);printf(tt欢迎使用借书系统!n);p=f
41、indboookname(h);if(p=NULL)printf(借书失败,书库中没有这本书!);else if(strcmp(p-status,ch2)=0)printf(借书失败,图书不在库!);else printf(确认借出?Y/N:);scanf(%c,&ch);getchar();if(ch=Y|ch=y)strcpy(p-status,ch2);printf(借书成功,请返回上级菜单保存信息!);if(ch=N|ch=n)printf(你没有借任何书!);return head;/还书link*returnbook(link*head)link*h,*p;char ch,ch1100=在库,ch2100=不在库;h=head;printf(n*n);printf(tt欢迎使用还书系统!n);p=findboookname(h);if(p=NULL)printf(还书失败,这不是本书库的书!);else printf(确认还书?Y/N:);scanf(%c,&ch);getchar();if(ch=Y|ch=y)strcpy(p-status,ch1);printf(还书成功,请返回上级菜单保存信息!);if(ch=N|ch=n)printf(你没有还书!);return head;
限制150内