功能:
- 实现加减乘除及拓号优先级解析
- 用户输入
1-2*((60-30+(-40/5)*(9-2*5/3-2*(-18.3/3-(5*2+3+(-2*3)*(-7-1)/(5*7)*2)+2/6*7)+(-6+5+1)-7/3*99/4*(-2998)/3+10*568/14))-(-4*3)/(16-3*2))+(2+3*2)+(2-3)
类似公式后,通过正则表达式解析里面的(),+,-,*,/符号和公式,运算后得出结果
# Author:q1.ang import re content=input(‘‘‘ - - - 计算器 - - - 输入: ‘‘‘).strip() # content=‘1-2*((60-30+(-40/5)*(9-2*5/3-2*(-18.3/3-(5*2+3+(-2*3)*(-7-1)/(5*7)*2)+2/6*7)+(-6+5+1)-7/3*99/4*(-2998)/3+10*568/14))-(-4*3)/(16-3*2))+(2+3*2)+(2-3)‘ def calculation(find_list,content): ‘‘‘ 计算find_list中的式子 :param find_list: 正则表达式索引到的列表 :param content: 原计算式 :return: 计算后的计算式 ‘‘‘ for i in find_list: print(‘计算式:‘,i) result=0 if ‘*‘ in i or ‘/‘ in i:#判断是否含有乘除号 num = re.findall(‘[\-\d\.]+‘,i) #提取数字 symbol=re.findall(‘[*/]‘,i) #提取运算符,*/ print(‘num:‘, num) print(‘symbol:‘, symbol) for i2 in range(len(symbol)): #循环计算,num1为数字1,num2为数字2,sym为运算符 print(‘计算次数:‘, i2 + 1) num1=num[i2] num2=num[i2 + 1] sym=symbol[i2] if sym == ‘*‘: num[i2 + 1] = float(num1) * float(num2) elif sym == ‘/‘: num[i2 + 1] = float(num1) / float(num2) if i2 == (len(symbol) - 1): result = num[i2 + 1] print(‘结果:‘, result) else:#加减运算 num=re.findall(‘\-{0,1}[\d\.]+‘,i) #提取数字 for i3 in num: result+=float(i3) print(‘结果:‘, result) content=content.replace(i,str(result),1) #替换 return content def replace_symbol(content): ‘‘‘ 替换重复相连的运算符 :param content: 原计算式 :return: 替换后的计算式 ‘‘‘ content = content.replace(‘++‘, ‘+‘) content = content.replace(‘--‘, ‘+‘) content = content.replace(‘-+‘, ‘-‘) content = content.replace(‘+-‘, ‘-‘) content = content.replace(‘*+‘, ‘*‘) content = content.replace(‘+*‘, ‘*‘) content = content.replace(‘/+‘, ‘*‘) content = content.replace(‘+/‘, ‘*‘) return content stop_flag=True content1=‘‘ while stop_flag: find_mul_div = re.findall(‘(?:[\d\.]+(?:[*/]\-|[*/]))+[\d\.]+‘,content) #匹配所有乘除法,2*3/4 content=calculation(find_mul_div,content) content=replace_symbol(content) print(content) find_bracket = re.findall(‘\([+\-*/\d\.]+\)‘,content) #匹配最内括号里的内容,2*3/4 content=calculation(find_bracket,content) content=replace_symbol(content) print(content) if content1==content: #运算至只有加减法 last=[content] content = calculation(last,content) stop_flag=False content1 = content print(‘=‘,content)
原文地址:https://www.cnblogs.com/q1ang/p/9063727.html
时间: 2024-11-10 01:00:38