2013-12-10 95 views
0
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.爲什麼它保持輸出「0」?

我找不出什麼問題。如果有人幫助我,那真的很感恩。

+0

以及對象沒有辦法從對象數據中獲取值。所以它的零。將ranker()函數放入DataInput類中並調用它。或者找到方法將DataInput中的值初始化爲DataOutput。 – ray

+0

我很驚訝這不是拋出索引越界或空引用異常。 'out.rank'根本沒有被初始化。 – recursive

回答

3

而不是average[i] = sum[i]/3; - 它做整數運算;我認爲你真的需要average[i] = sum[i]/3.0;這應該會給你一個非零的結果。

0

data varible和out變量是「未鏈接」。您在「空」班呼叫ranker。僅僅因爲DataOutput extends DataInput並不意味着這兩個實例無論如何都是鏈接/相關的。

在給出的代碼的上下文中:將ranker方法移動到DataInput類中,只是省略了DataOutput類。然後在您的data變量上致電ranker()

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 
    } 

推薦

,或者你應該把排名器方法的DataInput的內

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

另外@ElliotFrisch關於整數除法有一個好的觀點 –

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]); 
}