题目 和错误
比赛规则是:
? 选手的得分是:评委评分(百分制) 去掉最高分和最低分后的平均分;
? 比赛结果:按得分从小到大排序,得分高的两名选手分别为冠亚军,各奖商品房一套和小轿车一辆。
提示(思路之一):
定义比赛类Race:
设private成员变量:
int raceNum, judgeNum; //选手人数, 评委人数
double race[10][2]
//其中race[][0]存放选手号(1~raceNum),race[][1]存放选手得分。(最多10名选手)
设public成员方法:
Race(int n,int m)
//通过构造函数初始化选手人数和评委人数。
double computAve()
//从键盘输入比赛选手的评委评分,计算并返回选手的得分。
void raceScore()
//设置选手号1~raceNum,存放到race[i][0]中(i=0~raceNum -1)。
//调用computAve方法计算比赛所有选手得分,存放到race[i][1]中(i=0~raceNum -1)。
void raceSort()
// 实现比赛选手得分从小到大排序,同时对应调整选手号。
void raceResult()
// 调用raceScore和raceSort方法,输出选手得分和比赛结果。
再定义主类RaceScorePro,在main方法中创建比赛类Race的对象,初始化5个选手和5个评委。调用raceResult方法输出比赛的结果。
程序运行结果:
Exception in thread "main" java.lang.NullPointerException
at com.tttttt.Compete.raceScore(Demo4_4.java:47)
at com.tttttt.Compete.raceResult(Demo4_4.java:80)
at com.tttttt.Demo4_4.main(Demo4_4.java:10)
程序
package com.tttttt;
import java.util.*;
public class Demo4_4
{
public static void main(String[] args)
{
Compete compete=new Compete(5, 5);
compete.raceResult();
}
}
class Compete
{
Scanner in=new Scanner(System.in);
public Compete(int n,int m)
{
this.raceNum=n;
this.judgeNum=m;
double race[][]=new double[n][2];//初始化
}
public double computeAvg()
{
double sum=0.0;
double[] grade = new double[judgeNum];
for (int i = 0; i < judgeNum; i++)
grade[i] = in.nextDouble();
Arrays.sort(grade);//小到大排序
for (int s = 1; s < grade.length - 1; s++)
sum += grade[s];
return sum/judgeNum-2;
}
public void raceScore()
{
for(int i=0;i<raceNum;i++)
race[i][0]=i+1;//选手号
for(int j=0;j<raceNum;j++)
{
System.out.println("请输入第"+race[j][0]+"号选手的评委评分(百分制):");
race[j][1]=computeAvg();//选手分数
}
}
public void raceSort()//选择法
{
double temp[];
int p;
for (int x = 0; x < race.length - 1; x++)
{
p = x;
for (int y = x + 1; y < race.length; y++)
if (race[p][1] > race[y][1])
p = y;
if (p != x)
{
temp = race[p];
race[p] = race[x];
race[x] = temp;
}
}
}
public void raceResult()
{
raceScore();
System.out.println("选手得分:");
raceSort();
for(int i=race.length;i>0;i--)
{
System.out.println(race[i][0]+"号选手得分是"+race[i][1]);
}
System.out.println("比赛的结果:");
System.out.println(race[race.length][0]+"号选手为冠军,将商品房一套");
System.out.println(race[race.length-1][0]+"号选手为亚军,将小轿车一辆");
}
private int raceNum;//选手人数
private int judgeNum;//评委人数
double[][] race;
}
------解决方案--------------------
建议楼主好好看看 java里面的数组操作,大部分的问题都是数组操作
刚开始报的空指针错误是因为 构造方法里面用的race不是类的变量,你自己开了一个同名的race二维数组,导致后面用类的成员变量race没有初始化
- Java code
import java.util.*;public class Demo4_4{ public static void main(String[] args){ Compete compete=new Compete(5, 5); compete.raceResult(); }}class Compete{ Scanner in=new Scanner(System.in); public Compete(int n,int m){ this.raceNum=n; this.judgeNum=m; race=new double[n][2];//初始化 这里进行了修改 } public double computeAvg(){ double sum=0.0; double[] grade = new double[judgeNum]; for (int i = 0; i < judgeNum; i++) grade[i] = in.nextDouble(); Arrays.sort(grade);//小到大排序 System.out.println(Arrays.toString(grade)); for (int s = 1; s < grade.length - 1; s++) sum += grade[s]; System.out.println(sum); double average=sum/(judgeNum-2); System.out.println(average); return average; //这里修改过 } public void raceScore(){// System.out.println(race[0][0]); for(int i=0;i<raceNum;i++){ race[i][0]=i+1;//选手号 } for(int j=0;j<raceNum;j++){ System.out.println("请输入第"+race[j][0]+"号选手的评委评分(百分制):"); race[j][1]=computeAvg();//选手分数 } } public void raceSort()//选择法 { double temp[]; int p; for (int x = 0; x < race.length - 1; x++) { p = x; for (int y = x + 1; y < race.length; y++) if (race[p][1] > race[y][1]) p = y; if (p != x) { temp = race[p]; race[p] = race[x]; race[x] = temp; } } } public void raceResult() { raceScore(); System.out.println("选手得分:"); raceSort(); for(int i=race.length-1;i>=0;i--)//这里修改过 { System.out.println(race[i][0]+"号选手得分是"+race[i][1]); } System.out.println("比赛的结果:"); System.out.println(race[race.length-1][0]+"号选手为冠军,将商品房一套"); //上下两行都修改过 System.out.println(race[race.length-2][0]+"号选手为亚军,将小轿车一辆"); } private int raceNum;//选手人数 private int judgeNum;//评委人数 double[][] race;}