作业计算器开发

作业:计算器开发

  1. 实现加减乘除及拓号优先级解析
  2. 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10* 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
import re

def deal_minus_issue(calc_list):
    new_calc_list = []
    print("before_calc_list",calc_list)

    for index,item in enumerate(calc_list):
        print(item)
        if item.strip().endswith("*") or item.strip().endswith("/"):
            new_calc_list.append("%s-%s"%(calc_list[index],calc_list[index+1]))
        elif "*" in item or "/" in item:
            new_calc_list.append(item)
    print("new calc_list",new_calc_list)
    return new_calc_list


def plus_subtraction(formula):
    print("\033[31;1m运算2\033[0m",formula)
    formula=re.sub('--','+',formula)
    formula=re.sub('-\+','-',formula)

    formula=formula.split("+-")
    print("\033[31;1m运算22\033[0m",formula)

    for item in formula:
        # print(item)
        sub_plus_list = re.split('[+-]',item)
        print(sub_plus_list)
        sub_plus_operator_list=re.findall('[+-]',item)
        print(sub_plus_list,sub_plus_operator_list,"---------------------------------------------------------")

        for index,i in enumerate(sub_plus_list):
            # print(index)
            if i == '':
                print(index)
                print(sub_plus_list[index],'++++++++++++++')
                sub_plus_list[index] = str(0.0)
        print(sub_plus_list,sub_plus_operator_list,'+++++-----------')

        sub_res = None
        for index,i in enumerate(sub_plus_list):
            if sub_res:
                if sub_plus_operator_list[index-1] == "+":
                    sub_res += float(i)
                else:
                    sub_res -= float(i)
            elif index >0:
                if sub_plus_operator_list[index-1] == "+":
                    sub_res += float(i)
                else:
                    sub_res -= float(i)
            else:
                sub_res = float(i)
                print('++++++++++++++++++++++++++++++++++++sub_res+++++++++++++++',sub_res)
        print("\033[31;1m[%s]=\033[0m"%item,str(sub_res))
    return str(sub_res)


def multiply_dividend(formula):
    print("\033[31;1m运算1\033[0m",formula)
    formula=formula.replace(' ','')
    formula=re.sub('--','+',formula)
    print("\033[31;1m运算11\033[0m",formula)

    mm =re.match('^-',formula)

    if mm:
        calc_list = re.split("[+-]",formula)
        calc_list[0]='-'
    else:
        calc_list = re.split("[+-]",formula)

    print(calc_list)



    print(calc_list,"运算112")

    calc_list = deal_minus_issue(calc_list)

    print("final_calc_list",calc_list)


    for item in calc_list:
        sub_calc_list=re.split('[/*]',item)
        sub_operator_list=re.findall('[/*]',item)
        print(sub_calc_list,sub_operator_list)
        sub_res = None
        for index,i in enumerate(sub_calc_list):
            if sub_res:#这不是第一次循环
                if sub_operator_list[index-1] == "*":
                    sub_res *= float(i)
                else:
                    sub_res /= float(i)
            else:
                sub_res = float(i)
        print("\033[31;1m[%s]=\033[0m"%item,str(sub_res))
        formula=formula.replace(item,str(sub_res))
    print("\033[32;1m结果1\033[0m",formula)

    formula=re.sub('\+-','-',formula)
    print(formula,'结果111')

    mm =re.match('^-[0-9.]{1,}$',formula)
    mn = re.search('[\+-]',formula)



    if mm:
        return formula
    else:
        return plus_subtraction(formula)

#去掉括号
def calc(formula):
    parenthese_flag=True
    while parenthese_flag:
        m = re.search('\([^()]+\)',formula)
        if m:
            print(m.group())
            sub_formula = m.group().strip("()")
            sub_res = multiply_dividend(sub_formula)
            # print(sub_res)
            m1 = m.group()
            # print(m1)
            formula=formula.replace(m1,str(sub_res))
            print(formula)
            calc(formula)
            break
        else:
            parenthese_flag=False
            sub_formula=re.sub(' ','',formula)
            sub_res = multiply_dividend(sub_formula)
            print(sub_res)


if __name__ == '__main__':
    formula="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
    # formula = "1 - 2 * ( (60-30 +(9-2*5/-3 + 7 /3*99/4*2998 +10 * 568/14 )*(-40/5)  ) - (-4*3)/ (16-3*2) )"

    res = calc(formula)

2776672.6952380957

  

猜你喜欢

转载自www.cnblogs.com/li-deng/p/12296603.html