C分数算术

标签 c struct fractions pointer-arithmetic rational-numbers

我在完成以下任务时遇到了很大困难:
a.声明一个包含有理数的数据结构。
b. 写出 +、-、*、/有理数的 f'xns。
所有的 f'xns 都必须传递 3 个参数,每个参数都指向我在 a 部分声明的类型的数据结构; 2 个参数 = 操作数,第 3 个 = 结果。
c. 编写一个 f'xn,它将指向您的数据结构的指针作为参数并返回数字的 GCD。 & 面额。
d. 使用 c 部分的 f'xn 写一个 f'xn,它将分数(有理数)减少到最低项。传入一个指向分数的指针,并由 f'xn 修改分数。
e. 编写输入和输出函数,以便用户可以输入 1/5 形式的分数,例如 1/5。

应该允许用户输入任意数量的问题,并且程序应该以最简单的方式输出答案。

我走在正确的轨道上吗?我相信我有 a-c,但没有 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;
}

最佳答案

对您的代码的一些评论:

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

最后但并非最不重要的一点是,格式化 "%c%*c" 以获得是/否问题的答案是可能的,但很危险:您可能会将前面输入的换行符放入响应中!选择面向行的输入(使用 fgets + sscanf)或自由格式输入(使用 scanffscanf)并坚持下去。 %1schar response[2] 更安全...

并在评论中仔细写下你只处理积极的有理数或处理符号!这样的细节会让图书馆的用户相当生气……更不用说吹毛求疵的老师了(credits 代表Jonathan Leffler)。

关于C分数算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33887484/

相关文章:

java - 在一行中显示多个分数的运算

javascript - Emscripten:如何从javascript获取c中的char数组

c - 指向指针的只读指针

c - 使用复合文字来初始化 malloc 的缓冲区,

c++ - 不能在全局范围内使用结构

c++ - 创建分数矩阵

c - 输入今天的日期得到明天的输出

c - MIPS 和英特尔 C 编译器之间的宏定义是否兼容?

C# - 将结构从一个对象传递到另一个对象

Java 将一系列分数相加