day4作业


作业内容:计算器

  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()
calculate.py

 

测试环境:windows7下Python3.5.1


程序说明:
1、启动程序会提示欢迎信息并提示计算器用法
2、输入计算术式按回车进行运算,输入q退出程序,如果术式不对会提示错误并返回重新输入
3、术式正确会进行运算并显示计算结果

程序设计思维想法:
1.先检测有没有小括号,如果有小括号就把最里层小括号拿出来进行运算,把运算结果替代原来的小括号位置,然后递归运算直到没有小括号为止
2.如果没有小括号,直接调用乘除函数和加减函数计算得出结果

你可能感兴趣的:(day4作业)