一個簡單的計算器,能計算括號加減乘除,由於還沒有加入判斷輸入規范的功能,所以格式必須正確
例如:3/3*(25-6/3)+(1+4)/2.5
ps:不能用python自帶的eval或者exec等方法
有兩個方案,方案一是早期寫的,能夠實現,但代碼較亂,方案二比較簡潔易懂些,在頁面看,可能代碼看起來會是亂的,復制到編輯器就不會了
方案一
#Auther:He Jianhan
import re
def mul_div(front,after,symbol):
#計算帶入的值進行計算*和/
if symbol == "*":
result = float(front) * float(after)
else:
result = float(front) / float(after)
return result
def add_sub(front,after,symbol):
# 計算帶入的值進行計算+和-
if symbol == "+":
result = float(front) + float(after)
else:
result = float(front) - float(after)
return result
def process(value,one,two,functions,itmes):
#通過判斷列表是否有四則運算,調取加減乘除的運算函數,不斷進行計算
for symbol_list_number,symbol_list_forin in enumerate(value):
if one in symbol_list_forin:
result = functions(itmes[symbol_list_number],itmes[symbol_list_number+1], one)
itmes[symbol_list_number] = str(result)
itmes[symbol_list_number+1] = str(result)
elif two in symbol_list_forin:
result = functions(itmes[symbol_list_number], itmes[symbol_list_number+1], two)
itmes[symbol_list_number] = str(result)
itmes[symbol_list_number+1] = str(result)
def main(number):
digit_list = []
symbol_list = []
number_list = re.findall("^[0-9]+|..[0-9]+[.][0-9]+|..[0-9]+|.[0-9]+[.][0-9]+|"
".[0-9]+",number)#將要計算的數值進行分開
for n in number_list:
#將加減乘除和數值分開,以便於后面計算
if "*" in n or "/" in n or "+" in n or "-" in n:
digit_list.append(n[1:])
symbol_list.append(n[0])
else:
digit_list.append(n[:])
if "-" in number_list[0]:
#判斷第一個輸入的值是否為負數,是負數則將dict_list列表的第一個值進行替換
# 並刪除symbol_list的第一個符號
digit_list[0] = number_list[0]
del symbol_list[0]
process(symbol_list,"*","/",mul_div,digit_list)
while "*" in symbol_list or "/" in symbol_list:
#將已經計算過才*和/進行刪除
if "*" in symbol_list:
del digit_list[symbol_list.index("*")]
symbol_list.remove("*")
if "/" in symbol_list:
del digit_list[symbol_list.index("/")]
symbol_list.remove("/")
process(symbol_list,"+","-",add_sub,digit_list)
return digit_list[-1]
number = input("輸入你要計算的\033[31;1m公式\033[0m")
while True:
#判斷是否有括號,有括號則先進行括號內的運算
if "(" in number:
left = number.find(")")
right = number[:left].rfind("(")
number_small = number[right+1:left]
replace = main(number_small)
number = number[:right] + replace + number[left+1:]
else:
print("===>"+main(number))
break
方案二
import re
def count1(number):
# 利用正則匹配出乘除,計算,並不斷循環直到沒有乘除,並計算返回結果
while True:
search_var = re.search("[+\-/*]?-?\d+(\.\d+)?([/*])-?\d+(\.\d+)?",number)
if not search_var:
break
if search_var.group()[0] not in ["+","-","/","*"]:
var = search_var.group()
else:
var = search_var.group()[1:]
if "*" in var:
a,b = var.split("*")
var = str(float(a)*float(b))
else:
a, b = var.split("/")
var = str(float(a) / float(b))
if search_var.group()[0] not in ["+", "-", "/", "*"]:
number = number[:search_var.span()[0]] + var + number[search_var.span()[1]:]
else:
number = number[:search_var.span()[0]+1]+var+number[search_var.span()[1]:]
return str(number)
def count2(number):
# 利用正則匹配出加減,計算,並不斷循環直到沒有加減,並計算返回結果
while True:
search_var =re.search("-?\d+(\.\d+)?([+-])-?\d+(\.\d+)?",number)
if not search_var:
break
var = search_var.group()
if "+" in var:
a,b = var.split("+")
var = str(float(a) + float(b))
else:
if var[0] == "-":
new_var = var[1:]
find_var = new_var.find("-")
a = new_var[:find_var]
b = new_var[find_var+1:]
a = "-" + a
else:
find_var = var.find("-")
a = var[:find_var]
b = var[find_var + 1:]
var = str(float(a) - float(b))
number = number[:search_var.span()[0]]+var+number[search_var.span()[1]:]
return str(number)
def bracket(number):
# 匹配出里層括號
search_var = re.search("\([\d+\-/*.]*[^(][\d+\-/*.]*\)",number)
return search_var
if __name__ == "__main__":
while True:
number = input("請輸入要計算的公式,小數負數隨便輸,算錯算我輸(q/Q退出)")
if number.upper() == "Q":
print(1)
break
else:
while True:
search_var = bracket(number)
if not search_var:
break
count_var = count1(search_var.group()[1:-1])
count_var = count2(count_var)
number = number[:search_var.span()[0]] + count_var + number[search_var.span()[1]:]
number = count1(number)
number = count2(number)
print(number)