加減乘除 計算器

2021-09-20 03:48:46 字數 3962 閱讀 5157

二 程式效果說明:

程式的很多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位...