何が起きているのですか
for (int j = 1; j < 11; j = j + 1) {
for (int i = 1; i < 11; i = i + 1) {
rect((i-1) * 10, (j-1) * 10, 8, 8);
}
}
正方形が大量に並ぶ理由を知りたいです。
これを書き換えて正方形を階段状に並べたいです。
ソースコードprocessing
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
for
は繰り返しを行うための構文です。
1 まず、外側の for 文について考えてみましょう。
java
1for (int j = 1; j < 11; j = j + 1) { 2 3}
まず、int j = 1;
で最初に int
型の整数 j
が宣言され、1 に初期化されます。
次の j < 11;
は繰り返しの継続条件で j が 11 より小さい間は、処理が繰り返されるということです。
j = j + 1
は、1回内側の処理が終わったたびに j
に j+1
を代入しています。
結果、jは、1,2,3 ... 10 まで変化し、11 になった時点で終了します。
2 次に内側の for 文について考えてみます。
java
1 for (int i = 1; i < 11; i = i + 1) { 2 3 }
これは、最初に int 型の変数 i
を 1
に初期化し、i < 11
の間は繰り返し、1回内側の処理が終わったたびに i
に i+1
を代入します。
結果、i は、1,2,3 ... 10 まで変化し、11 になった時点で終了します。
3 これらを組み合わせて rect((i-1) * 10, (j-1) * 10, 8, 8);
がどのように処理されていくのかをトレースしてみます。
まず、最初に j=1
で
java
1 for (int i = 1; i < 11; i = i + 1) { 2 rect((i-1) * 10, (j-1) * 10, 8, 8); 3 }
の処理が実行されます。
最初、j=1、i=1
で rect() が実行されるので rect((1-1) * 10, (1-1) * 10, 8, 8);
が実行されることになります。
次は、j=1、i=2
で rect() が実行されるので rect((2-1) * 10, (1-1) * 10, 8, 8);
が実行されます。
以下、同様に次のように動いていきます。
j=1、i=3
→ rect((3-1) * 10, (1-1) * 10, 8, 8);
(i=4 から i=9 を省略します。)
j=1、i=10
→ rect((10-1) * 10, (1-1) * 10, 8, 8);
次に j=1、i=11
になりますが、内側の for 文の継続条件に合わないため、j=1
の処理が終了してて、j=j+1
が実行され、j=2
の処理に移ります。
j=2、i=1
→ rect((1-1) * 10, (2-1) * 10, 8, 8);
j=2、i=2
→ rect((2-1) * 10, (2-1) * 10, 8, 8);
(以降は省略)
以上のような処理が繰り返されることで正方形がたくさん、作られます。
【階段を作る一例】
java
1for (int j = 1; j < 11; j = j + 1) { 2 for (int i = 1; i <= j; i = i + 1) { 3 rect((i-1) * 10, (j-1) * 10, 8, 8); 4 } 5}
上記のように変更すると以下のような絵になります。
これが理解出来たら、左右反対にするには、どうすればよいのか、考えてみましょう。
投稿2020/05/23 07:12
編集2020/05/23 07:17総合スコア1773
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/23 11:03
0
for文なんて全然難しいものじゃないです。
for(初期化; 継続判別式; 更新式) 実行文
これだけ。
for文に到達すると、
初期化を行い、
継続判別式がtrueだったら実行文を実行し/falseだったらfor文終わり
更新式を実行して、
継続判別式がtrueだったら実行文を実行し/falseだったらfor文終わり
更新式を実行して、
...
つまり、継続判別式がtrueになる間実行分と更新式を繰り返します。
for文とは直接には関係ないけれど、ブロックと言って、{ }で囲むと0個以上の文を一つの文として扱うので、実行文にブロックを置くことは普通に行われます。
余計なことは考えずに、以上の規則を
Processing
1for (int j = 1; j < 11; j = j + 1) { //for①とする 2 for (int i = 1; i < 11; i = i + 1) { //for②とする 3 rect((i-1) * 10, (j-1) * 10, 8, 8); 4 } 5}
に適用します。
text
1for①に到達するとjを宣言して1を設定します。 2jは1で、継続判別式j<11はtrueなので、実行文を実行します。 3for①の実行文はfor②です。 4 for②では、iを宣言して1を設定します。 5 iは1で、継続判別式i<11はtrueなので、実行文を実行します。 6 for②の実行文は`rect((i-1) * 10, (j-1) * 10, 8, 8);`です。 7 ここまでで、iは1,jは1なので、rect(0,0,8,8)で正方形を描画します。 8 for②の実行文が終わったので、for②の更新式を実行します。i=i+1ということで、iは2になります。 9 iは2で、i<11はtrueなので、実行文を実行します。 10 iは2,jは1なので、rect(10,0,8,8)で正方形を描画します。 11 for②の更新式を実行し、iは3になります。 12 iは3で、i<11はtrueなので、実行文を実行します。 13 iは3,jは1なので、rect(20,0,8,8)で正方形を描画します。 14 for②の更新式を実行し、iは4になります。 15(同様の繰り返しなので中略。理解できますね?) 16 iは10,jは1なので、rect(90,0,8,8)で正方形を描画します。 17 for②の更新式を実行し、iは11になります。 18 iは11で、i<11はfalseなので、for②を終了します 19for①の実行文が終わったので、for①の更新式を実行します。jは2になります。 20jは2で、j<11はtrueなので、実行文を実行します。 21 for②では、iを宣言して1を設定します。 22 iは1で、i<11はtrueなので、実行文を実行します。 23 ここまでで、iは1,jは2なので、rect(0,10,8,8)で正方形を描画します。 24 for②の実行文が終わったので、for②の更新式を実行します。i=i+1ということで、iは2になります。 25(中略) 26 iは10,jは2なので、rect(90,10,8,8)で正方形を描画します。 27 for②の更新式を実行し、iは11になります。 28 iは11で、i<11はfalseなので、for②を終了します 29for①の更新式を実行し、jは3になります。 30jは3で、j<11はtrueなので、実行文を実行します。 31(中略略) 32 iは10,jは10なので、rect(90,90,8,8)で正方形を描画します。 33 for②の更新式を実行し、iは11になります。 34 iは11で、i<11はfalseなので、for②を終了します 35for①の更新式を実行し、jは11になります。 36jは11で、j<11はtrueなので、for①を終了します
なにか疑問な点がありますか?
投稿2020/05/23 07:29
総合スコア7703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/23 10:38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。