今日作业
打分系统
张三当上了中国好声音的评委,
但五音不全的他根本听不出来歌手唱的怎么样, 于是张三打算从其他7个评委的打分中获取平均分来作为自己打的评分,
设计一个程序, 输入其他7个评委的打分, 去掉最高和最低分后, 再计算平均分(精确到小数点后两位)
输入:
7个数字和一串字符串, 表示其他评委的打分和歌手名
输出:
一串字符串和一个数字, 表示歌手名和张三的打分
样例输入:
10 9.5 9 8.5 8 7.5 0
laojiujun
样例输出:
laojiujun: 8.5
样例输入:
10 0 0 0 0 0 0
siyue
样例输出:
siyue: 0.00
请提交源码及运行结果的截图
(鼓励增加创意哦,好的创意额外加分)
题目分析:
- “输入其他7个评委的打分,去掉最高和最低分后再计算平均分”这里的关键是找出最高分和最低分,所以我们要先把7个评委的打分放在一个数据容器里,这样方便我们对7个评委的数据进行操作,这个数据容器可以是数组或者集合
- “精确到小数点后两位”这里涉及到数据输出格式的问题
针对上面的两点我们分别展开讨论:
先讨论第一点
首先我们要先面对数据容器的选择(当然你也可以不用数据容器直接上大段的if语句)
数组:既可以存储基本数据类型,又可以存储引用数据类型,长度固定,不能自动增长,数据存储相同类型值。
集合:只能存储引用数据类型(对象),集合中存储基本数据类型时以包装类形式存储。长度是可变的。
因为集合功能太强大,所以我们先用数组存储并求出平均值
//创建一个double类型的数组1
double[] str = {9.1,10.2,8.5,6.3,11.4,7.8,12.0};
double min = Double.MAX_VALUE; //最小值
double max = Double.MIN_VALUE; //最大值
double sum = 0; //总值
for (int i = 0; i < str.length; i++) {
if(str[i] < min) {
min = str[i];
}
if(str[i] > max) {
max = str[i];
}
sum += str[i];
}
double avg = (sum - min - max)/str.length;
//总值减去最大值减去最小值求出平均分
//平均平均几个人有歧义啊
//创建一个double类型的数组2
double[] str = {9.1,10.2,8.5,6.3,11.4,7.8,12.0};
double sum = 0;
for (int i = 0; i < str.length; i++) {
sum += str[i];
}
Arrays.sort(str); //按升序排列数组
double min = str[0];
double max = str[str.length-1];
double avg = (sum - min - max)/str.length;
使用集合存储并求出平均值
//创建一个经常使用的ArrayList集合
List<Double> list = new ArrayList<>();
double[] str = { 9.1, 10.2, 8.5, 6.3, 11.4, 7.8, 12.0 };
for (int i = 0; i < str.length; i++) {
list.add(str[i]);
} //忽略上面这段脱裤子放屁的代码,只是为了给集合加元素方便
double sum = 0;
for (double d : str) {
sum += d;
}
double min = Collections.min(list); //使用集合自带的静态方法求最大值最小值
double max = Collections.max(list); //当然也可以选用遍历集合的方式
double avg = (sum - min - max) / list.size();
集合体系太大就不说了,在说第二点精确到小数点后面两位
//方法一
System.out.println(avg);
//打印结果6.714285714285713
avg =(double)Math.round(avg * 100) / 100;
System.out.println(avg);
//打印结果6.71
avg =(double)Math.round(avg * 1000) /1000;
System.out.println(avg);
//打印结果6.714
//此函数返回值为int 或 long 所以要加double转换
//方法二
BigDecimal bg = new BigDecimal(avg);
avg = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//不会四舍五入直接舍去
或者
String str2 = String.format("%.2f", avg);
//四舍五入保留两位小数
public static void main(String[] args) {
List<Double> list = new ArrayList<Double>();
Scanner input = new Scanner(System.in);
for (int i = 0; i < 7; i++) {
System.out.println((i + 1) + "号评委打分");
double score = input.nextDouble();
list.add(score);
}
double min = Collections.min(list);
double max = Collections.max(list);
double sum = 0;
for (Double s : list) {
sum += s;
}
double avg = (sum - min - max) / (list.size() - 2);
System.out.printf("laojiujun:%.2f", avg);
input.close();
}