• python练习---模拟计算器


    #!/bin/env python
    # -*- coding:utf-8 -*-
    '''
    实现能计算类似
    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 cal_mini_exp(mini):
        #计算40/5 2*5这样的表达式
        if '*' in mini:
            mun1,mun2 = mini.split('*')
            return str(float(mun1) * float(mun2))
        elif '/' in mini:
            mun1, mun2 = mini.split('/')
            return str(float(mun1) / float(mun2))
    
    
    
    def conform(exp):
        exp = exp.replace('--','+')
        exp = exp.replace('+-','-')
        exp = exp.replace('-+','-')
        exp = exp.replace('++','+')
        return exp
    
    def calculate(son_exp):
        '''
        计算内部不在有小括号表达式的结果
        :param exp:
        :return:
        '''
        son_exp = son_exp.strip('()')
        while True:   #完成一个表达式乘除法的计算
            ret = re.search('d+.?d*[*/]-?d+.?d*',son_exp)      #9-2*5/3+7/3*99/4*2998+10*568/14 匹配乘除表达式
            if ret:
                mini_exp = ret.group()
                # 40/5 2*5
                res = cal_mini_exp(mini_exp)  #40/5=8
                son_exp = son_exp.replace(mini_exp,res,1)
            else:break
    
        son_exp = conform(son_exp)   #整理表达式中的符号
        ret_l = re.findall('[+-]?d+.?d*',son_exp)
        sum = 0
        for i in ret_l:
            sum += float(i)
    
        return str(sum)
    
    
    
    exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
    a = exp
    #去空格
    exp = exp.replace(' ','')
    #print(exp)
    
    while True:
        #把表达中所有的小括号表达式都计算出来
        ret = re.search('([^()]+)',exp)   #是否匹配上的对象
        if ret:
            son_exp = ret.group()    #子表达式
            print('匹配小括号:%s' % son_exp)
            #计算乘除法,再计算加减
            ret = calculate(son_exp)
    
            exp = exp.replace(son_exp,ret,1)
        else:
            break
    
    
    print('最外层括号表达式:%s' % exp)
    ret = calculate(exp)
    print(ret)
    print('eval结果:',eval(a))
  • 相关阅读:
    Winform获取应用程序的当前路径的方法集合(转)
    C#制作简易屏保(转)
    在C#实现托盘效果(转)
    应用程序调用内核函数的流程
    windows驱动编程(目录)
    windows驱动编程入门(第一个程序)
    博客园文章编辑器【客户端应用程序】V2.0.0发布,命名为51cnblogs
    线性代数——矩阵二
    CAN通信要注意的问题
    线性代数——向量
  • 原文地址:https://www.cnblogs.com/watchslowly/p/9060351.html
Copyright © 2020-2023  润新知