- 締切済み
forループに慣れるには
初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
ゲームプログラマーの修業を始めたばかりでC言語のことなど何も知らないに等しかった頃、例えば ***** **** *** ** * このような図形(実際は半角のアスタリスクとスペースでできた図形)を、for と printf で描くという課題をさんざんやらされました。 始めは図形も簡単で単純なループで描けるのですが、後の方になるほど図形が複雑になり、難しいループを組まないと描けなくなっていった記憶があります。 一見、できたからって何なの?と、思うような課題です。しかし今にして思えば、この課題から多重ループの組み方の基礎を学んだような気がします。 for は条件をしっかり作れば、break を使わずに済む場合が殆どです。恩師からも、break を使わないでループを作る習慣をつけるようにと教えられました。 今でも Flash の ActionScript で for ループは使いますが、break は絶対に使わないというつもりで条件を作ることにしています。
- notnot
- ベストアンサー率47% (4900/10361)
for( expr1; expr2; expr3) { body; } は、 expr1; while( expr2 ) { body; expr3; } ですから、whileがわかればそれに直せば理解しやすいかもしれません。 ( 厳密には両者で continue の動作が異なりますけど )
お礼
アドバイスありがとう御座います。 >expr1; while( expr2 ) { body; expr3; } 最後の評価の部分(expr3の位置での評価)は判り易いかも判りませんね。 また後で試してみます。
- arukamun
- ベストアンサー率35% (842/2394)
上記のプログラムはどのように動作しているか解らないですよね。 もう少しシンプルな物から始めましょう。 また、continueやbreakは使わないでプログラムが書けるようにした方が良いですね。 なぜなら、ループ処理が解りにくくなる原因だからです。 がんばってください。
お礼
アドバイスありがとう御座います。 確かに見難いと言うかややこしいですよね。 一応シンプルなものは解けるのですが、 breakやcontinue、はてまた前置きの++や 後ろ置きの++とかが関わってくると途中で 判らなくなったりするんです(苦笑) 実務の現場ではbreakやcontinueだけでなく、 forも多用するのは(他人も見るから)あまり しない方が良いと聞いたことがあります。 とにかく地道に頑張ります。
- asuca
- ベストアンサー率47% (11786/24626)
しっかりしたプログラム仕様書を作ってそこからプログラムを作れば自ずと変数はしっかり追えますよ。
お礼
アドバイスありがとうございます。 仕様書を作ってからと言う事ですが、 とにかく慣れろという事ですね。 資格試験のために勉強しているのであの様な 問題を見て答えを導かないといけないので 自分にとっては仕様書以前の問題かも判りません。 地道に頑張ります。
- mi-si
- ベストアンサー率35% (200/567)
Cでプログラムを書いている時、例外処理が大量に発生するので、go toやbreak,continueを使わないとプログラムがかえって汚くなるので読みやすく整理していたら自然に身に付きました。 とりあえずエラー処理じゃない例外処理が大量に発生するようなプログラムを作ってなれることでしょう。(ファイルの読み込みとか画像フォーマットの解析とか) JavaはCより制限が厳しいのとObject指向の部分だけなので、C++も少しかじってたのでその応用で使えたので簡単でした(とはいえ、Cをやり始めたのが12年前、Javaに始めて触ったのが9年前・・・。)
お礼
ありがとう御座います。 >とりあえずエラー処理じゃない例外処理が大量に発生するようなプログラムを作ってなれることでしょう。(ファイルの読み込みとか画像フォーマットの解析とか) との事ですが、先に資格を取得しようと思って勉強していたのですが 複雑なループが出題されるとは思ってなかったので 軽視していました。 やはり慣れってものが必要なんですね。 慣れるまで時間もかかりそうなので複雑なループは 後回しにしようかと思います。 アドバイスありがとうございました。
お礼
アドバイスありがとう御座います。 そうですね、数字だけで動かすのではなく、 記号で色々描画して行くのも勉強になりますよね。 とにかく複雑なループは慣れが必要と実感しました。