• python 简单计算器


    一、题目

    开发一个简单的python计算器:
    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) ) 等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),
    运算后得出结果,结果必须与真实的计算器所得出的结果一致

    二、解题思路

    1、先实现一个函数可以计算,不含括号的简单+-*/运算。
    2、使用递归的思想,利用正则表达式,取出最内层的的括号内容,然后利用1中所设计的函数计算,然后将结果返回。然后循环。大致思路如下图:

    三、代码

    import re
    def get_son(s,operation):
        dig = '-?d+(.d+)?'
        g = re.search(dig +operation + dig, s).group()
        if  s.index(g)!=0 and s[s.index(g)-1].isdigit():g = g[1:]
        ls = g.split(operation[-1])
        if len(ls)==3:ls =['-'+ls[1],ls[2]]
        return g,ls
    def cal(s):
        for i in ['/','*']:
            while i in s:
                if i=='*':
                    g, ls = get_son(s, '*')
                    s = s.replace(g, str(round(float(ls[0]) * float(ls[1]),8)))
                elif i=='/':
                    g, ls = get_son(s, '/')
                    s = s.replace(g, str(round(float(ls[0]) / float(ls[1]),8)))
        s =s.replace('--','+')
        while not re.match('^-?d+(.d+)?$',s):
            fist_opear = re.search('[^d.]', s[1:]).group()
            if fist_opear == '-':
                g, ls = get_son(s, '-')
                s = s.replace( g, str(float(ls[0]) - float(ls[1])))
            else:
                g, ls = get_son(s, '+')
                s = s.replace(g, str(float(ls[0]) + float(ls[1])))
        return s
    def cal_all(s):
    
        s= s.replace(' ','')
        while '(' in s:
            print(s)
            son = re.search('([^()]+)',s).group()
            s = s.replace(son,cal(son[1:-1]))
        return cal(s)
    s = '-3*( 4+ 50 )+(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)'
    print(cal_all(s))
    print(eval(s))

     最后运行结果如下:结果和eval完全一样

  • 相关阅读:
    2017NOIP游记 (格式有点炸)
    Qtree3
    [P2769] 猴子上树
    [Usaco2005 Dec]Cleaning Shifts 清理牛棚
    [NOIP2014] 解方程
    [ZJOI2012] 灾难
    [洛谷P3941] 入阵曲
    [SCOI2009] 最长距离
    [JLOI2011] 飞行路线
    虚拟化数电底层
  • 原文地址:https://www.cnblogs.com/linshuhui/p/9643667.html
Copyright © 2020-2023  润新知