c ++平均程序给出错误答案

c++ average program giving wrong answers

我刚刚制作了一个 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

您正在将输入中的字符值添加到总和中。如果我键入“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)。我还改进了一点变量的使用。您绝对不需要将所有内容都放在全局。

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

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

比如输入123,它只读出1,并把它当作一个字符,存储它的ASCII值,即49在[=10] =] 变量。这意味着,您将 49 添加到总和中,而不是 123。这就是您得到错误答案的原因。

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

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

最惯用的写法是这样的:

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)。如果你 坚持以特定token结尾,输入为line 导向,你可以这样做:

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

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

研究后:

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