选手成绩的计算规则是:计算评分最高前k个的平均分avg1,剩余评分的平均分avg2,找到avg1与avg2差值最小,则avg1与avg2的平均数为该选手得分。例如,某选手的评委评分为6,5,3,1,则各位次评分为:
k |
1 |
2 |
3 |
avg1 |
6 |
5.5 |
4.67 |
avg2 |
3 |
2 |
1 |
avg1-avg2 |
3 |
3.5 |
3.67 |
由表格可知,差值最小为3,因此该选手的评分为(6+3)/2=4.5。按上述要求,编写VB程序,功能如下:在列表框List1中显示各选手的评委评分,单击“计算”按钮Command1,在列表框List2中依次按照得分从高到低显示每位选手成绩。程序运行界面如图所示。请回答下列问题:
Const n=8
Const m=12
Dim a(n*m)As Double,b(m)As Integer
Dim f(n)As Double,num(n)As Integer,sum As Double
Private Sub Form_Load()
'读取n个人每个评委的评分,按照选手编号从小到大依次存入数组a,并显示在List1中
'a(1)到a(m)存储第1个选手得到的m个评委的评分
'a(m+1)到a(2*m)存储第2个选手得到的m个评委的评分
'以此类推,代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer,j As Integer,x As Integer,k As Integer
Dim s As Double,avg1AsDouble,avg2AsDouble
Dim ans_v As Double,ans_c As Double
For i=1 To n
sum=0
For j=1 To m
sum=sum+a((i-1)*m+j)
b(j)=0
Next j
s=0
ans_v=-1:ans_c=0
For j=1 To m-1
x=find(i) '找到第i组中m个数中第j大数位置x
avg1=s/j
avg2=(sum-s)/(m-j)
If ans_v=-1 Or avg1-avg2<ans_c Then
ans_v=(avg1+avg2)/2
ans_c=avg1-avg2
End If
Next j
Do While k>=1 And ans_v>f(k)
f(k+1)=f(k)
num(k+1)=num(k)
k=k-1
Loop
f(k+1)=ans_v
num(k+1)=i
Next i
'将结果显示在List2中,代码略
End Sub
Function find(t As Integer)As Integer
Dim i As Integer
find=0
For i=(t-1)*m+1 To t*m
IfThen
If find=0 Or a(find)<a(i)Then find=i
End If
Next i
b(find-(t-1)*m)=1
End Function