day_work_05

------Python是一个优雅的大姐姐

作业计算器

设计思路

  1. 按照运算优先级和正则先算括号内的值,提出来判断符号问题,然后依次计算。
  2. 分析题目设计了四个函数,分别为a)去括号函数b)去符号函数c)去乘除号函数d)去加减号函数
  3. 各个函数之间实行调用,完美解决问题,可能会有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. 1.C#WinForm基础制作简单计算器

    利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...

  2. 自己动手写计算器v1.1

    这个改动主要是使用工厂模式替代了简单工厂模式,这样做的好处是如果以后我们要扩充其他运算时,就不用总是去修改工厂类, 这是可以采取工厂模式,主要是将原来简单工厂类的逻辑判断分离出来,将它作为一个借口,与 ...

  3. 自己动手写计算器v1.0

    今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...

  4. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  5. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  6. JS-自制提速小工具:开发页面时需要按比例计算宽高值的快速计算器

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...

  7. 由ArcMap属性字段自增引出字段计算器使用Python的技巧

    1.前言       前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...

  8. 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现

    前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...

  9. tn文本分析语言(四) 实现自然语言计算器

    tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...

随机推荐

  1. 【VS开发】【图像处理】V4L2 pixel format

    目录(?)[-] v4l2_pix_format定义 2 具体Pixel Format定义 1. v4l2_pix_format定义 [cpp] view plain copy /* *  V I D ...

  2. Linux集群之间配置NTP时间同步ntp

    NTP时间同步 注意事项 要注意的是,ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ...

  3. jquery ajax get 数组参数

    对一些get请求,但方法参数要求是数组或集合的,如下 public virtual ActionResult Test(List<int> ids) { return Json(" ...

  4. MySQL_基础

    ## 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓库. 3. 数据库的特点: 1. 持久化存储数据的.其实数据库就是一个 ...

  5. BATJ的常见java面试题

    JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么. 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允 ...

  6. 怎么编写properties文件

    1. 注释 在properties中注释是采用#号开头的方式来进行注释的 2. 编写properties文件 在properties中,一行就是一个键值对,简单的理解就是一行可以保存一个变量,键和值之 ...

  7. python 序列 转换 各种操作

    # 数据结构 字符串 列表 元组 数字序列# 10-19的整数# r1 = range(10,20)# print(r1)# print(type(r1))## # 19# print(r1[9])# ...

  8. Spring Cloud 入门概括介绍

    出处: 拜托!面试请不要再问我Spring Cloud底层原理 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring ...

  9. 去除富文本中的html标签及vue、react、微信小程序中的过滤器

    在获取富文本后,又只要显示部分内容,需要去除富文本标签,然后再截取其中一部分内容:然后就是过滤器,在微信小程序中使用还是挺多次的,在vue及react中也遇到过 1.富文本去除html标签 去除htm ...

  10. filebeat收集日志传输到Redis集群,logstash从Redis集群中拉取数据

    前提:已配置好Redis集群,并设置的有统一的访问密码 架构是filebeat-->redis集群-->logstash->elasticsearch,需要修改filebeat的输出 ...