随机产生的四则运算涉及随机数,在<stdlib.h>库有rand()函数可以随机产生0~32767值。rand()函数每次调用都会查询是否调用过srand(seed),是否给seed一个值,有则自动调用srand(seed)一次来初始化它的初始值,若没有调用srand那么系统会自动给seed赋初值1,即srand(1)。
用rand(),srand(seed)产生的随机数不会变,也失去了随机性,这个大家可以在自己电脑上试一试。原因在于seed这个种子(srand()函数需要一个种子)在赋初值就固定了,产生的数字自然也就固定了。鉴于上面可用时间作为种子,即srand(time(NULL)),因为运行程序时间不一样,随机数自然也不一样,时间需要在开头声明#include <time.h>。
至于生成10以内数字,需要用到%,如a=rand()%10+1。同样如果需要(a,b)内的值,可用rand%(b-a+1)+a。现在随机数有了,还差随机运算符,数字系统可以给我们解决,运算符该怎么解决呢?
依据我查的资料,可以用switch分支语句来控制,分为4种情况,分别表示加减乘除。此时需要我们再加入一个随机数,其值用上面办法得到1~4,最后在每一个分支里面计算。
下面是我在写的一道题,需要写10道并正确率要>75,希望对大家有帮助。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Encourage(int a);
void Cheer(int a);
int main()
{
int a,b,d,t,count; //a,b为产生的随机数,d控制运算符号,count控制10题数量
int c; //c为输入+,-,*的数字
float f; //f为除法结果
int sum;
srand(time(NULL));
do{ //do循环结束条件为sum>75
sum=0; //每次循环sum从0记
for(count=1;count<=10;count++) //count 统计共10题
{
t=rand()%4+1;
a=rand()%10+1;
d=rand()%4+1;
b=rand()%10+1;
switch(d) //在每一分支有四则运算
{
case 1:
printf(“%d+%d=”,a,b);
scanf(“%d”,&c);
if(c==a+b){
Cheer(t);
sum=sum+10;
}
else{
Encourage(t);
}
break;
case 2:
printf(“%d-%d=”,a,b);
scanf(“%d”,&c);
if(c==a-b){
Cheer(t);
sum=sum+10;
}
else{
Encourage(t);
}
break;
case 3:
printf(“%d*%d=”,a,b);
scanf(“%d”,&c);
if(c==a*b){
Cheer(t);
sum=sum+10;
}
else{
Encourage(t);
}
break;
case 4:
printf(“%d/%d=”,a,b);
scanf(“%f”,&f);
if(f-(float)a/b<1e-5){
Cheer(t);
sum=sum+10;
}
else{
Encourage(t);
}
break;
}
}
printf(“%d%%\n”,sum); //打印sum值
if(sum<75)
printf(“Try it again.\n”);
}while(sum<75);
return 0;
}
void Cheer(int a)
{
switch(a)
{
case 1:
printf(“Very good.\n”);
break;
case 2:
printf(“Excellent.\n”);
break;
case 3:
printf(“Nice work.\n”);
break;
case 4:
printf(“Keep up the good work.\n”);
break;
}
}
void Encourage(int a)
{
switch(a)
{
case 1:
printf(“Please try again.\n”);
break;
case 2:
printf(“Wrong.Try once more.\n”);
break;
case 3:
printf(“Do not give up!\n”);
break;
case 4:
printf(“No correct.Keep trying.\n”);
break;
}
}