Javascript 计算不执行循环的标准偏差

Javascript 计算不执行循环的标准偏差,javascript,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:"); fig

我刚刚开始在代码学院学习编码,我对这方面还很陌生

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

// 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();

您的
数字
变量未定义为数组。因此,
figure[1]=prompt(…)
永远不会被命中,并且在
var n=figures.length上抛出一个TypeError

更改:

var figures;
致:

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

// 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();
.

对于(i=0;i==100;i++){[…]}
的意思是

  • i
    设置为0
  • 如果
    i===100
    不是真的(即:如果
    i
    不是100),则结束循环
  • 做我放在{}括号里的任何事,一次
  • Do
    i++
  • 回到2
  • 由于
    i
    的初始值为0而不是100,因此循环中的代码永远不会执行。如果您希望它从0变为99,那么它应该是for(i=0;i<100;i++)

    不过,实际上并不需要for循环。一段时间的循环会更好。像
    while(true){[…]}
    这样的循环将一直运行,直到遇到
    break
    语句为止。在这种情况下,您不会使用
    i
    ,因此可以使用
    figures.push(parseFloat(提示符(“输入一个数字”))
    (您应该使用
    parseFloat
    ,如前所述)
    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:");
    

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

    为此,您可以使用类似于
    parseFloat
    的方法

    如果不使用它,则对字符串求和。3+4将是34而不是7

    功能标准偏差(numbersArr){
    //--计算AVAREGE--
    var合计=0;
    for(var键在numbersArr中)
    总数+=数字助理[键];
    var meanVal=总长度/numbersArr.length;
    //--计算AVAREGE--
    //--计算标准差--
    var-SDprep=0;
    for(var键在numbersArr中)
    SDprep+=Math.pow((parseFloat(numbersArr[key])-meanVal),2);
    var SDresult=Math.sqrt(SDprep/numbersArr.length);
    //--计算标准差--
    警报(SDresult);
    }
    var numbersArr=[10,11,12,13,14];
    
    标准偏差(numbersArr)“不工作”不是一个很有用的描述。请给出输入、输出和预期输出的示例。当询问用户是或否问题时,您可以使用
    confirm()
    而不是
    prompt()
    。请看我的回答,“并且在var n=figures.length上抛出一个TypeError;”代码在这之前失败了,这行代码不会被执行来抛出错误。
    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:");