c语言用结构体类型表示一个分数,【C++】用结构体类型表示一个分数,定义一个函数实现两个分数的加法运算...

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

teeshe

推荐于 2017.11.22

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:47%    等级:9

已帮助:916人

我了个CAO,还真没想到全功能版本会这么多内容……已编译运行通过。

已经实现了绝大部分内容,包括自动识别正负数,可以直接输入整数而不是分数,会把整数转换为分数来计算,同样,如果得数正好是整数的,也会输出为整数样式。

会自动约分到最简模式,可以说只差以下几点就能算彻底完成了:

1、当分母为0时,自动转化显示为无限大,但是在和的无限大的正负符号上,做了几回都没得出正确结果,所以暂时恒定为正了(输入的分数已经可以判断正负号了)。

2、本来想做分母上带符号也能正常显示负数的符号,就就是说“3/-5“会自动识别为“-3/5”的功能,结果没出效果……可能是scanf的限制吧,考虑到不合平常使用习惯,所以没继续做。

3、要不要显示时自动分号对齐?似乎没必要吧。

加一运行效果图片:

#include

#include

#include

typedef struct{ //分数数型

unsigned int denominator; //分母

unsigned int numerator; //分子

unsigned int negative; //正负号,0为正号,1为负号

} fraction;

fraction fraction_Get(int x1,int x2) { //由分子分母生成分数

fraction x;

if(x1<0) { //判断正负和提取分子

x.negative=1;

x.numerator=0-x1;

} else x.numerator=x1;

if(x2<0) { //判断正负和提取分母

x.negative=(x.negative==0)?1:0;

x.denominator=0-x2;

} else x.denominator=x2;

return x;

}

void fraction_Show(fraction x) { //分数显示

if(x.negative==1)

printf("-");

else printf(" ");

if(x.denominator==0) { //如果分母是0,显示无限大

printf("∞");

} else {

printf("%d",x.numerator);

if(x.denominator>=2) printf("/%d",x.denominator);

}

}

fraction fraction_reduction(fraction x) { //分数约分

int i,j; //循环控制和临时变量

int x_d,x_n;

fraction y; //定义得数储存属性

x_d=x.denominator; //取得分数x的分母和分子

x_n=x.numerator;

if(x_d==0||x_n==1) //分母为0或分子为0/1时不约分

return x;

if(x_n==0) { //如果分子是0,则分母为1,返回

x.denominator=1;

return x;

}

for(i=1;i<=(x_d

if(x_d%i==0&&x_n%i==0)

j=i;

x_d/=j; //约分

x_n/=j;

y.denominator=x_d; //结果复制到y

y.numerator=x_n;

y.negative=x.negative; //正负号不变

return y;

}

fraction fraction_Add(fraction x,fraction y) { //分数相加

int x_d,x_n,y_d,y_n; //x、y两分数的分母和分子

fraction z; //定义得数储存属性

int z_d,z_n; //定义得数的分母和分子

x_d=x.denominator; //取得分数x、y的分母和分子

x_n=x.numerator;

y_d=y.denominator;

y_n=y.numerator;

if(x_d==0||y_d==0) { //为分母为0的情况单独计算

z.denominator=0;

z.negative=0;

z.numerator=1;

return z;

}

if(x.negative==1) x_n=0-x_n; //将正负号添加到分子中

if(y.negative==1) y_n=0-y_n;

z_d=x_d*y_d; //求得数分母

z_n=x_n*y_d+y_n*x_d; //求得数分子

if (z_n<0) { //判断得出分数的正负

z_n=0-z_n;

z.negative=1;

} else z.negative=0;

z.denominator=z_d; //复制得数分母分子到分数z

z.numerator=z_n;

z=fraction_reduction(z); //调用函数约分

return z;

}

void main() {

fraction x,y,z;

int x1,x2,y1,y2;

x2=y2=1;

printf("请输入 x:"); //获取分数x,由键盘输入

scanf("%d/%d",&x1,&x2); //用“/”表示分号

x=fraction_Get(x1,x2);

printf("请输入 y:"); //获取分数x,由键盘输入

scanf("%d/%d",&y1,&y2); //用“/”表示分号

y=fraction_Get(y1,y2);

printf("输入的 x= "); //计算和输出

fraction_Show(x);

printf("\n约分后 x= ");

x=fraction_reduction(x);

fraction_Show(x);

printf("\n");

printf("输入的 y= ");

fraction_Show(y);

printf("\n约分后 y= ");

y=fraction_reduction(y);

fraction_Show(y);

printf("\n");

z=fraction_Add(x,y);

printf("计算 x+y= ");

fraction_Show(z);

printf("\n");

}追问: 复制的啊,真没诚意

00分享举报

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值