博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算器
阅读量:4635 次
发布时间:2019-06-09

本文共 3062 字,大约阅读时间需要 10 分钟。

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

 

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

流程图:

 

 

主函数:

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

 

转载于:https://www.cnblogs.com/mountian-lion/p/6085509.html

你可能感兴趣的文章
C语言的变量的内存分配
查看>>
clientcontainerThrift Types
查看>>
链接全局变量再说BSS段的清理
查看>>
hdu 1728 逃离迷宫
查看>>
HTML5与CSS3权威指南之CSS3学习记录
查看>>
docker安装部署
查看>>
AVL树、splay树(伸展树)和红黑树比较
查看>>
多媒体音量条显示异常跳动
查看>>
运算符及题目(2017.1.8)
查看>>
React接入Sentry.js
查看>>
ssh自动分发密匙脚本样板
查看>>
转 小辉_Ray CORS(跨域资源共享)
查看>>
Linux安装postgresql
查看>>
MyBatis启动:MapperStatement创建
查看>>
Tomcat 调优及 JVM 参数优化
查看>>
【kindeditor】KindEditor获取多个textarea文本框的值并判断非空
查看>>
【 全干货 】5 分钟带你看懂 Docker !
查看>>
[转]优化Flash性能
查看>>
【大话设计模式】——浅谈设计模式基础
查看>>
popStar手机游戏机机对战程序
查看>>