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

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

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

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

Q&A

解決済

2回答

6817閲覧

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

asadako

総合スコア147

Java

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

0グッド

0クリップ

投稿2016/10/21 10:31

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にはありません。
このようなミスをなくすためにコメントなどをつけてみましたが、やっぱりわかりませんでした。
このようなミスをなくすには、どうしたらいいでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

Java

1import java.io.*; 2 3public class quiz { 4 private String question; 5 private String candidates; 6 private int answer; 7 8 quiz(String q, String c, int a) { 9 question = q; 10 candidates = c; 11 answer = a; 12 } 13 14 public static quiz readNewQuiz(BufferedReader quizDataReader) throws IOException { 15 String q; 16 if ((q = quizDataReader.readLine()) == null) { 17 return null; 18 } 19 String c; 20 if ((c = quizDataReader.readLine()) == null) { 21 return null; 22 } 23 String a; 24 if ((a = quizDataReader.readLine()) == null) { 25 return null; 26 } 27 return new quiz(q, c, Integer.parseInt(a)); 28 } 29 30 public void printQuestion(int count, PrintStream ps) { 31 ps.println("第" + count +"問 " + question); 32 ps.println(candidates); 33 ps.println("なお、数字のみ入力してください。(以後共通)例:3"); 34 } 35 36 public boolean checkAnswer(int ans) { 37 return answer == ans; 38 } 39 40 public static int readNumber(BufferedReader br, PrintStream errorStream) throws IOException { 41 while (true) { 42 try { 43 int ans = Integer.parseInt(br.readLine()); 44 if (ans < 1 || ans > 3) { 45 errorStream.println("1 から 3 の範囲で入力してください"); 46 } else { 47 return ans; 48 } 49 } catch (NumberFormatException e) { 50 errorStream.println("数値を入力してください"); 51 } 52 } 53 } 54 55 public static void main (String[]args) throws IOException { 56 BufferedReader quizDataReader = new BufferedReader(new FileReader("quizdata.txt")); 57 InputStreamReader is = new InputStreamReader(System.in); 58 BufferedReader br = new BufferedReader(is); 59 int count = 1; 60 while (true) { 61 quiz q = readNewQuiz(quizDataReader); 62 if (q == null) break; 63 q.printQuestion(count, System.out); 64 int ans = readNumber(br, System.out); 65 if (q.checkAnswer(ans)) { 66 System.out.println("正解!第" + ++count +"問に進みます。"); 67 } else { 68 System.out.println("不正解です。残念。"); 69 break; 70 } 71 } 72 } 73}

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

text

1これを作っている言語の名前はなんでしょう。 21.C# 2.Java 3.Unity 32 4ドラえもんの誕生日はいつでしょう。 51.2109年9月11日 2.2110年9月4日 3.2112年9月3日 63 7将棋に使う駒の数は敵味方合わせていくつでしょう? 81.30個 2.40個 3.50個 92

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

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

投稿2016/10/21 13:13

編集2016/10/21 13:45
mit0223

総合スコア3401

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

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

asadako

2016/10/22 00:45

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

0

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

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


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

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

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

投稿2016/10/21 12:30

akio221

総合スコア716

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

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

asadako

2016/10/22 00:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問