为什么输出“0”?

时间:2013-12-10 04:47:10

标签: java static null ranking

import java.util.Scanner;

class DataInput {
String name[];
int korean[], math[], english[];
int sum[];
double average[];
static int rank[];
int students;

public void save() {
    Scanner sc = new Scanner(System.in);

    System.out.println("Please input number of students");
    students = sc.nextInt();

    name = new String[students];
    korean = new int[students];
    math = new int[students];
    english = new int[students];
    sum = new int[students];
    average = new double[students];
    rank = new int[students];

    for (int i = 0; i < students; i++) {
        System.out.println("Name?");
        name[i] = sc.next();
        System.out.println("Korean Score :");
        korean[i] = sc.nextInt();
        System.out.println("Math Score :");
        math[i] = sc.nextInt();
        System.out.println("English Score :");
        english[i] = sc.nextInt();

        sum[i] = korean[i] + math[i] + english[i];
        average[i] = sum[i] / 3;
        }
  }
}

class DataOutput extends DataInput {

public void ranker() {
    for (int i = 0; i < students; i++){
        rank[i] = 1;
    }

    for (int i = 0; i < students; i++) {
        for (int j = i + 1; j < students; j++) {
            if (sum[i] < sum[j]) {
                rank[i] += 1;
            } else if(sum[i]>sum[j]){
                rank[j] += 1;
            }
        }
    }

}

}

public class Score {
public static void main(String[] args) {
    DataInput data = new DataInput();
    DataOutput out = new DataOutput();
    data.save();
    out.ranker();

    System.out.println();
    System.out.println("Name\t\tKorean  Math  English\tSum  Average  Rank");
    System.out
            .println("-------------------------------------------------------");

    for (int i = 0; i < data.students; i++) {
        System.out
                .println(data.name[i] + "\t\t" + data.korean[i] + "  "
                        + data.math[i] + "  " + data.english[i] + "\t"
                        + data.sum[i] + "  " + data.average[i] + "  "
                        + out.rank[i]);
    }
}

}

所以,这是我建立的一个小程序。我认为逻辑是正确的,但是当我运行程序并输入所有变量时,学生的等级都是0。

我无法弄清楚问题是什么。如果有人帮助我,真的很感激。

4 个答案:

答案 0 :(得分:3)

而不是average[i] = sum[i] / 3; - 这是整数数学;我认为你真的需要average[i] = sum[i] / 3.0;,它应该给你一个非零结果。

答案 1 :(得分:1)

当您调用实例化数据输出的新实例

    DataOutput out = new DataOutput();

它会创建所有新数据。将学生人数设为零。

不推荐

你应该传递学生编辑和其他数据的数量

   DataOutput out = new DataOutput(students, otherData);

   //In Class Constructor

   DataOutput(int student, int ... otherData)
   { 
       this.student = student;
       for(int i : otherData)
         //code
   }

<强>推荐

或者你应该将ranker方法放在dataInput类

   class DataInput
   {
         //code
        public int ranker()
        { 
           //code
        }
   }

答案 2 :(得分:0)

data变量和out变量“未链接”。你在“空”课上打电话给ranker。仅仅因为DataOutput extends DataInput并不意味着这两个实例无论如何都是链接/相关的。

在给定代码的上下文中:将ranker方法移动到DataInput类中,只省略DataOutput类。然后在ranker()变量上调用data

答案 3 :(得分:0)

使用相同的派生类对象仅在一个对象上保存数据。您正在创建两个对象。 使用DataInput对象,可以存储数据。为DataOutput创建对象时,它是新对象,所有数组中的所有默认值都为“0”。因此,使用派生类对象进行数据存储和输出。

out.save();
out.ranker();

System.out.println();
System.out.println("Name\t\tKorean  Math  English\tSum  Average  Rank");
System.out
        .println("-------------------------------------------------------");

for (int i = 0; i < out.students; i++) {
    System.out
            .println(out.name[i] + "\t\t" + out.korean[i] + "  "
                    + out.math[i] + "  " + out.english[i] + "\t"
                    + out.sum[i] + "  " + out.average[i] + "  "
                    + out.rank[i]);
}