第五周作业-模拟计算器开发
需求:
模拟计算器开发:
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
程序实现
1.逻辑图
2.readme.txt
博客地址:http://www.cnblogs.com/Mr-hu/ 程序运行步骤: 输入公式: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 本程序介绍: 1.消除不可见字符 2.程序逻辑 while True: 找内层括号 If没括号: 计算表达式 break 计算括号表达式 用结果替换表达式
3.主程序
#-*- coding:utf-8 -*- import re def calculate(): a = ''.join(input('请输入计算的公式:').split()) while True: if '(' in a: x = re.search('\(([^()]+)\)', a) if x is not None: b = x.groups()[0] c = count(b) a = re.sub('\(([^()]+)\)', str(c), a, 1) else: c = count(a) print(c) break def add_min(a): if '--' in a: a = a.replace('--', '+') c = re.findall('-?\d+\.?\d*', a) ls = [] for i in c: ls.append(float(i)) cal = sum(ls) return cal def mul(a): b = re.search('\d+\.?\d*(\*-?\d+\.?\d*)+', a) if b is not None: b = b.group() c = re.findall('-?\d+\.?\d*', b) ls =[] cal = 1 for item in c: ls.append(float(item)) for item1 in range(len(ls)): cal = cal * ls[item1] a = re.sub('\d+\.?\d*(\*-?\d+\.?\d*)+', str(cal), a, 1) return a def div(a): b = re.search('\d+\.?\d*(\/-?\d+\.?\d*)+', a) if b is not None: b = b.group() c = re.findall('-?\d+\.?\d*', b) ls =[] for i in c: ls.append(float(i)) cal = ls[0] for item1 in range(1,len(ls)): cal = cal / ls[item1] a = re.sub('\d+\.?\d*(\/-?\d+\.?\d*)+', str(cal), a, 1) return a def count(b): while True: if '*' in b: c = b.split('*') if '/' in c[0]: b = div(b) else: b = mul(b) elif '/' in b: b = div(b) elif '+' or '-' in b: b = add_min(b) return b else: return b calculate()
4.程序运行