Created
July 10, 2012 17:36
-
-
Save zokis/3084950 to your computer and use it in GitHub Desktop.
Calculadora de expressao
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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