小学数学学习系统-C语言课程设计报告_第1页
小学数学学习系统-C语言课程设计报告_第2页
小学数学学习系统-C语言课程设计报告_第3页
小学数学学习系统-C语言课程设计报告_第4页
小学数学学习系统-C语言课程设计报告_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

课程设计报告-35-课程设计报告课程设计名称:C语言课程设计课程设计题目:小学数学学习系统目录第1章概要设计 31.1题目的内容与要求 31.2总体结构 3第2章详细设计 42.1数据结构设计 42.2功能设计 42.2.1学生信息存储模块 42.2.2菜单选择模块 5第3章调试分析 10第4章使用说明 11参考文献 19附录(源代码) 21第1章概要设计1.1题目的内容与要求内容:1.具有随机出题功能,且可以选择难度等级,不要混合运算功能;2.自动评分功能,当用户电答题后能给出用户的分值;3.查看正确答案;4.错题重做功能。要求:用户登录;程序采用文本菜单界面。1.2总体结构本程序主要分为5个模块(功能模块图见图1.1):1.学生信息存储模块,2.菜单选择模块,3.试题测试模块,4.得分与排名模块小学数学学习系统小学数学学习系统菜单选择模块试题测试模块得分与排名模块学生信息存储模块 图1.1第2章详细设计2.1数据结构设计首先定义结构体数组存储学生信息,注册,录入学生个人信息,将学生信息储存在TXT文档中,用指针写入文件,用while循环语句开始写入测试等级难度,保存正确结果,计算正确率,最后查看排名。2.2功能设计2.2.1学生信息存储模块main函数实现程序的菜单操作。根据用户选择的不同选项调用不同的函数,实现“注册”、“输入学号”、“选择难度答题”、“返回主菜单”等功能。具体情况流程图如图2.1所示:算法1在屏幕上输出“请注册”选项;2接受用户输入开开始打开studentmessage打开studentmessageN打开TestResult打开TestResult文件NY打开failedResult打开failedResult文件N文件打开失败!文件打开失败!输出“输出“输入:姓名学号”结束结束图2.1开始2.2.2菜单选择模块开始开始测试;2.查看排名;3.错题重做;4.查看结果;5.结束测试。开始测试;2.查看排名;3.错题重做;4.查看结果;5.结束测试。定义choose.time=0定义choose.time=0输出:输出:“选择功能”输入:输入:“选择”如超出范围,请重新选择如超出范围,请重新选择CChoose=1N2Y2输入当前时间,读入且清屏输入当前时间,读入且清屏CChooseFunc211图2.221N21Choose=2Choose=2Choose=3NY清屏清屏清屏清屏Choose=4Choose=4ReworkchooseFunc2SortbychengjiReworkchooseFunc2SortbychengjiY清屏清屏ChooseFun2清屏清屏ChooseFun2ShowresultShowresultChoosefunc2FilecopytestaverFilecopytestaver结束结束图2.3开始2.2.3试题测试模块开始打开打开TestResult输入num1,num2,num3num4,m,n,count1=count2=0.average输入num1,num2,num3num4,m,n,count1=count2=0.average输出输出“打开文件失败”输出“加法测试输出“加法测试”,“被加数+加数=结果”,“选择难度”,“1.简单2.一般3.困难”读入数字且赋值于m读入数字且赋值于m超出范围请重新选择!超出范围请重新选择!根据m运算的难度,及算式的位数。根据m运算的难度,及算式的位数。2211图2.42121读入结果读入结果结果正确 结果正确Count2=count2+1;Count2=count2+1;AAverage=count1/count2;Average=count1/count2;Average=count1/count2;输出正确,错误,正确率分别为:count1,count2,average输出正确,错误,正确率分别为:count1,count2,average结束结束图得分与排名模块开始开始写入信息打开文件打开文件关闭文件关闭文件打开文件打开文件写入结构体数组写入结构体数组s[j]<s[j+1]s[j]<s[j+1]是否交换位置交换位置s[i]s[i]图2.6第3章调试分析在上机调试过程中遇到许多问题:引用库函数的头文件写成“#include“stdio””;变量int类型未先定义后使用;仔细思考总结,查阅教材解决;将学生信息输入后答题,但发现无法进行下一步功能;解决办法:按F10键进行单步调试,首先发现指向文件数据的指针没有数据,然后对文件直接进行数据加入,发现其他功能能够实现,然后对指向文件数据的指针进行修改,发现无论怎样修改数据都无法进入到文件,于是对数据输入函数进行修改,发现犯了一个比较低级的错误,scanf(“”)输入数据时忘记“&”符号,造成数据无法输入;使用随机数函数,但是调试过程中出现“rand()未定义”,无法产生随机数;解决办法:查找书籍,发现是未使用“rand()”函数的头文件,调用“#include<stdio.h>”后,随机函数问题得以解决;第4章使用说明(1).注册。先用Judge()函数创建studentmessage.txt文件,直接运行cicaidan();菜单项。调用Savemessage();进行注册和保存信息。如图:(2).开始测试。注册后,显示主菜单ChooseFunc1(),如图:选择1进入开始测试模块,此时引入时间,定义全局变量hour1和min1,scanf("%d,%d",&hour1,&min1);手动输入这两个数。如图:之后出现ChooseFunc2()菜单功能选择函数,如图:这里的五个选项用while循环使超出功能范围的不能实现,重新选择选项。再用switch语句选择执行功能,case1程序如下:switch(choose) {case1:system("cls");printf("加法测试:输入要测试的题目数(5/10/20/50/100):");scanf("%d",&thnum);while(thnum<5||thnum>5&&thnum<10||thnum>10&&thnum<20||thnum>20&&thnum<50||thnum>50&&thnum<100||thnum>100) {printf("超出功能范围,请重新选择(5/10/20/50/100):");scanf("%d",&thnum); }Addition(thnum);ChooseFunc2();break;}system("cls");为系统清屏。其他的选项也是如此。下面以加法为例说明一下运算程序。加法源程序如下:voidAddition(intnumber){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); }intnum1,num2,num3,num4,m,n,count1=0,count2=0;floataverage;srand(time(0));fprintf(fp,"加法测试:\n");fprintf(fp,"被加数+加数=你的结果是否正确\n");printf("\n");printf("选择难度\n");printf("1.简单\n");printf("2.一般\n");printf("3.困难\n");printf("\n");printf("请选择难度(1/2/3):");scanf("%d",&m);while(m<1||m>3) {printf("超出功能范围,请重新选择(1/2/3):");scanf("%d",&m); }system("cls"); { if(m==1)n=10;if(m==2)n=100;elseif(m==3)n=1000; }for(inti=0;i<number;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);}num3=num1+num2;printf("%d+%d=",num1,num2);scanf("%d",&num4);if(num3==num4) {fprintf(fp,"%d+%d=%d√\n",num1,num2,num4);count1++; }else {fprintf(fp,"%d+%d=%d×\n",num1,num2,num4);count2++;fprintf(fp3,"%d+%d=%d\n",num1,num2,num3);fprintf(fp2,"%d+%d=\n",num1,num2); } }fclose(fp2);fclose(fp3);average=float(count1)/float(number);fprintf(fp,"正确%d道,错误%d道,正确率为:%f\n\n",count1,count2,average); A=A+average*100; c=c+1;fclose(fp);}定义三个文件指针分别指向三个文件,打开文件开始记录数据。number为题目数形参。srand(time(0));初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的。fprintf是向指定的文件中输入,然后开始选择难易程度,同上,先确定可选范围。用随机函数num1=rand()%n;num2=rand()%n;num3=num1+num2;产生两个随机数分别给加数和被加数,num3储存的是正确答案。为了使1、2、3与难易联系起来,使用if(m==1)n=10;if(m==2)n=100;elseif(m==3)n=1000;来实现转换,当m为1时,将n=10带入num1=rand()%n中,将产生一位数的随机数,即简单题。同理,当m为2时,num1=10+rand()%(n-10);num2=10+rand()%(n-10);rand()%(n-10)的随机数的取值范围是0―89,加上10后取值范围为10―99,所以将产生两位数的随机数,即一般题。当m为3时,num1=100+rand()%(n-100);num2=100+rand()%(n-100);同样rand()%(n-100)的取值范围为0―899,加上100后为100―999,所以将产生三位数的随机数,即困难题。 此时出题完毕。将输入的数与正确答案相比较,如果正确的话,则将该题存入文件rightResult.txt中;错误的话,则将该题存入文件failedResult.txt中。用以用户查看和错题重做模块。变量count1记录正确题目的个数,变量count2记录错误题目的个数。然后将这两个文件关闭。再算出平均值,并将上面的值放入文件TestResult.txt中,关闭文件。A和c为全局变量,为后面的排名做准备。特别注意在除法中,除数不能为零,所以另外加个for循环:for(;num2==0;){num2=rand()%n;}使分母不出现零。返回主菜单时,会输入结束时间:之后会计算做题时间:(3)、查看排名模块。主菜单中选2,调用sortbychengji()函数,程序清单:voidsortbychengji(){ FILE*fp5;inti,j,m,n,N=1;student[0].avscore=A/c;fp5=fopen("nrecord.txt","a+");fprintf(fp5,"%s%s%f\n",student[0].name,student[0].num,student[0].avscore);fclose(fp5);fp5=fopen("nrecord.txt","rb");for(i=0;!feof(fp5);i++){fscanf(fp5,"%s%s%f\n",student[i].name,student[i].num,&student[i].avscore);}fclose(fp5);m=i;structStudenttemp;for(i=0;i<m;i++) {n=0;for(j=0;j<m-1;j++) if(student[j].avscore<student[j+1].avscore) {n=1; strcpy(,student[j].name);strcpy(temp.num,student[j].num);temp.avscore=student[j].avscore;strcpy(student[j].name,student[j+1].name);strcpy(student[j].num,student[j+1].num); student[j].avscore=student[j+1].avscore;strcpy(student[j+1].name,);strcpy(student[j+1].num,temp.num); student[j+1].avscore=temp.avscore; }if(n=0)break;}printf("排序结果由高到低:\n");printf("sortnamenumberavscore\n");for(i=0;i<m;i++){printf("第%d名:%s%s%.1f\n",N++,student[i].name,student[i].num,student[i].avscore);}}定义文件指针*fp5,指向文件nrecord.txt,打开并往里写入姓名、学号、总平均值,其中姓名和学号是调用注册时输入进结构体的;每进行一次不同运算,c的值就会加一,A是平均值之和。关闭后再以只读的方式打开,利用for循环写入到结构体数组中,然后再将里面的数据按正确率排序,排序方法是冒泡法,结构变量是个中间变量。n是个判断量,初始值为零,若再出现n=0,意味着没有交换了,排序已经完成。然后用for循环输出,每输出一次,N增加1。运行结果如图:(4)、错题重做。主菜单选3进入错题重做模块,定义函数rework()。程序清单:voidrework(){ inta; charch; FILE*fp2,*fp3; if((fp2=fopen("failedResult.txt","a+"))==NULL) {printf("打开文件失败\n");exit(0); }while(!feof(fp2)) { ch=fgetc(fp2);printf("%c",ch);if(ch=='=')scanf("%d",&a); }fclose(fp2);printf("请核对一下正确答案\n");if((fp3=fopen("rightResult.txt","r"))==NULL) {printf("打开文件失败\n");exit(0); }while(!feof(fp3)) {ch=fgetc(fp3);printf("%c",ch);}fclose(fp3);}定义两个文件指针,一个用来打开failedResult.txt,在依次读出文件中的数据,如果出现=号,则可以输入一个数,关闭文件。打开rightResult.txt文件显示错题答案,关闭文件。(5)、查看结果。清单如下:voidShowResult(){FILE*fp;if((fp=fopen("TestResult.txt","r"))==NULL) {printf("打开文件失败\n");exit(0); }charch;ch=fgetc(fp);while(ch!=EOF) {putchar(ch);ch=fgetc(fp); }fclose(fp);}打开文件TestResult.txt,ch为文件开头字符,while语句当文件没有到尾时,一直循环,putchar(ch);为输出字符,ch=fgetc(fp)得到下一个字符,关闭文件。完成查看。运行结果如图:最后结束程序,按任意键结束。六、附录(见附件) 参考文献[1]谭浩强.C语言程设计(第四版)[M].北京:高等教育出版社,2010[2]张长海.C语言程设计[M].北京:高等教育出版社,2006[3]吴文虎.程序设计基础(第二版).北京:清华大学出版社,2004附录(源代码)#include<stdio.h>//C语言标准输入输出头文件#include<string.h>//字符串操作需要用到的头文件#include<stdlib.h>//文件操作需要用到的头文件#include<time.h>//产生随机数需要用到的头文件inthour1=0,min1=0,hour2=0,min2=0,c=0;floatA=0;structStudent{charname[21];//姓名charnum[10]; //学号floatavscore;}student[30000];//结构体数组,存储学生的信息,在此初定为30000,可改/********************************************************/voidSavemessage()//保存学生输入信息的函数{FILE*fp,*fp1,*fp2;//定义文件指针,//以下判断文件打开与否,"a"方式打开则可向文件尾写数据if((fp=fopen("studentmessage.txt","a"))==NULL)//打开文件studentmessage.txt {printf("打开文件失败\n");exit(0);}if((fp1=fopen("TestResult.txt","a"))==NULL)//打开文件TestResult.txt {printf("打开文件失败\n");exit(0); }if((fp2=fopen("failedResult.txt","a"))==NULL)//打开文件failedResult.txt {printf("打开文件失败\n");exit(0); }fclose(fp2);printf("输入姓名:");//以下要学生输入个人信息scanf("%s",student[0].name);printf("输入学号:");scanf("%s",&student[0].num);fwrite(&student[0],sizeof(structStudent),1,fp);//向文件studentmessage.txt中写入一条记录,即刚刚输入的学生信息fprintf(fp,"\n");//向文件studentmessage.txt中写入换行符号,换行符不可见fprintf(fp1,"姓名:%s\n",student[0].name);fclose(fp);//关闭文件studentmessage.txt//以下为向文件TestResult.txt中写入刚刚输入的学生信息fprintf(fp1,"学号:%s\n",student[0].num);fclose(fp1);//关闭文件TestResult.txtsystem("cls");//清屏}/******************************************************/voidsortbychengji(){ FILE*fp5;inti,j,m,n,N=1;student[0].avscore=A/c;fp5=fopen("nrecord.txt","a+");fprintf(fp5,"%s%s%f\n",student[0].name,student[0].num,student[0].avscore);//将数据写入文件nrecord.txt中fclose(fp5);fp5=fopen("nrecord.txt","rb");for(i=0;!feof(fp5);i++){fscanf(fp5,"%s%s%f\n",student[i].name,student[i].num,&student[i].avscore);}fclose(fp5);m=i;structStudenttemp;for(i=0;i<m;i++) {n=0;for(j=0;j<m-1;j++) if(student[j].avscore<student[j+1].avscore) {n=1; strcpy(,student[j].name);//利用结构变量temp实现数组元素的交换strcpy(temp.num,student[j].num);temp.avscore=student[j].avscore;strcpy(student[j].name,student[j+1].name);strcpy(student[j].num,student[j+1].num); student[j].avscore=student[j+1].avscore;strcpy(student[j+1].name,);strcpy(student[j+1].num,temp.num); student[j+1].avscore=temp.avscore; }if(n=0)break;//若n=0,意味着没有交换了,排序已经完成}printf("排序结果由高到低:\n");printf("sortnamenumberavscore\n");for(i=0;i<m;i++){printf("第%d名:%s%s%.1f\n",N++,student[i].name,student[i].num,student[i].avscore);}}/*******************************************************/voidJudge()//判断函数{FILE*fp;//文件指针//以下判断文件打开与否,"r"为只读打开方式if((fp=fopen("studentmessage.txt","r"))==NULL)//以下判断文件打开与否//打开文件studentmessage.txt {fp=fopen("studentmessage.txt","w+");//如果没有studentmessage.txt文件,则新建此文件,"w+"打开方式为新建一个文件printf("无文件记录,已新建.\n"); }inti=0;charnum1[10];//变量,注册的学号while(!feof(fp))//判断是否到了文件尾 {fread(&student[i],sizeof(structStudent),1,fp);//一行一行从文件中读出学生信息,保存在结构体数组student[]中fscanf(fp,"\n");//读取换行符i++;//i变量保存学生记录个数 }system("cls");//清屏fclose(fp);}/********************************************************/voidAddition(intnumber)//加法运算函数,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); }intnum1,num2,num3,num4,m,n,count1=0,count2=0;floataverage;//正确率变量,注意是float类型srand(time(0));//初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的fprintf(fp,"加法测试:\n");//向文件写入fprintf(fp,"被加数+加数=你的结果是否正确\n");//向文件写入printf("\n");printf("选择难度\n");printf("1.简单\n");printf("2一般\n");printf("3.困难\n");printf("\n");printf("请选择难度(1/2/3):");scanf("%d",&m);while(m<1||m>3)//不在以上所列的功能以内时循环 {printf("超出功能范围,请重新选择(1/2/3):");scanf("%d",&m); }system("cls");//清屏 {if(m==1)n=10;//将m的值转化为对应的n值,从而使随机函数出现1位,2位,3位。if(m==2)n=100;elseif(m==3)n=1000; }for(inti=0;i<number;i++)//小于测试题目数时,循环 {if(m==1) {num1=rand()%n;//产生随机数,赋值给num1,作为被加数 num2=rand()%n;}//产生随机数,赋值给num2,作为加数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);}num3=num1+num2;//num3保存正确结果printf("%d+|%d=",num1,num2);//在终端屏幕上输出题目scanf("%d",&num4);//你要输入的计算结果if(num3==num4)//正确结果与你计算的结果比较,正确的话 {fprintf(fp,"%d+%d=%d√\n",num1,num2,num4);//向文件中写入count1++;//变量count1记录正确题目的个数 }else//错误的话,即num1!=num2时 {fprintf(fp,"%d+%d=%d×\n",num1,num2,num4);count2++;//变量count2记录错误题目的个数fprintf(fp3,"%d+%d=%d\n",num1,num2,num3);fprintf(fp2,"%d+%d=\n",num1,num2); } }fclose(fp2);fclose(fp3);average=float(count1)/float(number);//计算正确率,注意int整型要转换为float类型fprintf(fp,"正确%d道,错误%d道,正确率为:%f\n\n",count1,count2,average); A=A+average*100; c=c+1;fclose(fp);}/*************************************************************/voidSubtracter(intnumber)//减法运算函数,注释与加法一样{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); }intnum1,num2,num3,num4,count1=0,n,m,count2=0;floataverage;srand(time(0));fprintf(fp,"减法测试:\n");fprintf(fp,"被减数-减数=你的结果是否正确\n");printf("\n");printf("选择难度\n");printf("1.简单\n");printf("2.一般\n");printf("3.困难\n");printf("\n");printf("请选择难度(1/2/3):");scanf("%d",&m);while(m<1||m>3)//不在以上所列的功能以内时循环 {printf("超出功能范围,请重新选择(1/2/3):");scanf("%d",&m); }system("cls");//清屏 { if(m==1)n=10;if(m==2)n=100;elseif(m==3)n=1000; }for(inti=0;i<number;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);}num3=num1-num2;printf("%d-%d=",num1,num2);scanf("%d",&num4);if(num3==num4) {fprintf(fp,"%d-%d=%d√\n",num1,num2,num4);count1++; }else {fprintf(fp,"%d-%d=%d×\n",num1,num2,num4);count2++;fprintf(fp3,"%d-%d=%d\n",num1,num2,num3);fprintf(fp2,"%d-%d=\n",num1,num2); }} fclose(fp2);fclose(fp3);average=float(count1)/float(number);fprintf(fp,"正确%d道,错误%d道,正确率为:%f\n\n",count1,count2,average);A=A+average*100; c=c+1;fclose(fp);}/************************************************************/voidMultiplication(intnumber)//乘法运算函数,注释与加法一样{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); }intnum1,num2,num3,num4,m,n,count1=0,count2=0;floataverage;srand(time(0));fprintf(fp,"乘法测试:\n");fprintf(fp,"被乘数*乘数=你的结果是否正确\n");printf("\n");printf("选择难度\n");printf("1.简单\n");printf("2.一般\n");printf("3.困难\n");printf("\n");printf("请选择难度(1/2/3):");scanf("%d",&m);while(m<1||m>3)//不在以上所列的功能以内时循环 {printf("超出功能范围,请重新选择(1/2/3):");scanf("%d",&m); }system("cls");//清屏 {if(m==1)n=10;if(m==2)n=100;elseif(m==3)n=1000;}for(inti=0;i<number;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);}num3=num1*num2;printf("%d*%d=",num1,num2);scanf("%d",&num4);if(num3==num4) {fprintf(fp,"%d*%d=%d√\n",num1,num2,num4);count1++; }else {fprintf(fp,"%d*%d=%d×\n",num1,num2,num4);count2++;fprintf(fp3,"%d*%d=%d\n",num1,num2,num3);fprintf(fp2,"%d*%d=\n",num1,num2); } }fclose(fp2);fclose(fp3);average=float(count1)/float(number);fprintf(fp,"正确%d道,错误%d道,正确率为:%f\n\n",count1,count2,average); A=A+average*100; c=c+1;fclose(fp);}/************************************************************/voidDivision(intnumber)//和加法运算函数注释类似。{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); }intnum1,num2,m,n,count1=0,count2=0;floatnum3,num4,average;//正确率变量,注意是float类型srand(time(0));//初始化随机数,如果没有此语句,则每次运行程序时的随机数是一样的fprintf(fp,"除法测试:\n");fprintf(fp,"被除数+除数=你的结果是否正确\n");{printf("\n");printf("选择难度\n");printf("1.简单\n");printf("2.一般\n");printf("3.困难\n");printf("\n");printf("请选择难度(1/2/3):");scanf("%d",&m);while(m<1||m>3)//不在以上所列的功能以内时循环 {printf("超出功能范围,请重新选择(1/2/3):");scanf("%d",&m); }system("cls");//清屏 {if(m==1)n=10;if(m==2)n=100;elseif(m==3)n=1000;}printf("保留小数点一位\n");for(inti=0;i<number;i++)//小于测试题目数时,循环 {if(m==1) {num1=rand()%n;//产生随机数,赋值给num1,作为被除数num2=rand()%n;}//产生随机数,赋值给num2,作为除数for(;num2==0;) {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);}num3=(float)(num1)/(float)(num2);//num3保存正确结果printf("%d/%d=",num1,num2);//在终端屏幕上输出题目scanf("%f",&num4);//你要输入的计算结果num3=(int)(num3*10)/10.0;//实现保留小数点一位if(num3==num4)//正确结果与你计算的结果比较,正确的话 {fprintf(fp,"%d/%=%.1f√\n",num1,num2,num4);count1++;//变量count1记录正确题目的个数 }else//错误的话,即num1!=num2时 {fprintf(fp,"%d/%d=%.1f×\n",num1,num2,num4);count2++;//变量count2记录错误题目的个数fprintf(fp3,"%d/%d=%.1f\n",num1,num2,num3);fprintf(fp2,"%d/%d=\n",num1,num2); }}fclose(fp2);fclose(fp3); }average=float(count1)/float(number);//计算正确率,注意int整型要转换为float类型fprintf(fp,"正确%d道,错误%d道,正确率为:%f\n\n",count1,count2,average); A=A+average*100; c=c+1;fclose(fp);}/*************************************************************/voidrework()//错题重做{ inta; charch; FILE*fp2,*fp3; if((fp2=fopen("failedResult.txt","a+"))==NULL) {printf("打开文件失败\n");exit(0); }while(!feof(fp2)) { ch=fgetc(fp2);printf("%c",ch);if(ch=='=')scanf("%d",&a); }fclose(fp2);printf("请核对正确答案\n");if((fp3=fopen("rightResult.txt","r"))==NULL) {printf("打开文件失败\n");exit(0); }while(!feof(fp3)) {ch=fgetc(fp3);printf("%c",ch);}fclose(fp3);}/*************************************************************/voidTestOver()//程序测试完毕函数{printf("\n\n测试完毕你的测试结果保存在%s中\n\n",student[0].num);//输出测试结果记录提示}/*************************************************************/voidShowResult()//显示测试结果函数{FILE*fp;if((fp=fopen("TestResult.txt","r"))==NULL) {printf("打开文件失败\n");exit(0); }charch;ch=fgetc(fp);//文件开头字符while(ch!=EOF)//当文件没有到尾时,一直循环 {putchar(ch);//输出字符ch=fgetc(fp);//得到下一个字符 }fclose(fp);}/**********************************************************/voidFileCopy()//文件复制函数,用来保存测试结果,且文件名不能重复,{FILE*in,*out;strcat(student[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(student[0].num,"w"))==NULL)//打开文件学号.txt文件,"w"方式为只写方式 {printf("打开文件失败\n");exit(0); }while(!feof(in))//当文件TestResult.txt没有结束时循环fputc(fgetc(in),out);//逐个字符写入fclose(in);fclose(out);}/***********************************************************/voidChooseFunc2();//声明voidChooseFunc1()//功能选择函数{printf("1.开始测试\n");printf("2.查看排名\n");printf("3.错题重做\n");printf("4.查看结果\n");printf("5.结束测试\n");printf("\n");intchoose,time=0;printf("选择功能:");scanf("%d",&choose);while(choose<1||choose>5)//不在以上所列的功能以内时循环 {printf("超出功能范围,请重新选择(15):");scanf("%d",&choose); }switch(choose)//switch语句选择执行功能 { case1:system("cls"); { printf("输入当前时间:小时,分钟");//开始时间scanf("%d,%d",&hour1,&min1);system("cls"); }ChooseFunc2();break;case2:system("cls");//清屏sortbychengji();ChooseFunc1();break;case3:system("cls");/

温馨提示

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

评论

0/150

提交评论