我在完成以下任务时遇到了很大困难:
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 aslcm = (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
)或自由格式输入(使用 scanf
或 fscanf
)并坚持下去。 %1s
到 char response[2]
更安全...
并在评论中仔细写下你只处理积极的有理数或处理符号!这样的细节会让图书馆的用户相当生气……更不用说吹毛求疵的老师了(credits 代表Jonathan Leffler)。
关于C分数算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33887484/