gpt4 book ai didi

c - 将 double 转换为分数的函数

转载 作者:行者123 更新时间:2023-11-30 21:43:30 25 4
gpt4 key购买 nike

这是我之前的代码:

char fractionCalculator(long double interest)
{
char multiples_of_one_eighth[7] = { 1 / 8, 1 / 4, 3 / 8, 1 / 2, 5 / 8, 3 / 4, 7 / 8 };

char Return;
char * returnValue;

if (interest - trunc(interest) < 0.0625)
{
Return = '\0';
}
else if (interest - trunc(interest) < 0.1875)
{
Return = multiples_of_one_eighth[1];
}
else if (interest - trunc(interest) < 0.3125)
{
Return = multiples_of_one_eighth[2];
}
else if (interest - trunc(interest) < 0.4375)
{
Return = multiples_of_one_eighth[3];
}
else if (interest - trunc(interest) < 0.5625)
{
Return = multiples_of_one_eighth[4];
}
else if (interest - trunc(interest) < 0.6875)
{
Return = multiples_of_one_eighth[1];
}
else if (interest - trunc(interest) < 0.8125)
{
Return = multiples_of_one_eighth[1];
}

}

它甚至没有运行。当我做到这一点时,我认为分数必须显示为字符数组,但我猜我做得非常错误。我相信它无法运行的原因与函数的输出和输入有关?我已经为此工作了几个小时,但仍然无法弄清楚。感谢任何可以提供帮助的人!

最佳答案

我猜这是一个接受数字并将其四舍五入到最接近的八分之一的函数。例如 0.26 将返回 "1/4"

主要问题是您无法将分数的字符串表示形式(即字符串“1/4”,而不是数字 1/4)存储在单个 char 中char 存储单个 1 字节字符。 1/8 是一个返回数字的数学公式。 "1/8" 是一个 4 个字符的字符串,存储在 char * 中,这是一个指向包含字符的内存的指针。你想要最后一张。因此,您将返回一个 char *

您可以返回像 ½ 这样的 Unicode 分数,但这很快就会变得复杂。

<小时/>

然后就是所有的interest - trunc(interest)什么也不做。

首先,trunc 采用 double,但 interestlong double。它返回一个 double,然后从丢失精度的 long double 中减去它。编译器警告会告诉您类似的事情,请使用 -Wall 打开它们。您需要使用truncl。这没什么大不了的,它不会明显破坏代码,但它会失去 long double 的一些精度。

但是您根本不需要使用truncltruncl(0.1)0.0truncl(0.9)0.0。在您的范围内,所有 interest - trunc(interest) 所做的都是 interest - 0。所以摆脱它。

<小时/>

也不需要 Return 变量,对于这样一个简单的函数,您可以立即返回。您可能被告知“函数应该只返回一次”,这是来自名为 Structured Programming 的东西的过时建议。 。它应该让事情变得更简单,但如果遵循得太严格,就会导致复杂性。

你还是不应该随意返回。对于这么小的功能来说,这真的不重要。在这里,我们可以对名为 early exit 的事物使用多个返回值。我们可以立即返回,而不是存储在循环或 if/else 链末尾返回的值。使代码更简单。

<小时/>

也不需要 multiples_of_one_eighth 数组。如果我们可以通过数组索引引用分数,这将很有用,例如:

int index = ...some calculation involving interest...
return multiples_of_one_eight[index];

但是由于无论如何我们都必须将每个索引硬编码到 if/else 中,所以不妨消除一些复杂性并对数字进行硬编码。那么就很容易看出错误。喜欢:

  else if (interest - trunc(interest) < 0.1875)
{
Return = multiples_of_one_eighth[1];
}

您返回的是 multiples_of_one_eighth[1],但那是 1/4。我很确定您的意思是 1/8

把它们放在一起,我们得到这样的结果。

#include <stdio.h>

const char *fractionCalculator(long double interest)
{
if (interest < 0.0625) {
return "0";
}
else if (interest < 0.1875) {
return "1/8";
}
else if (interest < 0.3125) {
return "1/4";
}
else if (interest < 0.4375) {
return "3/8";
}
else if (interest < 0.5625) {
return "1/2";
}
else if (interest < 0.6875) {
return "5/8";
}
else if (interest < 0.8125) {
return "3/4";
}
else {
return "1";
}
}

int main() {
printf("%s\n", fractionCalculator(0.8));
}

请注意,这会返回无法修改的常量字符串,因此它们被声明为 const char *

另请注意,数学有点错误,我基本上复制了您的内容,所以我将其留给您修复。

关于c - 将 double 转换为分数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42464252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com