这是我之前的代码:
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 :(得分: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
,但interest
是long double
。它返回double
,但然后从long double
丢失精度中减去它。编译器警告会告诉您类似的事情,并使用-Wall
打开它们。您需要使用truncl
。这不是什么大问题,它不会明显破坏代码,但它会失去long double
的一些精度。
但您根本不需要使用truncl
。 truncl(0.1)
是0.0
。 truncl(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 *。