计算标准偏差不执行循环

时间:2014-01-15 10:46:49

标签: javascript

我刚刚开始学习代码学院的编码,我对此非常陌生。

我正在尝试让这个程序向用户询问它添加到数组中的值,从中计算样本标准偏差。

// This array stores the values needed
var figures;

getStandardDeviation = function() {

// I need at least two figures for a standard deviation
figures[0] = prompt("Enter a number:");
figures[1] = prompt("Enter a number:");

// Checks whether user wishes to add more values to the array
var confirm = prompt("Would you like to add another? (Y or N)").toUpperCase();

// I can't figure out why the following if statement is not executed
// It checks whether the user wishes to add more values and adds them to the array
// If not it breaks the for loop
if (confirm === "Y"){
    for ( i = 0; i === 100; i++){
        figures[i + 2] = prompt("Enter a number:");
        confirm = prompt("Would you like to add another figure? (Y or N)").toUpperCase();
        if (confirm === "N"){
            break;
        }
    }
}

// The rest of the code works fine from here onwards

var sumx = 0;
var n = figures.length;
for(var i = 0 ; i < n ; i++) {
    sumx += figures[i];
}
console.log("Sum = " + sumx);

var sumXsq = 0;    
for( i = 0 ; i < n ; i++) {
    sumXsq += (figures[i] * figures[i]);
}    
console.log("Sum x squared = " + sumXsq);

var sxx = (sumXsq - (sumx * sumx)/n);
console.log("Sxx = " + sxx);

var v = sxx/(n - 1);
console.log("Variance = " + v);

var standardDev = Math.sqrt(v);
console.log("Standard Deviation = " + standardDev);

};

getStandardDeviation();

该程序应该问我是否要为数组添加更多值,然后当我确认时,它会提示我添加更多值。

目前,当我执行程序时,我输入数字56和67.代码然后询问我是否要添加更多值,然后我确认这一点。它不是让我添加更多的值而是忽略它,而是用前两个值(56和67)计算标准偏差。

The output is:

Sum = 05667
Sum x squared = 7625
Sxx = -16049819.5
Variance = -16049819.5
Standard Deviation = NaN

4 个答案:

答案 0 :(得分:1)

您的figures变量未定义为数组。因为figure[1] = prompt(...)永远不会被命中,并且var n = figures.length;上会引发TypeError。

变化:

var figures;

要:

var figures = [];

JSFiddle demo

然后,您可以使用递归函数替换for之后使用的if (confirm === "Y")循环:

// Push a user input number into the figures array
figures.push(prompt("Enter a number:"));

// Function to add a new number and ask if we want to add more
function addNewNumber() {
    // Push a new user input number into the figures array
    figures.push(prompt("Enter a number:"));

    // Ask if the user wants to add another number
    if (confirm("Do you want to add another number?"))
        // If they do, call this function again
        addNewNumber();
}

// Trigger the function for the first time
addNewNumber();

JSFiddle demo with recursion

答案 1 :(得分:1)

for ( i = 0; i === 100; i++){[...]}表示

  1. i设为0
  2. 如果不是i === 100(即{如果i不是100),则结束循环
  3. 做任何我放在{}括号内的东西,一次
  4. i++
  5. 返回2
  6. 由于i的初始值为0而不是100,因此循环内的代码永远不会执行。如果你希望它从0到99,它应该是for ( i = 0; i < 100; i++)

    但实际上并不需要for循环。一个while循环会更好。像while (true){[...]}这样的循环会一直运行,直到达到break语句。由于在这种情况下您不会使用i,因此您可以使用figures.push(parseFloat(prompt("Enter a number:")))代替parseFloat,根据Vincent Hogendoorn所说的内容。 push在数组的末尾添加一个新值,因此它正是您所需要的。类似的东西:

    if (confirm === "Y"){
        while (true){
            figures.push(parseFloat(prompt("Enter a number:")));
            confirm = prompt("Would you like to add another figure? (Y or N)").toUpperCase();
            if (confirm === "N"){
                break;
            }
        }
    }
    

    您也可以更改它,以便在您没有至少两个值时不询问是否要停止。这样你就可以省略第一部分:

    figures[0] = prompt("Enter a number:");
    figures[1] = prompt("Enter a number:");
    

答案 2 :(得分:1)

确实你的figures变量没有定义为数组,就像@James Donnely所说的那样。 请记住,您还要填写字符串,因此如果要添加值,则必须将它们转换为值。

您可以使用类似parseFloat的内容。

如果你不使用它,你总结字符串。 3 + 4将是34而不是7.

答案 3 :(得分:0)

&#13;
&#13;
function StandardDeviation(numbersArr) {
    //--CALCULATE AVAREGE--
    var total = 0;
    for(var key in numbersArr) 
       total += numbersArr[key];
    var meanVal = total / numbersArr.length;
    //--CALCULATE AVAREGE--
  
    //--CALCULATE STANDARD DEVIATION--
    var SDprep = 0;
    for(var key in numbersArr) 
       SDprep += Math.pow((parseFloat(numbersArr[key]) - meanVal),2);
    var SDresult = Math.sqrt(SDprep/numbersArr.length);
    //--CALCULATE STANDARD DEVIATION--
    alert(SDresult);
    
}

var numbersArr = [10, 11, 12, 13, 14];
StandardDeviation(numbersArr);
&#13;
&#13;
&#13;