用pathon實現計算器功能

2022-05-03 20:18:16 字數 4783 閱讀 8491

實現計算類似公式的計算器程式

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 re

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=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)

二,函式版本

1

importre2

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.首先 的運算等級...