C语言笔记:10以内的随机数四则运算考试系统

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_42124234/article/details/101521737

问题场景与实现代码

描述:
编写一个程序,能随机出几道1~10之间的整数的加法(或减法,或乘法,或除法)题给小学生作答
出题数(int n), 和运算符(char op)种类 由输入决定,(分支一)对于每道题如果学生给的答案正确,显示ok,进行下一道题, (分支二)如果答案不正确,则显示no,返回重做此题,重做此题的次数最多3次,如果3次均没有答对,则显示答案,继续下一道题

/*
编写一个程序,能随机出几道1~10之间的整数的加法(或减法,或乘法,或除法)题给小学生作答
出题数(int n), 和运算符(char op)种类 由输入决定,(分支一)对于每道题如果学生给的答案正确,显示ok,
进行下一道题, (分支二)如果答案不正确,则显示no,返回重做此题,重做此题的次数最多3次,如果3次均没有
答对,则显示答案,继续下一道题 
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int Cal(int a,char op,int b);//返回计算正确答案的函数 
int main(void)
{
 int n,k;//n为答题数量,k为每次答错题的限制 
 char op;
 int ans,s_ans;//ans存放正确答案,s_ans存放学生输入的答案 
    printf("请输入运算符(+,-,*,/):\n");
    scanf("%c",&op);
    printf("请输入题目数:\n");
    scanf("%d",&n);
    srand(time(NULL));//用机器时间设置随机种子
    int id=1;//题目序号 
 while(n--)
 {
  int a=rand()%10+1;
  int b=rand()%10+1;
  int ans=Cal(a,op,b);
  k=3;
  while(k--)
  {
   printf("题目%d:%d %c %d = ",id,a,op,b);//显示题目 
   scanf("%d",&s_ans);
   if(ans==s_ans)
   {
    break;//答案正确退出本次答题, 进入下一次答题 
   }
   else
   {
    printf("答案错误!还有%d次答题机会!\n",k);
   }
  }
  id++;
  if(ans!=s_ans)
  {
   printf("答题机会用完,显示答案:%d %c %d = %d\n\n",a,op,b,ans);
  }
  else
  {
   printf("回答正确!\n\n");
  }
 } 
 return 0;
}
int Cal(int a,char op,int b)
{
 switch(op)
 {
  case '+':
   return a+b;
   break;
  case '-':
   return a-b;
   break;
  case '*':
   return a*b;
   break;
  case '/':
   return a/b;
   break;
 }
}

运行结果:
在这里插入图片描述
实现思路:
运算符由用户输入,操作数随机产生,故可以使用stdlib.h中的rand()产生0~32767之间的整数,然后利用求余思想,rand()%10+1就可以把产生的随机数映射到1~10之间,为了防止每次产生的随机数有重复相同的部分,再使用srand(time(NULL))函数(time()在time.h头文件中)用当前机器的时间设置随机种子(随机种子:即以该种子数作为初始化条件,然后用一定的算法不断迭代产生新的随机数,由于时间不断变化,再配备复杂的算法,产生的随机数相同的概率则极低),然后自定义函数Cal()计算正确结果并返回。

要产生指定范围的随机数(假设[a,b])有一个算法:
rand()%(b-a+1)+a

改进与实现代码

上述代码实现了两个运算数随机产生,但是加减乘除运算符没有实现随机产生,那么怎么实现呢?
首先有四种运算符,我们可以规定+,-,*,/分别对应0~3之间的4个数,然后利用随机函数产生[0,3]之间的整数,再用switch case语句做一个了字符类型的映射,所以我们又自定义了一个产生随机操作数的函数char Rand_Op(void),代替了需要用户输入的运算符的那一行代码。

/*
编写一个程序,能随机出几道1~10之间的整数的加法(或减法,或乘法,或除法)题给小学生作答
出题数(int n)由输入决定,题目操作数和运算符随机产生,(分支一)对于每道题如果学生给的答案正确,显示ok,
进行下一道题, (分支二)如果答案不正确,则显示no,返回重做此题,重做此题的次数最多3次,如果3次均没有
答对,则显示答案,继续下一道题 
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int Cal(int a,char op,int b);//返回计算正确答案的函数 
char Rand_Op(void);
int main(void)
{
 int n,k;//n为答题数量,k为每次答错题的限制 
 int ans,s_ans;//ans存放正确答案,s_ans存放学生输入的答案 
//    printf("请输入运算符(+,-,*,/):\n");
//    scanf("%c",&op);
    printf("请输入题目数:\n");
    scanf("%d",&n);
    srand(time(NULL));//用机器时间设置随机种子
    int id=1;//题目序号 
 while(n--)
 {
  int a=rand()%10+1;
  int b=rand()%10+1;
  char op=Rand_Op();
  int ans=Cal(a,op,b);
  k=3;
  while(k--)
  {
   printf("题目%d:%d %c %d = ",id,a,op,b);//显示题目 
   scanf("%d",&s_ans);
   if(ans==s_ans)
   {
    break;//答案正确退出本次答题, 进入下一次答题 
   }
   else
   {
    printf("答案错误!还有%d次答题机会!\n",k);
   }
  }
  id++;
  if(ans!=s_ans)
  {
   printf("答题机会用完,显示答案:%d %c %d = %d\n\n",a,op,b,ans);
  }
  else
  {
   printf("回答正确!\n\n");
  }
 } 
 return 0;
}
int Cal(int a,char op,int b)
{
 switch(op)
 {
  case '+':
   return a+b;
   break;
  case '-':
   return a-b;
   break;
  case '*':
   return a*b;
   break;
  case '/':
   return a/b;
   break;
 }
}
char Rand_Op(void)
{
 int n;
 srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样 
 n=rand()%4;//随机产生【0~3】之间的值,从小到大分别表示加减乘除 
// printf("%d\n",n);
 switch(n)//做一个运算符映射 
 {
  case 0:
   return '+';
  case 1:
   return '-';
  case 2:
   return '*';
  case 3:
   return '/';
 }
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42124234/article/details/101521737
今日推荐