1、秦思军C语言课程设计课程设计Yangtze University College of Arts and Science学生实习手册(课程设计报告)学 部: 理 工 学 部 专 业: 电 子 信 息 工 程 班 级: 5111班 姓 名: 秦 思 军 学 号: 20114002 课程名称: C语言程序设计课设 指导教师: 杜红 呙明辉 实习时间:2012年7月6日至2012年7月14日一、课设题目 图书管理系统二、设计目的 问题描述:本程序属于非数值计算型算法设计,学生需要设计出图书馆模拟系统所需要的基本功能,并设计简单的界面(无需图形化)。 实现功能: 1、通过提示菜单选择可以进行的操作2、
2、将图书的基本信息存入文件中,并命名为book.txt3、将图书借阅统计信息存入文件中,并命名为record.txt4、将图书卡号统计信息存入文件中,并命名为card.txt4、在本系统中可以进行管理系统包含的基本操作,其中包括:a) 输入图书的图书名或作者名,从当前图书中进行查找,如果找到则显示该图书的相关信息,如果没有找到则给出提示信息;b) 添加图书的基本信息,通过输入图书相关信息,首先查找是否存在该图书名的图书,如果存在则提示重新输入,否则将该图书按照顺序插入到相应位置;c) 修改图书的基本信息,通过输入图书名,首先查找是否存在该图书名的图书,如果存在则提示重新输入,否则将提示修改项(序
3、号、书名、作者、单价),依据提示进行修改;d) 删除图书的基本信息,通过输入图书名,首先查找是否存在该图书名的图书,如果存在则将该图书删除,否则给出提示信息,提示该图书不存在;e) 借阅图书,需要给出卡号和图书书名,如果图书名不存在则重新输入,直到输入正确为止,并将学号和相应的图书名存入record.txt文件中。f) 归还图书,需要输入卡号和图书书名,如果图书名不存在则重新输入,直到输入正确为止,然后确认归还;g) 统计分为对在架图书、学生借阅图书、借书卡三项的统计,申请卡号借阅书籍会对三项统计进行修改,显示。5、图书基本信息包括图书序号、书名、作者、单价、状态这些简单信息。6、图书信息文件
4、中每一行存放一本图书的信息。7、借阅信息文件中每一行存放一本书的借阅情况。掌握知识点:本程序主要考察对自定义函数的熟悉程度,本程序中主要使用到的是数组和文件的相关操作,包括数组的输入、输出、查找、插入、删除、修改和文件不同形式的读取、写入等操作,需要对数组和文件有比较深入的掌握。三、总体设计1、图书管理系统组成框图2、调用的借阅、卡号统计函数流程图3、调用的删除图书、卡号函数流程图4、调用修改图书函数流程图四、详细设计模块功能说明: (包括结构体、借阅统计函数、卡号统计函数、删除图书函数、 删除卡号函数、修改图书函数)1、结构体:包括学生借阅信息、图书相关信息、借阅卡信息struct stud
5、ent/学生借阅信息结构体 int cardnum;/卡号 char borrowbook10;/借阅图书student100;struct book/图书相关信息结构体 int booknum;/图书序号 char bookname20;/图书名 int bookprice;/图书单价 char bookauthor20;/图书作者 int status;/图书状态book100;struct card/借阅卡信息结构体 int cardnum;/卡号 char sex4;/性别 char studentname20;/学生姓名 int studentclass;/学生班级card100;2
6、、借阅统计函数功能:在被调用时,将图书库里的所有被借图书统计起来, 当增加或删除图书时,不能改变此统计结果;当借出或归还时,才能改变它;(此函数无参数,所以无参数说明和函数调用关系)borrowcount()/借阅统计 system(cls); /清屏 FILE *fp; int i,n=0; printf(nttt借书统计nn); /进入借书统计界面 fp=fopen(record.txt,r); /将文件record.txt以读的方式打开 for(i=0;fread(&studenti,sizeof(struct student),1,fp)!=0;i+) printf(t卡号tt借出的书
7、籍n); printf(t%dtt%sn,studenti.cardnum,studenti.borrowbook); n=n+1; /读一次就在统计上加一 fclose(fp); printf(目前共有%d本书借出n返回三级菜单n,n); getche(); return 0;3、卡号统计函数功能:在被调用时,将在此图书馆办理借阅卡统计起来, 当增加或删除卡时,能改变此统计结果;(此函数无参数,所以无参数说明和函数调用关系)cardcount()/卡号统计 system(cls); /清屏 FILE *fp; int i,n=0; printf(nttt卡号统计nn); /进入卡号统计界面
8、fp=fopen(card.txt,r); /将文件card.txt以读的方式打开 for(i=0;fread(&cardi,sizeof(struct card),1,fp)!=0;i+) printf(第%d张卡n,i+1); printf(t卡号tt性别tt姓名tt班级n); printf(ttn); printf(t%dtt%stt%stt%dn,cardi.cardnum,cardi.sex,cardi.studentname,cardi.studentclass); n=n+1; /读一次就在统计上加一 fclose(fp); printf(n目前共有%d个学生n按任意键返回三级菜
9、单n,n); getche();4、删除图书函数功能:在被调用时,将图书库里需要删除的书籍删除,不需考虑其是 借出(此函数无参数,所以无参数说明和函数调用关系)delbook()/删除图书 system(cls); FILE *fp,*fp2; int i; char bookname10,choice; printf(nttt删除图书nn); /进入删除图书界面 fp=fopen(book.txt,r); /将文件book.txt以读的方式打开 fp2=fopen(book1.txt,w); /将文件book1.txt以写的方式打开 printf(t书名:nt ); scanf(%s,boo
10、kname); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) if(strcmp(bookname,booki.bookname)!=0) / 通过比较,在图书库里寻找所删除的图书 fwrite(&booki,sizeof(struct book),1,fp2);/将非删除的所有书写到book1.txt fclose(fp); fclose(fp2); printf(t确认删除(y/n)?nt ); getchar(); scanf(%c,&choice); if(choice=y|choice=Y) fp=fopen(book.t
11、xt,w); fp2=fopen(book1.txt,r); for(i=0;fread(&booki,sizeof(struct book),1,fp2)!=0;i+) fwrite(&booki,sizeof(struct book),1,fp); /将book1.txt里数据写到book.txt fclose(fp); fclose(fp2); fp2=fopen(book1.txt,w); fclose(fp2); /清空临时文件book1.txt printf(t删除成功,按任意键返回三级菜单n); getchar(); return 0; else printf(t按任意键返回n)
12、; getche(); return 0; 5、删除卡号函数功能:在被调用时,将卡号库里面需要删除的卡号删除;(此函数无参数,所以无参数说明和函数调用关系)delcard()/删除卡号 system(cls); FILE *fp,*fp2; int i; int cardnum; char choice; printf(nttt删除卡号nn); / 进入删除卡号界面 fp=fopen(card.txt,r); fp2=fopen(book1.txt,w); printf(t要删除的卡号(不存在则不作改动):nt ); scanf(%d,&cardnum); for(i=0;fread(&car
13、di,sizeof(struct card),1,fp)!=0;i+) if(cardi.cardnum!=cardnum) / 通过比较,在卡号库里寻找所删除的卡号 fwrite(&cardi,sizeof(struct card),1,fp2); /将非删除的卡号写到book1.txt fclose(fp); fclose(fp2); printf(t确认删除?(Y/N)!nt ); getchar(); scanf(%c,&choice); if(choice=y|choice=Y) fp=fopen(card.txt,w); fp2=fopen(book1.txt,r); for(i=
14、0;fread(&cardi,sizeof(struct card),1,fp2)!=-0;i+) fwrite(&cardi,sizeof(struct card),1,fp); /将book1.txt里数据写到card.txt fclose(fp); fclose(fp2); fp2=fopen(book1.txt,w); fclose(fp2); /清空临时文件book1.txt printf(t删除成功,返回三级菜单n); getchar(); return 0; else getchar(); printf(t操作已取消!n按任意键返回n); getche(); return 0;
15、6、修改图书函数功能:在其被调用时,将需修改的图书基本信息进行修改,分为对图书序号、图书名、作者及单价的修改;(此函数无参数,所以无参数说明和函数调用关系)changebook()/修改图书 system(cls); FILE *fp,*fp2; char bookname10,choice; int i; printf(nttt修改图书nn); /进入修改图书界面 fp=fopen(book.txt,r); fp2=fopen(book1.txt,w); printf(t书名:nt ); /输出需修改的书名 scanf(%s,bookname); getchar(); for(i=0;fre
16、ad(&booki,sizeof(struct book),1,fp)!=0;i+) if(strcmp(booki.bookname,bookname)=0)/寻找所需修改的图书 printf(t你所要修改的书的资料如下,请选择你要修改的内容:n); printf(t序号tt书名tt作者tt单价n); printf(t%dtt%stt%stt%dn,booki.booknum,booki.bookna me,booki.bookauthor,booki.bookprice); printf(nt1:修改书号:n); printf(t2:修改书名:n); printf(t3:修改作者:n);
17、printf(t4:修改单价:n); printf(t请输入-4:nt ); choice=getchar(); switch(choice) /选择1-4的不同修改项 case 1: printf(t新的书号:nt ); scanf(%d,&booki.booknum); fwrite(&booki,sizeof(struct book),1,fp2); break; case 2: printf(t新的书名:nt ); scanf(%s,booki.bookname); fwrite(&booki,sizeof(struct book),1,fp2); break; case 3: pri
18、ntf(t新的作者:nt ); scanf(%s,booki.bookauthor); fwrite(&booki,sizeof(struct book),1,fp2); break; case 4: printf(t新的单价:nt ); scanf(%d,&booki.bookprice); fwrite(&booki,sizeof(struct book),1,fp2); break; default:printf(t没有这样的操作!);break; getchar(); continue; fwrite(&booki,sizeof(struct book),1,fp2);/将修改后的图书
19、信息写入book1.txt fclose(fp); fclose(fp2); fp=fopen(book.txt,w); fp2=fopen(book1.txt,r); for(i=0;fread(&booki,sizeof(struct book),1,fp2)!=0;i+) fwrite(&booki,sizeof(struct book),1,fp);/将book1.txt数据写入book.txt printf(t修改成功,按任意键返回二级菜单n); getche(); fclose(fp); fp2=fopen(book1.txt,w); / 将临时文件清空 fclose(fp2);五
20、、运行结果及分析1、调用借阅统计函数时的运行结果2、调用卡号统计函数时的运行结果3、调用删除图书函数时的运行结果4、调用删除卡号函数时的运行结果5、调用修改图书函数时的运行结果六、调试与测试 调试就是利用软件的功能将程序的每一步按照流程走一次,如果出现问题就能很直接,很精确地找出问题的所在,从而更好地解决问题。 调试方法:将断点设在需检测的程序语句的首段,特别是要在关键、易出错的地方;然后开始调试,按照要求一步一步的进行,遇到停止的地方说明此处有问题,还可以在watch里面输入你要观察的变量这样就更直接的观察程序是怎样运行的,看是不是按照自己的程序思想在进行。 测试结果的分析:在运行测试某段程
21、序时,如果程序一直按照编译者的初衷来运行,并且没有“卡壳”,说明测试结果理想;否则,就是程序出现问题,就得分析原因,找出症结所在,在不断的更改讨论和调试运行中,得出最好的解决方案。 在此,我调试了一下删除图书函数与主函数的连接及调用 函数运行的过程:1、调用删除函数drlbook()之前在主函数里2、调用此函数即转到此函数当中3、在此函数里面正常运行 在此次我负责的程序段中,我是首先运行是否有错,功能是否实现,最后才进行调试,并且调试的结果是理想的,所以没有在调试中遇到问题。七、课程设计心得及体会本次课程设计经历地十分辛苦,想必都有这个体会(老师也不例外),这就是我们在上半学期没有更好地学习C
22、语言知识,同时也没有接触课外有关于C语言方面的知识,才导致我们一下碰到这么复杂,从没接触过的课设(对于我们而言);但是也就是因为这种情况,我才意识到自己这方面的知识太薄弱了,什么事、知识都不能一味地考老师来教,自己得有自觉学习的能力和习惯。在编程的一个多星期里,以小组为单位的我们表现了团队的力量,分工明确,虽然途中遇到过很多困难,我们依然坚定地解决了,最后完成了设计。再说一下我自己在这个过程当中的体会:编程的过程使我了解到我还有好多东西没有掌握,或者没有接触到的知识点,但是也通过自己的自学、请教老师、同学,学到了不少东西,例如:在编程方面对结构体的理解与运用,熟练运用文件,学会怎样去调试某段程
23、序使之运行得当;在计算机方面,学会了好多有关计算机方面的知识总结:本次课程设计虽然“历经磨难”,但也“硕果累累”,不仅是一个挑战,更是一个提醒,提醒我大学应该做什么,怎样学习才更有效,将来步入社会,将何去何从等等一系列“有营养”的话题。最后,我还期待着下一个课程设计会给我带来什么“营养”,我将拭目以待八、源程序清单和执行结果:#include#include#include#include#includestruct student/学生借阅信息结构体 int cardnum;/卡号 char borrowbook10;/借阅图书student100;struct book/图书相关信息结构体
24、 int booknum;/图书序号 char bookname20;/图书名 int bookprice;/图书单价 char bookauthor20;/图书作者 int status;/图书状态book100;struct card/借阅卡信息结构体 int cardnum;/卡号 char sex4;/性别 char studentname20;/学生姓名 int studentclass;/学生班级card100;search_by_name()/按图书名查阅 FILE *fp; char bookname10; int i,flag=0; fp=fopen(book.txt,r);
25、 printf(t请输入你要查找的书名:nt ); scanf(%s,bookname); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) /将book.txt内容读到图书数组 if(strcmp(bookname,booki.bookname)=0) /通过比较,在图书库里查询要找的书 flag=1; if(booki.status=1) /当图书存在status=1输出相关信息 fclose(fp); printf(t书号tt书名tt作者tt单价nt%dtt%stt%stt%dn,booki.booknum,booki.bookn
26、ame,booki.bookauthor,booki.bookprice); printf(t此书无人借阅n); / status=1 else printf(t这本书已经有人借出n); / status=0 fclose(fp); return 0; if(flag=0) printf(t没有你要查询的书籍!n); fclose(fp); return 0;search_by_author()/按作者名查阅 FILE *fp; char bookauthor10; int i,flag; fp=fopen(book.txt,r); printf(t请输入你要查找的作者名:nt ); scan
27、f(%s,bookauthor); for(i=0;fread(&booki,sizeof(struct book),1,fp)!=0;i+) /将book.txt内容读到图书数组 if(strcmp(bookauthor,booki.bookauthor)=0) /通过比较,在图书库里查询要找的书 flag=1; if(booki.status=1) /当图书存在status=1输出相关信息 fclose(fp); printf(t书号tt书名tt作者tt单价nt%dtt%stt%stt%dn,booki.booknum,booki.bookname,booki.bookauthor,booki