日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

计算器work_day05

發(fā)布時(shí)間:2024/9/5 编程问答 39 如意码农
生活随笔 收集整理的這篇文章主要介紹了 计算器work_day05 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

day_work_05

------Python是一個(gè)優(yōu)雅的大姐姐

作業(yè)計(jì)算器

設(shè)計(jì)思路

  1. 按照運(yùn)算優(yōu)先級(jí)和正則先算括號(hào)內(nèi)的值,提出來(lái)判斷符號(hào)問(wèn)題,然后依次計(jì)算。
  2. 分析題目設(shè)計(jì)了四個(gè)函數(shù),分別為a)去括號(hào)函數(shù)b)去符號(hào)函數(shù)c)去乘除號(hào)函數(shù)d)去加減號(hào)函數(shù)
  3. 各個(gè)函數(shù)之間實(shí)行調(diào)用,完美解決問(wèn)題,可能會(huì)有bug。

運(yùn)行代碼

# Author:Xiong

# 開(kāi)發(fā)一個(gè)簡(jiǎn)單的python計(jì)算器
# 實(shí)現(xiàn)加減乘除及拓號(hào)優(yōu)先級(jí)解析
# 用戶(hù)輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7
/3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# 等類(lèi)似公式后,必須自己解析里面的(),+,-,*,/符號(hào)和公式(不能調(diào)用eval等類(lèi)似功能偷懶實(shí)現(xiàn)),

import re

def remove_04(str_4):
    print('******去掉符號(hào)重復(fù)******')
    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

#去掉所有的括號(hào)并運(yùn)算出來(lái)
def remove_01(s):
    print('******去掉括號(hào)******')
    while True:
        ret = re.search('\([^\(,\)]+\)', s)
        if ret ==
None:
            break
        else
:
            print('取出來(lái)的括號(hào)加數(shù)字:',ret.group(),
'************')
            str = re.sub('\(|\)','',ret.group())
            str = remove_02(str)
            s = re.sub('\([^\(,\)]+\)', str , s , 1)
            print('去掉括號(hào)后的字符串:',s)
            s = remove_04(s)
            print('去掉重復(fù)運(yùn)算符后的字符串:', s,'\n\n')

return s

#去掉乘除法
def remove_02(str1):
    print('******去掉乘除運(yùn)算******')

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('******去掉加減運(yùn)算******')
    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('運(yùn)算的公式:',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('最后結(jié)果:',s)
else:
    print('輸入的計(jì)算公式格式錯(cuò)誤')

運(yùn)行結(jié)果

運(yùn)算的公式:
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))

******去掉括號(hào)******

取出來(lái)的括號(hào)加數(shù)字: (-40/5) ************

******去掉乘除運(yùn)算******

-40/5 ************

<_sre.SRE_Match object; span=(1, 5),
match='40/5'> ************

這是除法

-8.0 ************

******去掉加減運(yùn)算******

-8.0 ************

去掉括號(hào)后的字符串:
1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))

******去掉符號(hào)重復(fù)******

去掉重復(fù)運(yùn)算符后的字符串: 1-2*((60-30-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))

取出來(lái)的括號(hào)加數(shù)字: (9-2*5/3+7/3*99/4*2998+10*568/14) ************

******去掉乘除運(yùn)算******

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
************

******去掉加減運(yùn)算******

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 ************

去掉括號(hào)后的字符串: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))

******去掉符號(hào)重復(fù)******

去掉重復(fù)運(yùn)算符后的字符串: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))

取出來(lái)的括號(hào)加數(shù)字: (60-30-8.0*173545.88095238098) ************

******去掉乘除運(yùn)算******

60-30-8.0*173545.88095238098 ************

<_sre.SRE_Match object; span=(6, 28),
match='8.0*173545.88095238098'> ************

這是乘法

60-30-1388367.0476190478 ************

******去掉加減運(yùn)算******

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 ************

去掉括號(hào)后的字符串: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))

******去掉符號(hào)重復(fù)******

去掉重復(fù)運(yùn)算符后的字符串: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))

取出來(lái)的括號(hào)加數(shù)字: (-4*3) ************

******去掉乘除運(yùn)算******

-4*3 ************

<_sre.SRE_Match object; span=(1, 4),
match='4*3'> ************

這是乘法

-12.0 ************

******去掉加減運(yùn)算******

-12.0 ************

去掉括號(hào)后的字符串: 1-2*(-1388337.0476190478--12.0/(16-3*2))

******去掉符號(hào)重復(fù)******

去掉重復(fù)運(yùn)算符后的字符串: 1-2*(-1388337.0476190478+12.0/(16-3*2))

取出來(lái)的括號(hào)加數(shù)字: (16-3*2) ************

******去掉乘除運(yùn)算******

16-3*2 ************

<_sre.SRE_Match object; span=(3, 6),
match='3*2'> ************

這是乘法

16-6.0 ************

******去掉加減運(yùn)算******

16-6.0 ************

<_sre.SRE_Match object; span=(0, 6),
match='16-6.0'> ************

這是減法

10.0 ************

去掉括號(hào)后的字符串: 1-2*(-1388337.0476190478+12.0/10.0)

******去掉符號(hào)重復(fù)******

去掉重復(fù)運(yùn)算符后的字符串: 1-2*(-1388337.0476190478+12.0/10.0)

取出來(lái)的括號(hào)加數(shù)字: (-1388337.0476190478+12.0/10.0) ************

******去掉乘除運(yùn)算******

-1388337.0476190478+12.0/10.0 ************

<_sre.SRE_Match object; span=(20, 29),
match='12.0/10.0'> ************

這是除法

-1388337.0476190478+1.2 ************

******去掉加減運(yùn)算******

-1388337.0476190478+1.2 ************

<_sre.SRE_Match object; span=(1, 23),
match='1388337.0476190478+1.2'> ************

這是加法

-1388338.2476190478 ************

去掉括號(hào)后的字符串: 1-2*-1388338.2476190478

******去掉符號(hào)重復(fù)******

去掉重復(fù)運(yùn)算符后的字符串: 1+2*1388338.2476190478

******去掉乘除運(yùn)算******

1+2*1388338.2476190478 ************

<_sre.SRE_Match object; span=(2, 22),
match='2*1388338.2476190478'> ************

這是乘法

1+2776676.4952380955 ************

******去掉加減運(yùn)算******

1+2776676.4952380955 ************

<_sre.SRE_Match object; span=(0, 20),
match='1+2776676.4952380955'> ************

這是加法

2776677.4952380955 ************

******去掉加減運(yùn)算******

2776677.4952380955 ************

******去掉符號(hào)重復(fù)******

最后結(jié)果: 2776677.4952380955

總結(jié)

以上是生活随笔為你收集整理的计算器work_day05的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。