小学数学测试系统C课程设计报告与源程序代码_第1页
小学数学测试系统C课程设计报告与源程序代码_第2页
小学数学测试系统C课程设计报告与源程序代码_第3页
小学数学测试系统C课程设计报告与源程序代码_第4页
小学数学测试系统C课程设计报告与源程序代码_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档倾情为你奉上精选优质文档倾情为你奉上专心专注专业专心专注专业精选优质文档倾情为你奉上专心专注专业课 程 设 计 报 告课程名称 C语言课程设计 课题名称 小学数学测试系统 专 业 班 级 学 号 姓 名 指导教师 2016年 01 月 06 日湖南工程学院课 程 设 计 任 务 书课程名称 C语言课程设计 课 题 小学数学测试系统 专业班级 学生姓名 学 号 指导老师 审 批 任务书下达日期 2015 年 12 月 26 日任务完成日期 2016年 01 月 06 日一、设计内容与设计 课题九:小学数学测试系统。具体内容见附录。2设计要求:1)设计正确,方案合理。2)界面友好,使用

2、方便。3)程序精炼,结构清晰。4)上机演示。3设计报告要求:课程设计报告格式如下:1)正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体,行距为22。 2)正文的内容:课题的主要功能、课题的功能模块的划分、主要功能的实现、程序调试、总结、附件(所有程序的源代码,要求对程序写出必要的注释),课程设计报告需5000字左右(不含附件)。3)课程设计报告装订顺序:封面、任务书、目录、正文、评分、程序清单附件。二、进度安排星期日(17周)星期一(18周)星期四(18周)星期五(18周)星期日(18周)14:00-17:0018:00-21:0018:00-21:0018:00-21

3、:00交报告上课时间另外安排。附录:设计课题九:小学数学测试系统一、问题描述:本系统可以用来进行简单的数学测试,并累计成绩,包括用户注册、用户登录、用户删除、题目测试、信息保存等功能。二、功能描述:1、本系统采用结构体数组,每个数据的结构应当包括:用户名、用户密码、共测试题目数、答对题目数。2、系统功能:用户注册:即添加新的用户名、用户密码。用户登录:在进行数学测试之前,需进行登录,若没有该用户,需进行注册。题目测试:系统自动生成题目(注意题目的合理性,题目结果不能是负数,除数不能是0等),用户给出答案,系统可以自动测试其正确性,同时统计成绩。信息保存: 当注册成功、题目测试完毕后将用户信息及

4、成绩保存到文件。e.退出系统。3、系统使用说明:执行一个具体的功能之后,程序将重新显示功能菜单。系统的功能并不限于上述,可以对其进行扩充完善,如题目的自动生成,可以只是简单的加减乘除运算,也可以生成复杂的四则混合运算。同时,用户界面友好也很重要,当输入错误答案,需给出提示信息。三、测试数据:用户=3,题目数=5目 录 TOC o 1-1 u 1 系统需求分析 PAGEREF _Toc h 62 概要设计 PAGEREF _Toc h 63 详细设计104 系统测试155课程设计总结181 系统需求分析 小学生数学测试系统具有随机出题,自动评分,查看答案,错题重做等功能的系统;其属性有:1. 主

5、界面设计,选择各种功能。 2. 系统随机出题,显示算式,含加,减,乘,除四则运算。 3. 练习时,系统随机出题,键入答案,可显示对错。 4. 测试时,系统自动出题,每题得分,再统计得分。 5. 题的对错信息,错误的给出答案。 2 概要设计系统功能模块图:小学数学测试系小学数学测试系统学生成绩管理模块 测试模块注册登录模块查看结果模块 错题重做模块2.1注册登录模块提示用户输入姓名和学号,如果已经有记录则将本次登录用户信息追加储存在文件中,如果没有记录,则创建一个新文件储存:其模块图如下图所示:注册登录模块提示输入姓名学号创建文件记录学生信息判断是否有记录 注册登录模块提示输入姓名学号创建文件记

6、录学生信息判断是否有记录进入开始测试菜单后,开始计时,选择加减乘除四种运算类型,总体来说测试模块可以分为:加法运算、减法运算、乘法运算、除法运算四部分四部分功能相似选择类型后,在选择题数目为(5,10,20,50,100),然后再选择难度,这时开始做题(题目利用随机函数随机出题),然后判断正误并给出正确率,错误的结果存入一个文件中以备错题重做,将所有做题的结果存入另个文件中以便查看结果;测试模块加法运算测试模块加法运算减法运算乘法运算除法运算2.3 学生成绩管理模块本模块首先将每次测试同学姓名,学号,成绩存入一个文件中,每次测试同学的信息不覆盖之前同学的信息,然后将文件中的信息读取到结构体中进

7、行排序,最后利用结构体将排好序的成绩显示到屏幕上,其模块如下所示图:学生成绩管理模块存入测试学生成绩信息学生成绩管理模块存入测试学生成绩信息查看排名榜创建学生成绩信息文件排列顺序2.4 查看结果模块利用测试模块存储的结果信息文件进行直接读取,期间用到fgetc函数将文件的信息读取出来,其图如下图所示:查看结果模块打开存储结果的文件查看结果模块打开存储结果的文件读取文件2.5 错题重做模块 测试模块过程的已将错题和错题的答案分别出入到文件中,直接进行打开存储错题的文件逐个读取错题,这时利用scanf函数输入答题者的答案,最后再打开储存错题答案的文件进行核对正确答案,其模块如下图所示:错题重做模块

8、读取错题进行重做错题重做模块读取错题进行重做核对答案打开错题存储文件系统流程图:开始开始输入姓名输入学号主菜单开始测试查看排名错题重做查看结果结束测试加法减法乘法除法选择题数选择难度测试退出返回保存3 详细设计3.1登录功能得具体实现:用到两个函数Savemessage()和Judge()两个函数,其中 Savemessage()函数用来,保存学生输入信息,将输入学生信息保存到studentmessage.txt和TestResult.txt文件中,保存过程中,先输入到结构体中,再利用fwrite(&s0,sizeof(struct Student),1,fp);语句向文件studentmes

9、sage.txt中写入一条记录,即刚刚输入的学生姓名和学号;利用fprintf(fp1,姓名:%sn,);fprintf(fp1,学号:%sn,s0.num); 向文件TestResult.txt中写入刚刚输入的学生信息登录完后进入测试界面此时开始计时有语句printf( 请计时输入开始时间(点,分):); scanf(%d,%d,&hourA,&minA);进行输入计时。然后进入测试界面的菜单:3.2 测试功能得实现选测试类型:测试功能菜单分为5个,其中14为选择类型,5返回主菜单;具体实现选择功能有while(choose5) printf( 超出功能范围,请重新选择(15)

10、:);scanf(%d,&choose);输入15之间的一个数,再用switch(choose) 进行选择对应的功能如上图选择1后进入选题数目:进行选择题目的数目,输入要测试的题目数被限制(5/10/20/50/100)五个数用句while(thnum5&thnum10&thnum20&thnum50&thnum100) printf(超出功能范围,请重新选择(5/10/20/50/100):);scanf(%d,&thnum); 由此语句实现对题目数的限制,但超出范围后则提示重新输入。在begain()中调用Addition(int number)控制循环语句for(int i=0;inum

11、ber;i+) if(m=1)num1=rand()%n; num2=rand()%n; /产生一位随机数,num1,num2if(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的不

12、同值产生不同的位数的随机书实现难度的控制,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 ;else if(m=3) n=1000 ;for(int i=0;inumber;i+) if(m=1)num1=rand()%n; num2=rand()%n; if(m=2)num1=10+ra

13、nd()%(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中,以便核对错题答案,在此过程中系统会自动统计正

14、确结果个数和错误个数,从而利用average=float(count1)/float(number);自动得到分数。具体程序如下:if(num3=num4) fprintf(fp,%d + %d =%d%dn,num1,num2,num4,num3);count1+;else fprintf(fp,%d + %d =%d%dn,num1,num2,num4,num3);fprintf(fp2,%d + %d =n,num1,num2,num4,num3);/将错误题记录到failedResult.txt中fprintf(fp3,%d + %d = %d n,num1,num2,num3); a

15、verage=float(count1)/float(number);fprintf(fp,正确 %d 道,错误 %d 道,正确率为:%fnn,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到

16、99的两位数;从而实现了分母不为零,同时也实现了难度的控制。3.3查看结果的实现:测试过程中已经将结果记录存到TestResult.txt中,只需打开文件读取出记录即可void ShowResult()/显示测试结果函数FILE *fp;if(fp=fopen(TestResult.txt,r)=NULL); exit(0);char ch; ch=fgetc(fp); /文件开头字符while(ch!=EOF) /当文件没有到尾时,一直循环 putchar(ch); /输出字符 ch=fgetc(fp); fclose(fp); 有此函数就可直接读取查看结果。3.4 排名的实现此过程中将将每

17、次做题情况及学生信息记录到文件nrecord.txt中,然后再将nrecord.txt中的一条条记录读取到结构体中,用冒泡法进行排序,最后直接从结构体中读取排好序的成绩;其具体程序:void sort() /实现排序FILE *fp5;int i,j,m; s0.avscore=A/nu; fp5=fopen(nrecord.txt,a+); fprintf(fp5,%s%s%fn,,s0.num,s0.avscore);/将刚刚做过的测试记录到文件nrecord.txt中 fclose(fp5); fp5=fopen(nrecord.txt,rb);for(i=0;!feof(

18、fp5);i+) fscanf(fp5,%s%s%fn,,si.num,&si.avscore); fclose(fp5); m=i;struct Student temp;for(i=0;im;i+) for(j=0;jm-1;j+)if(sj.avscoresj+1.avscore)strcpy(,); strcpy(temp.num,sj.num); temp.avscore=sj.avscore; strcpy(,sj+1.name); strcpy(sj.num,sj+1.num);sj.avscore=sj+1.avsco

19、re; strcpy(sj+1.name,); strcpy(sj+1.num,temp.num);sj+1.avscore=temp.avscore;/输出排名结果printf*n);printf( 查看你的排名(排序结果由高到低):n);printf( 姓名学号分数n);for(i=0;im;i+)printf(%s%s%4.2fn,,si.num,si.avscore);3.5错题重做测试过程中的已将错题和错题的答案分别存入到failedResult.txt 和rightResult.txt文件中,直接进行打开存储错题的文件逐个读取错题,这时利用scanf

20、函数输入答题者的答案,最后再打开储存错题答案的文件进行核对正确答案具体程序为:void rework() / 错题重做int a; char ch; 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中的错

21、题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结束测试当选择主菜单的结束功能时,系统则提示输入结束时间,输入后,系统将自动生成所用时间,然后系统将把学生的所有信息记录到以学生,学号命名的文件

22、中.具体实现过程如下;void FileCopy()/文件复制函数,用来保存测试结果,当然文件名不能重复,FILE *in,*out; strcat(s0.num,.txt);/将字符串.txt连接到字符串student0.num后,即以学号为文件名,后缀为.txt的文件中,保存在工程目录下if(in=fopen(TestResult.txt,r)=NULL) in=fopen(TestResult.txt,w+); printf(无文件记录,已新建.n);if(out=fopen(s0.num,w)=NULL)/打开文件学号.txt 文件(如030.txt),w方式为只写方式 printf(

23、打开文件失败n); exit(0);while(!feof(in)/当文件TestResult.txt没有结束时循环 fputc(fgetc(in),out);/逐个字符写入 fclose(in); fclose(out);void TestOver()/程序测试完毕函数printf(nn测试完毕你的测试结果保存在 %s 中nn,s0.num); /输出测试结果记录提示4 系统测试 4.1注册登录模块 4.2测试模块选测试类型选题数目选难度的实现4.3 查看学生成绩模块4.4 错题重做模块4.5 测试时出现的错误与分析总结程序设计为结构化和模块化,用函数间的相互调用来实现系统的功能,为调试带来

24、了一定的方便 。在调试过程中,出现了很多问题,其中文件和结构体之间的转换最为困难,在一段时间内,影响到了错题重做,排名等功能的实现;问题一:程序中多次用到了文件的读写,用文件记录信息,多次出现读不出来,记录不到文件中,还出现乱码。 解决方法:认真学习和反复研究了,文件的读写函数fprintf,fscanf,fread,fwrite,fgetc,在反复的调试中终于解决了此问题。问题二:由于学生的信息均记录在文件中,而文件不能直接排序需转换到结构体中进行排序,给整个排序过程带来了相当大的困难,出现了转换不到结构体中,和乱码现象。解决方法:首先检查了为文件是否将信息记录了下来,确认有数据后,用fsc

25、anf, fread,进行了反复的更换,此过程中反复运行查看结构体是否有输出。最终实现了文件与结构体之间数据的传递,实现了排序功能.问题三:错题重做有一定的困难,怎样将错题一个个及记录下来,并且能读出来重新做,产生了一定的困难。解决方法:采用了文件记录错题和错题的答案,用fgetc函数实现了读出记录的错题,从而实现了错题重做功能。此外在调试过程中也遇到了相当多的其他问题,从整体结构的设计,到各个功能的实现.课程设计总结 这次的课程设计实验是对我们进入大学以来学习C语言结果的是一次大考验。自己动手,发现问题和解决问题。并发现了许多自己的不足,平时没掌握的知识在实践中暴漏,经过不断的思考,查阅书籍

26、和上网查资料及上机运行,解决了大部分问题,还稍微有些小问题。但是,我相信在今的学习中,一定能把它解决好。当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。 我不仅巩固C语言程序设计课程学习的内容,掌握设计的基本方法,强化上机动手能力。 本次课程设计编写的小学数学测试系统,它具有随机出题、自动评分、自动排名,查看正确答案、错题重做等功能,本系统功能强大,程序大,编写难度相当大,在编程中,很多知识,几乎是一片空白。不过后来通过书本和网络慢慢知道了一点。 通过这次课程设

27、计,使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有无论做任何事都要有耐心。也懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,是生活也更加好。谢谢田老师这几天时间对我们指导计算机科学与技术系课程设计评分表课程名称: C语言程序设计

28、 项 目评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩 教师签名: 日 期: 2016.01.10 附录:源程序#include /C语言标准输入输出头文件#include /字符串操作需要用到的头文件#include /文件操作需要用到的头文件#include /产生随机数需要用到的头文件float A=0;int nu=0;int hourA,hourB,minA,minB;struct Student char name21; /姓名 char num10; /学号 float avscore;s50; /结构体数组,存储学生

29、的信息,在此初定为50,可改/*/void Savemessage() /保存学生输入信息的函数 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(输入姓名:); /以下为要学生输入个人信息sca

30、nf(%s,);printf(输入学号:);scanf(%s,&s0.num);fwrite(&s0,sizeof(struct Student),1,fp);/向文件studentmessage.txt中写入一条记录,即刚刚输入的学生信息fprintf(fp1,姓名:%sn,);/以下为向文件TestResult.txt中写入刚刚输入的学生信息fprintf(fp1,学号:%sn,s0.num);fclose(fp);/关闭文件studentmessage.txtfclose(fp1);system(cls); /清屏void Judge()/判断函数int i=

31、0;FILE *fp;/文件指针/以下判断文件打开与否 ,r为只读打开方式printf(nnn); printf( *小学数学测试系统*n); printf( *n); printf( *n); printf( *n); printf( *注 册*n); printf( *n); printf( *输入姓名*n); printf( *n); printf( *输入学号*n); printf( *nnn);if(fp=fopen(studentmessage.txt,r)=NULL)/以下判断文件打开与否 a方式打开则可向文件尾写数据/打开文件studentmessage.txt fp=fope

32、n(studentmessage.txt,w+);/如果没有studentmessage.txt文件,则新建此文件,w+打开方式为新建一个文件printf(无文件记录,已新建.n);while(!feof(fp)/判断是否到了文件尾fread(&si,sizeof(struct Student),1,fp);/一行一行从文件中读出学生信息,保存在结构体数组student中fscanf(fp,n); /读取换行符 i+; /i变量保存学生记录个数if(i=50) /当人数满时即50个人满时,因为数组下标从0开始,所以当i为29时printf(人数已满,你已无法测试.n);fclose(fp);e

33、xit(0);/*/void Addition(int number) /加法运算函数,number为题目数形参FILE *fp,*fp2,*fp3;if(fp=fopen(TestResult.txt,a)=NULL) printf(打开文件失败n); exit(0);if(fp2=fopen(failedResult.txt,a)=NULL)printf(打开文件失败n); exit(0);if(fp3=fopen(rightResult.txt,a)=NULL)printf(打开文件失败n);exit(0);int num1,num2,num3,num4,m,n,count1=0,cou

34、nt2=0;float average=0.0; /正确率变量,注意是float类型srand(time(0); /初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的fprintf(fp,加法测试:n); /向文件写入fprintf(fp,被加数 + 加数 = 你的结果 正确结果 是否正确n);/向文件写入 printf( *n);/*选择难度*/ printf( * 请选择难度:*n); printf( * 1.简 单 *n); printf( * 2.一 般 *n); printf( * 3.困 难 *n); printf( *nnn);printf(请选择难度: ); sca

35、nf(%d,&m);system(cls); /清屏if(m=1) n=10 ;/*将m的值转化为对应的n值,从而使随机函数出现一位,2位,3位,*/if(m=2) n=100 ;else if(m=3) n=1000 ;printf( n *nn);for(int i=0;inumber;i+)/*小于测试题目数时,循环*/if(m=1)num1=rand()%n; num2=rand()%n; /产生一位随机数,num1,num2if(m=2)num1=10+rand()%(n-10); /产生两位随机数 num1,num2 num2=10+rand()%(n-10);if(m=3)num

36、1=100+rand()%(n-100); /产生三位随机数 num1,num2 num2=100+rand()%(n-100); num3=num1+num2; /num3保存正确结果 printf(%d + %d = ,num1,num2);/在终端屏幕上输出题目 scanf(%d,&num4);/你要输入的计算结果if(num3=num4)/正确结果与你计算的结果比较,正确的话fprintf(fp,%d + %d =%d%dn,num1,num2,num4,num3);/将结果记录到TestResult.txt中count1+;/变量count1记录正确题目的个数else/错误的话,即n

37、um1!=num2时fprintf(fp,%d + %d =%d%dn,num1,num2,num4,num3);/将结果记录到TestResult.txt中fprintf(fp2,%d + %d =n,num1,num2,num4,num3);/将错误题记录到failedResult.txt中fprintf(fp3,%d + %d = %d n,num1,num2,num3);/将错误题正确结果记录到failedResult.txt中average=float(count1)/float(number);/计算正确率,注意int整型要转换为float类型fprintf(fp,正确 %d 道,

38、错误 %d 道,正确率为:%fnn,count1,count2,average);A=A+average*100;nu+;fclose(fp);fclose(fp3);fclose(fp2);/*/void Subtracter(int number) /减法运算函数,注释与加法一样FILE *fp,*fp2,*fp3;if(fp=fopen(TestResult.txt,a)=NULL)printf(打开文件失败n);exit(0);if(fp2=fopen(failedResult.txt,a)=NULL)printf(打开文件失败n);exit(0);if(fp3=fopen(right

39、Result.txt,a)=NULL)printf(打开文件失败n);exit(0);int num1,num2,num3,num4,count1=0,n,m,count2=0;float average=0.0;srand(time(0);fprintf(fp,减法测试:n);fprintf(fp,被减数 - 减数 = 你的结果 正确结果 是否正确n); printf( *n);/*选择难度*/ printf( * 请选择难度:*n); printf( * 1.简 单 *n); printf( * 2.一 般 *n); printf( * 3.困 难 *n); printf( *nnn);p

40、rintf(请选择: ); scanf(%d,&m);system(cls); /清屏if(m=1) n=10 ;if(m=2) n=100 ;else if(m=3) n=1000 ;printf( n *nn);for(int i=0;inumber;i+)if(m=1)num1=rand()%n; num2=rand()%n; /产生一位随机数,num1,num2if(m=2)num1=10+rand()%(n-10); /产生两位随机数 num1,num2 num2=10+rand()%(n-10);if(m=3)num1=100+rand()%(n-100); /产生三位随机数 nu

41、m1,num2 num2=100+rand()%(n-100);num3=num1-num2;printf(%d - %d = ,num1,num2);scanf(%d,&num4);if(num3=num4)fprintf(fp,%d - %d =%d%d n,num1,num2,num4,num3);count1+;elsefprintf(fp,%d - %d =%d%dn,num1,num2,num4,num3);count2+;fprintf(fp2,%d - %d =n,num1,num2,num4,num3);fprintf(fp3,%d - %d = %d n,num1,num2

42、,num3);average=float(count1)/float(number);fprintf(fp,正确 %d 道,错误 %d 道,正确率为:%fnn,count1,count2,average);A=A+average*100;nu+;fclose(fp);fclose(fp2);fclose(fp3);/*/void Multiplication(int number)/乘法运算函数,注释与加法一样FILE *fp,*fp2,*fp3;if(fp=fopen(TestResult.txt,a)=NULL)printf(打开文件失败n);exit(0);if(fp2=fopen(fa

43、iledResult.txt,a)=NULL)printf(打开文件失败n);exit(0);if(fp3=fopen(rightResult.txt,a)=NULL)printf(打开文件失败n);exit(0);int num1,num2,num3,num4,m,n,count1=0,count2=0;float average=0.0;srand(time(0);fprintf(fp,乘法测试:n);fprintf(fp,被乘数 * 乘数 = 你的结果 正确结果 是否正确n); printf( *n);/*选择难度*/ printf( * 请选择难度:*n); printf( * 1.简

44、 单 *n); printf( * 2.一 般 *n); printf( * 3.困 难 *n); printf( *nnn);printf(请选择: ); scanf(%d,&m);system(cls); /清屏if(m=1) n=10 ;if(m=2) n=100 ;else if(m=3) n=1000 ;printf( n *nn);for(int i=0;inumber;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

45、+rand()%(n-100); num2=100+rand()%(n-100);num3=num1*num2;printf(%d * %d = ,num1,num2);scanf(%d,&num4);if(num3=num4)fprintf(fp,%d * %d =%d%dn,num1,num2,num4,num3);count1+;elsefprintf(fp,%d * %d =%d%dn,num1,num2,num4,num3);count2+;fprintf(fp2,%d * %d =n,num1,num2,num4,num3);fprintf(fp3,%d * %d = %d n,n

46、um1,num2,num3);average=float(count1)/float(number);fprintf(fp,正确 %d 道,错误 %d 道,正确率为:%fnn,count1,count2,average);A=A+average*100;nu+;fclose(fp);fclose(fp2);fclose(fp3);/*/void Division(int number) / 和加法运算函数注释一样FILE *fp,*fp2,*fp3;if(fp=fopen(TestResult.txt,a)=NULL)printf(打开文件失败n);exit(0);if(fp2=fopen(f

47、ailedResult.txt,a)=NULL)printf(打开文件失败n);exit(0);if(fp3=fopen(rightResult.txt,a)=NULL)printf(打开文件失败n);exit(0);int num1,num2,m,n,count1=0,count2=0;float num3,num4,average; /正确率变量,注意是float类型srand(time(0); /初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的fprintf(fp,加法测试:n); /向文件写入fprintf(fp,除数数/被除数=你的结果 正确结果 是否正确n);/向文件

48、写入 printf( *n);/*选择难度*/ printf( * 请选择难度:*n); printf( * 1.简 单 *n); printf( * 2.一 般 *n); printf( * 3.困 难 *n); printf( *nnn); printf(请选择:);scanf(%d,&m);system(cls); /清屏if(m=1) n=10 ;if(m=2) n=100 ;else if(m=3) n=1000 ;printf( n *nn);printf(请保留保留小数点后一位n);for(int i=0;inumber;i+)/小于测试题目数时,循环if(m=1)num1=ra

49、nd()%n; if(m=2)num1=10+rand()%(n-10); if(m=3)num1=100+rand()%(n-100); num2=n/10+rand()%(n-n/10); /产生不等于零的随机数num3num3=(float)(num1)/(float)(num2); /num3保存正确结果printf(%d / %d = ,num1,num2);/在终端屏幕上输出题目scanf(%f,&num4);/你要输入的计算结果num3=(int)(num3*10)/10.0; /实现保留小数点一位if(num3=num4)/正确结果与你计算的结果比较,正确的话fprintf(f

50、p,%d / %d =%.1f%.1fn,num1,num2,num4,num3);/向文件中写入count1+; /变量count1记录正确题目的个数else/错误的话,即num1!=num2时fprintf(fp,%d / %d =%.1f%.1fn,num1,num2,num4,num3);count2+;/变量count2记录错误题目的个数fprintf(fp2,%d / %d = n,num1,num2);fprintf(fp3,%d / %d = %.1f n,num1,num2,num3);average=float(count1)/float(number);/计算正确率,注意

51、int整型要转换为float类型fprintf(fp,正确 %d 道,错误 %d 道,正确率为:%fnn,count1,count2,average);A=A+average*100;nu+;fclose(fp);fclose(fp2);fclose(fp3);/*/void rework() / 错题重做int a; char ch; FILE *fp2,*fp3;if(fp2=fopen(failedResult.txt,a+)=NULL)printf(打开文件失败n); exit(0);if(fp3=fopen(rightResult.txt,a+)=NULL)printf(打开文件失败

52、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.tx

53、t,w);/清空fclose(fp3);/void sort() /实现排序FILE *fp5;int i,j,m; s0.avscore=A/nu; fp5=fopen(nrecord.txt,a+); fprintf(fp5,%s%s%fn,,s0.num,s0.avscore);/将刚刚做过的测试记录到文件nrecord.txt中 fclose(fp5); fp5=fopen(nrecord.txt,rb);for(i=0;!feof(fp5);i+) fscanf(fp5,%s%s%fn,,si.num,&si.avscore);/将文件nrecord.tx

54、t的记录存到结构体struct Student中 fclose(fp5);/实现排序 m=i;struct Student temp;for(i=0;im;i+) for(j=0;jm-1;j+)if(sj.avscoresj+1.avscore)strcpy(,); /利用临时结构变量temp实现数组元素的交换 strcpy(temp.num,sj.num); temp.avscore=sj.avscore; strcpy(,sj+1.name); strcpy(sj.num,sj+1.num);sj.avscore=sj+1.avscore;

55、strcpy(sj+1.name,); strcpy(sj+1.num,temp.num);sj+1.avscore=temp.avscore; /若n=0,意味着没有交换了,排序已经完成/输出排名结果printf( *n);printf( 查看你的排名(排序结果由高到低):n);printf( 姓名学号分数n);for(i=0;im;i+)printf(%s%s%4.2fn,,si.num,si.avscore);/*/void TestOver()/程序测试完毕函数printf(nn测试完毕你的测试结果保存在 %s 中nn,s0.num); /输出测试结果记

56、录提示void ShowResult()/显示测试结果函数FILE *fp;if(fp=fopen(TestResult.txt,r)=NULL) printf(打开文件失败n); exit(0);char ch; ch=fgetc(fp);/文件开头字符while(ch!=EOF)/当文件没有到尾时,一直循环 putchar(ch);/输出字符 ch=fgetc(fp); fclose(fp);void FileCopy()/文件复制函数,用来保存测试结果,当然文件名不能重复,FILE *in,*out; strcat(s0.num,.txt);/将字符串.txt连接到字符串student0

57、.num后,即以学号为文件名,后缀为.txt的文件中,保存在工程目录下if(in=fopen(TestResult.txt,r)=NULL) in=fopen(TestResult.txt,w+); printf(无文件记录,已新建.n);if(out=fopen(s0.num,w)=NULL)/打开文件学号.txt 文件(如.txt),w方式为只写方式 printf(打开文件失败n); exit(0);while(!feof(in)/当文件TestResult.txt没有结束时循环 fputc(fgetc(in),out);/逐个字符写入 fclose(in); fclose(out);/*

58、/void ChooseFunc();void begain()printf(nnn); printf( n);printf( *n); printf( *1.加法测试*n); printf( *2.减法测试*n); printf( *3.乘法测试*n); printf( *4.除法测试*n); printf( *5.返回主菜单*n); printf( *nnn);int choose,thnum; / bool judge=false; printf( 选择功能:); scanf(%d,&choose);while(choose5)/不在以上所列的功能以内时循环 printf( 超出功能范围

59、,请重新选择(15):); scanf(%d,&choose);switch(choose)/switch语句选择执行功能case 1:/执行功能1 system(cls); /清屏 printf(nnn); printf( 加法测试:输入要测试的题目数(5/10/20/50/100)::,&thnum); scanf(%d,&thnum);while(thnum5&thnum10&thnum20&thnum50&thnum100)/不在以上所列的功能以内时循环 printf(超出功能范围,请重新选择(5/10/20/50/100):); scanf(%d,&thnum); system(cls); /清屏 Addition(thnum);/调用加法运算函数 begain(); break;case 2: system(cls); /清屏 printf(nnn); printf( 减法测试:输入要测试的题目数(5/10/20/50/100):,&thnum); scanf(%d,&thnum);while(thnum5&thnum10&thnum20&thnum50&thnum100)/不在以上所列的功能以内时循环 printf(超出功能范围,请

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论