目的:实现简易计算器
实行功能:实现包含加减乘除括号在内的四则运算
在自学任何技能的过程中,一定要自己亲自做一遍,才能学习到真正的技能,走马观花的学习充其量只能了解,并不会应用,在此勉励自己,不忘初心 方得始终 ,断续续编了几天的计算器代码,终于把它完成了,可以接着往下学习了,加油
代码如下所示:
'''
Created on
@author: hcl
'''
import re
def mult(str_test):
'''
功能:对字符串str_test内只含有 * / 时,进行从左到右运算,并返回运算结果
输入:字符串
输出:字符串
'''
if (str_test[0] == '('):
str_test = str_test[1:-1]
content = re.split('[*,/]', str_test)
len_str_test = len(content)
if len_str_test > 1 :
if str_test[len(content[0])] == '/':
stemp = float(content[0])/float(content[1])
else:
stemp = float(content[0])*float(content[1])
str_test = str(stemp)+str_test[len(content[0])+len(content[1])+1:]
return mult(str_test)
else:
return str_test
def pas(str_test):
'''
功能:对字符串str_test内只含有+ - 时,进行从左到右运算,并返回运算结果
输入:字符串
输出:字符串
'''
if (str_test[0] == '('):
str_test = str_test[1:-1]
content = re.split('[+,-]', str_test)
if str_test[0] == '-':
content[1] = '-' + content[1]
content = content[1:]
len_content = len(content)
if len_content > 1 :
if str_test[len(content[0])] == '+':
stemp = float(content[0])+float(content[1])
else:
stemp = float(content[0])-float(content[1])
str_test = str(stemp)+str_test[len(content[0])+len(content[1])+1:]
return pas(str_test)
else:
return str_test
def find_kh(str_test):
"""
功能:寻找字符串str_test中的最里层括号
"""
try:
itm = re.search("\([^()]*\)", str_test).group() #截取最底层括号及其包含内容 如 (2+4)
n = re.search("\([^()]*\)", str_test).span() #截取内容的序号
return itm,n[0],n[1]
except AttributeError :
pass
def replaceStr(str_test,start,end,new_str_test):
"""
功能:替换字符串,str_test为原字符串,new_str_test为经过加减乘除以后的结果
"""
return str_test.replace(str_test[start:end],new_str_test)
def change_sign(str_test):
"""
功能:处理str_test中的符号
"""
str_test = re.sub(r'--','+',str_test)
str_test = re.sub(r'\+-','-',str_test)
str_test = re.sub(r'\+\+','+',str_test)
str_test = re.sub(r'-\+','-',str_test)
while re.findall(r'\*-',str_test): #处理特殊字符 *-
if re.search(r'\*-',str_test):
start,end = re.search(r'\*-',str_test).span()
str_test= str_test[0:start+1]+str_test[start+2:]
while start > 0:
pattern = re.compile(r'-')
if pattern.search(str_test,start-1,start):
str_test= str_test[:start-1] + '+' + str_test[start:]
break
pattern2 = re.compile(r'\+')
if pattern2.search(str_test,start-1,start):
str_test= str_test[:start-1] + '-' + str_test[start:]
break
start = start - 1
while re.findall(r'/-',str_test): #处理特殊字符 /-
if re.search(r'/-',str_test):
start,end = re.search(r'/-',str_test).span()
str_test= str_test[0:start+1]+str_test[start+2:]
while start > 0:
pattern = re.compile(r'-')
if pattern.search(str_test,start-1,start):
str_test= str_test[:start-1] + '+' + str_test[start:]
break
pattern2 = re.compile(r'\+')
if pattern2.search(str_test,start-1,start):
str_test= str_test[:start-1] + '-' + str_test[start:]
break
start = start - 1
return str_test
def lTor(str_test):
"""
功能:处理无括号的加减乘除操作
输入:字符串
输出:字符串
"""
str_test = change_sign(str_test)
matchObj = re.search('[*,/]', str_test)
if matchObj:
content = re.split('[+,-]', str_test)
while re.search('[*,/]', str_test):
start = 0
content = re.split('[+,-]', str_test)
for item in content:
if re.search('[*,/]', item):
stemp = mult(item)
str_test = str_test.replace(str_test[start:start+len(item)],stemp)
break
start += len(item)+1
else:
str_test = change_sign(str_test)
str_test = pas(str_test)
return str_test
else:
str_test = change_sign(str_test)
str_test = pas(str_test)
return str_test
def cac(str_test):
"""
功能:计算主入口
输入:待计算的字符串
输出:返回计算结果字符串
"""
str_test = change_sign(str_test)
if find_kh(str_test):
itm,start,end = find_kh(str_test)
# if itm[0] == '(':
# itm = itm[1:-1]
if itm[0:2] == '(+':
itm = itm[2:-1]
if itm[0] == '(':
itm = itm[1:-1]
str_test = replaceStr(str_test,start,end,lTor(itm))
return cac(str_test)
else:
str_test = lTor(str_test)
return str_test
test123 = "2-4*(3*2)"
test = "3-5-5"
test11 = "1-2*((-40/-5)-5+5*2+3/2)+(-40*-5)"
t = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
ttttt = "1-2*-1.5+1+2*-1.5-1-2*-1.5"
#print(cac(test11))
#print(cac(test123))
#print(cac(test))
#change_sign(test11)
print(cac(t))
#print(cac(t))
计算结果:2776672.6952380957