模拟计算器

题目:

模拟计算器开发:

实现加减乘除及拓号优先级解析

用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

流程图:

代码:

#!/usr/bin/env python
# -*-coding:utf-8-*-
# _author_=zh
import re

a='1 - 2 * ((60 - 30 + (-40 / 5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))'
a="("+a+")"

#找最里层括号
while re.search("\([^()]*\)", a):
    z1=re.search("\([^()]*\)", a).group()
    save=z1
    # 处理括号内部乘除
    while re.search('\d+\.?\d*\s*[\/\*]\s*[\+\-]?\d+\.?\d*', z1):
        z2 = re.search('\d+\.?\d*\s*[\/\*]\s*[\+\-]?\d+\.?\d*', z1).group()
        # 分割
        z3 = re.findall('\d+\.?\d*|[\-\/\*]', z2)
        if "-" in z3:
            z3.remove("-")
        if "/" in z3:
            z4 = float(z3[0]) / float(z3[2])
        else:
            z4 = float(z3[0]) * float(z3[2])
        z4=z4 if "-" not in z2 else -z4
        z1 = z1.replace(z2, str(z4))
    # 处理括号内部加减
    while re.search('\d+\.?\d*\s*[\+\-]\s*[\+\-]*\s*\d+\.?\d*', z1):
        s2 = re.search('\d+\.?\d*\s*[\+\-]\s*[\+\-]*\s*\d+\.?\d*', z1).group()
        s3 = re.findall('\d+\.?\d*|[\+\-]', s2)
        #当出现++的情况时
        if s3.count("+") == 2:
            s3.remove("+")
        elif s3.count("-") == 2:
            s3.remove("-")
            s3[1] = "+"
        elif s3.count("+")==1 and s3.count("-")==1:
            s3.remove("+")
        if "+" in s3:
            s4 = float(s3[0]) + float(s3[2])
        else:
            s4 = float(s3[0]) - float(s3[2])
        z1 = z1.replace(s2, str(s4))
    #运算完成去除括号
    z1=z1.strip("(").strip(")")
    a=a.replace(save,str(z1))
print(a)

 

posted @ 2017-09-29 18:38  zhuh  阅读(579)  评论(0编辑  收藏  举报