Calculadora em Python!

247 views
Skip to first unread message

Roberto dos Santos

unread,
Nov 20, 2017, 3:45:28 PM11/20/17
to Python Brasil
Boa noite!

Sou novo no PYTHON, e tava tentando criar uma Calculadora, so que nao consigo fazer rodar.
PRECISO DE AJUDA!

ABAIXO O CÓDIGO:

OBS: Estava desenvolvendo no PYCHARM.

print("***Mini-Calculadora PYTHON***")

class CalcError(Exception):
pass

class Calc(object):
""" Implementa todo o processo da calculadora, desde a leitura até o parsing. """

TOK_IMPR, TOK_FIM, TOK_NOME, TOK_NUM = range(4)

def __init__(self, entrada):
""" Inicializa a calculadora.
entrada deve ser um objeto que tenha o método read().
"""
self.entrada = entrada
self.cur_tok = calc.TOK_IMPR
self.num_value = 0.0
self.str_valvues = ''
self.valvues = { 'pi': 3.14156 }
import re
self.letras = re.compile('[a-zA-Z]')
self.numeros = re.compile('[0-9\.]')


def run(self):
while self.cur_tok != Calc.TOK_FIM:
try:
valor = self.expr()
if valor is not None:
print valor
except CalcError, msg:
print "Erro:", msg

def expr(self) -> object:
esq = self.term()
while self.cur_tok in ('+', '-', '\n'):
if self.cur_tok == '+':
esq += self.term()
elif self.cur_tok == '-':
esq -= self.term()
else:
break
if self.cur_tok == Calc.TOK_FIM:
return None
return esq

def term(self):
esq = self.prim()
while self.cur_tok in ('*', '/'):
if self.cur_tok == '*':
esq *= self.prim()
else:
v = self.prim()
if v == 0.0:
raise CalcError, "Divisão por Zero"
else:
esq / = v
return esq

def prim(self):
self.next_token()
v = 0.0
if self.cuur_tok == Calc.TOK_NOME:
nome = self.str_value
self.next_token()
if self.cur_tok == '=':
v = self.expr()
self.valvues[nome] = v
return v
else:
v = self.values.get(nome, 0.0)
return v
elif self.cur_tok == Calc.TOK_NUM:
v = self.num_value
elif self.cur_tok == '(':
v = self.expr()
if self.cur_tok != ')':
raise CalcError, "')' esperado "
elif self.cur_tok == Calc.TOK_FIM:
return 0
else:
raise CalcError, "Token inesperado"
self.next_token()
return v

def next_token(self):
if not hasattr(self,'ch'):
ch = ' '
while ch in (' ', '\t')
ch = self.entrada.read(1)
else:
ch = self.ch

if self.numeros.match(ch):
pontos = ch == '.' and 1 or 0
s = ''
while self.numeros.match(ch):
s += ch
ch = self.entrada.read(1)
if ch == '.':
pontos += 1
if pontos > 1:
raise CalcError, "Valor ponto flutuante inválido"
self.num_value = float(s)
self.cur_tok = Calc.TOK_NUM
elif self.letras.match(ch)
s = ''
while self.letras.match(ch):
s += ch
ch = self.entrada.read(1)
self.str_value = s
self.cur_tok = Calc.TOK_NOME
elif len(ch) == 0:
self.cur_tok = Calc.TOK_FIM
else:
self.cur_tok = ch
if ch == '\n':
if hasattr(self,'ch'):
del self.ch
return
ch = sys.stdin.read(1)

while ch in (' ', '\t'):
ch = sys.stdin.read(1)

self.ch = ch

if __name_=="__main__":
import sys
calc = Calc(sys.stdin)
calc.run()

Fabio Macedo

unread,
Nov 20, 2017, 4:49:54 PM11/20/17
to python...@googlegroups.com
Não gera nenhum erro?
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Roberto dos Santos

unread,
Nov 20, 2017, 4:58:23 PM11/20/17
to python...@googlegroups.com
Ola fabio,

Nao consigo fazer rodar no pycharm fica dando erro na linha 32 print valor.
Sera que pode ser o proprio pycharm que nao esta querendo roda ja que nao tem erro.



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Eduardo Fontes

unread,
Nov 20, 2017, 5:03:27 PM11/20/17
to python...@googlegroups.com
Se for python 3 tem que usar print(valor)

Fabio Oliveira

unread,
Nov 20, 2017, 5:13:01 PM11/20/17
to python...@googlegroups.com
Manda print do error aí.


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Cristian Eduardo

unread,
Nov 20, 2017, 5:23:13 PM11/20/17
to Python Brasil
Cara vc esta usando o python 3?  Se sim voce deve usar a sintaxe para o print assim:

Print (valor) ou Print(valor {}.format(variavel que entre no lugar das chaves))
da um pesquisada, tenta alterar isso.
espero ter ajudado mas posso estar errado tbm, sou iniciante ainda kkk

Roberto dos Santos

unread,
Nov 21, 2017, 8:51:52 AM11/21/17
to python...@googlegroups.com
Bom dia Galera,

Consegui resolver o problema na linha 32,
Porem agora quando vai roda fica dando o erro "bound method".

Abaixo print.


Imagem inline 1

Roberto dos Santos
Fone: (55) 9649-9710
Itaqui - RS

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Luciano da Silva Martins

unread,
Nov 21, 2017, 1:42:08 PM11/21/17
to Python Brasil
num deu pra ver o erro, mas tentei rodar aqui e vi algumas coisas, vc muda isso e tenta rodar dnv:

onde tiver calc.TOK_IMPR substitua por self.TOK_IMPR

onde tiver raise CalcError, "Divisão por Zero" substitua raise CalcError("Divisão por Zero")

dps poste o erro com o código pra ir desenrolando as coisas


Em terça-feira, 21 de novembro de 2017 11:51:52 UTC-2, Roberto dos Santos escreveu:
Bom dia Galera,

Consegui resolver o problema na linha 32,
Porem agora quando vai roda fica dando o erro "bound method".

Abaixo print.


Imagem inline 1

Roberto dos Santos
Fone: (55) 9649-9710
Itaqui - RS

Em 20 de novembro de 2017 20:23, Cristian Eduardo <cristian.tra...@gmail.com> escreveu:
Cara vc esta usando o python 3?  Se sim voce deve usar a sintaxe para o print assim:

Print (valor) ou Print(valor {}.format(variavel que entre no lugar das chaves))
da um pesquisada, tenta alterar isso.
espero ter ajudado mas posso estar errado tbm, sou iniciante ainda kkk

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Roberto dos Santos

unread,
Nov 21, 2017, 2:01:38 PM11/21/17
to python...@googlegroups.com
​Olá Luciano,

O erro ainda persiste.
abaixo print do erro e o código para análise.

print(***Mini Calculadora***)



class CalcError(Exception):
pass


class Calc(object):
""" Implementa todo o processo da calculadora, desde a leitura até o parsing. """

TOK_IMPR , TOK_FIM , TOK_NOME , TOK_NUM = range(4)

    def __init__(self , entrada):

""" Inicializa a calculadora.
entrada deve ser um objeto que tenha o método read().
"""
self.entrada = entrada
        self.cur_tok = self.TOK_IMPR
self.num_value = 0.0
self.str_values = ''
self.values = {'pi': 3.14156}

import re
self.letras = re.compile('[a-zA-Z]')
self.numeros = re.compile('[0-9\.]')

def run(self):
while self.cur_tok != Calc.TOK_FIM:
try:
valor = self.expr()
if valor is not None:
                    print(valor)
except CalcError as msg:
print("Erro:" , msg)

def expr(self):
esq = self.term

while self.cur_tok in ('+' , '-' , '\n'):
if self.cur_tok == '+':
esq += self.term()
elif self.cur_tok == '-':
esq -= self.term()
else:
break
if self.cur_tok == Calc.TOK_FIM:
return None
return esq

def term(self):
esq = self.prim()
while self.cur_tok in ('*' , '/'):
if self.cur_tok == '*':
esq *= self.prim()
else:
v = self.prim()
if v == 0.0:
                    raise CalcError("Divisão por Zero")
                else:
esq /= v
return esq

def prim(self) -> object:
self.next_token()
v = 0.0
if self.cur_tok == Calc.TOK_NOME:

nome = self.str_value
self.next_token()
if self.cur_tok == '=':
v = self.expr()
                self.values[nome] = v
return v
else:
v = self.values.get(nome , 0.0)

return v
elif self.cur_tok == Calc.TOK_NUM:
v = self.num_value
elif self.cur_tok == '(':
v = self.expr()
if self.cur_tok != ')':
                raise CalcError("')' esperado ")

elif self.cur_tok == Calc.TOK_FIM:
return 0
else:
            raise CalcError("Token inesperado")

self.next_token()
return v

def next_token(self):
        if not hasattr(self , 'ch'):

ch = ' '
while ch in (' ' , '\t'):
ch = self.entrada.read(1)
else:
ch = self.ch

if self.numeros.match(ch):
pontos = ch == '.' and 1 or 0
s = ''
while self.numeros.match(ch):
s += ch
ch = self.entrada.read(1)
if ch == '.':
pontos += 1
if pontos > 1:
                raise CalcError("Valor ponto flutuante inválido")

self.num_value = float(s)
self.cur_tok = Calc.TOK_NUM
elif self.letras.match(ch):
s = ''
while self.letras.match(ch):
s += ch
ch = self.entrada.read(1)
self.str_value = s
self.cur_tok = Calc.TOK_NOME
elif len(ch) == 0:
self.cur_tok = Calc.TOK_FIM
else:
self.cur_tok = ch
if ch == '\n':
                if hasattr(self , 'ch'):

del self.ch
return
ch = sys.stdin.read(1)

while ch in (' ' , '\t'):
ch = sys.stdin.read(1)

self.ch = ch


if __name__ == "__main__":

import sys
calc = Calc(sys.stdin)
calc.run()






Imagem inline 2

Roberto dos Santos
Fone: (55) 9649-9710
Itaqui - RS



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Luciano da Silva Martins

unread,
Nov 22, 2017, 7:46:20 AM11/22/17
to Python Brasil
Olha esse...tá com erro mas tá indo...dps de rodar digite numeros 

Filipe Cifali

unread,
Nov 22, 2017, 7:56:51 AM11/22/17
to python...@googlegroups.com
Olá, por favor, utilize serviços como o https://imgur.com/ para fazer o post de screenshots e serviços como o https://gist.github.com/ para fazer o post código.

Adicionando imagens no e-mail, toda a lista (de alguns milhares de usuários) recebem estes anexos automaticamente.

Obrigado pela atenção.



---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
[ ]'s

Filipe Cifali Stangler

Roberto dos Santos

unread,
Nov 22, 2017, 12:53:27 PM11/22/17
to python...@googlegroups.com
Ola Luciano,

No site que voce me indicou o programa rodou perfeitamente, acho que meu Pycharm de ta com problema vo reinstalar e vo testa em outras IDE.

Valeu mesmo OBRIGADO!


Roberto dos Santos
Fone: (55) 9649-9710
Itaqui - RS

Reply all
Reply to author
Forward
0 new messages