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