5

这是我的第一篇文章。我正在编写一个程序来从四个输入框中获取输入,找出这四个的总和并找到平均值。当我这样做时,我得到一个 NaN 错误,有人可以指出我哪里出错了。谢谢

<html>
<head>
<title> Average marks </title>

<script type = "text/javascript">

function average(form)
{

scores = new Array(4)

scores [0] = form.mark1.value
scores [0] = new Number(scores[0])
scores [1] = form.mark2.value
scores [1] = new Number(scores[1])
scores [2] = form.mark3.value
scores [2] = new Number(scores[2])
scores [3] = form.mark4.value
scores [3] = new Number(scores[3])


var Sum = 0
var average

for(var x = 0; x < scores.length; x ++)
{
Sum = Sum + scores[x]
average = Sum / scores[x]
}



document.write("The sum of the marks is equal to " + Sum + "<br>")
document.write("The average of these marks is equal to " + average + "<br>")


}

</script>


</head>

<body>

<form>
Enter the first mark : <input type = "text" name="mark1"> <br>
Enter the second mark : <input type = "text" name="mark2"> <br>
Enter the third mark : <input type = "text" name="mark3"> <br>
Enter the fourth mark : <input type = "text" name="mark4"> <br>

<input type = "submit" value = "submit" onclick="average(this.form)">
</form>


</body>
</html>
4

4 回答 4

7

欢迎来到 Stackoverflow :) 我们很乐意帮助您,同时更好地学习我们的工具。关于算法的一个注释:将平均计算命令移到循环之外:

for(var x = 0; x < scores.length; x ++)
{
  Sum = Sum + scores[x];  //or Sum += scores[x];
}

average = Sum / scores.length;  //length of the array scores is in scores.length

我会使用parseInt()而不是new Number()因为new Number()创建一个对象,同时parseInt()给你实际的文字值作为结果。(更好的性能)。

顺便说一句,var除非您希望全局访问它们(坏主意),否则不要忘记在每个变量定义之前放置。你在所有变量上都做得很好,除了scores. 定义应该是var scores虽然这不是这个错误的来源。

还有一点:你可以检查parseInt()使用isNaN()函数的结果。如果您的数字可以有小数点,您还可以使用parseFloat()

如果从字符串到数字的转换失败,这两个函数的结果都是 NaN(不是数字)。

最后,我认为定义具有指定长度的数组是个好主意。它提高了代码的可读性。然而,在 Javascript 中没有必要,因为它会在运行时自动增加/减少数组的长度,因此您不必提前决定它应该多长。它可能是好事也可能是坏事,这取决于你如何使用它。但一般情况下,您可以使用var myarr=[];而不是var myarr= new Array();. 但是,当您想提示其他开发人员发生了什么时,您也可以指定数组长度:var myarr=new Array(4);.

最后一点使用 Stackoverflow:请接受最佳答案并“投票”其他有用的答案。这样,您将获得分数和其他人。

祝你好运

于 2012-11-20T15:22:17.297 回答
2

你没有以正确的方式平均......你从总和(循环)除以标记数得到平均值。

还:

  1. 不要使用new Array(4). 在 JavaScript 中预定义数组长度是不必要的(并且会损害可读性和性能)。
  2. 永远不要使用new Number()。这会创建一个Number object,这是一件可怕的事情,会在某个时间点造成严重破坏。用来施法Number(yourString)
  3. 我强烈建议您在语句的末尾加上分号。
  4. scores未声明。(请开启严格模式!)

无论如何,这可能是这样的:

function average(form) {
    var scores = [ // Array literal!
        Number(form.mark1.value), // You could also use a leading +
        Number(form.mark2.value),
        Number(form.mark3.value),
        Number(form.mark4.value)
    ];

    var sum = 0;

    for(var i = 0; i < scores.length; i++) {
        sum += scores[i];
    }

    var average = sum / scores.length;

    // etc.
}
于 2012-11-20T15:19:29.797 回答
0

你建立你的分数数组的方式是不必要的复杂。你可以这样做:

scores [0] = form.mark1.value;
scores [1] = form.mark2.value;
scores [2] = form.mark3.value;
scores [3] = form.mark4.value;

那么你的平均计算有误。计算平均值的正确方法是将所有值相加,然后将它们除以值的数量一次。

for(var x = 0; x < scores.length; x ++)
{
    Sum = Sum + scores[x];
}
average = Sum / scores.length;
于 2012-11-20T15:18:36.700 回答
0

要找到平均第一个计算和(例如通过reduce),然后除 - 就是这样

var Sum = scores.reduce((a,b)=> a+b);    // calculate sum
var average = Sum/scores.length;         // divide by number of elements

<html>
<head>
<title> Average marks </title>

<script type = "text/javascript">

function average(form)
{

scores = new Array(4)

scores [0] = form.mark1.value
scores [0] = new Number(scores[0])
scores [1] = form.mark2.value
scores [1] = new Number(scores[1])
scores [2] = form.mark3.value
scores [2] = new Number(scores[2])
scores [3] = form.mark4.value
scores [3] = new Number(scores[3])


var Sum = scores.reduce((a,b)=> a+b);
var average = Sum/scores.length;

document.write("The sum of the marks is equal to " + Sum + "<br>")
document.write("The average of these marks is equal to " + average + "<br>")


}

</script>


</head>

<body>

<form>
Enter the first mark : <input type = "text" name="mark1"> <br>
Enter the second mark : <input type = "text" name="mark2"> <br>
Enter the third mark : <input type = "text" name="mark3"> <br>
Enter the fourth mark : <input type = "text" name="mark4"> <br>

<input type = "submit" value = "submit" onclick="average(this.form)">
</form>


</body>
</html>

于 2019-02-19T04:57:04.937 回答