2

我正在研究“方程式计算器”,但有一些问题。我现在可以插入我的等式,但我希望它是数字,而不仅仅是数字:我希望所有的 '+' 、 '-' 、 '*' 和 '/' '做正确的事。

所以这是我到目前为止的代码:


var ligning = prompt("Insert your equation here:");
var newLigning = ligning.split("=");
var sideOne = parseInt(newLigning[0],10);
var sideTwo = parseInt(newLigning[1],10);
var calculator = function() {

};
alert(sideOne);
alert(sideTwo);

具体来说,这里举个例子:

'1 + 2 = 3' 应该提醒 3,然后再次提醒 3(因为底部有两个警报) - 我该怎么做?

4

3 回答 3

1

代替 :

var sideOne = parseInt(newLigning[0],10);

你可能想要这样的东西:

var sideOne = performMath(newLining[0],10);

在哪里 :

function performMath(equation) {
    //CODE HERE
}

performMath可以通过几种方式完成。您需要拆分方程并获得 2 之间的数字和方程。这可以递归完成!

我认为这可能是一个很好的起点。

编辑

对于这个问题,如果您开始考虑操作优先级 (PEDMAS),这将是一项稍微困难的任务。方法是相同的,performMath需要稍微复杂一些。在这种情况下,我会为数字推荐某种数组结构,为方程推荐另一种数组结构。

编辑 2

Paul S在开始之前对字符串进行消毒也是一个很好的点。您不能假设有人会输入方程式。Rich Cook 在编程时说:

“今天的编程是软件工程师努力构建更大更好的防白痴程序与宇宙试图产生更大更好的白痴之间的竞赛。到目前为止,宇宙正在获胜。”

编辑 3

这个小代码片段应该有点帮助......无论如何这可能不是最有效的代码......

var equation = "1+22-3";
var operators = "+-*\/"

var currentNumber = "";
var numbers = new Array();
var operatorArray = new Array();
for(var i=0; i<equation.length; i++) {
  var currentChar = equation.charAt(i);
  if(operators.indexOf(currentChar) != -1) {
    operatorArray[operatorArray.length] = (currentChar);
    numbers[numbers.length] = (currentNumber);
    currentNumber = "";
  } else {
    currentNumber = currentNumber + currentChar;
    alert(currentNumber);
  }
}
numbers[numbers.length] = currentNumber;
alert("numbers : " + numbers);
alert("operators : " + operatorArray);

现在您所要做的就是遍历数组并执行正确的操作。

于 2013-01-09T18:46:09.480 回答
1

eval真的很糟糕而且很容易被滥用,但是如果你知道你只接受数字和特定的运算符,那么你也可以做一些字符串清理,让它更安全一些

var ligning = prompt("Insert your equation here:"),
    newLigning = ligning.split("="),
    lhs = newLigning[0],
    rhs = newLigning[1];

function calculate(expr) {
    var s;
    expr = expr.replace(/[^\d*/()+-]/g, ''); // remove everything except permitted
    if (expr !== (s = expr.replace(/^[*/]*|[*/+-]*$/g, ''))) {
        expr = s; // don't allow * or / at the ends
        console.warn('Removing invalid operators');
    };
    return +eval(expr || 0); // + implicit converts to number
};

console.log(lhs = calculate(lhs), rhs = calculate(rhs), lhs === rhs);
于 2013-01-09T18:50:43.980 回答
0
alert ( eval(newLigning[0]) );
alert ( eval(newLigning[1]) );
于 2013-01-09T18:45:02.460 回答