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