C语言版数学测试软件.docx
- 文档编号:9364444
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:41
- 大小:261.86KB
C语言版数学测试软件.docx
《C语言版数学测试软件.docx》由会员分享,可在线阅读,更多相关《C语言版数学测试软件.docx(41页珍藏版)》请在冰点文库上搜索。
C语言版数学测试软件
本程序由提供
该软件是一个供2年级小学生进行数学测验用的测试软件,并能够给出测试结果。
可以设置出题数量、难度、是否开启时间限制、背景颜色、字体颜色等等等…!
!
可以进行注册,注册后测试会记录成绩,并可以查看个人测试记录,也可以看自己的排名,以及大家的测试情况,排名可以根据时间、分数二种排法!
!
功能强大的没话说!
后面是源码,在VC6.0下完美运行,运行时只需要一个文件即可,会自动创建几个文本文件用于记录(record.txt记录所有人得测试成绩、user.txt记录用户注册信息、config.txt程序配置信息、temp.txt测试时用的临时文件)
注意:
后台管理初始密码为:
123456
~~下面简单晒几张图,
#include
#include
#include
#include
charpass[20]="123456";
inttitleNum=10;//测试题目数
intlevel=2;//测试难度等级,0,1,2,3
inttype=0;//测试算术类型,0,1,2,3,4分别为:
混合,+,-,*,/
inttimeLimit=0;//测试是否有时间限制,0为没有,非0则为秒
charcolor[10]="17";//程序配色
voidmainMenu(charuserName[],FILE*ffp);
voidgetTips(floatscore);
voidgetTime();
voidgetTimeByTimeInfo(structtm*timeinfo);
voidtestNotice();
intgetTest(FILE*tfp);
voidsave(structperson,FILE*ffp);
voidtest(charuserName[20],FILE*ffp);
voidmy_record(charuserName[],FILE*ffp);
voidrank(charuserName[20],inttype,FILE*ffp);
voidfree_test(charuserName[20],FILE*ffp);
voidreg(FILE*ufp,FILE*ffp);
voidlogin(charuserName[],FILE*ufp,FILE*ffp);
voidshowRank(charuserName[20],FILE*ffp);
voidmainMenu(charuserName[],FILE*ffp);
voidset(charuserName[20],FILE*ffp);
voidsetMenu(structset);
structperson
{
charname[20];
floatscore;
floatrate;
structtmtimeinfo;//不要把结构体放在最下面,不然会使person结构体大小变化,影响结果
doubletime;
};
structset
{
inttitleNum;
intlevel;//测试难度等级,0,1,2,3
inttype;//测试算术类型,0,1,2,3,4分别为:
混合,+,-,*,/
inttimeLimit;//测试是否有时间限制,0为没有,非0则为秒
charcolor[10];//程序配色
};
main()
{
FILE*ffp,*ufp,*sfp;
charuserName[20],sys[30]="color";
intLen;
structsets;
ffp=fopen("record.txt","a+");
ufp=fopen("user.txt","a+");
sfp=fopen("config.txt","a+");
Len=sizeof(structset);
if(fread(&s,Len,1,sfp)!
=0)
{
titleNum=s.titleNum;
level=s.level;
type=s.type;
timeLimit=s.timeLimit;
strcpy(color,s.color);
}
else
{
s.titleNum=titleNum;
s.level=level;
s.type=type;
s.timeLimit=timeLimit;
strcpy(s.color,color);
fwrite(&s,Len,1,sfp);
}
sprintf(sys,"color%s",color);
system(sys);
fclose(sfp);
printf("=====登录(输0注册)=====\n");//开始界面
printf("用户名:
");
scanf("%s",userName);
if(strcmp(userName,"0")==0)
{
reg(ufp,ffp);
}
else
{
login(userName,ufp,ffp);
}
fclose(ffp);//closefile
fclose(ufp);
}
/**
*根据测试得分给出评价
*/
voidgetTips(floatscore)
{
printf("小贴士:
");
if(score<30)
printf("做的太差了点吧,要加油啦~\n");
if(score>=30&&score<50)
printf("离及格还有段距离~多练练哦\n");
if(score>=50&&score<60)
printf("不会吧!
差点就及格啦~气的话就努力!
\n");
if(score>=60&&score<90)
printf("做的不错,继续努力~\n");
if(score>=90)
printf("做的太棒了~\n");
}
structtmgetTimeInfo()
{
time_trawtime;
structtm*timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
return*timeinfo;
}
/**
*取得当前时间(eg:
2012-12-1021:
29:
28),有回车
*/
voidgetTime()
{
time_trawtime;
structtm*timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
printf("%4d-%02d-%02d%02d:
%02d:
%02d\n",1900+timeinfo->tm_year,1+timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
}
/**
*根据时间信息结构体输出时间(eg:
2012-12-1021:
29:
28),有回车
*/
voidgetTimeByTimeInfo(structtm*timeinfo)
{
printf("%4d-%02d-%02d%02d:
%02d:
%02d\n",1900+timeinfo->tm_year,1+timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
}
/**
*开始测试先显示的测试须知
*/
voidtestNotice()
{
//本程序由提供
printf("==============测试须知================\n");
printf("考试时会记录考试时间\n");
printf("超出时间限制,则进行强制交卷,但不计成绩\n");
printf("考试结束后就可以马上看到正确答案、正确率、用时等信息\n");
printf("最后祝你考试愉快!
\n");
printf("======================================\n");
printf("本次测试信息:
\n");
if(timeLimit==0)
printf("*无时间限制\n");
else
printf("*测试时间:
%d秒\n",timeLimit);
printf("*测试范围:
0~%d\n",200-50*level);
printf("*题目数:
%d题\n",titleNum);
printf("*题目类型:
");
switch(type){
case0:
printf("混合运算\n");break;
case1:
printf("加法运算\n");break;
case2:
printf("减法运算\n");break;
case3:
printf("乘法运算\n");break;
case4:
printf("除法运算\n");break;
}
printf("准备好了吗?
回车键进入考试\n");
getchar();
getchar();
}
/**
*输出一个测试题目(eg:
10+2=),并保存到tfp
**tfp存储考试结果的临时文件指针
*/
intgetTest(FILE*tfp)
{
inttrueLevel=200-level*50,a,b,trueAns,i;
charc;
srand((unsigned)time(NULL));
a=rand()%trueLevel+1;
for(i=0;i<10000;i++)
b=rand()%trueLevel+1;
a=a>b?
a:
b;//保证第一个数大于第二个数
if(type==0)
{
switch(rand()%4)
{
case0:
c='+',trueAns=a+b;
break;
case1:
c='-',trueAns=a-b;
break;
case2:
c='*',trueAns=a*b;
break;
case3:
c='/',b=rand()%(trueLevel/10)+1,a=b*(rand()%10+1);
trueAns=a/b;//除法处理
break;
}
}
elseif(type==1)
{
c='+',trueAns=a+b;
}
elseif(type==2)
{
c='-',trueAns=a-b;
}
elseif(type==3)
{
c='*',trueAns=a*b;
}
elseif(type==4)
{
c='/',b=rand()%(trueLevel/10)+1,a=b*(rand()%10+1);
trueAns=a/b;//除法处理
}
printf("%d%c%d=",a,c,b);
fprintf(tfp,"%d%c%d=",a,c,b);
returntrueAns;
}
/**
*保存成绩
*
*/
//本程序由提供
voidsave(structpersonp,FILE*ffp)
{
intrecordLen=sizeof(structperson);
structpersont;
rewind(ffp);
if(fwrite(&p,recordLen,1,ffp)==0)
{
printf("考试记录写入失败!
\n");
exit(0);
}
else
{
printf("\n考试成绩记录成功!
\n回车键返回主菜单...");
getchar();
getchar();
mainMenu(p.name,ffp);
}
}
/**
*测试
*
*/
voidtest(charuserName[20],FILE*ffp)
{
inttureAns,userAns,rightNum=0,i;
clock_tstart,finish;
//doubleduration;
structpersonp;
chartemp[1024];
FILE*tfp;
tfp=fopen("temp.txt","w+");
testNotice();
system("cls");//清屏
start=clock();//计时开始
//printf("计时已经开始|当前时间:
");
//getTime();
for(i=0;i { finish=clock();//计时结束 p.time=(double)(finish-start)/CLOCKS_PER_SEC; if(timeLimit! =0) { if(p.time>timeLimit) { printf("很遗憾! 测试时间到了~测试失败: (\n"); printf("回车键返回主菜单..."); getchar(); getchar(); mainMenu(userName,ffp); } } printf("(%d)",i+1); fprintf(tfp,"(%d)",i+1); tureAns=getTest(tfp); scanf("%d",&userAns); while(userAns<0||userAns>99999) { printf("输入的格式不正确或超出范围了哦! 请重新输入: \n"); getchar(); scanf("%d",&userAns); } if(tureAns==userAns)//回答正确 { rightNum++; fprintf(tfp,"%d正确\n",userAns); } else { fprintf(tfp,"%d错误,正确答案: %d\n",userAns,tureAns); } } finish=clock();//计时结束 p.time=(double)(finish-start)/CLOCKS_PER_SEC; p.rate=rightNum/(titleNum*1.0); p.score=p.rate*100; strcpy(p.name,userName); p.timeinfo=getTimeInfo(); fprintf(tfp,"\n%s,你本次考试统计如下: \n用时: %.2f秒,做对了%d题,正确率: %.1f%%,得分: %.1f\n",p.name,p.time,rightNum,(p.rate)*100,p.score); system("cls");//准备输出考试结果 rewind(tfp);//显示结果 while(fgets(temp,1023,tfp)! =NULL) { printf("%s",temp); } getTips(p.score); fclose(tfp); save(p,ffp);//保存成绩 } /** *查看我的记录 * */ voidmy_record(charuserName[],FILE*ffp) { structpersontp; intrecordLen=sizeof(structperson),flag=0; printf("读取信息中...\n"); rewind(ffp); while(! feof(ffp)) { fread(&tp,recordLen,1,ffp); if(strcmp(tp.name,userName)==0&&! feof(ffp))//必须要双重判断! { flag=1; printf("----------------------------------------------------\n"); printf("时间: "); getTimeByTimeInfo(&tp.timeinfo); printf("正确率: %.1f%%得分: %.1f用时: %.2f秒\n",(tp.rate)*100,tp.score,tp.time); } } if(flag==0) printf("没有你的测试信息! \n"); printf("----------------------------------------------------\n"); printf("回车键返回主菜单..."); getchar(); getchar(); mainMenu(userName,ffp); } /** *查看排名 * */ voidrank(charuserName[20],inttype,FILE*ffp) { inti,j,k,recordLen,num,flag; structpersonp[100],temp; recordLen=sizeof(structperson); num=0,flag=0;//记录数 rewind(ffp); while(! feof(ffp))//将记录存入结构体数组 { fread(&p[num],recordLen,1,ffp); if(! feof(ffp)) { flag=1; num++; } } if(flag==0) { printf("没有任何测试信息! \n"); printf("回车键返回主菜单..."); getchar(); getchar(); mainMenu(userName,ffp); } else { for(i=0;i { k=i; for(j=i+1;j { if(type==1) if(p[k].score if(type==2) if(p[k].time>p[j].time)k=j; } if(i! =k) temp=p[k],p[k]=p[i],p[i]=temp;//注意,此处不可以只交换成绩,应该把整个结构体全部交换 } if(type==1) printf("\n总共有%d条记录! 下面是按得分排序结果~\n",num); else printf("\n总共有%d条记录! 下面是按测试时间排序结果~\n",num); for(i=0;i { printf("----------------------------------------------------\n"); printf("排名: %d\n",i+1); printf("用户名: %s\n",p[i].name); printf("时间: "); getTimeByTimeInfo(&p[i].timeinfo); printf("正确率: %.1f%%得分: %.1f用时: %.2f秒\n",(p[i].rate)*100,p[i].score,p[i].time); } printf("----------------------------------------------------\n"); printf("回车键返回主菜单..."); getchar(); getchar(); mainMenu(userName,ffp); } } /** *随便练练 * */ voidfree_test(charuserName[20],FILE*ffp) { inttureAns,userAns,testNum=10,rightNum=0,i; clock_tstart,finish; //doubleduration; structpersonp; chartemp[1024]; FILE*tfp; tfp=fopen("temp.txt","w+"); printf("请输入题数: "); scanf("%d",&testNum); while(testNum<0||testNum>100) { printf("输入格式错误或超出范围! 请重输: "); scanf("%d",&testNum); } system("cls");//清屏 start=clock();//计时开始 printf("计时已经开始|当前时间: "); getTime(); for(i=0;i { printf("(%d)",i+1); fprintf(tfp,"(%d)",i+1); tureAns=getTest(tfp); scanf("%d",&userAns); while(userAns<0||userAns>99999) { printf("输入的格式不正确或超出范围了哦! 请重新输入: \n"); getchar(); scanf("%d",&userAns); } if(tureAns==userAns)//回答正确 { rightNum++; fprintf(tfp,"%d正确\n",userAns); } else { fprintf(tfp,"%d错误,正确答案: %d\n",userAns,tureAns); } } finish=clock();//计时结束 p.time=(double)(finish-start)/CLOCKS_PER_SEC; p.rate=rightNum/(testNum*1.0); p.score=p.rate*100; fprintf(tfp,"\n%s,你本次练习统计如下: \n用时: %.2f秒,做对了%d题,正确率: %.1f%%,得分: %.1f\n",userName,p.time,ri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言版 数学 测试 软件