《C语言课程设计(图书管理系统)(共29页).doc》由会员分享,可在线阅读,更多相关《C语言课程设计(图书管理系统)(共29页).doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上课 程 报 告课 程 名 称: 程序设计实践 专 业 班 级 : 计算机科学与技术1205班 学 生 姓 名 : 安龙龙 学 号 : 1 任 课 教 师 : 陈卫东 学 期 :2012-2013学年第二学期 课程报告任务书题 目图书信息管理系统主要内容开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能:(1)图书信息录入功能(图书信息用文件保存)输入v(2)图书信息浏览功能输出(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
2、 l 按书名查询 按作者名查询 按照价钱排序 按出版时间排序等等(4)图书信息的删除与修改扩展功能:可以按照自己的程度进行扩展。比如(1)简单的权限处理 (2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。(4)模糊查询 (5)综合查询 (6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。任务要求一、提交材料应包括:(1)系统源代码 (2)课程报告二、整个设计过程具体要求(1)需求分析 要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;(2)设计过程 要求学生进一步明确
3、各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)(3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。成绩评定报告撰写情况(30分)系统完成情况(30分)答辩情况(40分)总分内容20分规范程度5分程序测试5分基本功能20分扩展功能10分自述情况10分答辩情况30分成绩评定教师: 专心-专注-专业1 需求分析经过大一上学期的理论学习,在基础实验的基础上,本学期我们继续开设了C语言程序设计实践课。课程要求我们对已经学习的基础实验进行整合与衔接处理,并最终形成一个系统性质的规模较大
4、的程序。本次课程设计要求我们达到能独立完成一个图书管理系统,完成后要求实现的功能有对图书信息的录入、删除、修改,浏览(即输出), 按某种方式查询(要求至少一种查询方式),按某种方式排序(要求至少一种排序方式)。当然,我们可以根据自己的能力对系统进行完善性的拓展,例如自己加入简单的权限处理,统计功能,模糊查询等,甚至可以拓展为图书借阅系统。通过整个程序的开发过程,最终使我们掌握利用计算机解决实际问题的基本方法,熟悉C语言开发的全过程,提高综合应用C语言的能力、编程和调试能力,为学习计算机和通信专业的后续课程打好专业基础。 2 概要设计(1) 图书信息及数据格式图书信息: 图书信息包括图书编号、图
5、书类别、图书书名、作者、出版社、出版时间、图书价格。数据格式: 本系统采用单向链表来对图书信息进行各项操作。其中图书的编号为整型数据,价格为双精度浮点型,其余的类别、书名、作者、出版社与出版时间均为字符串类型struct tushu_node int num; char leibie20; char name30; char author20; char press20; char time20; double price; struct tushu_node*next; 一个结点的示意图如下图所示:numleibienameauthorpresstimepricenext(2)程序的整体框架
6、主菜单退出帮助统计图书数目按不同方式排序浏览按不同方式查询录入(删除修改)书名出版时间价格价格编号修改删除创建子菜单(3)模块划分1、int quanxian(); 核查权限的函数 2、int inputchioce(); 显示主菜单的函数 3、void save(); 保存链表为文件的函数 覆盖以前的信息 4、void save1(); 保存链表为文件的函数 不覆盖以前的信息 只在创建时调用5、struct tushu_node* wjtolb();从文件中读取数据并建立图书信息的链表的函数 6、int luruxinxi(); 录入学生信息的函数 7、struct tushu_node *
7、 luruxinxi_chuangjian(); 创建图书信息的函数 8、struct tushu_node * luruxinxi_charu(); 插入图书信息的函数9、struct tushu_node * luruxinxi_shanchu(); 删除图书信息的函数10、struct tushu_node * luruxinxi_xiugai(); 修改图书信息的函数11、int liulantushu(); 浏览图书信息的函数 12、int chaxuntushu(); 查询图书信息的函数 13、void chaxuntushu_num(); 按编号查询图书 14、void chax
8、untushu_name(); 按书名查询图书 15、void chaxuntushu_price(); 按价格查询图书 16、void paixutushu(); 为图书排序的函数 17、struct tushu_node* paixutushu_price(); 为图书按价格排序的函数 18、struct tushu_node* paixutushu_time(); 为图书按出版时间排序的函数 19、void sfjx() ; 写个函数 判断是否继续 排序中使用 20、int tongjitushu_shumu(); 统计图书数目的函数 21、void shiyongshuoming();
9、 使用说明的函数 3 详细设计程序的主体设计思想是根据结构化程序设计思想分模块进行设计,有一个主函数和多个自定义函数构成。主函数对于本程序来说,主函数很简单,就是定义了一个变量chioce用来接受核查用户是否有使用该管理系统的权限的函数quanxian()函数返回的值,若为1(即用户获得了使用权限),则调出显示主菜单的函数进行具体操作int main()int chioce; chioce=quanxian(); 核查用户是否有使用该管理系统的权限的函数 if(chioce=1) 若取得权限 则返回值为1 system(cls);inputchioce(); 用来显示主菜单的函数 exit(0
10、);权限函数核查用户权限的函数使用do-while语句来限制用户输入密码的次数仅为三次,并且为了使界面更具亲切感,会在用户输入密码错误时进行提示引起用户注意及提示剩余输入次数。int quanxian()int m=1,n=3,flag=0;char mima20;doprintf(nn 你好,欢迎使本图书信息管理系统!n); printf(nn); printf(【现在进行权限核查】 n-友情提醒:你共有3次输入密码的机会!n);printf(nn );if(n=2|n=1)printf(注意:你已输入错误%d次 剩余输入次数: %d 请输入密码:,3-n,n);if(n=3) printf
11、(剩余输入次数: %d 请输入密码:,n); scanf(%s,mima); /第一次输入和输错密码后再次输入显示的也卖弄不同if(strcmp(mima,chenbo0916)=0)flag=1; return flag; m+;n-;system(cls);while(strcmp(mima,chenbo0916)!=0&mnump-leibiep-namep-authorp-pressp-timep-price 结束输入控制条件Num!=0Leibie NameAuthorPressTimepriceHead 不为空Tail-next=pHead为空Head=p保存为文件Save()将链
12、表数据保存为文件的函数首先打开文件以可读写(也可以只写的方式打开 区别在于是否覆盖以前的信息)的方式,p1作为形参来接受实参head,只要不为空,写入p1 后,下移一个节点void save1(struct tushu_node* p1) /*将链表保存为文件的函数 不覆盖前面信息 */if( (fpp=fopen(1.txt,a)=NULL )printf(打开文件失败!); exit(0);while(p1!=NULL) fprintf(fpp, %d %s %s %s %s %s %lfn,p1-num,p1-leibie,p1- name,p1-author,p1-press,p1-t
13、ime,p1-price); p1=p1-next;if(fclose(fpp) printf(关闭文件失败!n); exit(0);从文件中读出数据并创建链表的函数在调用从文件读取数据创建链表的函数前,先定义head链表指针并赋值为空作为实参 。打开文件后,从文件中读取一组数据赋给已经被动态分配内存的结点指针p第一次head为空时nextP Head p1P1-nextnextP第二次以后head head p2 p1nextPP1-nexthead p2 p1删除函数 删除函数执行流程图及算法如下图所示:ReturnHead调浏览函数浏览全部图书方便看需要删除那一本 Head=NULL H
14、ead!=NULLhead=head-nextHead-numNumm比较输入需要删除图书编号numm 相等(即删除头结点)调用读取文件并形成链表的函数 不相等(删除其他结点)Ptr1=headPtr2=head-next具体删除过程 Ptr2!=NULL (即不是链表结尾 循环结束条件)Ptr2-next=ptr1-nextPtr2-numNumm比较重新保存 覆盖原来文件中数据 While循环 相等Ptr1=ptr2选择是否继续操作返回主菜单 不相等Ptr2=ptr1-nextSave()函数重新保存文件修改函数修改函数执行流程图如下:先遍历所有图书信息方便选择要修改编号调用文件到链表函数
15、输出一个显示选择修改具体成分的界面输入需要修改的图书编号 If (Head!=Null)while(p!=NULL&p-num!=numm) p=p-next; 直到相等Head-numNumm 比较 不相等 相等选择具体修改成分 Swith 语句输入新的成分替换原有图书信息的成分Save()保存至文件返回主菜单询问是否继续 是 否浏览遍历函数重新定义一组变量num、leibie、name、author、press、time、 price,将从文件中读取一组数据后赋给这组变量并输出它们,使用while(!feof(fp)),一直执行上述过程实现遍历浏览全部文件中的图书信息。浏览完成后,同样有对
16、是否继续其他操作的询问,如果选择继续,则会返回主菜单。int liulantushu() /* 浏览图书信息的函数 */ int num; char leibie10;char name30;char author20; char press20;char time20;double price; int x=-1;if( (fpp=fopen(1.txt,r)=NULL )printf( 打开文件失败 ! );exit(0);elseprintf(nn编号 类别 书名 作者 出版社 出版时间 价格n); while(!feof(fpp) fscanf(fpp,%d%s%s%s%s%s%lf,
17、&num,leibie,name,autho r,press,time,&price); printf(%d %s %s %s %s %s %lfn ,num,leibie,name,author,press,time,price); if(fclose(fpp)printf(关闭文件失败!n); exit(0); printf(nn是否继续操作? 请选择(继续-1/退出-0)); scanf(%d,&x); if(x=1) system(cls); inputchioce(); if(x=0) printf(nn谢谢你的使用! 再见n); exit (0); if(x!=1&x!=0) sy
18、stem(cls); printf(选择有误,默认返回主菜单,请重新选择:n); inputchioce();统计图书数目的函数统计函数简单的实现了对图书数目的统计,其实现思路可以看做在浏览函数的基础上去掉一些不必要的输出而是另外加上一个变量n用在while中执行一次循环就n+一次,就能统计出图书的数目了,不再具体叙述。由于feof()函数本身的原理,如果每次写入一行数据到文件中时最后有换行符号,则会出现n多加一问题或输出时最后一行复制,只要将n减一即为图书实际上的数目。查询函数查询函数算法如下图所示:found=0 flag=0p=head 输入要查询的图书的编号/书名/价格P P!=NUL
19、L比较P中相应的部分与要查询的是否相等 不相等输出查询到的信息found=1 相等P=p-next询问是否继续 如果found依然为0 ,则输出“未找到某图书”返回主菜单 是 否排序函数排序函数算法叙述如下:排序函数使用冒泡排序的算法,定义了i j两个变量来控制实现双层循环,for(i=1;inext CBAhead 辅助 P3 p1 p2比较p1与p2的排序项,如p1比 p2小,上图所有指针的指针均后移一位相反 ,若上图中p1比 p2大,则变为 P3 P3-nextAC B P2-next p1 p2简单的说始终是p1与p2比较,其中一个为前一次比较中的的大的一个,另一个向后移动内循环源程序
20、p4=(struct tushu_node*)malloc(size);p4-next=head; p3=p4;p1=head;p2=head-next;for(j=0;jpricep1-price)p3=p1;p1=p2;p2=p2-next;elsep1-next =NULL; p1-next=p2-next; p3-next=p2; p2-next =p1; p3=p2;p2=p1-next; head=p4-next;free(p4);4 调试分析 程序的编写过程中调试时遇到的问题及如何解决:问题一 界面不美观,进入一次系统只能进行一项操作的问题解决方法 通过将主菜单的显示作为一个独立
21、的函数(inputchoice(),结合函数的嵌套调用实现,与清屏函数(system(“cls”)一起,在每次进行完一次具体操作都有以下询问 printf(nn是否继续操作? 请选择(继续-1/退出-0)); scanf(%d,&x); if(x=1) system(cls); inputchioce(); if(x=0) printf(nn谢谢你的使用! 再见n); exit (0); if(x!=1&x!=0) system(cls); printf(选择有误,默认返回主菜单,请重新选择:n); inputchioce(); 实现了每次操作完成后,使只显示主菜单可继续进行其他操作问题二 权
22、限系统以前是输入学号后三位(int)进行验证并且只有一次输入机会,一次输入错误就退出系统解决方法 在权限函数中使用字符串变量(char)来作为密码,使用do-while语句来实现对输入次数的控制问题三 录入时以前的思路是想在输入的同时写入文件只有一组数据想存入文件解决方法 将保存文件作为一个独立的函数。在创建函数中有一组另外的参数来接收用户输入的数据,然后再调用保存函数将数据存入文件问题四 文件的保存与读取问题解决方法 由于系统要求结合文件的知识使用户的数据在一次输入之后即使关闭退出系统后在次进入系统时原有数据依然能继续使用。并且在对数据进行创建、删除、修改、排序等相关的操作之后要重新保存,所
23、以将将链表保存到文件和从文件读取数据建立链表都重新写作单独的函数,在进行完相关的操作后都调用save()重新保存,在再次进行操作前就先调用wjtolb()函数从文件中读取数据创建链表,实现了对数据更及时的保存与利用问题五 保存数据时覆盖不覆盖原有数据的问题解决问题 由于以前没有注意细节问题导致虽然数据被修改或是删除后保存成功,但数据不覆盖原来的数据从而出现文件中数据重复保存的问题,解决方法很简单,只要将打开文件的方式由可读可写()改为只写方式打开()就行问题六输入时无法结束输入的问题解决方法由于在输入时时先输入图书的编号,所以在输入时除了输入第一本图书的信息,即在输入第一本图书之后在输入时先输
24、入图书的编号,加上一个判断循环while(num!=0)才继续输入完这本图书的其他信息,即0可以作为输入结束标志问题七 程序漏洞,只有第二本图书信息无法修改的问题解决方法 程序设计思路有问题及对do-while语句了解不充分导致了问题。修改函数的思路是先让用户先输入要修改的图书编号再依次查询,先看头结点的图书编号与要修改的编号是否相等,如果相等继续选择要修改的图书信息成分修改,如果不相等,有个循环语句来使结点后移只带相等再选择要修改的图书信息成分修改。有问题的写法是使用了do p=p-next; while(p!=NULL&p-num!=numm) 从而导致了如果要修改的图书不是第一本而是第二
25、本时,先执行了后移一个结点直接到第三个结点即无法修改第二本图书的信息。解决后是用while循环while(p!=NULL&p-num!=numm) p=p-next; 就不存在上述问题问题八 要对图书的信息进行删除后修改前必须先浏览图书不然不知道要选择哪本图书进行操作的问题解决方法 由于上述修改与删除的操作是通过用户对图书编号的选择来完成的所以在浏览前不知道图书对于的编号就使操作具有盲目性即对图书的信息进行删除后修改前必须先浏览图书。解决时时让修改于删除函数中让用户输入编号前默认直接输出所有图书(遍历所有图书)5测试结果 编号 类别 书名 作者 出版社 出版时间 价格4 传记 让世界因你而不同
26、 李开复 北京工业出版社 2008.3 28. 2 英语 四级词汇 俞敏洪 群言出版社 2008.9 32. 5 漫画 我兔斯基你 王卯卯 动漫出版社 2009.3 32. 3 营销 哈佛市场营销策略 宋海峰 内蒙古出版社 2010.4 28. 1 杂志 电脑爱好者 无 cfan杂志社 2010.9 6. 6 教材 思修 罗国杰 高等教育出版社 2006.8 15.50 7 教材 大学英语 王大伟 外研社 2005.1 34.9 8 教材 高等数学 蒋青 高等教育出版社 2007.6 25.9现在给出一组测试数据来全程展示本图书管理系统的所有功能 功能一之核查用户权限:首先进入系统,你会发现要
27、求对用户使用权限进行核查的界面:(效果图如下)若密码为错误密码,那么你会看到提醒“注意”的界面上图密码正确,则仍然可以顺利进入系统见到主菜单 如下图若三次输入错误 将无法进入系统功能二之浏览全部图书:在主菜单界面选择3则可遍历现有全部图书信息功能三之创建或添加图书: 选择1后进入录入(删除 修改)子菜单继续选择1进入创建添加图书功能 以0结束输入结束后自动返回主菜单 再次选择3(浏览)可查看添加效果(浏览时刚才上图添加的图书信息“9 IT FLASH8 尹浩琼 电子工业出版社 2006.9 41”显示在最后一行说明程序已经实现了添加功能)功能四之为图书按规则排序:选择4后进入排序子菜单进一步选
28、择按何种规则排序(报告只演示按出版时间排序)当选择2按出版时间排序 然后回车键你会看到选1继续返回浏览看到图书已经按出版时间的先后排序完成功能五之按规则查询图书:同排序一样你可以在子菜单选择按何种方式查询(报告只演示按书名查询)选择按书名查询后你可以输入书名查询图书当代大学生的结果是“没有找到这本书”选择1继续按书名查找其他图书查找到图书让世界因你而不同时,这本图书的信息将被全部输出,如图:功能六之修改已有图书信息:从录入子菜单1进入后选择3可以进入修改功能 首先你会看到目前文件中所有图书的信息方便你选择要修改哪本图书上图选择了修改编号为1的图书 现在编号为1的图书的信息单独显示出来 你可以再
29、次根据提示界面选择修改图书1的哪一项成分我们看到图书1的作者为“无” 决定将它改为“陈波”(如下图)完成后可以利用浏览函数同样可以查看到修改后的效果修改成功功能七之按编号删除某本图书:选择要删除图书的编号前你也会看到目前所有图书的信息现在选择删除编号为8的图书浏览看到编号为8的图书已被成功删除功能八之简单的统计功能(统计图书总数目):主菜单中选择5即可统计出图书总数目(上图看出还剩余编号为1、2、3、4、5、6、7、9)八本图书统计正确 现在基本功能演示完毕 选择0退出系统为了完善 系统也设计了一个帮助功能对系统的使用方法做了简单的介绍6 课程心得总结经历了几个星期的课程设计,从设计前期的不知
30、如何下手到开始设计时的各种错误的困扰再到一个个的攻破各个问题,最后到对程序的进一步完善与课程报告的撰写。这一段时间我们由被程序困扰到几乎崩溃到最后成就感的油然而生;从一整天的坐在电脑屏幕面前到现在的带着喜悦一遍一遍运行着程序;一遍遍的互相探讨解决大家遇到的问题到越来越发现编程的有意思,我到现在真的感觉认真自己做完这样一个系统收获颇大:(1) 对结构化程序设计与函数的嵌套调用有了更清晰具体的认识(2) 对链表的操作更加熟练,更清晰的认识到链表与其他我们前面学习的数据类型(如结构体)的区别与联系,及使用方法上的异同(3) 明确认识到链表的循环操作要注意到的是前一部分对某某进行操作处理,而后要分析好对于如何实现对某某重新赋值等变化来实现继续循环(4) 引入了文件知识可以对电脑硬盘上的数据操作,改变了对C语言的狭义认识,认识 到C语言实际上还可以实现更复杂丰富的功能来利用开发的软件来进一步实现对现实中的问题的解决(5) 学习到语言的学习一定不不能忽视一个很小很小的细节,因为完全会导致不同的结果(6) 对如何用语言来完成一个较大的系统的整体思路有清晰的认识