zoukankan      html  css  js  c++  java
  • 计算器work_day05

    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,' ')

        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,' ')

    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

  • 相关阅读:
    windows下wchar_t* 转char*
    VS2010的调试参数/Zi /DEBUG
    fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'
    使用opencv传中文文件崩溃
    【20160924】GOCVHelper综述
    编译ITK
    几款开源图像处理软件评测研究
    新注册域名greenopen.site,向专业道路进军
    openmp在图像处理上面的运用
    实现multbandblend
  • 原文地址:https://www.cnblogs.com/xzmxddx/p/8409363.html
Copyright © 2011-2022 走看看