用python實現復雜公式的計算器功能
阿新 • • 發佈:2018-05-27
方法 檢查 res 格式 去除空格 AR print pil 奇怪
給出一段如下行,比較復雜的運算公式,自己編寫代碼計算 1 - 2.99 * ( (60.2-30 +( -40/ 5) * (9-2*5/3 + 7 /3*99/4*2998 +10.5 * 568/14 )) - (-4*3)/ (16-3*2) ) 思路: step1.需要先檢查合法性,檢測有無字母及其他的非運算的非法字符 step2.格式化公式,去除空格,替換(--,+-,-+,++)之類的雙運算符為(+,-,-,+) step3.先計算()內的乘除,加減,然後再計算最後不含()的乘除,加減
# 檢查公式的合法性,有無非法字符 def check(s): if not s.count(‘(‘) == s.count(‘)‘): print(‘請檢查,括號未閉合‘) elif re.findall(‘[!@#$]‘, ‘s‘) is not None: print(‘請檢查,該公式含有非法符號‘) elif re.findall(‘[a-zA-Z]‘, ‘s‘) is not None: print(‘請檢查,該公式含有字母‘) elif s >= u‘\u4e00‘ and s <= u‘\u9fa5‘: print(‘請檢查,該公式含有中文‘) # 格式化公式,去除空格,重新定義雙符號def formats(s): s = s.replace(‘ ‘, ‘‘) s = s.replace(‘++‘, ‘+‘) s = s.replace(‘--‘, ‘+‘) s = s.replace(‘+-|-+‘, ‘-‘) s = s.replace(‘*+‘, ‘*‘) s = s.replace(‘/+‘, ‘/‘) return s
取數字和帶小數點的方法,2種結果都一樣,註意體會
ret = re.findall(r‘[\d\.]+‘, ‘numbrt 1.58 abc 123‘)
print(ret) # [‘1.58‘, ‘123‘]
ret = re.findall(‘\d\.?\d*‘, ‘numbrt 1.58 abc 123‘)
print(ret) # [‘1.58‘, ‘123‘]
def cheng_chu(s): # 處理帶負號的乘除 s = formats(s) r = re.compile(r‘[\d\.]+[\*/]-?[\d\.]+‘) while re.search(r‘[\*/]‘, s): ma = re.search(r, s).group() # print(ma) li = re.findall(r‘(-?[\d\.]+|\*|/)‘, ma) if li[1] == ‘*‘: result = str(float(li[0]) * float(li[2])) else: result = str(float(li[0]) / float(li[2])) s = s.replace(ma, result, 1) return s def jia_jian(s): # 處理加減法,變成數組,全加 s = formats(s) li = re.findall(r‘([\d\.]+|\+|-)‘, s) nums = 0 for i in range(len(li)): if li[i] == ‘-‘: li[i] = ‘+‘ li[i + 1] = float(li[i + 1]) * -1 for i in li: if i == ‘+‘: i = 0 nums = nums + float(i) return str(nums) def simple(x): # 處理不帶括號的 return jia_jian(cheng_chu(x)) def jiSuan(x): # 處理帶括號的 while ‘(‘ in x: reg = re.compile(r‘\([^\(\)]+\)‘) ma = re.search(reg, x).group() result = simple(ma[1:-1]) x = x.replace(ma, result, 1) return simple(x)
ss = ‘1 - 2.99 * ( (60.2-30 +( -40/ 5) * (9-2*5/3 + 7 /3*99/4*2998 +10.5 * 568/14 )) - (-4*3)/ (16-3*2) )‘.replace(‘ ‘, ‘‘) print(‘你的計算結果:‘, jiSuan(ss)) print(‘eval計算結果:‘, eval(ss))
後面測試階段就奇怪了:
if jiSuan(ss) == eval(ss):
print(‘計算正確,你很棒喲 @_@‘)
else:
print(‘計算不正確,請重新來過!‘)
# 這裏很奇怪,要是不str(),直接比較,就會顯示‘計算不正確’,難道後面還有小數點嗎?
if str(jiSuan(ss)) == str(eval(ss)):
print(‘計算正確,你很棒喲 @_@‘)
else:
print(‘計算不正確,請重新來過!‘)
請大佬指點.
用python實現復雜公式的計算器功能