js计算器撤销怎么写

js计算器撤销怎么写

在 JavaScript 中实现计算器的撤销功能,可以使用以下几种方法:保存操作历史、利用栈数据结构、或者实现特定的撤销逻辑。 其中,利用栈数据结构是一种常见且高效的方法。你可以通过将每一次操作保存到栈中,当需要撤销时,从栈中弹出最后一次操作并恢复之前的状态。下面,我们将详细介绍如何使用栈数据结构来实现这一功能。

一、基础结构与初始化

在开始实现撤销功能之前,我们需要先构建一个基本的计算器结构,包括HTML和基本的JavaScript逻辑。以下是一个简单的示例:

<!DOCTYPE html>

<html>

<head>

<title>Simple Calculator</title>

<style>

/* 简单的样式 */

.calculator { width: 200px; }

.calculator input { width: 100%; height: 50px; text-align: right; }

.calculator button { width: 25%; height: 50px; }

</style>

</head>

<body>

<div class="calculator">

<input type="text" id="display" disabled>

<div>

<button onclick="appendNumber('1')">1</button>

<button onclick="appendNumber('2')">2</button>

<button onclick="appendNumber('3')">3</button>

<button onclick="operation('+')">+</button>

</div>

<div>

<button onclick="appendNumber('4')">4</button>

<button onclick="appendNumber('5')">5</button>

<button onclick="appendNumber('6')">6</button>

<button onclick="operation('-')">-</button>

</div>

<div>

<button onclick="appendNumber('7')">7</button>

<button onclick="appendNumber('8')">8</button>

<button onclick="appendNumber('9')">9</button>

<button onclick="operation('*')">*</button>

</div>

<div>

<button onclick="appendNumber('0')">0</button>

<button onclick="clearDisplay()">C</button>

<button onclick="calculate()">=</button>

<button onclick="operation('/')">/</button>

</div>

<div>

<button onclick="undo()">Undo</button>

</div>

</div>

<script src="calculator.js"></script>

</body>

</html>

二、实现基本计算功能

接下来,我们编写 calculator.js 文件,实现基本的计算功能,包括数字输入、操作符输入、计算结果和清除显示。

let currentInput = '';

let operator = '';

let previousInput = '';

let historyStack = [];

function appendNumber(number) {

currentInput += number;

document.getElementById('display').value = currentInput;

}

function operation(op) {

if (currentInput === '') return;

previousInput = currentInput;

currentInput = '';

operator = op;

document.getElementById('display').value = '';

}

function calculate() {

if (previousInput === '' || currentInput === '') return;

let result;

switch (operator) {

case '+':

result = parseFloat(previousInput) + parseFloat(currentInput);

break;

case '-':

result = parseFloat(previousInput) - parseFloat(currentInput);

break;

case '*':

result = parseFloat(previousInput) * parseFloat(currentInput);

break;

case '/':

result = parseFloat(previousInput) / parseFloat(currentInput);

break;

}

historyStack.push({ previousInput, operator, currentInput, result });

currentInput = result;

operator = '';

previousInput = '';

document.getElementById('display').value = result;

}

function clearDisplay() {

currentInput = '';

operator = '';

previousInput = '';

document.getElementById('display').value = '';

}

三、实现撤销功能

为了实现撤销功能,我们需要在每次操作时将操作记录保存到 historyStack 栈中。当用户点击撤销按钮时,从栈中弹出最后一次操作,并恢复计算器的状态。

function undo() {

if (historyStack.length === 0) return;

const lastOperation = historyStack.pop();

previousInput = lastOperation.previousInput;

operator = lastOperation.operator;

currentInput = lastOperation.currentInput;

document.getElementById('display').value = previousInput;

}

四、优化撤销功能

为了更好地用户体验,我们可以在每次操作时更详细地记录状态,并在撤销时恢复所有的状态。

function appendNumber(number) {

currentInput += number;

document.getElementById('display').value = currentInput;

saveState();

}

function operation(op) {

if (currentInput === '') return;

previousInput = currentInput;

currentInput = '';

operator = op;

document.getElementById('display').value = '';

saveState();

}

function calculate() {

if (previousInput === '' || currentInput === '') return;

let result;

switch (operator) {

case '+':

result = parseFloat(previousInput) + parseFloat(currentInput);

break;

case '-':

result = parseFloat(previousInput) - parseFloat(currentInput);

break;

case '*':

result = parseFloat(previousInput) * parseFloat(currentInput);

break;

case '/':

result = parseFloat(previousInput) / parseFloat(currentInput);

break;

}

saveState();

currentInput = result;

operator = '';

previousInput = '';

document.getElementById('display').value = result;

}

function clearDisplay() {

currentInput = '';

operator = '';

previousInput = '';

document.getElementById('display').value = '';

saveState();

}

function saveState() {

historyStack.push({

previousInput,

operator,

currentInput,

displayValue: document.getElementById('display').value

});

}

function undo() {

if (historyStack.length === 0) return;

const lastState = historyStack.pop();

previousInput = lastState.previousInput;

operator = lastState.operator;

currentInput = lastState.currentInput;

document.getElementById('display').value = lastState.displayValue;

}

五、总结

通过上述方法,我们成功实现了一个具有撤销功能的简单计算器。使用栈数据结构保存操作历史、在每次操作时记录状态、在撤销时恢复状态,这些都是实现撤销功能的关键步骤。如果你有更复杂的需求,可以在此基础上进一步扩展和优化。无论是简单的计算器还是复杂的项目管理系统,撤销功能都可以显著提高用户体验和操作安全性。

相关问答FAQs:

1. 如何在JavaScript计算器中实现撤销功能?

  • 问题:我在JavaScript计算器中输入了错误的数字,但是不知道如何撤销。请问如何实现撤销功能?
  • 回答:要实现撤销功能,你可以考虑使用一个数组来保存用户输入的操作记录。当用户点击撤销按钮时,你可以从数组中取出上一次的操作,并重新计算结果。这样用户就可以撤销之前的输入错误了。

2. 在JavaScript计算器中,如何撤销多次操作?

  • 问题:我在使用JavaScript计算器时,不小心连续输入了多个错误的数字,我想撤销所有的操作。有没有一种简单的方法来实现这个功能?
  • 回答:为了撤销多次操作,你可以使用一个栈(stack)来保存用户的操作记录。每当用户进行一次操作,你就将该操作压入栈中。当用户点击撤销按钮时,你可以从栈中依次弹出操作,重新计算结果。这样就可以撤销多次操作了。

3. 是否可以在JavaScript计算器中实现恢复功能?

  • 问题:我在使用JavaScript计算器时,不小心撤销了一个正确的操作,我希望能够恢复它。有没有一种方法来实现恢复功能呢?
  • 回答:实现恢复功能也是可行的。你可以使用另一个栈来保存撤销的操作记录。当用户点击恢复按钮时,你可以从恢复栈中取出最近一次撤销的操作,并重新计算结果。这样用户就可以恢复之前撤销的操作了。记得要在用户进行新的操作时清空恢复栈,以保证恢复功能的正确性。

文章包含AI辅助创作,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/3862052

赞 (0)
Edit2Edit2
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部