【问题标题】:c++ average program giving wrong answersc++ 一般程序给出错误答案
【发布时间】:2015-01-19 11:36:04
【问题描述】:

我刚刚制作了一个 c++ 程序来根据用户输入的数字计算平均值,但它总是给出错误的答案,虽然它很简单,但我无法发现问题所在:

#include <iostream>

using namespace std;

void average(void);
char input = 0;
int number = 0;
int mode = 0;
int sum = 0;

int main()
{
    cout << "This is a program to calculate the average(mean) of numbers you write. \nPlease enter all the numbers you want to calculate. \nWrite \'q\' after entering numbers to calculate! ^_^" << endl;
    average();
    return 0;
}

void average(void){

    while(input != 'q'){
        cin >> input;
        sum += input;
        number++;

    }

    mode = (sum / number);
    cout << "\aThe mode= " << mode;
}

编辑


我总是得到错误结果的示例:http://i.imgur.com/YxW8Zdp.png

【问题讨论】:

  • 由于您使用的是char 变量,因此您是在对每个输入字符的 ASCII 码进行平均,而不是对它们键入的数字进行平均。
  • 您必须将“输入”从 char 转换为 int:stackoverflow.com/questions/5029840/…
  • 1 秒我会发布我在编辑中得到的内容
  • @vincentp 我需要它 char 来查看用户输入的字母 q int 在这种情况下是否不起作用,并且 sum 必须是 int 因为 sum 可能超过 255,您认为我应该这样做
  • 你需要像“sum += charToInt(input);”这样的东西。

标签: c++ average calculator


【解决方案1】:

您的代码存在许多问题:最明显的是 您在没有先检查的情况下使用输入的结果 输入是否成功,并且您正在使用该字符 编码为整数值。

最惯用的写法是这样的:

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

这并不完美;如果用户输入一个字母,那么这个处理 它作为文件的结尾。一个可能更强大的解决方案是:

std::string line;
while ( std::getline( std::cin, line ) ) {
    std::istringstream parse( line );
    int input;
    if ( parse >> input >> std::ws && parse.get() == EOF ) {
        sum += input;
    } else {
        std::cerr << "not a number: " << line << std::endl;
    }
}

这假设(要求)每行一个数字,这是一个简单的 格式,并且易于验证和重新同步,以防万一 错误。如果行尾没有意义,重新同步 变得更加复杂。

这两种解决方案都输入到文件末尾,即 大多数自然解决方案(而不是寻找q)。如果你 坚持以特定记号结尾,输入为 line 面向,您可以执行以下操作:

std::string line;
while ( std::getline( std::cin, line ) && notEndToken( line) ) {
    //  ...
}

具有与上述相同的循环体。函数notEndToken 可以像return line == "q"; 一样简单,但更有可能的是, 你会想要跳过空格,允许大小写等等,所以 将其放入单独的函数中更有意义。 (的 当然,你仍然需要检查输入是否成功。 仅仅因为你期待一个特殊的令牌并不意味着 你会得到一个。您必须正确处理文件结尾 每个案例。)

【讨论】:

    【解决方案2】:

    您正在将输入中的 char 值添加到总和中。如果我输入“2”,则为 UTF-8 或 ASCII value of the char will be 50。然后,您将在总和中加上 50。基本上你做错了。

    您需要做的是获取 int 值(输入必须是 int)或者如果您想继续检查“q”,您必须在添加之前将文本值(输入为 char 或 string)转换为 int 值总而言之。有几种方法可以做到这一点,具体取决于您的 C++ 版本以及您是否可以访问 Boost。

    也许使用字符串作为输入将解决其他问题,因为您的代码(一旦使用 char 修复)将无法处理大于 9 的数字。


    这是一个适合我的版本(C++11 和轻微改进):

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void average();
    
    int main()
    {
        cout << "This is a program to calculate the average(mean) of numbers you write. \nPlease enter all the numbers you want to calculate. \nWrite \'q\' after entering numbers to calculate! ^_^" << endl;
        average();
        return 0;
    }
    
    void average() {
        std::string input;
        int number = 0;
        int sum = 0;
    
        cin >> input;
        while (input != "q") {
            sum += std::stoi(input);
            number++;
            cin >> input;
        }
    
        const int mode = (sum / number);
        cout << "\aThe mode= " << mode;
    }
    

    请注意,我稍微更改了 while 循环的执行顺序,因为当您输入“q”时,它错误地运行了最后一个循环。此外,如果条目不是数字,此版本将引发异常(我猜这里没问题)。最后,请注意,如果您使用的是 C++03,那么您可以使用 std::atoi(input.c_str()) 而不是 std::stoi(input)。我还改进了一些变量的使用。您绝对不需要将所有内容都放在全局范围内。

    但是这个示例是围绕您的原始代码设计的,这从一开始就有问题,至少在检查错误方面是这样。因此,正如 cmets 所指出的那样,这并不理想,并且在 James Kanz 的回答 (+1) 中也提供了一种更惯用的输入检查方式。理想情况下,您应该更喜欢他的版本,这里只是向您展示您案例中的一个直接示例。

    【讨论】:

    • @ilouy 不要忘记投票并选择我的答案;)我不知道为什么有人投了反对票。
    • 我可以使用 sum += (int)input; ?
    • @ilou 您不能只转换值,它只会保持相同的结果。你最好输入一个 std::string (include ) 然后使用 std::atoi() 函数。这样你的程序也可以处理大于 9 的数字。
    • @ilou 我添加了一个使用字符串的完整示例。另一个注意事项:如果您将需要的变量放在靠近使用它们的位置,您的代码可以快速简化。
    • 这段代码完全是错误的。它使用输入的结果而不检查输入是否成功。如果您要使用std::stoi,那么您需要捕获异常。如果用户输入"a",您真的不希望程序崩溃。
    【解决方案3】:

    研究后:

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <sstream>
    
    using namespace std;
    
    void average(void);
    string input;
    int number = 0;
    int mode = 0;
    int sum = 0;
    int StringToNumber ( const string& );
    
    int main()
    {
        cout << "This is a program to calculate the average(mean) of numbers you write. \nPlease enter all the numbers you want to calculate. \nWrite \'q\' after entering numbers to calculate! ^_^" << endl;
        average();
        return 0;
    }
    
    int StringToNumber ( const string& Text )
    {
        stringstream ss(Text);
        int result;
        return ss >> result ? result : 0;
    }
    
    void average(void){
    
        cin >> input;
        while (input != "q") {
            sum += StringToNumber(input);
            number++;
            cin >> input;
        }
    
        mode = (sum / number);
        cout << "\aThe mode= " << mode;
    }
    

    【讨论】:

      【解决方案4】:

      代码的问题是,您将input 当作char。 这里发生的是,cin 正在读取变量中的字符值。

      例如,当你输入123时,它只读取1并将其视为一个字符,并将其ASCII值,即49存储在input变量中。这意味着,您将 49 添加到 sum 中,而不是 123。这就是你得到错误答案的原因。

      您应该将 char input = 0; 更改为 int input = 0; 并将终止条件更改为其他内容。

      【讨论】:

      • 不是来自我,我还不能投票,但显然所有答案都有反对意见
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 2014-01-07
      • 2014-11-19
      • 2020-02-16
      • 1970-01-01
      相关资源
      最近更新 更多