2015-06-23 70 views
2

我想在我的JavaScript代碼上獲得一些幫助。我做了一個檔次統計計算器,顯示了結果: 最小 - 最大的學生成績 最小 - 最大的學生平均 最小 - 最大的課程成績 最小 - 最大課程平均成績年級統計計算器

您可以訪問它住在這裏 - >http://jsbin.com/qirefe/edit?html,css,js,output並按下「顯示結果」按鈕查看我的輸出。 (您可以更改名稱和等級以獲得不同的輸出)

我的問題是,我無法弄清楚它爲什麼不在Min - Max課程成績中顯示正確的課程名稱,雖然它顯示成績對。我也想不通爲什麼它錯誤地計算出最小和最大課程平均成績,並顯示相應的課程名字寫錯了..

任何幫助將是非常讚賞:)

的.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); 

}; 
+0

請將重要的代碼添加到您的問題中,而不是將我們鏈接到非常大的jsbin。 –

+2

JSBin正在幫助您向您發出有關Javascript可能出現的問題的警告。也許你應該首先嚐試自己解決這些問題? – nkorth

+0

@Alagaros完成! – diomidisanadiotis

回答

1

檢查控制檯中的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函數(我們稱之爲newAvg()),它將輸入一個數組(不是多個參數)作爲輸入,然後在newAvg(c0),newAvg(c1),newAvg(c2)上調用Math.Min/Math.Max

這裏是一個updated jsbin link與課程平均工作功能。更改概述:newAvg()已被定義爲接受和操作一個參數。跟蹤CourseAvgMax和CourseAvgMin的索引。請注意,我已經刪除了此前在此jsbin鏈接中的其他一些操作,以使我更容易確定我正在處理的內容。希望你覺得它有用!

+0

非常感謝你的擴展答案!所以要修復CourseMinID和CourseMaxID,我必須'var CourseMinID = Math.floor(j)-1; var CourseMaxID = Math.ceil(j);'。至於CourseAvg,我理解了我的錯誤邏輯,但我不能理解包含在newAvg()中的內容。它是否會取代'var Avg = Math.avg(c0 [i],c1 [i],c2 [i]);'?如何定義它? 'newAvg = Math.Min(???)' – diomidisanadiotis

+0

'function newAvg(arr)var sum = 0; for(var idx = 0; idx vsahu

+0

@diomidisanadiotis我的原始答案已被編輯,包括工作過程中平均操作所需的更改,包括正確定義的newAvg()函數 – vsahu