四则运算(修改版)

四则运算(修改版)

       之前的一篇随笔“四则运算:我的设计和设想(未完成版)”中的程序在和同伴共同讨论审核后发现诸多格式书写问题程序问题,格式问题已在代码中修改,代码放置于此博文的附录内,的可审阅在此只对程序问题做出提出和修改。

程序问题:

  1. 执行整数加法,q 键退出后随及出现真分数加法运算。
  2. 真分数的任意运算的结果都显示为0.00,无法正常计算。
  3. 真分数进行任一运算得出的结果都为未约分数,如何化为最简式?(未解决)
  4. 修改版的代码仍存在冗长现象,如何利用函数将其简化?(未解决)

解决办法:

  1. 程序内,整数和真分数的运算是以switch语句区分开的,但每个case语句后并未加上break语句,所以造成无退出继续运行的状况。(PS: 找到解决办法才发现,问这个问题充分的显示了我的智商到达了一定的程度(di)。)
  2. 写出一个函数progress(int f1,int f2),求取最大公约数,在之后的运算中可调用使用。(程序参考网络:http://www.zybang.com/question/e431cf54c7fabec2ffae8691e3dcfaba.html

注明:随运行结果可正常显示无error,但无法保证其正确性。对于此问题,后续再补充。


程序截图:

1.整数减法运算

OLpQnWi.png

2.真分数除法运算

M4cStNk.png

附录:源代码(未完成版)

别瞎找着!点我!

源代码(修改版)

#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评语:要多加练习哟!你的潜力很大呢!");  
    } 
}

转载于:https://www.cnblogs.com/JINGY/p/5310634.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值