c语言除法分数,关于两个分数的算数运算

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

函数主要分为四个部分:加减法运算、乘除法运算、化简、主函数

其中关于输入部门有问题,请各位帮我检查检查。感激不尽!

加减法可以用一个算法实现,乘除法也可以用一个算法实现。

化简部门是用求最大公约数算法。

下面是源代码和编译错误结果:(因为不能上传附件,所以只能直接贴出来了)

//两个分数的算数运算并且用最简式表示出来

#include

#include

#include

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);

}

d926ed16572082327872ae634bfdb2ed.png

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值