c语言成绩结构体的编译,编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和...

我了个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");

}

3d21e128e244fe8c7c43357054d79c31.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值