今天我做的小项目是评委计分系统,让我们去看看需求。在歌唱比赛中,有6名评委评分,分数是整数,其区间是【0-100】,去掉最大值和最小值,其余的数相加然后求平均值,最终作为最后的分数。好,让我们开始吧。
public static int[] getScores(){
//定义数组,动态数组
int[] scores =new int[6] ;
Scanner sc = new Scanner(System.in);
for (int i = 0; i < scores.length;i++) {
System.out.println("请输入评委打分");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
scores[i] = score;
}else {
System.out.println("成绩超出了范围,继续录入,当前的i为:" + i);
}
}
return scores;
}
首先,我们要定义一个动态数组用以储存数据,然后键盘输入,用if语句体来判断不符合要求的数据,如图所示。
但如果我输入的值超过一百怎么办,这时我运行程序,程序结果出来的却是一堆零,也就是默认值,即使我打错了一个,也要重新运行程序输入,很麻烦,怎么办?
public static int[] getScores(){
//定义数组,动态数组
int[] scores =new int[6] ;
Scanner sc = new Scanner(System.in);
for (int i = 0; i < scores.length;) {
System.out.println("请输入评委打分");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
scores[i] = score;
//这里把条件控制语句放到if语句体
/*
如果不放,你输入的值为120,值不符合条件但还是会走一遍条件控制语句,这时i的值为1,会跳过0就代表着会重新让你输入一次
如果放到语句体里面,则不符合条件就不会跳过0,会一直让你再输入一次,直到输入符合条件为止
*/
i++;
}else {
System.out.println("成绩超出了范围,继续录入,当前的i为:" + i);
}
}
return scores;
}
我把循环的条件控制语句放到了if语句体里面。如果不放,你输入的值为120,值不符合条件但还是会走一遍条件控制语句,这时i的值为1,会跳过0,就代表着不会重新让你输入一次,需要重新启动程序。如果放到语句体里面,则不符合条件就不会跳过0,会一直让你再输入一次,直到输入符合条件为止。
之后,我们就去获取数组里面的最大值和最小值。
//2.定义方法求最大值
public static int getMax(int[] scoreArr){
int max = scoreArr[0];
for (int i = 1; i < scoreArr.length; i++) {
if (scoreArr[i] > max){
max = scoreArr[i];
}
}
return max;
}
//2.定义方法求最小值
public static int getMin(int[] scoreArr){
int min = scoreArr[0];
for (int i = 1; i < scoreArr.length; i++) {
if (scoreArr[i] < min){
min = scoreArr[i];
}
}
return min;
}
用变量max和min来接受最大值和最小值,然后用return关键字返回。
public static int getSum(int[] scoreArr){
int sum = 0;
for (int i = 0; i < scoreArr.length; i++) {
sum = sum + scoreArr[i];
}
return sum;
}
随后再定义一个方法去求和,我们最终的算法思想是,通过运用总和减去最大最小值,最后求平均值。
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
//在歌唱比赛中,有六名评委打分,分数范围是【0-100】之间的整数。
//选手的最后得分为:去掉最高分、最低分后的四个评委的平均分,计算得分
int[] scoreArr = getScores();
for (int i = 0; i < scoreArr.length; i++) {
System.out.println(scoreArr[i]);
}
int max = getMax(scoreArr);
int min = getMin(scoreArr);
int sum = getSum(scoreArr);
//(总和 - 最大值 - 最小值)/ 4
//这里不写死的原因是以后数组长度改变时,这一条代码不变,是灵活的
int avg = (sum - max - min) / (scoreArr.length - 2);
//打印结果
System.out.println("选手最终得分为:" + avg);
}
遍历数组,调用方法来计算,但计算有个小点要注意,我把本应该除以4的4改为数组的长度,这是因为为了提升代码的灵活性,无论数组长度如何改,这条代码都会随着数组的改变而改变。
最终结果如下。
如果有小伙伴有更好的解决方法,欢迎来指教,本代码仅供参考。