作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/14 21:21:59
编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和
我了个CAO,还真没想到全功能版本会这么多内容……已编译运行通过.已经实现了绝大部分内容,包括自动识别正负数,可以直接输入整数而不是分数,会把整数转换为分数来计算,同样,如果得数正好是整数的,也会输出为整数样式.会自动约分到最简模式,可以说只差以下几点就能算彻底完成了:1、当分母为0时,自动转化显示为无限大,但是在和的无限大的正负符号上,做了几回都没得出正确结果,所以暂时恒定为正了(输入的分数已经可以判断正负号了).2、本来想做分母上带符号也能正常显示负数的符号,就就是说“3/-5“会自动识别为“-3/5”的功能,结果没出效果……可能是scanf的限制吧,考虑到不合平常使用习惯,所以没继续做.3、要不要显示时自动分号对齐?似乎没必要吧.加一运行效果图片:#include<stdio.h>#include<string.h>#include<stdlib.h>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<x_n?x_d:x_n);i++) //求分子分母最大公约数        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");}