搜索
查看: 2179|回复: 8
打印 上一主题 下一主题

[原创] 小学算术测试小程序

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-29 15:25:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*........*/
#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);   //关闭文件
}
沙发
 楼主| 发表于 2012-12-29 15:27:02 | 只看该作者
各位大大们,如果发现有什么可以改进的地方就提出来...虚心求教..
板凳
发表于 2012-12-31 23:06:57 | 只看该作者
先顶后看!
地板
发表于 2013-8-5 20:07:40 | 只看该作者
学习了{:soso_e142:}
5#
发表于 2013-8-18 15:14:12 | 只看该作者
头文件是你自己写的?
6#
发表于 2013-9-3 16:12:17 | 只看该作者
不能运行啊
7#
发表于 2013-9-3 16:13:16 | 只看该作者
是不是要把啊哈雷的内容全部清空后,复制黏贴本程序啊
8#
发表于 2013-9-3 20:02:47 | 只看该作者
{:soso__7440887204119453221_4:}好长。。
9#
发表于 2013-9-30 12:24:02 | 只看该作者
xzccccccccccccccccccccc
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表