为什么我的weighted_grade变量不起作用?

时间:2015-05-08 00:38:35

标签: c++ arrays

我需要编写一个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;
}

2 个答案:

答案 0 :(得分:3)

您必须在表格的每一行(即mercedes.describe(); 循环sum_for_avg的开头)为每位学生重置for的值。实际上,它为第一个学生正确地在0开始,但是对于每个后续学生,它从你已经拥有的价值开始。

编辑:事实证明我太仓促了。毕竟r 重置 - 只是不在我要做的地方,也就是说,它会在循环结束时重置。所以平均是对的。发生的事情是你还打印另一个值,这是标准偏差,并且由于没有空格,它看起来像是1000,而它是100和0的串联。然后,标准偏差也是错的,因为我在开头给出的原因是:你没有重置它。所以添加这一行:

sum_for_avg

在您的循环之前计算标准偏差。并且在加权平均值和标准偏差之间至少打印一个空格。

答案 1 :(得分:1)

实际上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发现的错误。

相关问题