C语言问题 求解答

通过计算机随机产生10道四则运算题,两个操作数为1~10之间的随机数,运算类型为随机产生的加、减、乘、除中的任意一种,不给机会重做,10道题全部做完后,若学生的回答正确率... 通过计算机随机产生10道四则运算题,两个操作数为1~10之间的随机数,运算类型为随机产生的加、减、乘、除中的任意一种,不给机会重做,10道题全部做完后,若学生的回答正确率低于75%,则重新做10道题,直到回答正确率高于75%时才退出程序。请大神看看我的代码,看看哪里不行,求指教。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main()
{
int i;
int data1,data2,data;
int result;
int answer;
int choose1,choose2;
float j,rate;
srand((unsigned)time(NULL));
do
{
for(i=1;i<=10;i++)
{
data1=rand()%10+1;
data2=rand()%10+1;
data=rand()%1+3;
scanf("%d",&answer);
if(answer==result)
{
choose1=rand()%1+3;
j++;
}
else
{
choose2=rand()%1+3;
}
}
rate=j/10;
printf("The accuracy:%f\n",rate);
}while(rate<=0.75);
switch(data)
{
case 0:printf("%d+%d=",data1,data2);result=data1+data2;break;
case 1:printf("%d-%d=",data1,data2);result=data1-data2;break;
case 2:printf("%d*%d=",data1,data2);result=data1*data2;break;
case 3:printf("%d/%d=",data1,data2);result=data1/data2;break;
}
switch(choose1)
{
case 0:printf("Very good!\n");break;
case 1:printf("Excellent!\n");break;
case 2:printf("Nice work!\n");break;
case 3:printf("Keep up the good work!\n");break;
}
switch(choose2)
{
case 0:printf("No!Please try again!\n");break;
case 1:printf("Wrong!Try once more!\n");break;
case 2:printf("Don't give up!\n");break;
case 3:printf("Not correct!Keep trying!\n");break;
}
}
展开
 我来答
laohu2862
推荐于2016-01-13 · TA获得超过1246个赞
知道小有建树答主
回答量:557
采纳率:0%
帮助的人:645万
展开全部
下面的代码是帮你调整了的代码,你运行一下看看吧。
其中修改的地方包括:
1、几个switch语句位置调整,调整之后才能正确选择运算法则与表扬和鼓励的语句。
2、每次回答开始前对正确回答数j进行初始化为0,否则计数将错误。
已经测试过可以运行。
注意:
由于运算中是整数与整数之间的计算,因此除法时结果也为整数部分,也就是比如1/8 答案为0,而不会是0.125。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main(){
int i;
int data1,data2,data;
int result;
int answer;
int choose1,choose2;
float j,rate;
srand((unsigned)time(NULL));
do
{ j = 0;
for(i=1;i<=10;i++)
{
data1=rand()%10+1;
data2=rand()%10+1;
data=rand()%4;
switch(data) /*data值产生之后,就需要计算结果与选择符号。因为符号一共有4种,因此随机数应该对4取余,从而得到data值为 0 到 3*/
{
case 0:printf("%d+%d=",data1,data2);result=data1+data2;break;
case 1:printf("%d-%d=",data1,data2);result=data1-data2;break;
case 2:printf("%d*%d=",data1,data2);result=data1*data2;break;
case 3:printf("%d/%d=",data1,data2);result=data1/data2;break;
}
scanf("%d",&answer);
if(answer==result)
{
choose1=rand()%4;
switch(choose1) /*当计算正确时,choose1 对4取余,随机得到0-3的数,然后选择一个回答正确时的夸奖语句*/
{
case 0:printf("Very good!\n");break;
case 1:printf("Excellent!\n");break;
case 2:printf("Nice work!\n");break;
case 3:printf("Keep up the good work!\n");break;
}
j++;
}
else
{
choose2=rand()%4;
switch(choose2) /*当计算错误时,choose2 对4取余,随机得到0-3的数,然后选择一个回答错误时鼓励的语句*/
{
case 0:printf("No!Please try again!\n");break;
case 1:printf("Wrong!Try once more!\n");break;
case 2:printf("Don't give up!\n");break;
case 3:printf("Not correct!Keep trying!\n");break;
}
}
}
rate=j/10;
printf("The accuracy:%f\n",rate);
}while(rate<=0.75);

getch();
}
罗永争2
2013-05-22 · 超过24用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:68.7万
展开全部
貌似你的Switch语句应该放在while循环里面吧,否则刚开始的时候,result这个变量是没有值的,会出现死循环
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main()
{
int i;
int data1,data2,data;
int result;
int answer;
int choose1,choose2;
float j,rate;
srand((unsigned)time(NULL));
do {
for(i=1;i<=10;i++)
{
data1=rand()%10+1;
data2=rand()%10+1;
data=rand()%1+3; scanf("%d",&answer);
if(answer==result) //问题在这里,程序顺序执行先进入了循环,但是result此时还没有值,所以if语句不会执行,而后choose1,choose2都没有赋值

{
choose1=rand()%1+3; //这里任何一个随机数对1取余数都是0,所以每次choose1和choose2都等于3,
j++; //目测你的意思应该是让它们取0-3之间的随机整数吧?应该对3取余数加1;
}
else
{
choose2=rand()%1+3;
}
}
rate=j/10;
printf("The accuracy:%f\n",rate);
}while(rate<=0.75);
switch(data)
{ case 0:printf("%d+%d=",data1,data2);result=data1+data2;break; case 1:printf("%d-%d=",data1,data2);result=data1-data2;break; case 2:printf("%d*%d=",data1,data2);result=data1*data2;break; case 3:printf("%d/%d=",data1,data2);result=data1/data2;break; }
switch(choose1) { case 0:printf("Very good!\n");break; case 1:printf("Excellent!\n");break; case 2:printf("Nice work!\n");break; case 3:printf("Keep up the good work!\n");break; } switch(choose2) { case 0:printf("No!Please try again!\n");break; case 1:printf("Wrong!Try once more!\n");break; case 2:printf("Don't give up!\n");break; case 3:printf("Not correct!Keep trying!\n");break; }}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LongYao切克闹
2013-05-22 · 超过25用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:66.1万
展开全部
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i;
int data1,data2,data;
int result;
int answer;
int choose1,choose2;
float rate;
int j = 0;
srand((unsigned)time(NULL));
do
{
for(i=1;i<=10;i++)
{
data1=rand()%10+1;
data2=rand()%10+1;
data=rand()%3+1;
switch(data)
{
case 0:printf("%d+%d=",data1,data2);result=data1+data2;break;
case 1:printf("%d-%d=",data1,data2);result=data1-data2;break;
case 2:printf("%d*%d=",data1,data2);result=data1*data2;break;
case 3:printf("%d/%d=",data1,data2);result=data1/data2;break;
}
scanf("%d",&answer);
if(answer==result)
{
choose1=rand()%1+3;
j++;
}
else
{
choose2=rand()%1+3;
}
}
rate=j/10;
printf("The accuracy:%2f\n",rate);
}while(rate<=0.75);
}

我看了好多都没有初始化,你就直接拿来做++或判断。这样是不对的

switch(data)....

是不是应该放在while循环里面?

给你简化了一个,你看看再补一下。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
80hounongmin
2013-05-22 · 超过27用户采纳过TA的回答
知道答主
回答量:200
采纳率:0%
帮助的人:98.2万
展开全部
把switch语句放到scanf语句之后,c中它是顺序执行的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
haiyaojing
2013-05-22 · 超过37用户采纳过TA的回答
知道答主
回答量:160
采纳率:0%
帮助的人:108万
展开全部
是不是data=rand()%1+3;应该为data=rand()%3+1;?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式