Uma calculadora RPN é uma calculadora na qual entramos com as operações após os operandos, e temos um comando que vai guardando operandos em uma espécie de “pilha”. Nesse laboratório vamos construir o modelo de uma calculadora RPN, e usá-lo com a interface (visão+controlador) feita em sala.
Antes de começar, baixe o projeto BlueJ da calculadora feita em sala, já modificado para não usar novos recursos de Java 1.8. Se você estiver usando Eclipse, crie um novo projeto Java no Eclipse e depois copie os arquivos .java
que estão dentro do arquivo de Calculadora.zip
para a pasta de arquivos fonte do projeto.
Uma calculadora RPN tem as mesmas operações de uma calculadora padrão, mas o funcionamento por trás é bem diferente. Ela funciona com uma pilha de operandos; toda que vez o botão =
(chamada de store em uma calculadora RPN) é apertado o valor do display é empilhado, e qualquer outro dígito após isso começa a entrada de outro número. Por exemplo, se o display é 1234
e se faz =
o número 1234 é empilhado e o display continua mostrando 1234
. Se depois pressiona-se o número 5
o valor do display passa a ser 5
, e pressionando o número 3
o valor do display passa a ser 53
.
As operações aritméticas todas funcionam da mesma forma: o operando da esquerda é removido do topo da pilha (ou é 0 se a pilha estiver vazia), e o operando da direita é o valor do display. A operação é feita, e o resultado vira o novo valor do display. Qualquer outro dígito após isso começa a entrada de outro número, do mesmo modo que em uma operação de store.
Um exemplo de uso: 2
, =
, 3
, =
, 5
, *
, +
faz a operação 2+(3*5), deixando 17
no display e a pilha vazia.
Chame a classe principal do modelo de CalcRPN
. Podemos representar uma calculadora RPN com espaço para quatro números usando quatro campos: P0
, P1
, P2
e P3
. O campo P0
é o display, e os outros três campos são a pilha. Os valores iniciais são todos 0
.
Como vamos usar esse modelo com a a interface gráfica feita em sala, esse modelo também precisa implementar a mesma interface Calc
que a classe CalcQF
implementa.
O que muda é o comportamento de cada operação da interface:
1. A operação igual
move o valor que estava em P2
para P3
, o que estava em P1
para P2
, o que estava em P0
para P1
, e zera P0
.
2. As operações soma
, sub
, mult
e div
respectivamente somam, subtraem, multiplicam e dividem o valor de P0
pelo de P1
, armazenando o resultado em P0
, depois copiando o valor de P2
para P1
, de P3
para P2
, zerando P3
.
3. A operação digito
corresponde à entrada de dígitos na calculadora, multiplicando o valor atual de P0
por 10 e somando o dígito correspondente.
4. A operação reset
volta a calculadora a seu estado inicial, com todas as variáveis de seu estado iguais a 0.
Depois de implementado o modelo da calculadora RPN, conecte ele com a interface gráfica feita em sala e teste o resultado. Para conectar o novo modelo com a interface, basta mudar a linha em Calculadora
que instancia a classe CalcQF
para instanciar sua classe CalcRPN
no lugar dela.
Agora adicione memória à calculadora, com quatro novas funções (métodos na interface Calc
e botões na interface): memPlus
(botão M+
) adiciona o valor do display à memória interna, memSub
(botão M-
) subtrai o valor do display da memória interna, memRecall
(botão MR
) copia o valor da memória para o display, e memClear
(botão MC
) zera a memória. Esses botões ficarão na primeira fileira; lembre de aumentar a altura da janela para ter espaço para os novos botões.
Você deve implementar a memória tanto no modelo CalcQF
quanto no modelo CalcRPN
. Note que as implementações são idênticas, exceto talvez pelo detalhe do nome do campo que guarda o display mudar de um modelo para outro. Provavelmente a implementação de outros métodos dos dois modelos também é bastante parecida.
Última Atualização: 2016-12-09 11:49