#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int n;//记录输入的题目个数
int a,b,c,da;//a,b分别代表第一,第二操作数,c代表得数,da代表输入的答案
float score=0;//记录总分数
float j,k,L;//分别计算答对的分数
float lv;//计算答对的概率
//进行加法运算
void jia()
{
int i;
j=k=0;
lv=0;
printf(" 欢迎使用,以下是加法运算 ");
printf("请输入题目数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%100;
c=a+b;
printf(" %d+%d=? ",a,b);
printf("请输入你的答案(答对一题5分):");
fflush( stdin );
scanf("%d",&da);
if(da==c) //判断答案是否正确
{
printf(" 恭喜你,答对了! ");
j=j+5;
}
else
{
printf(" 抱歉,你答错了!你还有一次机会 ");
printf(" %d+%d=? ",a,b);
printf("请输入你的答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
k=k+5;
}
else printf(" 抱歉,你又答错了,正确答案是:%d+%d=%d ",a,b,c);
}
}
score=j+k;
lv=(score/(5*n))*100;
printf(" 加法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行减法运算
void jian()
{
int i,temp;//temp是中间变量
j=k=0;
lv=0;
printf(" 欢迎使用,以下是减法运算 ");
printf("请输入题目数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%100;
if(a<b)//保证得出的数不是负数
{
temp=a;
a=b;
b=temp;
}
c=a-b;
printf(" %d-%d=? ",a,b);
printf("请输入你的答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
j=j+5;
}
else
{
printf(" 抱歉,你答错了,你还有一次机会 ");
printf(" %d-%d=? ",a,b);
printf("请输入你的答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
k=k+5;
}
else printf(" 抱歉,你又答错了,正确答案为:%d-%d=%d ",a,b,c);
}
}
score=(j+k);
lv=(score/(5*n))*100;
printf(" 减法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行乘法运算
void chen()
{
int i;
j=k=0;
lv=0;
printf(" 欢迎使用,以下是乘法题 ");
printf(" 请输入题目数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%100;
c=a*b;
printf(" %d*%d=? ",a,b);
printf("请输入答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
j=j+5;
}
else
{
printf(" 抱歉,你答错了,你还有一次机会! ");
printf(" %d*%d=? ",a,b);
printf("请输入答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
k=k+5;
}
else printf(" 抱歉,又答错了,正确答案为:%d*%d=%d ",a,b,c);
}
}
score=j+k;
lv=(score/(5*n))*100;
printf(" 乘法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行除法运算
void chu()
{
int i;
char dn;//用以保存除法运算符
float an;//用以保存除法运算得出的答案
int fenzi,fenmu;//fenzi是分子,fenmu是分母
j=k=L=0;
lv=0;
printf(" 欢迎使用,以下是除法题 ");
printf("请输入题数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%99+1;//使得随机出现的数不会有0,保证了除数不会出现0情况,即不会出现无意义的情况
c=a/b;
if(a%b==0) //判断数能否除尽,若a对b求余为0,则说明除得尽,以整数形式输入,否则则为除不尽,提示以分数输入
{
printf(" %d/%d=? ",a,b);
printf(" 请输入你的答案:");
fflush( stdin );
scanf("%f",&an);
if(an==c)
{
printf("恭喜你,答对了! ");
j=j+5;
}
else
{
printf("抱歉,你答错了,你还有一次机会! ");
printf(" %d/%d=? ",a,b);
printf(" 请输入你的答案:");
fflush( stdin );
scanf("%f",&an);
if(an==c)
{
printf("恭喜你,答对了! ");
k=k+5;
}
else printf("抱歉,你又答错了,正确答案为:%d/%d=%d ",a,b,c);
}
}
else
{
//dn='/';//dn保存除法运算符
printf(" %d/%d=? ",a,b);
printf(" 请输入你的答案(请以分数形式输入) ");
printf(" 请输入分子:");
fflush( stdin );
scanf("%d",&fenzi);
printf("请输入分母:");
fflush( stdin );
scanf("%d",&fenmu);
if(fenzi/fenmu==a/b)
{
printf("恭喜你,答对了! ");
L=L+5;
}
else
printf("抱歉,你答错了,正确答案为:%d/%d=%d ",a,b,c);
}
}
score=(j+k+L);
lv=(score/(5*n))*100;
printf(" 除法运算中所得的分数为%.f分 中奖率为百分之%.2f ",score,lv);
}
int selectmenu()
{
int choice;
do
{
printf(" 1:加法运算 ");
printf(" 2:减法运算 ");
printf(" 3:乘法运算 ");
printf(" 4:除法运算 ");
printf(" 5:谢谢使用 ");
printf("请选择(1-5):");
fflush( stdin );
scanf("%d",&choice);
while(choice!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5)
{
printf("不存在该选项,请重新选择(1-5):");
fflush(stdin); //清空输入缓存区,否则字符会一直留在缓存区,使程序进入一个死循环
scanf("%d",&choice);
}
}while((choice<0)||(choice>6));
system("cls"); //清楚屏幕
return choice;
}
void main()
{
int choice;
srand((unsigned)time(NULL));//随机产生0-99之间的随机数
while(1)
{
switch(choice)
{
case 1:
jia();
break;
case 2:
jian();
break;
case 3:
chen();
break;
case 4:
chu();
break;
case 5:
printf("谢谢使用");
exit(0);
}
choice=selectmenu();
}
}
#include<stdlib.h>
#include<time.h>
int n;//记录输入的题目个数
int a,b,c,da;//a,b分别代表第一,第二操作数,c代表得数,da代表输入的答案
float score=0;//记录总分数
float j,k,L;//分别计算答对的分数
float lv;//计算答对的概率
//进行加法运算
void jia()
{
int i;
j=k=0;
lv=0;
printf(" 欢迎使用,以下是加法运算 ");
printf("请输入题目数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%100;
c=a+b;
printf(" %d+%d=? ",a,b);
printf("请输入你的答案(答对一题5分):");
fflush( stdin );
scanf("%d",&da);
if(da==c) //判断答案是否正确
{
printf(" 恭喜你,答对了! ");
j=j+5;
}
else
{
printf(" 抱歉,你答错了!你还有一次机会 ");
printf(" %d+%d=? ",a,b);
printf("请输入你的答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
k=k+5;
}
else printf(" 抱歉,你又答错了,正确答案是:%d+%d=%d ",a,b,c);
}
}
score=j+k;
lv=(score/(5*n))*100;
printf(" 加法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行减法运算
void jian()
{
int i,temp;//temp是中间变量
j=k=0;
lv=0;
printf(" 欢迎使用,以下是减法运算 ");
printf("请输入题目数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%100;
if(a<b)//保证得出的数不是负数
{
temp=a;
a=b;
b=temp;
}
c=a-b;
printf(" %d-%d=? ",a,b);
printf("请输入你的答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
j=j+5;
}
else
{
printf(" 抱歉,你答错了,你还有一次机会 ");
printf(" %d-%d=? ",a,b);
printf("请输入你的答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
k=k+5;
}
else printf(" 抱歉,你又答错了,正确答案为:%d-%d=%d ",a,b,c);
}
}
score=(j+k);
lv=(score/(5*n))*100;
printf(" 减法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行乘法运算
void chen()
{
int i;
j=k=0;
lv=0;
printf(" 欢迎使用,以下是乘法题 ");
printf(" 请输入题目数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%100;
c=a*b;
printf(" %d*%d=? ",a,b);
printf("请输入答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
j=j+5;
}
else
{
printf(" 抱歉,你答错了,你还有一次机会! ");
printf(" %d*%d=? ",a,b);
printf("请输入答案:");
fflush( stdin );
scanf("%d",&da);
if(da==c)
{
printf(" 恭喜你,答对了! ");
k=k+5;
}
else printf(" 抱歉,又答错了,正确答案为:%d*%d=%d ",a,b,c);
}
}
score=j+k;
lv=(score/(5*n))*100;
printf(" 乘法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行除法运算
void chu()
{
int i;
char dn;//用以保存除法运算符
float an;//用以保存除法运算得出的答案
int fenzi,fenmu;//fenzi是分子,fenmu是分母
j=k=L=0;
lv=0;
printf(" 欢迎使用,以下是除法题 ");
printf("请输入题数:");
fflush( stdin );
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=rand()%100;
b=rand()%99+1;//使得随机出现的数不会有0,保证了除数不会出现0情况,即不会出现无意义的情况
c=a/b;
if(a%b==0) //判断数能否除尽,若a对b求余为0,则说明除得尽,以整数形式输入,否则则为除不尽,提示以分数输入
{
printf(" %d/%d=? ",a,b);
printf(" 请输入你的答案:");
fflush( stdin );
scanf("%f",&an);
if(an==c)
{
printf("恭喜你,答对了! ");
j=j+5;
}
else
{
printf("抱歉,你答错了,你还有一次机会! ");
printf(" %d/%d=? ",a,b);
printf(" 请输入你的答案:");
fflush( stdin );
scanf("%f",&an);
if(an==c)
{
printf("恭喜你,答对了! ");
k=k+5;
}
else printf("抱歉,你又答错了,正确答案为:%d/%d=%d ",a,b,c);
}
}
else
{
//dn='/';//dn保存除法运算符
printf(" %d/%d=? ",a,b);
printf(" 请输入你的答案(请以分数形式输入) ");
printf(" 请输入分子:");
fflush( stdin );
scanf("%d",&fenzi);
printf("请输入分母:");
fflush( stdin );
scanf("%d",&fenmu);
if(fenzi/fenmu==a/b)
{
printf("恭喜你,答对了! ");
L=L+5;
}
else
printf("抱歉,你答错了,正确答案为:%d/%d=%d ",a,b,c);
}
}
score=(j+k+L);
lv=(score/(5*n))*100;
printf(" 除法运算中所得的分数为%.f分 中奖率为百分之%.2f ",score,lv);
}
int selectmenu()
{
int choice;
do
{
printf(" 1:加法运算 ");
printf(" 2:减法运算 ");
printf(" 3:乘法运算 ");
printf(" 4:除法运算 ");
printf(" 5:谢谢使用 ");
printf("请选择(1-5):");
fflush( stdin );
scanf("%d",&choice);
while(choice!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5)
{
printf("不存在该选项,请重新选择(1-5):");
fflush(stdin); //清空输入缓存区,否则字符会一直留在缓存区,使程序进入一个死循环
scanf("%d",&choice);
}
}while((choice<0)||(choice>6));
system("cls"); //清楚屏幕
return choice;
}
void main()
{
int choice;
srand((unsigned)time(NULL));//随机产生0-99之间的随机数
while(1)
{
switch(choice)
{
case 1:
jia();
break;
case 2:
jian();
break;
case 3:
chen();
break;
case 4:
chu();
break;
case 5:
printf("谢谢使用");
exit(0);
}
choice=selectmenu();
}
}
结果:
总结:
1、解决了在菜单选择中如果输入的是字符的时候会提示出错,用的是fflush()函数,由于要清除的是存在缓冲区内的字符,因此用fflush(stdin),
stdin就是标准输入,一般就是指键盘输入到缓冲区里的东西,scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:
① 遇空格、“回车”、“跳格”键;
② 遇宽度结束;
③ 遇非法输入;
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中 解决就要在scanf()函数之后加个fflush(stdin)。
2、解决了上一回没有解决的问题:当出现结果除不尽的情况时,用户输入的数没有以分数形式输入时,不知如何设置提示输入错误,尝试用while语句来判断时,如果输入整型,无论结果是否对都会提示对了
解决办法:将分数分开来输入,依次提示输入分子与分母。