zoukankan      html  css  js  c++  java
  • python学习——练习题(2)

    """
        题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;
        利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
        20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;
        60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,
        从键盘输入当月利润I,求应发放奖金总数?
    """
    import re
    
    
    def calculate1(profit):
        """
            自己的解答,直接使用最简单的思路
        """
        print("奖金计算一的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
        elif 0 <= profit <= 100000:
            print("%.2f*0.1=%.2f" % (profit, profit * 0.1))
        elif 100000 < profit <= 200000:
            print("(%.2f-100000)*0.075+10000=%.2f" % (profit, (profit - 100000) * 0.075 + 10000))
        elif 200000 < profit <= 400000:
            print("(%.2f-200000)*0.05+10000+7500=%.2f" % (profit, (profit - 200000) * 0.05 + 10000 + 7500))
        elif 400000 < profit <= 600000:
            print("((%.2f-400000)*0.03+10000+7500+10000=%.2f" % (profit, (profit - 400000) * 0.03 + 10000 + 7500 + 10000))
        elif 600000 < profit <= 1000000:
            print("((%.2f-600000)*0.015+10000+7500+10000+6000=%.2f" % (profit, (profit - 600000) * 0.015 + 10000 + 7500 +
                                                                       10000 + 6000))
        else:
            print("((%.2f-1000000)*0.01+10000+7500+10000+6000+6000=%.2f" % (profit, (profit - 1000000) * 0.01 + 10000 + 7500
                                                                            + 10000 + 6000 + 6000))
    
    
    def calculate2(profit):
        """
            参考答案,通过循环已排序好的阶段值列表,来计算总奖金
        """
        print("奖金计算二的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
            return
        profitRank = (1000000, 600000, 400000, 200000, 100000, 0)
        profitRate = (0.01, 0.015, 0.03, 0.05, 0.075, 0.1)
        tempProfit = profit
        sumBonus = 0
        for i in range(0, 6):
            if tempProfit > profitRank[i]:
                rankBonus = (tempProfit - profitRank[i]) * profitRate[i]
                sumBonus += rankBonus
                tempProfit = profitRank[i]
                if i == 5:
                    print("%.2f" % rankBonus, end="=")
                else:
                    print("%.2f" % rankBonus, end="+")
        print("%.2f" % sumBonus)
    
    
    def calculate3(profit):
        """
            利用sum方法计算,总金额, 其中还用到了zip,map,filter,join等函数
        """
        print("奖金计算三的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
            return
        profitRank = [1000000, 600000, 400000, 200000, 100000, 0]
        profitRate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
        profitCalc = [0, 0, 0, 0, 0, 0]
        tempProfit = profit
        for i in range(0, 6):
            if tempProfit > profitRank[i]:
                profitCalc[i] = tempProfit - profitRank[i]
                tempProfit = profitRank[i]
        pList = zip(profitCalc, profitRate)
        bonusList = map(lambda p: p[0] * p[1], pList)
        bonusList = list(filter(lambda f: f > 0, bonusList))
        bonus = sum(bonusList)
        bonusStrList = map(lambda f: "{:.2f}".format(f), bonusList)
        print("%s=%.2f" % ("+".join(bonusStrList), bonus))
    
    
    def calculate4(profit):
        """
        利用列表的切片来实现计算
        :param profit:
        :return:
        """
        print("奖金计算四的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
            return
        profitRank = [1000000, 600000, 400000, 200000, 100000, 0]
        profitRate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
        profitCalc = [400000, 200000, 200000, 100000, 100000]
        for i in range(0, 6):
            if profit > profitRank[i]:
                profitRate = profitRate[i:]
                profitCalc = profitCalc[i:]
                profitCalc.insert(0, profit - profitRank[i])
                break
        pList = zip(profitCalc, profitRate)
        bonusList = map(lambda p: p[0] * p[1], pList)
        bonusList = list(filter(lambda f: f > 0, bonusList))
        bonus = sum(bonusList)
        bonusStrList = map(lambda f: "%.2f" % f, bonusList)
        print("%s=%.2f" % ("+".join(bonusStrList), bonus))
    
    
    def calculate5(profit):
        """
        利用嵌套列表实现,其实和calculate2差不多,只不过是把两个列表组合到一个嵌套列表中
        :param profit:
        :return:
        """
        print("奖金计算五的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
            return
        profitRank = [[1000000, 0.01], [600000, 0.015], [400000, 0.03], [200000, 0.05], [100000, 0.075], [0, 0.1]]
        profitTemp = profit
        bonus = 0
        for i in range(0, 6):
            if profitTemp > profitRank[i][0]:
                bonusRank = (profitTemp - profitRank[i][0]) * profitRank[i][1]
                bonus += bonusRank
                profitTemp = profitRank[i][0]
                if i == 5:
                    print("%.2f" % bonusRank, end="=")
                else:
                    print("%.2f" % bonusRank, end="+")
        print("%.2f" % bonus)
    
    
    def calculate6(profit):
        """
        利用字典计算奖金,类似calculate5,只是将嵌套列表换成字典
        中间用到了,列表的排序方法sort和倒序方法reverse
        :param profit:
        :return:
        """
        print("奖金计算六的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
            return
        profitDict = {1000000: 0.01, 600000: 0.015, 400000: 0.03, 200000: 0.05, 100000: 0.075, 0: 0.1}
        # dict.keys()返回的事迭代器
        profitKey = list(profitDict.keys())
        profitKey.sort()
        profitKey.reverse()
        profitTemp = profit
        bonus = 0
        for i in range(0, len(profitKey)):
            if profitTemp > profitKey[i]:
                bonusRank = (profitTemp - profitKey[i]) * profitDict[profitKey[i]]
                bonus += bonusRank
                profitTemp = profitKey[i]
                if i == len(profitKey) - 1:
                    print("%.2f" % bonusRank, end="=")
                else:
                    print("%.2f" % bonusRank, end="+")
        print("%.2f" % bonus)
    
    
    def calculate7(profit, s):
        """
        利用递归来计算奖金,类似calculate1
        :param s:
        :param profit:
        :return:
        """
        if s == 0:
            print("奖金计算七的结果", end=":")
        if profit < 0:
            print("利润不能小于0")
            return
        elif 0 <= profit <= 100000:
            bonus1 = bonus = profit * 0.1
        elif 100000 < profit <= 200000:
            bonus1 = (profit - 100000) * 0.075
            bonus = bonus1 + calculate7(100000, 1)
        elif 200000 < profit <= 400000:
            bonus1 = (profit - 200000) * 0.05
            bonus = bonus1 + calculate7(200000, 1)
        elif 400000 < profit <= 600000:
            bonus1 = (profit - 400000) * 0.03
            bonus = bonus1 + calculate7(400000, 1)
        elif 600000 < profit <= 1000000:
            bonus1 = (profit - 600000) * 0.015
            bonus = bonus1 + calculate7(600000, 1)
        else:
            bonus1 = (profit - 1000000) * 0.01
            bonus = bonus1 + calculate7(1000000, 1)
        if s == 0:
            print("%.2f" % bonus1, end="=")
            print("%.2f" % bonus)
        else:
            print("%.2f" % bonus1, end="+")
        return bonus
    
    
    def answer():
        """
            解题答案,输入利润,然后调用计算方法计算利润
            不过在计算前,需要判断一下输入的是数值类型的,因为input输入的都是str类型
    
            str为字符串 str.isalnum() 所有字符都是数字或者字母
            str.isalpha() 所有字符都是字母
            str.isdigit() 所有字符都是数字
            str.islower() 所有字符都是小写
            str.isupper() 所有字符都是大写
            str.istitle() 所有单词都是首字母大写,像标题
            str.isspace() 所有字符都是空白字符、	、
    、
    
            上述的主要是针对整型的数字,但是对于浮点数来说就不适用了,那么浮点数怎么判断呢,
            1.通过异常来判断,try:     f = float(str) exception ValueError:     print("输入的不是数字!")
            2.通过正则表达式来判断:'^[-+]?[0-9]+(.[0-9]+)?$
        """
        profit = input("输入利润金额:")
        if profit == "q":
            return
        reg = re.compile('^[-+]?[0-9]+(.[0-9]+)?$')
        result = reg.match(profit)
        if result:
            profitFloat = float(profit)
            calculate1(profitFloat)
            calculate2(profitFloat)
            calculate3(profitFloat)
            calculate4(profitFloat)
            calculate5(profitFloat)
            calculate6(profitFloat)
            calculate7(profitFloat, 0)
        else:
            print("Error:输入的不是数值。")
        print("继续,或输入q推出")
        answer()
    
    
    answer()
    

      

  • 相关阅读:
    【移动安全高级篇】————2、浅谈Android软件安全自动化审计
    【移动安全实战篇】————1、Android手机下xx.apk JAVA破解之旅
    【移动安全高级篇】————1、Android沙盘原理与实现
    CLR
    反射
    泛型
    面试
    Sqlite
    粒子
    地图
  • 原文地址:https://www.cnblogs.com/longphui/p/7994117.html
Copyright © 2011-2022 走看看