.. -- coding: utf-8 -- .. Copyright (C) Coelho e Hitoshi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with Invariant Sections being Forward, Prefaces, and Contributor List, no Front-Cover Texts, and no Back-Cover Texts. .. shortname:: EP9 .. description:: calculadora epílogo Exercício Programa 9: Calculadora - Epílogo =========================================== Introdução ---------- 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: .. sourcecode:: python 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. .. sourcecode:: python ================================================== 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. Objetivos --------- 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) `Tratamento de expressões posfixas `__ (EP8) **Epílogo:** entrega até 30/10 ------------------------------ 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()``. O que você deve fazer --------------------- 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.