day4作业
作业内容:计算器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re,time
#加减字符处理函数
def handle_symbol(cal_str):
# if cal_str.__contains__("+-") or cal_str.__contains__("--") or cal_str.__contains__("-+") or cal_str.__contains__("++"):
if "+-" in cal_str or "++" in cal_str or "-+" in cal_str or "--" in cal_str:
cal_str = cal_str.replace("+-","-")
cal_str = cal_str.replace("--","+")
cal_str = cal_str.replace("++","+")
cal_str = cal_str.replace("-+","-")
return handle_symbol(cal_str) #递归替换符号
else:
return cal_str
#递归加减函数
def plus_minus(cal_str):
if cal_str[0] == "+":
cal_str = cal_str[1:]
m = re.search("[\-]?\d+[\.]?\d*[\+\-]\d+[\.]?\d*",cal_str)
if m:
m_str = m.group()
str_list = cal_str.split(m_str)
if len(m_str.split("+")) == 2: #如果长度为2,说明是加法,如果不是,就是减法
num1,num2 = m_str.split("+")
num = float(num1) + float(num2)
elif m_str[0] == '-': #减法中,如果匹配到的字符串第一个字符是-,需要特殊处理
m_str = m_str[1:]
num1,num2 = m_str.split("-")
num = -(float(num1) + float(num2))
else:
num1,num2 = m_str.split("-")
num = float(num1) - float(num2)
cal_str = "%s%s%s"%(str_list[0],num,str_list[1])
return plus_minus(cal_str)
else:
return cal_str
#递归乘除函数
def mul_div(cal_str):
m = re.search("\d+\.*\d*[\*\/][\-]?\d+\.*\d*",cal_str)
if m:
m_str = m.group()
str_list = cal_str.split(m_str)
if len(m_str.split("*")) == 2:
num1,num2 = m_str.split("*")
num = float(num1) * float(num2)
else:
num1,num2 = m_str.split("/")
num = float(num1) / float(num2)
cal_str = "%s%s%s"%(str_list[0],num,str_list[1])
return mul_div(cal_str)
else:
return cal_str
#递归计算函数
def calculate(cal_str):
if "(" in cal_str:
m = re.search("\([^\(\)]+\)",cal_str).group() #取出最里层括号
m2 = m[1:-1] #去括号
m_result = mul_div(m2) #做乘除运算
m_result = plus_minus(m_result) #做加减运算
cal_list = cal_str.split(m)
cal_str = cal_list[0] + str(m_result) + cal_list[1] #把运算结果放回原来字符串中
cal_str = handle_symbol(cal_str)
return calculate(cal_str)
else:
cal_str = mul_div(cal_str)
cal_str = handle_symbol(cal_str)
cal_str = plus_minus(cal_str)
return cal_str def main():
welcome = "欢迎进入简便计算器"
print("%s"%welcome.center(40,"*"))
print("计算器说明:"
"\n1.术式只能包括加减乘除、数字、点和小括号;"
"\n2.请严格按照示例格式输入术式;"
"\n3.示例:(1-2)*(60-30+(-40/5)*(9-2*5/3+12-3))+(5*8/9+(1/2+3))/(1+3)+(5-2/2);"
"\n4.输入q可以退出。")
while True:
cal_str = re.sub(" ",'',input("请输入计算术式:"))
cal_str = handle_symbol(cal_str)
if cal_str == "q":
exit("欢迎下次光临")
# 以下if都是判断格式有没有错误的,还有一些bug暂时没法解决
if re.search("[^0-9\+\-\*\/\(\)\.]",cal_str) or re.match("[\.\*\/]",cal_str) or re.search("\([\+\-\*\/]?\)",cal_str):
print("输入有误,请重新输入")
time.sleep(1)
continue
if "." in cal_str:
if len(re.findall("[0-9]+\.[0-9]+",cal_str)) != cal_str.count("."):
print("输入有误,请重新输入")
time.sleep(1)
continue
if "(" in cal_str or ")" in cal_str:
left = cal_str.count("(")
right = cal_str.count(")")
if left != right:
print("输入有误,请重新输入")
time.sleep(1)
continue
result = calculate(cal_str) #调用计算函数算出结果
print("我的计算结果是:%s"%result)
print("eval正确结果是:%s"%eval(cal_str)) if __name__ == "__main__":
main()
calculate.py
测试环境:windows7下Python3.5.1
程序说明:
1、启动程序会提示欢迎信息并提示计算器用法
2、输入计算术式按回车进行运算,输入q退出程序,如果术式不对会提示错误并返回重新输入
3、术式正确会进行运算并显示计算结果
程序设计思维想法:
1.先检测有没有小括号,如果有小括号就把最里层小括号拿出来进行运算,把运算结果替代原来的小括号位置,然后递归运算直到没有小括号为止
2.如果没有小括号,直接调用乘除函数和加减函数计算得出结果
day4作业的更多相关文章
- day4作业模拟实现一个ATM + 购物商城程序
作业需求: 模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义: 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账: 3.可以提现,手续费5%: 4.每月22号出账单,每月10 ...
- day4 作业计算器
作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...
- 老男孩Day4作业:员工信息查询系统
1.作业需求: (1).工信息表程序,实现增删改查操作: (2).可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where ...
- python基础: day4作业计算器
作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - ...
- Day4作业:蛋疼CRM系统
先上流程图,还得27寸4K显示器,画图各种爽: ReadMe: 运行程序前的提示: 1.抱歉,你得装prettytable模块...... 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格 ...
- Python3.5 day4作业:对员工信息文件,实现增删改查操作。
需求: 1.可进行模糊查询,语法至少支持下面3种: 1.select name,age from staff_table where age > 22 2.select * from staf ...
- day4作业之信息表
实在是太low了,终究是自己写的,记录下 #!/usr/bin/env python # coding=utf8 import os, re #这里我把查询这块分为3个函数了,纠结了很久是放一起还是分 ...
- day4作业小代码练习
登录模块: 我们无论上那个网站,经常遇到这样的情况,让我们登录这个网站,流程图如下: 思路: 1.当我们登录网站的时候,我们首先会输入用户名,这个时候,有些网站会提醒我们用户名是否存在,如果我们输入的 ...
- Day4作业及默写
1,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...
随机推荐
- QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)
如何使QTreeView快速显示1000万条数据,并且内存占用量少呢?这个问题困扰我很久,在网上找了好多相关资料,都没有找到合理的解决方案,今天在这里把我的解决方案提供给朋友们,供大家相互学习. 我开 ...
- List<T>到XML的序列化与反序列化
原文 http://hi.baidu.com/shishengli1234/item/f0536f36335390c22f8ec24b Model.RESE_SCH sch1 = new Model. ...
- 自己模拟实现math.h中的函数
之前一直都很迷惑pow()函数时怎么实现的,对于整数次的幂我还能很容易做到,但是对于分数次幂就不是那么好做了.需要一些高等数学级数的知识. 我这里实现了求ln(x), pow(double x, do ...
- HDU 5741 Helter Skelter(构造法)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5741 [题目大意] 一个01相间的串,以0开头,给出的序列每个数字表示连续的0的个数或者1的个数, ...
- openStack core service Components Ins shell scripts and simple provision
will to be announced,functional testing,tuning,debuging.....,Enthusiastic audience Please to wait pa ...
- 【Android界面实现】信息更新小红点显示——自己定义控件BadgeView的使用介绍
在如今大部分的信息公布类应用,都有这样的一个功能:当后台数据更新,比方有系统消息或者是用户间有互动的时候,通过在控件上显示一个小红点来提示用户有新的信息.一般来说,这样的业务需求,我们能够在布局文件里 ...
- 不是技术牛人,如何拿到国内IT巨头的Offer(1)
转自:http://developer.51cto.com/art/201404/436685.htm 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...
- HTML静态网页(框架)
1.frameset frameset最外层,使用时需要去除body改用frameset. <frameset rows="100,*" frameborder=" ...
- dans le quartier
culture /kyltyr/ 文化 une école [ekɔl] un cinéma un musée une église un théâtre [teɑtr] un opéra [ɔp ...
- 在Mac pro上如何配置adb命令?
在Mac pro上如何将Android SDK的adb命令添加到环境变量中,这里将进行说明! 方法/步骤 1 启动终端,可以在Spotlight中搜索“终端” 2 进入当前用户的HOME目录,命令如下 ...