作业内容:计算器
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()
测试环境:windows7下Python3.5.1
程序说明:
1、启动程序会提示欢迎信息并提示计算器用法
2、输入计算术式按回车进行运算,输入q退出程序,如果术式不对会提示错误并返回重新输入
3、术式正确会进行运算并显示计算结果
程序设计思维想法:
1.先检测有没有小括号,如果有小括号就把最里层小括号拿出来进行运算,把运算结果替代原来的小括号位置,然后递归运算直到没有小括号为止
2.如果没有小括号,直接调用乘除函数和加减函数计算得出结果