65 lines
1.4 KiB
Python

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()