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)へ行ってしまう。
えーっと、今回の仕様ってなんでしたっけ?
確か「正解になるまで」みたいな感じだったはずです。
でもアは本来の答えじゃないのになぜか終了しています。
なんかおかしいですよね。
こういう風に実際にデータを入れて考えてみてください。