2015-10-17 29 views
5

我遇到了一个我似乎无法解决的问题。请看下面的代码:Javascript代码运行良好...几乎所有的时间

<script> 
    function createFunctions() { 
     var first = ["", "", ""]; 
     var second = ["", "", ""]; 
     var func = ["", ""]; 
     var sign = ["", ""]; 
     for (i = 0; i < 3; i++) { 
      first[i] = (Math.round(Math.random() * 9) + 1); 
      second[i] = (Math.round(Math.random() * 9) + 1); 
      sign[i] = (Math.round(Math.random())); 
      if (sign[i] == "1") { 
       sign[i] = '+'; 
      } else { 
       sign[i] = '-'; 
      } 
      if (first < 2) { 
       func[i] = 'f(x) = x ' + sign[i] + ' ' + second[i] + '<p>'; 
      } else { 
       func[i] = 'f(x) = ' + first[i] + 'x ' + sign[i] + ' ' + second[i] + '<br>'; 
      } 
     } 
     for (i = 0; i < 3; i++) { 
      document.getElementById("createFunctions").innerHTML += 'Function ' + [i + 1] + ': ' + func[i]; 
     } 
     //whichFunction= 
     findAnswers(first, second, sign); 
    } 

    function findAnswers(first, second, sign, rand) { 
     var num = ["", "", ""]; 
     rand = (Math.round(Math.random() * 1)); 
     document.getElementById("findAnswers").innerHTML = 'Which <b>one (or more)</b> of these functions holds true, when plugged in with the following <b>values of x</b>? (' + [rand + 1] + ')<br>'; 
     for (i = 0; i < 3; i++) { 
      num[i] = (Math.round(Math.random() * 9)); 
     } 
     for (i = 0; i < 3; i++) { 
      ans = 0; 
      if (sign[rand] == "+") { 
       ans = [first[rand] * num[i]] + second[rand]; 
      } else { 
       ans = [first[rand] * num[i]] - second[rand]; 
      } 
      document.getElementById("findAnswers").innerHTML += [i + 1] + '. You put in a ' + num[i] + ': ' + ans + '<br>'; 
     } 
    } 
</script> 

<BODY onload=createFunctions()> 
    <b>A Machine Called Effex</b> 
    <p><input type="button" value="New Examples" onclick="history.go(0)" VALUE="Refresh"></p> 
    <p id="createFunctions"></p> 
    <p id="findAnswers"></p> 

一切都很好。除了偶尔计算函数时,代码将乘以x,然后简单地将第二个值连接到第一个,而不是添加(或减去)。

+1

不应该是第15行的第一个[i] <2'吗? – mynawaz

+2

尝试在第36和38行的'[first [rand] * num [i]] + second [rand]'中将最外方括号更改为圆括号,并且还使用parseInt在这些行上将操作数强制转换为int – mynawaz

+0

更改了数组从var array = [“”,“”,“”]'到'var array = []',因为它只是创建一个空数组,而'i'在for循环中完成其余部分。看看这里:http://jsfiddle.net/zzx5w79a/也许你想包括这个链接到你的问题。我无法找到“偶尔..,代码相乘..” – caramba

回答

3

您应该将[first[rand]*num[i]]更改为(first[rand]*num[i])。 []括号仅用一个值(乘法乘积)实例化一个数组,然后将数组'添加'到一个数字,这将强制引擎将数组转换为字符串并将字符串与你正在添加的数字。

为了说明,请考虑下面的代码。它还实例化一个数组,但使用unary + operator将其转换为数字。这将导致数值而不是数组,因此您的代码将按预期工作。

+[first[rand]*num[i]] 

为了进一步说明发生了什么,考虑下面的代码。它也实例化了一个单元素数组,但是通过将它附加到[0],我们指定了该元素的(数值)值,因此当您使用+运算符时,引擎不会强制将该数组转换为字符串。

[first[rand]*num[i]][0] 
+0

非常感谢你的解释! – Jehangir

+0

不客气,很高兴提供帮助。不要忘记选择解决问题的适当答案。 – moismailzai

0

您正在使用方括号,您应该使用圆括号。

方括号用于创建数组。例如[2 * 3]创建一个包含一个项目的数组:6.此外,+ operator将执行数字加法或字符串连接,具体取决于操作数。添加数组和数字会导致串联。因此,例如以下语句:

ans = "6" + "4"; 
// string "64" 

你需要摆脱被错误使用方括号:作为

​​

进行评估。


除此之外,您还使用Math.random()函数不正确。这个语句,例如:

Math.round(Math.random() * 9) + 1 

显示通过8.正确的方法1和10之间返回一个随机数。然而,数字比数2 1和10将具有较小的概率产生的随机数minmax之间是:

Math.floor(Math.random() * (max - min + 1)) + min 

最后,这样的说法:

rand = Math.round(Math.random() * 1); 

只会返回0和1,但不是2ÿ你也需要解决这个问题。

相关问题