本文采用中国慕课网上的《程序设计与算法2》郭老师的方法进行。
问题:(1+(2*3+4)/2+4/2)程序用来解决这种四则运算,全部是整数。
首先,清晰下解决的问题。这是一个表达式子,他是由项组成,项之间的运算是可以相加减。项是由因子组成,因子之间可以乘或者除。因子有两种情况,一种是一个整数,或者是一个表达式,例如,(1+2+3)×3,其中前面的(1+2+3)就是一个表达式。
因此,这种逻辑关系非常清晰,也利于接下来写程序。主要由三个函数组成,表达式函数,项函数term_value,因子函数factor_value。函数读字符串,然后返回先计算出的结果值和剩余的表达式。程序代码如下:
def calculate(a):
result,a = term_value(a) # read the first term
if len(a)==0:
return result,a
boo = True
i =0
while len(a)>0 and boo: #把表达式的所有项追个检查出来
if a[i] =='+': #加
a = a[1:]
res,a = term_value(a)
result+=res
elif a[i]=='-': #减
a = a[1:]
res,a = term_value(a)
result-=res
elif a[i] == ')' : #这个部分处理的不好,因为下面去掉了(,没有去掉),所以这里特地去掉了。郭老师的c++程序貌似没有这个过程
a = a[1:]
else:
boo = False
return result,a
def term_value(a): #把所有项的因子全部检查出来,比如1*2*3*4/5*(1+2)
if len(a) ==1:
return int(a),'' #这段似乎重复了
result,a= factor_value(a) #开始检查第一个因子,把运算结果都叠加都这个上
boo = True
i =0
while len(a)>0 and boo: #其余因子,并把结果跟第一个相乘或者相除
if a[i]=='*': #乘
a = a[1:]
result = factor_value(a)[0]*result
a = factor_value(a)[1]
elif a[i]=='/': #除
a = a[1:]
result = result/factor_value(a)[0]
a = factor_value(a)[1]
else:
boo = False
return result,a
def factor_value(a): #检查因子
if a[0]=='(': #因子是一个表达式
a = a[1:]
return calculate(a)
else: #因子是一个整数的情况
s = 0
i = 0
while i<len(a) and a[i].isdigit():
s = s*10+int(a[i])
a =a[1:]
return s,a
b ='1+1*8+3+(1+2)+((4/2)*2)'
print(calculate(b))