练习题

2019-11-14  本文已影响0人  C_Z_Q_

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, 返回一个新列表.

函数需求:

# 导入生成随机数的包
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)
上一篇下一篇

猜你喜欢

热点阅读