作业五:RE 模块模拟计算器
# !/usr/bin/env python3
# _*_coding:utf-8_*_
'''
实现模拟计算器的功能:
公式: - * ( (- +(-/) * (-*/ + /*/* + * / )) - (-*)/ (-*) )
思路:
括号的计算优先级最高,应该优先计算括号内的式子,然后将值代替会原式子,循环,接着做惩处运算,最后是加减运算,然后弹出结果,
# print(eval('1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'))
'''
import re symbol = ['', '', '', '', '', '', '', '', '', '', '-', '+', '*', '/', '(', ')'] def check(formula):
'''
检查输入的公式的正确性:
除了十个数字和六个符号,其他的一律判错,但是这样会限制运算规则,目前先是这样规划
:param formula:
:return:
'''
symbol_flag = True
formula = re.sub(r'\s*', '', formula)
cal_list = list(formula)
for item in cal_list:
if item not in symbol:
symbol_flag = False
if not symbol_flag:
return
else:
return formula def change(formula):
'''
替换出现两个运算符在一起的情况:
:param formula:
:return:
'''
formula = formula.replace('--', '+')
formula = formula.replace('++', '+')
formula = formula.replace('**', '*')
formula = formula.replace('//', '=')
formula = formula.replace('*+', '*')
formula = formula.replace('/+', '/')
return formula def chengchu(arg):
val = arg[]
match = re.search(r'\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val)
if not match:
return content = re.search(r'\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val).group()
if len(content.split('*')) > :
n1, n2 = content.split('*')
value = float(n1) * float(n2)
else:
n1, n2 = content.split('/')
value = float(n1) / float(n2) before, after = re.split(r'\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val, )
new_str = '%s%s%s' % (before, value, after)
arg[] = new_str
print(arg)
chengchu(arg) def jiajian(arg):
while True:
if arg[].__contains__('+-') or arg[].__contains__("++") or arg[].__contains__('-+') or arg[].__contains__(
"--"):
arg[] = arg[].replace('++', '+')
arg[] = arg[].replace('+-', '-')
arg[] = arg[].replace('--', '+')
arg[] = arg[].replace('-+', '-')
else:
break if arg[].startswith('-'):
arg[] +=
arg[] = arg[].replace('-', '&')
arg[] = arg[].replace('+', '-')
arg[] = arg[].replace('&', '+')
arg[] = arg[][:] val = arg[] match = re.search(r'\d+\.?\d*[-+]{1}\d+\.?\d*', val)
if not match:
return content = re.search(r'\d+\.?\d*[-+]{1}\d+\.?\d*', val).group() if len(content.split('+')) > :
n1, n2 = content.split('+')
value = float(n1) + float(n2)
else:
n1, n2 = content.split('-')
value = float(n1) - float(n2) before, after = re.split(r'\d+\.?\d*[-+]{1}\d+\.?\d*', val, )
new_str = '%s%s%s' % (before, value, after)
arg[] = new_str
jiajian(arg) def compute(formula):
'''
操作加减乘除:根据操作
:param formula:
:return:
'''
inp = [formula, ] #
chengchu(inp)
jiajian(inp)
if divmod(inp[], )[] == :
result = float(inp[])
result = float(result) * -
else:
result = float(inp[])
return result def calcultor(formula):
'''
递归处理括号,并计算括号内的式子,将结果返回做替换,
:param formula:
:return:
'''
# 没有括号了
if not re.search(r'\(([-+*/]*\d+\.*\d*){2,}\)', formula):
final = compute(formula)
return final
# 取出其中的一个括号,然后计算
content = re.search(r'\(([-+*/]*\d\.*\d*){2,}\)', formula).group()
# 分裂表达式
before, nothing, after = re.split(r'\(([-+*/]*\d+\.*\d*){2,}\)', formula, )
# 计算括号里的内容
content = content[:len(content) - ]
ret = compute(content)
# 计算完后然后拿到结果,然后重新拼接成一个新的式子
formula = '%s%s%s' % (before, ret, after)
return calcultor(formula) # s='1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
# calcultor(s) def main():
print('欢迎使用计算器'.center(, '#'))
while True:
formula = input('计算式>>:').strip()
if formula == 'q':
exit()
elif len(formula) == :
continue
else:
formula=check(formula)
if formula == :
continue
else:
result = calcultor(formula)
print('计算结果为:\033[1;31;1m %s\033[0m' % (result))
try:
print('正确答案是:\033[1;31;1m %s\033[0m' %(eval(formula)))
except:
print('无法计算') if __name__ == '__main__':
main()
作业五:RE 模块模拟计算器的更多相关文章
- python作业模拟计算器开发(第五周)
作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...
- nodejs爬虫笔记(五)---利用nightmare模拟点击下一页
目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题 ...
- C#基础第三天-作业答案-集合-冒泡排序-模拟名片
.冒泡排序 Console.WriteLine("对集合里的数进行排序,请输入第一个数:"); int a = int.Parse(Console.ReadLine()); Con ...
- 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem D: LC-Display(模拟计算器显示数字)
Problem D: LC-Display Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 14 Solved: 3[Submit][Status][We ...
- 基于visual Studio2013解决C语言竞赛题之1088模拟计算器
题目 解决代码及点评 /************************************************************************/ /* ...
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- jQuery系列:五个模块总结
Query插件,以备并希望在前端方面有所长进.请批评指正. 一,类型判断全解 JQuery判断类型扩展方法:$.type() /*type: function( obj ) { if ( obj == ...
- Python 第五天 递归,计算器(2)
利用函数编写如下数列: 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584, ...
- 从零开始学Python04作业源码:模拟ATM电子银行(仅供参考)
bin目录:程序启动入口 ATM_start.py: #!/usr/bin/python # -*- coding: utf-8 -*- # 模拟ATM电子银行+登录账户权限控制+管理员管理模块 # ...
随机推荐
- Spring整合Shiro并扩展使用EL表达式
Shiro是一个轻量级的权限控制框架,应用非常广泛.本文的重点是介绍Spring整合Shiro,并通过扩展使用Spring的EL表达式,使@RequiresRoles等支持动态的参数.对Shiro的介 ...
- elfinder源码浏览-Volume文件系统操作类(1)
今天看了一个文件管理的java后台源码,elfinder 发现这个东东比我写的代码效率告到不知道哪去了,苦思冥想后还是抽点时间看看吧.. 它实现了我们电脑上的所以关于文件操作的动作,并生成了api开放 ...
- 【Unity3D与23种设计模式】外观模式(Facade)
GoF中定义: "为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用" 其实这个模式虽然很少听过 但我们在敲代码的时候却是经常使用 比如: 在游戏初始化时 要初始化很 ...
- SublimeText3插件安装及使用
之前写过一篇文章讲了安装PackageControl,这里就不做赘述了,需要的朋友移步到这篇文章:Sublime Text安装package control 安装插件方法:通过preferencs-- ...
- 手把手的SpringBoot教程,SpringBoot创建web项目(五)
这一节,我们来演示如何在SpringBoot项目中连接数据库,并且自动创建一张表. 按照惯例,数据库我们依然使用mysql,至于什么是jpa呢? jpa是sun推出的持久化规范(java persis ...
- 【Flask】 flask-socketio实现WebSocket
[flask-socektio] 之前不知道在哪个场合下提到过如何从web后台向前台推送消息.听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用.不过,反向ajax的代价也很明 ...
- Oracle服务器和客户端的安装和卸载
Oracle 11g服务器与客户端的完全卸载方式与前些版本有了改变: 一.卸载前准备: 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 二.批处理卸载 ...
- 使用selenium时提示:ImportError:No module named selenium
问题分析: 用的是mac系统,已经通过sudo pip install -U selenium安装好了selenium, 但是无论用命令行还是用sublime导入selenium都会提示错误. 于是查 ...
- linux挂载windows共享文件夹
1.建立共享文件夹 2.在linux中挂载共享目录 #mount -t cifs -o username=administrator,password=你的系统账号密码 //192.168.0.22/ ...
- Android 的消息队列模型
Android 的消息队列模型 Android是参考Windows的消息循环机制来实现Android自身的消息循环的. Android通过Looper.Handler来实现消息循环机制,Andr ...