プログラム // コマンドラインに数字列を引数に与えて,>0の間加算して表示する class SumArgs{ public static void main(String[] args){ int sum=0,num; int i; // 文字列の配列 argsの要素数は args.length for(i=0;i< args.length;i++){ // 文字列からintへの変換 num=Integer.parseInt(args[i]); // 0以下の時は,break文によってfor文から抜ける. if(num<=0) break; // sumにnumの値を足し込む sum=sum+num; } // 表示する System.out.println("sum="+sum); } } 実行例 dell.tanaka.ecc.u-tokyo.ac.jp% java SumArgs 20 30 0 40 sum=50 dell.tanaka.ecc.u-tokyo.ac.jp% java SumArgs 20 30 40 sum=90一方,残りの繰り返し部分を飛ばすために用意されているのが continue文で ある.例を見てみる.
// コマンドラインに数字列を引数に与えて,>0の時は平方根を加算して表示する class SqrtSum{ public static void main(String[] args){ double sum=0.0; int i,num; // 文字列の配列 argsの要素数は args.length for(i=0;i< args.length;i++){ // 文字列からintへの変換 num=Integer.parseInt(args[i]); // 0以下の時は,以下の文は実行しない if(num<=0) continue; // sumにnumの平方根の値を足し込む sum=sum+Math.sqrt(num); } System.out.println("sum="+sum); } } 実行例 dell.tanaka.ecc.u-tokyo.ac.jp% java SqrtSum 10 20 -1 3 sum=9.366464422736836continue文はfor文の繰り返し文を飛ばすだけで,
for(i=0;i< args.length;i++){の i++ は実行することに注意して欲しい.上の例は実は,
// コマンドラインに数字列を引数に与えて,>0の時は平方根を加算して表示する class SqrtSum{ public static void main(String[] args){ double sum=0.0; int i,num; // 文字列の配列 argsの要素数は args.length for(i=0;i< args.length;i++){ // 文字列からintへの変換 num=Integer.parseInt(args[i]); // 0以下の時は,以下の文は実行しない if(num>0){ // sumにnumの平方根の値を足し込む sum=sum+Math.sqrt(num); } } System.out.println("sum="+sum); } }と continueを使わずに書けるのだが,ifなどの深いところに continue文を書 く場合は,このような書き換えができないこともある.
2重3重の繰り返し文の中での,break文,continue文はその文を含む最も内側 の繰り返し文に対応する.外側に対応させる時は,あらかじめラベル付の繰り 返し文としておいて,ラベル付のbreak文,continue文を使うと良い.この例を あげる.
プログラム // コマンドラインに数字列を引数に与えて,合成数を1つ見つけたら表示して終わる class FindNoPrime{ public static void main(String[] args){ int sum=0,num; int i,j; // 外側の for 文に toploop というラベルをつける toploop: for(i=0;i< args.length;i++){ num=Integer.parseInt(args[i]); if(num<=1) continue; for(j=2;j*j<=num;j++){ if(num%j==0){ System.out.println("合成数"+num+"をみつけました"); // この break 文は外側の for 文を抜ける break toploop; } } } // break で抜けなかった時の i の値は args.length になっている if(i==args.length) System.out.println("合成数は見つかりませんでした"); } } 実行例 dell.tanaka.ecc.u-tokyo.ac.jp% java FindNoPrime 3 7 1000 20 合成数1000をみつけました dell.tanaka.ecc.u-tokyo.ac.jp% java FindNoPrime 3 7 5 13 合成数は見つかりませんでした
break文やcontinue文にあたる制御文を用意していない昔のプログラミング言語では, などの解決策が取られた.いずれもプログラムが汚くなる(複雑に絡み あっているので,スパゲティプログラムと呼ばれることがある)ので,その反 省として1970年代に構造化プログラミングという考え方が生まれた.Cも含め て現在のプログラミング言語の多くは,この考え方に基づいている(あたりま えになったので,誰も構造化プログラミングなどと言わないが).
- ループの途中で,変数に特定の値を入れて次の終了判定時にその変数の 値をチェックする
- goto文という,自由な場所に制御を移すことのできる構文を用意する
プログラム class SwitchTest{ public static void main(String[] args){ int num=Integer.parseInt(args[0]); // numの値に応じて,「case 3」, 「case 2」, 「case 1」,「default」の // いずれかのラベルに分岐する switch(num){ // numの値が3の時はここに飛ぶ case 3: System.out.println("3は結構好きな数だ"); // この break は switch文から抜けることを意味する. break; // numの値が2の時はここに飛ぶ case 2: System.out.println("2も嫌いではない"); break; // numの値が1の時はここに飛ぶ case 1: System.out.println("1はそんなに好きではない"); break; // numの値が1, 2, 3以外の時はここに飛ぶ default: System.out.println(num+"は好きでも嫌いでもない"); break; } } } 実行例 dell.tanaka.ecc.u-tokyo.ac.jp% java SwitchTest 2 2も嫌いではない dell.tanaka.ecc.u-tokyo.ac.jp% java SwitchTest 4 4は好きでも嫌いでもない dell.tanaka.ecc.u-tokyo.ac.jp% java SwitchTest 1 1はそんなに好きではないこのような使い方の場合は,if-else文を使って以下のように書き直すことが できる.
class SwitchTest1{ public static void main(String[] args){ int num=Integer.parseInt(args[0]); if(num==3){ System.out.println("3は結構好きな数だ"); } else if(num==2){ System.out.println("2も嫌いではない"); } else if(num==1){ System.out.println("1はそんなに好きではない"); } else{ System.out.println(num+"は好きでも嫌いでもない"); } } }ここで,注意するのは,switchのラベルは単なる分岐先を表すラベルなので, breakを入れないと,続けて実行してしまうことである.実際,さきほどの break文をすべて取り去ると,
プログラム class SwitchTest2{ public static void main(String[] args){ int num=Integer.parseInt(args[0]); switch(num){ case 3: System.out.println("3は結構好きな数だ"); // breakがないので,続けて次の文を実行する case 2: System.out.println("2も嫌いではない"); // breakがないので,続けて次の文を実行する case 1: System.out.println("1はそんなに好きではない"); // breakがないので,続けて次の文を実行する default: System.out.println(num+"は好きでも嫌いでもない"); } } } 実行例 dell.tanaka.ecc.u-tokyo.ac.jp% java SwitchTest2 2 2も嫌いではない 1はそんなに好きではない 2は好きでも嫌いでもない dell.tanaka.ecc.u-tokyo.ac.jp% java SwitchTest2 1 1はそんなに好きではない 1は好きでも嫌いでもないとなってしまう.switch文で注意するのは以下の通り,
int x=100, y=100; switch(x){ case y: System.out.println("x==yです\n"); }などとは書けない.
Forbidden You don't have permission to access /~ktanaka/programming02/kadai1022.html on this server.とうメッセージが出てアクセ スできないはずである.17:00以降にも同様のエラーが出る時は,Shiftキーを 押しながら,再読み込み(Reload)を押してみること.