练习题

作者: C_Z_Q_ | 来源:发表于2019-11-14 15:39 被阅读0次

    1.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

    from functools import reduce
    
    def cal_sum():
        fenzi = 2
        fenmu = 1
        lst = [2]
        for i in range(1,20):
            fenmu,fenzi= fenzi,fenmu+fenzi
            lst.append(fenzi / fenmu)
    
        return reduce(lambda x,y:x+y,lst)
    
    print(cal_sum())
    

    2.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

    def num_reverse(num):
        print(' '.join(str(num)))
        numLen = len(str(num))
        print(numLen)
        for i in range(numLen):
            toPrint = num % 10
            num = int((num - toPrint)/10)
            print(toPrint,end=' ')
    
    num_reverse(9523684)
    

    3.有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

    def who_remain(n):
        lst = list(range(1, n+1))
        while n > 2:
            lst.pop(2)
            before = lst[:2]
            lst = lst[2:]
            lst.extend(before)
            n = len(lst)
        return lst[-1]
    print(who_remain(29))
    

    4.题:编写一个程序,根据控制台输入的事务日志计算银行帐户的净金额。 事务日志格式如下所示:
    D 100
    W 200

    D表示存款,而W表示提款。
    假设为程序提供了以下输入:
    D 300
    D 300
    W 200
    D 100
    然后,输出应该是:
    500

    netAmount = 0
    while True:
        print("请输入:")
        s = input()
        if not s:
            break
        values = s.split(" ")
        operation = values[0]
        amount = int(values[1])
        if operation=="D":
            netAmount+=amount
        elif operation=="W":
            netAmount-=amount
        else:
            pass
    print (netAmount)
    

    5.机器人从原点(0,0)开始在平面中移动。 机器人可以通过给定的步骤向上,向下,向左和向右移动。 机器人运动的痕迹如下所示:
    UP 5
    DOWN 3
    LETF 3
    RIGHT 2
    方向之后的数字是步骤。 请编写一个程序来计算一系列运动和原点之后距当前位置的距离。如果距离是浮点数,则只打印最接近的整数。
    例:如果给出以下元组作为程序的输入:
    UP 5
    DOWN 3
    LETF 3
    RIGHT 2
    然后,程序的输出应该是:2

    import math
    
    pos = [0, 0]
    print("请输入:")
    while True:
        s = input()
        if not s:
            break
        movement = s.split(" ")
        direction = movement[0]
        steps = int(movement[1])
        if direction == "UP":
            pos[0] += steps
        elif direction == "DOWN":
            pos[0] -= steps
        elif direction == "LEFT":
            pos[1] -= steps
        elif direction == "RIGHT":
            pos[1] += steps
        else:
            pass
    
    print(int(round(math.sqrt(pos[1] ** 2 + pos[0] ** 2))))
    

    6.判断用户输入的变量名是否合法:
    1)变量名可以由字母,数字或者下划线组成
    2)变量名只能以字母或者下划线开头

    分析:
    1))判断变量名的第一个元素是否为字母或者下划线 s[0]
    2))如果第一个元素符合条件,判断除了第一个元素之外的其他元素s[1:]

    while True:
        s = input('变量名:')
        if s == 'q':
            exit()
        # 判断首字母是否符合变量名要求
        if s[0] == '_' or s[0].isalpha():
            # 依次判断剩余的所有字符
            for i in s[1:]:
                # 只要有一个字符不符合,便不是合法的变量;alnum表示字母或数字
                if not (i.isalnum() or i == '_'):
                    print('%s不是一个合法的变量名' % s)
                    break
            else:
                print('%s是一个合法的变量名' % s)
        else:
            print('%s不是一个合法的变量名' % s)
    

    7.给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个
    字符:
    'A' : Absent,缺勤
    'L' : Late,迟到
    'P' : Present,到场
    如果一个学生的出勤纪录中不超过一个'A'(缺勤)并且不超过两个连续的'L'(迟到),
    那么这个学生会被奖赏。
    你需要根据这个学生的出勤纪录判断他是否会被奖赏。
    示例 1:
    输入: "PPALLP"
    输出: True
    示例 2:
    输入: "PPALLL"
    输出: False

    print("""
            出勤记录规则
        'A' : Absent   缺勤
        'L' : Late     迟到
        'P' : Present  到场
    """)
    
    while True:
        c = input('请输入考勤记录:')
    
        # count() 表示指定字符出现的次数
        if c.count('A') <= 1 and c.count('LLL') == 0 and c != 'q':
            print('True')
        elif c == 'q':
            exit()
        else:
            print('False')
    

    8..输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例
    如,输入”They are students.”和”aeiou”,
    则删除之后的第一个字符串变成”Thy r stdnts.”
    输入描述:
    每个测试输入包含2个字符串
    输出描述:
    输出删除后的字符串
    示例1:
    输入
    They are students.
    aeiou
    输出
    Thy r stdnts.

    s1 = input('s1:')
    s2 = input('s2:')
    # 遍历字符串s1
    for i in s1:
        #  依次判断s1中的每个字符是否在s2中
        if i in s2:
            # replace 表示替换;
            # 将s1中与s2中相同的所有字符,替换为空字符
            s1 = s1.replace(i,'')
    print(s1)
    
    

    9.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
    元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.

    # 1.定义函数; *args:可变参数
    def cacluate(*args):
        # 2.计算平均值; args的数据类型为元组,sum求和
        average = sum(args) / len(args)
        # 3.将所有大于平均值数的值存入列表
        list=[]
        for i in args:
            if i > average:
                list.append(i)
        # 4.将平均值和列表元素存入元组
        tuple=(average,list)
        return tuple
    
    print(cacluate(1,1,2,3,4))
    

    10.编写一个函数, 接收字符串参数, 返回一个元组,
    元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
    例如
    输入:'hello WORLD'
    输出:(5,5)

    # 直接在函数里print输出,在调用函数时只能打印不能使用
    # 如果想要使用函数里的变量值,此时需要在定义函数时用return返回函数值
    
    def fun(c):
        # 记录大写字母个数
        upper = 0
        # 记录小写字母个数
        lower = 0
        # 统计大小写字母的个数
        for i in c:
            if i.isupper():
                upper += 1
            # 注意:不能用else,因为字符串之间有空格
            if i.islower():
                lower += 1
        tuple = (upper,lower)
        # 函数返回值
        return tuple
    
    # 此时直接调用函数将不会有输出值,必须用print输出
    print(fun(input('请输入字符串:')))
    

    11.编写函数, 接收一个列表(包含30个1~100之间的随机整形数)
    和一个整形数k, 返回一个新列表.

    函数需求:

    • 将列表下标k之前对应(不包含k)的元素逆序;
    • 将下标k及之后的元素逆序;
    # 导入生成随机数的包
    import random
    
    # 定义空列表
    list = []
    # 生成30个随机数
    for i in range(30):
        num = random.randint(1,100)
        # 将生成的随机数添加到列表中
        list.append(num)
    # 打印原始列表
    print(list)
    
    # 定义函数
    def fun(list,k):
        # k表示下标
        if k < 0 or k >= len(list):
            print('error key')
        else:
            # [:k] k之前的元素   [::-1] 逆序   + 连接
            return list[:k][::-1] + list[k:][::-1]
    
    print(fun(list,3))
    

    12.模拟轮盘抽奖游戏
    轮盘分为三部分: 一等奖, 二等奖和三等奖;
    轮盘转的时候是随机的,
    如果范围在[0,0.08)之间,代表一等奖,
    如果范围在[0.08,0.3)之间,代表2等奖,
    如果范围在[0.3, 1.0)之间,代表3等奖,

    模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.

    import random
    
    # 定义(得奖情况)字典
    rewardDict ={'一等奖':(0,0.08),'二等奖':(0.08,0.3),'三等奖':(0.3,1.0)}
    
    # 判断用户是否得奖
    def rewardfun():
        num = random.random()
        # 遍历key-value
        for k,v in rewardDict.items():
            if num >= v[0] and num < v[1]:
                return k
    
    # 定义空字典
    resultDict = {}
    
    # 将得奖记录添加到字典中,记录1000人玩游戏的得奖情况
    for i in range(1000):
        # 将函数的返回值赋给reskey
        reskey = rewardfun()
        # print(reskey)
        if reskey not in resultDict:
            # 增加元素
            resultDict[reskey] = 1
        else:
            resultDict[reskey] += 1
    
    # 遍历输出字典的 key-value值
    for k,v in resultDict.items():
        print(k,'---->',v)
    

    13.题目需求:
    对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
    f(13) = 12 + 32 = 10
    f(207) = 22 + 02 + 72 = 53
    下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
    且kf(n)=n
    输入:
    第一行包含3个正整数k,a, b, k>=1, a,b<=10*18, a<=b;
    输出:
    输出对应的答案;

    范例:
    输入: 51 5000 10000
    输出: 3

    # 1.接收用户输入
    k = int(input('k='))
    a = int(input('a='))
    b = int(input('b='))
    
    # 2.定义函数,计算f
    def fun(c):
        f = 0
        for i in str(c):
            f += int(i)**2
        return f
    
    # fun(207)
    
    # 定义计数器
    count = 0
    
    # 3.统计满足条件的n的个数
    for n in range(a,b+1):
        if k * fun(n) == n:
            print(n,fun(n))
            count += 1
    # 打印个数
    print(count)
    

    14.综合练习
    1.地铁站编号和站名对应关系如下:
    1=朱辛庄
    2=育知路
    3=平西府
    4=回龙观东大街
    5=霍营
    //....

    遍历打印(可以不按顺序打印):
    第10站: 森林公园南门
    第6站: 育新
    第12站: 奥体中心
    第13站: 北土城
    //...

    2.计算地铁票价规则:
    总行程 3站内(包含3站)收费3元,
    3站以上但不超过5站(包含5站)的收费4元,
    5站以上的,在4元的基础上,每多1站增加2元,
    10元封顶;

    3.打印格式(需要对键盘录入的上车站和到达站进行判断,如果没有该站,提示重新输入,直到站名存在为止):
    注意:每站需要2分钟
    请输入上车站:
    沙河
    您输入的上车站:沙河不存在,请重新输入上车站:
    上地
    您输入的上车站:上地不存在,请重新输入上车站:
    朱辛庄
    请输入到达站:
    沙河
    您输入的到达站:沙河不存在,请重新输入到达站:
    西二旗
    您输入的到达站:西二旗不存在,请重新输入到达站:
    西小口
    从朱辛庄到西小口共经过6站收费6元,大约需要 12分钟

    st = """十三号街站   05:30   23:00   ——  ——
    中央大街站   05:31   23:01   06:28   23:47
    七号街站    05:33   23:03   06:26   23:45
    四号街站    05:36   23:06   06:24   23:42
    张士站 05:38   23:08   06:21   23:40
    开发大道站   05:41   23:11   06:19   23:37
    于洪广场站   05:43   23:13   06:16   23:35
    迎宾路站    05:46   23:16   06:14   23:33
    重工街站    05:48   23:18   06:11   23:30
    启工街站    05:51   23:21   06:09   23:28
    保工街站    05:53   23:23   06:07   23:26
    铁西广场站   05:55   23:25   06:04   23:23
    云峰北街站   05:58   23:28   06:02   23:21
    沈阳站 06:01   23:31   06:00   23:18
    太原街站    06:03   23:33   06:16   23:16
    南市场站    06:05   23:35   06:13   23:13
    青年大街站   06:07   23:37   06:11   23:11
    怀远门站    06:10   23:40   06:09   23:09
    中街站 06:13   23:43   06:06   23:06
    东中街站    06:15   23:45   06:04   23:04
    滂江街站    06:17   23:47   06:01   23:01
    黎明广场站   ——  ——  06:00   23:00"""
    lst = st.split()
    
    llsstt = list(filter(lambda x : '站' in x,lst))
    print(llsstt)
    
    while True:
        upstation = input('请输入上车站:')
        if upstation not in llsstt:
            print(f'您输入的上车站:{upstation}不存在,请重新输入上车站')
    
        upstation_idx = llsstt.index(upstation)
    
        downstation = input('请输入下车站:')
        if downstation not in llsstt:
            print(f'您输入的下车站:{upstation}不存在,请重新输入下车站')
        else:
            downstation_idx = llsstt.index(downstation)
            if downstation_idx < upstation_idx:
                print('下车站必须在上车站之后')
            else:
                break
    
    diff = downstation_idx - upstation_idx
    price = 0
    if diff <= 3:
        price = 3
    elif diff <= 5:
        price = 4
    else:
        price = 4 + (diff - 5)*2
    
    if price > 10:
        price = 10
    
    print(f'从{upstation}到{downstation}共经过{diff}站收费{price}元,大约需要{diff*2}分钟')
    

    15.谁拿了最多的奖学金
    问题描述
    某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

    院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
    五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
    成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
    西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
    班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;
    只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
    基本要求
    现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
    输入数据格式格式:
    输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。
    输出数据格式:
    输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。
    输入
    4
    YaoLin 87 82 Y N 0
    ChenRuiyi 88 78 N Y 1
    LiXin 92 88 N N 0
    ZhangQin 83 87 Y N 1

    输出
    ChenRuiyi
    9000
    28700

    # 4
    # YaoLin 87 82 Y N 0
    # ChenRuiyi 88 78 N Y 1
    # LiXin 92 88 N N 0
    # ZhangQin 83 87 Y N 1
    
    num = int(input('请输入学生数量:'))
    std_dict = {}
    for i in range(num):
        line = input(f'请输入第{i+1}名学生信息')
        stu_lst = line.split(' ')
        std_dict[stu_lst[0]] = stu_lst[1:]
    
    # print(std_dict)
    reward_dict = {}
    #开始计算每一位学生的奖学金
    for stu_name,stu_info in std_dict.items():
        if int(stu_info[0]) > 80 and int(stu_info[4]) > 0:
            reward_dict[stu_name] = reward_dict.get(stu_name,0) + 8000
        if int(stu_info[0]) > 85 and int(stu_info[1]) > 80:
            reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 4000
        if int(stu_info[0]) > 90:
            reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 2000
        if int(stu_info[0]) > 85 and stu_info[3] == 'Y':
            reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 1000
        if int(stu_info[1]) > 80 and stu_info[2] == 'Y':
            reward_dict[stu_name] = reward_dict.get(stu_name, 0) + 850
    
    sum = 0
    max = 0
    max_stu = ''
    for stu_name,money in reward_dict.items():
        if max < money:
            max = money
            max_stu = stu_name
        sum += money
    
    print(max_stu)
    print(max)
    print(sum)
    

    相关文章

      网友评论

          本文标题:练习题

          本文链接:https://www.haomeiwen.com/subject/rcyrictx.html