zoukankan      html  css  js  c++  java
  • 计算器<代码>

      1 import re
      2 l_no = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
      3 true_tr = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
      4 trunswer = eval(true_tr)
      5 print(trunswer)
      6 l = re.sub(" +","",l_no)  # 替换 没有+号也能实现  有第四个元素 为替换几次
      7 l_list = list(l)          # 还有一个subn方法 会返回一个替换几次的数字
      8 def check_w(formula):                     #  check函数
      9     formula=re.sub("--","+",formula)
     10     formula=re.sub("-+|+-","+",formula)    # 管道符号|的意思是or 反斜杠 消除特殊意义
     11     a = re.findall("[a-z]|[A-Z]",formula)    # 中括号会消除特殊字符 并且都是or关系
     12     b = re.findall("()",formula)        # 找空括号
     13     if a or b:
     14         print("存在字母空括号")
     15         exit()
     16     return formula
     17 l_no = check_w(l_no)
     18 s = l_no
     19 def left_parenthesis(formula):         # find the left parenthesis  --
     20     a = re.search("(", formula)
     21     if a == None:                      # 有一种个简单方法“([^()]+)” 中括号消除特殊意思
     22         return None                    # 但是除了 ^ -三个 “(([^()]+))”会匹配括号内容
     23     b = a.span()                       # 因为findall是优先匹配括号内容
     24     return b[1]
     25 def right_parenthesis(formula):          # find the right parenthesis --
     26     a = re.search(")", formula)
     27     if a == None:
     28         return None
     29     b = a.span()
     30     return b[1]
     31 def code_muldiv(numcc):                # function for multiplication and division
     32     result = []                        # 这是一种算法 所有factor制成列表 所有mathematical symbol
     33     for i in numcc:                    # (-+或者*/)制成一个列表 之后利用列表有顺序来进行计算
     34         jishufuhao = 0                 # 正好适合8*-8这种形式
     35         jishushu = 1
     36         fuhao2 = []
     37         num = []
     38         fuhao2 = re.findall("*|/",i)
     39         num = re.split("[*/]",i)             # 将所有因数(除数)整理成一个列表
     40         flag2 =True
     41         while flag2:
     42             if fuhao2[jishufuhao] == "*":
     43                 ga = float(num[jishushu-1]) * float(num[jishushu])
     44                 num[jishushu] = ga
     45                 jishushu+=1
     46                 jishufuhao+=1
     47             elif fuhao2[jishufuhao] == "/":
     48                 ha = float(num[jishushu - 1]) / float(num[jishushu])
     49                 num[jishushu] = ha
     50                 jishushu += 1
     51                 jishufuhao += 1
     52             if jishufuhao+1 > len(fuhao2):
     53                 flag2 = False
     54         result.append(num[jishushu-1])
     55     return result
     56 def code_addsub(numcc):       # function for addition and subtraction
     57     result = []
     58     for i in numcc:
     59         jishufuhao = 0
     60         jishushu = 1
     61         fuhao2 = []
     62         num = []
     63         i = re.sub("--","+",i)
     64         i = re.sub("+-|-+","-",i)
     65         i = re.sub("^+","",i)
     66         a = re.findall("^-d+.?d*",i)    ### 如果formula为 -9+8 ,这个函数的功能
     67         if a == []:                        ### 就是将其转换为  0+8-9 这样便将minus
     68             pass                           ### 转化为无符号式子
     69         else:                              ###
     70             i = re.sub(a[0],"0",i,1)       ###
     71             i = "".join([i,a[0]])          ###
     72         fuhao2 = re.findall("+|-",i)
     73         num = re.split("[+-]",i)
     74         if fuhao2 ==[]:
     75             return numcc
     76         flag2 = True
     77         while flag2:
     78             if fuhao2[jishufuhao] == "+":
     79                 ga = float(num[jishushu-1]) + float(num[jishushu])
     80                 num[jishushu] = ga
     81                 jishushu+=1
     82                 jishufuhao+=1
     83             elif fuhao2[jishufuhao] == "-":
     84                 ha = float(num[jishushu - 1]) - float(num[jishushu])
     85                 num[jishushu] = ha
     86                 jishushu += 1
     87                 jishufuhao += 1
     88             if jishufuhao+1 > len(fuhao2):
     89                 flag2 = False
     90         result.append(num[jishushu-1])
     91     return result
     92 def exchange_l(formula):           # for calculating mul div
     93     flag4 = True
     94     while flag4:
     95         need_md = re.findall("d+.?d*[*/]-?d+.?d*",formula)
     96         if need_md == []:  # 上边这个正则 是匹配乘除并且两边是3.9这样的数字
     97             break
     98         e = need_md
     99         k = code_muldiv(e)
    100         out_s = formula.replace(str(need_md[0]),str(k[0]))
    101         formula =out_s
    102     return formula
    103 flag2 = True
    104 while flag2:
    105     flag = True
    106     a = 0
    107     y_y=right_parenthesis(s)
    108     if y_y == None:                       # 判断 没有括号时,直接计算
    109         formula_jj = exchange_l(l)
    110         final_result = code_addsub([formula_jj])
    111         l = l.replace(l, str(final_result[0]), 1)
    112         s = l
    113         print("result:",s)
    114         break
    115     else:
    116         y = right_parenthesis(s) - 1
    117     while flag:                              # 多次寻找左括号 并且切片后再寻找
    118         position_psis = left_parenthesis(s)
    119         if position_psis == None:
    120             position_psis = 0
    121             break
    122         s= s[position_psis:]             # 将找到的左括号后面的字符串切片
    123         a += position_psis               # 记录下序列号
    124         if a > y:                        # 若是左括号序列号比右括号大 则停止寻找
    125             flag = False
    126     a = a - position_psis
    127     need_l = l[a:y]                      # 需要处理的括号内容
    128     ex_input = l[a - 1:y + 1]
    129     need_l =str(need_l)   # 3+2-3
    130     formula_jj = exchange_l(need_l)      # 进行乘除处理
    131     final_result = code_addsub([formula_jj]) # 进行加减处理
    132     l = l.replace(ex_input, str(final_result[0]), 1) # 用结果替换掉字符串
    133     s = l                                            # 赋值再次循环用
     
    import re
    l_no = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
    true_tr = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
    trunswer = eval(true_tr)
    print(trunswer)
    l = re.sub(" +","",l_no) # 替换 没有+号也能实现 有第四个元素 为替换几次
    l_list = list(l) # 还有一个subn方法 会返回一个替换几次的数字
    def check_w(formula): # check函数
    formula=re.sub("--","+",formula)
    formula=re.sub("-+|+-","+",formula) # 管道符号|的意思是or 反斜杠 消除特殊意义
    a = re.findall("[a-z]|[A-Z]",formula) # 中括号会消除特殊字符 并且都是or关系
    b = re.findall("()",formula) # 找空括号
    if a or b:
    print("存在字母空括号")
    exit()
    return formula
    l_no = check_w(l_no)
    s = l_no
    def left_parenthesis(formula): # find the left parenthesis --
    a = re.search("(", formula)
    if a == None: # 有一种个简单方法“([^()]+)” 中括号消除特殊意思
    return None # 但是除了 ^ -三个 “([^()]+)”会匹配括号内容
    b = a.span() # 因为findall是优先匹配括号内容
    return b[1]
    def right_parenthesis(formula): # find the right parenthesis --
    a = re.search(")", formula)
    if a == None:
    return None
    b = a.span()
    return b[1]
    def code_muldiv(numcc): # function for multiplication and division
    result = [] # 这是一种算法 所有factor制成列表 所有mathematical symbol
    for i in numcc: # -+或者*/)制成一个列表 之后利用列表有顺序来进行计算
    jishufuhao = 0 # 正好适合8*-8这种形式
    jishushu = 1
    fuhao2 = []
    num = []
    fuhao2 = re.findall("*|/",i)
    num = re.split("[*/]",i) # 将所有因数(除数)整理成一个列表
    flag2 =True
    while flag2:
    if fuhao2[jishufuhao] == "*":
    ga = float(num[jishushu-1]) * float(num[jishushu])
    num[jishushu] = ga
    jishushu+=1
    jishufuhao+=1
    elif fuhao2[jishufuhao] == "/":
    ha = float(num[jishushu - 1]) / float(num[jishushu])
    num[jishushu] = ha
    jishushu += 1
    jishufuhao += 1
    if jishufuhao+1 > len(fuhao2):
    flag2 = False
    result.append(num[jishushu-1])
    return result
    def code_addsub(numcc): # function for addition and subtraction
    result = []
    for i in numcc:
    jishufuhao = 0
    jishushu = 1
    fuhao2 = []
    num = []
    i = re.sub("--","+",i)
    i = re.sub("+-|-+","-",i)
    i = re.sub("^+","",i)
    a = re.findall("^-d+.?d*",i) ### 如果formula -9+8 ,这个函数的功能
    if a == []: ### 就是将其转换为 0+8-9 这样便将minus
    pass ### 转化为无符号式子
    else: ###
    i = re.sub(a[0],"0",i,1) ###
    i = "".join([i,a[0]]) ###
    fuhao2 = re.findall("+|-",i)
    num = re.split("[+-]",i)
    if fuhao2 ==[]:
    return numcc
    flag2 = True
    while flag2:
    if fuhao2[jishufuhao] == "+":
    ga = float(num[jishushu-1]) + float(num[jishushu])
    num[jishushu] = ga
    jishushu+=1
    jishufuhao+=1
    elif fuhao2[jishufuhao] == "-":
    ha = float(num[jishushu - 1]) - float(num[jishushu])
    num[jishushu] = ha
    jishushu += 1
    jishufuhao += 1
    if jishufuhao+1 > len(fuhao2):
    flag2 = False
    result.append(num[jishushu-1])
    return result
    def exchange_l(formula): # for calculating mul div
    flag4 = True
    while flag4:
    need_md = re.findall("d+.?d*[*/]-?d+.?d*",formula)
    if need_md == []: # 上边这个正则 是匹配乘除并且两边是3.9这样的数字
    break
    e = need_md
    k = code_muldiv(e)
    out_s = formula.replace(str(need_md[0]),str(k[0]))
    formula =out_s
    return formula
    flag2 = True
    while flag2:
    flag = True
    a = 0
    y_y=right_parenthesis(s)
    if y_y == None: # 判断 没有括号时,直接计算
    formula_jj = exchange_l(l)
    final_result = code_addsub([formula_jj])
    l = l.replace(l, str(final_result[0]), 1)
    s = l
    print("result:",s)
    break
    else:
    y = right_parenthesis(s) - 1
    while flag: # 多次寻找左括号 并且切片后再寻找
    position_psis = left_parenthesis(s)
    if position_psis == None:
    position_psis = 0
    break
    s= s[position_psis:] # 将找到的左括号后面的字符串切片
    a += position_psis # 记录下序列号
    if a > y: # 若是左括号序列号比右括号大 则停止寻找
    flag = False
    a = a - position_psis
    need_l = l[a:y] # 需要处理的括号内容
    ex_input = l[a - 1:y + 1]
    need_l =str(need_l) # 3+2-3
    formula_jj = exchange_l(need_l) # 进行乘除处理
    final_result = code_addsub([formula_jj]) # 进行加减处理
    l = l.replace(ex_input, str(final_result[0]), 1) # 用结果替换掉字符串
    s = l # 赋值再次循环用
  • 相关阅读:
    grub
    init
    内核的ramdisk
    kernel信息及其相关命令
    mvc和mvvm模式
    vue从零开始(一)
    echarts自动播放图形
    echarts自定义悬浮框的显示
    typescript入门
    echarts的最外层配置项
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/5872645.html
Copyright © 2011-2022 走看看