ループの回数の問題について

このQ&Aのポイント
  • ループの回数の問題について質問があります。
  • 質問者は、内側のforループがiが2のときにも実行されるという解説が理解できないと述べています。
  • 質問者は、iが2の場合には内部ループに入った時点でjも2になるべきだと考えているようです。
回答を見る
  • ベストアンサー

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

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
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

> continue文によりouterへ移動する > という所までは理解出来ます。 continue文は,ラベルouterへただジャンプするのではなく, ラベルouterが付けられた繰り返しブロックの次のループへ移る,という機能です。 次のループへ移る,ですから,増分が実行されます。 以下,iとjの変化のトレースです。 ---------------- i=0, j=0 … "Hello"表示 i=0, j=1 … "Hello"表示 i=0, j=2 … "Hello"表示 i=1, j=0 … "Hello"表示 i=1, j=1 … ラベルouterが付けられたブロック(外側のforブロック)の次のループへ。 continueなのでi++の増分はおこなわれる。 i=2, j=0 … "Hello"表示 i=2, j=1 … "Hello"表示 i=2, j=2 … "Hello"表示 … i==2なので外側のforブロックを終了(break)

taro_11
質問者

お礼

とても丁寧な解説、ありがとうございます。 ラベルとコンティニューの働きがよく分かりました。 とても感謝しております。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>for(int j=0; j<3; j++){ このループに入ったとき、jを0で初期化しています。 >iが2になるなら、内ループに入った時jも >2になるのではないのでしょうか。 iとjは別々の変数です。 iが何かの値を持っているからといって、 jがその値に影響されることはありません。

taro_11
質問者

お礼

回答ありがとう御座います。 かわいい猫ですね。

関連するQ&A

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

  • ループが無駄に複雑な気が…

    以下は私が作成したプログラムで、 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
  • continueでforループを抜けられません。

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

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

    口でいうよりもソースコード載せた方が早いので載せます 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

  • ループの正誤

    金種表のソースを書きました。 表示ループのif文(枚数0枚の場合表示しない)を実行しない場合は 正確の結果が出てくれるんですが、 このまま実行したら、たとえば引数は222の場合は 実行した結果は 「100円 2枚」、10円と1円の枚数を表示してくれなっかです。 原因を教えて頂けますか? ループのどこが間違えたのがわかりません… import java.io.*; public class ex1 { public static final int[] YEN_TYPES = {10000,5000,1000,500,100,50,10,5,1}; public static int[] getYenCount(int yen, int[] yentype) { int[] count = new int[yentype.length]; for (int i = 0; i < yentype.length; i++) { count[i] = yen / yentype[i]; //商 yen = yen % yentype[i]; //剰余 } return count; } public static void main(String args[]) throws IOException { int yen = Integer.parseInt(args[0]); int[] count = getYenCount(yen, YEN_TYPES); for (int i = 0; i < YEN_TYPES.length; i++) { if(count[i] == 0) { i++; }else{ System.out.println(YEN_TYPES[i] + "円\t" + count[i] + "枚"); } } } }

    • ベストアンサー
    • Java
  • 配列を使った・・・。

    配列を使って簡単な迷路を作っているのですが、なかなかうまくいきません。 0を" "1を"■"を表示させたいのですがうまくいきません。 何処を直せばいいのか教えてください。 public class Sample1 { public static void main (String[]args) { int [][] data = { {1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1}, {1,0,1,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1}, {1,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,1}, {1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,1,1}, {1,1,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,1}, {1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1}, {1,1,1,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,1,1}, {1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1}, {1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { System.out.print(data [i][j]); } if(data [i][j] = 1){ System.out.println("■"); }else{ System.out.println(" "); } } } }

    • ベストアンサー
    • Java
  • Java初歩。ループ問1~6の内1・2

    コンパイルの環境はあります。 『問題は、全て、 「forループ」を使って記述しなければなりません。 そして、 ループは、「forループのみ」と、限定されています。 (1)~(2)は、他にどんなやりかたがあるのか興味がありまして、質問させて頂きました。 (3)からは、ずっと試しているのですが、全くできません… (1) 100、50、200、150、300を管理している配列を作成し、その合計を実行結果のように 出力したいです。どう組めばよいのでしょうか? (1)の実行結果 800 (2) 100、50、200、150、300を管理している配列を作成し、その平均値を 実行結果のように出力する為にはどのようにくんだらよいのでしょうか?。 (2)実行結果 160 例えば、(1)はこんな感じでしょうか? class exercise_4_1 { public static void main(String args[]){ int a[] = new int[5]; a[0] = 100; a[1] = 50; a[2] = 200; a[3] = 150; a[4] = 300; int z = 0; for(int i = 0;i < args[0].length(); i++){ z += a[i]; } System.out.println(z); } (1)~(6)問目までありますので、よろしくお願いします。

  • ゴールドバッハの予想についてのプログラムなんですが・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムです。 ---------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- 『for(int i=1; i<=number; i++){ のループ、number まで回しているのが無駄である。素数判定は 2 以上、√number 以下の整数で割り切れれば素数でないのでループの上限は√number で良い。number まで回す必要はなく、i で割り切れた時点で prime=1 として 飛び出せばよい。ループを回り終わっても割り切れていなければ prime=2 で出る。』というコメントを、上に書いたプログラムを変更して表すにはどうしたら良いのですか?? 誰か教えて下さい(*_*) お願いします★

    • ベストアンサー
    • Java
  • javaのプログラムについて

    java始めたばかりの者です。 class sample1 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j=0; j<i; j++){ System.out.println("*"); } System.out.println("\n"); } } } これを実行すると * * * * * * * * * * * * * * * こうなってしまい * ** *** **** ***** このようにするにはどうしたらいいのでしょうか??

    • ベストアンサー
    • Java

専門家に質問してみよう