import sys,os,re;from typing import * # calculator program def scicalc(s): s=s.replace(' ','') if s=='':return 0 r=doPlusMinus(s,0,len(s)) return r def doPlusMinus(s,a,b): t=s[a:b]; level=0; i=len(t)-1 while i>=0: c=t[i] if c==')':level=level+1 if c=='(':level=level-1 if level==0 and (c=='+' or c=='-'): L=doPlusMinus(s,a,a+i);R=doMulDiv(s,a+i+1,b) if c=='+': return L+R else: return L-R i=i-1 return doMulDiv(s,a,b) def doMulDiv(s,a,b): t=s[a:b];level=0;i=len(t)-1 while i >= 0: c=t[i] if c==')':level+=1 if c=='(':level-=1 if level==0 and(c=='*' or c=='/'): L = doMulDiv(s,a,a+i); R = getNum(s,a+i+1,b) if c=='*':return L*R else: if R==0:print("ERROR division by zero!!!") ;return 0 return L/R i -= 1 return getNum(s,a,b) def getNum(s, a,b): t = s[a:b] if t[0]=='(' and t[-1]==')': return doPlusMinus(s,a+1,b-1) try: x = float(t) except: print("bad number: "+t);x=0 return x def main(): Data = [ "3 + 5", "10 - 2 * 3", "( 4 + 6 ) * 2", "100 / ( 5 * 2 )", "3.5 + 2.5 * 4", "( 1 + 2 ) * ( 3 + 4 )", "", "10 / 0", "abc + 1", ] for d in Data: Res=scicalc(d) print(d+" = "+str(Res)) main()