5

これは私の最初の投稿です。4 つの入力ボックスから入力を取得し、これら 4 つの合計を求めて平均を求めるプログラムを作成しています。そうすると、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 へようこそ :) 私たちのツールをよりよく学びながら、喜んでお手伝いさせていただきます。アルゴリズムに関する 1 つの注意: 平均計算コマンドをループの外に移動します。

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、それはこのエラーの原因ではありません。

もう1つのポイント:関数を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 オブジェクトが作成されますが、これはある時点で大混乱を引き起こす恐ろしいものです。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;

次に、平均計算にエラーがあります。平均を計算する正しい方法は、すべての値を合計してから、それらを値の数で 1 回割ることです。

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