计算器

需求: 计算加减乘除和小括号级别的运算,需考虑到正负数

 

运算优先级:括号>乘除>加减

流程图:

 

 

主函数:

if __name__ == '__main__':
    exp = str(input('请输入公式:\n>>'))
    # 测试公式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
    exp = exp.split()
    exp = ''.join(exp)
    exp = exp.strip()
    print(exp)
    figure_up(exp)
View Code

 

获取里层括号公式:

def figure_up(exp_get):
    flag_exit = False
    while not flag_exit:
        every_percent = re.search('\([^()]*\)', exp_get)    # 获取里层括号部分
        if every_percent:
            formula = every_percent.group().strip('()')     # 对获取部分去括号处理
            ret = calculate(formula)
            exp_get = exp_get.replace(every_percent.group(), str(ret))
        else:
            ret_end = calculate(exp_get)
            print('最终结果为:', ret_end)
            flag_exit = True
View Code

 

无括号运算:

def calculate(expression):
    expression = symbol_fix(expression)
    symbol_list = re.findall('[+-]', expression)  # 取+-运算符和正负号
    mul_div_list = re.split('[+-]', expression)  # 按+-运算符和正负号分割
    if not mul_div_list[0]:  # 开头为负号的情况, 列表压缩处理
        mul_div_list[1] = symbol_list[0] + mul_div_list[1]
        del mul_div_list[0]
        del symbol_list[0]
    symbol_list, mul_div_list = minus_fix(symbol_list, mul_div_list)
    for index, item in enumerate(mul_div_list):
        ret = mul_div(item)
        mul_div_list[index] = ret

    # 乘除计算完毕,并成功替换,开始计算加减
    if len(symbol_list):
        ret_end = None
        for index, item in enumerate(mul_div_list):
            if index:
                if symbol_list[index - 1] == '+':
                    ret_end += float(item)
                elif symbol_list[index - 1] == '-':
                    ret_end -= float(item)
            else:
                ret_end = float(mul_div_list[0])
        return ret_end
    else:
        return mul_div_list[0]
View Code

 

乘除运算:

def mul_div(formula):           # 乘除运算
    if re.search('[*/]', formula):
        list_items = re.split('[*/]', formula)
        list_symbol = re.findall('[*/]', formula)
        ret = None
        for index, item in enumerate(list_items):
            if index:
                if list_symbol[index-1] == '*':
                    ret *= float(item)
                elif list_symbol[index-1] == '/':
                    ret /= float(item)
            else:
                ret = float(item)
        return ret

    else:
        return formula
View Code

 

去除重复加减号:

def symbol_fix(formula):            # 去除重复加减号
    formula = ''.join(formula)
    formula = formula.strip()
    formula = formula.replace('--', '+')
    formula = formula.replace('-+', '-')
    formula = formula.replace('+-', '-')
    formula = formula.replace('++', '+')
    return formula
View Code

 

乘除符号后面接负号的情况:

def minus_fix(symbol, expression):          # */ 后面接负号的情况, 列表压缩处理
    for index, item in enumerate(expression):
        if item.endswith('*') or item.endswith('/'):
            expression[index] = expression[index] + symbol[index] + expression[index+1]
            del expression[index+1]
            del symbol[index]
    return symbol, expression
View Code

 

posted @ 2016-11-21 15:07  Yu-feng  阅读(115)  评论(0编辑  收藏  举报