1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import re,time
4 #加减字符处理函数
5 def handle_symbol(cal_str):
6 # if cal_str.__contains__("+-") or cal_str.__contains__("--") or cal_str.__contains__("-+") or cal_str.__contains__("++"):
7 if "+-" in cal_str or "++" in cal_str or "-+" in cal_str or "--" in cal_str:
8 cal_str = cal_str.replace("+-","-")
9 cal_str = cal_str.replace("--","+")
10 cal_str = cal_str.replace("++","+")
11 cal_str = cal_str.replace("-+","-")
12 return handle_symbol(cal_str) #递归替换符号
13 else:
14 return cal_str
15 #递归加减函数
16 def plus_minus(cal_str):
17 if cal_str[0] == "+":
18 cal_str = cal_str[1:]
19 m = re.search("[\-]?\d+[\.]?\d*[\+\-]\d+[\.]?\d*",cal_str)
20 if m:
21 m_str = m.group()
22 str_list = cal_str.split(m_str)
23 if len(m_str.split("+")) == 2: #如果长度为2,说明是加法,如果不是,就是减法
24 num1,num2 = m_str.split("+")
25 num = float(num1) + float(num2)
26 elif m_str[0] == '-': #减法中,如果匹配到的字符串第一个字符是-,需要特殊处理
27 m_str = m_str[1:]
28 num1,num2 = m_str.split("-")
29 num = -(float(num1) + float(num2))
30 else:
31 num1,num2 = m_str.split("-")
32 num = float(num1) - float(num2)
33 cal_str = "%s%s%s"%(str_list[0],num,str_list[1])
34 return plus_minus(cal_str)
35 else:
36 return cal_str
37 #递归乘除函数
38 def mul_div(cal_str):
39 m = re.search("\d+\.*\d*[\*\/][\-]?\d+\.*\d*",cal_str)
40 if m:
41 m_str = m.group()
42 str_list = cal_str.split(m_str)
43 if len(m_str.split("*")) == 2:
44 num1,num2 = m_str.split("*")
45 num = float(num1) * float(num2)
46 else:
47 num1,num2 = m_str.split("/")
48 num = float(num1) / float(num2)
49 cal_str = "%s%s%s"%(str_list[0],num,str_list[1])
50 return mul_div(cal_str)
51 else:
52 return cal_str
53 #递归计算函数
54 def calculate(cal_str):
55 if "(" in cal_str:
56 m = re.search("\([^\(\)]+\)",cal_str).group() #取出最里层括号
57 m2 = m[1:-1] #去括号
58 m_result = mul_div(m2) #做乘除运算
59 m_result = plus_minus(m_result) #做加减运算
60 cal_list = cal_str.split(m)
61 cal_str = cal_list[0] + str(m_result) + cal_list[1] #把运算结果放回原来字符串中
62 cal_str = handle_symbol(cal_str)
63 return calculate(cal_str)
64 else:
65 cal_str = mul_div(cal_str)
66 cal_str = handle_symbol(cal_str)
67 cal_str = plus_minus(cal_str)
68 return cal_str
69
70 def main():
71 welcome = "欢迎进入简便计算器"
72 print("%s"%welcome.center(40,"*"))
73 print("计算器说明:"
74 "\n1.术式只能包括加减乘除、数字、点和小括号;"
75 "\n2.请严格按照示例格式输入术式;"
76 "\n3.示例:(1-2)*(60-30+(-40/5)*(9-2*5/3+12-3))+(5*8/9+(1/2+3))/(1+3)+(5-2/2);"
77 "\n4.输入q可以退出。")
78 while True:
79 cal_str = re.sub(" ",'',input("请输入计算术式:"))
80 cal_str = handle_symbol(cal_str)
81 if cal_str == "q":
82 exit("欢迎下次光临")
83 # 以下if都是判断格式有没有错误的,还有一些bug暂时没法解决
84 if re.search("[^0-9\+\-\*\/\(\)\.]",cal_str) or re.match("[\.\*\/]",cal_str) or re.search("\([\+\-\*\/]?\)",cal_str):
85 print("输入有误,请重新输入")
86 time.sleep(1)
87 continue
88 if "." in cal_str:
89 if len(re.findall("[0-9]+\.[0-9]+",cal_str)) != cal_str.count("."):
90 print("输入有误,请重新输入")
91 time.sleep(1)
92 continue
93 if "(" in cal_str or ")" in cal_str:
94 left = cal_str.count("(")
95 right = cal_str.count(")")
96 if left != right:
97 print("输入有误,请重新输入")
98 time.sleep(1)
99 continue
100 result = calculate(cal_str) #调用计算函数算出结果
101 print("我的计算结果是:%s"%result)
102 print("eval正确结果是:%s"%eval(cal_str))
103
104 if __name__ == "__main__":
105 main()