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

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

ただいまの
回答率

90.50%

  • Java

    15865questions

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

[java]クイズプログラムを分かりやすくしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,745

asadako

score 135

import java.io.*;

public class quiz   {
    public static void main (String[]args) throws IOException{
        InputStreamReader is = new InputStreamReader(System.in);       
        BufferedReader br = new BufferedReader(is);  
        int[] mondai01 = new int [9];
        mondai01[0] = 1;
        mondai01[1] = 1;
        mondai01[2] = 1;
        switch (mondai01[0]) {          //第1問
        case 1:
        System.out.println("第1問 これを作っている言語の名前はなんでしょう。");
        System.out.println("1.C# 2.Java 3.Unity");
        System.out.println("なお、数字のみ入力してください。(以後共通)例:3");
        String kotae1 = br.readLine();

        if (kotae1.equals("1")){
        System.out.println("不正解です。残念。");
        }else if(kotae1.equals("2")){
        System.out.println("正解!第2問に進みます。");
         switch (mondai01[1])    {                  //第2問
        case 1:
        System.out.println("第2問 ドラえもんの誕生日はいつでしょう。");
        System.out.println("1.2109年9月11日 2.2110年9月4日 3.2112年9月3日");
        String kotae2 = br.readLine();

        if(kotae2.equals("1")){
        System.out.println("不正解です。残念。");
        }else if(kotae2.equals("2")){
        System.out.println("不正解です。残念。");
        }else if(kotae2.equals("3")){
        System.out.println("正解です!第三問に進みます。");
        }

        switch (mondai01[2]) {          //第3問
        case 1:
        System.out.println("第3問 将棋に使う駒の数は敵味方合わせていくつでしょう?");
        System.out.println("1.30個 2.40個 3.50個");
        String kotae3 = br.readLine();

        if(kotae3.equals("1")){
        System.out.println("不正解です。残念。");    
        }else if(kotae3.equals("2")){
        System.out.println("正解です!第4問に進みます。");
        }else if  (kotae3.equals("3")){
        System.out.println("不正解です。残念。");
        }
        }
    }
        }else if(kotae1.equals("3")){
        System.out.println("不正解です。残念。");
        }else{
        System.out.println("数字のみ入力してください。");
        break;
            }
        }
    }
}


このようなコードをVisual studio Code で書いています。
見ての通り、数字のみ入力してください。という処理がkotae2とkotae3にはありません。
このようなミスをなくすためにコメントなどをつけてみましたが、やっぱりわかりませんでした。
このようなミスをなくすには、どうしたらいいでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

まずは、コードとデータを分離することを考える必要があります。
問題文を出したり、答えをチェックしたりするプログラムとクイズのデータを分けることを考えるべきです。
コードの中に問題文や答えの文字列が埋まっていると同じロジックを繰り返すということができません。

以下にテキストファイルに3行で1問を表すデータファイルを作って、データを分離する例を示します。テキストファイルは1行目は問題文、2行目は選択肢、3行目は正解を繰り返すというフォーマットです。

import java.io.*;

public class quiz   {
  private String question;
  private String candidates;
  private int answer;

  quiz(String q, String c, int a) {
    question = q;
    candidates = c;
    answer = a;
  }

  public static quiz readNewQuiz(BufferedReader quizDataReader) throws IOException {
    String q;
    if ((q = quizDataReader.readLine()) == null) {
      return null;
    }
    String c;
    if ((c = quizDataReader.readLine()) == null) {
      return null;
    }
    String a;
    if ((a = quizDataReader.readLine()) == null) {
      return null;
    }
    return new quiz(q, c, Integer.parseInt(a));
  }

  public void printQuestion(int count, PrintStream ps) {
    ps.println("第" + count +"問 " + question);
    ps.println(candidates);
    ps.println("なお、数字のみ入力してください。(以後共通)例:3");
  }

  public boolean checkAnswer(int ans) {
    return answer == ans;
  }

  public static int readNumber(BufferedReader br, PrintStream errorStream) throws IOException {
    while (true) {
      try {
        int ans = Integer.parseInt(br.readLine());
        if (ans < 1 || ans > 3) {
          errorStream.println("1 から 3 の範囲で入力してください");
        } else {
          return ans;
        }
      } catch (NumberFormatException e) {
        errorStream.println("数値を入力してください");
      }
    }
  }

  public static void main (String[]args) throws IOException {
    BufferedReader quizDataReader = new BufferedReader(new FileReader("quizdata.txt"));
    InputStreamReader is = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(is);
    int count = 1;
    while (true) {
      quiz q = readNewQuiz(quizDataReader);
      if (q == null) break;
      q.printQuestion(count, System.out);
      int ans = readNumber(br, System.out);
      if (q.checkAnswer(ans)) {
        System.out.println("正解!第" + ++count +"問に進みます。");
      } else {
        System.out.println("不正解です。残念。");
        break;
      }
    }
  } 
}

同じフォルダに quizData.txt という名前で以下の内容のファイルを置いておきます。

これを作っている言語の名前はなんでしょう。
1.C# 2.Java 3.Unity
2
ドラえもんの誕生日はいつでしょう。
1.21099112.2110943.2112933
将棋に使う駒の数は敵味方合わせていくつでしょう?
1.302.403.502

ここでは、簡単のため独自フォーマットのテキストファイルにしましたが、JSONやXML形式のファイルにするほうが、もっと構造化ができて良いでしょう。
本格的なアプリケーションになれば、データベースにこれらのデータを入れるかもしれません。

あと、細かくはいろいろとありますが、quiz を1問ずつオブジェクトにする点など、コードを参考にしていただければと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/22 09:45

    なるほど。コードとデータを分離すればいいのですね。
    ご回答ありがとうございました!

    キャンセル

+1

同じような処理を繰り返すのであれば、その同じような処理はまとめてしまいましょう。

現状のソースコードは
・問題表示
・入力
・正答判定


・・の、繰り返しになっています。

これをもっとシンプルに、
private static boolean 問題と解答(String 問題文, String 回答選択肢) {
・問題文の表示
・(数字を入力してください表示)
・入力
return 回答選択肢.equals(入力)
}

の、ようなメソッドを作り、繰り返し呼べばよいかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/22 09:46

    なるほど。繰り返し呼べばいいと。参考になりましたが、今回は別の方をベストアンサーにさせていただくことをご了承ください。

    キャンセル

同じタグがついた質問を見る

  • Java

    15865questions

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