Не работает калькулятор на JS. Помогите, пожалуйста

Только начал изучать javascript. Решил сделать калькулятор. Интерфейс такой, как мне нужен, но сам калькулятор не работоспособный. Буду признателен за помощь!

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <meta charset="utf-8">
                           
  <div>
    <div>
            <input id="input" type="text" placeholder="Результат" readonly>
        </div>

        <div>
      <button onclick="n('1')" id="n1"> 1 </button>
      <button onclick="n('2')" id="n2"> 2 </button>
      <button onclick="n('3')" id="n3"> 3 </button>
      <button onclick="n('+')" id="plus"> + </button>
      <button onclick="n('sin')" id="sin"> sin </button><br>
      </div>

      <div>
      <button onclick="n('4')" id="n4"> 4 </button>
      <button onclick="n('5')" id="n5"> 5 </button>
      <button onclick="n('6')" id="n6"> 6 </button>
      <button onclick="n('-')" id="minus"> - </button>
      <button onclick="n('cos')" id="cos"> cos </button><br>
      </div>

      <div>
      <button onclick="n('7')" id="n7"> 7 </button>
      <button onclick="n('8')" id="n8"> 8 </button>
      <button onclick="n('9')" id="n9"> 9 </button>
      <button onclick="n('*')" id="mult"> * </button>
      <button onclick="n('%')" id="hz"> % </button><br>
      </div>

      <div>
      <button onclick="n('-')" id="min">-</button>
      <button onclick="n('0')" id="n0"> 0 </button>
      <button onclick="n('.')" id="tck"> . </button>
      <button onclick="n('/')" id="del"> / </button>
      <button onclick="calculate()" id="ravno"> = </button><br>
      </div>
    
  </div>

  <script>

    let res = [];

    function updateScreen() {
          let screen = document.getElementById('input');
          screen.value = res.join('');
    }

    function n(a) {

      res.push(a);
      updateScreen();
    }

    function isNum(value) {
    return !isNaN(parseFloat(value)) && isFinite(value);
  
    function calculate() {
          let result = 0;
          let stack = [];

          for (let i=0; i<res.length; i++) {
            let token = res[i];

            if (isNumeric(token)) {
                stack.push(parseFloat(token));
            } else if (token === '+') {
                var operand2 = stack.pop();
                var operand1 = stack.pop();
                stack.push(operand1 + operand2);
            } else if (token === '-') {
                var operand2 = stack.pop();
                var operand1 = stack.pop();
                stack.push(operand1 - operand2);
            } else if (token === '*') {
                var operand2 = stack.pop();
                var operand1 = stack.pop();
                stack.push(operand1 * operand2);
            } else if (token === '/') {
                var operand2 = stack.pop();
                var operand1 = stack.pop();
                stack.push(operand1 / operand2);
            } else if (token === 'sin') {
                var operand = stack.pop();
                stack.push(Math.sin(operand));
            } else if (token === 'cos') {
                var operand = stack.pop();
                stack.push(Math.cos(operand));
            }
        }

        if (stack.length > 0) {
            result = stack.pop();
        }

        res = [result]
    }
          

  </script>

  </body>
</html>


Ответы (1 шт):

Автор решения: De.Minov

Используйте VSC или какой-нибудь другой редактор кода, который имеет подсветку синтаксиса, а так же сможет сообщить об ошибках.

В сниппите я указал комментарий где пропущена закрывающая фигурная скобка.

let res = [];

function updateScreen() {
  let screen = document.getElementById('input');
  screen.value = res.join('');
}

function n(a) {

  res.push(a);
  updateScreen();
}

function isNum(value) {
  return !isNaN(parseFloat(value)) && isFinite(value);
} // Вот эта скобка была пропущена

function calculate() {
  let result = 0;
  let stack = [];

  for (let i = 0; i < res.length; i++) {
    let token = res[i];

    if (isNumeric(token)) {
      stack.push(parseFloat(token));
    } else if (token === '+') {
      var operand2 = stack.pop();
      var operand1 = stack.pop();
      stack.push(operand1 + operand2);
    } else if (token === '-') {
      var operand2 = stack.pop();
      var operand1 = stack.pop();
      stack.push(operand1 - operand2);
    } else if (token === '*') {
      var operand2 = stack.pop();
      var operand1 = stack.pop();
      stack.push(operand1 * operand2);
    } else if (token === '/') {
      var operand2 = stack.pop();
      var operand1 = stack.pop();
      stack.push(operand1 / operand2);
    } else if (token === 'sin') {
      var operand = stack.pop();
      stack.push(Math.sin(operand));
    } else if (token === 'cos') {
      var operand = stack.pop();
      stack.push(Math.cos(operand));
    }
  }

  if (stack.length > 0) {
    result = stack.pop();
  }

  res = [result]
}
<div>
  <div>
    <input id="input" type="text" placeholder="Результат" readonly>
  </div>

  <div>
    <button onclick="n('1')" id="n1"> 1 </button>
    <button onclick="n('2')" id="n2"> 2 </button>
    <button onclick="n('3')" id="n3"> 3 </button>
    <button onclick="n('+')" id="plus"> + </button>
    <button onclick="n('sin')" id="sin"> sin </button><br>
  </div>

  <div>
    <button onclick="n('4')" id="n4"> 4 </button>
    <button onclick="n('5')" id="n5"> 5 </button>
    <button onclick="n('6')" id="n6"> 6 </button>
    <button onclick="n('-')" id="minus"> - </button>
    <button onclick="n('cos')" id="cos"> cos </button><br>
  </div>

  <div>
    <button onclick="n('7')" id="n7"> 7 </button>
    <button onclick="n('8')" id="n8"> 8 </button>
    <button onclick="n('9')" id="n9"> 9 </button>
    <button onclick="n('*')" id="mult"> * </button>
    <button onclick="n('%')" id="hz"> % </button><br>
  </div>

  <div>
    <button onclick="n('-')" id="min">-</button>
    <button onclick="n('0')" id="n0"> 0 </button>
    <button onclick="n('.')" id="tck"> . </button>
    <button onclick="n('/')" id="del"> / </button>
    <button onclick="calculate()" id="ravno"> = </button><br>
  </div>

</div>


К слову, HTML-тег <meta> должен быть размещён в <head>, и желательно в самом начале.

→ Ссылка