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]); 

왜 마크 배열이 스터브브 배열에 저장되지 않는지 알지 못하고 대신 덮어 쓰기됩니다. 값을 저장하기 위해 다른 배열을 추가하려고 시도했지만 다시 입력 한 마지막 4 개의 마크로 보여줍니다. 사전에 도움을 주셔서 감사합니다.배열의 마지막 입력 만 표시

+0

['prompt'] (https://developer.mozilla.org/en-US/docs/Web/API/Window.prompt) Javascript에서. 그러나 나는 당신이 현재 과용하는 방식으로 그것을 과용하지 말 것을 권한다. – bits

+0

괜찮습니다. 크롬 32.0.1700.107 m. 그냥 콘솔에서 실행하고 모든 값은 올바른 지점에 할당됩니다. 어떤 브라우저와 버전을 구현할 것인가? (좀 짜증나지만 폼을 살펴보아야한다.) 또한, 카운터 대신에'array.length'를 사용할 것을 제안 할 수 있을까? –

+0

'Math.max.apply (Math, average) '를 사용해 보았습니다. 그런 다음'average' 배열을 루핑하여 학생 번호를 얻으셨습니까? 그러면 'var 카운터'가 필요 없습니다. – PHPglue

답변

0

글로벌 변수 !!!

var를 선언하거나 전역 범위에서 선언하지 않으면 아무 것도 변경되지 않습니다. JavaScript는 함수 범위에서 작동합니다. 예를 들어 전역 변수가 된 var i, j를 포함하여 모든 변수를 맨 위에 놓습니다. 문제가 발생하면 페이지에 자바 스크립트가 더 많이 포함되며 동일한 변수 이름을 사용하므로 전역 범위 변수를 재정 의하여 문제가 발생할 수 있습니다. 이 문제를 해결하려면 대신 IIFE을 사용하십시오.

은과 같이 루프 내부에 객체를 재설정

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

작동합니다 배열로 객체를 추가하지만, 배열로 객체를 밀어 더 나은 것 같다. 또한 더 읽기 쉽고 버그를 도입 할 확률이 적습니다.

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 
}); 

당신의 최선의 학생이 인덱스 될 것입니다 : 당신이 평균 인덱스 i을 저장하면

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

, 정렬 같이 개선 될 수있다 :

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

뭔가처럼 될 수 학생의 색인으로 사용할 수있는 highestAvg에 첨부됩니다. 그리고 나서 모든 정보가 필요합니다.

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

DEMO : 무언가가 호출을 고르세요http://jsfiddle.net/tive/s3dQW/

+0

도움 주셔서 감사합니다 !! – user2827348

관련 문제