我需要写一个C++程序,可以用来确定学期末的成绩。对于每个由1到60之间的整数标识的学生,必须保留四个考试成绩。此外,还必须计算两个最终成绩平均值。第一个年级的平均值是所有四个年级的平均值。通过对四个等级进行加权,计算第二个等级的平均值:第一个等级的权重为0.2,第二个等级的权重为0.3,第三个等级的权重为0.3,第四个等级的权重为0.2;计算公式如下:
0.2 * grade1 + 0.3* grade2+ 0.3 * grade3 + 0.2 * grade4
使用此信息,您将构建一个60 x 7的二维数组,其中第一列用于学生编号,接下来的四列用于成绩,最后两列用于计算的最终成绩。程序的输出应该是完整数组中数据的显示。
这是我的结果,但我的第二个平均值是偏的。例如,我的第一个学生的两个平均分都应该是100。然而,Avg2将等于1000,我不知道为什么。帮助?
#include <iostream>
#include <math.h>
using namespace std;
int grade_Calc(int sg[][5]);
int main()
{
int student_grades[5][5] =
{
{1, 100, 100, 100, 100}, //inputs an array of students 1-5's grades
{2, 100, 0, 100, 0},
{3, 82, 94, 73, 86},
{4, 64, 74, 84, 94},
{5, 94, 84, 74, 64},
};
grade_Calc(student_grades);
return 0;
}
int grade_Calc(int sg[][5])
{
int sum_for_avg = 0;
double weighted_grade = 0.0;
double simple_avg = 0.0;
double sum2 = 0.0;
cout << "Stdnt" << "\t" << "Grd1" << "\t" << "Grd2" << "\t" << "Grd3" << "\t" << "Grd4" << "\t" << "Avg1" << "\t" << "Avg2" << endl;
for (int r = 0; r < 5; r++)
{
for (int c = 0; c < 5; c++)
{
cout << sg[r][c] << "\t\t";
if (c != 0)
{
sum_for_avg += sg[r][c];
if ((c == 1) || (c == 4))
{
weighted_grade += (0.3 * sg[r][c]);
}
else
{
weighted_grade += (0.2 * sg[r][c]);
}
}
}
simple_avg = (sum_for_avg / 4.0);
cout << "\t" << simple_avg << "\t" << weighted_grade;
for (int k = 0; k < 5; k++)
{
if (k != 0)
{
sum2 += pow((sg[r][k] - simple_avg), 2);
}
}
cout << sqrt(sum2 / 4.0);
sum_for_avg = 0;
weighted_grade = 0.0;
cout << endl;
}
return 0;
}发布于 2015-05-08 08:55:22
您必须在表的每一行为每个学生重置sum_for_avg的值,即在r上的for循环开始时。实际上,对于第一个学生,它正确地从0开始,但是对于后面的每个学生,它从你已经拥有的值开始。
编辑:事实证明我太草率了。sum_for_avg毕竟是重置的-只是不是在我要做的地方,也就是说,它是在循环结束时重置的。所以平均水平是正确的。发生的情况是,您还打印了另一个值,即标准差,由于没有空格,因此它看起来像是1000,而它是100和0的串联。再一次,标准差也是错误的,原因是我在一开始给出的原因:你没有重置它。所以添加下面这一行:
sum2 = 0;就在计算标准差的循环之前。并在加权平均值和标准差之间至少打印一个空格。
发布于 2015-05-08 09:02:34
实际上,Avg2将推出100款。但是,由于问题中没有列出的原因,您可以运行这段代码:
for (int k = 0; k < 5; k++)
{
if (k != 0)
{
sum2 += pow((sg[r][k] - simple_avg), 2);
}
}
cout << sqrt(sum2 / 4.0);最后的cout是在avg2的100后面写一个0,所以看起来像是在打印1000。
所以,你可以打印出来:
Stdnt Grd1 Grd2 Grd3 Grd4 Avg1 Avg2
1 100 100 100 100 100 100然后用cout << sqrt(sum2 / 4.0);打印出另一个0,你会得到
Stdnt Grd1 Grd2 Grd3 Grd4 Avg1 Avg2
1 100 100 100 100 100 1000清理这段代码,你就会发现@Fabio Turati发现的bug。
https://stackoverflow.com/questions/30113948
复制相似问题