版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
问题场景与实现代码
描述:
编写一个程序,能随机出几道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 '/';
}
}
运行结果: