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

回答編集履歴

2

追記

2017/11/24 11:55

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
File without changes

1

追記

2017/11/24 11:55

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -9,4 +9,77 @@
9
9
  System.out.println(numOfCorrect + "回目の正解です");
10
10
  ...
11
11
  }
12
- ```
12
+ ```
13
+
14
+ 追記のコードが上手くいかない理由
15
+ ---
16
+ > ```Java
17
+ > for(int i = 0; yourAns.equals(answer); i++) {
18
+ > System.out.println(i + "回目の正解です");
19
+ > }
20
+ > ```
21
+
22
+ for文は、`for(初期化部; 条件式; 更新式)`という形式で書きます。
23
+ 上記のコードでは、ループ内において条件式の判定が変わるような影響がありません。
24
+ よって、**無限ループとなり、iはカウントアップされ続けます。**
25
+
26
+ ---
27
+ > ```Java
28
+ > for(int i = 0; yourAns.equals(answer); i++) {
29
+ > System.out.println(i + "回目の正解です");
30
+ > break;
31
+ > }
32
+ > ```
33
+
34
+ 上記のコードでは、breakが無条件に実行され、**ループが二周以上することはありません。**
35
+ `i++`に警告が出るのは、ループが必ず一周で終わるため、更新式が用いられないからです。
36
+ 通常break文やcontinue文は、何らかの条件付きで記述します。
37
+
38
+ また、上記for文に突入する際は、毎度iが0に初期化されます。
39
+ よって、**何度実行しても『0回目の正解です』としか表示され得ません。**
40
+
41
+ 私が示した解法について
42
+ ---
43
+ 回答冒頭のコードについてです。
44
+ aiueo19さんの元のコードの、次の構造を利用しています。
45
+ ```
46
+ 外側のループ {
47
+ ...
48
+ 内側のループ {
49
+ ...
50
+ 正解したら脱出
51
+ }
52
+
53
+ 正解した回数を表示(したい)
54
+ ...
55
+ }
56
+ ```
57
+
58
+ 要するに、**『外側のループを繰り返した回数 = 正解した回数』**なのです。
59
+ ループを実現するにはfor文とwhile文があります。
60
+ これらは相互代替可能ですが、ここではfor文の**カウンタ**を利用しています。
61
+
62
+ よって、次のように書きました。(冒頭のコードと全く同じ内容です)
63
+ ```Java
64
+ for(int numOfCorrect = 1; true; numOfCorrect++) {
65
+ ...
66
+ while(true) {
67
+ ...
68
+ }
69
+
70
+ System.out.println(numOfCorrect + "回目の正解です");
71
+ ...
72
+ }
73
+ ```
74
+
75
+ ループを新しく内側に入れ込んだりする必要はありません。
76
+ 単に、外側のループをfor文に置き換えれば万事解決するのです。
77
+
78
+ プログラムの書き方について
79
+ ---
80
+ かなりいろいろと調べ、奮闘されているようですね。これ自体は、とても大切なことです。
81
+ ただ、今回のコードは、for文の基本的な使い方がわかっていれば問題なく解決できるはずです。
82
+ ですので、基本的な部分を確認するように申し上げました。
83
+
84
+ スラスラとコードを書くのには慣れが必要です。
85
+ 基本的な部分を、不足なくしっかり押さえ、コードの挙動を追う癖をつけてください。