2013-02-19 1 views
2

Я работаю в чартерной школе, и я просто изучаю свой путь вокруг javascript. У меня есть код, написанный человеком, который раньше заполнял мою позицию, и мне кажется, что он должен работать, но это не так.среднее значение из пяти значений в javascript

Это то, что я имею в пользовательских HTML страницы в моем SIS:

GED Status: <script language="Javascript">gedCheck('~(ELC_tspp_GED_read_score)','~ (ELC_tspp_GED_wri_score)','~(ELC_tspp_math_GED_score)','~(ELC_science_state_exam_score)','~(soc_sci_state_exam_score)')</script> 

Это, кажется, извлечения значений из различных полей БД правильно, как яваскрипта рутина оценивает каждое значение для обеспечения его по крайней мере, 410. Но это так далеко, как она идет ...

Вот Javascript рутинный код:

function gedCheck(read,wri,math,sci,soc) { 

if(read < 0 && read > 1000) 
    read = 0; 
if(wri < 0 && wri > 1000) 
    wri = 0; 
if(math < 0 && math > 1000) 
    math = 0; 
if(sci < 0 && read > 1000) 
    read = 0; 
if(soc < 0 && soc > 1000) 
    soc = 0;   

if ((read >= 410) && (wri >= 410) && (math >= 410) && (sci >= 410) && (soc >= 410)) { 
    if(read+wri+math+sci+soc >= 2250) 
     document.write("PASSED") 
} 
else 
    document.write("NOT PASSED") 
} 

предполагается проверять, что каждый счет в го e GED-тесты составляют не менее 410 и что сумма всех баллов должна быть не менее 2250. Однако она не доходит до последней части. Он возвращается «PASSED», если все баллы превышают 410.

Я пробовал это, но он также не работает.

function gedCheck(read,wri,math,sci,soc) { 

if(read < 0 && read > 1000) 
    read = 0; 
if(wri < 0 && wri > 1000) 
    wri = 0; 
if(math < 0 && math > 1000) 
    math = 0; 
if(sci < 0 && read > 1000) 
    read = 0; 
if(soc < 0 && soc > 1000) 
    soc = 0;   

if ((read >= 410) && (wri >= 410) && (math >= 410) && (sci >= 410) && (soc >= 410)) { 
    if(read+wri+math+sci+soc/5 >= 450) 
     document.write("PASSED") 
} 
else 
    document.write("NOT PASSED") 
} 

ли кто-нибудь, пожалуйста, помогите мне решить эту проблему таким образом это либо средние значения все 5 чисел и возвращает «Пройдено» только тогда, когда среднее значение равно 450, или просто добавляет все 5 чисел и возвращает «Пройдено» только если общая сумма 2250 или больше?

+1

if (read < 0 && read > 1000): Как вы сказали, вы просто учитесь, подсказка заключается в том, что этого никогда не будет.То, что вы спрашиваете здесь, похоже на то, что «читается меньше 0, но также более 1000, в то же самое время?» || следует использовать вместо &&. && означает «Если это И это», || означает «Если это, или это». || в вашем случае меняет его: «Если чтение меньше нуля или оно больше 1000, сделайте это», что возможно, так как число в Math меньше нуля, но более 1000. Примечание: | это shift + \ key, и называется «Pipe». – Gyhth

+0

Я думаю, именно поэтому он и сделал - может быть, он просто хотел убедиться, что каждое значение получило значение 0, чтобы начать? Или человек никогда этого не делает? – DataBased

+0

В этом он никогда не установит его на ноль, поскольку это следующий код, и поскольку он никогда не будет меньше 0 и больше 1000, он никогда не установит его на 0. Имеет смысл, если он хотел сделать его равным нулю, если выполнено одно из этих условий (0 Минимум, 1000 баллов - макс, который я предполагаю), но именно поэтому вы должны использовать оператор OR (||), а не AND (&&). Код после if, например read = 0, выполняется только в том случае, если блок if возвращает true. Чтение < 0 && Read > 1000 никогда не вернет true, поэтому он никогда не установит чтение равным 0. То же самое с другими. – Gyhth

ответ

0

Чтобы получить среднее, вы хотите сделать это:

(((read + wri + math + sci + soc)/5) > 450) 

Скобки вокруг того гарантирует, что вы разделите сумму всех баллов на 5. Так, как вы это делаете сейчас, вы делите только soc на 5.

Редактировать (Переписывать весь метод):

function gedCheck(read, wri, math, sci, soc) { 
// As was said before, these should all be ORs 
// If the score is less than 0, OR greater than 1000 
if(read < 0 || read > 1000) { 
    read = 0; 
} 
if(wri < 0 || wri > 1000) { // I prefer to put the braces around all if/else statements just for absolute clarity 
    wri = 0; 
} 
if(math < 0 || math > 1000) { 
    math = 0; 
} 
if(sci < 0 || read > 1000) { 
    read = 0; 
} 
if(soc < 0 || soc > 1000) { 
    soc = 0;   
} 

if (read >= 410 && // Doing this will only pass the student 
    wri >= 410 && // if ALL of the conditions are met. 
    math >= 410 && 
    sci >= 410 && 
    soc >= 410 && 
    ( (read + wri + math + sci + soc) >= 2250 || // Separated more for clarity 
      ((read + wri + math + sci + soc)/5) > 450)) { 
    // Either all scores total over 2250 
    // Or the average of all 5 are over 450 to pass     
     document.write("PASSED") 
} 
else 
    document.write("NOT PASSED") 
} 
+0

О! Спасибо! Все еще не получается ничего работать, но я точно вижу, что вы говорите ... – DataBased

+0

Я переработал всю вашу функцию для вас. Надеюсь, это поможет вам еще. Я добавил примечания, объясняющие, почему я сделал определенные вещи, и как это должно помочь дать вам то, что вы ищете. Если у вас есть другие вопросы, или он все еще не работает правильно, сообщите мне. – krillgar

+0

У вас все будет прекрасно. Я могу только подумать, что, возможно, база данных не возвращает значения этих полей как целое. Это возможно? – DataBased

0

насчет

if ((read >= 410) && 
    (wri >= 410) && 
    (math >= 410) && 
    (sci >= 410) && 
    (soc >= 410) && 
    (read+wri+math+sci+soc >= 2250)) {  

    document.write("PASSED") 
} else { 

    document.write("NOT PASSED") 
} 
+0

Это не сработало для меня - оно погасило любой результат. Сожалею! – DataBased

+0

Я действительно использовал этот код после изучения настройки parseInt, и он отлично работал - спасибо! – DataBased

0
function gedCheck(read, wri, math, sci, soc) { 

    if(read < 0 || read > 1000) 
     read = 0; 

    if(wri < 0 || wri > 1000) 
     wri = 0; 

    if(math < 0 && math > 1000) 
     math = 0; 

    if(sci < 0 && read > 1000) 
     read = 0; 

    if(soc < 0 && soc > 1000) 
     soc = 0; 

    var total = read + wri + math + sci + soc; 

    if (read >= 410 && wri >= 410 && math >= 410 && sci >= 410 && soc >= 410 && total >= 2250) { 
     document.write("PASSED"); 
    } else { 
     document.write("NOT PASSED"); 
    } 
} 

Все это первый раздел был невозможно код. Он проверял, было ли число БОЛЬШЕ меньше нуля и больше 1000. Очевидно, это невозможно, поэтому я изменил его на использование OR.

Я также создал полную переменную, которую вы можете проверить так же, как и все остальное.

+0

Привет, Джордон, это то, что я пытался выяснить - как установить сумму всех пяти баллов в качестве переменной. Спасибо, что показал мне это. У меня пока нет положительного результата, но может быть только, что мне нужно очистить кеш пользовательской страницы в программном обеспечении SIS ... стоять ... – DataBased

+1

Я очень хочу проголосовать за ответы, которые помогли мне научиться , но у меня пока нет достаточных очков репутации. Пожалуйста, знайте, насколько я ценю ваш ответ - я действительно это имею в виду! Ваши и несколько других помогли мне понять некоторые понятия программирования, которые я не понимал, и я искренне благодарен. – DataBased

+0

У меня есть ваш вопрос. Вам просто нужно еще немного репутации, чтобы проголосовать. Удачи! – Jordan

0

Использование массива здесь поможет вам уменьшить количество дублированного кода

function gedCheck(read, wri, math, sci, soc) { 
    var subjects, totalScore, averageScore; 

    subjects = [read, wri, math, sci, soc]; 
    totalScore = 0; 
    averageScore = 0; 

    for (var i = 0; i < subjects.length; i++) { 
     if (subjects[i] < 0 || subjects[i] > 1000) { 
      subjects[i] = 0; 
     } 
     totalScore += subjects[i]; 
    }; 

    averageScore = totalScore/subjects.length; 

    if (averageScore >= 450 || totalScore >= 2250) { 
     document.write("PASSED"); 
    } else { 
     document.write("NOT PASSED"); 
    } 
} 

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

Затем общий балл усредняется по количеству предметов.

Тогда, если средний балл равен или больше 450, или равен или больше, чем 2250, он проходит.

+0

Благодарим вас за объяснение того, как работает этот цикл. В этом коде должно быть что-то еще неправильное. Ничто из того, что я делаю, работает, и было достаточно долго, чтобы кеш был очищен. Я попытаюсь найти, где он назвал каждый предмет, как он есть в коде. * sigh * – DataBased

+0

Я очень хочу проголосовать за ответы, которые помогли мне учиться, но пока у меня недостаточно очков репутации. Пожалуйста, знайте, насколько я ценю ваш ответ - я действительно это имею в виду! Ваши и несколько других помогли мне понять некоторые понятия программирования, которые я не понимал, и я искренне благодарен. – DataBased