二 程式效果說明:
程式的很多bug已解決,但還是有一些bug沒有發現,或沒有解決
已發現的bug:
1 如果計算過程出現科學計數法(乙個特別小的數除以乙個特別大的數時),就會使程式出錯,進入無限迴圈
2 如果不指定計算資料小數點後的有效位數,程式也會進入死迴圈
下圖是程式計算結果與python計算結果的截圖對比,兩個結果在小數點後有差異是因為精度指定問題,非程式邏輯問題
三 程式**
#!/usr/bin/env python
#--author lisheng--
import re
#a = "1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
a = "1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))*23456-765*345+356-674+34567"
def chen(c):
"""迴圈乘法運算,將制定括號內的所有乘法計算出結果後返回計算結果
:param c:
:return:
"""while true:
if re.search("[0-9](\.[0-9]+)?\*(\-)?[0-9]", c) == none: #如果沒有乘法運算,就返回沒有乘法的算式
return c
else:
c1 = re.search("(\-)?[0-9]+(\.[0-9]+)?\*(\-)?[0-9]+(\.[0-9]+)?",c).group()
c2 = c1.split("*")[0]
c3 = c1.split("*")[1]
c4 = round(float(c2),11) * round(float(c3),11)
c4 = round(float(c4),11)
c4 = "+%s" %(str(c4))
c = re.sub("(\()?(\-)?[0-9]+(\.[0-9]+)?\*(\-)?[0-9]+(\.[0-9]+)?(\))?",str(c4),c,count=1)
if not re.match("\+", c) == none:
c = re.sub("\+", "", c,count=1)
c = str(c)
c = re.sub("\+\-", "-", c)
c = re.sub("\+\+", "+", c)
c = re.sub("\*\+", "*", c)
def chu(c):
"""迴圈除法運算,將制定括號內的所有除法計算出結果後返回計算結果
:param c:
:return:
"""while true:
if re.search("[0-9](\.[0-9]+)?/(\-)?[0-9]", c) == none: #如果沒有除法運算,就返回沒有除法的算式
return c
else:
c1 = re.search("(\-)?[0-9]+(\.[0-9]+)?/(\-)?[0-9]+(\.[0-9]+)?",c).group()
c2 = c1.split("/")[0]
c3 = c1.split("/")[1]
c4 = round(float(c2),11) / round(float(c3),11)
c4 = round(float(c4),11)
c4 = "+%s" % (str(c4))
c = re.sub("(\()?(\-)?[0-9]+(\.[0-9]+)?/(\-)?[0-9]+(\.[0-9]+)?(\))?",str(c4),c,count=1)
if not re.match("\+", c) == none:
c = re.sub("\+", "", c,count=1)
c = str(c)
c = re.sub("\+\-", "-", c)
c = re.sub("\+\+", "+", c)
c = re.sub("\*\+", "*", c)
def plus_jian(c):
"""迴圈加減法運算,將制定括號內的所有加減法計算出結果後返回計算結果
:param c:
:return:
"""while true:
if re.search("[0-9](\.[0-9]+)?(\+|\-)[0-9]",c) == none: #如果沒有加價法運算,就返回沒有加減法的算式
return c
else:
c1 = re.search("(\-)?[0-9]+(\.[0-9]+)?",c).group()
if re.match("(\()?\-[0-9]+(\.[0-9]+)?",c) == none:
c2 = re.search("(\+|\-)[0-9]+(\.[0-9]+)?", c).group()
c3 = float(c1) + float(c2)
c = re.sub("(\()?[0-9]+(\.[0-9]+)?(\-|\+)[0-9]+(\.[0-9]+)?(\))?", str(c3), c, count=1)
c = str(c)
c = re.sub("\+\-", "-", c)
c = re.sub("\+\+", "+", c)
c = re.sub("\*\+", "*", c)
else:
c2 = re.search("[0-9](\+|\-)[0-9]+(\.[0-9]+)?", c).group()
c2 = re.search("(\+|\-)[0-9]+(\.[0-9]+)?", c2).group()
c3 = float(c1) + float(c2)
c = re.sub("(\()?\-[0-9]+(\.[0-9]+)?\d[0-9]+(\.[0-9]+)?(\))?", str(c3), c, count=1)
c = str(c)
c = re.sub("\+\-", "-", c)
c = re.sub("\+\+", "+", c)
c = re.sub("\*\+", "*", c)
while true:
a = re.sub("\+\-", "-", a, count=1)
a = re.sub("\-\-", "+", a, count=1)
a = re.sub("\s*","",a)
if re.search("\((\-)?([0-9]+(\.[0-9]+)?\d)+[0-9]+(\.[0-9]+)?\)",a) == none: #篩選括號的正規表示式,如果帶括號的算式都已計算完畢,之後再走一次除乘加減後返回最終結果
x = chu(a)
y = chen(x)
z = plus_jian(y)
print("result:", z) #最終結果
a = re.sub("\((\-)?([0-9]+(\.[0-9]+)?\d)+[0-9]+(\.[0-9]+)?\)", z, a, count=1)
break
else: #如果還有帶括號的算式,就繼續除乘加減的迴圈計算
c = re.search("\((\-)?([0-9]+(\.[0-9]+)?\d)+[0-9]+(\.[0-9]+)?\)",a).group()
x = chu(c)
y = chen(x)
z = plus_jian(y)
a = re.sub("\((\-)?([0-9]+(\.[0-9]+)?\d)+[0-9]+(\.[0-9]+)?\)",z,a,count=1)
shell指令碼實現加減乘除計算器
使用if語句 bin bash 這是乙個計算器 read t 30 p please input the first number num1 read t 30 p please input the second number num2 read t 30 p please input the se...
用php簡單實現加減乘除計算器
加減乘除計算器想必大家都有使用過吧,本文為大家介紹下使用php如何實現,下面有個不錯的示例,感興趣的朋友可以參考下 用php實現加減乘除計算器。很簡單哦!如下 unity3d官網 header content type text html charset utf 8 session start nu...
codeup 模擬加減乘除 問題 A 簡單計算器
題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。輸出 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位...