为啥我的 weighted_grade 变量不起作用?

Posted

技术标签:

【中文标题】为啥我的 weighted_grade 变量不起作用?【英文标题】:Why is my weighted_grade variable not working?为什么我的 weighted_grade 变量不起作用? 【发布时间】:2015-05-08 00:38:34 【问题描述】:

我需要编写一个 C++ 程序,用于在学期末确定成绩。对于每个由 1 到 60 之间的整数标识的学生,必须保留四个考试成绩。此外,必须计算两个最终平均成绩。一年级的平均分就是所有四个年级的平均分。二年级的平均值是通过四个等级的加权计算得出的:一年级的权重为0.2,二年级的权重为0.3,三年级的权重为0.3,四年级的权重为0.2;计算为:

0.2 * 等级1 + 0.3 * 等级2+ 0.3* 等级3 + 0.2 * 等级4

使用此信息,您将构建一个 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;

【问题讨论】:

您已用另一个请求更新了问题。这令人困惑,因为现在已经有一些旧答案的答案。我认为您应该提出一个新问题,以便我们可以从一个干净的角度开始。当然你可以在这里放一个新的链接,新的也可以放这个链接。 【参考方案1】:

您必须在表格的每一行,即在for 循环开始处,在r 上为每个学生重置sum_for_avg 的值。事实上,它从第一个学生的 0 正确开始,但对于每个后续学生,它从你已经拥有的值开始。

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

sum2 = 0;

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

【讨论】:

【参考方案2】:

实际上 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 &lt;&lt; sqrt(sum2 / 4.0); 打印出另一个 0,然后你得到

Stdnt   Grd1    Grd2    Grd3    Grd4    Avg1    Avg2
1       100     100     100     100     100     1000

清理那段代码,你会发现@Fabio Turati 发现的错误。

【讨论】:

我解决了这个问题。我还有一个问题。看我的更新。这可能看起来很菜,但我的培训是双分子工程和生物化学,哈哈。我需要将我的平均值保存到一个数组中,以便我可以对它们做一些事情。我怎么能这样做?

以上是关于为啥我的 weighted_grade 变量不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥外部链接在构建后在 phonegap 应用程序上不起作用

多维动态数组,为啥不起作用?

我的Android进阶之旅------&gt;Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法

为啥闪烁自动完成会离开单词的开头

为啥 pull-right 类在 bootstrap 版本 4.1.0 上不起作用? [复制]

为啥 ngfor 指令不起作用,尽管我在 Typescript 类中创建了正确的对象