成绩统计计算器

Grade Statistics Calculator

我想在 javascript 代码方面获得一些帮助。我制作了一个成绩统计计算器,显示以下结果: 最小 - 最大学生成绩 最小 - 最大学生平均 最小 - 最大课程成绩 最低 – 最高课程平均成绩

您可以在此处实时访问它 --> http://jsbin.com/qirefe/edit?html,css,js,output 并按 "Show Results" 按钮查看我的输出。 (您可以更改名称和等级以获得不同的输出)

我的问题是我无法弄清楚为什么它没有在最小 - 最大课程成绩上显示正确的课程名称,尽管它显示了正确的成绩。我也搞不懂为什么它计算错误的最低和最高课程平均成绩并显示错误的相应课程名称..

任何帮助将不胜感激:)

.js代码:

var Course0 = Array(6);
var Course1 = Array(6);
var Course2 = Array(6);
var Student = Array(6);

var CMap = [Course0, Course1, Course2];
var NMap = ["Course0", "Course1", "Course2"];

var showResults = function () {

    var Rows = document.getElementsByClassName("srow");

    for (var i = 1; i < Rows.length - 1; i++) {

        var values = Rows[i].getElementsByTagName("input");
        Student[i - 1] = values[0].value;

        for (var j = 1; j < values.length; j++) {
            CMap[j - 1][i - 1] = values[j].value;
        }
    }

    var MinID = MaxID = AvgMinID = AvgMaxID = 0;
    var Min = Max = AvgMin = AvgMax = undefined;

    for (var i = 0; i < Student.length; i++) {

        var c0 = Course0[i];
        var c1 = Course1[i];
        var c2 = Course2[i];

        var lessonMin = Math.min(c0, c1, c2);
        var lessonMax = Math.max(c0, c1, c2);

        if ((lessonMin <= Min) || (typeof Min === "undefined")) {
            MinID = i;
            Min = lessonMin;
        }

        if ((lessonMax >= Max) || (typeof Max === "undefined")) {
            MaxID = i;
            Max = lessonMax;
        }


        var Avg = Math.avg(c0, c1, c2);

        if ((Avg < AvgMin) || (typeof AvgMin === "undefined")) {
            AvgMinID = i;
            AvgMin = Avg;
        }

        if ((Avg > AvgMax) || (typeof AvgMax === "undefined")) {
            AvgMaxID = i;
            AvgMax = Avg;
        }

    }

    var Wrapper = document.getElementById("student-results");
    Wrapper.innerHTML = "";


    Wrapper.innerHTML += "<span>The Student with lower grade is: " + Student[MinID] + ", Equals To " + Min + "</span>";
    Wrapper.innerHTML += "<span>The Student with higher grade is: " + Student[MaxID] + ", Equals To " + Max + "</span>";

    Wrapper.innerHTML += "<hr />";


    Wrapper.innerHTML += "<span>The Student with lower average grade is: " + Student[AvgMinID] + ", Equals To " + AvgMin + "</span>";
    Wrapper.innerHTML += "<span>The Student with higher average grade is: " + Student[AvgMaxID] + ", Equals To " + AvgMax + "</span>";

    var CourseMin = CourseMinID = CourseMax = CourseMaxID = CourseAvgMin = CourseAvgMinID = CourseAvgMax = CourseAvgMaxID = 0;

    CourseMin = CourseMax = CourseAvgMin = CourseAvgMax = undefined;

    for (var i = 0, j = 0; i < Student.length; i++, j += .5) {

        var c0 = Course0;
        var c1 = Course1;
        var c2 = Course2;

        var CheckMin = Math.min(c0[i], c1[i], c2[i]);

        if (CourseMin > CheckMin || (typeof CourseMin === "undefined")) {
            CourseMin = CheckMin;
            CourseMinID = i;
        }

        var CheckMax = Math.max(c0[i], c1[i], c2[i]);

        if (CourseMax < CheckMax || (typeof CourseMax === "undefined")) {
            CourseMax = CheckMax;
            CourseMaxID = parseInt(j);
        }

        var Avg = Math.avg(c0[i], c1[i], c2[i]);

        if (Avg < CourseAvgMin || (typeof CourseAvgMin === "undefined")) {
            CourseAvgMin = Avg;
            CourseAvgMinID = j;
        }

        if (Avg > CourseAvgMax || (typeof CourseAvgMax === "undefined")) {
            CourseAvgMax = Avg;
            CourseAvgMaxID = parseInt(j);
        }

    }

    console.log(CourseMaxID);

    Wrapper.innerHTML += "<hr />";

    Wrapper.innerHTML += "<span>The Course with lower grade have: " + NMap[CourseMinID] + ", Equals To " + CourseMin + "</span>";
    Wrapper.innerHTML += "<span>The Course with higher grade have: " + NMap[CourseMaxID] + ", Equals To " + CourseMax + "</span>";

    Wrapper.innerHTML += "<hr />";


    Wrapper.innerHTML += "<span>The Course with lower average grade have: " + NMap[CourseAvgMinID] + ", Equals To " + CourseAvgMin + "</span>";
    Wrapper.innerHTML += "<span>The Course with higher average grade have: " + NMap[CourseAvgMaxID] + ", Equals To " + CourseAvgMax + "</span>";


    return null;

};

Math.avg = function () {

    var Avg = 0;
    var table = arguments;
    for (var i = 0; i < table.length; i++) {
        Avg += parseFloat(table[i]);
    }
    return parseFloat(Avg / table.length);

};

在控制台检查CourseMaxID 和CourseMinID 的输出后,CourseMinID 的索引为3,但NMap 只有3 个值(索引为0、1、2)。所以我相信这就是为什么,例如,你会看到: "The Course with lower grade have: " + NMap[CourseMinID] + ", Equals To " + CourseMin; 未定义 -- 因为索引超出范围。

以下是针对 CourseMinID 和 CourseMaxID 问题的解决方法: 将 CourseMinID 的定义更改为 Math.floor(j)-1; 并将 CourseMaxID 更改为等于 Math.ceil(j);

您对浮点值的 parseInt() 调用似乎没有产生预期的结果。

我不完全确定您为什么选择每次将 j 递增 0.5,但根据观察,我注意到对于 CourseMax/CourseMinID,您想使用我上面提到的计算。

另请注意,对于课程平均值,您实际上输出的是学生的平均值。所以你会想在那里改变你的逻辑。在我看来,您将水平行的成绩作为平均函数的参数:

var Avg = Math.avg(c0[i], c1[i], c2[i]);

这不是您要解析为 课程平均 成绩的 Avg 的内容。我会定义另一个 Avg 函数(我们在这里称它为 newAvg()),它将单个数组(不是多个参数)作为输入,然后在 newAvg(c0) 上调用 Math.Min/Math.Max , newAvg(c1), newAvg(c2).

这是一个 updated jsbin link 具有课程平均值的工作功能。更改概述:newAvg() 已定义为接受一个参数并对其进行操作。跟踪 CourseAvgMax 和 CourseAvgMin 的索引。请注意,我已经删除了您之前在此 jsbin link 中进行的一些其他操作,以使我更容易隔离我正在处理的内容。希望你觉得它有用!