開發乙個簡單的python計算器
實現加減乘除及拓號優先順序解析
使用者輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等類似公式
後,必須自己解析裡面的(),+,-,*,/符號和公式(不能呼叫eval等類似功能偷懶實現),運算後得出結果,結果必須與真實的計
算器所得出的結果一致。
import redef chengchu(num):
'''乘除操作'''
while re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num): #當有*/運算時迴圈
ret = re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num).group() #獲取包含*/運算的算式
if re.search("-?\d+\.?\d*\*-?\d+\.?\d*",ret): #是乘的時候
n1,n2 = re.split("\*",ret) #以*分割兩邊的數字
ji = float(n1)*float(n2) #得到數字進行運算
if re.search("-\d+\.?\d*\*-\d+\.?\d*",num): #特殊情況,兩負相乘的正,得加上+
num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*",("+"+str(ji)),num,1) #替換剛算的公式
return chengchu(num) #繼續遞迴
else:
num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*", str(ji), num, 1) #一般正常情況下替換
return chengchu(num) #繼續遞迴
else: #是/的時候
n1,n2 = re.split("\/",ret) #以/分割兩邊的數字
shang = float(n1)/float(n2) #得到數字進行運算
num = re.sub("-?\d+\.?\d*\/-?\d+\.?\d*",str(shang),num,1) #一般正常情況下替換
return chengchu(num) #繼續遞迴
else: #沒有*/的時候
return num #返回算的結果
def jiajian(num):
'''加減操作'''
while re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num): #當有+-運算時迴圈
ret = re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num).group() #獲取包含+-*運算的算式
if re.search("-?\d+\.?\d*\+-?\d+\.?\d*",ret): #是+的時候
n1,n2 = re.split("\+",ret) #以+分割兩邊的數字
he = float(n1)+float(n2) #得到數字進行運算
num = re.sub("-?\d+\.?\d*\+-?\d+\.?\d*",str(he),num,1) #替換剛算的公式
return jiajian(num) #繼續遞迴
else:
n1, n2 = re.split("-", ret,1) # 以-分割兩邊的數字
if n1 == "": #n1分割為空時,說明-號在開頭
n1,n2 = re.split("-",n2) #重新分割上面n2的結果
cha = -float(n1)-float(n2) #得到數字進行運算,注意前面得加上-號
else : #不是-開頭的時候
cha = float(n1) - float(n2) # 得到數字進行運算
num = re.sub("-?\d+\.?\d*--?\d+\.?\d*",str(cha),num,1) #替換剛算的公式
return jiajian(num) #繼續遞迴
else: #沒有+-的時候
return num #返回算的結果
def form(res,sums1):
'''格式輸出'''
res = re.sub("\(|\)", "", res) #去掉括號
ret = re.sub("\([^()]+\)",res,sums1,1) #把括號裡的公式替換成結果
ret = re.sub("\+\+|--", "+", ret) #統一運算子,++為+,--為+
ret = re.sub("\+-|-\+", "-", ret) #統一運算子,+-為-,-+為-
return ret #返回結果
def sear(num):
'''運算規則'''
if re.search("\([^()]+\)",num): #有括號先算
ret = re.search("\([^()]+\)", num).group() #獲取括號裡的公式
res = jiajian(chengchu(ret)) #在括號裡先算乘除,後算加減
return sear(form(res, num)) #將格式化後的結果傳給函式sear遞迴
else: #沒有括號的時候
res = jiajian(chengchu(num)) #也是先算乘除,後算加減
return res #返回結果
while true: #使用者互動模式
sums = input("請輸入您要計算的內容q(quit):") #輸入內容
if sums.lower() == "q": #輸入q時,退出
break
ret = sear(re.sub(" ","",sums)) #防止公式裡有空格,替換空格後,呼叫函式
print("最終結果:",ret) #列印最終返回的運算結果
-------------------輸出結果--------------------
最終結果: 2776672.6952380957
Python實操1 簡單計算器和進製轉化
程式要求 使用者輸入兩個數字,第一行列印出兩個數字的和,第二行列印出兩個數字的差,第三行列印出兩個數字的乘積,第四行列印出兩個數字的商,第五行列印出兩個數字的整除結果。程式 如下 使用者輸入兩個數字,第一行列印出兩個數字的和,第二行列印出兩個數字的差,第三行列印出兩個數字的乘積,第四行列印出兩個數字...
Python案例實操 函式裝飾器
help classmethod help on class classmethod in module builtins class classmethod object classmethod function method convert a function to be a class me...
python 簡易計算器
主程式 usr bin python coding utf8 import add,multipy,minus,divisi if name main print 您想做的運算是什麼?flag true while flag step1 raw input jia,jian,chen,chu if ...