Python 设计一个简单的计算器
设计目标
- 实现加减乘除及拓号优先级解析
- 用户输入
1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2) )
等类似公式后,
- 必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
流程图

代码
1、主文件
import re
def multi_or_divi(string):
calc_list = re.search("[^()]+", string)
sub_calc_list = re.split("[*/]", calc_list.group())
sub_operator_list = re.findall("[*/]", calc_list.group())
sub_res = None
for index in range(len(sub_calc_list)):
if sub_res:
if sub_operator_list[index-1] == "*":
sub_res *= float(sub_calc_list[index])
else:
sub_res /= float(sub_calc_list[index])
else:
sub_res = float(sub_calc_list[index])
return float(sub_res)
def add_or_sub(string):
calc_list = re.search("[^()]+", string)
sub_calc_list = re.split("[+-]", calc_list.group())
sub_operator_list = re.findall("[+-]", calc_list.group())
if re.match("[-+]", calc_list.group()):
if sub_operator_list[0] == "-":
sub_calc_list[1] = -float(sub_calc_list[1])
sub_operator_list = sub_operator_list[1:]
sub_calc_list = sub_calc_list[1:]
if len(sub_operator_list) == 0:
return sub_calc_list[0]
sub_res = None
for index in range(len(sub_calc_list)):
if sub_res:
if sub_operator_list[index-1] == "+":
sub_res += float(sub_calc_list[index])
else:
sub_res -= float(sub_calc_list[index])
else:
sub_res = float(sub_calc_list[index])
return float(sub_res)
def deal_minus_issue(ret):
new_ret = []
for index, item in enumerate(ret):
if item.endswith("*") or item.endswith("/"):
new_ret.append("%s-%s" %(ret[index], ret[index+1]))
elif re.search("[*/]", ret[index]):
new_ret.append(ret[index])
return new_ret
def main():
a = '1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2) )'
a = a.replace(" ", "")
count = 2
while True and count > 0:
calc_list = re.search(r'\([^()]+\)', a)
if calc_list:
calc_list_value = calc_list.group()
else:
count -= 1
calc_list_value = a
if "+" in calc_list_value or "-" in calc_list_value:
if "*" in calc_list_value or "/" in calc_list_value:
calc_list1 = re.findall(r'[^()]+', calc_list_value)
calc_list2 = re.split(r'[-+]', calc_list1[0])
calc_list2 = deal_minus_issue(calc_list2)
for item in calc_list2:
value = multi_or_divi(item)
a = a.replace(item, str(value))
a = a.replace("+-", "-")
a = a.replace("--", "+")
else:
value = add_or_sub(calc_list_value)
a = a.replace(calc_list_value, str(value))
a = a.replace("+-", "-")
a = a.replace("--", "+")
else:
if "*" in calc_list_value or "/" in calc_list_value:
value = multi_or_divi(calc_list_value)
a = a.replace(calc_list_value, str(value))
a = a.replace("+-", "-")
a = a.replace("--", "+")
print("运行结果:", a)
if __name__ == '__main__':
main()
2、运行结果
运行结果: 1-2*((6-3-1.0*(9-2*3/3+7/3*7/4*12+10*1.0))-(-4*3)/(12-3*2))
运行结果: 1-2*((6-3-1.0*(9-2.0+49.00000000000001+10.0))-(-4*3)/(12-3*2))
运行结果: 1-2*((6-3-1.0*66.0)-(-4*3)/(12-3*2))
运行结果: 1-2*((6-3-66.0)-(-4*3)/(12-3*2))
运行结果: 1-2*(-63.0-(-4*3)/(12-3*2))
运行结果: 1-2*(-63.0-(-12.0)/(12-3*2))
运行结果: 1-2*(-63.0+12.0/(12-3*2))
运行结果: 1-2*(-63.0+12.0/(12-6.0))
运行结果: 1-2*(-63.0+12.0/6.0)
运行结果: 1-2*(-63.0+2.0)
运行结果: 1-2*-61.0
运行结果: 1+122.0
运行结果: 123.0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通