/*
结合面向对象实现一个基本的计算器,可以计算一个表达式
*/
class Object():
pass
def CreateSymbol(char):
c = Object()
c.type = 'syb'
c.content = char
return c
def CreateNumber(number):
n = Object()
n.type = 'num'
n.content = float(number)
return n
def Loop():
while True :
expression = input("请输入一套表达式 ")
expression = CheckExpression(expression) #整理一下,似乎没必要
re = Calculator(expression)
print("结果是 :"+str(re))
print('')
return
def CheckExpression(expression):
expression = expression.replace("(","(")
expression = expression.replace(")",")")
return expression
def Calculator(expression):
#scan and simplify it
list = []
stackBalance =0
countNumber = False
newExpression = ''
#add data to list
for s in expression:
if s == '(' : #如果是左括号
if stackBalance >0 :
newExpression +=s
stackBalance += 1
elif s== ')': #如果右括号,判断是否和最左边一层匹配完毕,匹配后提取括号内容,然后计算表达式,并压入当前计算表达式中
stackBalance -= 1
if stackBalance == 0 :
num = CreateNumber(Calculator(newExpression))
list.append(num)
newExpression = ''
else:
newExpression +=s
elif s == '+' or s=='-' or s=='*' or s=='/' : #如果是计算符号,则压入表达式中
if stackBalance > 0 :
newExpression +=s
else :
if countNumber == True :
countNumber = False
num = CreateNumber(newExpression)
list.append(num)
newExpression=''
syb = CreateSymbol(s)
list.append(syb)
else : #如果是数字,则将接下来的数字记录,直到遇到其他计算符号(没有考虑表达式错误的情况)
if stackBalance >0 :
newExpression +=s
else:
countNumber = True
newExpression += s
if countNumber == True :
num = CreateNumber(newExpression)
list.append(num)
result = CalculateList(list)
return result
#1+2*3/4-5
def CalculateList(list):
if len(list) == 1 :
return list[0].content
result = 0.0
index=-1
for i in range(len(list)) :
#如果表达式中有*或者/
if (list[i].type == 'syb' and list[i].content == '*') or (list[i].type == 'syb' and list[i].content == '/') :
index=i
break
#有乘除符号
if index >-1 :
number1 = list[index-1].content
number2 = list[index+1].content
if list[index].content == '*' :
number1 = number1 * number2
else:
number1 = number1 / number2
list[index-1].content = number1
del(list[index])
del(list[index])
if(len(list) == 1 ):
result = number1
else:
result = CalculateList(list)
#只有加减
else:
number1 = list[0].content
number2 = list[2].content
if list[1].content == '+' :
number1 = number1+number2
else:
number1 = number1-number2
list[0].content = number1
del(list[1])
del(list[1])
if(len(list) ==1 ):
result = number1
else:
result = CalculateList(list)
return result
Loop()