|
/*........*/
#include"stdio.h"
#define N 10 //输出N道题目...
void Menu(); //声明菜单函数函数
void level(); //声明一年级测试函数
int qufh(); //声明取符号模块
int results(); //声明返回答案函数
int read(); //声明读取文件函数
void save(); //声明存记录函数
int undefined(); //声明取数字函数
void print_scan(); //声明打印一道题目以及录入答案判断是否正确函数
void printing_results();//打印测试结果模块
void record(); //声明查看记录函数
struct sx
{
int m1,m2; //第一个数和第二个数
char fh_char; //运算符号
int fh_int; //符号值 0/1/2/3对应 + - * /
int jieguo; //结果
int yorn; //对或不对
int ys; //声明余数
}sx[10];
struct fengshu
{
int nianji; //年级
int fs; //分数
}fx[100];
int main()
{
srand(time(0)); //设置随机数种子
system("mode con cols=80 lines=28");//界面设置,宽/高
system("color 4f"); //界面颜色设定
read(); //先读取之前保存的记录
Menu(); //调用菜单函数
system("cls");
printf("正在退出!谢谢使用\n");
system("pause");
return 0;
}
void Menu()
{
int y=1;
char x;
while(1) //起始菜单...
{
system("cls");
printf(" □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ 小学生算术测试 □\n");
printf(" □ ----------------------------- □\n");
printf(" □ □\n");
printf(" □ 1.进行一年级水平测试 □\n");
printf(" □ 2.进行二年级水平测试 □\n");
printf(" □ 3.进行三年级水平测试 □\n");
printf(" □ 4.查看记录 □\n");
printf(" □ 0.退出 □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □ by:褪色_fool □\n");
printf(" □ □\n");
printf(" □ □\n");
printf(" □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□\n");
x=getch();
system("cls");
{
switch(x)
{
case '1':level(1); //以年级为参数调用题目函数
break; //
case '2':level(2); //
break; //
case '3':level(3); //
break;
case '4':record(); //调用查看记录模块
break;
case '0':y=0; //退出 程序
break;
default: printf("输入错误!返回菜单\n");
break; //退出
}
}//----------------------------------------------------
if(y==0)break;
printf("\n");
system("pause");
}
}
void level(int nianji)//参数(年级) 即以难度为参数
{
int i,b;
b=read(); //调用打开文件函数,获取记录长度
printf("你选择的是一年级数学测试。\n\t测试范围为二位数加减\n");
//循环N次每次显示一道题 以及需要输入的答案 (N默认为10)
for(i=0;i<N;i++)
{
//---------打印题目以及输入和判断答案是否正确----------------
print_scan(i,nianji);
}
//---------------输出答题结果,及分数 -----------------
for(i=0;i<N;i++)
{
printing_results(i,b);
}
printf("\n总分:%d",fx.fs);
fx.nianji=nianji; //年级保存
save(b); //记录分数结果
}
void print_scan(int i,int nianji)//参数(题号,年级)(年级=难度)
{
int temp; //用于存储录入的答案
sx.m1=0;
printf("\n%2d:",i+1);
sx.fh_int=rand()%(nianji+1);
sx.fh_char=qufh(sx.fh_int); //调用获取符号函数;参数对应 + - * / 四个符号
sx.m1=undefined(sx.fh_char,nianji,sx.m1);
sx.m2=undefined(sx.fh_char,nianji,sx.m1);
printf("%d%c%d=",sx.m1,sx.fh_char,sx.m2); //打印题目
sx.jieguo=results(sx.m1,sx.fh_char,sx.m2);
scanf("%d",&temp);
getchar();
if(sx.fh_int==3)//若运算符号为“/”号 则有余数
{
printf("余数为:");
scanf("%d",&sx.ys);
}
if(temp==sx.jieguo && sx.fh_int!=3) sx.yorn=1; //当计算非除法时,
else if(sx.fh_int==3 && temp==sx.jieguo && sx.m1-(sx.jieguo*sx.m2)==sx.ys)sx.yorn=1;//为除法时
else sx.yorn=0;
}
void printing_results(int i,int b)
{
printf("\n第%d题:",i+1);
if(sx.yorn==1) //当回答正确时,打印正确
{
printf("正确");
fx.fs=10+fx.fs;
}
else if(sx.fh_int!=3)printf("错误! 正确答案为:%d%c%d=%d",sx.m1,sx.fh_char,sx.m2,sx.jieguo);//当不正确时 非除法 打印题目和结果即可
else printf ("错误! 正确答案为:%d%c%d=%d.....余%d",sx.m1,sx.fh_char,sx.m2,sx.jieguo,sx.m1-(sx.jieguo*sx.m2));//为除法时还须打印余数
}
int undefined(int fh_char,int nianji,int left)//参数(符号数字代号,年级,运算符号左边的数字)
{
int temp; //临时变量
switch(fh_char)
{
case '+': //“+”为开关
{
switch(nianji) //次级开关 以年级为开关
{
case 1: return rand()%90+10; //一年级
case 2: return rand()%900+100; //二年级
case 3: return rand()%8999+1000; //三年级
}
}
case '-': //“-”为开关
{
do
{
switch(nianji)
{
case 1:temp=rand()%90+10;break;
case 2:temp=rand()%900+100;break;
case 3:temp=rand()%8999+1000;break;
}
if(left==0)break;
}while(left<temp);
return temp; //小学一二三年纪还未学习负数所以..右边的数字循环取到一个比左边小的为止
}
case '*': //“*”为开关
{
switch(nianji)
{
case 1: return 0; //一年级无乘法
case 2: return rand()%9+1; //二
case 3: return rand()%90+10; //三
}
}
case '/': //“*”为开关
{
switch(nianji)
{
case 1: return 0; //一年级无除法
case 2: return 0; //二年级无除法
case 3:
{
temp=rand()%90+10; //获取两位数的随机数字 /
if(left==0)return temp; //取左边的数字
else return rand()%9+1; //取右边数字
}
}
}
}
}
int qufh(int i)
{
switch(i)
{
case 0:return '+';
case 1:return '-';
case 2:return '*';
case 3:return '/';
}
}
int results(int a1,int h,int a2) //参数(左边数字,运算符号,右边数字)
{
switch(h)
{
case '+':return a1+a2; //为加时
case '-':return a1-a2; //为减时
case '*':return a1*a2; //为乘时
case '/':return a1/a2; //为除时
}
}
void record()
{
int i,a;
a=read();
if(a==0)printf("操作失败!记录为空\n");
for(i=0;i<a;i++)
printf("%2d:\t%d年级测试\t得分:%d\n",i+1,fx.nianji,fx.fs);
}
int read()
{
FILE *fp; //声明文件指针
int i=1;
if((fp=fopen("temp.txt","rb"))==NULL) //判断文件是否存在
{
fp=fopen("temp.txt","wb"); //不存在则重新创建
printf("已建立文件..\n");
}
else
for(i=0;feof(fp)==0;i++)
fread(&fx,sizeof(struct fengshu),1,fp);//读取文件
fclose(fp); //关闭文件
return i-1;
}
void save(int h)
{
int i;
FILE *fp; //声明文件指针
if((fp=fopen("temp.txt","wb"))==NULL) //以写方式打开文件
{
printf("不能打开文件! \n");
return; //终止程序
}
for(i=0;i<=h;i++) //向文件中写入信息
{
if(fwrite(&fx,sizeof(struct fengshu),1,fp)!=1)printf("文件写入错误.\n");
}
fclose(fp); //关闭文件
} |
|