2017-11-02 9 views
-4

私はクラス名、クラス時間、クラス等級を受け入れるユーザGPAを画面に表示するコードを書こうとしています。私は多くのことをテストし、グローバル変数を削除しましたが、変数を書き直さないように最善を尽くしましたが、NaN以外のものを返すようには思えません。私はコードdocument.getElementById('output').innerHTML = finalGPA;を試して結果をプリントアウトし、parseIntparseStringとしましたが、まだ動作させることができませんでした。私はGPAの結果を印刷したいと思います。私はすでに助けられており、コードは現在機能しています。javascript関数がNaNを返すのはなぜですか?

function calculate(classesTable) { 
 
\t var table = document.getElementById(classesTable); 
 
\t var rowCount = table.rows.length; 
 
\t var classStack = []; 
 
\t var creditStack = []; 
 
\t var gradeStack = []; 
 
\t for(var r = 0; r < rowCount; r++) { 
 
\t \t for(var c = 0; c <= 2; c++) { 
 
\t \t \t if(c == 0) { 
 
\t \t \t \t classStack.push(table.rows[r].cells[c].children[0].value); 
 
\t \t \t } 
 
\t \t \t if(c == 1) { 
 
\t \t \t \t creditStack.push(table.rows[r].cells[c].children[0].value); 
 
\t \t \t } 
 
\t \t \t if(c == 2) { 
 
\t \t \t \t gradeStack.push(table.rows[r].cells[c].children[0].value); 
 
\t \t \t } 
 
\t \t } \t 
 
\t } 
 
\t var finalGPA = 0; 
 
\t var totalCreditPoints = 0; 
 
\t var totalHours = 0; 
 
\t var letterGrade = " "; 
 
\t var tempHours = 0; 
 
\t var tempCreditPoints = 0; 
 
\t for(var z = 0; z < rowCount; z++) { 
 
\t \t letterGrade = gradeStack[z]; 
 
\t \t if(letterGrade == "A") { 
 
\t \t \t tempHours = creditStack[z]; 
 
\t \t \t tempCreditPoints = 4; 
 
\t \t \t totalCreditPoints += (tempHours * tempCreditPoints); 
 
\t \t \t totalHours += creditStack[z]; 
 
\t \t } 
 
\t \t if(letterGrade == "B") { 
 
\t \t \t tempHours = creditStack[z]; 
 
\t \t \t tempCreditPoints = 3; 
 
\t \t \t totalCreditPoints += (tempHours * tempCreditPoints); 
 
\t \t \t totalHours += creditStack[z]; 
 
\t \t } 
 
\t \t if(letterGrade == "C") { 
 
\t \t \t tempHours = creditStack[z]; 
 
\t \t \t tempCreditPoints = 2; 
 
\t \t \t totalCreditPoints += (tempHours * tempCreditPoints); 
 
\t \t \t totalHours += creditStack[z]; 
 
\t \t } 
 
\t \t if(letterGrade == "D") { 
 
\t \t \t tempHours = creditStack[z]; 
 
\t \t \t tempCreditPoints = 1; 
 
\t \t \t totalCreditPoints += (tempHours * tempCreditPoints); 
 
\t \t \t totalHours += creditStack[z]; 
 
\t \t } 
 
\t \t if(letterGrade == "F" || letterGrade == "I") { 
 
\t \t \t tempHours = creditStack[z]; 
 
\t \t \t tempCreditPoints = 0; 
 
\t \t \t totalCreditPoints += (tempHours * tempCreditPoints); 
 
\t \t \t totalHours += creditStack[z]; 
 
\t \t } 
 
\t \t if(letterGrade == "W") { 
 
\t \t \t tempHours = creditStack[z]; 
 
\t \t \t tempCreditPoints = 0; 
 
\t \t \t totalCreditPoints += (tempHours * tempCreditPoints); 
 
\t \t \t creditStack[z]; 
 
\t \t } 
 
\t } 
 
\t finalGPA = totalCreditPoints/totalHours; 
 
\t alert(finalGPA); 
 
\t return finalGPA; 
 
}
<table id='classesTable' class="table table-bordered"> 
 
    <tr> 
 
    <td><input type="text" placeholder="Class Name" name="txtbox[]" /></td> 
 
    <td><input type="text" placeholder="Number of Hours" name="txtbox[]" /></td> 
 
    <td><input type="text" placeholder="Grade Recieved" name="txtbox[]" /></td> 
 
    </tr> 
 
</table> 
 

 
<input type="button" value="Add New Row" onclick="addRow('classesTable')" /> 
 
<input type="button" value="Remove Last Row" onclick="removeRow('classesTable')" /> 
 
<input type="button" value="Calculate GPA" onclick="calculate('classesTable')" /> 
 

 
<hr />

+1

Google Chromeデバッガを使用し、ブレークポイントを使用することをお勧めします。 – JoshYates1980

+0

まあ、 'calculate( 'classesTable')'は、引数1でcalculateを呼び出します。 calculateは6つの引数をとります。指定されていない引数は 'undefined'になります。それは...誤った使い方のようです。 –

+1

@cevinBが 'rowCount'と' table'を述べたものに、calculate関数では定義されていないので、最後に 'alert(finalGPA);を実行したとき' actlayyは 'alert(0/0)'を実行してNaN –

答えて

1

function addRow(classesTable) { 
 
\t var table = document.getElementById(classesTable); 
 
\t var rowCount = table.rows.length; 
 
\t var row = table.insertRow(rowCount); 
 
\t var cell1 = row.insertCell(0); 
 
\t var element1 = document.createElement("input"); 
 
\t element1.type = "text"; 
 
\t element1.placeholder = "Class Name"; 
 
\t element1.name = "txtbox[]"; 
 
\t cell1.appendChild(element1); 
 
\t var cell2 = row.insertCell(1); 
 
\t var element2 = document.createElement("input"); 
 
\t element2.type = "text"; 
 
\t element2.placeholder = "Number of Hours"; 
 
\t element2.name = "txtbox[]"; 
 
\t cell2.appendChild(element2); 
 
\t var cell3 = row.insertCell(2); 
 
\t var element3 = document.createElement("input"); 
 
\t element3.type = "text"; 
 
\t element3.placeholder = "Grade Recieved"; 
 
\t element3.name = "txtbox[]"; 
 
\t cell3.appendChild(element3); 
 
\t rowCount++; 
 
} 
 
\t 
 
function removeRow(classesTable) { 
 
\t var table = document.getElementById(classesTable); 
 
\t var rowCount = table.rows.length; 
 
\t table.deleteRow(rowCount - 1); 
 
\t rowCount--; 
 
} 
 
\t 
 
function calculate(classesTable) { 
 
\t var table = document.getElementById(classesTable); 
 
\t var rowCount = table.rows.length; 
 
\t var classStack = []; 
 
\t var creditStack = []; 
 
\t var gradeStack = []; 
 
\t for(var r = 0; r < rowCount; r++) { 
 
\t \t for(var c = 0; c <= 2; c++) { 
 
\t \t \t if(c == 0) { 
 
\t \t \t \t classStack.push(table.rows[r].cells[c].children[0].value); 
 
\t \t \t } 
 
\t \t \t if(c == 1) { 
 
\t \t \t \t creditStack.push(table.rows[r].cells[c].children[0].value); 
 
\t \t \t } 
 
\t \t \t if(c == 2) { 
 
\t \t \t \t gradeStack.push(table.rows[r].cells[c].children[0].value); 
 
\t \t \t } 
 
\t \t } \t 
 
\t } 
 
    
 
\t var finalGPA = 0; 
 
\t var totalCreditPoints = 0; 
 
\t var totalHours = 0; 
 
\t var letterGrade = " "; 
 
\t for(var z = 0; z < rowCount; z++) { 
 
\t \t letterGrade = gradeStack.pop(); 
 
\t \t if(letterGrade == "A") { 
 
\t \t \t totalCreditPoints += 4; 
 
\t \t \t totalHours += +creditStack.pop(); 
 
\t \t } 
 
\t \t if(letterGrade == "B") { 
 
\t \t \t totalCreditPoints += 3; 
 
\t \t \t totalHours += +creditStack.pop(); 
 
\t \t } 
 
\t \t if(letterGrade == "C") { 
 
\t \t \t totalCreditPoints += 2; 
 
\t \t \t totalHours += +creditStack.pop(); 
 
\t \t } 
 
\t \t if(letterGrade == "D") { 
 
\t \t \t totalCreditPoints += 1; 
 
\t \t \t totalHours += +creditStack.pop(); 
 
\t \t } 
 
\t \t if(letterGrade == "F" || letterGrade == "I") { 
 
\t \t \t totalCreditPoints += 0; 
 
\t \t \t totalHours += +creditStack.pop(); 
 
\t \t } 
 
\t \t if(letterGrade == "W") { 
 
\t \t \t totalCreditPoints += 0; 
 
\t \t \t creditStack.pop(); 
 
\t \t } 
 
\t } 
 
    
 
\t finalGPA = totalCreditPoints/totalHours; 
 
\t alert(finalGPA); 
 
\t return finalGPA; 
 
}
<table id='classesTable' class="table table-bordered"> 
 
    <tr> 
 
    <td><input type="text" placeholder="Class Name" name="txtbox[]" /></td> 
 
    <td><input type="text" placeholder="Number of Hours" name="txtbox[]" /></td> 
 
    <td><input type="text" placeholder="Grade Recieved" name="txtbox[]" /></td> 
 
    </tr> 
 
</table> 
 

 
<input type="button" value="Add New Row" onclick="addRow('classesTable')" /> 
 
<input type="button" value="Remove Last Row" onclick="removeRow('classesTable')" /> 
 
<input type="button" value="Calculate GPA" onclick="calculate('classesTable')" /> 
 

 
<hr />

P.S.私はあなたのコードをGPAを計算するように更新しています。私はそれに何かを加えるつもりはありません。あなたの計算機の小切手を実装する必要があります

+0

番号を印刷するのを手伝ってくれてありがとう。番号は間違っていますが、どこで問題が発生しているのか把握するためには何らかのトレースを行うことができます。 –

+1

table.rows [r] .cells [c] .innerHTML'に 'children [0] .value''がありません。 innerHTMLは入力フィールドの値ではなくHTMLを提供します。あなたのコードですべてのことがうまくいく。私はちょうどあなたの最新のコードに応じて私の答えを更新しました:) –

+0

私はあなたが私に言ったことに加えて計算を働かせるために修正されたコードで投稿したコードを更新しました。私は今もGPAファインを1行として計算する問題にぶつかりますが、別の行を追加すると値がどんな値になるかが分かり始めます。私は間違った方法で行を追加していますか、または私は間違った方法でそれらを配列に押し込んでいますか?私はcreditStack.push(table.rows [r] .cells [c] .children [0] .value)を変更する必要があると思っていた。しかし私は何にするのか分からない。 –

-2

innerHTMLは常に文字列値を返します。ここで私はこれまでに書いたコードです。

var i = 0; 
i += '1'; 
console.log(i); 

これらの値を数値に追加しようとすると、01がコンソールに出力されます。今では文字列01で分割しようとすると、実際には1で割り切れることがわかります。しかし、空白文字のようにinnerHTMLの収集値に他の文字が含まれていた場合は、NaN例:

var i = 0; 
i += ' 1'; 
var val = 1/i 
console.log(val); 

操作を実行する前に、値のサニタイズと書式設定を行っていることを確認してください。

関連する問題