Skip to content

Instantly share code, notes, and snippets.

@zokis
Created July 10, 2012 17:36
Show Gist options
  • Save zokis/3084950 to your computer and use it in GitHub Desktop.
Save zokis/3084950 to your computer and use it in GitHub Desktop.
Calculadora de expressao
#enconding: utf-8
'''
Calculadora de expressao
testes:
2+2 = 4
2-2 = 0
2*2 = 4
2/2 = 1
2^2 = 4
2+2-5 = -1
(2-2)*5 = 0
2-2*5 = -8
6+(10/2-3*(4-1)) = 2
'''
import unittest
def split(s, op):
i = s.find(op)
a = s[0:i]
b = s[i+1:]
return a, b
def calc(s):
import re
if '(' in s:
ie = re.match(r'\(([^)]+)', s)
if ie:
ie = ie.group().replace('(', '')
iec = calc(ie)
s = s.replace('('+ie+')', str(iec)).replace('(', '').replace(')', '')
print 'iec',iec
print 's',s
if '+' in s:
a, b = split(s, '+')
return calc(a)+calc(b)
elif '-' in s:
a, b = split(s, '-')
return calc(a)-calc(b)
elif '/' in s:
a, b = split(s, '/')
return calc(a)/calc(b)
elif '*' in s:
a, b = split(s, '*')
return calc(a)*calc(b)
elif '^' in s:
a, b = split(s, '^')
return calc(a)**calc(b)
return int(s)
class Calculadora(unittest.TestCase):
def test_2_mais_2_igl_4(self):
self.assertEquals(calc('2+2'), 4)
def test_2_menos_2_igl_0(self):
self.assertEquals(calc('2-2'), 0)
def test_2_vezes_2_igl_4(self):
self.assertEquals(calc('2*2'), 4)
def test_2_dividido_2_igl_4(self):
self.assertEquals(calc('2/2'), 1)
def test_2_potenciacao_2_igl_4(self):
self.assertEquals(calc('2^2'), 4)
def test_7_mai_2_igl_9(self):
self.assertEquals(calc('7+2'), 9)
def test_2_mai_2_men_5_igl_n1(self):
self.assertEquals(calc('2+2-5'), -1)
def test_2_vezes_3_men_10_igl_n4(self):
self.assertEquals(calc('2*3-10'), -4)
def test_p2_menos_2p_vezes_5_igl_0(self):
self.assertEquals(calc('(2-2)*5'), 0)
def test_cabulosa(self):
self.assertEquals(calc('6+(10-2-3+(4-1))'),14)
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment