65 lines
1.4 KiB
Python
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()
|