[英]Why is javascript skipping the last part of the math string?
用户输入一个数学问题,该问题将回答它。 我的代码适用于所有1部分问题,例如“ 1 + 1”和“ 4 * 5”。 但是之后,它会跳过问题的最后一部分。 例如,“ 1 + 1 + 1”输出2和“ 1 + 1 + 1 + 1”输出3和“ 4 * 5-6”输出20。我在这里做什么错? 我觉得这很简单,但是我尝试了一些事情。
相关代码:
function scan(i) {
"use strict";
var num,
schar = "",
strnum = "",
scanarray = [];
for (i; i <= input.length; i++ ) {
schar = input.charAt(i);
if (isoperator(schar)) {
break;
}
strnum = strnum + schar;
}
if (strnum !== "") { num = Number(strnum); }
scanarray[0] = schar;
scanarray[1] = i;
scanarray[2] = num;
return scanarray;
}
for (i; i <= input.length; i) {
scanarray = scan(i + 1);
schar = scanarray[0];
i = scanarray[1];
num = scanarray[2];
if (schar1 !== "") {
switch(schar1)
{
case "+":
answer = num1 + num;
break;
case "-":
answer = num1 - num;
break;
case "*":
answer = num1 * num;
break;
case "/":
case "÷":
answer = num1 / num;
break;
}
schar1 = "";
} else {
switch(schar)
{
case "+":
answer = answer + num;
break;
case "-":
answer = answer - num;
break;
case "*":
answer = answer * num;
break;
case "/":
case "÷":
answer = answer / num;
break;
}
}
}
我尝试将扫描函数中的for循环更改为“ i <= input.length + 1”,然后将计算函数中的for循环更改为相同,并且尝试更改两者,但均无效果。 任何帮助是极大的赞赏!
这是对代码的非常幼稚的重新实现,它至少应该使您朝着实现目标的更惯用Javascript的方式前进,而不是像这样相对不易理解的C类方法来逐步遍历输入的每个字符。 我想可以辩称,各种正则表达式也很难阅读,但是它们以简洁的方式弥补了这一点,这反过来又有助于实现可维护性,我认为您的代码无法按预期方式工作的原因是可维护性问题。
console.log(" 44 * 5 - 6 / 2 + 4 =", performMath(" 44 * 5 - 6 / 2 + 4")); console.log("4*5-2 =", performMath("4*5-2")); function performMath(input) { var output, operands, operators; input = input.replace(/\\s+/g, ''); if (input.match(/\\d+([\\*-]\\d+)*/g)) { operands = input.split(/[-\\*\\/\\+]/); operators = input.split(/\\d+/).filter(function(i) { return i }); for (var i = 0, n = operators.length; i < n; i++) { output = output || operands[0]; eval("output=output" + operators[i] + operands[i + 1]); } } return output; }
这是一种避免使用eval并正确遵循操作顺序的方法。 诀窍是首先照顾乘法和除法(从左到右),然后处理加法和减法(从左到右)。 如果您想变得更高级,那么您可能需要研究诸如Shunting Yard Algorithm之类的算法 。
console.log(" 44 * 5 - 6 / 2 + 4 =", performMath(" 44 * 5 - 6 / 2 + 4")); console.log("4*5-2 =", performMath("4*5-2")); function performMath(input) { input = input.replace(/\\s+/g,''); input = input.replace(/\\d+[*/]\\d+/g,performMult); while ( /[+-]/.test(input) ) { input = input.replace(/^(\\d+)([+-])(\\d+)/,oneOper); } return input; } function performMult(input) { while ( /[*/]/.test(input) ) { input = input.replace(/^(\\d+)([*/])(\\d+)/,oneOper); } return input; } function oneOper(m,p1,p2,p3) { switch (p2) { case '+': return +p1 + +p3; case '-': return +p1 - +p3; case '*': return +p1 * +p3; case '/': return +p1 / +p3; } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.