質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

9327閲覧

クイズを作りたいのだがうまくいかない。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/12/02 06:42

編集2015/12/03 05:18

クイズのコンソールアプリケーションを作りたいのですが、どういう風に設計すればいいのか分からず困っています。仕様は以下の通りです。

・用意した問題がランダムに表示される。
・選択肢はア、イ、ウ、エの4択である。
・選択肢もランダムに表示される。
・答えを入力し、合っていれば「正解」と表示され、次の問題に進む。
間違っていれば「不正解」と表示されやり直す。

とりあえず途中まで書いたコードを載せておきます。```Java
package quiz;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Quiz {

public static void main(String[] args) { //クイズの番号を生成しシャッフル Integer[] quizNumber = {0,1,2}; List<Integer> QuizNumber = Arrays.asList(quizNumber); Collections.shuffle(QuizNumber); Question q = new Question(); Answer a = new Answer(); int num = 1;//問~用の変数 //クイズの開始 for(Integer i:QuizNumber){ System.out.print("問" + num + "、"); System.out.println(q.Question[i]); System.out.println(); a.printChoiceAnswer(i); System.out.println(); num++; } }

}

```Java package quiz; public class Question { public final String[] Question = {/*問1*/"キューに関する記述として、最も適切なものはどれか。", /*問2*/"再入可能プログラムの特徴はどれか。", /*問3*/"仮想記憶方式のコンピュータシステムにおいて、処理の多重度を増やしたところ、\n" + " ページイン、ページアウトが多発して、システムの応答速度が急速に遅くなった。\n" + " このような現象を何というか。" }; }

Java

1package quiz; 2 3import java.util.Arrays; 4import java.util.Collections; 5import java.util.List; 6 7public class Answer { 8 public final char[] choice = { 'ア', 'イ', 'ウ', 'エ' }; 9 10 public final String[][] choiceAnswer = { 11 //問1の選択肢 12 { "最後に格納されたデータが最初に取り出される。(×)", 13 "最初に格納されたデータが最初に取り出される(○)", 14 "添え字を用いて特定のデータを参照する。(×)", 15 "二つ以上のポインタを用いてデータの階層関係を表現する。(×)" 16 }, 17 18 //問2の選択肢 19 {"主記憶上のどこのアドレスに配置しても、実行することができる。(×)", 20 "手続きの内部から自分自身を呼び出すことができる。(×)", 21 "必要な部分を補助記憶装置から読み込みながら動作する。\n 主記憶領域の大きさに制限があるときに有効な手段である。(×)", 22 "複数のタスクからの呼び出しに対して、並行して実行されても、それぞれにタスクに正しい結果を返す。(○)" 23 }, 24 25 //問3の選択肢 26 {"オーバレイ(×)", 27 "スラッシング(○)", 28 "メモリコンバクション(×)", 29 "ロールアウト(×)" 30 } 31 }; 32 33 public void printChoiceAnswer(Integer i){ 34 for(int j = 0;j < 4;j++){ 35 List<String> ca = Arrays.asList(choiceAnswer[i]); 36 Collections.shuffle(ca);//選択肢をシャッフルしているつもりなのですが… 37 String Answer = choice[j] + " " + ca.get(j); 38 System.out.println(Answer.substring(0, Answer.length()-3)); 39 } 40 41 } 42}

問題文も選択肢も配列で処理しています。今の自分ではこれ以外の方法が思いつきません(なんとなくenumを使えばいいとは思うのだが具体的にどうしたらいいかわからない)。
問題文と選択肢のところどころにある空白は、表示されたときに体裁を整えるためのインデントです。なんとも不格好です。
答えを入力する処理はまだ書いていませんがそこは多分大丈夫です。ただ、入力された文字と問題の答えを一致させる処理をどうしたらいいのかわかりません。
あと、class Answer内のprintChoiceAnswerメソッド内で選択肢をシャッフルしているつもりなのですが、実行されるといくつかの選択肢がダブってしまいます。何でだろう…と考えているところで頭がごっちゃになって詰みました。どうしたらいいでしょうか。

続きあり

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

同じ項目を複数の配列に分けて管理するのは、混乱のもとです。
そういう場合は、構造単位を変えてみるのが良いと思います。

構造については本題ではないので、正解と質問文の結び付けかたについて書きます。

選択肢の番号(ここではカタカナ)をシャッフルして、その先頭を正解用の選択番号にします。
それを正解につけつつ、正解の番号として取っておきます。

質問文は、その後でアイウエオ順にソートすればOKです。

例:
Questionを1質問を表すクラスにしている
※問題のシャッフルは省略

lang

1// import java.util.*; 2 3Question[] questions = { 4 // 問1 5 new Question( 6 // 問題文 (sentence) 7 "キューに関する記述として、最も適切なものはどれか。", 8 // 正解 (correctAnswer) 9 " 最初に格納されたデータが最初に取り出される。", 10 // 不正解 (wrongAnswers) 11 " 最後に格納されたデータが最初に取り出される。", 12 " 添え字を用いて特定のデータを参照する。", 13 " 二つ以上のポインタを用いてデータの階層関係を表現する。") }; 14 15for (Question q : questions) { 16 // 選択肢の番号(選択肢の数によって変えられるようにしてもOK) 17 List<String> numbers = Arrays.asList("ア", "イ", "ウ", "エ"); 18 Collections.shuffle(numbers); 19 String correctNumber = numbers.get(0); // 正解の番号 20 21 // 表示用の選択肢 22 List<String> choices = new ArrayList<>(); 23 24 // 先に正解を追加 25 choices.add(String.format("%s. %s", correctNumber, q.getCorrectAnswer())); 26 27 // 不正解を追加 28 int i = 0; 29 for (String wrong : q.getWrongAnswers()) { 30 ++i; 31 choices.add(String.format("%s. %s", numbers.get(i), wrong)); 32 } 33 34 // 番号順に並べ直す 35 Collections.sort(choices); 36 37 // 出題 38 System.out.println(q.getSentence()); 39 for (String choice : choices) { 40 System.out.println(" " + choice); 41 } 42 System.out.println("正解: " + correctNumber); 43}

投稿2015/12/02 07:46

編集2015/12/02 07:58
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/03 05:20

ありがとうございます。書き直します。
guest

0

列挙で作ってみました。

java

1package quiz; 2 3public enum Q { 4 5 Q1("キューに関する記述として、最も適切なものはどれか。", 6 "最後に格納されたデータが最初に取り出される。\r\n" + 7 "最初に格納されたデータが最初に取り出される\r\n"+ 8 "添え字を用いて特定のデータを参照する。\r\n"+ 9 "二つ以上のポインタを用いてデータの階層関係を表現する。", 10 2), 11 12 Q2("再入可能プログラムの特徴はどれか。", 13 "主記憶上のどこのアドレスに配置しても、実行することができる。\r\n" + 14 "手続きの内部から自分自身を呼び出すことができる。\r\n" + 15 "必要な部分を補助記憶装置から読み込みながら動作する。\r\n" + 16 "主記憶領域の大きさに制限があるときに有効な手段である。\r\n" + 17 "複数のタスクからの呼び出しに対して、並行して実行されても、それぞれにタスクに正しい結果を返す。", 18 4); 19 20 21 String question; // 問題 22 String choice; // 選択子 23 int answer; // 回答 24 25 private Q(String question, String choice, int answer) { 26 this.question = question; 27 this.choice = choice; 28 this.answer = answer; 29 } 30 31 public String getQuestion() { 32 return question; 33 } 34 35 public String getChoice() { 36 return choice; 37 } 38 39 public int getAnswer() { 40 return answer; 41 } 42} 43

java

1package quiz; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6 7public class Quiz2 { 8 9 public static void main(String[] args) throws IOException { 10 11 // ユーザ入力 12 InputStreamReader isr = new InputStreamReader(System.in); 13 BufferedReader br = new BufferedReader(isr); 14 String answer; 15 16 int num = 1 ; 17 18 for (Q q : Q.values()){ 19 // 問題を出す 20 System.out.print("問" + (num++) + "、"); 21 System.out.println(q.getQuestion()); 22 System.out.println(); 23 24 // 選択子を出す 25 System.out.println(q.getChoice()); 26 System.out.println(); 27 28 System.out.println("回答Noを入力してください"); 29 30 // ユーザ入力 31 answer = br.readLine(); 32 33 // 入力したのが正解でない 34 if (!answer.equals(String.valueOf(q.getAnswer()))) { 35 System.out.println("不正解!!"); 36 break; // forまで終了 37 } else { 38 System.out.println("正解!!"); 39 } 40 41 } 42 br.close(); 43 } 44}

列挙の中に改行コードとして[\r\n]をつかっていますが、
環境依存なので、よろしくないかと思います。

選択子の「あいうえ」は、考える必要がありますね。

以上、どうでしょうか。

投稿2015/12/02 09:25

編集2015/12/02 10:01
liguofeng29

総合スコア801

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/03 05:20

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問