博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day4作业
阅读量:4550 次
发布时间:2019-06-08

本文共 4359 字,大约阅读时间需要 14 分钟。

作业内容:计算器
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                 continue100         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.如果没有小括号,直接调用乘除函数和加减函数计算得出结果

转载于:https://www.cnblogs.com/akon0207/p/5196953.html

你可能感兴趣的文章
CSS五類常用選擇器(收藏)
查看>>
have a thing用法
查看>>
为什么 远程钩子 必须使用动态链接库dll(而且是.data? 段共享的动态链接库)...
查看>>
redis 从0到1 linux下的安装使用 数据类型 以及操作指令 一
查看>>
MongoDB-启动的时候出现了问题
查看>>
解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误
查看>>
第三次作
查看>>
模板 - ST表
查看>>
ZMQ示例:使用 curve 进行加密通信
查看>>
【网络流】 SGU 194 Reactor Cooling 无源无汇上下界可行流(裸题)
查看>>
cmd命令大全
查看>>
SSM框架---详细整合教程
查看>>
hdu 1907 尼姆博弈
查看>>
hdu 2177 威佐夫博弈变形
查看>>
面试问题联想
查看>>
IOS数据持久化之归档NSKeyedArchiver
查看>>
你应该首先保护哪些应用程序?这个问题本身问错了!
查看>>
C++之检测文件结尾
查看>>
【Delphi】注册快捷键
查看>>
字符串、文件操作,英文词频统计预处理
查看>>