问题:在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。输入每个评委的评分,求某选手的得分。
分析:该题的关键在于,当最高分和最低分多次出现时,如何处理能够使最高分和最低分只去掉一次。可以设置布尔值,让去掉操作只执行一次。
测试方法:
public static void test(){
Scanner sc = new Scanner(System.in);
System.out.println("表演完毕,请各评委打分:");
int[] a = new int[10];
for(int i=0;i<10;i++){
int score = sc.nextInt();
a[i] = score;
}
System.out.println("10位评委的评分分别是:");
show(a);
int[] b = getScore(a);
System.out.println("去掉一个最高分,一个最低分后:");
show(b);
getAvg(b);
}
打印方法:
//遍历数组
public static void show(int[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
获取最大元素:
//求最大值
public static int getMax(int[] a){
int max = a[0];
for (int i = 0; i < a.length; i++) {
if(a[i]>max){
max = a[i];
}
}
return max;
//System.out.println("该数组最大元素为:"+max);
}
获取最小元素:
//求最小值
public static int getMin(int[] a){
int min = a[0];
for (int i = 0; i < a.length; i++) {
if(a[i]<min){
min = a[i];
}
}
return min;
//System.out.println("该数组最小元素为:"+min);
}
得到新的得分数组:
//评分方法
//参数:得分数组
//返回值:去掉最高分和最低分后的数组
public static int[] getScore(int[] a){
int max = getMax(a);
int min = getMin(a);
int l = a.length-2;
int[] b = new int[l];
int count = 0;//计数器
boolean flag1 = true;
boolean flag2 = true;
for(int i=0;i<a.length;i++){//将原数组的值,选择性的赋给新数组
if(a[i]==max&&flag1==true){
flag1 = false;
continue;
}
if(a[i]==min&&flag2==true){
flag2 = false;
continue;
}
if(count<l){
b[count] = a[i];
count++;
}
}
return b;
}
得到最终平均得分:
//求平均数
public static void getAvg(int[] a){
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum+=a[i];
}
int avg = sum/a.length;
System.out.println("该选手最终得分:"+avg);
}