2017-06-26 14 views
1

Ich versuche, einen Rechner in Javascript zu bauen, aber ich bin stecken und weiß nicht weiter. jedesmal, wenn jemand klicken Sie auf 1 + 1/2 für exemple ich ein Array erschaffe, das alles drückt, die über dem Array so in der Fall eingegeben wurde jedochErstellen Javascript Rechner

[1, "+", 1, "/", 2]; 

sein würde, ich kann es nicht herausfinden, wie um dieses Array in einen tatsächlichen mathematischen Wert umzuwandeln. Ich hatte eine Idee durch alle Elemente Looping wie folgt aus:

for(var i=0; i<arrayCharacters.length ;i++){ 
      if(arrayCharacters[i] != "*" || arrayCharacters[i] != "/" || arrayCharacters[i] != "+" || arrayCharacters[i] != "*"){ 
       arrayNumbers.push(arrayCharacters.slice(0, i)); 
       console.log(arrayNumbers); 
      } 
     } 

Es ist sehr unvollständig, weil ich stecken geblieben. Kann mir jemand helfen?

+0

https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question – Jeremy

+0

Sie haben mit Ihrem eigenen kommen Interpretation von +, -, /, * .. Operatoren. – webdeb

+0

Oder einfach eval .. aber das ist nicht sauber IMO – webdeb

Antwort

4
var result=eval(arrayCharacters.join("")); 

Sie auch den Ausdruck manuell analysieren könnte, aber dies erfordert einen Baum Aufbau, wie Mathe ist nicht links nach rechts ausgewertet.


Wenn Sie wirklich zu analysieren, wollen es auf eigene Faust (was weit besser als eval ist), könnten Sie eine mathematische Schreibweise verwenden, die wirklich von geht links nach rechts, so dass ihr viel leichter zu analysieren (As @ Scott vorgeschlagen). Eine Implementierung:

var stack=[]; 
var arrayCharacters=[1,2,"/",1,"+"]; 

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

var char=arrayCharacters[i]; 

if(typeof char==="number"){ 
    stack.push(char); 
    continue; 
} 

var op2=stack.pop()||0; 
var op1=stack.pop()||0; 
var res; 

if(char=="+"){ 
    res=op1+op2; 
} 
if(char=="-"){ 
    res=op1-op2; 
} 
if(char=="*"){ 
    res=op1*op2; 
} 
if(char=="/"){ 
    res=op1/op2; 
} 

stack.push(res); 
} 

var result=stack.pop(); 

Math Syntax (RPN (1)):

1+2 => 1 2 + 
1/2+3 => 1 2/3 + 
1+2/3 => 1 2 3/+ 
(1+2)/3 => 1 2 + 3/
1/2/3+4/5/6 => 1 2/3/4 5/6/+ 

http://jsbin.com/zofeqitiba/edit?console

1

"eval" -Funktion ist eine sehr gute Wahl in Ihrem Fall. Sie können auch die math.js-Bibliothek verwenden, die mit einem leistungsstarken Ausdrucksparser ausgestattet ist.

http://mathjs.org

Verwandte Themen