質問するログイン新規登録
Java

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

Q&A

解決済

2回答

3796閲覧

Java 4択クイズについて

masuko358

総合スコア2

Java

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

1グッド

0クリップ

投稿2022/03/17 03:27

編集2022/03/17 08:54

1

0

Javaで問題と選択肢4つ(ア、イ、ウ、エ)を使い、簡単なクイズを作りたいです。
①正解が入力されれば”正解”を表示
②間違いが入力されれば”不正解”表示
ここまではif文やswitch文を使って簡単に作れるのですが、

③選択肢以外("ア", "イ", "ウ", "エ"以外)が入力された場合に再度入力を促し、また正誤判定させる
を実現するコードの書き方が、検索してもうまくできません。

if,switch,for,while文、クラス、メソッドくらいしか知識量がないのですが、これ以外になにか別の文法が必要なのでしょうか。

問題は1問、選択肢はランダムではありません。

ご教示お願いいたします。


<追記>
皆さまのご回答をもとに書いてみたコードです。
一応これで望んでいた動きができるようになりました。
もしもっとスマートといいますか、効率のよいコードがあれば教えていただけると幸いです。

public class Main { public static void main(String[] args) { //問題を表示 String q = "問題***"; //選択肢を表示 String choiceA = "ア:***"; String choiceB = "イ:***"; String choiceC = "ウ:***; String choiceD = "エ:***"; System.out.println("問題:" + q); System.out.println(choiceA); System.out.println(choiceB); System.out.println(choiceC); System.out.println(choiceD); Scanner scanner = new Scanner (System.in); while(true) { System.out.print("\n回答を入力:"); String input = scanner.next(); if(input.equals("エ")) { System.out.println("\n正解!"); break; } else if (input.equals("ア")) { System.out.println("\n不正解!\n正解はDです。"); break; } else if (input.equals("イ")) { System.out.println("\n不正解!\\n正解はDです。"); break; } else if (input.equals("ウ")) { System.out.println("\n不正解!\\n正解はDです。"); break; } System.out.println("\nア~エを入力してください。"); } } }
TN8001👍を押しています

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

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

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

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

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

m.ts10806

2022/03/17 04:01

まず書いてみては。 文法や構文はあくまで道具の使い方だけであって、ひとつのアプリケーションを作るには適宜組み合わせる必要があります。 ただ、ゴールは1つでもルートは多くあるので、答えとかはないです。 自身が思うように書いてみて起きた問題を解決する方向にしてください
shiracamus

2022/03/17 04:02

それだけ文法を知っていれば何だって作れます。 オブジェクト指向設計知識やライブラリ把握が必要になるとは思いますけど。 自分で作ったうまく動かないコードを提示すれば、修正点や改善点のアドバイスを受けられると思いますよ。
BeatStar

2022/03/17 05:43

まず、問題文や選択肢は固定ですか? 問題文は何問ありますか? 選択肢の並びは固定ですか? 組むだけでもこれだけ疑問が出てきます。質問は編集できるので編集しましょう。
BeatStar

2022/03/17 07:03

問題文はひとつ、選択肢は完全固定なら解答通りに考えればいけるはず。
1T2R3M4

2022/03/17 07:44 編集

自身のコードを追記していただけませんか。 自分でコード書く気が無いのならばあきらめればいいのでは。
guest

回答2

0

オブジェクト指向を学んでいるところなら、問題をクラスにしてみるのもいいかと思います。

java

1import java.util.Scanner; 2 3class Quiz { 4 public final String question; 5 public final String[] selections; 6 private final int answer; 7 8 Quiz(String question, String[] selections, int answer) { 9 this.question = question; 10 this.selections = selections; 11 this.answer = answer; 12 } 13 14 public boolean isCorrect(int answer) { 15 return answer == this.answer; 16 } 17 18 public String answer() { 19 return selections[answer - 1]; 20 } 21} 22 23public class Main { 24 static Scanner scanner = new Scanner(System.in); 25 static Quiz[] quizzes = new Quiz[] { 26 new Quiz("北海道の県庁所在地は?", 27 new String[] {"小樽市", "札幌市", "旭川市", "函館市"}, 28 2), 29 new Quiz("兵庫県の県庁所在地は?", 30 new String[] {"西宮市", "明石市", "神戸市", "姫路市"}, 31 3), 32 }; 33 34 public static void main(String[] args) { 35 for (var quiz: quizzes) { 36 System.out.println(); 37 System.out.println(quiz.question); 38 int number = 1; 39 for (var selection: quiz.selections) { 40 System.out.println(number + ": " + selection); 41 number++; 42 } 43 int answer; 44 do { 45 System.out.print("番号を入力:"); 46 answer = scanner.nextInt(); 47 } while (answer < 1 || answer > quiz.selections.length); 48 if (quiz.isCorrect(answer)) { 49 System.out.println("正解!"); 50 } else { 51 System.out.println("不正解!"); 52 System.out.println("正解は" + quiz.answer() + "です。"); 53 } 54 } 55 } 56}

投稿2022/03/17 10:49

編集2022/03/18 00:53
shiracamus

総合スコア5406

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

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

masuko358

2022/03/26 02:59

ありがとうございます!! とても勉強になりました><
guest

0

ベストアンサー

if,switch,for,while文、クラス、メソッドくらいしか知識量がないのですが、これ以外になにか別の文法が必要なのでしょうか。

後は考え方だけですね。

まず、プログラミングっていうのは「こう書けばいい」っていうものではありません。高校までの数学の問題みたいに「この計算方法以外認めない」っていうものでもないし、社会科の日本史・世界史とかみたいにこれ以外認めないっていうものではありません。英語の自由英作文や小説を書くことに近いです。

あからさまにロジック(論理)が飛躍しているとかだと話になりませんが、よっぽどでないならいろんな表現ができるはずです。それと一緒です。

そして、プログラミングっていうのは「書けばいい」というものではありません。本来は「機械に命令するための命令書作り」です。そもそもプログラミングは「人間が手作業でやっている処理を機械に肩代わりさせるために、機械に命令したい。だが『本を開け』とかでは動かないので細かく命令しなければいけない。そのためにロジックを記述する事」です。たとえば弾道計算や暗号解読とかです。それを指示するために細かく記述するのです。

つまり、「現実世界でやっている手順を逐一指示すればいい」のです。
よって、「現実世界でならどうするか」を考えてみましょう。

質問者さんは質問にある処理を手作業でやるならどうしますか?
恐らく、質問する → (答えが)条件に一致するかどうか考える → 条件に一致しない場合は再度質問して…みたいなループになるかと思います。

そうすると、

[疑似コード1] 1. 質問する 2. (1)で得た答えが実際の答えに一致するなら 2.1. 「正解!」系 3. (2)に該当しない場合は 3.1. 「間違い!」系 3.2. (1)へ戻る

的なフローになっているはずです。これを実装してみましょう。
…ありゃ、組みづらいですね。特に(3.2)から(1)に戻る場合の処理が。

では、(2)以降を言い換えてみましょう。

上記は日本語にすると「不正解なら再度質問する」ですよね。これを言い換えると、「正解するまで永遠に質問する」とできますよね?

そう考えると、

1. 以下を無限ループ 1.1. 質問する 1.2. (1.1)で得た答えが本来の答えと同じであれば 1.2.1. 「正解!」系 1.2.2. 無限ループから抜ける (終了させる) 1.3. (1.2)を満たさない場合は 1.3.1. 「不正解!」系

みたいにできると思いませんか?

もしこれでもできない場合は規則性を見付けることで出来る場合もあります。(今回は不要ですが)

つまり、質問者さんには「現実世界で考えてみる事」「規則性を見付ける事」「言い換えてみる事」、「プログラミング全体的な発想」が欠けているだけです。


[追記1]

追記読みました。

Java

1public class Main { 2 public static void main(String[] args) { 3 //問題を表示 4 String q = "問題***"; 5 6 //選択肢を表示 7 String choiceA = "ア:***"; 8 String choiceB = "イ:***"; 9 String choiceC = "ウ:***; 10 String choiceD = "エ:***"; 11 System.out.println("問題:" + q); 12 System.out.println(choiceA); 13 System.out.println(choiceB); 14 System.out.println(choiceC); 15 System.out.println(choiceD); 16 17 18 Scanner scanner = new Scanner (System.in); 19 20 21 while(true) { 22 System.out.print("\n回答を入力:"); 23 String input = scanner.next(); 24 25 if(input.equals("エ")) { 26 System.out.println("\n正解!"); 27 break; 28 } else if (input.equals("ア")) { 29 System.out.println("\n不正解!\n正解はDです。"); 30 break; 31 } else if (input.equals("イ")) { 32 System.out.println("\n不正解!\\n正解はDです。"); 33 break; 34 } else if (input.equals("ウ")) { 35 System.out.println("\n不正解!\\n正解はDです。"); 36 break; 37 } System.out.println("\nア~エを入力してください。"); 38 } 39 } 40}

…惜しい!!(いや惜しくなかったわ)

まず、(プログラムが表示する問題文に対する)答えはすでに決まっているはずです。ですが、今回は関係ありませんが、もし問題文と答え・選択肢がファイルから読み込んで出題するとかだとどうでしょうか?
今回は「エ」が正解らしいのでいいですが常にエが正しいとは限りません。ではその場合、どうするか。

そう、「実際の答え」用に変数を宣言するのです。

たとえば string realAnsとしたら、reaAns = "エ" とするとか。

で、正解・不正解についても考えてみましょう。

ア~エの中から選ぶが、正解はエだとする。そうするとア~ウは不正解、エだけが正解となるはずです。

もし正解がウだったらどうでしょうか?
この場合は規則性を見付けるといいです。

正解 = { ウ }
不正解 = { ア, イ, エ }

となるはずです。これをアが正解のとき、イが正解のとき…と言う風にやってみると、「本来の答えであれば正解、それ以外なら不正解」と言えますね。
つまり、アのとき~,イのとき~, ... と一つ一つやるのではなく、単純に「ウのときだけ正解で、それ以外は不正解とする」とすればいいだけです。

さらに、上でも書いたように「現実世界での手順」なので今回のコードを読んでみましょう。コードを読むコツは「一行レベルで、その行が何をしているかを考えながら読む」です。コメントとして読んでいくとか。

実際にやってみましょう。

Java

1public class Main { 2 public static void main(String[] args) { 3 //問題文やら選択肢やらを表示する 4 String q = "問題***"; 5 String choiceA = "ア:***"; 6 String choiceB = "イ:***"; 7 String choiceC = "ウ:***; 8 String choiceD = "エ:***"; 9 System.out.println("問題:" + q); 10 System.out.println(choiceA); 11 System.out.println(choiceB); 12 System.out.println(choiceC); 13 System.out.println(choiceD); 14 15 // ユーザ入力を標準入力から受け取るためのオブジェクト生成 16 Scanner scanner = new Scanner (System.in); 17 18 // 無限ループ 19 while(true) { 20 // ユーザ入力を受け付ける 21 System.out.print("\n回答を入力:"); 22 String input = scanner.next(); 23 24 // 「エ」のとき 25 if(input.equals("エ")) { 26 // 「正解!」 27 System.out.println("\n正解!"); 28           // ループから強制的に抜ける 29 break; 30 // 「ア」のとき 31 } else if (input.equals("ア")) { 32 // 「不正解」 33 System.out.println("\n不正解!\n正解はDです。"); 34 // ループから強制的に抜ける 35 break; 36 // 以下も同じようにやる

これを疑似コードとして書きだす。

[疑似コード] 1. 問題文や選択肢を表示する 2. 標準入力用のオブジェクトを生成する(コンソールから読み取るための準備) 3. 無限ループ 3.1. ユーザ入力を受け付けてinputにセット 3.2. inputが「エ」なら 3,2,1. 「正解」と表示 3.2.2. 無限ループから抜ける 3.3. (3.2)を満たさない場合で、inputが「ア」なら 3.3.1. 「不正解」系の表示 3.3.2. 無限ループから抜ける 3.4. (3.3)を満たさない場合で、inputが「イ」なら 3.4.1. 「不正解」系の表示 3.4.2. 無限ループから抜ける 3.5. (3.4)を満たさない場合で、inputが「ウ」なら 3.5.1. 「不正解」系の表示 3.5.2. 無限ループから抜ける 4. 終了

これを実際にデータを入れてみながら考えてみましょう。

もしinput = "ア"ならどうでしょうか?

(1),(2)は問題ありませんね。(3)で無限ループで(3.1)へ。つまりinoutにデータを入れる所。
input = "ア"ですね。

で、(3.2)で「"ア" == "エ"」ですが成り立ちませんよね。なので(3.3)へ。
(3.3)では「"ア" == "ア"」なので満たしますから、(3.3.1)へ。
不正解と表示して、(3.3.2)へ行く。するとbreak、つまり「ループから強制的に抜ける」ので(3)の後の所に行く。
つまり(4)へ行ってしまう。

えーっと、今回の仕様ってなんでしたっけ?
確か「正解になるまで」みたいな感じだったはずです。

でもアは本来の答えじゃないのになぜか終了しています。

なんかおかしいですよね。

こういう風に実際にデータを入れて考えてみてください

投稿2022/03/17 06:30

編集2022/03/17 10:04
BeatStar

総合スコア4962

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

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

masuko358

2022/03/17 08:42

ちょうど本日オブジェクト指向を学び、仰られている”現実世界でやっている手順を逐一指示”ということがよく分かりました。 おかげ様で理想のコードがかけました。 こんな簡単なこともできないのか・・・と挫折しかけておりましたが、もっと頑張ります! ご丁寧にお答えいただきありがとうございました!!!
m.ts10806

2022/03/17 09:53

>本日オブジェクト指向を学び Javaはオブジェクト指向が強制される言語なので後回しになってるのは学習順序として違和感があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問