繁体   English   中英

为什么javascript跳过数学字符串的最后一部分?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM