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

回答編集履歴

2

誤字の修正

2021/06/16 13:50

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -99,8 +99,6 @@
99
99
  これを日本語でも英語でも韓国語でもスペイン語でもなんでもいいので、自分が読み書きできる言語で書き下しましょう。
100
100
 
101
101
  ```Java
102
- package Renshu;
103
-
104
102
  1. 以下を無限ループ
105
103
  1.1. 変数x, kaisuを宣言
106
104
  1.2. kaisuに0を代入

1

追記1

2021/06/16 13:49

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -46,4 +46,117 @@
46
46
 
47
47
  後はこれをコーディングし、デバッグし、テストする。
48
48
 
49
- これだけです。
49
+ これだけです。
50
+
51
+ ----------------------------
52
+
53
+ [追記1]
54
+
55
+ > 実行自体はできるのですが、乱数で0が出ても止まらず、無限ループしてしまいます
56
+
57
+ 当たり前です。
58
+
59
+ ロジックを読みましょう。
60
+
61
+ 他人が書いたコードや自分が書いたコード、なんでもいいですが、とにかくコードを読むときは、
62
+ **一行レベルで、なにをやっているかを考えながら読む**です。
63
+
64
+ たとえばコメント文として記述するとかです。
65
+
66
+
67
+ ```Java
68
+ package Renshu;
69
+
70
+ public class Toi {
71
+ public static void main(String[] args) {
72
+
73
+ // 条件式: true.(= つまり無限ループ)
74
+ while(true) {
75
+ // 変数x, kaisuを宣言
76
+ int x,kaisu;
77
+ // kaisu に 0 を代入する
78
+ kaisu=0;
79
+ // x は 乱数……発行?
80
+ x=(int)(11*Math.random());
81
+ // "x>>" + x を出力
82
+ System.out.println("x>>"+x);
83
+ // iの初期値: 0, xが 0である間, i++ しながら処理
84
+ for(int i=0;x==0;i++) {
85
+ // kaisu をインクリメント( i = i + 1 )
86
+ kaisu++;
87
+ // "0が出るまで..." と表示
88
+ System.out.println("0が出るまでの繰り返し回数は"+kaisu+"回です");
89
+ // ブロックから強制的に抜ける
90
+ break;
91
+ }
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ですね。
98
+
99
+ これを日本語でも英語でも韓国語でもスペイン語でもなんでもいいので、自分が読み書きできる言語で書き下しましょう。
100
+
101
+ ```Java
102
+ package Renshu;
103
+
104
+ 1. 以下を無限ループ
105
+ 1.1. 変数x, kaisuを宣言
106
+ 1.2. kaisuに0を代入
107
+ 1.3. 乱数発行(?)しているのかな
108
+ 1.4. iの初期値を0とし, xが0である間, インクリメントしながら以下を処理
109
+ 1.4.1. kaisu をインクリメント
110
+ 1.4.2. "0が出るまで..."云々のメッセージ表示
111
+ 1.4.3. ブロックから強制的に抜ける( (1.4)だけ抜けて(1)に戻る )
112
+ ```
113
+
114
+ これを現実世界でやってみましょう。
115
+ つまり、手作業で、(1)から(1.4.3)をやってみましょう。
116
+
117
+ 脳内でもいいです。
118
+
119
+ そうすると、めちゃくちゃなロジックだという事が分かります。
120
+
121
+ なぜ、kaisuを(1.1) で宣言しているのでしょうか。
122
+ なぜ kaisuの初期値(厳密には代入)を(1.2)でやっているのでしょうか。
123
+
124
+ この場所でやると、(1)に戻る時には(厳密には(1.4)の後ぐらい) 破棄されるので意味がありません。
125
+
126
+ 現実世界で考えてみてください。
127
+
128
+ 今のやり方ですと、
129
+
130
+ ```ここに言語を入力
131
+ ホワイトボードにカウントしていく。
132
+ でも次の乱数発行の際にはそのホワイトボードの内容をすべて消す。
133
+ また書いていく。(もちろん0から)
134
+ ```
135
+
136
+ いつまでたっても kaisu > 0 にはなりません。(結果としてはね)
137
+
138
+ (1.4)の 『iの初期値を0とし, xが0である間, インクリメントしながら以下を処理』も変。
139
+
140
+ 数直線で書いてみてください。
141
+
142
+ i 用と x 用です。
143
+
144
+ そうすると、何か変であることがわかるはずです。
145
+
146
+ x に代入したりとかしていないので、よくて x = 0 、悪ければ(そもそも初期化すらしていないので) でたらめな値になっているはずです。
147
+
148
+ C言語では、初期値を与えないと 0 または不定値( でたらめな値 ) が入ります。
149
+
150
+ 言語によっては違うかもしれませんが、そういう風に 0 以外の値になっている可能性もあります。
151
+
152
+ 仮に x = 0 だとしても、 『x が0である間』なのでこれも無限ループに陥る可能性がある。
153
+
154
+ (ただし、他の部分で落ちるが)
155
+
156
+ (1.4.2) での『"0が出るまで..."云々のメッセージ表示』も変。
157
+
158
+ 日本語なり英語なりの自分が読み書きできる言語で考えてみてください。
159
+
160
+ そうすると、変であることがわかるはずです。
161
+
162
+ なんでここで表示しているのでしょうか。