尝试使用JavaScript制作计算器,但不要';我不知道如何定义案例

尝试使用JavaScript制作计算器,但不要';我不知道如何定义案例,javascript,calculator,Javascript,Calculator,如何获取number2中number1中的数字和symbol1 symbol2中的符号,以及如何设置第一个输入不应为运算符或如果多个运算符返回错误等条件?我是第一次发帖,如果看起来不干净,请原谅 以下是我的js: 这是我指定的onclick: function clearCalculator() { document.querySelector("#result").value = ''; } function printInteger(inputFromCalculator

如何获取number2中number1中的数字和symbol1 symbol2中的符号,以及如何设置第一个输入不应为运算符或如果多个运算符返回错误等条件?我是第一次发帖,如果看起来不干净,请原谅

以下是我的js: 这是我指定的onclick:

function clearCalculator()
  {
   document.querySelector("#result").value = '';
  }

  function printInteger(inputFromCalculator)
  {
    document.querySelector("#result").value += inputFromCalculator;
  }

  function printSymbol(inputFromCalculator)
  {
    document.querySelector("#result").value += inputFromCalculator;
  }

  function printFinalOutput()
  {

    var expression = document.querySelector("#result").value;

    expression+="=";
    //expression 22+32+22=

    if(sanityCheck(expression)==true)
    {
      divideAndConquer(expression);


    }

  }
在这里,我尝试将整数放在变量number1和number2中,并将运算符放在变量symbol1和symbol2中:

  function divideAndConquer(expression)
  {
    var number1;
    var number2;
    var symbol1;
    var symbol2;
    var miniExpressionLength;
    var partialOutput;
    for(var i=0;i<expression.length;i++)
        {
          if(isNumber(expression[i])==true && number1==null)
          { 
            number1=expression[i];
//logs number1 as single string

          }
          else
          {
            if(isNumber(expression[i])==true && number1!=null && symbol1==null)
            {
              number1 = number1 + expression[i];
            }

          }

          if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2==null)
          {
            number2 = expression[i];

          }
          else
          {
            if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2!=null && symbol2==null)
            {
              number2 = number2 + expression[i];
            }
          }


          if(isSymbol(expression[i])==true && symbol1==null)
          {
            symbol1=expression[i];
          }
          else
          {
            if(isSymbol(expression[i])==true && symbol1!=null)
            {
              symbol2=expression[i];
            }
          }if(symbol2!=null)
          {
            miniExpressionLength = i;
            //console.log("length of mini expression ="+i)
            break;
          }
        }

       partialOutput = calculate(number1,number2,symbol1);
       expression =  partialOutput+""+expression.substring(miniExpressionLength,expression.length);

      if(symbol1!=null)
      {
        divideAndConquer(expression);
      }
      else
      {
        console.log("expression ="+expression);
         return expression;
      }



  }
函数divideAndConquer(表达式)
{
变量1;
var数2;
变量symbol1;
var-symbol2;
var最小表达长度;
var部分输出;

for(var i=0;i解析数学表达式不是一项简单的任务,超出了答案的范围。有几个库提供解析。 如果您想出于学习目的这样做,您应该看看:

  • 反向波兰符号
  • 抽象语法树
  • 调车场算法
例如,这里有一篇很好的博客文章可以帮助您开始:

首先,请注意,在“if语句”中,如果结果已经是布尔值,则无需使用“=”

您可以直接使用以下表达式:

if(!isNumber(expression[0])) {
注意句子开头的“!”(非门), 如果结果已经为false,则将通过

我强烈建议您使用ES6阵列功能。

卫生检查条件:

  • 第一个字符必须是数字
  • 之后,它必须遵循顺序符号编号符号编号
  • 因此,您可以使用如下正则表达式:

    ^\d+([+\-\/\*]\d+)+$
    
    (在这里自己测试)

    注意:这只适用于整数

    function sanityCheck(expression)
    {
        const sanityExpresion = /^\d+([+\-\/\*]\d+)+$/
        return sanityExpresion.test(expression);
    }
    
    您可以对divideAndConquer函数执行如下操作:

    function divideAndConquer(expresion) {
        const symbolSeparation = /[+\-\/\*]/
        const numberSeparation = /\d/
    
        const numbers = expresion.split(symbolSeparation);
    
        // filter where symbol !== “”
        const  symbols = expresion.split(numberSeparation).filter(s => s);
    
        // So I get the first number and removed from the array
        let result = numbers.shift();
    
        // Here I use an array function
        symbols.forEach(operator => {
            const topNumber = numbers.shift();
            result = eval(result + operator + topNumber);
        })
    
        return result;
    }
    
    如果仅使用评估,则情况相同:

    function divideAndConquer(expresion) {
        return eval(expresion)
    }
    
    但是我认为您需要在代码中多做一些操作来练习,所以祝您好运

    function divideAndConquer(expresion) {
        const symbolSeparation = /[+\-\/\*]/
        const numberSeparation = /\d/
    
        const numbers = expresion.split(symbolSeparation);
    
        // filter where symbol !== “”
        const  symbols = expresion.split(numberSeparation).filter(s => s);
    
        // So I get the first number and removed from the array
        let result = numbers.shift();
    
        // Here I use an array function
        symbols.forEach(operator => {
            const topNumber = numbers.shift();
            result = eval(result + operator + topNumber);
        })
    
        return result;
    }
    
    function divideAndConquer(expresion) {
        return eval(expresion)
    }