2014-02-11 3 views
0
//global variable 
counter=0; 
var highestAvg=0; 
var average = new Array(); 
var studObj = new Array(); 
var teachObj = new Array(); 
//Objects 
var student = { 
    studName:"", 
    studentId:"", 
    courses:['a', 'b', 'c', 'd'], 
    marks:[]} 

var teacher = { 
    profName:"", 
    course:"", 
    office:"", 
    email:""} 

for(var i=0; i<30; i++) 
{ 
    studObj[i] = Object.create(student); 
    var check = prompt('Please enter students name(!!! to exit): ',''); 
    if(check !== '!!!') 
    { 
     studObj[i].studName = check; 
     studObj[i].studentId = prompt('Please enter student ID: ',''); 
     var total=0; 
     for(var j=0; j<4; j++) 
     { 
      studObj[i].marks[j] = prompt('Please enter student marks for ' + studObj[i].courses[j] + ' : ',''); 
      if(studObj[i].marks[j] > 100 || studObj[i].marks[j] < 0) 
      { 
       alert("Incorrect mark, please enter a correct mark!") 
       j--; 
      } 
      else 
      { 
      total += Number(studObj[i].marks[j]); 
      } 
     } 
     average[i] = total/4; 
     counter++; 
    } 
    else 
    { 
     break; 
    } 
    alert(average[i]); 
} 

var highestAvg = Number(average[0]); 
for(var x=1; x<counter; x++) 
{ 
    if((Number(average[x])) > highestAvg) 
    { 
     highestAvg = average[x]; 
     var z=x 
    } 
} 
alert(highestAvg); 

alert('The student with the highest overall average is: \nStudent Name: ' + studObj[z].studName + '\nStudent ID: ' + studObj[z].studentId + '\nCourses: ' + studObj[z].courses + '\nMarks: ' + studObj[z].marks + '\nAverage Mark: ' + average[z]); 

Я не знаю, почему массив меток не сохраняет массив studObj, вместо этого он перезаписывается. Я попытался добавить еще один массив, чтобы удерживать значения, но снова он показывает только последние 4 метки. Спасибо за помощь заранее.Массив показывает только последний набор входов

+0

TIL есть то, что называется [ 'prompt'] (https://developer.mozilla.org/en-US/docs/Web/API/Window.prompt) в Javascript. Но я рекомендую вам не злоупотреблять им так, как вы в настоящее время используете. – bits

+0

Это прекрасно работает для меня, хром 32.0.1700.107 м. Просто запустил его с консоли, и все значения назначены на правильные точки. В каком браузере и версии это должно быть реализовано? (Это раздражает, но вы должны просто изучить форму ...) Кроме того, вместо счетчика я могу предложить использовать 'array.length'? –

+0

Пробовали ли вы использовать 'Math.max.apply (Math, average)', а затем перебирали ваш 'средний' массив, чтобы получить номер студента? Тогда нет необходимости в 'var counter'. – PHPglue

ответ

0

Глобальные переменные !!!

Это ничего не меняет, если вы объявляете var или нет в глобальном масштабе. Работает JavaScript в области функций, помещая каждый var, который он встречает сверху, включая ваш var i, j, который в вашем примере стал глобальной переменной. Если это произойдет, вы включаете в себя больше javascript на своей странице и используете одни и те же имена переменных, которые могут быть вызваны проблемами из-за переопределения глобальных переменных сферы. Чтобы противостоять этому, используйте вместо этого IIFE.

Сбросьте объекты внутри цикла следующим образом:

total = 0; 
studentCopy = Object.create(student); 
studentCopy.marks = []; // resets the browsers' memory for marks[] 

Добавление объектов в массивы будут работать, но засовывать предметы в массивы кажется лучше. Также он более читабельен и реже вводит ошибки.

studObj[i].marks[j] = prompt(''); 
studObj[i].studentId = prompt(''); 

Может быть что-то вроде:

studentCopy.marks.push(mark); 
students.push(studentCopy); 

Если вы сохраните индекс i в среднем, сортировка может быть улучшена, как:

students.push(studentCopy); 
average.push([[total/studentCopy.courses.length], [i]]); 

highestAvg = average.sort(function(a, b) { 
    return a[0] < b[0]; // use < so the maximum is at index 0 
}); 

Ваш лучший студент будет индекс прикрепленный к наивысшему элементу, который вы можете использовать в качестве индекса для учащихся. И тогда у вас есть вся необходимая информация.

bestStudent = students[highestAvg[0][1]]; 

DEMO:http://jsfiddle.net/tive/s3dQW/

+0

Благодарим за помощь! – user2827348

Смежные вопросы