2013-02-19 120 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> 

,这似乎是从不同的数据库字段正确检索值,如JavaScript的程序评估每个值,以确保它的至少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.然而,它并没有达到最后一部分。如果所有分数超过410,它将返回“PASSED”。

我试过这个,但它也不起作用。

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

如果(读< 0 && read > 1000): 至于你说你只是学习,一个技巧是,这将永远,永远如此。你在这里问的是“在同一时间读小于0,但也超过1000,”? ||应该用来代替&&。 &&表示“如果这和这个”,||意思是“如果这个,还是这个”。 ||在你的情况下,将其改为“如果读数小于零,或者它大于1000,则执行此操作”,这是可能的,因为数学中的数字既不小于零也不超过1000. 注意:是shift + \键,并且被称为“管道” – Gyhth 2013-02-19 19:28:50

+0

我认为这就是他为什么这么做的原因 - 也许他只是想确保每个值都设置为0以开始使用?或者一个人从不这样做? – DataBased 2013-02-19 19:36:20

+0

在那里,它永远不会将它设置为零,因为这是后面的代码,因为它永远不会小于0并且大于1000,它永远不会将它设置为0.它是合理的如果满足这两个条件中的任何一个(0最小值,我认为最大值为1000分),那么他希望将其设为零,但这就是为什么您要使用OR(||)运算符而不是AND(&&)。 if之后的代码,如read = 0,仅在if块返回true时执行。阅读< 0 && Read > 1000将永远不会返回true,因此,它永远不会将读取设置为0.与其他值相同。 – Gyhth 2013-02-19 19:39:52

回答

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 2013-02-19 19:57:36

+0

我已经为你重新设计了你的整个功能。希望这会帮助你更多。我在解释我为什么完成某些事情的过程中添加了符号,以及它应该如何帮助您找到所需的东西。如果您还有其他问题,或者仍然无法正常工作,请告诉我。 – krillgar 2013-02-19 20:10:54

+0

你们都非常美妙。在这一点上,我只能想到,也许数据库没有以整数形式返回这些字段的值。那可能吗? – DataBased 2013-02-19 20:33:51

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 2013-02-19 19:35:30

+0

我在学习parseInt设置后实际上使用了这段代码,它完美地工作 - 谢谢! – DataBased 2013-02-19 21:10:29

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 2013-02-19 19:44:24

+1

我非常想投票答案,帮助我学习,但显然,我还没有足够的声望点。请知道我多么感谢你的答案 - 我真的是这个意思!你和其他几个人帮助我掌握了一些我不明白的编程概念,我真的很感激。 – DataBased 2013-02-19 21:13:05

+0

我已upvoted您的问题。你只需要更多的声望就可以投票。祝你好运! – Jordan 2013-02-19 22:31:05

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

谢谢你解释这个循环是如何工作的 - 在这个代码中的某处必须有其他错误。我做的没有任何工作,并且它已经足够长,缓存应该已经清除。我将尝试找到他在代码中命名每个主题的位置。 *叹息* – DataBased 2013-02-19 20:04:03

+0

我非常想投票答案,帮助我学习,但我没有足够的声望点,显然。请知道我多么感谢你的答案 - 我真的是这个意思!你和其他几个人帮助我掌握了一些我不明白的编程概念,我真的很感激。 – DataBased 2013-02-19 21:09:45