小学数学测试系统C课程设计报告及源程序代码.docx
- 文档编号:23144118
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:42
- 大小:220.52KB
小学数学测试系统C课程设计报告及源程序代码.docx
《小学数学测试系统C课程设计报告及源程序代码.docx》由会员分享,可在线阅读,更多相关《小学数学测试系统C课程设计报告及源程序代码.docx(42页珍藏版)》请在冰豆网上搜索。
小学数学测试系统C课程设计报告及源程序代码
课程设计报告
课程名称C语言课程设计
课题名称小学数学测试系统
专业
班级
学号
姓名
指导教师
2016年01月06日
湖南工程学院
课程设计任务书
课程名称C语言课程设计
课题小学数学测试系统
专业班级
学生姓名
学号
指导老师
审批
任务书下达日期2015年12月26日
任务完成日期2016年01月06日
一、设计内容与设计
课题九:
小学数学测试系统。
具体内容见附录。
2.设计要求:
1)设计正确,方案合理。
2)界面友好,使用方便。
3)程序精炼,结构清晰。
4)上机演示。
3.设计报告要求:
课程设计报告格式如下:
1)正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体,行距为22。
2)正文的内容:
课题的主要功能、课题的功能模块的划分、主要功能的实现、程序调试、总结、附件(所有程序的源代码,要求对程序写出必要的注释),课程设计报告需5000字左右(不含附件)。
3)课程设计报告装订顺序:
封面、任务书、目录、正文、评分、程序清单附件。
二、进度安排
星期日
(17周)
星期一
(18周)
星期四
(18周)
星期五
(18周)
星期日
(18周)
14:
00-17:
00
18:
00-21:
00
18:
00-21:
00
18:
00-21:
00
交报告
上课时间另外安排。
附录:
设计课题九:
小学数学测试系统
一、问题描述:
本系统可以用来进行简单的数学测试,并累计成绩,包括用户注册、用户登录、用户删除、题目测试、信息保存等功能。
二、功能描述:
1、本系统采用结构体数组,每个数据的结构应当包括:
用户名、用户密码、共测试题目数、答对题目数。
2、系统功能:
a.用户注册:
即添加新的用户名、用户密码。
b.用户登录:
在进行数学测试之前,需进行登录,若没有该用户,需进行注册。
c.题目测试:
系统自动生成题目(注意题目的合理性,题目结果不能是负数,除数不能是0等),用户给出答案,系统可以自动测试其正确性,同时统计成绩。
d.信息保存:
当注册成功、题目测试完毕后将用户信息及成绩保存到文件。
e.退出系统。
3、系统使用说明:
执行一个具体的功能之后,程序将重新显示功能菜单。
系统的功能并不限于上述,可以对其进行扩充完善,如题目的自动生成,可以只是简单的加减乘除运算,也可以生成复杂的四则混合运算。
同时,用户界面友好也很重要,当输入错误答案,需给出提示信息。
三、测试数据:
用户>=3,题目数>=5
3详细设计10
4系统测试15
5课程设计总结18
1系统需求分析
小学生数学测试系统具有随机出题,自动评分,查看答案,错题重做等功能的系统;其属性有:
1.主界面设计,选择各种功能。
2.系统随机出题,显示算式,含加,减,乘,除四则运算。
3.练习时,系统随机出题,键入答案,可显示对错。
4.测试时,系统自动出题,每题得分,再统计得分。
5.题的对错信息,错误的给出答案。
2概要设计
系统功能模块图:
2.1注册登录模块
提示用户输入姓名和学号,如果已经有记录则将本次登录用户信息追加储存在文件中,如果没有记录,则创建一个新文件储存:
其模块图如下图所示:
2.2测试模块
进入开始测试菜单后,开始计时,选择加减乘除四种运算类型,总体来说测试模块可以分为:
加法运算、减法运算、乘法运算、除法运算四部分
四部分功能相似选择类型后,在选择题数目为(5,10,20,50,100),然后再选择难度,这时开始做题(题目利用随机函数随机出题),然后判断正误并给出正确率,错误的结果存入一个文件中以备错题重做,将所有做题的结果存入另个文件中以便查看结果;
2.3学生成绩管理模块
本模块首先将每次测试同学姓名,学号,成绩存入一个文件中,每次测试同学的信息不覆盖之前同学的信息,然后将文件中的信息读取到结构体中进行排序,最后利用结构体将排好序的成绩显示到屏幕上,其模块如下所示图:
2.4查看结果模块
利用测试模块存储的结果信息文件进行直接读取,期间用到fgetc函数将文件的信息读取出来,其图如下图所示:
2.5错题重做模块
测试模块过程的已将错题和错题的答案分别出入到文件中,直接进行打开存储错题的文件逐个读取错题,这时利用scanf函数输入答题者的答案,最后再打开储存错题答案的文件进行核对正确答案,其模块如下图所示:
系统流程图:
3详细设计
3.1登录功能得具体实现:
用到两个函数Savemessage()和Judge()两个函数,其中Savemessage()函数用来,保存学生输入信息,将输入学生信息保存到studentmessage.txt"和TestResult.txt文件中,保存过程中,先输入到结构体中,再利用fwrite(&s[0],sizeof(structStudent),1,fp);语句向文件studentmessage.txt中写入一条记录,即刚刚输入的学生姓名和学号;
利用fprintf(fp1,"姓名:
%s\n",s[0].name);fprintf(fp1,"学号:
%s\n",s[0].num);向文件TestResult.txt中写入刚刚输入的学生信息
登录完后进入测试界面此时开始计时
有语句{printf("请计时输入开始时间(点,分):
");scanf("%d,%d",&hourA,&minA);}进行输入计时。
然后进入测试界面的菜单:
3.2测试功能得实现
①选测试类型:
测试功能菜单分为5个,其中1~4为选择类型,5返回主菜单;具体实现选择功能有
while(choose<1||choose>5){printf("超出功能范围,请重新选择(1---5):
");scanf("%d",&choose);}输入1~5之间的一个数,再用switch(choose){}进行选择对应的功能
如上图选择1后进入
②选题数目:
进行选择题目的数目,输入要测试的题目数被限制(5/10/20/50/100)五个数用句
while(thnum<5||thnum>5&&thnum<10||thnum>10&&thnum<||thnum>20&&thnum<50||thnum>50&&thnum<100||thnum>100)
{printf("超出功能范围,请重新选择(5/10/20/50/100):
");scanf("%d",&thnum);}由此语句实现对题目数的限制,但超出范围后则提示重新输入。
在begain()中调用Addition(intnumber)控制循环语句for(inti=0;i {if(m==1){num1=rand()%n;num2=rand()%n;}//产生一位随机数,num1,num2 if(m==2){num1=10+rand()%(n-10);//产生两位随机数num1,num2 num2=10+rand()%(n-10);} if(m==3){num1=100+rand()%(n-100);//产生三位随机数num1,num2 num2=100+rand()%(n-100);} printf("%d+%d=",num1,num2); scanf("%d",&num4);通过控制循环的次数来控制产生题的数目. ③选难度的实现: 利用随机函数rand()%n;中n的不同值产生不同的位数的随机书实现难度的控制,n=10时用语句num1=rand()%n产生一位数;n=100时用语句num1=10+rand()%(n-10)产生二位数;n=1000时用num1=100+rand()%(n-100)产生三位数; 具体有语句 printf("请选择难度: ");scanf("%d",&m);system("cls");//清屏 {if(m==1)n=10;if(m==2)n=100; elseif(m==3)n=1000;} for(inti=0;i {if(m==1){num1=rand()%n;num2=rand()%n;} if(m==2){num1=10+rand()%(n-10); num2=10+rand()%(n-10);} if(m==3){num1=100+rand()%(n-100); num2=100+rand()%(n-100);}} 实现控制难度,并有rand()%n产生随机数实现随机出题功能。 ④自动评分的实现和数据的储存 系统会将输入的答案与正确答案进行逐一比较,如果正确则将结果只记录到TestResult.txt中,以便查看结果;如果错误,则将错误题正确结果记录到failedResult.txt中,以便错题重做,将错误题正确结果记录到rightResult.txt中,TestResult.txt中,以便核对错题答案,在此过程中系统会自动统计正确结果个数和错误个数,从而利用average=float(count1)/float(number);自动得到分数。 具体程序如下: if(num3==num4) {fprintf(fp,"%d+%d=%d%d\n",num1,num2,num4,num3); count1++;} else {fprintf(fp,"%d+%d=%d%d×\n",num1,num2,num4,num3);fprintf(fp2,"%d+%d=\n",num1,num2,num4,num3); //将错误题记录到failedResult.txt中 fprintf(fp3,"%d+%d=%d\n",num1,num2,num3);}}}average=float(count1)/float(number); fprintf(fp,"正确%d道,错误%d道,正确率为: %f\n\n",count1,count2,average); A=A+average*100;//总分 nu++;//记录做不同类型题的次数以便算平均分 ⑤减乘除的过程和原理和加法一样其工作界面分别为 减法;乘法;除法; 除法其它功能得实现与加法一样只有分母不为零,用num2=n/10+rand()%(n-n/10)语句进行实现,其中rand()%(n-n/10)产生0到n-n/10-1的数;n/10+rand()%(n-n/10)产生n/10到n-1的数;例如n=100时产生10到99的两位数;从而实现了分母不为零,同时也实现了难度的控制。 3.3查看结果的实现: 测试过程中已经将结果记录存到TestResult.txt中,只需打开文件读取出记录即可 voidShowResult()//显示测试结果函数 {FILE*fp; if((fp=fopen("TestResult.txt","r"))==NULL);exit(0);} charch;ch=fgetc(fp);//文件开头字符 while(ch! =EOF)//当文件没有到尾时,一直循环 {putchar(ch);//输出字符 ch=fgetc(fp);} fclose(fp);}有此函数就可直接读取查看结果。 3.4排名的实现 此过程中将将每次做题情况及学生信息记录到文件nrecord.txt中,然后再将nrecord.txt中的一条条记录读取到结构体中,用冒泡法进行排序,最后直接从结构体中读取排好序的成绩;其具体程序: voidsort()//实现排序 {FILE*fp5; inti,j,m; s[0].avscore=A/nu; fp5=fopen("nrecord.txt","a+"); fprintf(fp5,"%s%s%f\n",s[0].name,s[0].num,s[0].avscore);//将刚刚做过的测试记录到文件nrecord.txt中 fclose(fp5); fp5=fopen("nrecord.txt","rb"); for(i=0;! feof(fp5);i++) {fscanf(fp5,"%s%s%f\n",s[i].name,s[i].num,&s[i].avscore);}fclose(fp5);m=i; structStudenttemp; for(i=0;i {for(j=0;j if(s[j].avscore {strcpy(temp.name,s[j].name); strcpy(temp.num,s[j].num); temp.avscore=s[j].avscore; strcpy(s[j].name,s[j+1].name); strcpy(s[j].num,s[j+1].num); s[j].avscore=s[j+1].avscore; strcpy(s[j+1].name,temp.name); strcpy(s[j+1].num,temp.num); s[j+1].avscore=temp.avscore;}} //输出排名结果 printf******************************************************\n"); printf("---------查看你的排名(排序结果由高到低): --------------------\n"); printf("---------姓名学号分数------------\n"); for(i=0;i {printf("%s%s%4.2f\n",s[i].name,s[i].num,s[i].avscore);}} 3.5错题重做 测试过程中的已将错题和错题的答案分别存入到failedResult.txt和rightResult.txt文件中,直接进行打开存储错题的文件逐个读取错题,这时利用scanf函数输入答题者的答案,最后再打开储存错题答案的文件进行核对正确答案具体程序为: voidrework()//错题重做 {inta; charch; FILE*fp2,*fp3; if((fp2=fopen("failedResult.txt","a+"))==NULL) {printf("打开文件失败\n"); exit(0);} if((fp3=fopen("rightResult.txt","a+"))==NULL) {printf("打开文件失败\n"); exit(0);} printf("********************错题重做***************************************\n"); while(! feof(fp2)) {ch=fgetc(fp2);printf("%c",ch);//读取failedResult.txt中的错题 if(ch=='=') scanf("%d",&a);}//输入答案 fp2=fopen("failedResult.txt","w");//清空之前数据 fclose(fp2); printf("========小朋友请查看正确答案============================\n"); while(! feof(fp3)) {ch=fgetc(fp3);printf("%c",ch);}//读取rightResult.txt中的错题的答案 fclose(fp3);fp3=fopen("rightResult.txt","w");//清空 fclose(fp3);} 3.6结束测试 当选择主菜单的结束功能时,系统则提示输入结束时间,输入后,系统将自动生成所用时间,然后系统将把学生的所有信息记录到以学生,学号命名的文件中.具体实现过程如下; voidFileCopy()//文件复制函数,用来保存测试结果,当然文件名不能重复, {FILE*in,*out; strcat(s[0].num,".txt");//将字符串".txt"连接到字符串student[0].num后,即以学号为文件名,后缀为.txt的文件中,保存在工程目录下 if((in=fopen("TestResult.txt","r"))==NULL) {in=fopen("TestResult.txt","w+"); printf("无文件记录,已新建.\n");} if((out=fopen(s[0].num,"w"))==NULL)//打开文件学号.txt文件(如030.txt),"w"方式为只写方式 {printf("打开文件失败\n"); exit(0);} while(! feof(in))//当文件TestResult.txt没有结束时循环 fputc(fgetc(in),out);//逐个字符写入 fclose(in); fclose(out);} voidTestOver()//程序测试完毕函数 {printf("\n\n------测试完毕你的测试结果保存在%s中------\n\n",s[0].num);//输出测试结果记录提示} 4系统测试 4.1注册登录模块 4.2测试模块 ①选测试类型 ②选题数目 ③选难度的实现 4.3查看学生成绩模块 4.4错题重做模块 4.5测试时出现的错误与分析总结 程序设计为结构化和模块化,用函数间的相互调用来实现系统的功能,为调试带来了一定的方便。 在调试过程中,出现了很多问题,其中文件和结构体之间的转换最为困难,在一段时间内,影响到了错题重做,排名等功能的实现; 问题一: 程序中多次用到了文件的读写,用文件记录信息,多次出现读不出来,记录不到文件中,还出现乱码。 解决方法: 认真学习和反复研究了,文件的读写函数fprintf,fscanf,fread,fwrite,fgetc,在反复的调试中终于解决了此问题。 问题二: 由于学生的信息均记录在文件中,而文件不能直接排序需转换到结构体中进行排序,给整个排序过程带来了相当大的困难,出现了转换不到结构体中,和乱码现象。 解决方法: 首先检查了为文件是否将信息记录了下来,确认有数据后,用fscanf,fread,进行了反复的更换,此过程中反复运行查看结构体是否有输出。 最终实现了文件与结构体之间数据的传递,实现了排序功能. 问题三: 错题重做有一定的困难,怎样将错题一个个及记录下来,并且能读出来重新做,产生了一定的困难。 解决方法: 采用了文件记录错题和错题的答案,用fgetc函数实现了读出记录的错题,从而实现了错题重做功能。 此外在调试过程中也遇到了相当多的其他问题,从整体结构的设计,到各个功能的实现. 5课程设计总结 这次的课程设计实验是对我们进入大学以来学习C语言结果的是一次大考验。 自己动手,发现问题和解决问题。 并发现了许多自己的不足,平时没掌握的知识在实践中暴漏,经过不断的思考,查阅书籍和上网查资料及上机运行,解决了大部分问题,还稍微有些小问题。 但是,我相信在今的学习中,一定能把它解决好。 当今计算机应用在生活中可以说得是无处不在。 因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。 我不仅巩固《C语言程序设计》课程学习的内容,掌握设计的基本方法,强化上机动手能力。 。 本次课程设计编写的小学数学测试系统,它具有随机出题、自动评分、自动排名,查看正确答案、错题重做等功能,本系统功能强大,程序大,编写难度相当大,在编程中,很多知识,几乎是一片空白。 不过后来通过书本和网络慢慢知道了一点。 通过这次课程设计,使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有无论做任何事都要有耐心。 也懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。 因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,是生活也更加好。 谢谢田老师这几天时间对我们指导 计算机科学与技术系课程设计评分表 课程名称: C语言程序设计 项目 评价 设计方案的合理性与创造性 设计与调试结果 设计说明书的质量 答辩陈述与回答问题情况 课程设计周表现情况 综合成绩 教师签名: 日期: 2016.01.10 附录: 源程序 #include #include #include #include floatA=0; intnu=0; inthourA,hourB,minA,minB; structStudent {charname[21];//姓名 charnum[10];//学号 floatavscore;}s[50];//结构体数组,存储学生的信息,在此初定为50,可改 /*--------------------------------------------------------------------------------------------------------------------------------*/ voidSavemessage()//保存学生输入信息的函数 { FILE*fp,*fp1;//定义文件指针,//以下判断文件打开与否,"a"方式打开则可向文件尾写数据 if((fp=fopen("studentmessage.txt","wb+"))==NULL)//打开文件studentmessage.txt {printf("打开文件失败\n"); exit(0);} if((fp1=fopen("TestResult.txt","a"))==NULL)//打开文件TestResult.txt {printf("打开文件失败\n"); exit(0);} printf("输入姓名: ");//以下为要学生输入个人信息 scanf("%s",s[0].name); printf("输入学号: "); scanf("%s",&s[0]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小学 数学 测试 系统 课程设计 报告 源程序 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)