Resultados errados na calculadora
Olá pessoal, estou fazendo uma calculadora em Html, css e Javascript, consegui implementar o código. Mas os resultados vem completamente aleatórios, como por exemplo: 8 x 2 = 64. Estou confusa sobre o que pode estar dando errado.
HTML:
JAVASCRIPT:
HTML:
<!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style.css" /> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Rubik&display=swap" rel="stylesheet"> <script src="/calculo.js" defer></script> <title>Calculadora</title> </head> <body> <div id="calculator"> <div id="calc"> <div id="last-calc"></div> <div id="result"> <img src="./assets/equals.svg" alt="sinal de igual"> <span id="resul-screen">0</span> </div> </div> <div id="keyboard"> <button class="secondary" data-action="cancelEntry">CE</button> <button data-action="clear">C</button> <button data-action="%">%</button> <button class="tertiary" data-action="/">/</button> <button>7</button> <button>8</button> <button>9</button> <button class="tertiary" data-action="x">X</button> <button>4</button> <button>5</button> <button>6</button> <button class="tertiary" data-action="-">-</button> <button>1</button> <button>2</button> <button>3</button> <button class="tertiary" data-action="+">+</button> <button data-action="plusMinus"><img src="./assets/plusMinus.svg" alt="simbolo de mais sobre menos"></button> <button>0</button> <button data-action="decimal">.</button> <button class="quartiary" data-action="calculate">=</button> </div> </div> </body> </html>
JAVASCRIPT:
const calculator = document.querySelector(''#calculator'') const keys = calculator.querySelector(''#keyboard'') const displayPress = document.querySelector(''#last-calc'') const display = document.querySelector(''#resul-screen'') keys.addEventListener(''click'', e => { if (e.target.matches(''button'')) { const key = e.target const action = key.dataset.action const keyContent = key.textContent const displayedNum = displayPress.textContent const calculate = (n1, operator, n2) => { const firstNum = parseFloat(n1) const secondNum = parseFloat(n2) switch (operator) { case ''+'': return firstNum + secondNum case ''-'': return firstNum - secondNum case ''x'': return firstNum * secondNum case ''/'': return firstNum / secondNum case ''%'': return firstNum * (secondNum / 100) default: return null } } const previousKeyType = calculator.dataset.previousKeyType if (!action) { if ( displayedNum === ''0'' || previousKeyType === ''operator'' || previousKeyType === ''calculate'' ) { displayPress.textContent = keyContent } else { displayPress.textContent = displayedNum + keyContent } calculator.dataset.previousKeyType = ''number'' } if ( action === ''-'' || action === ''+'' || action === ''x'' || action === ''/'' || action === ''%'' || action === ''plusMinus'' ) { const firstValue = calculator.dataset.firstValue const operator = calculator.dataset.operator const secondValue = displayedNum if (firstValue && operator && previousKeyType !== ''operator'' && previousKeyType !== ''calculate'') { const calcValue = calculate(firstValue, operator, secondValue) display.textContent = calcValue calculator.dataset.firstValue = calcValue } else { calculator.dataset.firstValue = displayedNum } displayPress.textContent = displayedNum + " " + action + " " calculator.dataset.operator = action } if (action === ''decimal'') { if (!displayedNum.includes(''.'')) { displayPress.textContent = displayedNum + ''.'' } else if ( previousKeyType === ''operator'' || previousKeyType === ''calculate'' ) { display.textContent = ''0.'' } calculator.dataset.previousKeyType = ''decimal'' } if (action === ''clear'') { if (key.textContent === ''C'') { calculator.dataset.firstValue = '''' calculator.dataset.modValue = '''' calculator.dataset.operator = '''' calculator.dataset.previousKeyType = '''' } else { key.textContent = ''C'' } display.textContent = 0 displayPress.textContent = 0 calculator.dataset.previousKeyType = ''clear'' } if (action === ''cancelEntry'') { console.log(''cancel Entry!'') } if (action === ''calculate'') { const firstValue = calculator.dataset.firstValue const operator = calculator.dataset.operator const secondValue = displayedNum if (firstValue) { if (previousKeyType === ''calculate'') { firstValue = displayedNum secondValue = calculator.dataset.modValue } display.textContent = calculate(firstValue, operator, secondValue) } calculator.dataset.modValue = secondValue calculator.dataset.previousKeyType = ''calculate'' } } })
Andresa Ribeiro
Curtidas 0
Melhor post
Frank Hosaka
14/02/2023
Ao invés de procurar o erro, encontrei um outro programa que faz o trabalho da calculadora:
fonte: https://github.com/Nomzy-kush/CalculatorJS-Section
[code=xml]
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Calculator</title>
<style>
*, *::before, *::after {box-sizing: border-box;font-family: Gotham Rounded,
sans-serif;font-weight: normal;}
body {margin: 0; padding: 0;
background: linear-gradient(to right, #CBCE91FF, #EA738DFF); }
.calculator-grid {display: grid;justify-content: center;align-content: center;
min-height: 100vh; grid-template-columns: repeat(4, 100px);
grid-template-rows: minmax(120px, auto) repeat(5, 100px);}
.calculator-grid > button {cursor: pointer;font-size: 2rem;
border: 1px, solid #FFFFFF; outline: none; }
.calculator-grid > button:hover {background-color: #a9a9a9;}
.span-two {grid-column: span 2;color: #adf802;
background-color: rgba(139, 0, 139, 0.8);}
.output{grid-column: 1 / -1;background-color: rgba(0, 0, 0, 0.75);
display: flex;align-items: flex-end;justify-content: space-around;
flex-direction: column;padding: 10px;word-wrap: break-word;
word-break: break-all;}
.output .previous-operand{color: rgba(255,255, 255, 0.75);font-size: 1.5rem;}
.output .current-operand{color: white;font-size: 2.5rem;}
</style>
</head>
<body>
<div class="calculator-grid">
<div class="output">
<div data-previous-operand class="previous-operand"></div>
<div data-current-operand class="current-operand"></div></div>
<button data-all-clear class="span-two">AC</button>
<button data-delete>DEL</button>
<button data-operation>÷</button>
<button data-number>1</button>
<button data-number>2</button>
<button data-number>3</button>
<button data-operation>*</button>
<button data-number>4</button>
<button data-number>5</button>
<button data-number>6</button>
<button data-operation>+</button>
<button data-number>7</button>
<button data-number>8</button>
<button data-number>9</button>
<button data-operation>-</button>
<button data-number>.</button>
<button data-number>0</button>
<button data-equals class="span-two">=</button>
</div>
</body>
<script>
class Calculator {
constructor(previousOperandTextElement, currentOperandTextElement) {
this.previousOperandTextElement = previousOperandTextElement
this.currentOperandTextElement = currentOperandTextElement
this.clear()}
clear() {
this.currentOperand = ''
this.previousOperand = ''
this.operation = undefined }
delete() {
this.currentOperand = this.currentOperand.toString().slice(0, -1)}
appendNumber(number) {
if (number === '.' && this.currentOperand.includes('.')) return
this.currentOperand = this.currentOperand.toString() + number.toString()}
chooseOperation(operation) {
if (this.currentOperand === '') return
if (this.previousOperand !== '') {
this.compute()}
this.operation = operation
this.previousOperand = this.currentOperand
this.currentOperand = ''}
compute() {
let computation
const prev = parseFloat(this.previousOperand)
const current = parseFloat(this.currentOperand)
if (isNaN(prev) || isNaN(current)) return
switch (this.operation) {
case '+':
computation = prev + current
break
case '-':
computation = prev - current
break
case '*':
computation = prev * current
break
case '÷':
computation = prev / current
break
default:
return }
this.currentOperand = computation
this.operation = undefined
this.previousOperand = '' }
getDisplayNumber(number) {
const stringNumber = number.toString()
const integerDigits = parseFloat(stringNumber.split('.')[0])
const decimalDigits = stringNumber.split('.')[1]
let integerDisplay
if (isNaN(integerDigits)) {
integerDisplay = '' } else {
integerDisplay = integerDigits.toLocaleString('en', { maximumFractionDigits: 0 }) }
if (decimalDigits != null) {
return `$.$`} else {
return integerDisplay }}
updateDisplay() {
this.currentOperandTextElement.innerText =
this.getDisplayNumber(this.currentOperand)
if (this.operation != null) {
this.previousOperandTextElement.innerText =
`${this.getDisplayNumber(this.previousOperand)} ${this.operation}`
} else {
this.previousOperandTextElement.innerText = ''}}}
const numberButtons = document.querySelectorAll('[data-number]')
const operationButtons = document.querySelectorAll('[data-operation]')
const equalsButton = document.querySelector('[data-equals]')
const deleteButton = document.querySelector('[data-delete]')
const allClearButton = document.querySelector('[data-all-clear]')
const previousOperandTextElement = document.querySelector('[data-previous-operand]')
const currentOperandTextElement = document.querySelector('[data-current-operand]')
const calculator = new Calculator(previousOperandTextElement, currentOperandTextElement)
numberButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.appendNumber(button.innerText)
calculator.updateDisplay() }) })
operationButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.chooseOperation(button.innerText)
calculator.updateDisplay()})})
equalsButton.addEventListener('click', button => {
calculator.compute()
calculator.updateDisplay()})
allClearButton.addEventListener('click', button => {
calculator.clear()
calculator.updateDisplay()})
deleteButton.addEventListener('click', button => {
calculator.delete()
calculator.updateDisplay()})
document.addEventListener('keydown', function (event) {
let patternForNumbers = /[0-9]/g;
let patternForOperators = /[+\\-*\\/]/g
if (event.key.match(patternForNumbers)) {
event.preventDefault();
calculator.appendNumber(event.key)
calculator.updateDisplay()}
if (event.key === '.') {
event.preventDefault();
calculator.appendNumber(event.key)
calculator.updateDisplay() }
if (event.key.match(patternForOperators)) {
event.preventDefault();
calculator.chooseOperation(event.key)
calculator.updateDisplay()}
if (event.key === 'Enter' || event.key === '=') {
event.preventDefault();
calculator.compute()
calculator.updateDisplay()}
if (event.key === "Backspace") {
event.preventDefault();
calculator.delete()
calculator.updateDisplay() }
if (event.key == 'Delete') {
fonte: https://github.com/Nomzy-kush/CalculatorJS-Section
[code=xml]
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Calculator</title>
<style>
*, *::before, *::after {box-sizing: border-box;font-family: Gotham Rounded,
sans-serif;font-weight: normal;}
body {margin: 0; padding: 0;
background: linear-gradient(to right, #CBCE91FF, #EA738DFF); }
.calculator-grid {display: grid;justify-content: center;align-content: center;
min-height: 100vh; grid-template-columns: repeat(4, 100px);
grid-template-rows: minmax(120px, auto) repeat(5, 100px);}
.calculator-grid > button {cursor: pointer;font-size: 2rem;
border: 1px, solid #FFFFFF; outline: none; }
.calculator-grid > button:hover {background-color: #a9a9a9;}
.span-two {grid-column: span 2;color: #adf802;
background-color: rgba(139, 0, 139, 0.8);}
.output{grid-column: 1 / -1;background-color: rgba(0, 0, 0, 0.75);
display: flex;align-items: flex-end;justify-content: space-around;
flex-direction: column;padding: 10px;word-wrap: break-word;
word-break: break-all;}
.output .previous-operand{color: rgba(255,255, 255, 0.75);font-size: 1.5rem;}
.output .current-operand{color: white;font-size: 2.5rem;}
</style>
</head>
<body>
<div class="calculator-grid">
<div class="output">
<div data-previous-operand class="previous-operand"></div>
<div data-current-operand class="current-operand"></div></div>
<button data-all-clear class="span-two">AC</button>
<button data-delete>DEL</button>
<button data-operation>÷</button>
<button data-number>1</button>
<button data-number>2</button>
<button data-number>3</button>
<button data-operation>*</button>
<button data-number>4</button>
<button data-number>5</button>
<button data-number>6</button>
<button data-operation>+</button>
<button data-number>7</button>
<button data-number>8</button>
<button data-number>9</button>
<button data-operation>-</button>
<button data-number>.</button>
<button data-number>0</button>
<button data-equals class="span-two">=</button>
</div>
</body>
<script>
class Calculator {
constructor(previousOperandTextElement, currentOperandTextElement) {
this.previousOperandTextElement = previousOperandTextElement
this.currentOperandTextElement = currentOperandTextElement
this.clear()}
clear() {
this.currentOperand = ''
this.previousOperand = ''
this.operation = undefined }
delete() {
this.currentOperand = this.currentOperand.toString().slice(0, -1)}
appendNumber(number) {
if (number === '.' && this.currentOperand.includes('.')) return
this.currentOperand = this.currentOperand.toString() + number.toString()}
chooseOperation(operation) {
if (this.currentOperand === '') return
if (this.previousOperand !== '') {
this.compute()}
this.operation = operation
this.previousOperand = this.currentOperand
this.currentOperand = ''}
compute() {
let computation
const prev = parseFloat(this.previousOperand)
const current = parseFloat(this.currentOperand)
if (isNaN(prev) || isNaN(current)) return
switch (this.operation) {
case '+':
computation = prev + current
break
case '-':
computation = prev - current
break
case '*':
computation = prev * current
break
case '÷':
computation = prev / current
break
default:
return }
this.currentOperand = computation
this.operation = undefined
this.previousOperand = '' }
getDisplayNumber(number) {
const stringNumber = number.toString()
const integerDigits = parseFloat(stringNumber.split('.')[0])
const decimalDigits = stringNumber.split('.')[1]
let integerDisplay
if (isNaN(integerDigits)) {
integerDisplay = '' } else {
integerDisplay = integerDigits.toLocaleString('en', { maximumFractionDigits: 0 }) }
if (decimalDigits != null) {
return `$.$`} else {
return integerDisplay }}
updateDisplay() {
this.currentOperandTextElement.innerText =
this.getDisplayNumber(this.currentOperand)
if (this.operation != null) {
this.previousOperandTextElement.innerText =
`${this.getDisplayNumber(this.previousOperand)} ${this.operation}`
} else {
this.previousOperandTextElement.innerText = ''}}}
const numberButtons = document.querySelectorAll('[data-number]')
const operationButtons = document.querySelectorAll('[data-operation]')
const equalsButton = document.querySelector('[data-equals]')
const deleteButton = document.querySelector('[data-delete]')
const allClearButton = document.querySelector('[data-all-clear]')
const previousOperandTextElement = document.querySelector('[data-previous-operand]')
const currentOperandTextElement = document.querySelector('[data-current-operand]')
const calculator = new Calculator(previousOperandTextElement, currentOperandTextElement)
numberButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.appendNumber(button.innerText)
calculator.updateDisplay() }) })
operationButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.chooseOperation(button.innerText)
calculator.updateDisplay()})})
equalsButton.addEventListener('click', button => {
calculator.compute()
calculator.updateDisplay()})
allClearButton.addEventListener('click', button => {
calculator.clear()
calculator.updateDisplay()})
deleteButton.addEventListener('click', button => {
calculator.delete()
calculator.updateDisplay()})
document.addEventListener('keydown', function (event) {
let patternForNumbers = /[0-9]/g;
let patternForOperators = /[+\\-*\\/]/g
if (event.key.match(patternForNumbers)) {
event.preventDefault();
calculator.appendNumber(event.key)
calculator.updateDisplay()}
if (event.key === '.') {
event.preventDefault();
calculator.appendNumber(event.key)
calculator.updateDisplay() }
if (event.key.match(patternForOperators)) {
event.preventDefault();
calculator.chooseOperation(event.key)
calculator.updateDisplay()}
if (event.key === 'Enter' || event.key === '=') {
event.preventDefault();
calculator.compute()
calculator.updateDisplay()}
if (event.key === "Backspace") {
event.preventDefault();
calculator.delete()
calculator.updateDisplay() }
if (event.key == 'Delete') {
GOSTEI 1
Mais Respostas
Frank Hosaka
14/02/2023
O arquivo JavaScript tem aspas demais, e eu acredito que o nome dele é calculo.js
Para testar o seu código precisávamos do endereço de onde você conseguiu os seguintes arquivos:
style.css
equals.svg
plusMinus.svg
Tirando as aspas duplas, o arquivo JavaScript (provalvelmente calculo.js) ficaria assim
Para testar o seu código precisávamos do endereço de onde você conseguiu os seguintes arquivos:
style.css
equals.svg
plusMinus.svg
Tirando as aspas duplas, o arquivo JavaScript (provalvelmente calculo.js) ficaria assim
const calculator = document.querySelector('#calculator') const keys = calculator.querySelector('#keyboard') const displayPress = document.querySelector('#last-calc') const display = document.querySelector('#resul-screen') keys.addEventListener('click', e => { if (e.target.matches('button')) { const key = e.target const action = key.dataset.action const keyContent = key.textContent const displayedNum = displayPress.textContent const calculate = (n1, operator, n2) => { const firstNum = parseFloat(n1) const secondNum = parseFloat(n2) switch (operator) { case '+': return firstNum + secondNum case '-': return firstNum - secondNum case 'x': return firstNum * secondNum case '/': return firstNum / secondNum case '%': return firstNum * (secondNum / 100) default: return null } } const previousKeyType = calculator.dataset.previousKeyType if (!action) { if ( displayedNum === '0' || previousKeyType === 'operator' || previousKeyType === 'calculate' ) { displayPress.textContent = keyContent } else { displayPress.textContent = displayedNum + keyContent } calculator.dataset.previousKeyType = 'number' } if ( action === '-' || action === '+' || action === 'x' || action === '/' || action === '%' || action === 'plusMinus' ) { const firstValue = calculator.dataset.firstValue const operator = calculator.dataset.operator const secondValue = displayedNum if (firstValue && operator && previousKeyType !== 'operator' && previousKeyType !== 'calculate') { const calcValue = calculate(firstValue, operator, secondValue) display.textContent = calcValue calculator.dataset.firstValue = calcValue } else { calculator.dataset.firstValue = displayedNum } displayPress.textContent = displayedNum + " " + action + " " calculator.dataset.operator = action } if (action === 'decimal') { if (!displayedNum.includes('.')) { displayPress.textContent = displayedNum + '.' } else if ( previousKeyType === 'operator' || previousKeyType === 'calculate' ) { display.textContent = '0.' } calculator.dataset.previousKeyType = 'decimal' } if (action === 'clear') { if (key.textContent === 'C') { calculator.dataset.firstValue = '' calculator.dataset.modValue = '' calculator.dataset.operator = '' calculator.dataset.previousKeyType = '' } else { key.textContent = 'C' } display.textContent = 0 displayPress.textContent = 0 calculator.dataset.previousKeyType = 'clear' } if (action === 'cancelEntry') { console.log('cancel Entry!') } if (action === 'calculate') { const firstValue = calculator.dataset.firstValue const operator = calculator.dataset.operator const secondValue = displayedNum if (firstValue) { if (previousKeyType === 'calculate') { firstValue = displayedNum secondValue = calculator.dataset.modValue } display.textContent = calculate(firstValue, operator, secondValue) } calculator.dataset.modValue = secondValue calculator.dataset.previousKeyType = 'calculate' } } }) Mas tem erro de lógica, e esse é mais difícil de achar.
GOSTEI 0
Andresa Ribeiro
14/02/2023
Realmente o erro está na lógica, to tentando buscar qual é
GOSTEI 0