Jobs: Calculator Development
Implementation of subtraction and extension priority resolution
User Input 1-2 * ((60-30 + ( -40/5) * (9-2*5/3 + 7/3*99/4*2998 +10 * 568/14))-( -4*3)/(16-3*2)) and other similar formulas, you must parse the inside (), +,-, *,/character Numbers and formulas, and the results must be consistent with the results of the actual calculator.
First, Description:
There is a little bug is not to calculate power, such as: ' 6**6 ' will error
The calculator idea:
1, do not use recursion, first find and calculate all the parentheses in the formula, and then calculate multiplication and add and subtract
2, all numbers are considered to be floating-point operations, in order to retain decimals
Use technology:
1. Regular expressions
2, Tkinter
Second, flow chart:
Three, the code is as follows:
#!/usr/bin/env Python3#antuor:alan Import refrom functools import reducefrom tkinter import * ' Handle special-number operation ' Def minus_op Eration (expresstion): Minus_operators = Re.split ("-", expresstion) calc_list = Re.findall ("[0-9]", expresstion) if minus _operators[0] = = "": calc_list[0] = '-%s '% calc_list[0] res = reduce (lambda x,y:float (x)-float (y), calc_list) print ("& Gt;>>>>>>>>>>>>> minus sign [%s] Result: "% expresstion,res) return res ' reduce () For sequence continuous use of function, if not given initial, the first call to pass the two elements of sequence, the result of the previous call and the next element of sequence passed to the function "" processing the double operation symbol " def del_duplicates (expresstion): Expresstion = Expresstion.replace ("+ +", "+") Expresstion = Expresstion.replace ("--", " -") Expresstion = Expresstion.replace (" +-","-") Expresstion = Expresstion.replace ("--"," + ") Expresstion = EXPRESSTION.R Eplace ('---', ' + ') e return expresstion ' * * arithmetic function ' def mutiply_dividend (expresstion): Calc_list = Re.split ("[*/]", Expre sstion) #用 * or/split formula operators = Re.findaLL ("[*/]", expresstion) #找出所有 * and/Res = None for index,i in Enumerate (calc_list): if Res:if operators[index-1 ] = = ' * ': res *= float (i) elif operators[index-1] = = '/': res/=float (i) Else:res = float (i) p Rocession0 = "[%s] operation result ="% expresstion,res final_result.insert (end,procession0) #插入窗体 print (Procession0) return res "Handling operation Symbol Order Confusion" Def special_features (plus_and_minus_operators,multiply_and_dividend): For Index,i in Enumerate ( Multiply_and_dividend): i = I.strip () if I.endswith ("*") or I.endswith ("/"): multiply_and_dividend[index] = Mul Tiply_and_dividend[index] + Plus_and_minus_operators[index] + multiply_and_dividend[index+1] del multiply_and_divide Nd[index+1] del Plus_and_minus_operators[index] return plus_and_minus_operators,multiply_and_dividend def minus_sp Ecial (operator_list,calc_list): For index,i in Enumerate (calc_list): if i = = ': calc_list[index+1] = i + calc_lis T[index+1].strip () "Operation" except ()The formula +-*/"Def figure_up (expresstion): Expresstion = Expresstion.strip (" () ") #去掉外面括号 expresstion = del_duplicates (expr esstion) #去掉重复 +-plus_and_minus_operators = Re.findall ("[+ +]", expresstion) Multiply_and_dividend = Re.split ("[+ +]", expresstion) If Len (Multiply_and_dividend[0].strip ()) ==0:multiply_and_dividend[1] = plus_and_minus_operators[0] + mu Ltiply_and_dividend[1] del multiply_and_dividend[0] del plus_and_minus_operators[0] Plus_and_minus_operators,multi Ply_and_dividend = Special_features (plus_and_minus_operators,multiply_and_dividend) for index,i in enumerate ( Multiply_and_dividend): If Re.search ("[*/]", i): Sub_res = Mutiply_dividend (i) multiply_and_dividend[index] = Sub_res print (multiply_and_dividend,plus_and_minus_operators) #计算 final_res = None for Index,item in enumerate (multip Ly_and_dividend): If final_res:if plus_and_minus_operators[index-1] = = ' + ': final_res + = float (item) Elif Plus_and_minus_operators[index-1]= = '-': final_res-= float (item) else:final_res = Float (item) procession = ' [%s] calculation result: '% Expresstion,fina L_res Final_result.insert (end,procession) #插入窗体 print (procession) return Final_res "" "Main Function: Arithmetic logic: First calculate the value in the extension number, calculate it and then calculate multiplication, and then calculate plus Minus "" "Def Calculate (): Expresstion = Expresstions.get () #获取输入框值 flage = True calculate_res = None # The initialization evaluates to none while Flage:m = Re.search ("\ ([^ ()]*\)", expresstion) #先找最里层的 () # pattern = Re.compile (r "\ ([^ ()]*\)" ) # m = Pattern.match (expresstion) If m:sub_res = Figure_up (M.group ()) #运算 () formula Expresstion = Expre Sstion.replace (M.group (), str (sub_res)) #运算完毕把结果替换掉公式 else:print ('---------------parentheses have been calculated--------------') pr Ocession1 = "Final calculation result:", Figure_up (expresstion) Final_result.insert (end,procession1) #插入窗体 print (' \033[31m final calculation result: ', Figure_up (expresstion)) Flage = False if __name__== "__main__": # res = calculate ("1-2 * ((60-30 + ( -40/5) * (9 -2*5/3 + 7/3*99/4*2998+10 * 568/14))-( -4*3)/(16-3*2)) "window = Tk () # # #创建窗体 window.title (' calculator ') # # #命名窗体 frame1 = Frame (Wind ow) # # #框架1 Frame1.pack () # # #放置 frame2 = Frame (window) # # #框架2 Frame2.pack () # # # #放置 lable = Label (fra Me1,text = "Please enter formula:") # # #文字标签 lable.pack () expresstions = Stringvar () # # #输入框属性, String entryname = Entry (Frame1,textvariab Le = expresstions) # # #文本输入框 bt_get_expresstions = button (Frame1,text = "commit", command = calculate) # # #按钮挂件 Bt_get_expresst Ions.pack () Entryname.pack () Lable.grid (Row =1,column =1) # # #位置 Entryname.grid (row=1,column =2) BT_GET_EXPRESSTIONS.G RID (row =1,column =3) Final_result = Text (frame2) # # #计算结果显示框 Final_result.tag_config ("Here", background= "yellow", Foreg Round= "Blue") Final_result.pack () Window.mainloop () # # #事件循环
The above is the whole content of this article, I hope that everyone's study has helped.