从文件中读取第 11 列数字并取平均值?(c++)
Read 11th coloumn of numbers from a file and average it?(c++)
这是我的初学者 c++ 作业,
我有一个包含 12 列数字和 50 行的文件。
我被要求求出第 11 列数字的平均值并将其显示在标准输出上。
它是初学者 class 所以不允许像向量这样的高级主题。
我试图为每个列创建 12 个变量并使用 while 循环读取第 11 列,但无法弄清楚如何将第 11 列的所有数字添加到该变量中。
我使用的while循环是这样的:
while(inputfile >> col1 >> col2>> col3>> col4>> col5>> col6>> col7>>
col8>> col9>> col10>> col11>> col12 )
{ cout<< col11 << endl; }
旁注:上面的所有 col 都是 int 变量。 inputfile
是 ifstream
文件对象
上面的循环将打印出整个第 11 列,但我无法弄清楚如何将 50 行(即 50 个数字)中的整个第 11 列相加以求平均值(将总数除以 50)
上面的方法也可能是错误的
如有任何帮助,我们将不胜感激。
希望尽快得到回复。
提前致谢。 :)
使用一个变量来存储总和和计数并得到平均值
int sum = 0;
int count = 0;
double average = 0;
cout << "Calculating Average for: \n";
while(inputfile >> col1 >> col2 >> col3 >> col4 >> col5
>> col6 >> col7 >> col8 >> col9 >> col10
>> col11 >> col12 ) {
cout << col11 << " ";
sum += col11;
++count;
}
cout << " \n";
average = static_cast<double>(sum)/count;
cout << "Sum: " << sum << "\n";
<< "Count: " << count << "\n";
<< "Average: " << average << endl;
由于唯一的答案是错误的,并且评论可能缺少重要线索...
您需要保留第 11 列值的总数 运行。我还会跟踪计数,尽管在您的情况下您可以跳过它并硬编码值 50
。所以你需要的位是:
int total = 0;
int count = 0;
然后在你的阅读循环中:
while (...) {
total += col11; // keep a running total
++count; // add 1 to count
}
然后用一个除以另一个来计算平均值。
但是,这有点棘手。如果直接这样做,您会将一个 int
除以另一个 int
,并将结果截断为 int
。例如。 1/2
会给你 0
,这不是你的意思 (0.5
)。
在 除法完成之前,您需要使用强制转换将至少一个值转换为 double
:
double average = static_cast<double>(total) / count;
查看完整代码 here。
解决除法问题的其他方法是首先将 total
或 count
存储为 double
,尽管我发现这具有误导性,因为它们实际上是整数,或者如果你坚持直接使用 50,你可以只做 average = total / 50.0
(50.0
是一个 double
值)。
既然你是初学者,我也会花点时间劝你反对using namespace std;
and use of endl
,不仅是出于性能原因,也是为了通过分离写换行符的不相关动作使代码更清晰并冲洗流。
这是我的初学者 c++ 作业, 我有一个包含 12 列数字和 50 行的文件。
我被要求求出第 11 列数字的平均值并将其显示在标准输出上。
它是初学者 class 所以不允许像向量这样的高级主题。
我试图为每个列创建 12 个变量并使用 while 循环读取第 11 列,但无法弄清楚如何将第 11 列的所有数字添加到该变量中。
我使用的while循环是这样的:
while(inputfile >> col1 >> col2>> col3>> col4>> col5>> col6>> col7>>
col8>> col9>> col10>> col11>> col12 )
{ cout<< col11 << endl; }
旁注:上面的所有 col 都是 int 变量。 inputfile
是 ifstream
文件对象
上面的循环将打印出整个第 11 列,但我无法弄清楚如何将 50 行(即 50 个数字)中的整个第 11 列相加以求平均值(将总数除以 50)
上面的方法也可能是错误的
如有任何帮助,我们将不胜感激。
希望尽快得到回复。
提前致谢。 :)
使用一个变量来存储总和和计数并得到平均值
int sum = 0;
int count = 0;
double average = 0;
cout << "Calculating Average for: \n";
while(inputfile >> col1 >> col2 >> col3 >> col4 >> col5
>> col6 >> col7 >> col8 >> col9 >> col10
>> col11 >> col12 ) {
cout << col11 << " ";
sum += col11;
++count;
}
cout << " \n";
average = static_cast<double>(sum)/count;
cout << "Sum: " << sum << "\n";
<< "Count: " << count << "\n";
<< "Average: " << average << endl;
由于唯一的答案是错误的,并且评论可能缺少重要线索...
您需要保留第 11 列值的总数 运行。我还会跟踪计数,尽管在您的情况下您可以跳过它并硬编码值 50
。所以你需要的位是:
int total = 0;
int count = 0;
然后在你的阅读循环中:
while (...) {
total += col11; // keep a running total
++count; // add 1 to count
}
然后用一个除以另一个来计算平均值。
但是,这有点棘手。如果直接这样做,您会将一个 int
除以另一个 int
,并将结果截断为 int
。例如。 1/2
会给你 0
,这不是你的意思 (0.5
)。
在 除法完成之前,您需要使用强制转换将至少一个值转换为 double
:
double average = static_cast<double>(total) / count;
查看完整代码 here。
解决除法问题的其他方法是首先将 total
或 count
存储为 double
,尽管我发现这具有误导性,因为它们实际上是整数,或者如果你坚持直接使用 50,你可以只做 average = total / 50.0
(50.0
是一个 double
值)。
既然你是初学者,我也会花点时间劝你反对using namespace std;
and use of endl
,不仅是出于性能原因,也是为了通过分离写换行符的不相关动作使代码更清晰并冲洗流。