アルゴリズムとプログラミング (Algorithms and Programming) 第3回:条件分岐と繰り返し •(前回補足)文字型に関して •条件分岐 • if() ~ else • switch ~ case •繰り返し •for(;;) •do ~ while() •while()~ 講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html 条件分岐(1) if() - else (もし、()ならば~、そうでないなら~) 関係演算子 == != > < >= <= 式が真(True)となる条件 右辺と左辺が等しい 右辺と左辺が等しくない 左辺が右辺より大きい 左辺が右辺より小さい 左辺は右辺より大きいか等しい 左辺は右辺より小さいか等しい 条件式 例) if ( i == 1 ) { iが1と等しかったときの処理; } else { そうでないときの処理; } 中カッコで囲んで 複数の文を記述 if-else文の注意点 • { }を省略すると、直後の1行のみが実行の対象とな る。(1行のみでもなるべく中カッコを使った方がわかりやすい) • else文は不要なら省略可 • インデントは文法的には無意味だが、見やすさ、わ かりやすさのためには大変重要!! • コメント文とインデントを効果的に活用しよう 例)実行結果は? i = 1 ; if ( i > 1 ) System.out.println( i ); System.out.println( 2 * i ); 論理演算子 演算子 演算名 演算結果が真となる条件 & 論理積 左辺と右辺の両方が真 | 論理和 左辺と右辺のどちらか、または両方が真 ^ 排他的論理和 ! 否定 && 論理積 &と同じだが左辺がfalseなら右辺の評価は行わない || 論理和 |と同じだが左辺がtrueなら右辺の評価は行わない 左辺と右辺のどちらか一つだけが真 真偽の反転 if ( i > 0 && i <= 10 ) { iが0より大きくかつ10以下の場合の処理; } else { そうでないときの処理; } if文のネスト(入れ子) (~の条件を満たした上でさらに、もし、~だったら..) if ( m > 0 && m <= 12 ) { if ( d > 0 && d <=31 ) { System.out.println( “m= “ + m + “d= “ + d ); } else { System.out.println( “dの値が不正です” ); } } else { System.out.println( “mの値が不正です” ); } 複数の条件で条件分岐 ( else if ) (~ではなく、もし、~だったら..) if ( m > 0 && m <= 9 ) { System.out.println( “m=0“ + m ); } else if ( m > 9 && m <=12 ){ System.out.println( “m=“ + m ); } else { System.out.println( “mの値が不正です“ ); } m=5のときの動作 True m=5 if ( m > 0 && m <= 9 ) { System.out.println( “m=0“ + m ); } else if ( m > 9 && m <=12 ){ System.out.println( “m=“ + m ); } else { System.out.println( “mの値が不正です“ ); } 実行結果 m=05 m=10のときの動作 False m=10 if ( m > 0 && m <= 9 ) { System.out.println( “m=0“ + m ); } True else if ( m > 9 && m <=12 ){ System.out.println( “m=“ + m ); } else { System.out.println( “mの値が不正です“ ); } 実行結果 m=10 m=15のときの動作 False m=15 if ( m > 0 && m <= 9 ) { System.out.println( “m=0“ + m ); } False else if ( m > 9 && m <=12 ){ System.out.println( “m=“ + m ); } else { System.out.println( “mの値が不正です“ ); } 実行結果 mの値が不正です if else の省略表記(条件演算子?:) Sample1804.java class Sample1804 { public static void main(String[] args) { int i = 200 ; int j = (i > 100) ? 1 : 0 ; System.out.println(j); } } int j ; if( i > 100) j = 1 ; else j = 0 ; 値で条件分岐 switch() case switch ( 条件式 ) { case ラベル1: 処理1 case ラベル2: 処理2 case ラベル3: 処理3 ... default: 処理 } •条件式とcaseラベルを上から順に 比較していき、一致したところで処 理の実行に入る •一旦実行に入ったら、caseラベル との比較は行われず、上から順に 文が実行されるのみ •caseラベルは単にエントリーポイ ントを決めるだけ •処理から抜けるにはbreak文の挿 入が必要 •caseのどれとも一致しない場合は default:文が実行される(省略可) switch caseのサンプル:i=3の場合 class Sample1805 { public static void main(String[] args) { int i = 3 ; i=3 switch( i ) { case 1: iとの比較の結果、値が異なる!→次のcaseへ System.out.println( “one” ); break; case 2: 値が異なる!→次のcaseへ移る case 3: 値が一致!→対応する処理を実行する System.out.println( “two or three” ); break; switchの外へ抜ける default: System.out.println( “Out of range” ); break; } } } i = 2の場合 class Sample1805 { public static void main(String[] args) { int i = 2 ; i=2 switch( i ) { case 1: iとの比較の結果、値が異なる!→次のcaseへ System.out.println( “one” ); break; case 2: 値が一致!→ここから文の実行を開始する case 3: ラベルとの比較は行われず、文が逐次実行される System.out.println( “two or three” ); break; switchの外へ抜ける default: System.out.println( “Out of range” ); break; } } } i = 1の場合 class Sample1805 { public static void main(String[] args) { int i = 1 ; i=1 switch( i ) { case 1: 値が一致!→ここから文の実行を開始する System.out.println( “one” ); break; switchの外へ抜ける case 2: case 3: System.out.println( “two or three” ); break; default: System.out.println( “Out of range” ); break; } } } switch case文の動作と注意点 • caseラベルの値が上から順番に評価され、不一致な ら次のラベルの評価へ飛ぶ.一致すれば実行開始. • breakを入れないと、ラベルが不一致でも、次の文が 実行される • break文の後ろにもセミコロン ; が必要! • caseのどれにも当てはまらない場合はdefaultが実 行される。(省略可) • caseで指定できる値 – 数値リテラル – 文字リテラル – 変数や、文字列リテラルは不可 繰り返し(1) for文 for(開始時の実行文; 繰り返しの続行判断式 ; 繰り返すごとに最後に実行する文) { 繰り返したい内容; } class Sample1901 { public static void main(String[] args) { int i ; System.out.println(“ループに入ります”); for( i = 0 ; i < 10 ; i++ ){ System.out.println(“まわっています ” + i ); } System.out.println(“ループ終了しました!”); } class Sample1901 { public static void main(String[] args) { int i ; System.out.println(“ループに入ります”); True for( i = 0 ; i < 2 ; i++ ){ System.out.println(“まわっています ” + i ); } System.out.println(“ループ終了しました!”); } 実行結果 ループに入ります まわっています 0 変数の値 0 i=1 class Sample1901 { public static void main(String[] args) { int i ; System.out.println(“ループに入ります”); False for( i = 0 ; i < 2 ; i++ ){ System.out.println(“まわっています ” + i ); } System.out.println(“ループ終了しました!”); } 実行結果 ループに入ります まわっています 0 まわっています 1 ループ終了しました! 変数の値 i=2 1 for文の中だけで見える変数を宣言 class Sample1902 { public static void main(String[] args) { System.out.println(“ループに入ります”); for( int i = 0 ; i < 10 ; i++ ){ System.out.println(“まわっています ” + i ); } System.out.println(“ループ終了しました!”); } for文の外では変数iの値は参照・変更不可 for文のネスト ファイル名:Sample1903.java class Sample1903 { public static void main(String[] args) { System.out.println(“ループに入ります”); for( int i = 0 ; i < 3 ; i++ ){ for( int j = 0 ; j < 2 ; j++ ){ System.out.println(“まわっています ” + “i=“ + i + “ j=“ + j ); } } System.out.println(“ループ終了しました!”); } } 繰り返し(2) while文, do while文 while(条件式){ 繰り返し処理の内容 } do { 繰り返し処理の内容 }while(条件式); セミコロンを忘 れない!! 条件式を評価するタイミング: 処理を実行する前か、一度実行した後か クイズ:for文はどちらに近いか? while文の例 class Sample2001 { public static void main(String[] args) { int i = 0; System.out.println(“ループに入ります”); while( i < 10 ){ System.out.println(“i=” + i ); i++; } System.out.println(“ループ終了しました!”); } do while文の例 class Sample2002 { public static void main(String[] args) { int i = 0; System.out.println(“ループに入ります”); 条件によらず必ず1度は実行される do { System.out.println(“i=” + i ); i++; } while( i < 10 ); System.out.println(“ループ終了しました!”); } 途中で強制的にループを抜ける (for, while, do whileループ中で使用可) break文: breakが含まれているループの外へ強制脱出 continue文: ループブロック内で、continueより後ろに残っ ている文の実行を中止(ループからは脱出し ない) break文のサンプル class Sample2003 { public static void main(String[] args) { int i = 0; System.out.println(“ループに入ります”); while( i < 10 ){ System.out.println(“i=” + i ); if( i == 5 ) break; ループの外へ i++; } System.out.println(“ループ終了しました!”); } continue文のサンプル class Sample2004 { public static void main(String[] args) { System.out.println(“ループに入ります”); for(int i = 0;i < 3; i++) { for(int j = 0;j < 3; j++) { if( j == 1 ) continue ; System.out.println(“i=” + i + “ j=“ + j ); } continue文の実行により、forループの残りの 文がスキップされる。ループからは出ない。 } System.out.println(“ループ終了しました!”); } } まとめ • 条件分岐 – if-else – switch case – 関係演算子、論理演算子 • 繰り返し – for – while – do while – break, continue
© Copyright 2024 ExpyDoc