zoukankan      html  css  js  c++  java
  • python练习-计算器小程序

    一个计算器小程序

    需求

    代码实现

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author : QiuMeng
    
    import re
    
    def replace_func(FormulaChunk):
        '''
        #去除一些会影响运算的符号
        :param FormulaChunk: #传入一个去除括号后的字符串
        :return: 去除这些东西后标准的返回
        '''
        FormulaChunk = FormulaChunk.replace(" ","")
        FormulaChunk = FormulaChunk.replace("+-","-")
        FormulaChunk = FormulaChunk.replace("--","+")
        return FormulaChunk
    
    
    
    def mul_and_div(CombineHandlerList):
        '''
        计算乘法,除法
        :return:返回一个没有任何"*/"字符的列表
        '''
        ChunkPartitionList = CombineHandlerList[1]
        for index,item in enumerate(ChunkPartitionList):
            if "*" in item or "/" in item:  # 判断这个元素中是否有"*/"
                OperatorList = re.findall("[*/]",item)  # 分割出乘除号
                PartitionList = re.split("[*/]",item)   # 根据乘除分割
                SumCount = None
                for i,j in enumerate(PartitionList):
                    if SumCount:  #第一个元素不计算
                        if OperatorList[i-1] == "*":  # 算乘法
                            SumCount *= float(j)
                        elif OperatorList[i-1] == "/":  # 算除法
                            SumCount /= float(j)
                    else:
                        SumCount = float(j)
                ChunkPartitionList[index] = SumCount
        return CombineHandlerList
    
    
    def add_and_subtract(CombineHandlerListMuledAndDived):
        '''
        [['-', '-', '-', '-', '-', '-', '+'], ['-9', '2', '5', -6.0, 1.6666666666666667, 80.0, 0.6, 18.0]]
        计算加减法
        :param CombineHandlerListMuledAndDived: 经过正负聚合且完成乘除的list
        :return: 返回一个只有一个float字符串的list
        '''
        # ['-', '-', '-', '-', '-', '-', '+']
        ChunkOperationList = CombineHandlerListMuledAndDived[0] # 加减操作符列表
        # ['-9', '2', '5', -6.0, 1.6666666666666667, 80.0, 0.6, 18.0]  # 注意其中的字符串和float
        ChunkPartitionList = CombineHandlerListMuledAndDived[1] # 按加减分割后元素列表
        SumCount = None
        for index,item in enumerate(ChunkPartitionList):
            if SumCount:
                if ChunkOperationList[index-1] == "-":  # 算减法
                    SumCount -= float(item)
                elif ChunkOperationList[index-1] == "+":  # 算加法
                    SumCount += float(item)
            else:
                SumCount = float(item)
        return SumCount
    
    
    
    def combine(HandlerList):
        '''
        将ChunkPartitionList中类似于"2*"和"-"+"3"放在一起
        :param HandlerList: 已经处理过的两个列表
        :return:
        '''
        ChunkOperationList = HandlerList[0]  # 操作符列表
        ChunkPartitionList  = HandlerList[1] # 按加减分割后元素列表
        for index,item in enumerate(ChunkPartitionList):
            if item.endswith("/") or item.endswith("*"):
                ChunkPartitionList[index] = item + ChunkOperationList[index] + ChunkPartitionList[index+1] # 合并
                del ChunkOperationList[index]  # 合并完成后删除对应的元素
                del ChunkPartitionList[index+1]
    
        CombineHandlerList = []
        CombineHandlerList.insert(0,ChunkOperationList)
        CombineHandlerList.insert(1,ChunkPartitionList)
    
        return CombineHandlerList
    
    
    def handler_list(FormulaChunk):
        '''
        '(-9-2-5-2*-3-5/3-40*4/2-3/5+6*3)'
        将这样的一个括号内的快转化为固定的列表返回
        :param UserInput:
        :return:
        '''
        FormulaChunk = re.sub("[()]", "", FormulaChunk)  # 去掉字符串前后的括号
        FormulaChunk = replace_func(FormulaChunk)
        # '-9-2-5-2*-3-5/3-40*4/2-3/5+6*3'
        ChunkOperationList = re.findall("[+-]",FormulaChunk)  # 获取这个块的所有加减法运算符号来获取一个list
        # ['-', '-', '-', '-', '-', '-', '-', '-', '+']
        ChunkPartitionList = re.split("[+-]",FormulaChunk)  # 通过加减符号将Chunk分隔开来获取一个list
        # ['', '9', '2', '5', '2*', '3', '5/3', '40*4/2', '3/5', '6*3']
        if not ChunkPartitionList[0]:  #ChunkPartitionList列表第一个是否为空,该块则以+-开始
            if ChunkOperationList[0] == "-":  # 是负号要加到第二个里面,删除两个列表的第一个元素
                ChunkPartitionList[1] = ChunkOperationList[0] + ChunkPartitionList[1]
                del ChunkPartitionList[0]
                del ChunkOperationList[0]
            elif ChunkOperationList[0] == "+": # 是正号去除两个列表的第一个元素
                del ChunkPartitionList[0]
                del ChunkOperationList[0]
        # ['-', '-', '-', '-', '-', '-', '-', '+']
        # ['-9', '2', '5', '2*', '3', '5/3', '40*4/2', '3/5', '6*3']
        #  这样的列表元素要进行再次处理将"2*"和"-"+"3"放在一起
        HandlerList  = []
        HandlerList.insert(0,ChunkOperationList)
        HandlerList.insert(1,ChunkPartitionList)
        return HandlerList
    
    
    def calculate(UserInput):
        '''
        主函数
        :param formula:
        :return:
        '''
        # TODO 这块可以使用递归来写
        while UserInput: #输入不为空
            UserInput = UserInput.replace(" ", "")  # 去掉空格
            if re.findall("[()]",UserInput):  # 是否有括号
                FormulaChunk = re.search("([^()]+)",UserInput).group()  # 获取一个括号
                # 要把括号中的一些东西给去除掉
                HandlerList = handler_list(FormulaChunk) # 按照加减符号进行第一个分割
                CombineHandlerList = combine(HandlerList)  # 将ChunkPartitionList中类似于"2*"和"-"+"3"放在一起后list
                CombineHandlerListMuledAndDived = mul_and_div(CombineHandlerList) # 计算完成后乘除法的list
                SumCount = add_and_subtract(CombineHandlerListMuledAndDived)  # 计算完成加减法后的结果
                UserInput = UserInput.replace(FormulaChunk,str(SumCount))
    
            else: # 如果没有的话将其转化成对应的列表格式进行计算
                HandlerList = handler_list(UserInput)
                CombineHandlerList = combine(HandlerList)
                CombineHandlerListMuledAndDived = mul_and_div(CombineHandlerList)
                SumCount = add_and_subtract(CombineHandlerListMuledAndDived)
                print(SumCount)
                break
    
    
    if __name__ == '__main__':
        #formula = "1 - 2 * (30+ (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"
        formula = input(">")
        calculate(formula)
    
  • 相关阅读:
    LeetCode Array Easy 414. Third Maximum Number
    LeetCode Linked List Medium 2. Add Two Numbers
    LeetCode Array Easy 283. Move Zeroes
    LeetCode Array Easy 268. Missing Number
    LeetCode Array Easy 219. Contains Duplicate II
    LeetCode Array Easy 217. Contains Duplicate
    LeetCode Array Easy 189. Rotate Array
    LeetCode Array Easy169. Majority Element
    LeetCode Array Medium 11. Container With Most Water
    LeetCode Array Easy 167. Two Sum II
  • 原文地址:https://www.cnblogs.com/forsaken627/p/6607176.html
Copyright © 2011-2022 走看看