一、题目
开发一个简单的python计算器: 1、实现加减乘除及拓号优先级解析 2、用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),
运算后得出结果,结果必须与真实的计算器所得出的结果一致
二、解题思路
1、先实现一个函数可以计算,不含括号的简单+-*/运算。
2、使用递归的思想,利用正则表达式,取出最内层的的括号内容,然后利用1中所设计的函数计算,然后将结果返回。然后循环。大致思路如下图:
三、代码
import re def get_son(s,operation): dig = '-?d+(.d+)?' g = re.search(dig +operation + dig, s).group() if s.index(g)!=0 and s[s.index(g)-1].isdigit():g = g[1:] ls = g.split(operation[-1]) if len(ls)==3:ls =['-'+ls[1],ls[2]] return g,ls def cal(s): for i in ['/','*']: while i in s: if i=='*': g, ls = get_son(s, '*') s = s.replace(g, str(round(float(ls[0]) * float(ls[1]),8))) elif i=='/': g, ls = get_son(s, '/') s = s.replace(g, str(round(float(ls[0]) / float(ls[1]),8))) s =s.replace('--','+') while not re.match('^-?d+(.d+)?$',s): fist_opear = re.search('[^d.]', s[1:]).group() if fist_opear == '-': g, ls = get_son(s, '-') s = s.replace( g, str(float(ls[0]) - float(ls[1]))) else: g, ls = get_son(s, '+') s = s.replace(g, str(float(ls[0]) + float(ls[1]))) return s def cal_all(s): s= s.replace(' ','') while '(' in s: print(s) son = re.search('([^()]+)',s).group() s = s.replace(son,cal(son[1:-1])) return cal(s) s = '-3*( 4+ 50 )+(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)' print(cal_all(s)) print(eval(s))
最后运行结果如下:结果和eval完全一样