程序填空题
5-1 列表统计练习
已知包含四个整数的列表对象 v,根据注释的要求完成程序填空。
| 输入样例 | 输出样例 |
| (无,直接运行) | 21
7
52
13.00 |
v = [7, 11, 13, 21]
print(max(v))
print(min(v))
print(sum(v))
print("{:.2f}".format(sum(v)/len(v)))
| 行号 | 代码 | 白话解释 |
| 2 | max(v) | max() 返回列表中最大元素,输出 21。 |
| 3 | min(v) | min() 返回列表中最小元素,输出 7。 |
| 4 | sum(v) | sum() 求所有元素之和,7+11+13+21=52。 |
| 5 | sum(v)/len(v) | 总和除以元素个数得到均值,再格式化为 2 位小数。 |
5-2 列表元素的增删与访问
假设有列表 mylist=["张红","女","计算机"],编写程序按顺序进行以下操作:
- 输入学号插入在专业后;
- 按顺序输入年月日(以逗号间隔),添加在性别后;
- 输入三个整数,按顺序分别代表高数、英语和体育成绩,以逗号间隔,添加在列表末尾,成为列表的三个元素;
- 删除性别;
假设今年是 2023 年,按输出样例格式输出张红的姓名、性别、年龄、学号及体育成绩等信息。
| 程序输入 | 程序输出 |
1001
[2001,9,30]
[90,82,76] | 张红:性别女、今年22岁、学号1001、体育76分。 |
mylist = ["张红", "女", "计算机"]
num = input()
mylist.insert(2, num)
ymd = eval(input())
mylist.insert(2, ymd)
courses = eval(input())
mylist.extend(courses)
sex = mylist.pop(1)
print("{}:性别{}、今年{}岁、学号{}、体育{}分。".format(
mylist[0], sex, 2023 - mylist[2][0], mylist[3], mylist[-1]))
| 行号 | 代码 | 白话解释 |
| 3 | mylist.insert(2, num) | 在索引 2("计算机" 前面)插入学号。 |
| 5 | mylist.insert(2, ymd) | 在索引 2 插入年月日列表,此时位于 "女" 之后。 |
| 7 | mylist.extend(courses) | 将三门成绩列表的元素逐个追加到末尾。 |
| 8 | mylist.pop(1) | 删除并返回索引 1 的元素("女"),保存到 sex。 |
| 10 | 2023 - mylist[2][0] | mylist[2] 是 [2001,9,30],取第 0 项算年龄。 |
| 10 | mylist[-1] | 列表最后一个元素是体育成绩。 |
5-3 最长单词
以下程序用于实现:输入一句英文句子,求其中最长的单词及其长度。
提示:先将英文句子中的单词分离出来存入列表后处理。注意句子末尾的句号不算在最后一个单词的长度内。
| 输入样例 | 输出样例 |
Chinese Museums Association Committee of Museums along the Silk Road. | 最长单词是Association,长度是11。 |
s = input()
words = s.strip('.').split()
lt = [len(word) for word in words]
maxlen = max(lt)
maxword = words[lt.index(maxlen)]
print("最长单词是{},长度是{}。".format(maxword, maxlen))
| 行号 | 代码 | 白话解释 |
| 2 | s.strip('.').split() | 先去掉末尾句号,再用空格分割成单词列表。 |
| 3 | [len(word) for word in words] | 列表推导式,生成每个单词长度的列表。 |
| 4 | max(lt) | 找出长度列表中的最大值。 |
| 5 | words[lt.index(maxlen)] | 用 index 找到最大长度在 lt 中的位置,再到 words 中取对应单词。 |
编程题
7-1 计算裁判平均分
体育比赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,编写程序计算并输出某选手的得分。
| 输入样例 | 输出样例 |
98 99 97 95 | 97.50 |
scores = list(map(int, input().split()))
scores.sort()
avg = sum(scores[1:-1]) / (len(scores) - 2)
print("{:.2f}".format(avg))
| 行号 | 代码 | 白话解释 |
| 1 | list(map(int, input().split())) | 读入一行字符串,按空格分割,每个元素转 int,再转成列表。 |
| 2 | scores.sort() | 原地排序,最小值在开头,最大值在末尾。 |
| 3 | scores[1:-1] | 切片去掉第一个(最低分)和最后一个(最高分)。 |
| 3 | len(scores) - 2 | 剩余评委人数。 |
| 4 | "{:.2f}".format(avg) | 保留 2 位小数输出。 |
7-2 sdut-期末考试之排名次
期末考试结束了,童鞋们的成绩也出来了,可是为了排名次可忙坏了老师,因为学生太多了。这时,老师把这个任务交给了你,希望你能帮老师完成。作为 IT 人,你当然不能用笨笨的人工方法了,编程解决才是好办法。
共有三门课,语文、数学和英语,要求根据学生的各科成绩计算出其总成绩,并根据总成绩从高到低排序。
| 输入样例 | 输出样例 |
3
70 80 90
59 59 59
100 100 100 | 300
240
177 |
n = int(input())
totals = []
for _ in range(n):
c, m, e = map(int, input().split())
totals.append(c + m + e)
totals.sort(reverse=True)
for t in totals:
print(t)
| 行号 | 代码 | 白话解释 |
| 1 | int(input()) | 读入学生人数 N。 |
| 4 | map(int, input().split()) | 每行读入三个整数。 |
| 5 | totals.append(c + m + e) | 计算总成绩并加入列表。 |
| 6 | sort(reverse=True) | 降序排列,大的在前。 |
| 7 | for t in totals: | 依次输出排序后的总成绩。 |
7-3 最小值归零
输入若干个正整数(至少一个),输出每个数减去最小值的结果。
| 输入样例 | 输出样例 |
4 5 67 3 99 2 7 | 2 3 65 1 97 0 5 |
nums = list(map(int, input().split()))
m = min(nums)
result = [str(x - m) for x in nums]
print(" ".join(result))
| 行号 | 代码 | 白话解释 |
| 1 | list(map(int, input().split())) | 读入所有整数到列表。 |
| 2 | min(nums) | 找出列表中最小值。 |
| 3 | [str(x - m) for x in nums] | 每个数减最小值,再转成字符串,组成新列表。 |
| 4 | " ".join(result) | 用空格将字符串列表连接成一行输出。 |
7-4 哪里贵了
在一次直播销售活动中,消费者在弹幕中提出“这个品牌越来越贵了”时,销售员里加其(Rigachi)回应说:“哪里贵了?”。为了解决这个问题,他决定为那些高价商品打个折:如果一个商品的价格超过了所有商品的平均价格,那么该商品的价格就打 9 折,低于平均价格的商品则维持原价。最后,为了表示诚意,他将所有商品的价格再抹了个零头,全部取整。请你来帮他更新一下所有商品的最终价格。
| 输入样例 | 输出样例 |
8
40.3 90.2 74.3 34.4 33.1 32.1 12.6 69.8 | 40 81 66 34 33 32 12 62 |
n = int(input())
prices = list(map(float, input().split()))
avg = sum(prices) / n
result = []
for p in prices:
if p > avg:
result.append(int(p * 0.9))
else:
result.append(int(p))
print(" ".join(map(str, result)))
| 行号 | 代码 | 白话解释 |
| 2 | list(map(float, input().split())) | 读入 n 个实数到列表。 |
| 3 | sum(prices) / n | 计算平均价格。 |
| 6 | int(p * 0.9) | 超过均价的打 9 折,再取整(抹零)。 |
| 8 | int(p) | 不超过均价的直接取整。 |
| 9 | " ".join(map(str, result)) | 结果列表转字符串后空格连接输出。 |
7-5 大笨钟的心情
有网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……
本题就请你替大笨钟写一个程序,根据心情自动输出回答。
| 输入样例 | 输出样例 |
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1 | 52 Yes
20 No
50 No
58 Yes |
mood = list(map(int, input().split()))
while True:
h = int(input())
if h < 0 or h > 23:
break
if mood[h] > 50:
print("{} Yes".format(mood[h]))
else:
print("{} No".format(mood[h]))
| 行号 | 代码 | 白话解释 |
| 1 | list(map(int, input().split())) | 读入 24 个整数,依次对应 0~23 时的心情指数。 |
| 3 | while True: | 无限循环,直到遇到非法时间。 |
| 5 | h < 0 or h > 23 | 非法时间点(不在 0~23 范围),跳出循环。 |
| 6 | mood[h] > 50 | 查询第 h 小时的心情指数,大于 50 输出 Yes。 |
| 8 | else | 否则输出 No,格式为 "心情指数 Yes/No"。 |
7-6 身份证验证码
身份证的最后一位是根据前 17 位数字计算出来的检验码。计算方法是:
- 将身份证号码前 17 位数分别乘以不同的系数。从第 1 位到第 17 位的系数分别为:
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
- 将乘积之和除以 11,余数可能为 0~10。则根据余数,分别对应的最后一位身份证号码为:
1,0,X,9,8,7,6,5,4,3,2
编写程序,输入身份证号码前 17 位,输出对应的检验码。
| 输入样例 | 输出样例 |
34052419800101001 | X |
coef = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
check = ['1','0','X','9','8','7','6','5','4','3','2']
s = input().strip()
total = 0
for i in range(17):
total += int(s[i]) * coef[i]
print(check[total % 11])
| 行号 | 代码 | 白话解释 |
| 1 | coef | 预定义 17 个权重系数。 |
| 2 | check | 预定义 11 个余数对应的校验码。 |
| 5 | for i in range(17): | 遍历前 17 位。 |
| 6 | int(s[i]) * coef[i] | 每位数字乘以对应系数,累加到总和。 |
| 7 | check[total % 11] | 总和对 11 取余,作为索引查校验码表。 |