C ++函数给出“并非所有控制路径都返回值”错误

时间:2019-01-25 16:03:30

标签: c++

我正在使用一个名为add(BigDecimals c)的函数,该函数不断出现错误提示,并非所有控制路径都返回值:

BigDecimal BigDecimal::add(BigDecimal c)
{
    string fFirst = to_string(this->fraction()); //fraction part of the first number
    string fSecond = to_string(c.fraction()); //fraction part of the second number

    if (fFirst.length() < fSecond.length()) //fraction part of first/second number
    {
        string str(this->toString()); //convert fraction to string
        for (unsigned int i = 0; i < fFirst.length() - fSecond.length(); i++) //difference between first and second
        {
            str += "0"; //pad in the 0's
        }
        this->equals(str); //call the equals function
    }

    if (fSecond.length() < fFirst.length()) //flip numbers around, second < first
    {
        string str(this->toString()); //convert fraction to string
        for (unsigned int i = 0; i < fSecond.length() - fFirst.length(); i++)  //difference between second and first
        {
            str += "0"; //pad in the 0's
        }
        this->equals(str); //call the equals function
    }

    for (unsigned int i = fSecond.length(); i > 0; i++)
    {
        int carryFlag = 0; //carry flag set to 0
        int sum = carryFlag + stoi(this->at(i).toString()) + stoi(c.at(i).toString());
        if (sum >= 10) //greater than 10
        {
            carryFlag = 1;
            sum = sum % 10;
        }

        else //less than 10
        {
            carryFlag = 0; //set carry flag to 0
        }
        return BigDecimal(to_string(sum)); //this is the only thing I want to
                                           //return
    }
    //It wants to return something here, but I am not sure what.


}

我试图通过用else语句替换if语句来解决此问题,但实际上没有任何效果。我不知道如何解决此错误,所以我们将不胜感激!

1 个答案:

答案 0 :(得分:3)

您的逻辑有缺陷(错误消息以及您不知道该怎么做的事实很好地表明了这一点。

您的代码将始终在循环的第一次迭代中返回。显然,您想要做的是一次将一个数字字符串累加一次,但这并不是您编写的代码所做的。

这更像是您想要的东西。但是,我认为您还有其他与数字填充有关的错误,因此此代码无法正常工作,但希望能给您一些提示。

string result = "";
int carryFlag = 0; //carry flag set to 0
for (unsigned int i = fSecond.length(); i > 0; i--)
{
    int sum = carryFlag + stoi(this->at(i).toString()) + stoi(c.at(i).toString());
    if (sum >= 10) //greater than 10
    {
        carryFlag = 1;
        sum = sum % 10;
    }

    else //less than 10
    {
        carryFlag = 0; //set carry flag to 0
    }
    result = to_string(sum) + result;
}
if (carryflag)
    result = "1" + result;
return BigDecimal(result);

请注意,返回仅在循环结束之后进行,每次循环时,都会生成一个名为result的新变量来累加数字。

还要注意,carryflag变量已移出循环。进位的全部要点是保持从循环的一次迭代到下一次迭代的进位,因此它不能在循环内部。另外,如果在添加完所有数字后还剩下一个进位,则需要在结果的开头添加一个数字。

我还在循环中将i++更改为i--。您正在向后遍历要添加的字符串,因此需要i--。这是一种即兴创作,但正如我之前所说,我仍然认为此循环是错误的。

您很清楚您知道如何进行加法运算,但是您还没有掌握如何将其转换为代码。您必须非常仔细和精确地考虑要计算机执行的操作。