C分数算术

usu*_*uck 7 c struct rational-numbers pointer-arithmetic fractions

对于我需要做的以下事情,我遇到了很大的困难:
a.声明包含有理数的数据结构.
写f'xns将+, - ,*,/有理数.
所有f'xns必须传递3个参数,每个参数指向在a部分中声明的类型I的数据结构; 2个参数=操作数,第3个=结果.
C.编写一个f'xn,它将指向数据结构的指针作为参数,并返回数字的GCD.&denom.
d.使用c部分中的f'xn来编写一个将分数(有理数)减少到最低项的f'xn.传入指向分数的指针,并用f'xn修改分数.
写入输入和输出功能,以便用户可以以1/5的形式输入分数.

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

我是在正确的轨道上吗?我相信我有下降,但不是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;
}
Run Code Online (Sandbox Code Playgroud)

删除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;
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*sta 3

您的代码的一些注释:

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

最后但并非最不重要的一点是,"%c%*c"获取 ay/n 问题答案的格式是可能的,但很危险:您可能会得到前面输入的换行符!fgets选择面向行的输入(使用+ sscanf)或自由格式输入(使用scanf或)之一fscanf并坚持下去。%1s进入achar response[2]更安全...

并在评论中仔细写下您只处理积极的理性或注意符号!这样的细节可能会让图书馆的用户相当生气……更不用说吹毛求疵的老师了Jonathan Leffler作品)。