Сдача теста по JavaScript №13 в моем калькуляторе JavaScript

Вопрос или проблема

Я ищу помощь в прохождении теста JavaScript #13 в моем проекте JavaScript калькулятора. Вы можете увидеть мою работу здесь: CodePen. Тест можно запустить в CodePen для JavaScript калькулятора.

13. Если 2 или более оператора вводятся подряд, выполняемой операцией должен быть последний введенный оператор (исключая отрицательный (-) знак).

document.addEventListener("DOMContentLoaded", () => {
  let currentInput = "0";
  let previousInput = "";
  let operator = null;
  let justEvaluated = false;
  let expression = "";
  let lastInputWasOperator = false;

  const display = document.getElementById("display");
  const numbers = document.querySelectorAll(".number");
  const operators = document.querySelectorAll(".operator");
  const decimalButton = document.getElementById("decimal");

  const clearDisplay = () => {
    currentInput = "0";
    previousInput = "";
    justEvaluated = false;
    expression = "";
    lastInputWasOperator = false;
    updateDisplay();
  };

  const updateDisplay = () => {
    display.innerText = currentInput;
  };

  const handleNumberClick = (e) => {
    const value = e.target.innerText;

    if (justEvaluated) {
      currentInput = value;
      justEvaluated = false;
    } else {
      if (currentInput === "0" && value !== "0") {
        currentInput = value;
      } else if (currentInput !== "0") {
        currentInput += value;
      }
    }

    lastInputWasOperator = false;
    updateDisplay();
  };

  const handleDecimalClick = () => {
    if (!currentInput.includes(".")) {
      currentInput += ".";
      updateDisplay();
    }
  };

  const handleOperatorClick = (e) => {
    const value = e.target.innerText;

    if (justEvaluated) {
      previousInput = currentInput;
      justEvaluated = false;
      expression = "";
    }

    if (value === "-" && (currentInput === "0" || lastInputWasOperator)) {
      currentInput = currentInput === "-" ? "0" : "-";
      lastInputWasOperator = false;
      updateDisplay();
      return;
    }

    if (lastInputWasOperator) {
      if (value !== "-" && operator !== null) {
        operator = value;
        expression = expression.slice(0, -1) + operator;
      }
      return;
    } else {
      if (previousInput === "") {
        previousInput = currentInput;
      } else {
        handleEquals();
        previousInput = currentInput;
      }

      expression += currentInput + value;
      operator = value;
      currentInput = "0";
    }

    lastInputWasOperator = true;
    updateDisplay();
  };

  const handleEquals = () => {
    if (currentInput === "") return;

    expression += currentInput;

    try {
      expression = expression.replace(
        /([-+*/]){2,}/g,
        (match) => match[match.length - 1]
      );

      if (/^[*/]/.test(expression)) {
        expression = expression.substring(1);
      }

      currentInput = eval(expression).toString();

      currentInput = parseFloat(currentInput)
        .toFixed(4)
        .replace(/\.?0+$/, "");

      expression = "";
      operator = null;
      previousInput = "";
      justEvaluated = true;
    } catch (e) {
      currentInput = "Ошибка";
    }

    if (isNaN(currentInput)) {
      currentInput = "Ошибка";
    }

    updateDisplay();
  };

  numbers.forEach((button) => {
    button.addEventListener("click", handleNumberClick);
  });

  operators.forEach((button) => {
    button.addEventListener("click", handleOperatorClick);
  });

  decimalButton.addEventListener("click", handleDecimalClick);

  document.getElementById("equals").addEventListener("click", handleEquals);
  document.getElementById("clear").addEventListener("click", clearDisplay);
});

Я пробовал несколько подходов для обработки отрицательных чисел, но у меня все еще не проходит один тест. В настоящее время я прохожу 15 из 16 тестов и очень признателен за любые рекомендации или решения, которые могут помочь мне пройти последний тест!

Ответ или решение

Для успешного прохождения теста JavaScript #13 вашего калькулятора, необходимо внести изменения в логику обработки операторов таким образом, чтобы при вводе двух или более подряд идущих операторов, учитывался только последний введенный оператор (исключая знак отрицания).

Вот обновленный код функции handleOperatorClick, который можно вставить в ваш существующий код:

const handleOperatorClick = (e) => {
    const value = e.target.innerText;

    if (justEvaluated) {
        previousInput = currentInput;
        justEvaluated = false;
        expression = "";
    }

    // Обработка знака "-".
    if (value === "-" && (currentInput === "0" || lastInputWasOperator)) {
        currentInput = currentInput === "-" ? "0" : "-";
        lastInputWasOperator = false;
        updateDisplay();
        return;
    }

    // Логика для обработки нескольких операторов подряд
    if (lastInputWasOperator) {
        if (value !== "-") {
            operator = value; // Присваиваем новый оператор
            expression = expression.slice(0, -1) + operator; // Заменяем последний оператор
        }
        return;
    } else {
        if (previousInput === "") {
            previousInput = currentInput;
        } else {
            handleEquals();
            previousInput = currentInput;
        }

        expression += currentInput + value;
        operator = value;
        currentInput = "0";
    }

    lastInputWasOperator = true;
    updateDisplay();
};

Пояснения к изменениям:

  1. Обработка последнего оператора: Если предыдущий ввод был оператором (lastInputWasOperator), и новый оператор не является знаком отрицания, то мы просто заменяем последний оператор на новый, путем обновления переменной expression. Это решает проблему с вводом нескольких операторов подряд.

  2. Логика для знака отрицания: При одновременном вводе знака -, мы проверяем, что текущий ввод является либо "0", либо уже оператором. Если это так, мы управляющим образом переключаем текущий ввод между "0" и "-".

  3. Обновление выражения: Перед добавлением нового оператора в выражение, мы проверяем, если введенный символ не является знаком отрицания, и при необходимости корректируем выражение.

Тестирование

После внесения изменений, протестируйте калькулятор снова, чтобы убедиться, что все ситуации с вводом подряд идущих операторов были учтены и работают корректно. Убедитесь, что все оставшиеся тесты также проходят, после чего ваш калькулятор должен быть полностью работоспособен.

Если у вас возникли дополнительные вопросы или сложности, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...