小学数学测试系统C语言设计.docx

上传人:b****8 文档编号:10966648 上传时间:2023-02-24 格式:DOCX 页数:19 大小:180.53KB
下载 相关 举报
小学数学测试系统C语言设计.docx_第1页
第1页 / 共19页
小学数学测试系统C语言设计.docx_第2页
第2页 / 共19页
小学数学测试系统C语言设计.docx_第3页
第3页 / 共19页
小学数学测试系统C语言设计.docx_第4页
第4页 / 共19页
小学数学测试系统C语言设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

小学数学测试系统C语言设计.docx

《小学数学测试系统C语言设计.docx》由会员分享,可在线阅读,更多相关《小学数学测试系统C语言设计.docx(19页珍藏版)》请在冰豆网上搜索。

小学数学测试系统C语言设计.docx

小学数学测试系统C语言设计

小学数学学习系统设计报告

一.设计要求……………………………2

二.设计目的……………………………2

三.设计的具体实现

1.系统概述:

…………………………………………2

2.总体设计:

…………………………………………3

3.详细设计:

…………………………………………7

4.软件程序设计和调试……………………………14

四.结论与展望………………………15

五.心得体会及建议…………………15

六.附录………………………………15

七.参考文献…………………………15

一.设计要求

小学生数学学习系统

具有随机出题、自动评分、查看正确答案、错题重做等功能的测试系统

具体要求:

1、可选择:

加、减、乘、除四种测试,

2、可设置测试题数,5,10,20,50,100;

3、可设置随机出题难度:

即数据大小范围,比如:

1位,2位,3位

4、可以记录测试者的姓名,时间,难度及测试类型,成绩,题数,运算时间

用菜单选择

1、开始测试:

->选测试类型->选题数->选难度->开始测试

2、查看结果:

3、查看排名:

4、查看错题:

5、退出

二.设计目的

目的:

1.复习巩固C语言的基础知识,进一步加深对C语言编程的理解和掌握

2.根据课内外所学的知识,开发具有实用型的系统,提高学生实践能力,动手能力,和初步的设计编程能力,和理解和掌握模块化编程的方法;

3.通过合作完成编程题,逐渐培养学生的编程能力,提高培养学生解决实际问题能力,培养团队合作精神。

三.设计的具体实现

Ⅰ.系统概述:

小学数学学习系统是基于小学开发,能实现加减乘除四则运算的测试与练习,具有随机出题、自动评分、错题重做、并具有查看个人信息、试题、答案等功能学习应用软件;该软件首界面提供了注册登录界面,不同的学生自己的姓名和学号进行登录;学生首次做完后系统将自动判断,并给出分数;之后学生可以查看自己的成绩,排名并进行错题重做;另外系统还提供计时功能;最后结束后学生个人答题情况及个人信息将保存在,以学生学号命名的文件中,学生可以查看或打印。

2.总体设计:

(一)总体思想

本系统主要应用结构化的设计思想实现小学学习系统的出题,评分、错题重做,查看排名和查看结果的功能;各主要功能模块的数据均保存在文件中,并多次利用文件和结构体之间的转换实现了数据的保存和传递,其中包含了对文件的读写等操作;运用随机函数实现了随机出题功能,运用冒泡排序法及文件和结构体之间的转换实现了排序功能;在软件开发过程中应用了高级语言程序设计的基本控制结构,如选择、循环、顺序结构。

系统设计方法是结构化设计方法,采用C语言在MicrosoftVisualC++6.0环境下进行开发。

(二)系统模块结构图

依据功能得不同,小学学习系统可以分为五个模块:

注册登录模块、测试模块、学生成绩管理模块、查看结果,错题重做模块。

系统模块结构图如下图所示:

(三)模块设计

1.注册登录模块

提示用户输入姓名和学号,如果已经有记录则将本次登录用户信息追加储存在文件中,如果没有记录,则创建一个新文件储存:

其模块图如下图所示:

2.测试模块

进入开始测试菜单后,开始计时,选择加减乘除四种运算类型,总体来说测试模块可以分为:

加法运算、减法运算、乘法运算、除法运算四部分

四部分功能相似选择类型后,在选择题数目为(5,10,20,50,100),然后再选择难度,这时开始做题(题目利用随机函数随机出题),然后判断正误并给出正确率,错误的结果存入一个文件中以备错题重做,将所有做题的结果存入另个文件中以便查看结果;

3.学生成绩管理模块

本模块首先将每次测试同学姓名,学号,成绩存入一个文件中,每次测试同学的信息不覆盖之前同学的信息,然后将文件中的信息读取到结构体中进行排序,最后利用结构体将排好序的成绩显示到屏幕上,其模块如下所示图:

4.查看结果模块

利用测试模块存储的结果信息文件进行直接读取,期间用到fgetc函数将文件的信息读取出来,其图如下图所示:

5.错题重做模块

测试模块过程的已将错题和错题的答案分别出入到文件中,直接进行打开存储错题的文件逐个读取错题,这时利用scanf函数输入答题者的答案,最后再打开储存错题答案的文件进行核对正确答案,其模块如下图所示:

(四)系统流程图:

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中写入刚刚输入的学生信息

具体源程序为:

voidSavemessage()//保存学生输入信息的函数

{FILE*fp,*fp1;//定义文件指针,//以下判断文件打开与否,"a"方式打开则可向文件尾写数据

if((fp=fopen("studentmessage.txt","wb+"))==NULL);

{printf("打开文件失败\n");

exit(0);}

if((fp1=fopen("TestResult.txt","a"))==NULL)

{printf("打开文件失败\n");

exit(0);}

printf("输入姓名:

");//以下为要学生输入个人信息

scanf("%s",s[0].name);

printf("输入学号:

");

scanf("%s",&s[0].num);

 

fwrite(&s[0],sizeof(structStudent),1,fp);

fprintf(fp1,"姓名:

%s\n",s[0].name);

fprintf(fp1,"学号:

%s\n",s[0].num);

fclose(fp);

fclose(fp1);

system("cls");//清屏}

登录完后进入测试界面此时开始计时

有语句{printf("请计时输入开始时间(点,分):

");scanf("%d,%d",&hourA,&minA);}进行输入计时。

然后进入测试界面的菜单:

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.查看结果的实现:

测试过程中已经将结果记录存到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);}有此函数就可直接读取查看结果。

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);}}

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);}

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.软件程序调试和测试

小学学习系统可以分为五个模块:

注册登录模块、测试模块、学生成绩管理模块、测试信息管理模块,该系统分为五个模块,用到main()函数、ChooseFunc1()函数、voidbegain()函数、FileCopy()函数、ShowResult()函数、TestOver()函数、rework()函数、Division(intnumber)函数、Multiplication(intnumber)函数、Subtracter(intnumber)函数、Addition(intnumber)函数、Judge()函数、Savemessage()函数。

程序设计为结构化和模块化,用函数间的相互调用来实现系统的功能,为调试带来了一定的方便。

在调试过程中,出现了很多问题,其中文件和结构体之间的转换最为困难,在一段时间内,影响到了错题重做,排名等功能的实现,最终在坚持不懈努力下,顺利解决。

问题一:

程序中多次用到了文件的读写,用文件记录信息,多次出现读不出来,记录不到文件中,还出现乱码。

解决方法,认真学习和反复研究了,文件的读写函数fprintf,fscanf,fread,fwrite,fgetc,在反复的调试中终于解决了此问题。

问题二:

由于学生的信息均记录在文件中,而文件不能直接排序需转换到结构体中进行排序,给整个排序过程带来了相当大的困难,出现了转换不到结构体中,和乱码现象。

解决方法:

首先检查了为文件是否将信息记录了下来,确认有数据后,用fscanf,fread,进行了反复的更换,此过程中反复运行查看结构体是否有输出。

最终实现了文件与结构体之间数据的传递,实现了排序功能.

问题三:

错题重做有一定的困难,怎样将错题一个个及记录下来,并且能读出来重新做,产生了一定的困难。

解决方法:

采用了文件记录错题和错题的答案,用fgetc函数实现了读出记录的错题,从而实现了错题重做功能。

此外在调试过程中也遇到了相当多的其他问题,从整体结构的设计,到各个功能的实现,期间充满了艰辛和曲折,但最终都一个个的解决了。

四、结论与展望

经过反复的调试和测试,小学学学习系统顺利完成,顺利实现了按类型选择的难度出题和按数目随机出题、自动评分、自动排名,查看正确答案、错题重做等功能。

本系统面向是面向小学生开发的数学测试系统,功能完善,基本上能满足小学生的四则运算要求,本系统作为测试软件的同时也可作为练习软件,对提高小学生数学计算能力有相当大帮助。

另外本系统使用C语言编程,在运行环境中有一定的限制,需在安装有C语言软件的环境中进行运行,带来了一定的局限性。

五、心得体会及建议

编程是个自主创新的过程,其没要太多的要求,有多种方法可以实现其功能,但编程的这种性质,也给我们带来了不小的困难,它需要我们开阔的思维,能够遇到问题能够想到解决的方法,同时也需要我们具有扎实的语言功底能够实现既定的功能。

本次课程设计编写的小学学习系统,它具有随机出题、自动评分、自动排名,查看正确答案、错题重做等功能,与以前编写的程序相比,本系统功能强大,程序大,编写难度相当大,所用的文件等知识基本上是靠自己自主学习来掌握的,采用了边学边用的方法进行了编程。

经过一个多周的努力,终于完成程序的编写和调试,程序的调试过程是非常艰辛的过程,并不能一蹴而就,需要坚持不懈的努力,和反复的调试。

编程过程有时候的确枯燥乏味,而且会出现很多意想不到的问题,但是当一个个问题顺利解决时,有充满喜悦。

通过这次的课程设计,它使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有无论做任何事都要有耐心。

团队合作也是非常重要的一个环节,这会使你在学习过程中倍感轻松,所以在此次课程设计过程中,通过小组的团结合作,和克服种种困难,终于完成了小学学习系统的设计。

本次编程使我进一步的巩固了C言语的基本知识,特别掌握了文件的读写和文件与结构体之间数据传递的实现,通过自学和网上学习,丰富了编程知识,提高了编程能力,和调试能力,提高了分析实际问题解决实际问题的能力。

六、附录

七、参考文献

参考文献:

①•谭浩强•C程序设计(第三版)•清华大学出版社•2005年7月

②•黄明梁旭万洪莉•C语言课程设计•电子工业出版社•2005年6月

③•段兴•C语言实用程序设计100例•人民邮电出版社•2003年3月

④•文东孙鹏飞潘钧•语言程序设计基础与实训项目•北京科技电子出版社•2009年2月

子菜单

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1