我正在尝试使用C ++进行2D数组的实验,并且正在开发一个项目,该项目制作了一个4x4 2D数组,该数组可以容纳许多学生成绩,但部分通过文本文件填充。 4列中仅填充3个。我想用每列前几行的平均成绩来填充最后一列。
问题在于我无法确切地知道如何填充最后一列。
这是我计算平均值的代码。
const int SIZE = 4;
const int ROWS = 4;
const int COLS = 4;
int total = 0;
for (int i = 0; i < ROWS; i++)
{
total = 0;
for (int j = 0; j < COLS - 1; j++)
{
total += studentGrades[i][j];
average = total / (COLS - 1);
studentGrades[0][3] = average;
studentGrades[1][3] = average;
studentGrades[2][3] = average;
studentGrades[3][3] = average;
}
}
似乎我接近了,因为我得到了很好的结果,但是最后一列显示的值不正确,而且我觉得有一种更有效的方法来填充最后一列,而不是手动插入每个索引。
答案 0 :(得分:1)
您每次都将最后一次计算的平均值分配给所有行。这意味着最后您将获得所有4列中第4行的平均值。还可以考虑将变量(studentGrades
和total
)更改为浮点类型,以提高准确性。
const int SIZE = 4;
const int ROWS = 4;
const int COLS = 4;
for (int i = 0; i < ROWS; i++)
{
int total = 0;
for (int j = 0; j < COLS - 1; j++)
total += studentGrades[i][j];
studentGrades[i][COLS - 1] = total / (COLS - 1);
}
您还可以使用标准库:
#include <numeric>
// ...
constexpr int Rows = 4, Cols = 4, NGrades = Cols - 1;
for (int i = 0; i < Rows; i++)
studentGrades[i][NGrades] = std::accumulate(studentGrades[i], studentGrades[i] + NGrades, 0) / NGrades;
与我的第一个解决方案一样,请考虑使用浮点类型。要启用浮点运算,请将0
的{{1}}更改为std::accumulate
或0.0
。
Here是对0.0f
的解释。
答案 1 :(得分:1)
逻辑错误。您只能计算平均值,并在合计其他列后的 之后填充最后一列,并且一次只能填充一行,而不是尝试一起完成所有四行。这是正确的循环
for (int i = 0; i < ROWS; i++)
{
total = 0;
for (int j = 0; j < COLS - 1; j++)
{
total += studentGrades[i][j];
}
average = total / (COLS - 1);
studentGrades[i][3] = average;
}
这只是在正确的时间和正确的时间做事的问题。
另外,您应该注意Yksisarvinen指出的整数除法问题。