#include <stdio.h>
#include <stdlib.h>
main()
{
printf("\n\t欢迎使用四则运算练习软件\n\n");
Chioce();
}
Chioce()
{
int ch1=0;
printf("\t1.整数运算\n\t2.真分数运算\n\t请选择:");
scanf("%d",&ch1);
if(ch1==1)
{
ZhengShuYunSuan();
}
FenShuYunSuan();
}
ZhengShuYunSuan()
{
int ranswer=0; //正确答案
int uanswer=0; //用户输入的答案
int t=0,n=0,m=0; //临时变量
char op; //运算类别
int num1=0; //操作数1
int num2=0; //操作数2
int ch,count=0;
while(1)
{
if(count==10)
{
printf("恭喜你在10道练习里做对了%d题! \n",n);
printf("\t1.继续练习\n\t2.退出\n\t请选择:");
scanf("%d",&ch);
if(ch==2)
{
break;
}
count=0;
n=0;
Chioce();
}
srand(time(NULL)); //初始化随机数
num1=rand()%10; //取0-9之间的随机数
num2=rand()%10;
m=rand()%4+1;
switch(m)
{
case 1:
op=‘+‘;
break;
case 2:
op=‘-‘;
break;
case 3:
op=‘*‘;
break;
case 4:
op=‘/‘;
break;
}
//加入一条防止"不够减"的语句,当选择减法且num1小于num2时不够减
//不够减的时候,用临时变量交换两个操作数
if((op==‘-‘) && (num1<num2))
{
t=num1;
num1=num2;
num2=t;
}
//防止"除数为0"的程序漏洞
//当num2被随机取值到0时,就将num2强制置为1
//做除法时,将num1的值强制赋值给num1*num2,防止不能整除
if(op==‘/‘)
{
if(num2==0)
{
num2=1;
}
num1=num1*num2;
}
//防止num1不能被num2整除的语句 }
//输出测试题本身、提示用户输入
printf(" %d%c%d= ",num1,op,num2);
while(!(scanf("%d",&uanswer)))
{
printf("\n 非法输入,请重新输入答案:");
fflush(stdin);
}
//程序计算正确结果
switch(op)
{
case ‘+‘: ranswer=num1+num2; break;
case ‘-‘: ranswer=num1-num2; break;
case ‘*‘: ranswer=num1*num2; break;
case ‘/‘: ranswer=num1/num2; break;
}
//评判,做对返回1,做错返回0
if(uanswer==ranswer)
{
printf(" 做对了!\n");
n++;
}
else
{
printf(" 做错了!\n");
}
count++;
}
}
FenShuYunSuan()
{
int a=0,b=0,c=0,d=0;
int x=0,y=0,z=0,ux=0,uy=0,uz=0;
int n=0,t=0,i=0,m=0;
char op,uop;
int ch=0,count=0;
while(1)
{
if(count==10)
{
printf("恭喜你在10道练习里做对了%d题! \n",n);
printf("\t1.继续练习\n\t2.退出\n\t请选择:");
scanf("%d",&ch);
if(ch==2)
{
exit (0);
}
count=0;
n=0;
Chioce();
}
srand(time(NULL));
a=rand()%10+1;
b=rand()%10+1;
c=rand()%10+1;
d=rand()%10+1;
if(a>b)
{
t=a;
a=b;
b=t;
}
if(c>d)
{
t=c;
c=d;
d=t;
}
m=rand()%4+1;
switch(m)
{
case 1:
op=‘+‘;
x=a*d+b*c;
y=b*d;
break;
case 2:
op=‘-‘;
if((a*d<b*c) && (a!=c))
{
t=a;
a=c;
c=t;
t=b;
b=d;
d=t;
}
x=a*d-b*c;
y=b*d;
break;
case 3:
op=‘*‘;
x=a*c;
y=b*d;
break;
case 4:
op=‘/‘;
x=a*d;
y=b*c;
break;
}
if(x>y)
{
i=y;
}
else
{
i=x;
}
while(i>1)
{
if((x%i==0)&&(y%i==0))
{
x=x/i;
y=y/i;
continue;
}
i--;
}
printf("\n%d/%d %c %d/%d=",a,b,op,c,d);
if(y==1)
{
z=x;
while(!(scanf("%d",&uz)))
{
printf("\n 非法输入,请重新输入答案:");
fflush(stdin);
}
if(z==uz)
{
printf("\n答对了!!");
n++;
}
else
{
printf("\n答错了!!");
}
}
else if(x==y)
{
z=1;
while(!(scanf("%d",&uz)))
{
printf("\n 非法输入,请重新输入答案:");
fflush(stdin);
}
if(z==uz)
{
printf("\n答对了!!");
n++;
}
else
{
printf("\n答错了!!");
}
}
else
{
while(!(scanf("%d%c%d",&ux,&uop,&uy)))
{
printf("\n 非法输入,请重新输入答案:");
fflush(stdin);
}
if((x==ux)&&(y==uy))
{
printf("\n答对了!!");
n++;
}
else
{
printf("\n答错了!!");
}
}
count++;
}
}

本次按老师的要求,把真分数的功能添加进去了,老师要求的是和运算,但为了方便,我将加减乘除都添加进去了,即菜单2,菜单1和第一次的博客实现的功能一样。真分数的运算不能说是很难,就是分数在约分时会有点困难,还有最后答案是一个分数还是整数也要判断,再提示用户输入。
原文:http://www.cnblogs.com/ouqifeng/p/4376802.html