python自动化-作业6.计算器——A

开发一个简单的python计算器
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,
必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
完成时间:2018/12/17
 
 

import re

Flog = {
'operation_flog' : None,
'unit' : {
'lift' : 0,
'right' : 0,
}
}

def basic_unit(list): # list序列的长度限定在3个元素
Flog['unit'] = {'lift':0,'right':0}
Flog['unit']['lift'] = float(list[0]) # 符号左边的数是正数
Flog['unit']['right'] = float(list[2])
Flog['operation_flog'] = list[1]
if Flog['operation_flog'] == '/':
return float("%.2f"%(Flog['unit']['lift']/Flog['unit']['right']))
if Flog['operation_flog'] == '*':
return float("%.2f"%(Flog['unit']['lift'] * Flog['unit']['right']))
if Flog['operation_flog'] == '+':
return float("%.2f"%(Flog['unit']['lift'] + Flog['unit']['right']))
if Flog['operation_flog'] == '-':
return float("%.2f"%(Flog['unit']['lift'] - Flog['unit']['right']))

def parentheses(e):
if e.startswith('('):
tamp = re.split('\(', e)[1]
data = re.split('\)', tamp)[0]
else:
data = e
split_data = re.split(r'(\+|-)',data)
print('---{}---'.format(split_data))
for num,i in enumerate(split_data):
if i.endswith('*') or i.endswith('/'):
split_data[num] = split_data[num]+split_data[num+2]
if split_data[num-1] == '-':
split_data[num-1] = '+'
elif split_data[num-1] == '+':
split_data[num-1] = '-'
del split_data[num+2]
del split_data[num+1]
print(split_data)
while '' in split_data:
index_bit = split_data.index('')
split_data[index_bit] = split_data[index_bit+1]+split_data[index_bit+2]
del split_data[index_bit + 2]
del split_data[index_bit + 1]
print(split_data)
for num,i in enumerate(split_data): # 计算单括号内*/法
if '/' in i or '*' in i:
tamp_data = re.split(r'(\*|/)', i)
while len(tamp_data)>=3:
tamp_data[0] = basic_unit(tamp_data[0:3])
del tamp_data[2]
del tamp_data[1]
split_data[num] = tamp_data[0]
print(split_data)
while len(split_data)>=3: # 计算单括号内+-法
split_data[0] = basic_unit(split_data[0:3])
del split_data[2]
del split_data[1]
print(split_data)
return split_data[0]


if __name__ == '__main__':
while True:
in_compute_mode = input('输入计算式(如:1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))):>>>').strip()
if ' ' in in_compute_mode:
print('输入错误,请重新输入'.center(50,'-'))
else:
while re.findall(r'\([^()]+\)',in_compute_mode):
expressions = re.search(r'\([^()]+\)',in_compute_mode).group()
v = parentheses(expressions) # 获得括号中的计算值
data_list = in_compute_mode.split(expressions)
data_list.insert(1,str(v))
data_join = ''.join(data_list)
data_join1 = re.sub(r'\+-','-',data_join)
in_compute_mode = re.sub(r'--','+',data_join1)
print('-----------{}-----------'.format(in_compute_mode))
s = parentheses(in_compute_mode)
print('计算结果:【{}】'.format(s))
 

猜你喜欢

转载自www.cnblogs.com/guogangzhi/p/10134666.html