python作业day4计算器
思路:
用循环提取最里面的括号,再进行运算
运算时利用正则表达式寻找相应的运算符
先进行乘除,再进行加减
(参考武sir和金角大王的代码)
流程图:

代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
def cheng_and_chu(arg): #计算乘除
val = arg[0] #把传入的列表中第0个元素赋值给val
mch = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val) #利用正则表达式的查找字符串功能匹配val中的算数符赋值给mch
if not mch: #如果mch中没有乘除
return #结束函数返回这个mch中的值
content = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val).group() #利用正则表达式的查找字符串功能匹配val中的算数符,并使用group获取分组赋值给content
if len(content.split('*'))>1: #将content中的组以*分割,分割后的字符串长度大于1
n1,n2 = content.split('*') #将content中的组以*分割,分割后的两部分分别赋值给n1,n2
value = float(n1) * float(n2) #将n1,n2转换为浮点数,并相乘,结果赋值给value
else:
n1,n2 = content.split('/')
value = float(n1) / float(n2)
qianzhui,houzhui = re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val, 1) #用正则中的分割方法,吧val中的值以\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*分割,并将分割后的值分别赋值给qianzhi,后缀
new_str = "%s%s%s"%(qianzhui,value,houzhui) #将字符串重新格式化拼接
arg[0] = new_str #讲新的字符串复制给arg中的第0个元素
cheng_and_chu(arg) #继续运行乘除函数 def jia_and_jian(arg): #计算加减
while True:
if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"): #如果arg的第0个元素是'+-','--','++','-+'
arg[0] = arg[0].replace('+-','-') #将-替换掉+-
arg[0] = arg[0].replace('++','+') #将+替换掉++
arg[0] = arg[0].replace('-+','-') #将-替换掉-+
arg[0] = arg[0].replace('--','+') #将+替换掉--
else:
break
if arg[0].startswith('-'): #如果arg的第0个元素是以-开头
arg[1] += 1 #arg的第一个元素自加1
arg[0] = arg[0].replace('-','&')
arg[0] = arg[0].replace('+','-')
arg[0] = arg[0].replace('&','+')#将-变+,+变-
arg[0] = arg[0][1:]#将arg中第0个元素中前面多出来的符号去掉
val = arg[0]
mch = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val)
if not mch:
return
content = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val).group()
if len(content.split('+'))>1:
n1, n2 = content.split('+')
value = float(n1) + float(n2)
else:
n1, n2 = content.split('-')
value = float(n1) - float(n2)
before, after = re.split('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val, 1)
new_str = "%s%s%s" % (before,value,after)
arg[0] = new_str
jia_and_jian(arg) def jisuan(sr): #计算函数
new_sr = [sr.strip('()'),0] #将传入的值两边括号去掉,并组成列表赋值给new_sr
cheng_and_chu(new_sr) #调用乘除函数
jia_and_jian(new_sr) #调用加减函数
if divmod(new_sr[1],2)[1] == 1: #将运算后的传回的列表中的第1个元素处于2,除后得到的元组第1个元素等于1的话,
jieguo = float(new_sr[0]) #将运算后传回的列表中的第0个元素转化为浮点型,赋值给jieguo
jieguo = jieguo * -1 #并将jieguo乘-1
else: #如果不等于1
jieguo = float(new_sr[0]) #将运算后传回的列表中的第0个元素转化为浮点型,赋值给jieguo
return jieguo #结束函数返回jieguo def kuohao(sr): #去除括号函数
flag = True #设置一个标志位
while flag:
m = re.search("\([^()]+\)",sr) #找出sr中最里面的括号,赋值给m
if m:
sub_sr = m.group() #截取m中第一个括号
sub_res = jisuan(sub_sr) #调用计算函数,返回值赋值给sub_res
sr = sr.replace(m.group(),str(sub_res)) #将m截取的第一个括号内容替换为转化为str类型的sub_res
else:
print('结果:',jisuan(sr)) #如果没有括号了,打印计算函数返回的结果
flag = False #将标志位设置为False,用于跳出循环 if __name__ == "__main__":
print("----------欢迎使用计算器----------")
while True:
flag = True #设置一个标志位
sr = input("输入要计算的函数(q:退出):") #让用户输入计算函数,赋值给sr
sr = re.sub("\s*","",sr) #在sr中找到所有的空格,删除
error = re.search('[0-9q\*\/\-\+]',sr) #使用正则查找方法,在sr中找到0-9q\*\/\-\+这些字符,赋值给error
while flag:
if not error: #如果error为空
print("输入有误") #打印输入有误
sr = input("请重新输入要计算的函数(q:退出):") #重新让用户输入
else:
if error.group() == 'q': #如果用户输入的是q
exit("感谢使用,再见") #则推出整个程序
kuohao(sr) #用户输入的是计算函数,则调用去除括号函数
flag = False #并将标志位设置为False
计算器
python作业day4计算器的更多相关文章
- python作业模拟计算器开发(第五周)
作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- 程序设计第三次作业--C++计算器初始部分
面向对象程序设计作业3--C++计算器初始部分 Github 链接:https://github.com/luojingzhao/object-oriented/tree/master/calcula ...
- Python作业第一课
零基础开始学习,最近周边的同学们都在学习,我也来试试,嘿嘿,都写下来,下次不记得了还能来看看~~ Python作业第一课1)登陆,三次输入锁定,下次不允许登陆2)设计一个三级菜单,菜单内容可自行定义, ...
- Python作业-选课系统
目录 Python作业-选课系统 days6作业-选课系统: 1. 程序说明 2. 思路和程序限制 3. 选课系统程序目录结构 4. 测试帐户说明 5. 程序测试过程 title: Python作业- ...
- 第五次程序设计作业 C++计算器雏形 调用文件输入输出
一.C++计算器作业系列链接 第三次作业:C++计算器雏形 第三次作业附加:代码规范 第四次作业:命令行的调用及计算 MyGithub 二.本次作业相关 要求:第五次程序设计作业 根据这一次的作业要求 ...
- python作业ATM(第五周)
作业需求: 额度 15000或自定义. 实现购物商城,买东西加入 购物车,调用信用卡接口结账. 可以提现,手续费5%. 支持多账户登录. 支持账户间转账. 记录每月日常消费流水. 提供还款接口. AT ...
- day4 计算器
作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...
- c++ 第五次作业(计算器第三步)
第五次作业 (计算器第三步) 项目源文件地址:calculator 本次作业改进情况 加入多种读入选择 正常输出答案 -a 选项,输出表达式以及值 -f 选项,从指定文件读入,并把答案输出到指定文件 ...
随机推荐
- 【Android 错误记录】android.os.NetworkOnMainThreadException 异常问题
最近自己学习开发一个小app,想根据网络来判断一些逻辑,但是运行应用时遇到了这个错误 android.os.NetworkOnMainThreadException 后来,查询了一些信息,发现原因就是 ...
- AngularJS路由和模板
前言 如果想开发一款类似gmail的web应用,我们怎么做呢? 以jQuery的思路,做响应式的架构设计时,我们要监听所有点击事件,通过事件函数触发我们加载数据,提交,弹框,验证等的功能:以 Angu ...
- JSP作为img的src时chrome的bug
废话不说,直接上代码. 新建一个jsp文件,名为img.jsp,代码如下: <%@page import="javax.imageio.ImageIO"%> <% ...
- Transition 所支持的css属性
transition-property是用来指定当元素其中一个属性改变时执行transition效果: 所支持的属性类型如下: color: 通过红.绿.蓝和透明度组件变换(每个数值处理)如:back ...
- Zend Framework 框架搭建
通过手工方法搭建Zend Framework的MVC框架结构.首先看一下zend framework mvc的目录结构 1. 在根目录下面创建 public ,并在 public 下创建 index. ...
- nginx的conf文件的详细配置
#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...
- DM368启动串口打印分析
DM36x initialization passed! TI UBL Version: 1.50 Booting Catalog Boot Loader //启动目 ...
- thinkphp中的where()方法
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...
- tsm ANS0326E问题处理
备份tsm备份oracle 报错 ANS0326E This node has exceeded its maximum number of mount points. 查看所有节点详细信息 q no ...
- 有关ios中images.xcassets的导入图片等命名问题
最近遇到一个问题,就是在设置启动图片的时候,把启动图片命名设置为了xxx@2x.png, 然后应用死活没有显示启动图片,调试了很久,才发现是因为文件命名的原因. 1. 如果在图片的下方有2x或3x的标 ...