课程
-小学数学测试系统C课程设计
及源程序代码.doc
课程设计-小学数学测试系统C课程设计报告及源程序
代码
课 程 设 计 报 告
课程名称 C语言课程设计
课题名称小学数学测试系统
专 业 纺织工程 班 级1202
学 号 28 姓 名 金?宜
指导教师7>2014年 01 月 06 日
湖南工程学院
课 程 设 计 任 务 书
课程名称C语言课程设计
课 题 小学数学测试系统 专业班级 纺织工程1202
学生姓名 金?宜
学 号28 指导老师 审 批
任务书下达日期2013 年 12 月 26 日
任务完成日期 2014年 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、系统功能:
用户注册:即添加新的用户名、用户密码。
用户登录:在进行数学测试之前,需进行登录,若没有该用户,需进行注册。 题目测试:系统自动生成题目注意题目的合理性,题目结果不能是负数,除数
不能是0等,用户给出答案,系统可以自动测试其正确性,同时统计成绩。 信息保存: 当注册成功、题目测试完毕后将用户信息及成绩保存到文件。
e.退出系统。
3、系统使用说明:执行一个具体的功能之后,程序将重新显示功能菜单。系
统的功能并不限于上述,可以对其进行扩充完善,如题目的自动生成,可以只是简单的加减乘除运算,也可以生成复杂的四则混合运算。同时,用户界面友好也很重要,当输入错误答案,需给出提示信息。
三、测试数据:
用户3,题目数5
目 录
1 系统需求分析 6
2 概要设计 6
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],sizeofstruct Student,1,fp;语句向文件studentmessage.txt中写入一条记录,即刚刚输入的学生姓名和学号;
利用fprintffp1,"姓名:%s\n",s[0].name;fprintffp1," 学号:%s\n",s[0].num; 向文件TestResult.txt中写入刚刚输入的学生信息
登录完后进入测试界面此时开始计时
有语句printf" 请计时输入开始时间点,分:"; scanf"%d,%d",&hourA,&minA;进行输入计时。
然后进入测试界面的菜单:
3.2 测试功能得实现
?选测试类型:
测试功能菜单分为5个,其中1~4为选择类型,5返回主菜单;具体实现选择功能有
whilechoose1||choose5 printf"超出功能范围,请重新选择1---5:";scanf"%d",&choose;输入1~5之间的一个数,再用switchchoose 进行选择对应的功能
如上图选择1后进入
?选题数目:
进行选择题目的数目,输入要测试的题目数被限制5/10/20/50/100五个数用句
whilethnum5||thnum5&&thnum10||thnum10&&thnum||thnum20&&thnum50||t
hnum50&&thnum100||thnum100
printf"超出功能范围,请重新选择5/10/20/50/100:";scanf"%d",&thnum;
由此语句实现对题目数的限制,但超出范围后则提示重新输入。在begain中调用Additionint number控制循环语句forint i0;inumber;i++
ifm1num1rand%n; num2rand%n; //产生一位随机数,num1,num2
10; //产生两位随机数 ifm2num110+rand%n-
num1,num2num210+rand%n-10;
ifm3num1100+rand%n-100;//产生三位随机数 num1,num2
num2100+rand%n-100;
printf" %d + %d ",num1,num2;scanf"%d",&num4;通过控制循环的次数来控制产生题的数目.
?选难度的实现:
利用随机函数rand%n;中n的不同值产生不同的位数的随机书实现难度的控制,n10时用语句num1rand%n产生一位数;n100时用语句num110+rand%n-10产生二位数;n1000时用num1100+rand%n-100产生三位数;
具体有语句
printf"请选择难度: "; scanf"%d",&m;system"cls"; //清屏
ifm1 n10 ; ifm2 n100 ;
else ifm3 n1000 ;
forint i0;inumber;i++
ifm1num1rand%n; num2rand%n; ifm2num110+rand%n-10;
num210+rand%n-10;
ifm3num1100+rand%n-100;num2100+rand%n-100; 实现控制难度,并有
rand%n产生随机数实现随机出题功能。
?自动评分的实现和数据的储存
系统会将输入的答案与正确答案进行逐一比较,如果正确则将结果只记录
到TestResult.txt中,以便查看结果;如果错误,则将错误题正确结果记录到
failedResult.txt中,以便错题重做,将错误题正确结果记录到
rightResult.txt中,TestResult.txt中,以便核对错题答案,在此过程中系统会
自动统计正确结果个数和错误个数,从而利用
averagefloatcount1/floatnumber;自动得到分数。
具体程序如下:
ifnum3num4
fprintffp," %d + %d %d %d \n",num1,num2,num4,num3;
count1++;
else fprintffp," %d + %d %d %d×\n",num1,num2,num4,num3;
fprintffp2," %d + %d \n",num1,num2,num4,num3;
//将错误题记录到failedResult.txt中
fprintffp3," %d + %d %d \n",num1,num2,num3;
averagefloatcount1/floatnumber;
fprintffp," 正确 %d 道,错误 %d 道,正确率为:%f\n\n",count1,count2,average;
AA+average*100;//总分
nu++;//记录做不同类型题的次数以便算平均分
?减乘除的过程和原理和加法一样其工作界面分别为
减法;乘法;除法;
除法其它功能得实现与加法一样只有分母不为零,用num2n/10+rand%n-n/10语句进行实现,其中rand%n-n/10产生0到n-n/10-1的数;n/10+rand%n-n/10产生n/10到n-1的数;例如n100时产生10到99的两位数;从而实现了分母不为零,同时也实现了难度的控制。
3.3查看结果的实现:
测试过程中已经将结果记录存到TestResult.txt中,只需打开文件读取出记录即可
void ShowResult//显示测试结果函数
FILE *fp;
iffpfopen"TestResult.txt","r"NULL; exit0;
char ch; chfgetcfp; //文件开头字符
whilech!EOF //当文件没有到尾时,一直循环
putcharch; //输出字符 chfgetcfp; fclosefp; 有此函数就可直接读取查看结果。
3.4 排名的实现
此过程中将将每次做题情况及学生信息记录到文件nrecord.txt中,然后
再将nrecord.txt中的一条条记录读取到结构体中,用冒泡法进行排序,最后直
接从结构体中读取排好序的成绩;其具体程序:
void sort//实现排序
FILE *fp5;
int i,j,m; s[0].avscoreA/nu; fp5fopen"nrecord.txt","a+"; fprintffp5,"%s%s%f\n",s[0].name,s[0].num,s[0].avscore;//将刚刚做过的
测试记录到文件nrecord.txt中 fclosefp5; fp5fopen"nrecord.txt","rb";
fori0;!feoffp5;i++ fscanffp5,"%s
%s%f\n",s[i].name,s[i].num,&s[i].avscore;fclosefp5; mi;
struct Student temp;
fori0;im;i++
forj0;jm-1;j++
ifs[j].avscores[j+1].avscore
strcpytemp.name,s[j].name; strcpytemp.num,s[j].num; temp.avscores[j].avscore; strcpys[j].name,s[j+1].name; strcpys[j].num,s[j+1].num;
s[j].avscores[j+1].avscore; strcpys[j+1].name,temp.name; strcpys[j+1].num,temp.num;
s[j+1].avscoretemp.avscore;
//输出排名结果
printf******************************************************\n";
printf"---------查看你的排名(排序结果由高到低:
printf"---------姓名学号分数------------\n";
fori0;im;i++
printf" %s %s%4.2f\n",s[i].name,s[i].num,s[i].avscore;
3.5错题重做
测试过程中的已将错题和错题的答案分别存入到failedResult.txt 和rightResult.txt文件中,直接进行打开存储错题的文件逐个读取错题,这时利用scanf函数输入答题者的答案,最后再打开储存错题答案的文件进行核对正确答案具体程序为:
void rework // 错题重做
int a;
char ch;
FILE *fp2,*fp3;
iffp2fopen"failedResult.txt","a+"NULL
printf"打开文件失败\n";
exit0;
iffp3fopen"rightResult.txt","a+"NULL
printf"打开文件失败\n";
exit0;
printf"********************错题重做
***************************************\n";
while!feoffp2 chfgetcfp2;printf"%c",ch;//读取failedResult.txt中的错题
ifch'' scanf"%d",&a; //输入答案
fp2fopen"failedResult.txt","w";//清空之前数据
fclosefp2;
printf"小朋友请查看正确答案\n";
while!feoffp3 chfgetcfp3;printf"%c",ch;//读取rightResult.txt中的错题的答案
fclosefp3;fp3fopen"rightResult.txt","w";//清空
fclosefp3;
3.6结束测试
当选择主菜单的结束功能时,系统则提示输入结束时间,输入后,系统将自动生成所用时间,然后系统将把学生的所有信息记录到以学生,学号命名的文件中.具体实现过程如下;
void FileCopy//文件复制函数,用来保存测试结果,当然文件名不能重复,
FILE *in,*out;
strcats[0].num,".txt";//将字符串".txt"连接到字符串student[0].num后,即以学号为文件名,后缀为.txt的文件中,保存在工程目录下
ifinfopen"TestResult.txt","r"NULL
infopen"TestResult.txt","w+";
printf"无文件记录,已新建.\n";
ifoutfopens[0].num,"w"NULL//打开文件学号.txt 文件(如
030.txt),"w"方式为只写方式
printf"打开文件失败\n";
exit0;
while!feofin//当文件TestResult.txt没有结束时循环
fputcfgetcin,out;//逐个字符写入
fclosein;
fcloseout;
void TestOver//程序测试完毕函数
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函数实现了读出
记录的错题,从而实现了错题重做功能。
此外在调试过程中也遇到了相当多的其他问题,从整体结构的设计,到各个功能的实现.
课程设计总结 这次的课程设计实验是对我们进入大学以来学习C语言结果的是一次大考验。自己动手,发现问题和解决问题。并发现了许多自己的不足,平时没掌握的知识在实践中暴漏,经过不断的思考,查阅书籍和上网查资料及上机运行,解决了大部分问题,还稍微有些小问题。但是,我相信在今的学习中,一定能把它解决好。当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。 我不仅巩固《C语言程序设计》课程学习的内容,掌握设计的基本方法,强化上机动手能力。。 本次课程设计编写的小学数学测试系统,它具有随机出题、自动评分、自动排名,查看正确答案、错题重做等功能,本系统功能强大,程序大,编写难度相当大,在编程中,很多知识,几乎是一片空白。不过后来通过书本和网络慢慢知道了一点。 通过这次课程设计,使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有无论做任何事都要有耐心。也懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得
怎么样去制定
,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克
服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计
的精神带到生活中,是生活也更加好。
谢谢田老师这几天时间对我们指导
计算机科学与技术系课程设计评分表
课程名称: C语言程序设计项 目 评 价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩教师签名: 日 期: 2014.01.10 附录:
源程序
#include //C语言
输入输出头文件
#include //字符串操作需要用到的头文件
#include //文件操作需要用到的头文件
#include //产生随机数需要用到的头文件
float A0;
int nu0;
int hourA,hourB,minA,minB; struct Student
char name[21]; //姓名char num[10]; //学号float avscore;s[50]; //
结构体数组,存储学生的信息,在此初定为50,可改
/*
void Savemessage //保存学生输入信息的函数
FILE *fp,*fp1;//定义文件指针,//以下判断文件打开与否 ,"a"方式打开则可向文件尾写数据
iffpfopen"studentmessage.txt","wb+"NULL//打开文件studentmessage.txt
printf"打开文件失败\n"; exit0;
iffp1fopen"TestResult.txt","a"NULL//打开文件TestResult.txt
n"; exit0; printf"打开文件失败\
printf" 输入姓名:"; //以下为要学生输入个人信息
scanf"%s",s[0].name;
printf" 输入学号:";
scanf"%s",&s[0].num;
fwrite&s[0],sizeofstruct Student,1,fp;//向文件studentmessage.txt
中写入一条记录,即刚刚输入的学生信息
fprintffp1," 姓名:%s\n",s[0].name;//以下为向文件TestResult.txt中写入刚刚输入的学生信息
fprintffp1," 学号:%s\n",s[0].num;
fclosefp;//关闭文件studentmessage.txt
fclosefp1;
system"cls"; //清屏
void Judge//判断函数
int i0;
FILE *fp; //文件指针//以下判断文件打开与否 ,"r"为只读打开方式
printf"\n\n\n";printf"*************************小学数学测试系统********************\n";printf"*printf"*printf"**********************
***************************************\n";printf"*printf"*printf"*pr
intf"*printf"*printf"*
iffpfopen"studentmessage.txt","r"NULL//以下判断文件打开与否 "a"方式打开则可向文件尾写数据//打开文件studentmessage.txt
fpfopen"studentmessage.txt","w+"; //如果没有studentmessage.txt文件,则新建此文件,"w+"打开方式为新建一个文件
printf"无文件记录,已新建.\n";
while!feoffp//判断是否到了文件尾
fread&s[i],sizeofstruct Student,1,fp;//一行一行从文件中读出学生信息,保存在结构体数组student[]中
fscanffp,"\n"; //读取换行符 i++; //i变量保存学生记录个数
ifi50//当人数满时即50个人满时,因为数组下标从0开始,所以当i为29时
printf"人数已满,你已无法测试.\n";
fclosefp;
exit0;
/*
void Additionint number //加法运算函数,number为题目数形参
FILE *fp,*fp2,*fp3;
iffpfopen"TestResult.txt","a"NULL
printf"打开文件失败\n"; exit0;
iffp2fopen"failedResult.txt","a"NULL
printf"打开文件失败\n"; exit0;
iffp3fopen"rightResult.txt","a"NULL
printf"打开文件失败\n";
exit0;
int num1,num2,num3,num4,m,n,count10,count20;
float average0.0; //正确率变量,注意是float类型
srandtime0;//初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的
fprintffp," 加法测试:\n";//向文件写入
fprintffp," 被加数 + 加数 你的结果 正确结果 是否正确\n";//向文件写入
printf"**********************************************************
***\n";/*选择难度*/ printf"* printf"* printf"* printf"* printf"*
printf"请选择难度: "; scanf"%d",&m;system"cls"; //清屏
ifm1 n10 ;/*将m的值转化为对应的n值,从而使随机函数出现一位,2位,3位,*/
ifm2 n100 ;
else ifm3 n1000 ;
printf" \n
*********************************************************************
*****\n\n";
forint i0;inumber;i++/*小于测试题目数时,循环*/
ifm1
num1rand%n; num2rand%n; //产生一位随机数,num1,num2
ifm2
num110+rand%n-10; //产生两位随机数 num1,num2num210+rand%n-10;
ifm3
num1100+rand%n-100;//产生三位随机数 num1,num2
num2100+rand%n-100;num3num1+num2;//num3保存正确结果printf" %d + %d ",num1,num2;//在终端屏幕上输出题目scanf"%d",&num4;//你要输入的计算结果
ifnum3num4//正确结果与你计算的结果比较,正确的话
fprintffp," %d + %d %d %d?\n",num1,num2,num4,num3;//将结果记录到TestResult.txt中
count1++;//变量count1记录正确题目的个数else//错误的话,即num1!num2时
fprintffp," %d + %d %d %d×\n",num1,num2,num4,num3;//将结果记录到TestResult.txt中
fprintffp2," %d + %d \n",num1,num2,num4,num3;//将错误题记录到failedResult.txt中
fprintffp3," %d + %d %d \n",num1,num2,num3;//将错误题正确结果记录到failedResult.txt中
averagefloatcount1/floatnumber;//计算正确率,注意int整型要转换为float类型
fprintffp," 正确 %d 道,错误 %d 道,正确率为:%f\n\n",count1,count2,average;
AA+average*100;
nu++;
fclosefp;
fclosefp3;
fclosefp2;
/*
void Subtracterint number//减法运算函数,注释与加法一样
FILE *fp,*fp2,*fp3;
iffpfopen"TestResult.txt","a"NULL
printf"打开文件失败\n";
exit0;
iffp2fopen"failedResult.txt","a"NULL
printf"打开文件失败\n";
exit0;
iffp3fopen"rightResult.txt","a"NULL
printf"打开文件失败\n";
exit0;
int num1,num2,num3,num4,count10,n,m,count20;
float average0.0;
srandtime0;
fprintffp," 减法测试:\n";
fprintffp," 被减数 - 减数 你的结果 正确结果 是否正确\n"; printf"*************************************************************\
n";/*选择难度*/ printf"* printf"* printf"* printf"* printf"*
printf"请选择: "; scanf"%d",&m;system"cls"; //清屏
ifm1 n10 ;
ifm2 n100 ;
else ifm3 n1000 ;
printf" \n
*********************************************************************
*****\n\n";
forint i0;inumber;i++
ifm1
num1rand%n; num2rand%n; //产生一位随机数,num1,num2
ifm2
num110+rand%n-10; //产生两位随机数 num1,num2num210+rand%n-10;
ifm3
num1100+rand%n-100;//产生三位随机数 num1,num2
num2100+rand%n-100;
num3num1-num2;
printf" %d - %d ",num1,num2;
scanf"%d",&num4;
ifnum3num4
fprintffp," %d - %d %d %d? \n",num1,num2,num4,num3; count1++;
else
fprintffp," %d - %d %d %d×\n",num1,num2,num4,num3; count2++;
fprintffp2," %d - %d \n",num1,num2,num4,num3; fprintffp3," %d - %d %d \n",num1,num2,num3; averagefloatcount1/floatnumber; fprintffp," 正确 %d 道,错误 %d 道,正确率
为:%f\n\n",count1,count2,average;
AA+average*100;
nu++;
fclosefp;fclosefp2;
fclosefp3;
/*
void Multiplicationint number//乘法运算函数,注释与加法一样 FILE *fp,*fp2,*fp3;
ffpfopen"TestResult.txt","a"NULL i
printf"打开文件失败\n";
exit0;
iffp2fopen"failedResult.txt","a"NULL printf"打开文件失败\n";
exit0;
iffp3fopen"rightResult.txt","a"NULL printf"打开文件失败\n";
exit0;
int num1,num2,num3,num4,m,n,count10,count20;
float average0.0;
srandtime0;
fprintffp," 乘法测试:\n";
fprintffp," 被乘数 * 乘数 你的结果 正确结果 是否正确\n"; printf"**********************************************************
***\n";/*选择难度*/ printf"* printf"* printf"* printf"* printf"*
printf"请选择: ";scanf"%d",&m;
system"cls"; //清屏
ifm1 n10 ;
ifm2 n100 ;
else ifm3 n1000 ;
printf" \n
*********************************************************************
*****\n\n";
forint i0;inumber;i++
ifm1
num1rand%n; num2rand%n; ifm2
num110+rand%n-10;
num210+rand%n-10;
ifm3
num1100+rand%n-100;
num2100+rand%n-100;
num3num1*num2;
printf" %d * %d ",num1,num2;
scanf"%d",&num4;
ifnum3num4
fprintffp," %d * %d %d %d?\n",num1,num2,num4,num3; count1++;
else
fprintffp," %d * %d %d %d×\n",num1,num2,num4,num3; count2++;
fprintffp2," %d * %d \n",num1,num2,num4,num3;
fprintffp3," %d * %d %d \n",num1,num2,num3;
averagefloatcount1/floatnumber;
道,错误 %d 道,正确率fprintffp," 正确 %d
为:%f\n\n",count1,count2,average; AA+average*100;
nu++;
fclosefp;
fclosefp2;
fclosefp3;
/*
void Divisionint number // 和加法运算函数注释一样
FILE *fp,*fp2,*fp3;
iffpfopen"TestResult.txt","a"NULL printf"打开文件失败\n";
exit0;
iffp2fopen"failedResult.txt","a"NULL printf"打开文件失败\n";
exit0;
iffp3fopen"rightResult.txt","a"NULL printf"打开文件失败\n";
exit0;
int num1,num2,m,n,count10,count20;
float num3,num4,average; //正确率变量,注意是float类型
srandtime0;//初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的
fprintffp," 加法测试:\n";//向文件写入
fprintffp," 除数数/被除数你的结果 正确结果 是否正确\n";//向文件写入
printf"**********************************************************
***\n";/*选择难度*/ printf"* printf"* printf"* printf"* printf"*
printf"请选择:";
scanf"%d",&m;system"cls"; //清屏
ifm1 n10 ;
ifm2 n100 ;
else ifm3 n1000 ; printf" \n *********************************************************************
*****\n\n";
printf" 请保留保留小数点后一位 \n";
forint i0;inumber;i++//小于测试题目数时,循环
ifm1
num1rand%n;
ifm2
num110+rand%n-10;
ifm3
num1100+rand%n-100;
num2n/10+rand%n-n/10; //产生不等于零的随机数num3 num3floatnum1/floatnum2;//num3保存正确结果
printf" %d / %d ",num1,num2;//在终端屏幕上输出题目 scanf"%f",&num4;//你要输入的计算结果
num3intnum3*10/10.0; //实现保留小数点一位
ifnum3num4//正确结果与你计算的结果比较,正确的话
fprintffp," %d / %d %.1f %.1f?\n",num1,num2,num4,num3;//向文
件中写入
count1++;//变量count1记录正确题目的个数
else//错误的话,即num1!num2时
fprintffp," %d / %d %.1f %.1f×\n",num1,num2,num4,num3;
count2++;//变量count2记录错误题目的个数
fprintffp2," %d / %d \n",num1,num2; fprintffp3," %d / %d %.1f \n",num1,num2,num3;
averagefloatcount1/floatnumber;//计算正确率,注意int整型要转换为
float类型
fprintffp," 正确 %d 道,错误 %d 道,正确率
为:%f\n\n",count1,count2,average; AA+average*100;
nu++;
fclosefp;
fclosefp2;
fclosefp3;
/*
void rework // 错题重做
int a;
char ch;
FILE *fp2,*fp3;iffp2fopen"failedResult.txt","a+"NULL
printf"打开文件失败\n"; exit0;iffp3fopen"rightResult.txt","a+"NULL
printf"打开文件失败\n";exit0;
printf"********************错题重做
***************************************\n";
while!feoffp2 chfgetcfp2;printf"%c",ch;//读取failedResult.txt中的错题
ifch'' scanf"%d",&a; //输入答案
fp2fopen"failedResult.txt","w";//清空之前数据
fclosefp2;
printf"小朋友请查看正确答案\n";
while!feoffp3 chfgetcfp3;printf"%c",ch;//读取rightResult.txt中的错题的答案
fclosefp3;fp3fopen"rightResult.txt","w";//清空
fclosefp3;
//
void sort//实现排序
FILE *fp5;
int i,j,m; s[0].avscoreA/nu; fp5fopen"nrecord.txt","a+"; fprintffp5,"%s%s%f\n",s[0].name,s[0].num,s[0].avscore;//将刚刚做过的
测试记录到文件nrecord.txt中 fclosefp5; fp5fopen"nrecord.txt","rb";
fori0;!feoffp5;i++
fscanffp5,"%s%s%f\n",s[i].name,s[i].num,&s[i].avscore;//将文件
nrecord.txt的记录存到结构体struct Student中 fclosefp5;
//实现排序 mi;
struct Student temp;
fori0;im;i++
forj0;jm-1;j++
ifs[j].avscores[j+1].avscore
strcpytemp.name,s[j].name;//利用临时结构变量temp实现数组元素的交
换 strcpytemp.num,s[j].num; temp.avscores[j].avscore; strcpys[j].name,s[j+1].name; strcpys[j].num,s[j+1].num;
s[j].avscores[j+1].avscore; strcpys[j+1].name,temp.name; strcpys[j+1].num,temp.num;
s[j+1].avscoretemp.avscore;
//若n0,意味着没有交换了,排序已经完成
//输出排名结果
printf"
****************************************************************\n";
printf"---------查看你的排名(排序结果由高到低:
printf"-------------姓名学号分数------------\n";
fori0;im;i++
printf"%s%s%4.2f\n",s[i].name,s[i].num,s[i].avscore;
/*
void TestOver//程序测试完毕函数
printf"\n\n------测试完毕你的测试结果保存在 %s 中------\n\n",s[0].num; //输出测试结果记录提示
void ShowResult//显示测试结果函数
FILE *fp;
iffpfopen"TestResult.txt","r"NULL
printf"打开文件失败\n"; exit0;
char ch;chfgetcfp;//文件开头字符
whilech!EOF//当文件没有到尾时,一直循环
putcharch;//输出字符 chfgetcfp;
fclosefp;
void FileCopy//文件复制函数,用来保存测试结果,当然文件名不能重复,
FILE *in,*out; strcats[0].num,".txt";//将字符串".txt"连接到字符串student[0].num后,即以学号为文件名,后缀为.txt的文件中,保存在工程目录下
ifinfopen"TestResult.txt","r"NULL infopen"TestResult.txt","w+";printf"无文件记录,已新建.\n"; ifoutfopens[0].num,"w"NULL//打开文件学号.txt 文件(如03071361.txt),"w"方式为只写方式
printf"打开文件失败\n"