2013-12-10 11 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 of bounds 또는 null 참조 예외를 던지지 않는 것이 놀랍다. 'out.rank'는 전혀 초기화되지 않았습니다. – recursive

답변

3

average[i] = sum[i]/3; 대신 정수 계산을 수행합니다. 나는 당신에게 0이 아닌 결과를 줄 수있는 average[i] = sum[i]/3.0;이 정말로 필요하다고 생각합니다.

0

가변 변수 data 변수 및 out 변수는 "연결되지 않음"입니다. "빈"클래스에서 ranker으로 전화하십시오. DataOutput extends DataInput이 두 인스턴스가 링크되어 있거나 관련되어 있다는 것을 의미하지 않기 때문입니다.

주어진 코드의 맥락에서 : 메서드를 DataInput 클래스로 이동하고 DataOutput 클래스를 생략하면됩니다. 그런 다음 data 변수에 ranker()으로 전화하십시오.

1

당신은 데이터 출력

DataOutput out = new DataOutput(); 

은 모든 새로운 데이터를 생성의 새로운 인스턴스를 인스턴스화 호출 할 때. 학생 수를 0으로 설정.

는 다른 데이터는 DataInput의 내부 열하 방법을 넣어해야

또는 권장

DataOutput out = new DataOutput(students, otherData); 

    //In Class Constructor 

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

학생 EDIT와의 수에 통과해야 하나

을 권장하지 않음 등급

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