题目:
编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。
定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类。
Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分;
School 中计算平均分的方法是所有科目的分数之和除以总科目数。
要求:定义ComputerAverage的对象为上转型对象,并调用重写的方法averge。
题目用到:1.方法的多态
思想过程:本来想用动态数组,即ArrayList,但是后来用动态数组做形参传给普通数组时出了问题,因为ArrayList实质是链表,需要用到toArray.虽然我找到了方法但还是不会用.
这里由用户指定数组大小a,再键入分数可能更直观方便.
以下是代码:
1 import java.util.Scanner; 2 abstract class ComputerAverage{ 3 abstract double average(int a,double []data); 4 } 5 class Gymnastics extends ComputerAverage{ 6 private double avg,max=0,sum=0; 7 Gymnastics(){ 8 } 9 double average(int a,double []data){ 10 double min=data[0]; //最开始我把min的初值也定义为0,但是如果一组数的最小值比0大,那永远min=0,没有意义.所以把min定为首元素值 11 for(int i=0;i<a;i++){ 12 if(data[i]>max)//找出最大值 13 max=data[i]; 14 if(data[i]<min)//找出最小值 15 min=data[i]; 16 sum+=data[i]; 17 } 18 avg=(sum-max-min)/(a-2); 19 return avg; 20 } 21 } 22 class School extends ComputerAverage{ 23 private double sum,avg; 24 School(){ 25 } 26 double average(int a,double []data){ 27 for(int i=0;i<a;i++) 28 sum+=data[i]; 29 avg=sum/a; 30 return avg; 31 } 32 } 33 public class Test5_1 { 34 private static Scanner input; 35 public static void main(String args[]){ 36 int a; 37 input=new Scanner(System.in); 38 System.out.println("Please enter the number of subjects:"); 39 a=input.nextInt(); 40 double data[] = new double[a]; 41 System.out.println("Please enter grade:"); 42 for(int i=0;i<a;i++) 43 data[i]=input.nextDouble(); 44 ComputerAverage avg; 45 avg=new Gymnastics(); 46 System.out.println(avg.average(a,data)); 47 avg=new School(); 方法的多态:运行时根据具体对象类型决定函数调用 48 System.out.println(avg.average(a,data)); 49 } 50 }