四则运算(修改版)

四则运算(修改版)

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

程序问题:###

  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.整数减法运算

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("
		【小朋友~又到了检验自己实力的时候啦!让我们开始吧!】

");

printf("输入要练习的题型吧(1整数 / 2真分数):");      
scanf("%d",&n);

printf("
根据下面序列号,可以选择试题哦
");
printf("1.+ 加法
");
printf("2.- 减法
");
printf("3.* 乘法
");
printf("4./ 除法");
printf("
 提示:1.整数间运算 要保留到小数点到整数部分!
") ;  
printf("       2.按q键退出哦!
") ;  
	
printf("
输入要练习的对应序号吧:");      
scanf("%d",&m);
printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
");

printf("
小测试开始啦!认真答题吧!
"); 
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
",a+b);
			e++;
			}
	 }
	 
//减法 -		 
	else if(m==2)
	{                           
		printf("%d-%d=",x,y);
		scanf("%d",&c);
		if (x-y==c) r++;
		else{
			 printf("要细心呀!正确答案为:%d
",x-y);
			 e++;
			}
	}

//乘法 *	
	else if(m==3)
	{                             
		printf("%d*%d=",a,b);
		scanf("%d",&c);
		if (a*b==c) r++;
		else{
			 printf("要细心呀!正确答案为:%d
",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
",shang);  
				 e++;
	 		}//else结束 
		}//if(y!=0)结束                     
	} 
    else	
		printf("请输入正确序号!
"); //输入其他数字,提示输出错误
		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
",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
",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
",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
",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
",f1/min,f2/min);
						e++;
				}
	  }
	}
     else	
		printf("请输入正确序号!
"); //输入其他数字,提示输出错误
		result=100*r/s;      //得分
	}
}//真分数结束 
break;
}


//成绩显示 
printf("
本次答题成绩:%d

",result);
printf("本次共有%d道题。
回答正确有 %d 道
回答错误有 %d 道
",s,r,e);

//评语     
if(result>60&&result<80)
{
 printf("

评语:还差一点就要满分咯!继续前进吧!");  
}
else if(result>80&&result<100)
{
 printf("

评语:就差一丢丢了!再接再厉!");  
}  
else if(result==100)
	{
		printf("非常棒哦!为你点赞!"); 
	}
	else
	{
      printf("

评语:要多加练习哟!你的潜力很大呢!");  
	} 
}
原文地址:https://www.cnblogs.com/JINGY/p/5310634.html