码迷,mamicode.com
首页 > 其他好文 > 详细

day06_final

时间:2017-10-28 12:38:31      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:nbsp   compute   strip()   split   python   括号   pytho   递归   arc   

# 开发一个简单的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等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

# 思路:
# 1、将用户输入的算式传给括号函数
# 2、空格函数将算式最内层括号交给计算函数处理
# 3、计算函数将最内层括号算式交给乘除函数和加减函数处理
# 4、乘除函数计算算式中乘除,并将结果拼接到算式中
# 5、加减函数计算算式中加减,并将结果拼接到算式中
# 6、将最内层括号计算结果拼接到用户输入的算式。递归进行空格函数

 

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#Author:ray.zhang

import re
def fun_add(bra):
res_add = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘, bra)
if not res_add:
print(‘加减运算结果是:%s‘%bra)
return
res_add1=res_add.group()
if len(res_add1.split(‘+‘)) > 1:
n1,n2=res_add1.split(‘+‘)
val=float(n1)+float(n2)
else:
val=eval(res_add1) #考虑负数与减号-一样,split(‘-‘)无效
first,end=bra.split(res_add1)
bra=‘%s%s%s‘%(first,val,end)
fun_add(bra)

def fun_mul(bra):
res_mul = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘, bra)
if not res_mul:
print(‘乘除运算结果:%s‘%bra)
return bra
else:
res_mul1=res_mul.group()
if len(res_mul1.split(‘*‘)) > 1:
n1,n2=res_mul1.split(‘*‘)
val=float(n1)*float(n2)
else:
n1, n2 = res_mul1.split(‘/‘)
val=round(float(n1) / float(n2),2)
first,end=bra.split(res_mul1)
bra=‘%s%s%s‘%(first,val,end)
fun_mul(bra)

def fun_bra_compute(bra):
#9-2*5/3+7/3*99/4*2998+10*568/14
res_mul = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘, bra)
if res_mul:
res1=fun_mul(bra)
print(res1)
exit()
res_add = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘, res1)
if res_add:
res2=fun_add(res1)
return res2

def fun_bra(equation):
bra=re.search(‘\([^()]+\)‘, equation)
if not bra:
res=fun_bra_compute(equation)
print(‘最终运算结果是:%s‘%res)
return res
bra1=bra.group()
first,end=equation.split(bra1)
bra1=bra1[1:len(bra1)-1]
print(‘计算前的算式:%s‘ % equation)
res=fun_bra_compute(bra1)
equation=‘%s%s%s‘ %(first,res,end)
print(‘计算后的算式:%s‘ %equation)
fun_bra(equation)

def main():
equation=input(‘请输入您的算式:‘).strip().replace(‘ ‘,‘‘)
bra=re.search(‘\(([\-\+\*\/]*\d+\.?\d*)+\)‘,equation).group()
fun_bra(equation)

res=main()
print(res)

day06_final

标签:nbsp   compute   strip()   split   python   括号   pytho   递归   arc   

原文地址:http://www.cnblogs.com/zhangray/p/7746114.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!