2015-10-17 17 views
5

Mi sono imbattuto in un problema che non riesco a risolvere. Si prega di dare un'occhiata al codice qui sotto:Il codice Javascript funziona bene ... quasi tutto il tempo

<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> 

Tutto funziona alla grande. Tranne occasionalmente, quando si calcola la funzione, il codice si moltiplica per x, quindi semplicemente concatena il secondo valore sul primo, invece di aggiungere (o sottrarre).

+1

Non dovrebbe essere "prima [i] <2' sulla riga 15? – mynawaz

+2

Provare a cambiare le parentesi quadre più esterne tra parentesi in "[prima [rand] * num [i]] + secondo [rand]' nella riga 36 e 38 e anche castare gli operandi in int usando parseInt su queste righe – mynawaz

+0

cambiato gli array da 'var array = [" "," "," "]' a 'var array = []' poiché crea solo una matrice vuota e 'i' fa il resto nei cicli for. dai un'occhiata qui: http://jsfiddle.net/zzx5w79a/ forse vuoi includere questo link alla tua domanda. Non sono riuscito a trovare "occasionalmente .., il codice si moltiplica .." – caramba

risposta

3

È necessario modificare [first[rand]*num[i]] a (first[rand]*num[i]). La parentesi [] crea un'istanza di un array con un solo valore (il prodotto della moltiplicazione) e quindi "aggiungi" l'array a un numero, il quale forza il motore a trasmettere l'array a una stringa e concatenare la stringa con il numero che stai 'aggiungendo'.

Per illustrare, considerare il seguente codice. Crea anche un'array ma lo trasmette a un numero utilizzando unary + operator. Ciò comporterà un valore numerico e non un array, quindi il tuo codice funzionerà come previsto.

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

Per illustrare ulteriormente cosa sta accadendo, prendere in considerazione il codice riportato di seguito. Crea anche un'istanza di un elemento singolo, ma aggiungendola con [0], specifichiamo il valore (numerico) di quell'elemento e quindi il motore non è obbligato a trasmettere l'array a una stringa quando si utilizza l'operatore +.

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

Grazie mille per questa spiegazione! – Jehangir

+0

Benvenuto, felice di aiutarti. Non dimenticare di selezionare le risposte appropriate alle domande risolte. – moismailzai

0

Si utilizzano parentesi quadre in cui si sarebbe dovuto utilizzare le parentesi tonde.

Le parentesi quadre sono utilizzate per creare array. Ad esempio, [2 * 3] crea un array che contiene un elemento: 6. Inoltre, lo + operator eseguirà un'aggiunta numerica o una concatenazione di stringhe, a seconda degli operandi. L'aggiunta di un array e un numero si traduce in concatenazione. Quindi questa dichiarazione, per esempio:

ans = [2 * 3] + 4; 

è valutato come:

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

È necessario sbarazzarsi di parentesi quadre che vengono utilizzati in modo non corretto.


Oltre a questo, si utilizza anche Math.random() funzione in modo non corretto. Questa affermazione per esempio:

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

Appare per restituire un numero casuale compreso tra 1 e 10. Tuttavia, i numeri 1 e 10 avranno minore probabilità rispetto ai numeri 2 a 8. Il metodo corretto per generare un numero casuale tra il min e max è:

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

Infine, questa dichiarazione:

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

servirà solo a restituire 0 e 1, ma non 2. Y o devi sistemare anche quello.

Problemi correlati