Como Fazer Calculadoras em JavaScript - Devin
Como Fazer Calculadoras em JavaScript - Devin
Como Fazer Calculadoras em JavaScript - Devin
1 de 16
http://www.devin.com.br/calculadoras-javascript/
Tutoriais
Dicas
Linux
Servidores
Internet
Programao
Programas
Programao
1
0
17 de outubro de 2008
Nunca me interessei de fato em aprender muito JavaScript, mas durante a faculdade, essa til linguagem foi um dos temas do perodo. Nesta srie de
tutoriais, vou escrever o que vou aprendendo para compartilhar com os leitores do site.
Nesta parte, utilizarei o primeiro conceito que aprendi de JavaScript fazendo uma calculadora simples.
1. Especificaes do Programa
Antes de mais nada, importante ressaltar que antes de se fazer qualquer programa, bom a gente sempre saber o que vai fazer. Por isso um
planejamento sempre bom.
Sabendo disto, vamos considerar os seguintes itens-objetivos:
A pgina ter que ser totalmente feita conforme padro XHTML, utilizando as tcnicas de apresentao de pgina separando Contedo e Forma
(HTML / CSS).
A calculadora ter 4 operaes bsicas: somar, subtrair, multiplicar e dividir.
Iremos fazer duas verses da calculadora: um com campos de formulrio, onde o usurio digita o valor manualmente e outra com botes para
cada nmero e um visor com o resultado.
Pr-requisitos:
Conhecimentos de HTML e CSS para montar o visual da calculadora. Este tutorial explica todos os passos detalhadamente, mas bom ter uma
noo disso para entender melhor.
Um editor de texto ou editor HTML de sua preferncia. Qualquer um serve, pois trabalharemos com o cdigo puro. Eu gosto do vim.
Um navegador. Recomendo o Firefox. No iremos precisar de servidor Web, pois criaremos a pgina localmente.
2 de 16
http://www.devin.com.br/calculadoras-javascript/
Para comear, faremos a calculadora mais simples, que vai utilizar dois formulrios onde o usurio vai preencher dois valores, selecionar uma operao
e apertar em um boto resultado, aparecendo na tela.
A primera linha indica qual o tipo de documento que estamos apresentando ao navegador. No nosso caso, estamos usando o tipo XHTML 1.0
Transitional. A segunda linha abre a tag principal da pgina informando tambm o endereo da especificao oficial do XHTML. Em outras palavras,
essas duas linhas servem para indicar que nosso cdigo do tipo XHTML e por isso deve (assim esperamos) seguir os padres.
O local onde est o comentrio Contedo do CSS ser substitudo mais a frente, assim como na parte do Contedo do JavaScript.
Seguindo em frente:
<!-- Cdigo "emprestado" do site http://pt.wikipedia.org/wiki/XHTML -->
<form name="calcform" method="post" action="">
<fieldset>
<legend>Devin - Calculadora Simples</legend>
<label for="valor1">Digite o valor <strong>1</strong>:</label>
<input type="text" name="valor1" id="valor1" />
<label for="valor2">Digite o valor <strong>2</strong>:</label>
<input type="text" name="valor2" id="valor2" />
<label for="oper">Selecione a operao:</label>
<select name="oper" id="oper">
<option value="somar">Somar</option>
<option value="subtrair">Subtrair</option>
<option value="multiplicar">Multiplifcar</option>
<option value="dividir">Dividir</option>
</select>
<label for="res">Resultado:</label>
<input type="text" name="res" id="res" />
<input type="button" value="Calcular" class="botao" onClick="calcular(document.calcform.oper.value)"/>
</fieldset>
</form>
Esta uma declarao de formulrio comum, mas precisamos anotar algumas coisas em mente para usarmos futuramente:
O nome do formulrio calcform como especificado no parmetro name da tag <form>.
Os formulrios onde o usurio preenche os valores se chamam valor1 e valor2.
O nome do campo de seleo da operao oper e pode receber os valores: somar, subtrair, multiplifcar e dividir.
Estes dados sero importantes na hora da gente criar o JavaScript.
Por ltimo no formulrio, temos um boto do tipo button (no submit, no reset). Na tag deste boto, existe o parmetro onClick que diz ao
navegador o que fazer quando o usurio clicar no boto. No nosso caso, ao clicar ele vai executar essa instruo:
calcular(document.calcform.oper.value)
Isto j a chamada ao JavaScript (que ainda no est pronto). Essa ao vai fazer exatamente o seguinte: executar a funo JavaScript chamada
calcular, passando como argumento o valor do campo de seleo oper. Em outras palavras, o usurio vai selecionar o tipo de operao na
calculadora e quando clicar no boto, vai ser executado a funo JavaScript j com a operao desejada.
E para terminar o cdigo HTML:
</body>
</html>
12/06/2015 17:30
3 de 16
http://www.devin.com.br/calculadoras-javascript/
2.2. CSS
Dentro do cdigo HTML, basta adicionar o seguinte contedo embaixo da linha /* Contedo do CSS */:
/* Estilo "emprestado" do site http://pt.wikipedia.org/wiki/XHTML */
form fieldset {
margin: 10px auto 10px auto;
width: 40%;
border: solid black 1px;
padding: 3%;
}
form legend {
padding: 6px;
margin: 10px;
border: solid black 1px;
font-size: 90%;
font-weight: bold;
background-color: #e8e8e8;
}
form label {
display: block;
font-size: 11px;
}
form input {
width: 100%;
border: solid #ccc 1px;
font-size: 11px;
margin-bottom: 10px;
}
form input.botao {
display: block;
width: auto;
float: right;
}
12/06/2015 17:30
4 de 16
http://www.devin.com.br/calculadoras-javascript/
O oper dentro dos parnteses o nome da varivel que vai ter o valor da operao. Por exemplo, se o usurio selecionou Somar, o valor da varivel
oper vai ser somar.
As duas linhas seguintes:
var valor1 = document.calcform.valor1.value;
var valor2 = document.calcform.valor2.value;
Criam duas variveis: valor1 e valor2, cada um contendo o valor correspondente do campo de formulrio. por isso que eu disse que era importante
saber os nomes dos campos. Lendo ao contrrio, d pra entender bem como isso funciona. Exemplo do valor1:
Pegar o valor do campo de nome valor1, dentro do formulrio de nome calcform, dentro do documento atual (a pgina) e atribuir varivel valor1.
No to difcil n?
A seguir temos vrias estruturas de teste com as quatro operaes bsicas possveis da nossa calculadora. Por ser um conceito de toda linguagem de
programao, no vou aprofundar na sintaxe, mas olha o que o cdigo faz:
1. Se a varivel oper tiver o valor somar, ento ele faz uma operao de soma e armazena o resultado na varivel res.
2. Caso contrrio, se a varivel oper tiver o valor subtrair, ento ele faz uma operao de subtrao e armazena o resultado na varivel res.
3. Caso no seja nem somar, nem subtrair, se a varivel oper tiver o valor multiplicar, ento ele faz uma operao de multiplicao e armazena o
resultado na varivel res.
4. Caso nenhum dos trs passos anteriores acontecer, ele faz ento uma operao de diviso e armazena o resultado na varivel res.
As operaes aqui foram bem simples:
Soma: parseInt(valor1) + parseInt(valor2). Usando o sinal de + com nmeros, somamos eles. Aqui usamos a funo parseInt para
transformar o valor do campo explcitamente em nmero, seno ele ao invs de somar iria concatenar os valores (5 + 5 = 55).
Subtrao: valor1 valor2. Usamos o sinal de - para subtrair os nmeros. Neste caso no foi preciso colocar o parseInt pois no existe outra
funo para o sinal de - nesse caso.
Multiplicao: valor1 * valor2. Usamos o caracter * para multiplicar os dois valores.
Diviso: valor1 / valor2. Usamos o caracter / para dividir os dois valores.
Depois da operao feita, o resultado fica disponvel na varivel res.
Agora, para mostrar o valor para o usurio, modificamos o valor do campo Resultado via JavaScript:
document.calcform.res.value = res;
Mais uma vez, se voc ler ao contrrio fica mais fcil de entender.
Pronto! Em pouco tempo, fizemos uma calculadora simples, bonita e funcional!
kcalc
12/06/2015 17:30
5 de 16
http://www.devin.com.br/calculadoras-javascript/
Beleza. Eu estava brincando, quem sabe outro dia! Vamos mesmo fazer a mesma calculadora simples mas com um visual mais arrojado e com mais
dinamismo.
A calculadora vai ter um visor, como todas as calculadoras tm.
Cada nmero vai ser um boto. Assim como cada operao vai ser um boto tambm.
As contas sero sempre contnuas, ou seja, medida que o usurio for digitando os valores e as operaes, o visor vai sendo atualizado de
acordo com os clculos!
</body>
</html>
Resultado at agora:
3.2. CSS
Agora o CSS, para ser includo abaixo do /* Contedo do CSS */:
/* Estilo "emprestado" do site http://pt.wikipedia.org/wiki/XHTML */
#visor {
background-color: #bdffb4;
12/06/2015 17:30
6 de 16
http://www.devin.com.br/calculadoras-javascript/
text-align: right;
}
table {
margin: 0 auto 0 auto;
}
form fieldset {
margin: 10px auto 10px auto;
width: 40%;
border: solid black 1px;
padding: 3%;
margin-bottom: 10px;
}
form input {
width: 100%;
border: solid #ccc 1px;
font-size: 11px;
margin-bottom: 10px;
}
form input.num {
display: block;
width: 24px;
height: 24px;
}
form input.oper {
display: block;
width: 24px;
height: 24px;
background-color: #b2b2b2;
}
O resultado:
Neste exemplo, tanto a varivel argh quanto a varivel local s estaro disponveis dentro da funo teste. Se tiver qualquer referncia varivel fora
das chaves {}, no vai servir pra nada.
Por outro lado, uma varivel global transita em todo o cdigo e durante toda a execuo da pgina. Exemplo:
function teste() {
globalizacao = 'uhu';
}
teste();
document.write(globalizacao);
Apesar de eu ter usado a varivel globalizacao fora da funo, ela vai ser reconhecida e por isso seu valor vai ser escrito no documento atual
(document.write).
Note agora a diferena entre a definio das duas variveis. Uma varivel local definida utilizando o var antes:
var local = 'teste';
Por que eu expliquei isso primeiro? Como eu disse, utilizei vrias funes no cdigo, e para manter o fluxo das aes do usurio, necessrio variveis
globais para durarem atravs das funes e durante toda a execuo da pgina
12/06/2015 17:30
7 de 16
http://www.devin.com.br/calculadoras-javascript/
Agora o cdigo JavaScript (aceito sugestes de melhoria) para colocar depois do /* Contedo do JavaScript */:
// Funo que adiciona os nmeros no Visor quando pressionado os botes
function calcNum(num) {
if (typeof gvisor == 'undefined') {
document.calcform.visor.value = '';
}
document.calcform.visor.value = document.calcform.visor.value + num;
gvisor = 1;
}
// Funo que limpa a calculadora e todas as variveis existentes.
function calcLimpar() {
document.calcform.visor.value = '';
delete gvalor;
delete goper;
delete gvisor;
}
// Funo que executa as operaes bsicas da calculadora
function calcOper(oper, valor1, valor2) {
if (oper == "somar") {
var valor = parseFloat(valor1) + parseFloat(valor2);
} else {
if (oper == "subtrair") {
var valor = valor1 - valor2;
} else {
if (oper == "multiplicar") {
var valor = valor1 * valor2;
} else {
var valor = valor1 / valor2;
}
}
}
return(valor);
}
// Funo do algoritmo de "passagem" das aes do usurio
function calcParse(oper) {
var valor = document.calcform.visor.value;
delete gvisor;
if (typeof goper != 'undefined' && oper == 'resultado') {
gvalor = calcOper(goper, gvalor, valor);
document.calcform.visor.value = gvalor;
delete oper;
delete gvalor;
return(0);
}
if (typeof gvalor != 'undefined') {
gvalor = calcOper(goper, gvalor, valor);
goper = oper;
document.calcform.visor.value = gvalor;
} else {
gvalor = valor;
goper = oper;
}
}
Ficou bem maior do que antes n? Vamos por partes Talvez o algoritmo no fique muito claro, mas vou tentar explicar da melhor maneira possvel.
Quando o usurio clicar em um boto numrico (0-9), ele acionar a funo calcNum(), que por sua vez vai colocando (concatenando) os
nmeros no visor da calculadora. A varivel global gvisor entenderemos mais frente.
Quando o usurio clicar em um boto de operao (+, -, *, / ou =), ele acionar a funo calcParse(), que a funo com o algoritmo principal:
ela que vai decidir o que fazer na calculadora. Isso vai ser explicado melhor depois.
Quando o usurio clicar no boto AC, ele acionar a funo calcLimpar(), apagando o visor da calculadora e todas as variveis globais so
removidas. literalmente um reset na calculadora.
A funo calcOper(), apesar de no ser chamada diretamente pelo usurio, a mesma funo utilizada na calculadora simples, s que agora vai
ser chamada pela calcParse().
Sabendo agora das funes das funes (recursivo no? ;), vamos tentar entender o algoritmo seguindo exemplos de uso. Supondo que o usurio clique
nos botes nesta ordem:
5+55=
1. Ao clicar no boto 5, a funo calcNum(5) adiciona o nmero 5 no visor e tambm ativa a varivel global gvisor.
2. Ao clicar no boto +, a funo calcParse(somar) acionada. Isso quer dizer que a calculadora se prepara para fazer uma operao de soma.
A primeira coisa que a funo faz apagar a varivel global gvisor, assim o prximo nmero que o usurio clicar no vai ser concatenado.
3. Em seguida a funo calcParse(somar) faz uma srie de testes e verifica que nem a varivel global goper, nem a varivel global gvalor
existem. Isso quer dizer que essa a primeira operao da calculadora e por isso ela atribui os valores iniciais para essas duas variveis globais
(gvalor = 5) e (goper = somar).
4. Ao clicar em mais um nmero (5), a funo calcNum(5) chamada novamente. Desta vez ela sente falta da varivel global gvisor, por isso
apaga o visor e ativa a varivel novamente.
5. Ao clicar novamente no nmero 5, a funo calcNum(5) chamada novamente (que teimosa), s que desta vez existe a varivel gvisor e por
isso ela no apaga o visor antes.
6. Por ltimo, quando o usurio apertar o boto =, a funo calcParse(resultado) vai ser chamada. O algoritmo detecta que havia uma operao
gravada anteriormente (goper = somar) e executa a funo calcOper(somar, 5, 55). A funo soma e retorna o nmero 60, que colocado no
visor da calculadora. Como um sinal de =, um operador de finalizao, ento a funo remove as variveis de operao atual e de valor global,
12/06/2015 17:30
8 de 16
http://www.devin.com.br/calculadoras-javascript/
4. Concluso
Eu consegui transformar uma aula simples de JavaScript na faculdade em uma verdadeira diverso! Ao mesmo tempo que tenho certeza que este
tutorial ser til para muita gente.
Aqui esto os dois arquivos completos:
Calculadora Simples
Calculadora Complexa
Sendo estes os arquivos fixos deste tutorial. Entretanto, coloquei tambm os seguintes links, pois quem sabe no futuro eu mexa mais e adicione mais
coisas para aprender!
http://www.devin.com.br/arquivos/calculadora-simples.html
http://www.devin.com.br/arquivos/calculadora-complexa.html
Bom proveito!
43
703,678
82
12/06/2015 17:30
9 de 16
http://www.devin.com.br/calculadoras-javascript/
Apache: Como posso bloquear outros sites de fazer links diretos em meus arquivos?
Apache: Eu tenho muitos domnios virtuais, como posso fazer para gerar logs separados de cada um?
Comentrios (43)
Logar
Excellent post. I was checking constantly this weblog and I'm impressed! Very useful information particularly the last section :) I maintain such
information a lot. I used to be looking for this particular info for a very lengthy time. Thank you and best of luck. |
Responder
12/06/2015 17:30
10 de 16
http://www.devin.com.br/calculadoras-javascript/
Who do you work for? http://www.baiedesanges-editions.com/buylevlen/ what is levonorgestrel fully edited for completeness and validity of the
format of the entered data. There is a
Responder
Gostaria de saber como faz uma calculadora que seja Altura * Largura * o preo = o valor que pagar...a pessoa s coloca altura largura e ja vem
com preo direto pra calcula...vlw
eu comecei essa mas no da certo
<form action="produtos.asp?produto=<%= idprod %>" method="post" name="form12">
<span class="style1">Coloque as Medidas</span> <input type="text" size="8" id="n1" name="n1" /> x <input type="text" size="8" id="n2"
name="n2" />
<input type="submit" value="Calcular" name="Submit" />
</form>
Responder
-1
-1
"...transformar uma aula simples de JavaScript na faculdade em uma verdadeira diverso!" Nossa me diverti pacas '-'.
Responder
-1
Ia irmao, gostei do tutorial, to entrando na area da programaao, e foi muito util sua aula abrao...
Responder
-1
Pessoal, fiz algumas melhorias. Assim o calculo executado conforme digitamos, e corrigi um "bug" em "," decimal.
http://www.devin.com.br/calculadoras-javascript/ */
/*Crdito de Adaptao: Elielder > http://www.taganet.com.br */
/* Contedo do CSS */
/* Estilo "emprestado" do site http://pt.wikipedia.org/wiki/XHTML */
#calc fieldset {
float: center;
margin: 10px auto 10px auto;
width: 300px;
border: solid black 1px;
padding: 3%;
margin-bottom: 10px;
}
#calc legend {
padding: 6px;
12/06/2015 17:30
11 de 16
http://www.devin.com.br/calculadoras-javascript/
margin: 10px;
border: solid black 1px;
font-size: 90%;
font-weight: bold;
background-color: #e8e8e8;
}
#calc label {
display: block;
font-size: 11px;
}
#calc input {
width: 100%;
border: solid #ccc 1px;
font-size: 11px;
margin-bottom: 10px;
}
#calc input.botao {
display: block;
width: auto;
float: right;
}
#calc input.botao {
display: block;
width: auto;
float: right;
}
-->
http://www.devin.com.br/calculadoras-javascript/ */
/*Crdito de Adaptao: Elielder > http://www.taganet.com.br */
/* Contedo do JavaScript */
function calcular() {
var oper = document.calcform.oper.value;
var valor1 = parseFloat(document.calcform.valor1.value.replace('.',',').replace(',','.'));
var valor2 = parseFloat(document.calcform.valor2.value.replace('.','').replace(',','.'));
if (oper == "somar") {
var res = parseInt(valor1) + parseInt(valor2);
} else {
if (oper == "subtrair") {
var res = valor1-valor2;
} else {
if (oper == "multiplicar") {
var res = valor1*valor2;
12/06/2015 17:30
12 de 16
http://www.devin.com.br/calculadoras-javascript/
} else {
var res = valor1/valor2;
}
}
}
document.calcform.res.value = res;
}
function init() {
document.calcform.oper.focus();
}
window.onload = init;
-->
Calculadora
Selecione a operao:
Dividir
Multiplicar
Somar
Subtrair
Digite o valor 1:
Digite o valor 2:
Resultado:
Responder
-1
To com dificuldades no estilo CSS, eu coloco exatamente aonde manda mas nao muda a aparencia
Responder
-1
Pleased to meet you http://kaokasiquki.de.tl loli foros Now that is what is known as a thick, busty, sexy as hell woman with the curves to fucking
rock your world!!!!!!
Responder
-1
timo tutorial,
uma boa ideia para colocar, seria a calculadora nao aceitar letras, caracteres invlidos, ou operadores repetidos.
Responder
-1
Puxa vida, quando eu abro no navegador, nenhuma operao feita, aparece o visor, os botes, mas a operao no d. L no rodap do navegador
aparece "erro na pgin", o que eu fao?
Responder
-1
-1
Parabns pelo belo trabalho, objetivo e extremamente didtico. Imagino que seja difcil ter tanto trabalho, disponibiliz-lo de forma gratuita e ainda
receber tantos comentrios depreciativos de pessoas que sequer possuem domnio da prpria lngua, mas console-se com o fato de que nem todos
pensam assim. Sucesso!
12/06/2015 17:30
13 de 16
http://www.devin.com.br/calculadoras-javascript/
Responder
-1
-1
-2
Legal
isso me ajudou muito :D
obrigada!*************
*************
************
***********
**********
Responder
-2
-1
Gostaria de saber se existe uma forma de adaptar esta calculadora da segun=inte forma:
quero coloca-la no formulario de reservas do meu site, mas no como ela est e sim, quando o hospede chamar o formulario, ela carregue com o
valor da diaria do hotel, e quando ele identificar a quantidade de dias que ficar hospedado, calcule o valor total que ele vai pagar, possivel?
Grato
Marcelo
Responder
-1
Opa!
Parabns pelo texto.
Muito explicativo e serviu bastante at para mim que j tenho alguma experincia em PHP.
12/06/2015 17:30
14 de 16
http://www.devin.com.br/calculadoras-javascript/
Agora uma dvida: se eu retiro as tags de <code> </code>, o script no funciona mais. essa tag que define no script a o nome dos objetos que
sairo o valor? Se for vou jogar meu macbook na parede, porque perdi um dia inteiro tentando descobrir o motivo do meu cdigo (adaptado do teu)
no funcionar e o teu funcionar perfeitamente na mesma pgina minha,
Valeuuu
Abraos
Responder
-1
-1
os cara ta tudo com inveja de vc, so porque eles no sabe fazer uma calculadora, fica ai xingando as pessoas de burra mais quem burro aki so
esse babaca que tem inveja ate de uma calculadora :@ !!!
Responder
-1
-1
Cara, no querendo gabar-me, mas eu fiz uma que d duzentas na sua. No querendo gabar-me.
Tem fatorial, adio, subtrao, multiplicao, mdulo, diviso, exponenciao, parnteses, troca de sinais, negao, Clear Empity (CE), Clear (C),
seono, cosseno, tangente, e outras cambadas de coisas.
Se quiser a gente pode melhorar o meu cdigo. Ok?
Aguardo resposta, abrao!
Responder
-1
@talo:
Opa, legal que tu fez muito mais coisas! Na verdade eu fiz esse um pouco mais simples justamente para servir como um tutorial pra quem t
iniciando em JavaScript, mas sinta-se a vontade para disponibilizar o seu cdigo para os outros estudarem que terei o prazer de colocar um link
aqui! :)
Responder
-1
Cara preciso de um clculo para um formulrio no meu site. Voc pode me ajudar?
Responder
-1
-1
@Jose:
Como no? Aqui a calculadora soma como quiser, talvez seja algo com o navegador? Eu testei no Firefox 3.5.
12/06/2015 17:30
15 de 16
http://www.devin.com.br/calculadoras-javascript/
Responder
-1
Cara voce mandou muito bem. Acabei de conhecer esse site e vou ler e aplicar bastante coisa...
Quando o Felipe disse sobre esse codigo todo pra uma calc ele no foi muito feliz... Mais isso s questo de opinio vc fera. tima explicao.
Responder
-1
bem eu gostaria de saber como fazer uma calculadora utilizando em seu algoritimo apenas sinal de + e de Responder
-1
-1
Up, muito bom mais uma vez um tutorial simples e de excelente explicao.
Responder
-1
quero saber se possivel colocar uma calculadora dessas numa secao de um forum phpBB.. e se sim, saber onde coloco.. obrigada.
Responder
-1
Muito bom. Com base neste exemplo estou conseguindo fazer outras aplicacoes. obrigado
Responder
-1
S aqui nesse site, vc explicou mais que meu professo no semestre inteiro...
Responder
-1
Foi moleza eu fui na pagina final que mostrou como a calculadora ficou e copiei o codigo.
Responder
-1
Muito bom esse formulario nao sabia como fazer agora posso tentar encrementar esse estilo de formula para o meu site abraos
Responder
-1
E o mais engraado de tudo que no teve mais nada na faculdade, mais nada mesmo. Alis, esse tutorial aqui teve muito mais coisas que l... a
vida :) O problema agora fazer o resto da srie de tutoriais: se no h necessidade, por que fazer? :P
Responder
-1
lol @ Felipe
que preguioso, voc queria o que? aposto que aprender a programar no :)
Responder
12/06/2015 17:30
16 de 16
http://www.devin.com.br/calculadoras-javascript/
-1
Website (opcional)
No mostrado publicamente.
Assinar
Enviar Comentrio
Comments by
Tutoriais
Dicas
Changelog
Contato
Termos de Uso
2001-2013 Devin. Consulte os termos de uso.
12/06/2015 17:30