1. 程式人生 > >通過Python實現簡單的計算器

通過Python實現簡單的計算器

arch turn for return lac 空格 用戶 所有 計算器

計算器開發需求

  1. 實現加減乘除及拓號優先級解析
  2. 用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等類似公式後,必須自己解析裏面的(),+,-,*,/符號和公式,運算後得出結果,結果必須與真實的計算器所得出的結果一致



#coding=utf-8 import re def sub_calc(formula): """ 計算一個加減乘除表達式的值""" flag = True while flag: m = re.search(‘\d+\.?\d*[*/]-?\d+\.?\d*‘,formula) #先匹配乘除 舉例: 5.12 * -123.12 , - 5.12 / -123.12 if m: sub_mul_div = m.group() res = calc_multi_divd(sub_mul_div) formula = formula.replace(sub_mul_div,res) # 將乘除表達式的結果替換,循環判斷是否還有乘除表達式 print "*" * 10,"乘除表達式:",formula else: print "*" * 10 ,"乘除計算完畢" flag = False print "*" * 10,"子括號裏面計算乘除後的表達式 ",formula result = calc_add_stract(formula) #計算加減法 return result def calc_multi_divd(formula): """計算單個的乘除法表達式""" print "*" * 20,"單個的乘除法表達式",formula f_list = re.split(‘[*/]‘,formula) print "*" * 20 ,"單個的乘除表達式列表",f_list if ‘*‘ in formula: res = float(f_list[0]) * float(f_list[1]) elif ‘/‘ in formula: res = float(f_list[0]) / float(f_list[1]) return str(res) def calc_add_stract(formula): """計算加減法,通過reduce 兩兩計算""" print "*" * 20,"沒有處理正負號的加減表達式: ",formula #對符號進行處理 formula = formula.replace(‘--‘,‘+‘) formula = formula.replace(‘++‘,‘+‘) formula = formula.replace(‘-+‘,‘-‘) formula = formula.replace(‘+-‘,‘-‘) print "*" * 20 ,"處理完正負號的加減表達式:",formula #對一個加減表達式,-變成+-,為了進行split成列表用於reduce計算 formula = formula.replace(‘-‘,‘+-‘) formula_list = formula.split(‘+‘) print "*" * 20,"按加號分割的列表:",formula_list #第一個數為負數,則列表第一個字段為空 if formula_list[0] == ‘‘: formula_list = formula_list[1:] """ result = 0 for i in formula_list: if ‘-‘ in i: stract_list = i.split(‘-‘) result = float(stract_list[0]) - float(stract_list[1]) + result else: result += float(i) """ result = reduce(lambda x,y: float(x) + float(y),formula_list) print "*" * 20 ,"加減表達式的結果:" ,result return str(result) def calc(formula): flag = True while flag: m = re.search(‘\([^()]*\)‘,formula) if m: print "*" * 5, "計算匹配到的括號表達式:",m.group() sub_formula = m.group().strip(‘()‘) res = sub_calc(sub_formula) #先計算括號內的表達式 formula = formula.replace(m.group(),res) #將表達式計算出來的結果替換原括號,再一次循環判斷是否還有括號 else: flag = False print "*" * 5,"最終的去括號後的表達式:", formula result = sub_calc(formula) return result if __name__ == ‘__main__‘: formula = "1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )" print "要計算的表達式:", formula #去掉所有的空格 formula = re.sub(‘\s‘,‘‘,formula) print "去掉空格後的表達式",formula res = calc(formula) print "最終的結果:",res

通過Python實現簡單的計算器