Не работает калькулятор на 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>, и желательно в самом начале.