计算器work_day05
day_work_05
------Python是一个优雅的大姐姐
作业计算器

设计思路
- 按照运算优先级和正则先算括号内的值,提出来判断符号问题,然后依次计算。
- 分析题目设计了四个函数,分别为a)去括号函数b)去符号函数c)去乘除号函数d)去加减号函数
- 各个函数之间实行调用,完美解决问题,可能会有bug。
运行代码
# Author:Xiong
# 开发一个简单的python计算器
# 实现加减乘除及拓号优先级解析
# 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7
/3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# 等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),
import re
def remove_04(str_4):
print('******去掉符号重复******')
flag = True
while flag:
flag = False
if str_4.find('*+') != -1:
str_4 = str_4.replace('*+','+')
flag = True
if str_4.find('+-') != -1:
str_4 = str_4.replace('+-','-')
flag = True
if str_4.find('--') != -1:
str_4 = str_4.replace('--','+')
flag = True
if str_4.find('*-') != -1:
ret1 = re.search('\d+(\.\d*)?\*\-\d+(\.\d*)?', str_4)
ret2 = ret1.group().replace('*-', '*')
ret3 = ''.join(['-',ret2])
str_4 =
str_4.replace(ret1.group(), ret3)
flag = True
if str_4.find('/-') != -1:
ret1 = re.search('\d+(\.\d*)?\/\-\d+(\.\d*)?', str_4)
ret2 = ret1.group().replace('/-', '/')
ret3 = ''.join(['-',ret2])
str_4 =
str_4.replace(ret1.group(), ret3)
flag = True
return str_4
#去掉所有的括号并运算出来
def remove_01(s):
print('******去掉括号******')
while True:
ret = re.search('\([^\(,\)]+\)', s)
if ret ==
None:
break
else:
print('取出来的括号加数字:',ret.group(),
'************')
str = re.sub('\(|\)','',ret.group())
str = remove_02(str)
s = re.sub('\([^\(,\)]+\)', str , s , 1)
print('去掉括号后的字符串:',s)
s = remove_04(s)
print('去掉重复运算符后的字符串:', s,'\n\n')
return s
#去掉乘除法
def remove_02(str1):
print('******去掉乘除运算******')
while True:
print(str1,
'************')
ret = re.search('\d+(\.\d*)?(\*|\/)\d+(\.\d*)?',str1)
if ret ==
None:
break
print(ret, '************')
if ret.group().find('*') != -1:
print('这是乘法')
data = ret.group().split('*')
num = float(data[0])*float(data[1])
str1 = re.sub('\d+(\.\d*)?(\*|\/)\d+(\.\d*)?', str(num), str1, 1)
elif ret.group().find('/') != -1:
print('这是除法')
data = ret.group().split('/')
num = float(data[0])
/ float(data[1])
str1 = re.sub('\d+(\.\d*)?(\*|\/)\d+(\.\d*)?', str(num), str1, 1)
str1 = remove_03(str1)
return str1
# 去掉加减法
def remove_03(str_1):
print('******去掉加减运算******')
while True:
print(str_1,
'************')
ret = re.search('\d+(\.\d*)?(\-|\+)\d+(\.\d*)?',str_1)
if ret ==
None:
break
print(ret, '************')
if ret.group().find('+') != -1:
print('这是加法')
data = ret.group().split('+')
num = float(data[0])+float(data[1])
str_1 = re.sub('\d+(\.\d*)?(\-|\+)\d+(\.\d*)?', str(num), str_1, 1)
elif ret.group().find('-') != -1:
print('这是减法')
data = ret.group().split('-')
num = float(data[0])
- float(data[1])
str_1 = re.sub('\d+(\.\d*)?(\-|\+)\d+(\.\d*)?', str(num), str_1, 1)
return str_1
s = '1 - 2 * ( (60-30
+(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
# s =
'8888888888*8+999999999-77777/888'
# s =
'(55555+66666-88888*88888/77777+44444*88888-898889)-(44564+789673242*7867-453453/45254)'
s = s.replace(' ','')
print('运算的公式:',s,'\n\n')
if s.count(')') == s.count(')') and re.search('[0-9,+,\-,*,/,=,\(,\)]+',s).group() == s :
s = remove_01(s)
s = remove_02(s)
s = remove_03(s)
s = remove_04(s)
print('最后结果:',s)
else:
print('输入的计算公式格式错误')
运行结果
运算的公式:
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
******去掉括号******
取出来的括号加数字: (-40/5) ************
******去掉乘除运算******
-40/5 ************
<_sre.SRE_Match object; span=(1, 5),
match='40/5'> ************
这是除法
-8.0 ************
******去掉加减运算******
-8.0 ************
去掉括号后的字符串:
1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
******去掉符号重复******
去掉重复运算符后的字符串: 1-2*((60-30-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
取出来的括号加数字: (9-2*5/3+7/3*99/4*2998+10*568/14) ************
******去掉乘除运算******
9-2*5/3+7/3*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(2, 5),
match='2*5'> ************
这是乘法
9-10.0/3+7/3*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(2, 8),
match='10.0/3'> ************
这是除法
9-3.3333333333333335+7/3*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 24),
match='7/3'> ************
这是除法
9-3.3333333333333335+2.3333333333333335*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 42),
match='2.3333333333333335*99'> ************
这是乘法
9-3.3333333333333335+231.00000000000003/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 41),
match='231.00000000000003/4'> ************
这是除法
9-3.3333333333333335+57.75000000000001*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 43),
match='57.75000000000001*2998'> ************
这是乘法
9-3.3333333333333335+173134.50000000003+10*568/14
************
<_sre.SRE_Match object; span=(40, 46),
match='10*568'> ************
这是乘法
9-3.3333333333333335+173134.50000000003+5680.0/14
************
<_sre.SRE_Match object; span=(40, 49),
match='5680.0/14'> ************
这是除法
9-3.3333333333333335+173134.50000000003+405.7142857142857
************
******去掉加减运算******
9-3.3333333333333335+173134.50000000003+405.7142857142857
************
<_sre.SRE_Match object; span=(0, 20),
match='9-3.3333333333333335'> ************
这是减法
5.666666666666666+173134.50000000003+405.7142857142857
************
<_sre.SRE_Match object; span=(0, 36),
match='5.666666666666666+173134.50000000003'> ************
这是加法
173140.1666666667+405.7142857142857
************
<_sre.SRE_Match object; span=(0, 35),
match='173140.1666666667+405.7142857142857'> ************
这是加法
173545.88095238098 ************
去掉括号后的字符串: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))
******去掉符号重复******
去掉重复运算符后的字符串: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))
取出来的括号加数字: (60-30-8.0*173545.88095238098) ************
******去掉乘除运算******
60-30-8.0*173545.88095238098 ************
<_sre.SRE_Match object; span=(6, 28),
match='8.0*173545.88095238098'> ************
这是乘法
60-30-1388367.0476190478 ************
******去掉加减运算******
60-30-1388367.0476190478 ************
<_sre.SRE_Match object; span=(0, 5),
match='60-30'> ************
这是减法
30.0-1388367.0476190478 ************
<_sre.SRE_Match object; span=(0, 23),
match='30.0-1388367.0476190478'> ************
这是减法
-1388337.0476190478 ************
去掉括号后的字符串: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
******去掉符号重复******
去掉重复运算符后的字符串: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
取出来的括号加数字: (-4*3) ************
******去掉乘除运算******
-4*3 ************
<_sre.SRE_Match object; span=(1, 4),
match='4*3'> ************
这是乘法
-12.0 ************
******去掉加减运算******
-12.0 ************
去掉括号后的字符串: 1-2*(-1388337.0476190478--12.0/(16-3*2))
******去掉符号重复******
去掉重复运算符后的字符串: 1-2*(-1388337.0476190478+12.0/(16-3*2))
取出来的括号加数字: (16-3*2) ************
******去掉乘除运算******
16-3*2 ************
<_sre.SRE_Match object; span=(3, 6),
match='3*2'> ************
这是乘法
16-6.0 ************
******去掉加减运算******
16-6.0 ************
<_sre.SRE_Match object; span=(0, 6),
match='16-6.0'> ************
这是减法
10.0 ************
去掉括号后的字符串: 1-2*(-1388337.0476190478+12.0/10.0)
******去掉符号重复******
去掉重复运算符后的字符串: 1-2*(-1388337.0476190478+12.0/10.0)
取出来的括号加数字: (-1388337.0476190478+12.0/10.0) ************
******去掉乘除运算******
-1388337.0476190478+12.0/10.0 ************
<_sre.SRE_Match object; span=(20, 29),
match='12.0/10.0'> ************
这是除法
-1388337.0476190478+1.2 ************
******去掉加减运算******
-1388337.0476190478+1.2 ************
<_sre.SRE_Match object; span=(1, 23),
match='1388337.0476190478+1.2'> ************
这是加法
-1388338.2476190478 ************
去掉括号后的字符串: 1-2*-1388338.2476190478
******去掉符号重复******
去掉重复运算符后的字符串: 1+2*1388338.2476190478
******去掉乘除运算******
1+2*1388338.2476190478 ************
<_sre.SRE_Match object; span=(2, 22),
match='2*1388338.2476190478'> ************
这是乘法
1+2776676.4952380955 ************
******去掉加减运算******
1+2776676.4952380955 ************
<_sre.SRE_Match object; span=(0, 20),
match='1+2776676.4952380955'> ************
这是加法
2776677.4952380955 ************
******去掉加减运算******
2776677.4952380955 ************
******去掉符号重复******
最后结果: 2776677.4952380955
计算器work_day05的更多相关文章
- 1.C#WinForm基础制作简单计算器
利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...
- 自己动手写计算器v1.1
这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...
- 自己动手写计算器v1.0
今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...
- 【IOS开发笔记03-视图相关】简单计算器的实现
UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...
- [LeetCode] Basic Calculator 基本计算器
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- JS-自制提速小工具:开发页面时需要按比例计算宽高值的快速计算器
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
1.前言 前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...
- 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现
前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...
- tn文本分析语言(四) 实现自然语言计算器
tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...
随机推荐
- 【Python开发】【神经网络与深度学习】网络爬虫之python实现
一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...
- 数据库SQL语句查询指定时间段内的数据
[摘要]有的时候,我们需要查询数据库某段时间之间的数据,比如2016年5月1号到到5月3号之间用户注册数量(特殊节假日期间)等.那么用SQL语句如何实现呢? 首先,数据表中的存时间的字段比如是addt ...
- HDU 1069 Monkey and Banana (动态规划、上升子序列最大和)
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- dp常见优化方法
noip范围内的dp优化方法: 加速状态转移 1.前缀和优化 2.单调队列优化 3.线段树或树状数组优化 精简状态 3:精简状态往往是通过对题目本身性质的分析,去省掉一些冗余的状态.相对以上三条套路性 ...
- Node.js FS模块方法速查
1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参数是回调函数.回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能 ...
- RabbitMQ入门教程(九):首部交换机Headers
原文:RabbitMQ入门教程(九):首部交换机Headers 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...
- google浏览器切换成中文
新浪下载地址:http://down.tech.sina.com.cn/content/40975.html 默认字体好像是西班牙语 1.浏览器地址chrome://settings/language ...
- Homebrew学习(七)之你应该定期更新 Homebrew
参考 你应该定期更新 Homebrew
- 面试必备:GET和POST的用法和区别
版权声明一:本文为博主原创文章,转载请附上原文出处链接和本声明.版权声明二:本网站的所有作品会及时更新,欢迎大家阅读后发表评论,以利作品的完善.版权声明三:对不遵守本声明或其他违法.恶意使用本网内容者 ...
- JVM 之类加载器
一.什么是 JVM JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程.当 Java 源文件能被成功编译成 .class 文件 ...