函数主要分为四个部分:加减法运算、乘除法运算、化简、主函数
其中关于输入部门有问题,请各位帮我检查检查。感激不尽!
加减法可以用一个算法实现,乘除法也可以用一个算法实现。
化简部门是用求最大公约数算法。
下面是源代码和编译错误结果:(因为不能上传附件,所以只能直接贴出来了)
//两个分数的算数运算并且用最简式表示出来
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void scan_fracion(int *nump,int *denomp);
char get_operator(void);
void add_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp);
void multiply_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp);
int find_gcd(int n1,int n2);
void reduce_fraction(int *nump,int *denomp);
void print_fraction(int num,int denom);
int
main(void)
{
int n1,d1;//第一个分数的分子分母
int n2,d2;//第二个分数的分子分母
char op;//算数运算符+-/*
char again;//y或者n取决于用户是否继续
int n_ans,d_ans;//输出结果的分子分母
do
{
scan_fraction(&n1,&d1);
op=get_operator();
scan_fraction(&n2,&d2);
switch(op)
{
case '+':add_fractions(n1,d1,n2,d2,&n_ans,&d_ans);
break;
case '-':add_fractions(n1,d1,-n2,d2,&n_ans,&d_ans);
break;
case '*':multiply_fractions(n1,d1,n2,d2,&n_ans,&d_ans);
break;
case '/':multiply_fractions(n1,d1,d2,n2,&n_ans,&d_ans);
break;
}
reduce_fraction(&n_ans,&d_ans);
//显示问题和结果
printf("\n");
print_fraction(n1,d1);
printf("%c",op);
print_fraction(n2,d2);
printf("=");
print_fraction(n_ans,d_ans);
//询问是否还有其他的问题
printf("\n你还有其他的问题吗?(y/n)>");
scanf("%c",&again);
}while(again=='y'||again=='Y');
return(0);
}
void scan_fracion(int *nump,int *denomp) //判断输入的分数是否正确
{
char slash;//分数线
int status;
int error;
char discard;
do
{
error=0;
printf("Enter a common fraction as two integers seperated");
printf("by a slash>");
status=scanf("%d%c%d",nump,&slash,denomp);
if(status<3)
{error=1;
printf("错误-请认真输入正确的数");
}else if(slash!='/')
{
error=1;
printf("错误-请分开输入分子分母");
printf("在下划线后(/)\n");
}else if(*denomp<=0)
{
error=1;
printf("错误-分母必须为正数\n");
}
do{
scanf("%c",&discard);
}while(discard!='\n');
}while(error);
}
char get_operator(void)//获取运算符
{
char op;
printf("输入运算符(+,-,*,or /)\n>");
for(scanf("%c",&op);op!='+'&&op!='-'&&op!='*'&&op!='/';scanf("%c",&op))
{
if(op!='\n')
printf("%c 无效,请重新输入(+,-,*,/)\n>",op);
}
return(op);
}
void add_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp)//加运算
{
int denom;
int numer;
int sign_factor; //-1表示负数,1表示其他
denom=d1*d2;
numer=n1*d2+n2*d1;
if(numer*denom>=0)
sign_factor=1;
else
sign_factor=-1;
numer=sign_factor*fabs(numer);
denom=fabs(denom);
*n_ansp=numer;
*d_ansp=denom;
}
void multiply_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp)//乘运算
{
printf("\nEntering multiply_fractions with\n");
printf("n1=%d,d1=%d,n2=%d,d2=%d\n",n1,d1,n2,d2);
*n_ansp=1;
*d_ansp=1;
}
int find_gcd(int n1,int n2)//求最大公约数
{
int gcd,q,p,r;
printf("\nEntering find_gcd with n1=%d,n2=%d\n",n1,n2);
printf("gcd of %d and %d?>",n1,n2);
q=fabs(n1);
p=fabs(n2);
r=q%p;
while(r!=0)
{
q=p;
p=r;
r=q%p;
}
gcd=p;
printf("find_gcd returning %d\n",gcd);
return(gcd);
}
void reduce_fraction(int *nump,int *denomp)//化为最简式
{
int gcd;
gcd=find_gcd(*nump,*denomp);
*nump=*nump/gcd;
*denomp=*denomp/gcd;
}
void print_fraction(int num,int denom)
{
printf("%d%d",num,denom);
}
![](http://imgsrc.baidu.com/forum/w%3D580/sign=43d966a84d36acaf59e096f44cd88d03/915219d8bc3eb135bbcc922aa01ea8d3fc1f44eb.jpg)
其中关于输入部门有问题,请各位帮我检查检查。感激不尽!
加减法可以用一个算法实现,乘除法也可以用一个算法实现。
化简部门是用求最大公约数算法。
下面是源代码和编译错误结果:(因为不能上传附件,所以只能直接贴出来了)
//两个分数的算数运算并且用最简式表示出来
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void scan_fracion(int *nump,int *denomp);
char get_operator(void);
void add_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp);
void multiply_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp);
int find_gcd(int n1,int n2);
void reduce_fraction(int *nump,int *denomp);
void print_fraction(int num,int denom);
int
main(void)
{
int n1,d1;//第一个分数的分子分母
int n2,d2;//第二个分数的分子分母
char op;//算数运算符+-/*
char again;//y或者n取决于用户是否继续
int n_ans,d_ans;//输出结果的分子分母
do
{
scan_fraction(&n1,&d1);
op=get_operator();
scan_fraction(&n2,&d2);
switch(op)
{
case '+':add_fractions(n1,d1,n2,d2,&n_ans,&d_ans);
break;
case '-':add_fractions(n1,d1,-n2,d2,&n_ans,&d_ans);
break;
case '*':multiply_fractions(n1,d1,n2,d2,&n_ans,&d_ans);
break;
case '/':multiply_fractions(n1,d1,d2,n2,&n_ans,&d_ans);
break;
}
reduce_fraction(&n_ans,&d_ans);
//显示问题和结果
printf("\n");
print_fraction(n1,d1);
printf("%c",op);
print_fraction(n2,d2);
printf("=");
print_fraction(n_ans,d_ans);
//询问是否还有其他的问题
printf("\n你还有其他的问题吗?(y/n)>");
scanf("%c",&again);
}while(again=='y'||again=='Y');
return(0);
}
void scan_fracion(int *nump,int *denomp) //判断输入的分数是否正确
{
char slash;//分数线
int status;
int error;
char discard;
do
{
error=0;
printf("Enter a common fraction as two integers seperated");
printf("by a slash>");
status=scanf("%d%c%d",nump,&slash,denomp);
if(status<3)
{error=1;
printf("错误-请认真输入正确的数");
}else if(slash!='/')
{
error=1;
printf("错误-请分开输入分子分母");
printf("在下划线后(/)\n");
}else if(*denomp<=0)
{
error=1;
printf("错误-分母必须为正数\n");
}
do{
scanf("%c",&discard);
}while(discard!='\n');
}while(error);
}
char get_operator(void)//获取运算符
{
char op;
printf("输入运算符(+,-,*,or /)\n>");
for(scanf("%c",&op);op!='+'&&op!='-'&&op!='*'&&op!='/';scanf("%c",&op))
{
if(op!='\n')
printf("%c 无效,请重新输入(+,-,*,/)\n>",op);
}
return(op);
}
void add_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp)//加运算
{
int denom;
int numer;
int sign_factor; //-1表示负数,1表示其他
denom=d1*d2;
numer=n1*d2+n2*d1;
if(numer*denom>=0)
sign_factor=1;
else
sign_factor=-1;
numer=sign_factor*fabs(numer);
denom=fabs(denom);
*n_ansp=numer;
*d_ansp=denom;
}
void multiply_fractions(int n1,int d1,int n2,int d2,int *n_ansp,int *d_ansp)//乘运算
{
printf("\nEntering multiply_fractions with\n");
printf("n1=%d,d1=%d,n2=%d,d2=%d\n",n1,d1,n2,d2);
*n_ansp=1;
*d_ansp=1;
}
int find_gcd(int n1,int n2)//求最大公约数
{
int gcd,q,p,r;
printf("\nEntering find_gcd with n1=%d,n2=%d\n",n1,n2);
printf("gcd of %d and %d?>",n1,n2);
q=fabs(n1);
p=fabs(n2);
r=q%p;
while(r!=0)
{
q=p;
p=r;
r=q%p;
}
gcd=p;
printf("find_gcd returning %d\n",gcd);
return(gcd);
}
void reduce_fraction(int *nump,int *denomp)//化为最简式
{
int gcd;
gcd=find_gcd(*nump,*denomp);
*nump=*nump/gcd;
*denomp=*denomp/gcd;
}
void print_fraction(int num,int denom)
{
printf("%d%d",num,denom);
}
![](http://imgsrc.baidu.com/forum/w%3D580/sign=43d966a84d36acaf59e096f44cd88d03/915219d8bc3eb135bbcc922aa01ea8d3fc1f44eb.jpg)