for文の中のfor文で回した値をif文で判定してtrueならその処理が実行され、
falseならelseが実行される。実行されたらブロックを抜けてまたfor文に戻って回された値が
trueならその処理falseならelseの処理をする。for文が5以下なら5の値が入ったらブロックを抜ける。
と説明を受けましたが、紙に自分で流れを書けません。
皆さんどう流れを理解されましたか。
package lesson06; public class Sample8 { public static void main(String[] args) { boolean b1 = false; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(b1 == false) { System.out.print("*"); b1 = true; }else { System.out.print("-"); b1 = false; } } }System.out.print("\n"); } }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
この例はまだまだ分かり易い方だと思いますが、複雑になればなるほど「コード全体を漠然ととらえようとしてもどんどん認識できなくなる」と思います。人間の頭ってのはそうそうややこしいことをすぐに把握できるようにはできてない気がするのです。単に私の頭がよくないからかも知れませんが・・・
自分の場合、小さな部分から機能を把握しそれを自分なりに捉えやすい概念に置き換えるようなことをしている気がします。
java
1boolean b1 = false; 2for (int i = 0; i < 5; i++) { 3 for (int j = 0; j < 5; j++) { 4 if (b1 == false) { 5 System.out.print("*"); 6 b1 = true; 7 } else { 8 System.out.print("-"); 9 b1 = false; 10 } 11 } 12} 13System.out.print("\n")
==>
java
1boolean b1 = false; 2for (int i = 0; i < 5; i++) { 3 for (int j = 0; j < 5; j++) { 4 b1に従い'*'か'-'を印字 5 そしてb1を反転 6 } 7} 8System.out.print("\n")
==>
mybrain
1b1を偽に初期化 2以下を5回繰り返す 3 以下を5回繰り返す 4 b1に従い'*'か'-'を印字 5 そしてb1を反転 6改行
一番内側は実行するたびに''と'-'を交互に印字する機能と捉える
一つ外側のループは「5回繰り返す」わけだが、
b1が偽から始まれば
--
b1が真から始まれば
---
となるってことだろう
==>
mybrain
1b1を偽に初期化 2以下を5回繰り返す 3 b1に従い'*-*-*'か'-*-*-'を印字 4 そしてb1を反転 5改行
こんな具合に「自分自身の言葉で」「捉えやすい単位で」「機能」をイメージするようにします。
この例のように機能をまとめやすいものもありますが論理が素直でないものの場合うまくまとまらないこともあります。そういう場合は「ループの初回は状態がこうのときどうなるか」「次のループではどうなるか」というのを自分自身の頭の中で「実行」しコードの動きをとらえようとすることもあります。
java
1for (int j = 0; j < 5; j++) { 2 if (b1 == false) { 3 System.out.print("*"); 4 b1 = true; 5 } else { 6 System.out.print("*"); 7 b1 = true; 8 } 9}
==>
1回目実行前: jは0, b1がfalse, 印字結果は何もなし
1回目実行後: jは1, b1がtrue, 印字結果は*
2回目実行前: jは1, b1がtrue, 印字結果は*
2回目実行後: jは2, b1がfalse, 印字結果は*-
...
5回目実行前: jは4, b1がfalse, 印字結果は*--
5回目実行後: jは5, b1がtrue, 印字結果は--
またこうした「機能の把握」の過程で「冗長と思える論理」「不明瞭な論理」は自分自身が理解しやすいように置き換えを行うこともあります。
if (b1 == false)
これは「b1がfalseなら」と読めるがb1はboolean、すなわち真偽値なのだから「b1だ」「b1でない」と捉える方がより簡単に頭の中に入ってくるので
if (!b1)
「b1でなければ」と捉える
java
1if (b1 == false) { 2 ... 3 b1 = true; 4} else { 5 ... 6 b1 = false; 7}
このパターンは「もし条件が成立すれば・・・、そうでなければ・・・」と捉えるより
単に「要するにb1の真偽を反転」と捉えます。
追記:最初に書こうと思っていたことを回答しているうちに書き忘れてました・・・
プログラミング言語の仕様(書き方、意味、人が書いたコードの把握)や様々なアルゴリズム(計算手順)の把握は自分自身の頭に焼き付くぐらい定着していないとパっ見てすぐにわかるようにはなりません。そうなるためにはひたすら反復訓練が必要(体育会系のノリが必要)と自分は思います。
自動車の運転に慣れてないとき「えーとまずブレーキとクラッチを踏んでギアを入れて・・・」なんて手順を頭の中で一生懸命考えます。しかしそんなことを一々考えなければならない段階ではスムーズな運転は困難です。なんども繰り返すうちに意識的に考えなくても自然に体が動くようになってきます。プログラミングも同じで「一つ一つの知識がしっかり頭に定着してあまり意識的に考えなくても自然に意味が連想できるぐらいまで練習すれば」自ずと「見てすぐに理解できるようになる」はずです。
反復訓練しましょう。ひたすらコードを書いて、ひたすらコードを読んで、ひたすら様々な論理を頭に焼き付けていくのです。そうすれば苦もなくプログラミングできるようになります。
投稿2019/05/13 22:50
編集2019/05/13 23:06総合スコア18392
0
デバッグ実行
投稿2019/05/13 21:17
総合スコア80765
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/14 01:27
2019/05/14 02:11
2019/05/14 15:03
2019/05/14 20:33
2019/05/14 21:20 編集
0
ベストアンサー
Java
1 2public class Main { 3 public static void main(String[] args) throws Exception { 4 boolean b1 = false; 5 System.out.println("コード開始"); 6 for(int i=0; i<5; i++) { 7 8 System.out.println("for文 i :" + (i + 1) + "回目開始"); 9 10 for(int j=0; j<5; j++) { 11 12 System.out.println("for文 j :" + (j + 1) + "回目開始"); 13 14 if(b1 == false) { 15 16 System.out.println("b1がfalseなのでtrueにします。"); 17 18 System.out.print("*"); 19 b1 = true; 20 }else { 21 22 System.out.println("b1がtrueなのでfalseにします。"); 23 24 System.out.print("-"); 25 b1 = false; 26 } 27 28 System.out.println("for文 j :" + (j + 1) + "回目終了"); 29 30 } 31 32 System.out.println("for文 i :" + (i + 1) + "回目終了"); 33 } 34 System.out.print("\n"); 35 } 36} 37
↑ 初心者のときで流れがわからないなら要所要所でsysoutしましょう。
デバッグのやり方がわからなくてもこれなら流れがわかりますよね?
ちなみに実行結果は↓です
コード開始 for文 i :1回目開始 for文 j :1回目開始 b1がfalseなのでtrueにします。 *for文 j :1回目終了 for文 j :2回目開始 b1がtrueなのでfalseにします。 -for文 j :2回目終了 for文 j :3回目開始 b1がfalseなのでtrueにします。 *for文 j :3回目終了 for文 j :4回目開始 b1がtrueなのでfalseにします。 -for文 j :4回目終了 for文 j :5回目開始 b1がfalseなのでtrueにします。 *for文 j :5回目終了 for文 i :1回目終了 for文 i :2回目開始 for文 j :1回目開始 b1がtrueなのでfalseにします。 -for文 j :1回目終了 for文 j :2回目開始 b1がfalseなのでtrueにします。 *for文 j :2回目終了 for文 j :3回目開始 b1がtrueなのでfalseにします。 -for文 j :3回目終了 for文 j :4回目開始 b1がfalseなのでtrueにします。 *for文 j :4回目終了 for文 j :5回目開始 b1がtrueなのでfalseにします。 -for文 j :5回目終了 for文 i :2回目終了 for文 i :3回目開始 for文 j :1回目開始 b1がfalseなのでtrueにします。 *for文 j :1回目終了 for文 j :2回目開始 b1がtrueなのでfalseにします。 -for文 j :2回目終了 for文 j :3回目開始 b1がfalseなのでtrueにします。 *for文 j :3回目終了 for文 j :4回目開始 b1がtrueなのでfalseにします。 -for文 j :4回目終了 for文 j :5回目開始 b1がfalseなのでtrueにします。 *for文 j :5回目終了 for文 i :3回目終了 for文 i :4回目開始 for文 j :1回目開始 b1がtrueなのでfalseにします。 -for文 j :1回目終了 for文 j :2回目開始 b1がfalseなのでtrueにします。 *for文 j :2回目終了 for文 j :3回目開始 b1がtrueなのでfalseにします。 -for文 j :3回目終了 for文 j :4回目開始 b1がfalseなのでtrueにします。 *for文 j :4回目終了 for文 j :5回目開始 b1がtrueなのでfalseにします。 -for文 j :5回目終了 for文 i :4回目終了 for文 i :5回目開始 for文 j :1回目開始 b1がfalseなのでtrueにします。 *for文 j :1回目終了 for文 j :2回目開始 b1がtrueなのでfalseにします。 -for文 j :2回目終了 for文 j :3回目開始 b1がfalseなのでtrueにします。 *for文 j :3回目終了 for文 j :4回目開始 b1がtrueなのでfalseにします。 -for文 j :4回目終了 for文 j :5回目開始 b1がfalseなのでtrueにします。 *for文 j :5回目終了 for文 i :5回目終了
投稿2019/05/14 00:14
総合スコア2341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
一般論で回答します。
極論、プログラム処理を文書で示すことには限界があります。
私も就職して時間が経ち、「プログラミングよりも文書で仕事しろ」とか言われますが、結局プログラムについての説明はソースコードで示したほうが楽だと思うことは多々あります。
プログラム言語上では曖昧性がないですが、自然言語ではそうはいかないことも多いです。また、「AのときBをせよ、CのときDをせよ、そうでないときEをせよ」。といったことも文法上成立してしまいます(if-if-elseの曖昧性)。仕様書のバグに悩まされることも多々あります。
そして、仕様書どころか契約書にもバグは起こり得ます。世の中にはこのような解釈の多様性を悪用しようとか考える人もいます。私の学生時に、どう考えても出資金踏み倒しを前提としたインチキ計画に巻き込まれました。私の卒論題材となったアイディア(指導教官の特許)は、現物を作れないのに書類上仕事が成立したことになるというトンデモでした。
書面体制の打ち合わせでお金を集め、現物を作れない旨をバレたら契約書の欠陥を使って責任を逃れようとするという繰り返しに呆れました。
これなら書類に拘らない方がマシです。
投稿2019/05/14 15:40
総合スコア4830
0
for文の中のfor文で回した値をif文で判定してtrueならその処理が実行され、
falseならelseが実行される。実行されたらブロックを抜けてまたfor文に戻って回された値が
trueならその処理falseならelseの処理をする。for文が5以下なら5の値が入ったらブロックを抜ける。
プログラムは箇条書きです. 箇条書きを続き文にすると分かり難いです.
私は「変数による各部への影響」から見ることが多い気がします.
i のループによる「j のループと if への影響」も, j のループによる「if への影響」も無い(変数 i も j もその内側で使われていない)ので, 2つのループで「5回ずつ回る」=「5x5=25回if文を実行」, です.
if 文では b1 だけが考慮され for には関係していないので, if 文のみに注目できます.
if の実行により b1 は, true → false または false → true になります. つまり if の実行前後で反転し, その時に print で(b1 に応じて}'*' や '-' を表示するので, 「交互の表示」となります.
「25回if文を実行」して「交互に表示」するので, '' と '-' が交互に計25個表示される(b1 の初期値は false なので '' から), と理解します.
おまけ的に最後に改行("\n")です.
投稿2019/05/14 02:38
総合スコア12545
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/14 01:59
2019/05/14 06:07 編集
2019/05/14 11:13