添加数字时总和不正确

时间:2014-08-06 08:16:39

标签: c++ function if-statement

好的,这是添加无限数字并在c ++中显示总和的代码。但错误是发生的添加是第一个数字和所有其他数字的最后一个数字。例如,如果我想添加30 + 40 + 55 + 70,我的计划会计算30 + 0 + 0 + 5 + 0 = 35。我做错了什么?

#include <iostream>

using namespace std;

int main()
{
    int num = 0;
    int sum = 0;

    cout << "Please enter numbers you want to add and end with N or n: ";

    for (;;)
    {
        cin >> num;
        sum += num;
        cout << endl;

        char indicator ('q');

        cin >> indicator;
        if (( indicator == 'n') || (indicator == 'N'))
            break;

    }
    cout << "The sum is: " << sum << " ";

    return 0;
}

3 个答案:

答案 0 :(得分:4)

我不确定我完全理解你要做什么,但如果你想添加一个由N(或n)字符终止的整数列表,那么你应该阅读将每个实体作为字符串,查看它是否为终止字符,如果不是,则将其转换为整数:

int sum = 0;

while (true) {
    std::string s;
    std::cin >> s;

    if (tolower(s[0]) == 'n')
        break;

    sum += std::stoi(s);
}

当然,上面的代码只是一个框架 - 在生产代码中,您应该始终检查I / O操作是否成功并清理您的输入。一个更完整的例子是:

std::string s;
while (std::cin >> s) {
    int ch = s[0];

    if (ch > 0 && tolower(ch) == 'n')
        break;

    try {
        sum += std::stoi(s);
    } catch (const std::invalid_argument &e) {
        // handle conversion error
        break;
    } catch (const std::out_of_range &e) {
        // handle out-of-range error
        break;
    }
}

答案 1 :(得分:3)

当您阅读指标时,您将从输入流中提取下一个非空白字符;如果用户输入了数字,则这是第一个数字。有几种解决方法。

最简单的就是循环:

while ( std::cin >> num ) {
    sum += num;
}

如果下一个输入没有数字形式(不提取它),输入将失败。 (这也有一个优点,即如果输入由于某种原因而失败,则不使用输入。)这或多或少是标准习惯用法。

如果您确实想检查'n',可以使用std::cin.peek()向前看一个字符,而不提取它。但是,这不会跳过空格,因此您可能希望首先执行std::cin >> std::ws。在这种情况下,您可能希望将其包装在函数中:

bool
terminationRequested( std::istream& source )
{
    source >> std::ws;
    return source.peek() == 'n' || source.peek() == 'N';
}

然后

while ( ! terminationRequested( std::cin ) ) {
    int num;
    std::cin >> num;
    if ( ! std::cin ) {
        //  error...
    }
    sum += num;
}

您仍然需要在std::cin >> num之后检查可能的错误。否则,如果用户输入"a",您将以无限循环结束,向sum添加未定义的值。

或者,另一个常用的习惯用法是使用putback将指标返回到流:

while ( std::cin >> indicator && indicator != 'n' && indicator != 'N' ) {
    std::cin.putback( indicator );
    std::cin >> num;
    if ( ! std::cin ) {
        //  error...
    }
    sum += num;
}

同样,你必须以某种方式处理错误。如果num失败,则使用std::cin >> num是未定义的行为。

答案 2 :(得分:2)

这是因为您读取了指标字符,该字符将删除并忽略用户从输入流中输入的下一个数字。