将double变为分数的函数

时间:2017-02-26 03:01:03

标签: c

这是我之前的代码:

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];
  }

}

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

2 个答案:

答案 0 :(得分:1)

我猜这是一个函数,它接受一个数字并将其舍入到最接近的第八个。像0.26会返回"1/4"

主要问题是你不能在一个"1/4"中存储一个分数的字符串表示(即字符串char,而不是数字1/4)。 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。所以摆脱它。

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

你仍然不应该无所事事地回来。对于这么小的功能,它确实没关系。在这里,我们可以为名为early exit的事物使用多个返回,而不是存储在循环结束时返回的值或if / else链,我们可以立即返回。使代码更简单。

也不需要int index = ...some calculation involving interest... return multiples_of_one_eight[index]; 数组。如果我们可以通过数组索引引用分数,那将非常有用,例如:

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

但是因为我们必须将每个索引硬编码到if / else中,所以不妨删除一些复杂性并硬编码。然后很容易看到错误。像:

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 *

请注意,这会返回无法修改的常量字符串,因此将它们声明为from bitarray import bitarray d=bitarray('0'*30) d[5]=1

另请注意,数学有点不对,我基本上复制了你的内容,所以我会留给你解决。

答案 1 :(得分:0)

检查您的&#39; multiples_of_one_eighth&#39;调试器中的数组。你会发现它们都是零,因为你要求编译器在整数空间中执行像(1/8)这样的除法。如果我理解你的愿望,你可能希望它是一个char *(c-strings)数组,每个条目用双引号括起来。然后,将返回类型更改为char *。