完整源代码项目地址,关注博主私信'源代码'后可获取  
1.问题描述 2.问题分析 3.算法设计 4.确定程序框架 5.完整的程序 6.问题拓展 7.知识点补充   
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中存储的仍然是最初所赋的初值,那么这样的比较是没有意义的。比较过程如表(以5个数为例进行说明)所示。  
 
 比较完之后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  =  integerif  integer <  min :                     min  =  integer
  
4.程序框架   
 程序流程图如图所示。  
 
5.完整的程序   
 根据上面的分析,编写程序如下:  
if  __name__ ==  "__main__" : max  =  0 min  =  100 sum  =  0                                                                  for  i in  range ( 1 ,  11 ) : print ( "第%d个评委打分:"  % i,  end= "" ) integer =  int ( input ( ) )                         print ( integer) if  integer <  0  or  integer >  100 :               print ( "输入的分数错误" ) exit( ) sum  +=  integer                                              if  integer >  max :                                         max  =  integerif  integer <  min :                                         min  =  integerprint ( "去掉一个最高分:%d"  %  max ) print ( "去掉一个最低分:%d"  %  min ) print ( "最后得分:%d"  %  ( ( sum  -  max  -  min )  //  8 ) )   
第1个评委打分:99
第2个评委打分:98
第3个评委打分:97
第4个评委打分:6
第5个评委打分:94
第6个评委打分:34
第7个评委打分:95
第8个评委打分:92
第9个评委打分:91
第10个评委打分:93
去掉一个最高分:99
去掉一个最低分:6
最后得分:86
  
6.问题拓展   
 题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?  
 要找出最公平与最不公平的评委,需要在求出平均值后将该值与所有分数进行比较,求出与平均值差值的绝对值最大和最小的两个评分,该评分所对应的评委即为所求。因有一比较过程,因此在输入完评委的评分后需要将其存储,若在上述代码基础上进行改进,则需要另外定义10个变量来存储评委评分。此算法虽然可以满足题目要求,但是写起来麻烦,为解决这个问题可以利用数组来实现,这样便可不必定义10个变量,只需要定义一个包含10个元素的数组,第1到第10个评委的评分分别存储到数组score[0]~score[10]。  
 最公平的评委即求出的与平均值差值最小的评分所对应的评委,若有一个评分正好等于平均分,则此分数对应的评委即为最公平的;若都不相同,则需要将差值进行比较选出最小值,算法与求一组数中最小值的思路相同。最不公平的评委一定在所求的最大值和最小值对应的评委中产生。  
 代码如下:  
import  random
def  maxScore ( score) : max  =  score[ 0 ]                                                           m =  0                                                                    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 ]                                                           n =  0                                                                    for  j in  range ( 1 ,  10 ) : if  min  >  score[ j] : min  =  score[ j] n =  j                                                   print ( "最小的分数为:%d"  %  min ) return  min , nif  __name__== "__main__" : sum  =  0                                                                  score =  [ 0 ] * 10 for  i in  range ( 10 ) : score[ i]  =  random. randint( 0 ,  101 )    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                         s =  abs ( score[ 0 ]  -  avg)                                  for  i in  range ( 10 ) : if  abs ( score[ i]  -  avg)  ==  0 : temp =  iprint ( "最公平的评委是:%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 =  iprint ( "最公平的评委是:%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 ) )   
10个评委的打分为: [86, 74, 34, 95, 11, 3, 95, 60, 61, 88]
最大的分数为:95
最小的分数为:3
去掉最高分和最低分,最后得分:63
最公平的评委是:9
最不公平的评委就是:6
  
7.知识点补充   
 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():该函数具有两个参数,第一个参数表示指定序列,第二个参数是需获取的指定长度,用于从指定序列中随机获取指定长度的片段,原有的序列不会改变。序列可以是字符串、列表、元组等。  
 代码实例如下:  
import  randomif  __name__ ==  "__main__" : a =  random. random( ) print ( "a = " ,  a) b =  random. randint( 0 ,  101 ) print ( "b = " ,  b) c =  random. uniform( 0 ,  10 ) print ( "c = " ,  c) 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) 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)   
a =  0.5761180882798892
b =  96
c =  8.111252459197054
d =  26
e =  e
f =  apple
g =  ['d', 'a', 'j']
num =  [4, 3, 1, 2, 5, 8, 0, 7, 9, 6]
num1 =  [7, 1, 6, 3, 2, 8, 10, 5, 4, 9]