青年歌手大奖赛是一个重要的比赛项目。其决赛记分规则为:去掉一个最高分,去掉一个最低分,然后求剩余分数的平均值作为最后成绩。编写一个竞赛评分的函数过程。评委打分为参数(数组参数),选手得分为函数值。调用该函数,由键盘输入n个评委的打分(存放在数组中),输出最终的成绩。编写代码,模拟决赛现场最终成绩的计算过程。
程序流程图如下图所示。
代码如下:
# 循环用于确保用户输入一个大于2的整数作为评委人数
while True:
try:
# 尝试将用户输入转换为整数
n = int(input('请输入评委人数:'))
# 检查评委人数是否大于2
if n <= 2:
print('评委人数太少, 必须多于2个人。')
else:
# 如果评委人数大于2,则跳出循环
break
# 如果用户输入的不是整数,将捕获ValueError异常
except ValueError:
print('请输入一个整数。')
# 初始化一个空列表用于保存所有评委的打分
scores = []
# 循环n次,每次循环用于获取一个评委的打分
for i in range(n):
while True:
try:
# 尝试获取用户输入的分数并转换为浮点数
score = float(input('请输入第{0}个评委的分数:'.format(i+1)))
# 检查分数是否在0到100之间
if 0 <= score <= 100:
# 如果分数合法,则添加到scores列表中并跳出内部循环
scores.append(score)
break
else:
# 如果分数不合法,则提示用户重新输入
print('分数必须在0到100之间。')
# 如果用户输入的不是一个有效的数字,将捕获ValueError异常
except ValueError:
print('请输入一个有效的数字。')
# 计算并删除最高分与最低分
highest = max(scores)
lowest = min(scores)
scores.remove(highest)
scores.remove(lowest)
# 计算平均分,保留2位小数
finalScore = round(sum(scores) / len(scores), 2)
# 使用格式化字符串输出结果
formatter = '去掉一个最高分{:.2f}\n去掉一个最低分{:.2f}\n最后得分{:.2f}'
print(formatter.format(highest, lowest, finalScore))
解释如下:
-
确保评委人数大于2:通过
while True
循环不断要求用户输入评委人数,直到输入的数字大于2为止。使用try-except
结构来捕获可能的ValueError
异常,比如当用户输入的不是一个整数时。 -
获取评委的打分:使用
for
循环n次,每次循环内部都有一个while True
循环,用于确保用户输入的分数是合法的(即0到100之间的数字)。同样使用try-except
结构来捕获可能的ValueError
异常。 -
计算平均分:在获取了所有合法的评委打分后,首先找到最高分和最低分,并从列表中移除它们。然后计算剩余分数的平均值,并使用
round
函数保留两位小数。 -
输出结果:使用格式化字符串来输出最高分、最低分和最后得分,并使用
{:.2f}
来确保分数以两位小数的形式显示。
程序的一次运行结果:
请输入评委人数:7
请输入第1个评委的分数:86
请输入第2个评委的分数:87
请输入第3个评委的分数:84
请输入第4个评委的分数:87
请输入第5个评委的分数:83
请输入第6个评委的分数:89
请输入第7个评委的分数:92
去掉一个最高分92.0
去掉一个最低分83.0
最后得分86.6