Python计算器实操
要求:
开发一个简单的python计算器
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式
后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计
算器所得出的结果一致。
import re def chengchu(num): '''乘除操作''' while re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num): #当有*/运算时循环 ret = re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num).group() #获取包含*/运算的算式 if re.search("-?\d+\.?\d*\*-?\d+\.?\d*",ret): #是乘的时候 n1,n2 = re.split("\*",ret) #以*分割两边的数字 ji = float(n1)*float(n2) #得到数字进行运算 if re.search("-\d+\.?\d*\*-\d+\.?\d*",num): #特殊情况,两负相乘的正,得加上+ num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*",("+"+str(ji)),num,1) #替换刚算的公式 return chengchu(num) #继续递归 else: num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*", str(ji), num, 1) #一般正常情况下替换 return chengchu(num) #继续递归 else: #是/的时候 n1,n2 = re.split("\/",ret) #以/分割两边的数字 shang = float(n1)/float(n2) #得到数字进行运算 num = re.sub("-?\d+\.?\d*\/-?\d+\.?\d*",str(shang),num,1) #一般正常情况下替换 return chengchu(num) #继续递归 else: #没有*/的时候 return num #返回算的结果 def jiajian(num): '''加减操作''' while re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num): #当有+-运算时循环 ret = re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num).group() #获取包含+-*运算的算式 if re.search("-?\d+\.?\d*\+-?\d+\.?\d*",ret): #是+的时候 n1,n2 = re.split("\+",ret) #以+分割两边的数字 he = float(n1)+float(n2) #得到数字进行运算 num = re.sub("-?\d+\.?\d*\+-?\d+\.?\d*",str(he),num,1) #替换刚算的公式 return jiajian(num) #继续递归 else: n1, n2 = re.split("-", ret,1) # 以-分割两边的数字 if n1 == "": #n1分割为空时,说明-号在开头 n1,n2 = re.split("-",n2) #重新分割上面n2的结果 cha = -float(n1)-float(n2) #得到数字进行运算,注意前面得加上-号 else : #不是-开头的时候 cha = float(n1) - float(n2) # 得到数字进行运算 num = re.sub("-?\d+\.?\d*--?\d+\.?\d*",str(cha),num,1) #替换刚算的公式 return jiajian(num) #继续递归 else: #没有+-的时候 return num #返回算的结果 def form(res,sums1): '''格式输出''' res = re.sub("\(|\)", "", res) #去掉括号 ret = re.sub("\([^()]+\)",res,sums1,1) #把括号里的公式替换成结果 ret = re.sub("\+\+|--", "+", ret) #统一运算符,++为+,--为+ ret = re.sub("\+-|-\+", "-", ret) #统一运算符,+-为-,-+为- return ret #返回结果 def sear(num): '''运算规则''' if re.search("\([^()]+\)",num): #有括号先算 ret = re.search("\([^()]+\)", num).group() #获取括号里的公式 res = jiajian(chengchu(ret)) #在括号里先算乘除,后算加减 return sear(form(res, num)) #将格式化后的结果传给函数sear递归 else: #没有括号的时候 res = jiajian(chengchu(num)) #也是先算乘除,后算加减 return res #返回结果 while True: #用户交互模式 sums = input("请输入您要计算的内容q(quit):") #输入内容 if sums.lower() == "q": #输入q时,退出 break ret = sear(re.sub(" ","",sums)) #防止公式里有空格,替换空格后,调用函数 print("最终结果:",ret) #打印最终返回的运算结果 -------------------输出结果-------------------- 最终结果: 2776672.6952380957