2015-06-23 2 views
2

Я хочу получить помощь по моему javascript-коду. Я сделал калькулятор статистики класса, который показывает результаты на: Min - Max студента класс Мин - Макс студент средней Min - Max класса конечно Мин - Макс конечно средний баллGrade Statistics Calculator

Вы можете получить доступ к нему жить здесь ->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 для конечно средних классов. Я бы определил другую функцию Avg (назовем ее newAvg() здесь), которая принимает в качестве входного сигнала один массив (не несколько аргументов), а затем вызывает Math.Min/Math.Max по адресу newAvg(c0), newAvg(c1), newAvg(c2).

Вот 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; для (var idx = 0; idx vsahu

+0

@diomidisanadiotis мой первоначальный ответ был отредактирован, чтобы включить изменения, необходимые для средних рабочих сред, включая определенную функцию newAvg(). – vsahu