實現計算類似公式的計算器程式1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
一.while迴圈版本
import res='1 - 2 * ( (60-30 +(-40/5 )* (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
s=s.replace(' ','')
while '('in s and ')'in s:
ret1 = re.search('\([^()]+\)', s).group() #用search乙個個的找括號裡面的公式
while 1:
if '*' in ret1 or '/' in ret1:
e, f = s.split(ret1) #用括號裡面的內容將公式切割
# ret1 = ret1.lstrip('(').rstrip(')') #去掉括號的左右倆邊"()"
ret2 = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', ret1).group() #用search乙個個的找括號裡面的公式的乘除法
c,d=ret1.split(ret2) #把括號裡面的內容用乘除法切割
if '*' in ret2:
a,b=ret2.split('*') #用符號切割得到兩邊的數字
ret2=float(a)*float(b) #將字串轉化成浮點數進行運算
ret1=c + str(ret2) + d #把運算結果再轉回字串拼接到括號裡面
s=e+ret1+f #把括號拼接到公式裡
print(s)
elif '/' in ret2:
a, b = ret2.split('/')
ret2 = float(a) / float(b)
ret1 = c + str(ret2) + d
s=e+ret1+f
print(s)
else:break
if '+' in ret1 or '-' in ret1:
e, f = s.split(ret1) # 用括號裡面的內容將公式切割
ret1 = ret1.lstrip('(').rstrip(')') # 去掉括號的左右倆邊"()"
if '--' in s:
s = s.replace('--', '+')
if '-+' in s:
s = s.replace('-+', '-')
if '+-' in s:
s = s.replace('+-', '-')
if '++' in s:
s = s.replace('++', '+')
lst = re.findall('[+-]?\d+(?:\.\d+)?',ret1) # 用findall找到所有的加減法,放到列表裡
print(lst)
res = sum([float(i) for i in lst])
s=e+str(res)+f
print(s)
while '*' in s or '/' in s: #計算括號外面的乘除法
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',s).group()
a,b=s.split(ret)
if '*' in ret:
c, d = ret.split('*')
ret=float(c)*float(d)
s = a +str(ret) + b
print(s)
elif '/' in ret:
a, b = ret.split('/')
ret= float(c)*float(d)
s = a + str(ret) + b
print(s)
if '--'in s:
s=s.replace('--','+')
if '-+'in s:
s=s.replace('-+','-')
if '+-'in s:
s=s.replace('+-','-')
if '++'in s:
s=s.replace('++','+')
lst=re.findall('[+-]?\d+(?:\.\d+)?',s) #用findall找到所有的加減法,放到列表裡
print(lst)
res=sum([float(i) for i in lst])
print(res)
二,函式版本
1importre2
defmul_div(atom_exp):
3'''
4計算乘除法的表示式的函式
5:param atom_exp: a*b 或者 a/b的表示式
6:return: float資料型別的結果
7'''8if
'*'in
atom_exp:
9 a,b=atom_exp.split('*'
)10return float(a)*float(b)
11elif'/
'inatom_exp:
12 a, b = atom_exp.split('/'
)13return float(a) /float(b)
1415
defadd_sub(no_bracket_exp):
16'''
17接收乙個只有加減法的表示式,計算加減法並返回最終結果
18:param no_bracket_exp: 只剩加減法的表示式
19:return:floatt資料型別的結果
20'''
21 ret_lst=re.findall('
[-+]?\d+(?:\.\d+)?
',no_bracket_exp)
22 sum_count=0
23for num in
ret_lst:
24 sum_count +=float(num)
25return
sum_count
2627
defexp_format(exp):
28'''
29負責表示式的整理
30:param exp: 接收的表示式可能含有 ++ -- +- -+ 等操作
31:return: 返回乙個沒有重疊+-符號的表示式
32'''
33 exp=exp.replace('
--','+'
)34 exp = exp.replace('
+-', '-'
)35 exp = exp.replace('
-+', '-'
)36 exp = exp.replace('
++', '+'
)37return
exp38
defcal(no_bracket_exp):
39'''
40負責計算加減乘除
41:param no_bracket_exp:乙個內部不再有括號的表示式
42:return: 最終計算的結果
43'''
44while 1:
45 ret=re.search('
\d+(\.\d+)?[*/]-?\d+(\.\d+)?
',no_bracket_exp)
46if
ret:
47 ret_exp=ret.group()
48 res=str(mul_div(ret_exp))
49 no_bracket_exp=no_bracket_exp.replace(ret_exp,res)
50else:break
51 no_bracket_exp=exp_format(no_bracket_exp)
52 sum_count=add_sub(no_bracket_exp)
53return
sum_count
5455
defmain(exp):
56 exp=exp.replace('
','')57
while 1:
58 ret=re.search('
\([^()]+\)
',exp)
59if
ret:
60 no_bracket_exp=ret.group()
61 ret=str(cal(no_bracket_exp))
62 exp=exp.replace(no_bracket_exp,ret)
63else:break
64return
cal(exp)
6566 exp = '
1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )* (-40/5)) - (-4*3)/ (16-3*2) )
'67 res=main(exp)
68print(res)
python 實現計算器功能
開發乙個簡單的python計算器 實現加減乘除及拓號優先順序解析 使用者輸入 1 2 60 30 40 5 9 25 3 7 399 42998 10 568 14 43 16 32 等類似公式後,必須自己解析裡面的 符號和公式 不能呼叫eval等類似功能偷懶實現 運算後得出結果,結果必須與真實的計...
C 實現計算器功能
注意 判斷數值和表示式 的合理性。include include include define max len 200 判斷字元是否合理 0 9 bool checkinput char c if c 0x2e c 0x2b c 0x2d c 0x2a c 0x2f return false boo...
用Java實現計算器
在學習 資料結構 這門課的時候,老是會想到模擬計算器的運算。雖說實驗裡面也有設計逆波蘭計算器的題目,但它只考察了棧和佇列的操作思想,沒有考慮到運算子的優先順序以及複雜組合情況 比如多層括號 因此其實用性並不大。今天試著寫了一下,看似很簡單,還是花費了一段時間的。這是最簡單的情況。1.首先 的運算等級...