2016-12-18 16 views
-3

メソッドから返される配列には望ましくない値が含まれています。どうしてか分かりません。Javaクラスの配列を返します

これはDriverExamクラスです:

public class DriverExam 
{ 

    private char[] answer = {'B','D','A','A','C','A','B','A','C','D', 
          'B','C','D','A','D','C','C','B','D','A'}; 
    private char[] stuAnswer = new char[20]; 
    private int totalCorrect = 0; 
    private int[] missed = new int[20]; 

    public DriverExam(char stuAnswer[]) 
    { 
     for (int i = 0; i < stuAnswer.length; i++) 
     { 
      this.stuAnswer[i] = stuAnswer[i]; 
     } 
    } 

    public int gettotalCorrect() 
    { 
     int k = 0; 
     for (int i = 0; i < stuAnswer.length; i++) 
     { 
      if (stuAnswer[i] == answer[i]) 
       totalCorrect++; 
     } 
     return totalCorrect; 
    } 

    public int gettotalIncorrect() 
    { 
     return 20-totalCorrect; 
    } 

    public int[] getMissed() 
    { 
     int k = 0; 
     for (int i = 0; i < stuAnswer.length; i++) 
     { 
      if (stuAnswer[i] != answer[i]) 
      { 
       missed[k] = i; 
       k++; 
      } 
     } 
     return missed; 
    } 
} 

これは、メインプログラムである:DriverExamクラスで

import java.util.Scanner; 
public class Main6 
{ 
    public static void main(String[] args) 
    { 
     char[] answer = new char[20]; 
     int[] missed2; 
     String str; 
     Scanner keyboard = new Scanner(System.in); 

     for (int i = 1; i <= 20; i++) 
     { 
      System.out.println("Enter the answer for question #"+i); 
      str = keyboard.nextLine(); 

      while (Character.toUpperCase(str.charAt(0)) != 'A' 
        && Character.toUpperCase(str.charAt(0)) != 'B' 
        && Character.toUpperCase(str.charAt(0)) != 'C' 
        && Character.toUpperCase(str.charAt(0)) != 'D') 
      { 
       System.out.println("Your input is invalid. Only accept A, B, C, or D"); 
       System.out.println("Enter the answer for question #"+i); 
       str = keyboard.nextLine(); 
      } 

      answer[i-1] = Character.toUpperCase(str.charAt(0)); 
     } 

     DriverExam de = new DriverExam (answer); 

     System.out.print("***FINAL RESULT:"); 
     System.out.print("\nTotal correct answers: "+de.gettotalCorrect()); 
     System.out.print("\nTotal incorrect answers: "+de.gettotalIncorrect()); 
     System.out.print("\nQuestions missed: "); 

     missed2 = de.getMissed(); 
     for (int i = 0; i < missed.length; i++) 
     { 
      System.out.print(i+" "); 
     } 
    } 
} 

私はメインプログラムに "見逃し" という名前の配列を返します。メインプログラムでは、返された配列を格納するために "missed2"という名前の配列を使用します。しかし、私は結果を印刷します(私はすべての答えを "A"で入力します)。それは以下のようなものだ:

最終結果:
総正解:6つの
合計不正解:逃し14件の
質問:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

質問が奇妙で間違っています。

+0

'missed'がそのスコープで宣言されていないので、最後のループのコンパイル方法もわかりません。いずれにせよ、これはデバッガの使い方に慣れ親しむ良い機会のようです。 – David

+0

@David 'missed'はメソッドが属する' DriverExam'クラスのフィールドです。 – RealSkeptic

+0

@RealSkeptic:これは、 'Main6'クラスの' main() 'メソッドの範囲外です。 – David

答えて

0

"欠落"にしたいものは、可変長の結果です。配列でこれを行うには、結果の終わりを示す値が必要です。ここでは、-1を使用しました。

public int[] getMissed() 
{ 
    int k = 0; 
    for (int i = 0; i < stuAnswer.length; i++) 
    { 
     if (stuAnswer[i] != answer[i]) 
     { 
      missed[k] = i; 
      k++; 
     } 
    } 
    if(k < missed.length) 
    { 
     missed[k] = -1 
    } 
    return missed; 
} 

次に、forループで、終了値を確認します。奇妙な値はおそらく、配列に明示的に設定しないことによって引き起こされるデフォルトのint値です。

for (int i = 0; i < missed2.length && missed2[i] != -1; i++) 
    { 
     System.out.print(i+" "); 
    } 
+0

さらに、上記のコメントのように、出力は 'i'のインデックスの代わりに' missed2'( 'missed'ではなく)の内容を出力しなければなりません。 – David

+0

それを指摘してくれてありがとう。 – ProgrammersBlock

関連する問題