C分数算术

前端之家收集整理的这篇文章主要介绍了C分数算术前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要为分配做以下事情,我遇到了很大困难:
一个.声明包含有理数的数据结构.
湾写f’xns会,–,*,/有理数.
所有f’xns必须传递3个参数,每个参数指向在a部分中声明的类型I的数据结构; 2个参数=操作数,第3个=结果.
C.编写一个f’xn,它将指向数据结构的指针作为参数,并返回数字的GCD. &安培; DENOM.
d.使用c部分中的f’xn编写一个将分数(有理数)减少到最低项的f’xn.传入指向分数的指针,并用f’xn修改分数.
即写入输入和输出功能,以便用户可以以1/5的形式输入分数.

应允许用户输入任意数量的问题,程序应以最低的条件输出答案.

我在正确的轨道上吗?我相信我有一个c-down,但不是d,尤其是e.有人可以指导我或帮我纠正我的剧本吗?

int GCD (int numer,int denom)
{
    int result;
    while (denom > 0) {
        result = numer % denom;
        numer = denom;
        denom = result;
    }
    return numer;
}

int getLCM (int numer,int denom)
{
    int max;
    max = (numer > denom) ? numer : denom;
    while (1) {
        if (max % numer == 0 && max % denom == 0)
            break;
        ++max;
    }
    return max;
}

struct Fraction 
{
    int numer;
    int denom;
};

typedef struct 
{
    int numer;
    int denom; 
};
Fraction

Fraction add_fractions (Fraction a,Fraction b)
{
    Fraction sum;
    sum.numer = (a.numer * b.denom) + (b.numer * a.denom);
    sum.denom = a.denom * b.denom;
    return sum;
}

Fraction subtract_fractions (Fraction a,Fraction b)
{
    Fraction sum;
    sum.numer = (a.numer * b.denom) - (b.numer * a.denom);
    sum.denom = a.denom * b.denom;
    return sum;
}

Fraction multiply_fractions (Fraction a,Fraction b)
{
    Fraction sum;
    sum.numer = (a.denom * b.denom);
    sum.denom = (a.numer * b.numer);
    return sum;
}

Fraction divide_fractions (Fraction a,Fraction b)
{
    Fraction sum;
    sum.numer = (a.denom * b.numer);
    sum.denom = (a.numer * b.denom);
    return sum;
}

int main ()
{
    char response;

    printf ("FRACTION ARITHMETIC PROGRAM\n");
    printf ("Enter your problem (example 2/3 + 1/5):\n");
    scanf (,&problem);

    if (denom == 0 || denom < 0) {
        printf ("Illegal input!!\n");
        printf ("Another problem (y/n)?  ");
        scanf ("%c%*c",&response);
    } else {
        printf ("The answer is  ");

        printf ("Another problem (y/n)?  ");
        scanf ("%c%*c",&response);
    }

    while ((response == 'y') || (response == 'Y')) {
        printf ("\nWould you like to play again?\n");
        scanf ("%c%*c",&response);
    }

    while ((response == 'n') || (response == 'N'))
        printf ("Goodbye and thank you");

    return 0;
}

删除typedef后编辑感谢评论回复

struct Fraction {
    int numer;
    int denom;
};

struct Fraction add_fractions (struct Fraction a,struct Fraction b)
{
    struct Fraction sum;
    sum.numer = (a.numer * b.denom) + (b.numer * a.denom);
    sum.denom = a.denom * b.denom;
    return sum;
}

struct Fraction subtract_fractions (struct Fraction a,struct Fraction b)
{
    struct Fraction sum;
    sum.numer = (a.numer * b.denom) - (b.numer * a.denom);
    sum.denom = a.denom * b.denom;
    return sum;
}

struct Fraction multiply_fractions (struct Fraction a,struct Fraction b)
{
    struct Fraction sum;
    sum.numer = (a.denom * b.denom);
    sum.denom = (a.numer * b.numer);
    return sum;
}

struct Fraction divide_fractions (struct Fraction a,struct Fraction b)
{
    struct Fraction sum;
    sum.numer = (a.denom * b.numer);
    sum.denom = (a.numer * b.denom);
    return sum;
}

解决方法

您的代码的一些评论

>你没有完全遵循你的要求,因为当需要获取指向struct的指针时,GCD函数需要2个整数,并且你的函数将2个struct作为参数,当它们需要3个(指向)结构时返回另一个.
>你的GCD功能使用了一个很好的GCD实现(感谢Jonathan的评论),即使有些评论解释为什么对未来的读者会很好
>正如你在评论中所说,你应该在对它们进行操作之前减少有理数以避免不必要的溢出,并且在添加或减去有效性时,你应该使用denom的LCM出于同样的原因
>您的LCM算法很差.由于你的GCD很好,为什么不简单地使用:LCM(a,b)= a * b / GCD(a,b)计算为lcm =(a / gcb)* b以降低溢出风险(感谢@nm的简化形成)
> a / b的简化形式是’/ b’,其中’= a / GCD(a,b)和b’= b / GCD(a,b)
>对于输入和输出的“%d /%d”格式,结构的两个成员怎么样?

最后但并非最不重要的是,格式化“%c%* c”以获得对同一个问题的回答是可能但危险的:您可能会将前面输入的换行符转换为响应!选择一个面向行的输入(使用fgets sscanf)或自由格式输入(使用scanf或fscanf)并坚持使用它. %1s变成char响应[2]更安全……

并仔细写下评论,你只处理积极的理性或照顾标志!这样的细节可能会让图书馆的用户感到愤怒……更不用说挑剔老师了(creditsJonathan Leffler).

猜你在找的C&C++相关文章