(1) Javaのswitch-case文の構文や使い方を紹介
(1-1) switch-caseの構文
(1-2) else-if文との比較
(2) サンプルプログラムの紹介
(2-1) サンプルプログラムの概要
(2-2) サンプルプログラム(main文側)
(2-3) サンプルプログラム(RobotArm側)
(2-4) 操作動画
(1) Javaのswitch-case文の構文や使い方を紹介
通常は、多数の分岐があってその中から1つを通る場合は「else if」文を使って分岐のパターンを記述していきます。
しかし、もし分岐の数が多い場合は「else if」を繰り返し記述するよりは「switch-case」文を使う方がプログラムがスマートになったり、該当条件に直接飛ぶ事で「else if」の条件判定を繰り返すよりも処理が効率化できるケースがあります。
(1-1) switch-caseの構文
switch-case文の構文は次の通りです。
(構文)
//①評価式の値チェック switch (評価式) { //②該当caseに飛ぶ case 定数1: 文 break; case 定数2: 文 break; … //③defaltラベル default: 文 }
もし一致するcaseがないケースは「default」ラベルがあればdefault文に飛びます。
(1-2) else-if文との比較
冒頭で「switch-case」文を使うと「else-if」文を使う方がプログラムがスマートになると書いていますが、実際にどのように違うのか?を視覚的に捉えるために、同じ内容のプログラムを両方の書き方で書いたものをそれぞれ紹介します。
①「else-if」文の例
char grade = 'pass'; if( grade == 'pass' ){ System.out.println( "合格!" ); } else if(grade == 'fail'){ System.out.println( "不合格・・orz" ); } //...(続く) else{ System.out.println( "不明・・orz" ); }
②「switch-case」文の例
char grade = 'pass'; switch ( grade ) { case 'pass': System.out.println( " 合格! " ); break ; case 'fail': System.out.println( " 不合格・・orz " ); break ; //...(続く) default : System.out.println( " 不明・・orz " ); }
(2) サンプルプログラムの紹介
(2-1) サンプルプログラムの概要
今回紹介するプログラムはUFOキャッチャーのアームの座標の制御を模したプログラムを紹介します。プログラムの構造は次のようになっています。
(図211)
まずプログラムを実行すると、コンソールから指示を入力します(※上、下、右、左の4種類の指示が出せます)。
指示を入力するとUFO_Catcherクラスのmain文に入り、そこからRobotArmクラスのmoveArm()メソッドが実行されて、座標の再計算などが実行されます。
(2-2) サンプルプログラム(main文側)
main文側のプログラムです。「2」で次に紹介するRobotArmクラスのインスタンスを作り、アーム座標の管理や座標移動を行っています。
import java.util.Scanner; public class IT0131_UFO_Catcher { public static void main(String[] args) { //1:コンソールからの入力を受ける「Scanner」クラスのインスタンス化 Scanner sc = new Scanner(System.in); //2:ロボットアームの座標管理やアーム移動をするための // 「RobotArm」クラスをインスタンス化 IT0131_RobotArm rb = new IT0131_RobotArm(); //3:while(true)は無限ループなので、内部でbreakするまで処理を続ける while(true) { //4:コンソールからコマンド(UP/DOWN/LEFT/RIGHT)入力を求める文言表示 System.out.print("Enter Command : "); //5:コンソールから入力された内容(コマンド)を受け取る String in = sc.next(); //6:moveArmメソッドを実行して、結果がtrueかfalseかで分岐します // falseの場合は「if(!rb.moveArm(in))」の部分を通ります // // moveArm()メソッド内部の処理は、 // 次の「サンプルプログラム(座標操作側)」を参照ください if(!rb.moveArm(in)) { //7:[A]再計算された座標が(5×5)マスの範囲外 OR // [B]コマンドがnullの場合は「Error」を返します // ※エラーとなっても、次の操作で範囲内に復活できればOK System.out.println("("+rb.Xpos+","+rb.Ypos+")\r\nError\r\n"); } else { //8:移動後の座標がOKなら、マス目(5×5)の文字列を生成 String out = ""; for(int i=0; i<5 ; i++) { for(int j=0; j<5; j++) { if(i==rb.Ypos && j==rb.Xpos) { out = out + "○"; }else { out = out + "ー"; } } out = out + "\r\n"; } //9:座標とマス目(5×5)をコンソールに表示 System.out.println("("+rb.Xpos+","+rb.Ypos+")\r\n"+out+"\r\n"); } } } }
(2-3) サンプルプログラム(RobotArm側)
こちらはアームの座標(Xpos,Ypos)の管理や、座標の移動(上下左右)を行い、再計算後の座標を評価(範囲内チェック)します。
public class IT0131_RobotArm { int Xpos = 0; int Ypos = 0; boolean moveArm(String dir) { //①最初に入力されたコマンドを使い、座標を再計算します(switch文) switch(dir) { case "UP": --Ypos; break; case "DOWN": ++Ypos; break; case "RIGHT": ++Xpos; break; case "LEFT": --Xpos; break; default: return false; } //②次の条件に該当する場合はfalseを返します(OR条件) // [A]再計算された座標が範囲外(5×5のマス目外になってしまった場合) // [B]コマンドがnullの場合 if(dir==null || Xpos < 0 || Ypos < 0 || Xpos > 4 || Ypos > 4) { return false; } return true; } }
(2-4) 操作動画
上記プログラムを実際に操作した動画です。コンソールに値を入力すると文字が「緑色」になっています。アームの座標が5×5のマス目を外れると「Error」が返ってきます。しかし、次の移動で再び5×5に収まれば、再びマス目が描画されます。
(動画)