Este é o último de uma série de quatro exercícios-programas que tiveram como objetivo a construção de um interpretador de expressões simples em notação infixa que, como em um programa, também poderiam conter variáveis. Exemplos de expressões que o interpretador contruído executa são:
mp = (p1 + 2*p2 + 2*p3)/5
nota_final = 0.75*mp + 0.25*me
nr = (prec + nf)/2
Como pode ser notado, as expressões são semelhantes àquelas encontradas em linguagens de programação. Assim como em Python, variáveis podem ser criadas por meio de atribuições e reutilizadas em expressões futuras.
==================================================
C A L C U L A D O R A P O L O N E S A
==================================================
Digite:
- uma expressão em notação infixa como "soma = 2 + 3"; ou
- "ver" para ligar/desligar o modo verboso; ou
- "dic" para exibir o dicionário de variáveis; ou
- "fim" para terminar.
Operadores possíveis:
+ - * / % :cinco operações aritméticas básicas
^ : exponeciação
! : menos unário
= : atribuição
calc >>> 1 + 2
3
calc >>> 3.14 * 6
18.84
calc >>> p1 = 4
4
calc >>> p2 = 5
5
calc >>> p3 = 6
6
calc >>> mp = (p1 + 2*p2 + 2*p3)/5
5.2
calc >>> mp
5.2
calc >>> me = 6
6
calc >>> nota_final = 0.75*mp + 0.25*me
5.4
calc >>> nota_final
5.4
calc >>> nota_final = 4
4
calc >>> nota_final
4
calc >>> prec = 5.5
5.5
calc >>> nr = (prec + nota_final)/2
4.75
calc >>> nr
4.75
calc >>> fim
Curta a nossa página no feiçebuqui.
Durante o processo da construção desse interpretador aprendemos e revisamos vários conceitos de programação, algoritmos e estruturas de dados: orientação a objetos, pilhas, tabelas de símbolos, dicionários, precedência de operadores, etc.
Neste exercício programa você deverá fazer uma função de nome infixa_para_posfixa() e fazer pequenas alterações no seu método eval() da classe Caculadora feito no EP8. Se você não fez o EP8, faça apenas a função infixa_para_posfixa() como especificada neste enunciado.
O objetivo desse EP foi possibilitar o treino dos conceitos vistos na segunda parte de MAC0122 tais como Programação Orientada a Objetos e Tipos Abstratos de Dados e em especial filas, pilhas e dicionários.
Veja também as notas de aula além da seção Infix, Prefix and Postfix Expression do livro Problem Solving with Algorithms and Data Structures Using Python.
As seguintes leituras podem contribuir para resolver esse EP:
Precedência entre operadores (EP9)
Notação polonesa (EP7 e EP8)
Nesta última parte, vamos utilizar todas as funções desenvolvidas nas partes anteriores (EP6, EP7 e EP8) para desenvolver uma calculadora que aceita expressões em notação infixa.
Você deve implementar a função infixa_para_posfixa() que faz parte do módulo caluladora.py e adaptar o método eval() da classe Calculadora do módulo calculadora.py. Tudo deve ser feito tendo como ponto de partida o esqueleto no arquivo esqueleto_calculadora.py. O módulo produzido a partir do esquelto deve se chamar calculadora.py e este deve ser o único arquivo entregue na página de MAC0122.
Independentemente de você ter ou não feito EP8, é possível implementar e testar a parte principal deste EP9 que é a função infixa_para_posfixa().
Inicialemente, estude esses exemplos, que mostram a execução do programa completo (= função main() do módulo main.py). Em particular, observe cada bloco que tem início em uma linha contendo calc >>>, onde o usuário digita uma expressão em notação infixa, que será interpretada pelo programa. Procure responder as seguintes perguntas:
O que os comandos ver, dic, e fim fazem?
Como executar uma expressão em notação infixa?
Quais são e como funcionam os operadores binários?
Quais são e como funcionam os operadores unários?
Como usar variáveis e o operador de atribuição? Exatamente como em Python, uma atribuição é a única maneira de criarmos uma variável da calculadora.
Utilize esses arquivos, conforme as instruções.
Siga esse roteiro para desenvolver a sua solução.