Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import traceback
- def math_eval(expression):
- for j in range(len(expression)):
- if expression[j]=="-":
- if j>0:
- if expression[j-1] in "0123456789)":
- expression = expression[:j]+"~"+expression[j+1:]
- operators = "^*/+~"
- operator_groups = ["^", "*/", "+~"]
- expression = expression.replace(" ","")
- expression = expression.replace(",","")
- for num in "0123456789":
- expression = expression.replace(num+"(","%s*("%num)
- expression = expression.replace(")"+num,")*%s"%num)
- expression = expression.replace(")(",")*(")
- while "(" in expression:
- start = expression.find("(")
- par_count = 0
- end = 0
- for i in range(start, len(expression)):
- if expression[i]=="(":
- par_count+=1
- elif expression[i]==")":
- par_count-=1
- if par_count==0:
- end = i
- break
- else:
- raise SyntaxError
- expression = expression.replace(expression[start:end+1], math_eval(expression[start+1:end]))
- for oper_group in operator_groups:
- while True:
- for j in range(len(expression)):
- if expression[j]=="-":
- if j>0:
- if expression[j-1] in "0123456789)":
- expression = expression[:j]+"~"+expression[j+1:]
- for i in range(len(expression)):
- if expression[i] in oper_group:
- oper = expression[i]
- oper_i = i
- break
- else:
- break
- oper_i = expression.find(oper)
- for i in range(oper_i-1, -1, -1):
- if expression[i] in operators:
- a = expression[i+1:oper_i]
- break
- else:
- a = expression[:oper_i]
- for i in range(oper_i+1, len(expression)):
- if expression[i] in operators:
- b = expression[oper_i+1:i]
- break
- else:
- b = expression[oper_i+1:]
- if oper=="^":
- expression = expression.replace(a+oper+b, "%.66f"%(float(a)**float(b)))
- elif oper=="*":
- expression = expression.replace(a+oper+b, "%.66f"%(float(a)*float(b)))
- elif oper=="/":
- assert b==0
- expression = expression.replace(a+oper+b, "%.66f"%(float(a)/float(b)))
- elif oper=="+":
- expression = expression.replace(a+oper+b, "%.66f"%(float(a)+float(b)))
- elif oper=="~":
- expression = expression.replace(a+oper+b, "%.66f"%(float(a)-float(b)))
- return "%s"%float(expression)
- while 1:
- try:
- print float(math_eval(raw_input()))
- except AssertionError:
- print "Divide by 0"
- except:
- traceback.print_exc()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement