1.问题描述
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得
分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实
现。
2.问题分析
求一组数中的最大值和最小值是Python语言中比较常见的一类问题,这类问题的
算法十分简单,定义两个变量max、min分别存储最大值、最小值,利用两个变量与给
定的数依次比较的方法求出最大值和最小值。但是要注重在程序中判定最大值和最小
值的变量是如何赋值的。
3.算法设计
确定变量初值。变量max和min要分别与每个数进行比较,因此在第一次比较时要
用到两变量的初值,那么max和min的初值赋多少合适呢?一般情况可按照下面的方法
赋值,最大值max的初值尽量小,最小值min的初值尽量大。对于变量max来说,只有
其初值尽可能小的时候,在第一次与给定的数比较时数1才会大于max,才能把数1赋
给max,作为变量max的新值;接着与数2比较,若数2>max,同样把数2的值作为新值
赋给max,若数2<max,则max中的值保持不变。重复上面的过程直到max与所有的数
都比较完,则max中存储的就是最大值。若刚开始max的值就很大,那么在比较过程
中,给定的数若都比当前max的值小,经过一轮比较结束时变量max中存储的仍然是
最初所赋的初值,那么这样的比较是没有意义的。比较过程如表4.4(以5个数为例进
行说明)所示。

python求出歌手的得分 python在歌星大赛中_最小值

比较完之后max的值为83,正好是所给数中的最大值。对于变量min的比较与赋值
过程同上,在最初赋值是为了保证给定的任意一个数都比min小,所以应该把min的初
值赋得尽可能大。
对于10个评委的评分利用循环结构实现,循环变量i记录已经输入的评分的个数,
初值为0,判定条件为i<10。评分的总和采用累加的方式存储到变量sum中,即循环体
执行一次输入一个分数,接着将其累加到变量sum上,等到循环结束时,sum中即为所
有评分的总和。求解最大值和最小值的过程与表4.4所示类似,每输入一个分数,就与
当前的最大(小)值进行比较,若其大(小)于变量max(min)的值就把此分数赋值
给max(min)。由上述过程可以看出,无论是输入分数、求解总和还是寻找最大
(小)值,都可以在一个循环过程中实现,代码如下:

for i in range(1, 11):
print("第%d个评委打分:" %i, end="")
integer = int(input()) # 输入评委的评分
sum += integer # 计算总分
if integer > max: # 通过比较筛选出其中的最高分
max = integer
if integer < min: # 通过比较筛选出其中的最低分
min = integer

 4.程序框架
程序流程图如图4.13所示。

python求出歌手的得分 python在歌星大赛中_最小值_02

 5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 歌星大奖赛
if __name__ == "__main__":
max = 0
min = 100
sum = 0 # sum存放10个评委打分的总分数
for i in range(1, 11):
print("第%d个评委打分:" %i, end="")
integer = int(input()) # 输入评委的评分
if integer < 0 or integer > 100: # 对分数值进行验证
print("输入的分数错误")
exit()
sum += integer # 计算总分
if integer > max: #通过比较筛选出其中的最高分
max = integer
if integer < min: #通过比较筛选出其中的最低分
min = integer
print("去掉一个最高分:%d" % max)
print("去掉一个最低分:%d" % min)
print("最后得分:%d" % ((sum - max - min) // 8))

6.运行结果
在PyCharm下运行程序,按照屏幕提示输入10个分数,程序运行结果如图4.14所
示。

python求出歌手的得分 python在歌星大赛中_职场和发展_03

7.问题拓展
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平
(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎
样实现?
要找出最公平与最不公平的评委,需要在求出平均值后将该值与所有分数进行比
较,求出与平均值差值的绝对值最大和最小的两个评分,该评分所对应的评委即为所
求。因有一比较过程,因此在输入完评委的评分后需要将其存储,若在上述代码基础
上进行改进,则需要另外定义10个变量来存储评委评分。此算法虽然可以满足题目要
求,但是写起来麻烦,为解决这个问题可以利用数组来实现,这样便可不必定义10个
变量,只需要定义一个包含10个元素的数组,第1到第10个评委的评分分别存储到数
组score[0]~score[10]。
最公平的评委即求出的与平均值差值最小的评分所对应的评委,若有一个评分正
好等于平均分,则此分数对应的评委即为最公平的;若都不相同,则需要将差值进行
比较选出最小值,算法与求一组数中最小值的思路相同。最不公平的评委一定在所求
的最大值和最小值对应的评委中产生。
代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 歌星大奖赛
import random
# 求出最大分数值
def maxScore(score):
	max = score[0] # 给max赋初值
	m = 0 # m记录最大值的下标
	for j in range(1, 10):
		if max < score[j]:
			max = score[j]
			m = j # 记录最大值的下标
			print("最大的分数为:%d" % max)
			return max,m
			# 求出最小分数值
			def minScore(score):
				min = score[0] # 给min赋初值
				n = 0 # n记录最小值的下标
				for j in range(1, 10):
					if min > score[j]:
						min = score[j]
						n = j # 记录最小值的下标
						print("最小的分数为:%d" % min)
						return min,n
						if __name__=="__main__":
							sum = 0 # 记录10个评委打分的总分数
							score = [0]*10
							for i in range(10):
								score[i] = random.randint(0, 101) # 生成10个随机分数
								sum = sum + score[i]
								print("10个评委的打分为:", score)
								max,m = maxScore(score)
								min,n = minScore(score)
								avg = (sum - max - min) // 8 # 计算平均分
								print("去掉最高分和最低分,最后得分:%d" %avg)
								temp = 0 # temp用来记录最公平与最不公平评委给出的评分存储的下标
								s = abs(score[0] - avg) # s记录评分与平均值差值的绝对值
								for i in range(10):
									if abs(score[i] - avg) == 0:
										temp = i
										print("最公平的评委是:%d, 打分:%d" % ((temp + 1),(score[temp+1])))
										temp = 0
										for i in range(10):
											if abs(score[i] - avg) != 0:
												if s > abs(score[i] - avg):
													s = abs(score[i] - avg)
													temp = i
													print("最公平的评委是:%d" %(temp + 1))
													if (avg - min) == (max - avg):
														print("最不公平的评委是:%d %d" %((m+1), (n+1)))
													else:
														if (avg - min) > (max - avg):
															print("最不公平的评委就是:%d" %(n+1))
														else:
															print("最不公平的评委就是:%d" %(m+1))

 在PyCharm下运行程序,运行结果如图4.15所示。

python求出歌手的得分 python在歌星大赛中_职场和发展_04

8.知识点补充
random()是随机数库函数,它返回随机生成的一个实数,其值在[0,1)范围内。
random()函数是不能直接访问的,访问它需要导入random模块,然后通过random
静态对象调用该方法。
使用如下语句导入random模块:
import random
在程序中导入random模块后,就可以通过random静态对象来调用random模块提供
的随机函数了。
下面介绍random模块提供的常用随机函数。
·random.random():该函数生成一个0到1之间的随机小数。
·random.randint():该函数具有两个参数,一个是范围上限,一个是范围下限,用
于随机生成指定范围内的整数,其中下限必须小于上限。
·random.uniform():该函数具有两个参数,一个是范围上限,一个是范围下限,
用于随机生成指定范围内的浮点数(小数),其中下限必须小于上限。
·random.randrange():该函数具有三个参数,前面两个参数表示范围的上限和下
限,第三个参数是一个递增值,用于生成指定范围内,以指定基数递增的随机数。
·random.choice():该函数用于从给定的序列中随机获取一个元素返回。序列可以
是字符串、列表、元组等。
·random.shuffle():该函数用于将一个给定的列表元素打乱,随机排序。
·random.sample():该函数具有两个参数,第一个参数表示指定序列,第二个参数
是需获取的指定长度,用于从指定序列中随机获取指定长度的片段,原有的序列不会
改变。序列可以是字符串、列表、元组等。
代码实例如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: random函数
import random
if __name__ == "__main__":
	# 生成一个0到1之间的随机小数,赋值给a
	a = random.random()
	print("a = ", a)
	# 生成一个[0,101)之间的随机整数,赋值给b
	b = random.randint(0, 101)
	print("b = ", b)
	# 生成一个[0,10)之间的随机小数,赋值给c
	c = random.uniform(0, 10)
	print("c = ", c)
	# 随机生成[0, 101)之间的偶数,递增数为2
	d = random.randrange(0, 101, 2)
	print("d = ", d)
	# 随机生成一个字符
	e = random.choice('abcdefg&#%^*f')
	print("e = ", e)
	# 随机返回一个字符串
	f = random.choice(['apple', 'pear', 'peach', 'orange', 'lemon'])
	print("f = ", f)
	# 从给定的多个字符中,随机生成3个字符
	g = random.sample('abcdefghijklmnopqrstuvwxyz',3)
	print("g = ", g)
	# 将一个列表中的元素打乱,随机排序
	num = [9, 6, 4, 0, 2, 5, 3, 7, 1, 8]
	num1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
	random.shuffle(num)
	print("num = ", num)
	random.shuffle(num1)
	print("num1 = ", num1)

 在PyCharm中运行程序,运行结果如图4.16所示。

python求出歌手的得分 python在歌星大赛中_蓝桥杯_05