zoukankan      html  css  js  c++  java
  • 【python练习】计算器(使用正则表达式实现)

    功能:

    1. 实现加减乘除及拓号优先级解析
    2. 用户输入
      1-2*((60-30+(-40/5)*(9-2*5/3-2*(-18.3/3-(5*2+3+(-2*3)*(-7-1)/(5*7)*2)+2/6*7)+(-6+5+1)-7/3*99/4*(-2998)/3+10*568/14))-(-4*3)/(16-3*2))+(2+3*2)+(2-3)

      类似公式后,通过正则表达式解析里面的(),+,-,*,/符号和公式,运算后得出结果

    # Author:q1.ang
    import re
    content=input('''
    - - - 计算器 - - -
    输入:
    ''').strip()
    # content='1-2*((60-30+(-40/5)*(9-2*5/3-2*(-18.3/3-(5*2+3+(-2*3)*(-7-1)/(5*7)*2)+2/6*7)+(-6+5+1)-7/3*99/4*(-2998)/3+10*568/14))-(-4*3)/(16-3*2))+(2+3*2)+(2-3)'
    
    def calculation(find_list,content):
        '''
        计算find_list中的式子
        :param find_list: 正则表达式索引到的列表
        :param content: 原计算式
        :return: 计算后的计算式
        '''
        for i in find_list:
            print('计算式:',i)
            result=0
            if '*' in i or '/' in i:#判断是否含有乘除号
                num = re.findall('[-d.]+',i) #提取数字
                symbol=re.findall('[*/]',i)     #提取运算符,*/
                print('num:', num)
                print('symbol:', symbol)
                for i2 in range(len(symbol)):   #循环计算,num1为数字1,num2为数字2,sym为运算符
                    print('计算次数:', i2 + 1)
                    num1=num[i2]
                    num2=num[i2 + 1]
                    sym=symbol[i2]
                    if sym == '*':
                        num[i2 + 1] = float(num1) * float(num2)
                    elif sym == '/':
                        num[i2 + 1] = float(num1) / float(num2)
                    if i2 == (len(symbol) - 1):
                        result = num[i2 + 1]
                        print('结果:', result)
            else:#加减运算
                num=re.findall('-{0,1}[d.]+',i)      #提取数字
                for i3 in num:
                    result+=float(i3)
                print('结果:', result)
            content=content.replace(i,str(result),1)    #替换
        return content
    
    def replace_symbol(content):
        '''
        替换重复相连的运算符
        :param content: 原计算式
        :return: 替换后的计算式
        '''
        content = content.replace('++', '+')
        content = content.replace('--', '+')
        content = content.replace('-+', '-')
        content = content.replace('+-', '-')
        content = content.replace('*+', '*')
        content = content.replace('+*', '*')
        content = content.replace('/+', '*')
        content = content.replace('+/', '*')
    
        return content
    stop_flag=True content1='' while stop_flag: find_mul_div = re.findall('(?:[d.]+(?:[*/]-|[*/]))+[d.]+',content) #匹配所有乘除法,2*3/4 content=calculation(find_mul_div,content) content=replace_symbol(content) print(content) find_bracket = re.findall('([+-*/d.]+)',content) #匹配最内括号里的内容,2*3/4 content=calculation(find_bracket,content) content=replace_symbol(content) print(content) if content1==content: #运算至只有加减法 last=[content] content = calculation(last,content) stop_flag=False content1 = content print('=',content)
  • 相关阅读:
    2019牛客暑期多校训练营(第六场)
    2019牛客暑期多校训练营(第五场)
    CCPC-Wannafly Summer Camp 2019 全记录
    2018CCPC吉林赛区 | 部分题解 (HDU6555 HDU6556 HDU6559 HDU6561)
    2006-2007 ACM-ICPC | POJ3380 POJ3384 POJ3385 水题题解
    数论专场 Day9 部分题解
    Catenyms (POJ2337) 字典序最小欧拉路
    2019暑训第一场训练赛 |(2016-icpc区域赛)部分题解
    哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)B 小乐乐搭积木 (状态压缩)
    牛客练习赛32B Xor Path (树形dp)
  • 原文地址:https://www.cnblogs.com/q1ang/p/9063727.html
Copyright © 2011-2022 走看看