2014-02-06 5 views
0

Имея некоторые проблемы, выполняющие довольно простой проект JavaScript.Целые числа добавляются вместо добавления (Javascript)

WeightedGPA оказывает значения приложенных к нему, а не добавлять его при использовании + =

Caluclation Я пытаюсь сделать это: Weighted Avg GPA: Покушение часов, умноженные балл для каждого курса в перспективе, а затем разделить к общему количеству покупок

Любая помощь приветствуется. Полный код прилагается

<html> 
<head> 
</head> 
<body> 

<script type="text/javascript"> 
var courseValues = new Array(); 
var x = 0; 
var debug = true; 

function courseObjCreate() 
{ 
var courseData = ""; 
courseData += document.getElementById("name").value; 
courseData += "," 
courseData += document.getElementById("number").value; 
courseData += "," 
courseData += document.getElementById("mark").value; 
courseData += "," 
courseData += document.getElementById("hours").value; 
courseData += "," 
courseData += document.getElementById("credits").value; 
courseValues[x] = courseData; 

alert("Course added!"); 

var elemName = document.getElementById("name"); 
elemName.value = ""; 
var elemNumber = document.getElementById("number"); 
elemNumber.value = ""; 
var elemMark = document.getElementById("mark"); 
elemMark.value = ""; 
var elemHours = document.getElementById("hours"); 
elemHours.value = ""; 
var elemCredits = document.getElementById("credits"); 
elemCredits.value = ""; 

x++; 


} 

</script> 
<center> 
<h1> Student transcript</h1> 
<br> 
<h2> Enter course details</h2> 
<form> 
    Course name:  <input id="name" type="text" /><br> 
    Course number: <input id="number" type="text" /><br> 
    Course mark:  <input id="mark" type="text" /><br> 
    Course hours:  <input id="hours" type="text" /><br> 
    Course credits: <input id="credits" type="text" /><br> 
    <input type="button" value="Submit" onClick ="courseObjCreate()"> Click me to add another course 
<br> 
    <input type="button" value="Generate" onClick ="tblCall()"> Click me to generate the course table 
    <br> 
</form> 
<br> 
<br> 


<script type="text/javascript"> 
function createTable() 
{ 

    if(debug) console.log("Create Table Start"); 
    var gpaSum = (0.0); 
    var hoursSum = 0; 
    var credits = 0; 
    var creditsSum = 0; 
    var gpaSum = (0.0) 
    var prnStrF = ""; 
    var weightedGpa = (0.0) 


    if(debug) console.log("weightedGpa: " + weightedGpa); 

    prnStrF += '<table border="1" cellspacing="1" cellpadding="5">'; 
    prnStrF += '<tr><td>Course name</td><td>Couse number</td><td>Course mark(percentage)</td><td>Course letter grade</td><td>Course Grade Point</td><td>Course hours</td><td>Course credits</td>'; 

    for (var i = 0; i < courseValues.length; i++) 
    { 

     courseLetter =''; 
     courseGPA= (0.0).toFixed(2); 

     var coursePrintStr = courseValues[i].toString(); 
     var prn = coursePrintStr.split(",") 

     if(debug) console.log("prn[2]: " + prn[2]); 
     var markNum = parseInt(prn[2]); 
     if(debug) console.log("MarkNum: " + markNum); 

     switch(true) 
     { 
      case (markNum < 50): 
       if(debug) console.log("less than 50"); 
       courseLetter = 'F'; 
       courseGPA = 0.0; 
       credits = 0; 
       weightedGpa += 0; 
       break; 

      case (markNum > 49 && markNum < 55): 
       if(debug) console.log("more than 49 less than 55"); 
       courseLetter = 'D'; 
       courseGPA = 1.0; 
       credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
       break; 

      case (markNum > 54 && markNum < 60): 
      courseLetter = 'D+'; 
      courseGPA = 1.3; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 59 && markNum < 63): 
      courseLetter = 'C-'; 
      courseGPA = 1.7; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 62 && markNum < 67): 
      courseLetter = 'C'; 
      courseGPA = 2.0; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 66 && markNum < 70): 
      courseLetter = 'C+'; 
      courseGPA = 2.3; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 69 && markNum < 73): 
      courseLetter = 'B-'; 
      courseGPA = 2.7; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 72 && markNum < 77): 
      courseLetter = 'B'; 
      courseGPA = 3.0; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 76 && markNum < 80): 
      courseLetter = 'B+'; 
      courseGPA = 3.3; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 79 && markNum < 85): 
      if(debug) console.log("MarkNumInCase: " + markNum); 
      courseLetter = 'A-'; 
      courseGPA = 3.7; 
      credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
      break; 

      case (markNum > 84): 
       courseLetter = 'A'; 
       courseGPA = 4.0; 
       credits = parseInt(prn[4]); 
      weightedGpa += parseInt(courseGPA * parseInt(prn[3])); 
       break; 

      default: 
       alert("Something broke in the switch case. Probably a String input instead of an int"); 

     } 
    courseGPA = courseGPA.toFixed(2); 
    if(debug) console.log("gpaSum: " + gpaSum); 
    creditsSum += credits; 
    if(debug) console.log("creditsSum: " + creditsSum); 
    hoursSum += parseInt(prn[3]); 
    if(debug) console.log("hoursSum: " + hoursSum); 
    if(debug) console.log("weightedGpa: " + weightedGpa); 
    weightedGpa = (weightedGpa/hoursSum).toFixed(2); 
    if(debug) console.log(prnStrF); 
    prnStrF +='<tr>'; 
    prnStrF += '<td>' + String(prn[0]) + '</td>' + '<td>' + String(prn[1]) + '</td>' + '<td>' + String(prn[2]) + "%" + '</td>'+ '<td>'+ String(courseLetter) + '</td>' + '<td>' + String(courseGPA) +'</td>' +'<td>' + String(prn[3]) + '</td>' +'<td>' + String(prn[4]) + '</td>'; 

    prnStrF += '</tr>'; 

    } 

    prnStrF += '</table>'; 
    if(debug) console.log("hoursSum: " + hoursSum); 
    if(debug) console.log("creditsSum: " + creditsSum); 
    if(debug) console.log("weightedGpa: " + weightedGpa); 


    prnStrF += '<br><br>'; 
    prnStrF +='<table border="1" cellspacing="1" cellpadding="5">'; 
    prnStrF += '<tr><td><b>Report</td><td></td><td>Attemped hours</td><td>Earned credits </td><td>Weighted Average GPA</td></b></tr>'; 
    prnStrF += '<tr><td><b>Report</td><td></td><td>'+ String(hoursSum) + '</td><td>' + String(creditsSum) +' </td><td>'+ String(weightedGpa)+'</b></td></tr>'; 
    prnStrF += '</table>'; 
    if(debug) console.log(prnStrF); 
    return prnStrF; 
} 

</script> 

<script type="text/javascript"> 
function tblCall() 
{ 

    document.getElementById('generateHere').innerHTML = createTable(); 

} 
</script> 
<br> 
<br> 

<div id='generateHere'></div> 
</center> 
</body> 
</html> 

ответ

1

Вы хотите, чтобы заставить все, чтобы считать число с помощью parseint или parsefloat функции - как это, в тот момент, JS подозревает что-то строка, то + будет означать конкатенацию.

Мне кажется, что вы делаете странную сумму - первое, что вы добавляете, - это имя, которое, вероятно, будет строкой. Почему вы формируете эту сумму (вместо суммы оценок и суммы часов кредита в двух отдельных переменных, поэтому вы можете вычислить средневзвешенное значение, которое, как вы утверждаете, хотите сделать).

Возможно, вам стоит подумать о том, чтобы аккумулировать различные поля в набор массивов - и когда у вас есть все собранные данные, вы вычисляете сумму массива часов и сумму (часов * оценок), чтобы вы могли получить средневзвешенное значение.

Вам нужно больше, чем это сделать снова?

+0

Я дам отдельные массивы снова и разложите вычисления и дайте знать – Gfraser

+1

Работал лучше всего для что мне нужно было сделать. Когда я расширил расчеты и использовал другой массив для взвешенного GPA для каждого курса, он работал как масло. – Gfraser

0

Вам не хватает полуколонии после объявления weightedGpa, это только опечатка? Это может испортить декларацию.

+0

Просто опечатка, результат тот же :( – Gfraser

+0

Вы должны использовать parseFloat вместо ParseInt, потому что вы добавляете Интс к двойному. – ltalhouarne

0

Измените свою строку 'var courseData = "";' to 'var courseData = 0;' и это должно сделать трюк.

Объявление с помощью "" сообщает javascript, что courseData является строкой, поэтому ваши операции + = будут выполняться как конкатенации вместо математических функций.

+0

Он добавляет имена courseData, поэтому я думаю, что упомянутая декларация предназначена. – ltalhouarne

+0

данные курса устанавливаются в строковый объект и добавляются в массив в функции courseObjCreate, а затем вынимаются в функции createTable и разделяются, потому что это CSV. Значения анализируются по ints после факта, а затем начинается цикл. до 0 префикс строки имени программы в построенной таблице с 0 infront – Gfraser

+0

Да, мой плохой, я неправильно понял вопрос. –

Смежные вопросы