四则运算(修改版)
之前的一篇随笔“四则运算:我的设计和设想(未完成版)”中的程序在和同伴共同讨论审核后发现诸多格式书写问题和程序问题,格式问题已在代码中修改,代码放置于此博文的附录内,的可审阅在此只对程序问题做出提出和修改。
程序问题:
- 执行整数加法,q 键退出后随及出现真分数加法运算。
- 真分数的任意运算的结果都显示为0.00,无法正常计算。
- 真分数进行任一运算得出的结果都为未约分数,如何化为最简式?(未解决)
- 修改版的代码仍存在冗长现象,如何利用函数将其简化?(未解决)
解决办法:
- 程序内,整数和真分数的运算是以switch语句区分开的,但每个case语句后并未加上break语句,所以造成无退出继续运行的状况。(PS: 找到解决办法才发现,问这个问题充分的显示了我的智商到达了一定的程度(di)。)
- 写出一个函数progress(int f1,int f2),求取最大公约数,在之后的运算中可调用使用。(程序参考网络:http://www.zybang.com/question/e431cf54c7fabec2ffae8691e3dcfaba.html)
注明:随运行结果可正常显示无error,但无法保证其正确性。对于此问题,后续再补充。
程序截图:
1.整数减法运算
2.真分数除法运算
附录:源代码(未完成版)
源代码(修改版)
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
// 求最大公约数
//(参考:http://www.zybang.com/question/e431cf54c7fabec2ffae8691e3dcfaba.html)
int process(int f1,int f2)
{
int fx;
while(f2!=0){
fx=f1%f2;
f1=f2;
f2=fx;
}
return f1;
}
int main()
{
int a,b,x,y,s=0,r=0,e=0,result; //s总题数 r正确数 e错误数
float fen1,fen2; //真分数
char c; //答题者输入的值 (比如其中的a+b=c)
int m,n; //输入的数值,确定性
printf("\n\t\t【小朋友~又到了检验自己实力的时候啦!让我们开始吧!】\n\n");
printf("输入要练习的题型吧(1整数 / 2真分数):");
scanf("%d",&n);
printf("\n根据下面序列号,可以选择试题哦\n");
printf("1.+ 加法\n");
printf("2.- 减法\n");
printf("3.* 乘法\n");
printf("4./ 除法");
printf("\n 提示:1.整数间运算 要保留到小数点到整数部分!\n") ;
printf(" 2.按q键退出哦!\n") ;
printf("\n输入要练习的对应序号吧:");
scanf("%d",&m);
printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
printf("\n小测试开始啦!认真答题吧!\n");
srand( (unsigned)time( NULL ) ); //取随机数
switch(n){
/*整数开始*/
case 1:{
while ((c=getchar())!='q') //按q退出
{
s++;
a=rand()%100;
b=rand()%100;
x=rand()%100;
y=rand()%x; //保证减法、除法 可应用
//加法 +
if(m==1)
{
printf("%d+%d=",a,b);
scanf("%d",&c);
if (a+b==c) r++;
else{
printf("要细心呀!正确答案为:%d\n",a+b);
e++;
}
}
//减法 -
else if(m==2)
{
printf("%d-%d=",x,y);
scanf("%d",&c);
if (x-y==c) r++;
else{
printf("要细心呀!正确答案为:%d\n",x-y);
e++;
}
}
//乘法 *
else if(m==3)
{
printf("%d*%d=",a,b);
scanf("%d",&c);
if (a*b==c) r++;
else{
printf("要细心呀!正确答案为:%d\n",a*b);
e++;
}
}
//除法 /
else if(m==4)
{
if(y!=0){ //排除 除数=0的情况
printf("%d/%d=",x,y);
scanf("%d",&c);
float shang=x/y;
if (x/y==c) r++;
else{
printf("要细心呀!正确答案为:%.2f\n",shang);
e++;
}//else结束
}//if(y!=0)结束
}
else
printf("请输入正确序号!\n"); //输入其他数字,提示输出错误
result=100*r/s; //整体得分
}
}//整数结束
break;
/*真分数 开始*/
case 2:{
while ((c=getchar())!='q')
{
s++;
float t; //t做转换的中间因子。fen1,fen2转换
x=rand()%100;
y=rand()%x;
a=rand()%100;
b=rand()%a;
fen1=y/x; //设定两个不同的真分数
fen2=b/a;
int f1,f2,min,result2; //求最大公约数所设定的值
//加法 +
if(m==1)
{
printf("%d/%d+%d/%d=",y,x,b,a);
scanf("%d",&result2);
f1=y*a+x*b;
f2=a*x;
min=process(f1,f2);
if (fen1+fen2==result2) r++;
else{
printf("要细心呀!正确答案为:%d/%d\n",f1/min,f2/min);
e++;
}
}
//减法 -
else if(m==2)
{
if(fen1>fen2)
{
printf("%d/%d-%d/%d=",y,x,b,a);
scanf("%d",&result2);
f1=y*a+x*b;
f2=a*x;
min=process(f1,f2);
if (fen1-fen2==result2) r++;
else{
printf("要细心呀!正确答案为:%d/%d\n",f1/min,f2/min);
e++;
}
}
else{
t=fen1;
fen1=fen2;
fen2=t; //减数>被减数,则转换
printf("%d/%d-%d/%d=",y,x,b,a);
scanf("%d",&result2);
f1=y*a+x*b;
f2=a*x;
min=process(f1,f2);
if (fen1-fen2==result2) r++;
else{
printf("要细心呀!正确答案为:%d/%d\n",f1/min,f2/min);
e++;
}
}
}
//乘法 *
else if(m==3)
{
int j=y*b,k=x*a; //分子or分母间的相乘
printf("%d/%d*%d/%d=",y,x,b,a);
scanf("%d",&result2);
f1=y*a+x*b;
f2=a*x;
min=process(f1,f2);
if (j*k==result2) r++;
else{
printf("要细心呀!正确答案为:%d/%d\n",f1/min,f2/min);
e++;
}
}
//除法 /
else if(m==4)
{
int o=y*a,p=x*b; //相除等于乘于一个倒数
if(p!=0){ //防止分母=0,即p!=0
printf("(%d/%d)/(%d/%d)=",y,x,b,a);
scanf("%d",&result2);
f1=y*a+x*b;
f2=a*x;
min=process(f1,f2);
if (o*p==result2) r++;
else{
printf("要细心呀!正确答案为:%d/%d\n",f1/min,f2/min);
e++;
}
}
}
else
printf("请输入正确序号!\n"); //输入其他数字,提示输出错误
result=100*r/s; //得分
}
}//真分数结束
break;
}
//成绩显示
printf("\n本次答题成绩:%d\n\n",result);
printf("本次共有%d道题。\n回答正确有 %d 道\n回答错误有 %d 道\n",s,r,e);
//评语
if(result>60&&result<80)
{
printf("\n\n评语:还差一点就要满分咯!继续前进吧!");
}
else if(result>80&&result<100)
{
printf("\n\n评语:就差一丢丢了!再接再厉!");
}
else if(result==100)
{
printf("非常棒哦!为你点赞!");
}
else
{
printf("\n\n评语:要多加练习哟!你的潜力很大呢!");
}
}