今現在、Javaを中心にプログラミング言語全般を学習しています。
ただ、その中で、繰り返し処理の中のデータ構造が理解できずに苦しんでいます。
例えば、forで言えば、以下のような文です。
int size = num.nextInt(); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { //処理 } }
こういったコードを理解するにはどのようなアプローチを取ればよろしいでしょうか?
オススメのサイトや本などありましたら、教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
フローチャートはご存じですか?
コードだけ眺めて考えるより、フローチャートを学んで「イメージ」で理解するのもよいと思います
例えばループ処理はこんな感じに書きます
2重ループになるとこんな感じです
ご提示のコードをこの記法で表すとこんな感じになります
流れがわかったら、変数の変化を追ってみましょう
開始
↓
仮に size = 1 だとします
i=0
↓
i < size ... 0 < 1 ... true
↓
j=0
↓
j < size ... 0 < 1 ... true
↓
j = j + 1 ... j = 1
↓
j < size ... 1 < 1 ... false
↓
i = i + 1 ... i = 1
↓
i < size ... 1 < 1 ... false
↓
終了
size = 2 ではどうなるかご自身で考えてみてください
※面倒くさがらずに、順番に、紙に書きだしてやってみることをおすすめします※
単純にsizeが増えるほど内側のループを通る回数が増えていくはずです
内側ループの変数jは、その都度 0 で初期化されることもわかると思います
こんな感じにフローチャートは論理的に考えることを助けてくれます
以上ご参考まで
投稿2017/08/10 08:39
総合スコア3111
0
とりあえず次のコードの動作を追ってみましょう。
Java
1for (int i = 0; i < size; i++) { 2 for (int j = 0; j < size; j++) { 3 System.out.println(i + ", " + j); 4 } 5}
二重ループはやっかいで、とんでもない特殊ルールが発動する... なんてことないです。
普通のループのネストとして読み取れます。
一重のループの挙動がわかるのでしたら、じっくり考えれば二重ループも簡単なはずです。
te2ji様のご指摘を受けて
こちらも試してみるとよいでしょう。
Java
1for (int i = 0; i < size; i++) { 2 System.out.println("外側のループカウンタ: " + i); 3 for (int j = 0; j < size; j++) { 4 System.out.println("内側のループカウンタ: " + j); 5 } 6}
質問者さまのコメントを受けて
次の二つのコードは、結果は同じです。
Java
1for(int i = 0; i < 2; i++) { 2 doSomething(i); // なんか適当な処理 3}
Java
1int i = 0; 2doSomething(i); 3i++; 4doSomething(i);
例えば、doSomethingを次のように定義します。
Java
1void doSomething(int num) { 2 for(int j = 0; j < 2; j++) { 3 System.out.println(num + ", " + j); 4 } 5}
そうすると、次の二つのコードが同じだということが納得できませんか?
Java
1for(int i = 0; i < 2; i++) { 2 for(int j = 0; j < 2; j++) { 3 System.out.println(i + ", " + j); 4 } 5}
Java
1int i = 0; 2for(int j = 0; j < 2; j++) { 3 System.out.println(i + ", " + j); 4} 5i++; 6for(int j = 0; j < 2; j++) { 7 System.out.println(i + ", " + j); 8}
三重ループだろうと四重ループだろうと挙動は同じような考え方で追えます。
まあ、そこまでネストが深くなると、それはそれで問題ですが... これは別の話。
投稿2017/08/10 03:32
編集2017/08/10 05:50総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 03:46
退会済みユーザー
2017/08/10 03:51
2017/08/10 03:52
退会済みユーザー
2017/08/10 03:55
2017/08/10 04:26
2017/08/10 04:30
2017/08/10 04:38
2017/08/10 04:42 編集
2017/08/10 04:42
2017/08/10 05:14
2017/08/10 05:16
2017/08/10 05:35
2017/08/10 05:37
2017/08/10 05:52
2017/08/10 05:56
0
コードの挙動を確認するには、ステップ実行を可能とするデバッグ環境を準備すると良いです。
追記
せっかくなので、挙動が追えるものを用意してみました。
for の動作
python での挙動となりますが、まぁあんまり気にするところではないので、動作だけ見ていれば追えると思います。
投稿2017/08/10 03:30
編集2017/08/10 04:57退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 05:15
退会済みユーザー
2017/08/10 05:20
2017/08/10 05:38
0
さんざん、みなさんが解説してるので、サンプルだけ
多重ループは内側のループが終わらないと外側の制御にうつりません。
あと、ポイントとしてはネストです。
なんで、ソースをインデントしてるかというと、繰り返しのブロックがわかりやすいからです。
というわけで、実行結果をネストして表示すると動きがわかりやすいかと。
java
1System.out.println("全体の開始"); 2for(int i = 0;i < 3; i++) { 3 System.out.println("\t外側の開始 カウンタ i = " + i); 4 for(int j = 0;j < 4; j++) { 5 System.out.print("\t\t内側の開始 カウンタ j = "); 6 System.out.print(j); 7 System.out.println(" 内側の終了"); 8 } 9 System.out.println("\t外側の終了 カウンタ = " + i); 10} 11System.out.println("全体の終了");
4段、5文字の四角形を3回書く場合のループは、
java
1int cnt = 1; 2for(int kai = 0; kai < 3; kai++) { 3 for(int dan = 0; dan < 4; dan++) { 4 for(int moji = 0; moji < 5; moji++) { 5 // System.out.print("X"); 6 System.out.printf("[%02d]", cnt++); 7 } 8 System.out.println(); 9 } 10 System.out.println(); 11}
という感じです。Xの部分を連番にすると、表示順が理解しやすいと思います。
投稿2017/08/10 11:19
総合スコア4820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
単純に、このコードだけ読み取るなら九九をイメージするとやりやすいかと
質問者さんが出されたコードをこのように変えます。
int size = num.nextInt(); for (int i = 1; i <= size; i++) { for (int j = 1; j <= size; j++) { //処理 System.out.println("iは" + i + " ," + "jは" + j) System.out.println(i*j); } }
このコードを動かした場合、まず外側が初期状態をセットしてfor文が動き
次に内側のfor文が初期状態をセットして動き出します。
内側の条件が動き始めると、11,12,13と続いて、19のあと110となってしまう条件の時に内側のfor文が終わり
外側のfor文がまた1回動きます
その後もう一回内側のfor文が動いて21,22,23とつづくということを続けていきます。
おそらくこれでイメージしやすいのではないでしょうか。
すいません、私もjava初心者なのでもしかしたら解釈やコードが間違っているかもしれませんが、その場合はご了承ください・・・。
投稿2017/08/10 05:36
編集2017/08/10 05:37総合スコア69
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/10 08:51
2017/08/10 09:01
2017/08/10 10:57