• ベストアンサー

繰り返しの中断(break)についての質問

class BreakTest3{ public static void main(String[] args){ int i=0; // リンゴの個数 int sum=0; // 合計額 while(true){ sum=sum+60; if(sum > 1000){ break; }   i=i+1; } System.out.println("60円のりんごは1,000円で" + i + "個買えます"); } } というソースファイルをコンパイルしてクラスファイルを実行すると 60円のりんごは1000円で16個買えますと表示されるのに 10行目のi=1+1;を6行目と7行目の間にいれてコンパイルし クラスファイルを実行すると60円のりんごは1000円で17個買えます と出ます。 これがどうしても理解できません。なぜ変わるんですか? よろしくお願いします。

noname#60127
noname#60127
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
noname#42542
noname#42542
回答No.2

まず、ループ内のif文を取り除くと、sumとiの関係は、 sum = i * 60 であるのが分かります。 そして、whileループからの脱出の条件が、「sumが1000を超えたとき」ですので、sum = sum + 1の直後にiの加算を行うと、i * 60の値は必然的に1,000円を超えてしまいます。 つまり、breakの後に i = i + 1; を配置することで、この 関係を断ち切っているわけです。 もし6行目の直後にiの加算を置きたい場合は、最終結果を i - 1 で出力すればいいわけです。

noname#60127
質問者

お礼

お二方回答ありがとうございます。よく理解できました。

その他の回答 (1)

回答No.1

class BreakTest3{ public static void main(String[] args){ int i=0; // リンゴの個数 int sum=0; // 合計額 while(true){ sum=sum+60; System.out.println("sum_1:" + Integer.toString(sum)); System.out.println("i_1:" + Integer.toString(i)); if(sum > 1000){ break; } i=i+1; System.out.println("sum_2:" + Integer.toString(sum)); System.out.println("i_2:" + Integer.toString(i)); } System.out.println("60円のりんごは1,000円で" + Integer.toString(i) + "個買えます"); } } ======== class BreakTest4{ public static void main(String[] args){ int i=0; // リンゴの個数 int sum=0; // 合計額 while(true){ sum=sum+60; i=i+1; System.out.println("sum_1:" + Integer.toString(sum)); System.out.println("i_1:" + Integer.toString(i)); if(sum > 1000){ break; } System.out.println("sum_2:" + Integer.toString(sum)); System.out.println("i_2:" + Integer.toString(i)); } System.out.println("60円のりんごは1,000円で" + Integer.toString(i) + "個買えます"); } } って書くと変数の変化がわかりやすいかな?

関連するQ&A

  • javaプログラミングの質問です。

    プログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } }

    • ベストアンサー
    • Java
  • プログラムの平均値の出し方。

    プログラムの平均値の出し方。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } } このプログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。

  • コマンドライン引数を用いて。

    コマンドライン引数を用いて足し算をさせるプログラムです。 class goukei{ public static void main(String args[]){ int i, count; int sum = 0; int a[]; count = args.length; for(i=0; i<args.length; i++){ int arg_i = Integer.parseInt(args[i]); sum = sum + arg_i; } System.out.println("引数の数は" + count); System.out.println("合計は" + sum); } } と考えたのですが、もっとこうしたほうがいいという部分があれば教えてください。 一応これでできているとは思うのですがイマイチ自信がありません・・・。

    • ベストアンサー
    • Java
  • 最大値と最小値の求め方

    以下はコマンドライン引数で任意の数の整数を受け取って、合計・平均・最大・最小を求めようとしたソースです。 しかし、実行したら最大値と最小値が正しく出ませんでした。 if文が間違っているのかもしれないと思ったのですが、はっきりと『ここが間違っている』という場所が分かりません。 どうかご指摘お願いします。 class Choco { public static void main (String[] args) { int i; int sum = 0; int max; int min; for ( i=0; i<args.length; i++) sum += Integer.parseInt(args[i]); double ave = sum/args.length; max = args.length; min = args.length; if (args.length>max){ max = args.length; } if (args.length<min){ min = args.length; } System.out.println("合計は" + sum + "です。"); System.out.println("平均は" + ave + "です。"); System.out.println("最大値は" + max + "です。"); System.out.println("最小値は" + min + "です。"); } }

    • ベストアンサー
    • Java
  • 質問です。

    コンパイルはできるのですが、実行するとExption in thread"main"java.lang ArrayIndex0ut0fBoundsExcept ion :0 at java1_1.main(java1_1.java:19と表示をされてしまってできません。教えてください。宜しくお願いします。 /* 実行時引数を受け取り乱数を設定 */ class java1-1 { public static void array_syokika(int a[]) { for(int i = 0; i < a.length; i++) { a[i] = (int)(100 * Math.random()); } } public static void main(String args[]) { int num = Integer.parseInt(args[0]); int a[] = new int[num]; array_syokika(a); for(int i = 0; i < a.length; i++) { System.out.println("a[" + i + "]=" + a[i]); } } }

    • ベストアンサー
    • Java
  • javascript for 記述について

    現在簡単な記述につとめています。 for文について、 public class java1 { public static void main(String[] args) { int sum = 0; int i = 0; for(;i<=0;){ sum += 2;   i += 1; } System.out.println(sum); } } ようなものを作った時に、 出力は2でした。 しかし、上記の式はiが0回になるまで繰り返す、という意味ですので iはすでに0ですので、結果的にsum += 2は1度も計算されないはずです。 (ということで自分の予想は0でした。) なぜ1度も実行式が実行されていいないのにこのような結果になるのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Java
  • Javaの問題で教えてください

    Java初心者の者です。 どうしてもわからないので何方か教えてください。 クラスを完成させて 計算結果(60)を表示させないといけない問題なのですが・・ class Example{ //↓ここから  //↑ここまでのロジックを考えなければならないのですが・・ } class sub1{ public static void main(String args[]){ int i=10; int j=20; int k=30; int sum=0; //電卓クラスの呼び出し  Example example=new Example(); sum=example.dentaku(i,j,k); System.out.println("合計は"+sum+"です"); } } 矢印のロジックのところがわかりません。 どなたか教えてください。。

  • java 素数判定

    入力した数字が整数か否かを判定するjavaプログラムを作っています。 以下の通りコンパイルして実行しました。これだと実行したときに どんな数字を数字を入力しても「31は素数です。 」となります。 入力した数字を判定させるにはどのようにしたらいいのでしょうか? class Sosuu { public static void main (String[] args) { int n = 31; boolean isPrime = true; for (int i = 2; i <= n - 1; i++) if (n % i == 0) { isPrime = false; break; } if (isPrime) System.out.println(n + " は素数です。"); else System.out.println(n + " は素数ではありません。"); } }

    • ベストアンサー
    • Java
  • javaの配列とクラス

    abstract class abstract_class{ } class subclassA extends abstract_class{ int num = 1; } class subclassB extends abstract_class{ int num = 2; } class subclassC extends abstract_class{ int num = 3; } class Main{ public static void main(String args[]){ int sum = 0; abstract_class var[] = new abstract_class[3]; var[0] = new subclassA(); var[1] = new subclassB(); var[2] = new subclassC(); for(int i=0;i<3;i++) sum += var[i].num; System.out.println(sum); } } これをコンパイルすると Main.java:23: シンボルを見つけられません。 シンボル: 変数 num 場所 : abstract_class の クラス for(int i=0;i<3;i++) sum += var[i].num; ^ エラー 1 個 というエラーが出るのはなぜでしょうか? var[i]はみなsubclassA,subclassB,subclassCが代入されているのに、numはabstract_classの変数となっています。 よくわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのローカル変数について

    基本的なことの質問ですがよろしくお願いいたします。 下記の様なソースコードでint y ;はローカル変数にあたると思いますが 確かローカル変数は初期化されないとコンパイルエラーになるはずなのですが どうもコンパイルも実行もできます。 どうしてでしょうか? よろしくお願いいたします。 class Test1{ static int x = 0; } public class Test extends Test1{ public static void main(String args[]){ Test i = new Test(); int y ; y = ++x; System.out.println( y ) ; } }

    • ベストアンサー
    • Java