• 締切済み

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); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

みんなの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.5

ゲームプログラマーの修業を始めたばかりでC言語のことなど何も知らないに等しかった頃、例えば  *****   ****    ***     **      * このような図形(実際は半角のアスタリスクとスペースでできた図形)を、for と printf で描くという課題をさんざんやらされました。 始めは図形も簡単で単純なループで描けるのですが、後の方になるほど図形が複雑になり、難しいループを組まないと描けなくなっていった記憶があります。 一見、できたからって何なの?と、思うような課題です。しかし今にして思えば、この課題から多重ループの組み方の基礎を学んだような気がします。 for は条件をしっかり作れば、break を使わずに済む場合が殆どです。恩師からも、break を使わないでループを作る習慣をつけるようにと教えられました。 今でも Flash の ActionScript で for ループは使いますが、break は絶対に使わないというつもりで条件を作ることにしています。

incantevole_blue
質問者

お礼

アドバイスありがとう御座います。 そうですね、数字だけで動かすのではなく、 記号で色々描画して行くのも勉強になりますよね。 とにかく複雑なループは慣れが必要と実感しました。

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.4

for( expr1; expr2; expr3) { body; } は、 expr1; while( expr2 ) { body; expr3; } ですから、whileがわかればそれに直せば理解しやすいかもしれません。 ( 厳密には両者で continue の動作が異なりますけど )

incantevole_blue
質問者

お礼

アドバイスありがとう御座います。 >expr1; while( expr2 ) { body; expr3; } 最後の評価の部分(expr3の位置での評価)は判り易いかも判りませんね。 また後で試してみます。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.3

上記のプログラムはどのように動作しているか解らないですよね。 もう少しシンプルな物から始めましょう。 また、continueやbreakは使わないでプログラムが書けるようにした方が良いですね。 なぜなら、ループ処理が解りにくくなる原因だからです。 がんばってください。

incantevole_blue
質問者

お礼

アドバイスありがとう御座います。 確かに見難いと言うかややこしいですよね。 一応シンプルなものは解けるのですが、 breakやcontinue、はてまた前置きの++や 後ろ置きの++とかが関わってくると途中で 判らなくなったりするんです(苦笑) 実務の現場ではbreakやcontinueだけでなく、 forも多用するのは(他人も見るから)あまり しない方が良いと聞いたことがあります。 とにかく地道に頑張ります。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.2

しっかりしたプログラム仕様書を作ってそこからプログラムを作れば自ずと変数はしっかり追えますよ。

incantevole_blue
質問者

お礼

アドバイスありがとうございます。 仕様書を作ってからと言う事ですが、 とにかく慣れろという事ですね。 資格試験のために勉強しているのであの様な 問題を見て答えを導かないといけないので 自分にとっては仕様書以前の問題かも判りません。 地道に頑張ります。

  • mi-si
  • ベストアンサー率35% (200/567)
回答No.1

Cでプログラムを書いている時、例外処理が大量に発生するので、go toやbreak,continueを使わないとプログラムがかえって汚くなるので読みやすく整理していたら自然に身に付きました。 とりあえずエラー処理じゃない例外処理が大量に発生するようなプログラムを作ってなれることでしょう。(ファイルの読み込みとか画像フォーマットの解析とか) JavaはCより制限が厳しいのとObject指向の部分だけなので、C++も少しかじってたのでその応用で使えたので簡単でした(とはいえ、Cをやり始めたのが12年前、Javaに始めて触ったのが9年前・・・。)

incantevole_blue
質問者

お礼

ありがとう御座います。 >とりあえずエラー処理じゃない例外処理が大量に発生するようなプログラムを作ってなれることでしょう。(ファイルの読み込みとか画像フォーマットの解析とか) との事ですが、先に資格を取得しようと思って勉強していたのですが 複雑なループが出題されるとは思ってなかったので 軽視していました。 やはり慣れってものが必要なんですね。 慣れるまで時間もかかりそうなので複雑なループは 後回しにしようかと思います。 アドバイスありがとうございました。

関連するQ&A

  • ループの回数の問題についてです。

    SUN教科書 javaアソシエイツP102についてです。 Helloが何回表示されるかという問題です。 i=1 j=1の時、continue文によりouterへ移動するという 所までは理解出来ます。 分からないのはその後、解説によるとiが2ということです。 そして内側のforループは0から2の間、実行されるというのです。 iが2になるなら、内ループに入った時jも 2になるのではないのでしょうか。 よろしくお願い致します。 class LoopSample{ public static void main(String[] args){ outer: for(int i=0; i<5; i++){ for(int j=0; j<3; j++){ if(i==1 && j==1){ continue outer; } System.out.println("Hello"); } if(i==1 || i==2){ break; } } } }

    • ベストアンサー
    • Java
  • continueでforループを抜けられません。

    for($i=0;$i<100;$i++){ if($i == 50){continue;}} としてるんですが、ループを抜けてくれません。 continue(2)とすると、 Cannot break/continue 2 levels in そんなに抜けられない!とエラーが出るので読み込んではいるんですが。

    • ベストアンサー
    • PHP
  • ループが無駄に複雑な気が…

    以下は私が作成したプログラムで、 1.form[4][4][4]の三次元配列に0~32のランダムな正の整数を入れる 2.このランダムな数値の同じものは2つまで 3.form[i][j][0]~form[i][j][3]には同じ数値が入ってはいけない という条件を考えて作成したのですが、無駄に複雑になった気がします。 このプログラムはform[i][j][0]~form[i][j][3]が入らないように、数値が被ったら最初からやり直しにしています。 この作り方だと、これ入れないと最後の1個が被ってしまうものだったら無限ループが起きてしまうので…。 この無駄に複雑になってしまった気がするプログラムを、もっとシンプルに出来ないでしょうか? import java.util.Random; public class Loop { public static void main(String[] args){ int num; int[] check=new int [32]; int[][][] form=new int[4][4][4]; Random rand=new Random(); int i=0,j=0,k=0; for(i=0;i<32;i++) check[i]=0; i=-1; while(true){ while(true){ while(i<3){ num=rand.nextInt(32); if(check[num]!=2){ i++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; if(0<k){ for(int l=0;l<k;l++){ if(form[i][j][k]==form[i][j][l]){//同じだったらループのやり直し for(int m=0;m<32;m++) check[m]=0; i=-1; j=0; k=0; } } } } } if(j==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } if(k==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j=0; k++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } for(i=0;i<4;i++){ for(j=0;j<4;j++){ for(k=0;k<4;k++){ System.out.println(k+" "+j+" "+i+" "+form[k][j][i]); } } } System.out.println("end"); System.exit(0); } }

    • ベストアンサー
    • Java
  • Loop後に変数が出力できないです

    最後のprintlnで、LabelBreak.java:13: シンボルを解釈処理できません。とi j kの変数が解釈できずコンパイルが失敗しますがなぜでしょうか? class LabelBreak { public static void main(String[] args) { for(int i = 0; i < 10; i++) { label1: for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { System.out.println("i = " + i + ", j = " + j + ", k = " + k); if(k == 3) break label1; } } } System.out.println("Loop end"); System.out.println("i = " + i + ", j = " + j + ", k = " + k); } } ^

    • ベストアンサー
    • Java
  • 何故ループがしてくれないんですか?

    口でいうよりもソースコード載せた方が早いので載せます import java.util.Scanner; class StudentsList2 { public static void main(String[] args){ System.out.println("学生番号(23,45,78,51,9)を入力してください>"); Scanner sc=new Scanner(System.in); StList list=new StList(); list.ID=new int[]{23,45,78,51,9}; list.name=new String[]{"荒川","神田","吉田","渡辺","木村"}; int key=Integer.parseInt(sc.next()); list.getName(key); } static class StList{ public String[] name; public int[] ID; void getName(int key){ for(int A=0; A<ID.length; A++){ if(key==ID[0]){ System.out.println(name[0]);break; }else{ if(key==ID[1]){ System.out.println(name[1]);break; }else{ if(key==ID[2]){ System.out.println(name[2]);break; }else{ if(key==ID[3]){ System.out.println(name[3]);break; }else{ if(key==ID[4]){ System.out.println(name[4]);break; } } } } } } } } } 例外処理もなくエラーもかえって来ないんですが一回しか学生名が出力しないです。 何故でしょうか? nameに入っている名前を出力しないといけないですよね。 「ここがおかしいよ」とかのアドバイスをお願いします

    • ベストアンサー
    • Java
  • JAVAのwhileループについての質問です

    こんばんわ。 javaのforループをwhileループ構文に書き換える問題で詰まっています。 僕はプログラミング超初心者なので、いろいろ考えたが、なかなか答えが出ていません。 ぜひ、わかる方に教えていただきたくここで質問させてもらいました。 ソースコードは以下です class S7j4{ public static void main(String args[]){ short a[] = {26,54,39,71,83,100,98,47,82,65}; short work; int i,j,n; n = 10; for (i = 0;i< n; i++) System.out.print(a[i] +" , "); System.out.println(); for(i = 0; i < n; i++) for(j = 0; j < n;j++) if(a[i] < a[j]){ work = a[i]; a[i] = a[j]; a[j] = work; } for(i = 0; i< n;i++) System.out.print(a[i] + " , "); System.out.println(); } } ぜひ一つよろしくお願いしますm(-_-)m

  • JAVAのfor文で困っています。

    JAVAの勉強をしていますが、本の練習問題でわからなくて困っています。for文で以下の処理を行いたいです(do,whileはなしです)が、 *を5個ごとに改行したいのですが、改行してくれません。 問題の部分↓ if (n % 5 == 0) System.out.println(); 何か良い方法はありませんか?お願いします。 ------------------------------------------------- //(数を読み込んで)だ個数だけ * を5個ごと改行しながら表示 int n = 0; for (int i = n; n <= 0;){ System.out.print("何個*を表示しますか : "); n = stdIn.nextInt(); } for (int i = 1; i <= n; i++){ System.out.print("*"); if (n % 5 == 0) System.out.println(); } ------------------------------------------------

    • ベストアンサー
    • Java
  • java for文、if文を使っての三角形

    例:1 23 456 78910 ・・・・・・のようにひょうじさせるプログラムを作成するのに、for文とIf文を使っての三角形を   作成したいのですが、If文の条件式が分からないのとどうしたら、上記のようなプログラムが   出来るのか教えてください。お願いします。 public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ // 行に表示させる個数を表現するための変数がないため今回、新たに変数を用意する。 int a = 1; //行の終わりを改行して1増やすための変数がないため今回、新たに変数を用意する。 int b = 1; // 1~100までの数字を用意する。 for (int i = 1; i <= 100; i++) { //変数iをSystem.out.printを使って変数iをコンソールの中に出力させる。 System.out.print(i); //System.out.println("")を使って改行する。 System.out.println(" "); //変数iに1増加して数字を順番にする。 i++; if(a <= i){ System.out.print(a);

  • 【C言語】二重forループ内でscanfを使ってchar型変数に数値(

    【C言語】二重forループ内でscanfを使ってchar型変数に数値(%d)を入力すると、きちんとループ処理されないのはなぜ? プログラムを下に用意しましたのでご覧下さい。 二重forループ内で入力を繰り返すプログラムです。 ついでに i j の値を出力するようにしました。 -----------------プログラム---------------- int main (void){ char input = 0; // 入力値 char型にするとforループでインクリメントエラー(int型にすると問題ない) int i = 0, j = 0; , printf("数値を入力して下さい。('-1' で入力終了)\n"); for( i=0 ; i<3 ; i++ ){ // i がちゃんとインクリメントされない for( j=0 ; j<3 ; j++ ){ scanf("%d", &input); // char 型変数に %d で入力すると、i がきちんとインクリメントされない printf("[i][j] = [%d][%d]\n", i, j); if( input == -1 ){ printf("入力を終了します。\n"); break; } } if( input == -1 ) break; } return 0; } ---------------------------------------- ---------実行結果(入力値はchar型)--------- 数値を入力して下さい。('-1' で入力終了) 1 2 3 4 5 6 7 8 9 [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] -1 [i][j] = [16777215][0] 入力を終了します。 ---------------------------------------- ----------実行結果(入力値はint型)---------- 数値を入力して下さい。('-1' で入力終了) 1 2 3 4 5 6 7 8 9 [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [1][0] [i][j] = [1][1] [i][j] = [1][2] [i][j] = [2][0] [i][j] = [2][1] [i][j] = [2][2] ---------------------------------------- ご覧の通り、char型変数に値を入力しているために、forループで i がきちんとインクリメントされません。 入力値は -128~127 の値しか想定していないので、メモリの消費を少しでも抑えようと思いchar型で宣言したのですが、思わぬ所でおかしな挙動が起こってしまいました。 int型で宣言すればいいだけなのですが、なぜこんな挙動になるのか知りたいです。 よろしくお願いします。

  • JAVAで素数判定

    JAVAの勉強をしてます 練習問題で、素数判定のプログラムをしているのですが。 1~14までの判定はうまくいきますが、15の判定の時に素数であると表示されて困ってます。どなたかわかりませんか? //読み込んだ数字 n が 15 の場合 if(n == 1) System.out.println("素数ではありません。"); if(n == 2) System.out.println("素数です。"); for (int i = 2; i < n; i++) { if (n % i == 0) { System.out.println("素数ではありません。"); break; } else { System.out.println("素数です。"); break; } } --結果---------------------------------------------- 素数です

    • ベストアンサー
    • Java

専門家に質問してみよう