该计算器主要分为四个模块:
weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式;
add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值
multi_divide函数用来进行乘除运算,如果有多个乘除运算,会递归,最后返回对应的值
del_bracket函数用来去除小括号及调用multi_divide和add_sub函数,如果存在多个括号,也会实现递归。
代码如下:
#! /usr/bin/env python3 import sys
import re def welcome_func():
flag_exit = True
welcome_str = "超级计算器"
print(welcome_str.center(50, "*"), '\n')
while flag_exit:
exp = input("请输入要计算的表达式[q:退出]: ").strip()
if exp == "q":
flag_exit = False
elif len(exp) == 0:
continue
else:
exp = re.sub("\s*", '', exp) ## 取出空格
return exp def multi_divide(expression):
val = re.search("\d+\.?\d*[*/][+-]?\d+\.?\d*", expression) ##匹配乘除号,如192.168*-1.99
if not val: # 乘除号不存在,返回输入的表达式
return expression
data = re.search("\d+\.?\d*[*/][+-]?\d+\.?\d*", expression).group()
if len(data.split('*')) > 1: # 当可以用乘号分割,证明有乘法运算
part1, part2 = data.split('*') # 用除号分割
value = float(part1) * float(part2)
else:
part1, part2 = data.split('/')
if float(part2) == 0: # 如果分母为0,则退出计算
sys.exit("计算过程中有被除数为0的存在,计算表达式失败!")
value = float(part1) / float(part2) s1, s2 = re.split("\d+\.?\d*[*/][+-]?\d+\.?\d*", expression, 1) # 分割表达式
next_expression = "%s%s%s" % (s1, value, s2)
return multi_divide(next_expression) # 递归表达式 def add_sub(expression):
expression = expression.replace('+-', '-') # 替换表达式里的所有‘+-‘
expression = expression.replace('--', '+') # 替换表达式里的所有‘--‘
expression = expression.replace('-+', '-') # 替换表达式里的所有‘-+‘
expression = expression.replace('++', '+') # 替换表达式里的所有‘++‘ data = re.search('\d+\.?\d*[+-]\d+\.?\d*', expression) # 匹配加减号
if not data: # 如果不存在加减号,则证明表达式已计算完成,返回最终结果
return expression
val = re.search('[+-]?\d+\.?\d*[+-]\d+\.?\d*', expression).group()
if len(val.split('+')) > 1: # 以加号分割成功,有加法计算
part1, part2 = val.split('+')
value = float(part1) + float(part2)
elif val.startswith('-'): # 如果是已‘-‘开头则需要单独计算
part1, part2, part3 = val.split('-')
value = -float(part2) - float(part3) # 计算以负数开头的减法
else:
part1, part2 = val.split('-')
value = float(part1) - float(part2) s1, s2 = re.split('[+-]?\d+\.?\d*[+-]\d+\.?\d*', expression, 1) # 分割表达式
next_expression = "%s%s%s" % (s1, value, s2)
return add_sub(next_expression) # 递归运算表达式 def del_bracket(expression): ## [^()]+ 匹配除了括号以外的任意字符 if not re.search(r"\([^()]+\)", expression): # 判断小括号,如果不存在小括号,直接调用乘除,加减计算
ret1 = multi_divide(expression)
ret2 = add_sub(ret1)
return ret2 # 返回最终计算结果
data = re.search(r"\([^()]+\)", expression).group() # 如果有小括号,匹配出优先级最高的小括号
print("获取表达式", data)
data = data.strip('[\(\)]') # 剔除小括号
ret1 = multi_divide(data)
# print("全部乘除计算完后的表达式:", ret1)
ret2 = add_sub(ret1)
# print("全部加减计算结果:", ret2)
part1, part2 = re.split(r"\([^()]+\)", expression, 1) # 分割表达式
expression = "%s%s%s" % (part1, ret2, part2)
return del_bracket(expression) # 递归去小括号 if __name__ == "__main__":
try:
expression = welcome_func() ## 获取表达式
print(expression)
result = eval(expression) ## 用eval来验证
print(result)
ret = del_bracket(expression) ## 用函数计算得出结果
result = float(result)
ret = float(ret)
print("eval计算结果: ", result)
print("表达式计算结果: ", ret)
except (SyntaxError, ValueError, TypeError):
print("输入表达式不合法,请检查!")