这是我的第一篇文章。我正在写一个程序,从四个输入框中获取输入,找出这四个输入框的总和,并求出平均值。当我这样做时,我得到了一个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>发布于 2012-11-20 23:22:17
欢迎使用Stackoverflow :)我们很乐意帮助您更好地学习我们的工具。关于该算法,只需注意一点:将average计算命令移出循环:
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,尽管这不是此错误的来源。
另外一点:你可以使用isNaN()函数来检查parseInt()的结果。如果你的数字可以有小数点,你也可以使用parseFloat():
如果从字符串到数字的转换失败,这两个函数的结果都是NaN (而不是数字)。
最后,我认为用指定的长度定义数组是个好主意。它提高了代码的可读性。然而,这在Javascript中是不必要的,因为它会在运行时自动增加/减少数组的长度,所以您不必事先决定它应该有多长。它可以是一件好事,也可以是件坏事,这取决于你如何使用它。但一般来说,您可以使用var myarr=[];而不是var myarr= new Array();。但是,当您想要提示其他开发人员发生了什么时,您也可以指定数组长度:var myarr=new Array(4);。
使用Stackoverflow的最后一点是:请接受最佳答案,并“向上投票”其他有用的答案。这样一来,你会得到一个分数,其他人也一样。
祝好运
发布于 2012-11-20 23:19:30
你没有以正确的方式平均。您可以通过总和(在循环之外)除以标记数来获得平均值。
另外:
new Array(4)。在JavaScript中预定义数组长度是不必要的(而且可能会损害可读性和performance).new Number()。这将创建一个Number对象,这是一件可怕的事情,会在某个时间点造成严重破坏。使用Number(yourString)来强制转换。不管怎么说,这可能是这样的:
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-20 23:18:37
构建分数数组的方法是不必要的复杂。你可以这样做:
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;https://stackoverflow.com/questions/13476130
复制相似问题