クイズを作りたいのだがうまくいかない。
上の質問の続きです。argius様の返答を参考に作り直したところ、以下の構造になりました。
・一つのクラスで一つの問題を扱う(Question1Question3)。Question3は全てQuestionSuperを継承している。
・Question1
・QuestionSuper型の配列 Q にQuestion1Question3を格納する。この配列をシャッフルすることで問題の出題順をシャッフルする。[3](選択文)をもつ。サブクラスごとにこれらを定義する。
・QuestionSuperはフィールドにsentence(問題分)とselectAnswer[0]
・selectAnswer[0]を正解の選択文とする。
・選択肢ア、イ、ウ、エが格納されている配列をシャッフルし、先頭に来たものをcorrectAnswer(正解の選択肢)とする。あとの三つをwrongAnswerとする。
・シャッフルした選択肢とselectAnswer[0]~[3]をくっつける。それらをリスト decision に格納する。
・decisionをアイウエ順にソートし、表示する。
・入力した文字がcorrectAnswerと一致すれば「正解です」、wrongAnswer1~3と
一致すれば「ちがいます」、それ以外の文字を入力すると「ア、イ、ウ、エで入力してください」と表示される。
Java
1package quiz; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.util.Arrays; 7import java.util.Collections; 8import java.util.List; 9 10public class Quiz { 11 static Question1 Q1 = new Question1(); 12 static Question2 Q2 = new Question2(); 13 static Question3 Q3 = new Question3(); 14 15 public static void main(String[] args)throws IOException{ 16 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 17 18 QuestionSuper[] Q = new QuestionSuper[3]; 19 Q[0] = Q1; 20 Q[1] = Q2; 21 Q[2] = Q3; 22 23 List<QuestionSuper> ListQ = Arrays.asList(Q); 24 Collections.shuffle(ListQ); 25 26 int num = 1; 27 for(QuestionSuper qs:ListQ){ 28 System.out.println("【問"+ num + "】"); 29 30 qs.printSentence(); 31 System.out.println(); 32 qs.printSelectAnswer(); 33 34 do{ 35 String answer = br.readLine(); 36 if(answer == qs.correctAnswer){ 37 System.out.println("正解です。"); 38 break; 39 } 40 else if((answer == qs.wrongAnswer1) || (answer == qs.wrongAnswer2) || (answer == qs.wrongAnswer3)){ 41 System.out.println("ちがいます。"); 42 } 43 else{ 44 System.out.println("ア、イ、ウ、エで入力してください。"); 45 } 46 47 }while(true); 48 49 num++; 50 } 51 52 } 53 54} 55
```Java package quiz; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class QuestionSuper { protected String sentence = ""; protected String correctAnswer = ""; protected String wrongAnswer1 = ""; protected String wrongAnswer2 = ""; protected String wrongAnswer3 = ""; protected String[] selectAnswer = new String[4]; protected String[] choice = {"ア","イ","ウ","エ"}; List<String> choices = new ArrayList<String>(); List<String> decision = new ArrayList<String>(); void printSentence(){ System.out.println(sentence); } void shuffleChoice(){ for(String s:choice){ choices.add(s); } Collections.shuffle(choices); this.correctAnswer = choices.get(0); this.wrongAnswer1 = choices.get(1); this.wrongAnswer2 = choices.get(2); this.wrongAnswer3 = choices.get(3); } void printSelectAnswer(){ shuffleChoice(); for(int i = 0;i < 4;i++){ decision.add(choices.get(i) +" " + selectAnswer[i]); } Collections.sort(decision); for(int i = 0;i < 4;i++){ System.out.println(decision.get(i)); } } }
Java
1package quiz; 2 3public class Question1 extends QuestionSuper { 4 public Question1(){ 5 this.sentence = "キューに関する記述として、最も適切なものはどれか。"; 6 this.selectAnswer[0] = "最初に格納されたデータが最初に取り出される。"; 7 this.selectAnswer[1] = "最後に格納されたデータが最初に取り出される"; 8 this.selectAnswer[2] = "添え字を用いて特定のデータを参照する。"; 9 this.selectAnswer[3] = "二つ以上のポインタを用いてデータの階層関係を表現する。"; 10 } 11 12} 13
Java
1package quiz; 2 3public class Question2 extends QuestionSuper { 4 public Question2(){ 5 this.sentence = "再入可能プログラムの特徴はどれか。"; 6 this.selectAnswer[0] = "複数のタスクからの呼び出しに対して、並行して実行されても、それぞれのタスクに正しい結果を返す。"; 7 this.selectAnswer[1] = "主記憶上のどこのアドレスに配置しても、実行することができる。"; 8 this.selectAnswer[2] = "手続きの内部から自分自身を呼び出すことができる。"; 9 this.selectAnswer[3] = "必要な部分を補助記憶装置から読み込みながら動作する。\n" 10 + " 主記憶の大きさに制限があるときに有効な手段である。"; 11 } 12 13}
Java
1package quiz; 2 3public class Question3 extends QuestionSuper { 4 public Question3(){ 5 this.sentence = "仮想記憶方式のコンピュータにおいて、処理の多重度を増やしたところ、\n" 6 + "ページイン、ページアウトが多発して、システムの応答速度が急速に遅くなった。\n" 7 + "このような現象を何というか。"; 8 this.selectAnswer[0] = "スラッシング"; 9 this.selectAnswer[1] = "オーバレイ"; 10 this.selectAnswer[2] = "メモリコンバクション"; 11 this.selectAnswer[3] = "ロールアウト"; 12 } 13 14}
問題文、選択肢ともにランダムに出題することには成功しています。ところが、何を入力しても「ア、イ、ウ、エで入力してください。」と表示されてしまうのです。一体なぜでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/12/03 05:14