写了一个具有处理括号功能的简单计算器

#Author:Jiang Tao
'''思路:
1.判断是不是还有()。有,就把括号里面的内容提出来;形成式子a_1,a_2,a_3,a_4...
2.直到提出来的a_n没有括号 ,进行计算,再逐层替换
3.最后的式子中没有括号,只有加减乘除
4.计算出最终结果
'''
import re
def extract(formula):
'''第一部分:写一个能提取括号内部式子的方法
用结果替换括号中的式子
'''
first_b_quote = formula.find(')') #第一个反括号
for i in range(first_b_quote):
if formula[first_b_quote - i] == '(':
last_quote = first_b_quote - i
#print(i)
break
else:
continue
formula_1 = formula[last_quote+1 :first_b_quote]
#print("去括号>>:",formula_1)
return formula_1 #formula_1是取出来的最内部的括号里面的内容


def res(formulate_0):
'''
:param formulate_0:
:return: final result
'''
while True:
if '(' in formulate_0:
# 将含有()的地方,逐层替换
formula_1 = extract(formulate_0) #提出最里面括号的内容
reselt_form = caculate(formula_1) #计算最里面的括号的内容
#print(reselt_form,"括号的内容")
formulate_0 = formulate_0.replace('('+formula_1+')',reselt_form)
#print(formulate_0,type(formulate_0),"最后的表达式")
else:
# 对于没有括号的式子,直接计算
reselt_form = caculate(formulate_0)
break
return reselt_form



def spr(formula_spr):
'''
#将式子的每一项进行拆分--加减乘除分开
:param formula_spr: 表达式,字符串类型
:return: 返回拆分后的结果
'''
spr_f = re.split('(\/|\*|\+|\-)', formula_spr) # 加括号会把有的括号里面的字符串也放入列表
if '' in spr_f:
spr_f.remove('') #移除空元素
else:
pass
#print("字符串拆分>>:",spr_f)
return spr_f

def mul(form):
'''1.object:完成一个不带括号的式子里面的乘法运算
2.return:被替换的乘法的式子
'''
while True:
spr_f = spr(form)
if '*' in spr_f:
mul_loca = spr_f.index('*') #返回第一个乘号的位置
if spr_f[mul_loca + 1] != '-': #如果乘以一个负数,这样处理
mul_val = float(spr_f[mul_loca - 1]) * float(spr_f[mul_loca + 1])
form = form.replace(spr_f[mul_loca - 1] + '*' + spr_f[mul_loca + 1],
str(mul_val))
else:
mul_val = float(spr_f[mul_loca - 1]) * float(spr_f[mul_loca + 1]+
spr_f[mul_loca + 2])
#print(spr_f[mul_loca-1]+'*'+spr_f[mul_loca+2])
form = form.replace(spr_f[mul_loca-1]+'*'+spr_f[mul_loca+1]+spr_f[mul_loca+2],
str(mul_val))
#print(form,"form")
else:
mul_loca = None
#print("(*)计算完毕,form>>:",form)
break
return form

def dil(form):
'''1.object:完成一个不带括号的式子里面的除法运算
2.return:被替换的除法的式子
'''
while True:
spr_f = spr(form)
if '/' in spr_f:
div_loca = spr_f.index('/') #返回第一个除号(divide)的位置
if spr_f[div_loca + 1] != '-': # 如果乘以一个负数,这样处理
div_val = float(spr_f[div_loca - 1])/ float(spr_f[div_loca + 1])
# print(spr_f[mul_loca-1]+'*'+spr_f[mul_loca+2])
form = form.replace(spr_f[div_loca - 1] + '/' + spr_f[div_loca + 1],
str(div_val))
else:
div_val = float(spr_f[div_loca - 1]) / float(spr_f[div_loca + 1]+
spr_f[div_loca + 2])
form = form.replace(spr_f[div_loca - 1] +'/'+ spr_f[div_loca + 1]
+spr_f[div_loca + 2],str(div_val))
else:
div_loca = None
#print("(/)计算完毕,form>>:", form)
break
return form

def add(form):
'''1.object:完成一个不带括号的式子里面的加法运算
2.return:被替换的加法的式子
'''
while True:
spr_f = spr(form)
if '+' in spr_f :
add_loca = spr_f.index('+') #返回第一个加号的位置
if spr_f[add_loca + 1] != '-': # 如果加以一个负数,这样处理
add_val = float(spr_f[add_loca - 1])+ float(spr_f[add_loca + 1])
# print(spr_f[mul_loca-1]+'*'+spr_f[mul_loca+2])
form = form.replace(spr_f[add_loca - 1] + '+'
+ spr_f[add_loca + 1], str(add_val))
else:
add_val = float(spr_f[add_loca - 1]) + float(spr_f[add_loca + 1]+
spr_f[add_loca + 2])
# print(spr_f[mul_loca-1]+'*'+spr_f[mul_loca+2])
form = form.replace(spr_f[add_loca - 1] + '+'+ spr_f[add_loca + 1]
+spr_f[add_loca + 2], str(add_val))
else:
add_loca = None
#print("(+)计算完毕,form>>:", form)
break
return form

def sub(form):
'''1.object:完成一个不带括号的式子里面的加法运算
2.return:被替换的加法的式子
'''
while True:
spr_f = spr(form)
if '-' in spr_f and len(spr_f)>2:
sub_loca = spr_f.index('-') #返回第一个减号(subtract)的位置
if spr_f[sub_loca + 1] != '-': # 如果加以一个负数,这样处理
sub_val = float(spr_f[sub_loca - 1]) - float(spr_f[sub_loca + 1])
#print("减后的结果>>:",sub_val)
form = (form.replace(spr_f[sub_loca - 1] + '-'
+ spr_f[sub_loca + 1], str(sub_val))).strip()
#print("(-)计算完毕,form>>:", form)
else:
sub_val = float(spr_f[sub_loca - 1]) - float(spr_f[sub_loca + 1]
+spr_f[sub_loca + 2])
#print("减后的结果>>:",sub_val)
form = form.replace(spr_f[sub_loca - 1] + '-'
+ spr_f[sub_loca + 1]+spr_f[sub_loca + 2],
str(sub_val))
else:
sub_loca = None
#print("(-)计算完毕,form>>:", form)
break
return form


def caculate(formula):
'''
#2.进入四则混合运算的式子中应该是不含()的式子的,进行四则混合运算
:param formula: 传入参数为式子
:return: 返回式子的结果
'''
formula_mul = mul(formula)
formula_dil = dil(formula_mul)
formula_sub = sub(formula_dil)
formula_add = add(formula_sub)

result_form = formula_add
return result_form

if __name__ == '__main__':
formulat = input(">>:")
result = res(formulat)
print("the result is :",result)

猜你喜欢

转载自www.cnblogs.com/book-listener/p/10331145.html