Вопрос или проблема
Я ищу помощь в прохождении теста 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();
};
Пояснения к изменениям:
-
Обработка последнего оператора: Если предыдущий ввод был оператором (
lastInputWasOperator
), и новый оператор не является знаком отрицания, то мы просто заменяем последний оператор на новый, путем обновления переменнойexpression
. Это решает проблему с вводом нескольких операторов подряд. -
Логика для знака отрицания: При одновременном вводе знака
-
, мы проверяем, что текущий ввод является либо "0", либо уже оператором. Если это так, мы управляющим образом переключаем текущий ввод между "0" и "-". -
Обновление выражения: Перед добавлением нового оператора в выражение, мы проверяем, если введенный символ не является знаком отрицания, и при необходимости корректируем выражение.
Тестирование
После внесения изменений, протестируйте калькулятор снова, чтобы убедиться, что все ситуации с вводом подряд идущих операторов были учтены и работают корректно. Убедитесь, что все оставшиеся тесты также проходят, после чего ваш калькулятор должен быть полностью работоспособен.
Если у вас возникли дополнительные вопросы или сложности, не стесняйтесь задавать их!