2013-06-18 6 views
0

자바 스크립트로 프로그램을 만들고 있는데 어떻게 할 수 있는지 잘 모르겠습니다. 내 프로그램은 "+", "-"및 기타 수학 연산자와 같은 인수를 실제 연산자로 변환하려는 문자열로 사용합니다. (예를 들어, 의사 코드)JavaScript에서 실제 연산자로 문자열 연산자로 수학 연산자를 변환

function calc(a,b,c, op1,op2){ 

    output=(a op1 b op2 c) 
} 

CALC (2,3,4, "+", "-")

출력 해주기 = 2 + 3-4이어야한다.

그러나, 나는 얼마나 많은 통신 수 및 또한 수를 미리 알지 못한다. 즉, 1, "+", 2, "-", 4, "+", "(", 5, "+", 6 ")"........를 바꾸는 것입니다. 1 + 2-4 + (5 + 6) .....

좋은 방법으로 어떻게 구현할 수 있습니까?

+0

당신이 우선 순위와 중첩, 또는 임의의 길이 식을 지원해야합니까를? –

+0

예, 그것이 제 문제입니다. –

+1

그래, @ 디스트로이의 해결책은 기본 솔버에서는 괜찮지 만, 더 복잡한 식의 경우에는 적절한 식 토크 나이저와 파서가 필요하다. (또는 입력을 신뢰할 수 있다면 eval을 사용한다.) –

답변

4

글쎄, 당신은 eval를 사용할 수 있지만, 당신은 단순히이 할 수 있습니다 : 당신은 쉽게 다른 사업자와 funcs지도를 확장 할 수 있습니다

var funcs = { 
     '+': function(a,b){ return a+b }, 
     '-': function(a,b){ return a-b } 
    }; 
    function calc(a,b,c, op1,op2){ 
     return funcs[op2](funcs[op1](a, b), c); 
    } 

.

+0

나는 이보다 더 좋은 해결책이 있다고 생각한다. 하나. 나는 그것을 검사하지는 않았지만 그것을 표면적으로 보았을 때, 문자열 기반의 수학적 형태를 실제 수학적 형태로 바꾸려고 노력했습니다. 너 너무 길지 않니? 내 순진한 마음에서 나온 생각. –

+0

이것은 운영자 우선 순위를 올바르게 처리하지 않습니다. –

+0

예, 그렇지 않습니다. 그게 내가 생각한거야. –

1

난 정말이 특정 사건에 대한 eval을 사용하는 것이 좋습니다 것입니다 :

eval("var res = " + 1 + "+" + 2 + "-" + 4 + "+" + "(" + 5 + "+" + 6 + ")"); 
console.log(res); //10 

가 나는, 나 알고있다 알고있다, everone가 가능한 당신이 eval를 방지해야한다고 말했습니다. 그리고 그들은 옳다. eval은 큰 힘을 가지고 있으며 특히 최종 사용자가 입력 한 무언가를 평가할 때만 큰 책임을 가지고 사용해야합니다. 하지만 신중하다면 eval을 사용해도됩니다.

+0

그러나 'eval'은 _extremely_ slow입니다. –

+0

@JanDvorak : 코드 작성이 완료되는 데 수년이 걸릴 것입니다. – georg

+0

@ thg435 매우 자주하는 경우 완료하는 데 몇 년이 걸릴 수 있습니다 (단지 몇 시간 또는 며칠이 아닌). –

1

이 매우 빠르게 수행되었지만, 트릭 (JSFiddle here) 수행해야합니다

function executeMath() { 
    if (arguments.length % 2 === 0) return null; 
    var initialLength = arguments.length, 
     numberIndex = (initialLength + 1)/2, 
     numbers = Array.prototype.splice.call(arguments, 0, numberIndex), 
     operands = Array.prototype.splice.call(arguments, 0), 
     joiner = new Array(arguments.length); 
    for (var i = 0; i < numbers.length; i++) { 
     joiner[i*2] = numbers[i]; 
    } 
    for (var i = 0; i < operands.length; i++) { 
     joiner[1+(i*2)] = operands[i]; 
    } 
    var command = ("return (" + joiner.join('') + ");"), 
     execute = new Function(command); 
    console.log(command); 
    return execute(); 
} 
console.log(executeMath(2, 3, 4, 5, "/", "+", "%"));