質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

1695閲覧

プログラミング言語の処理のロジックを理解する方法

yoppi07

総合スコア30

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/08/10 03:24

今現在、Javaを中心にプログラミング言語全般を学習しています。
ただ、その中で、繰り返し処理の中のデータ構造が理解できずに苦しんでいます。
例えば、forで言えば、以下のような文です。

int size = num.nextInt(); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { //処理 } }

こういったコードを理解するにはどのようなアプローチを取ればよろしいでしょうか?
オススメのサイトや本などありましたら、教えてください。

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

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

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

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

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

guest

回答5

0

ベストアンサー

フローチャートはご存じですか?

コードだけ眺めて考えるより、フローチャートを学んで「イメージ」で理解するのもよいと思います

例えばループ処理はこんな感じに書きます

ループ処理

2重ループになるとこんな感じです

2重ループ処理

ご提示のコードをこの記法で表すとこんな感じになります

2重ループ処理その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

takito

総合スコア3111

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

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

yoppi07

2017/08/10 08:51

takitoさん、ありがとうございます。 確かにフローチャートがあると理解しやすいですね。
yoppi07

2017/08/10 09:01

sizeが2だと全ての処理が行われると思います。
takito

2017/08/10 10:57

そうですね iのインクリメントを通って、そのあと j=0 の内側の処理に入ります ループが深くなるほど、内側の処理の繰り返しが多くなりますね それが理解できれば多重ループは大丈夫だと思います 頑張ってください
guest

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
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2017/08/10 03:40

それぞれのループでの処理が分かるように、ループの内と外にメッセージ付きで変数を表示させないと、あんまり挙動が理解できない気がします。
LouiS0616

2017/08/10 03:46

コメントありがとうございます。 質問者様はここから飛んできています。 https://teratail.com/questions/87739 おそらく、//処理 の部分が何回実行されるか、からわかっていないようですので、 考え得る限り最もシンプルな回答にしました。
退会済みユーザー

退会済みユーザー

2017/08/10 03:51

あぁ、そういう経緯ですか。 デバッグ環境構築まで記述のある本とか読むと良いのかもしれないですね。
LouiS0616

2017/08/10 03:52

併記する形でte2ji様のご指摘を反映してみました。
退会済みユーザー

退会済みユーザー

2017/08/10 03:55

お手数をおかけしました。
yoppi07

2017/08/10 04:26

難しく考えすぎということですか?
LouiS0616

2017/08/10 04:30

なんでもそうですが、わかれば簡単です。 回答で示したコードは実行してみましたか?そして、その結果から得られることはあったでしょうか。
yoppi07

2017/08/10 04:38

入力値を2で試してみたところ以下、結果が出ました。 ただ、なぜこういった出力になったかというのは実際のコードでは 外側のループカウンタと内側のループカウンタしかイメージできないです。 数字がなぜ以下のような並びになるのかがわからないです。 外側のループカウンタ: 0 内側のループカウンタ: 0 内側のループカウンタ: 1 外側のループカウンタ: 1 内側のループカウンタ: 0 内側のループカウンタ: 1
LouiS0616

2017/08/10 04:42 編集

例えば、次のようなループがあるとき for(int i = 0; i < 2; i++) { __for(int j = 0; j < n; j++) { ____ // 処理 __} } この挙動は、次と一致すると言うことです。 int i; i = 0; for(int j = 0; j < n; j++) { __// 処理 } i = 1; for(int j = 0; j < n; j++) { __// 処理 } ※空白を_で代替しています。
LouiS0616

2017/08/10 04:42

for文は単に繰り返しを制御しているのだと言うことをお忘れないように。
yoppi07

2017/08/10 05:14

上下の処理が同じ処理ということがイメージできないです。
LouiS0616

2017/08/10 05:16

一重ループの場合ならわかりますか? for(int i = 0; i < 2; i++) { __// 処理 } 上記の処理と、下記の処理は結果は同じ int i; i = 0; // 処理 i = 1; // 処理 これがわからないなら、そもそもfor文についての理解がないことになります。
yoppi07

2017/08/10 05:35

一重ループでしたら、iの初期値が0でi++でインクリメントされて1になっていくので、上下の処理が同じということはわかります。
LouiS0616

2017/08/10 05:37

// 処理 上の部分を、下に置き換えてください。 for(int j = 0; j < n; j++) { __// 処理 } これが二重ループです。
yoppi07

2017/08/10 05:52

j < nのn というのは、なんらかの変数ですか?
LouiS0616

2017/08/10 05:56

適当に使っているだけなので、2とか3とかに脳内変換していただいて大丈夫です。 編集した回答では、nは用いないようにしています。
guest

0

コードの挙動を確認するには、ステップ実行を可能とするデバッグ環境を準備すると良いです。

追記
せっかくなので、挙動が追えるものを用意してみました。
for の動作

python での挙動となりますが、まぁあんまり気にするところではないので、動作だけ見ていれば追えると思います。

投稿2017/08/10 03:30

編集2017/08/10 04:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yoppi07

2017/08/10 05:15

ありがとうございます。 ちなみにEclipseでも挙動が追えるそうなのですが、 ご存知ですか?
退会済みユーザー

退会済みユーザー

2017/08/10 05:20

私は java を使用しないので、適切な回答は出来ませんが、普通にできると思いますよ。ググれば色々記事は出てくるので。 デバッグ環境の構築までキチンと説明してくれる入門書もあるはずなので、そういった「キチンと検証された手順」が分かるものを選んで、環境構築すると良いです。
guest

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

momon-ga

総合スコア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文が動いて2
1,22,23とつづくということを続けていきます。
おそらくこれでイメージしやすいのではないでしょうか。

すいません、私もjava初心者なのでもしかしたら解釈やコードが間違っているかもしれませんが、その場合はご了承ください・・・。

投稿2017/08/10 05:36

編集2017/08/10 05:37
RagnAnet1373

総合スコア69

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問