前回の if 文や if ~ else 文は条件分岐ですが、条件分岐するパターンはたくさんあります。
条件分岐が連続すると if 文では入れ子構造になりすぎてわかりづらくなってしまいます。
そのようなときは switch 文を使う方がわかりやすくなります。
今回は switch 文について説明します。
switch文
▶ switch 文は一見かなり複雑ですが1つずつ説明していきます。
まず switch ( 式 ) の中に条件式を記述します。(これは if 文と同じです)
{ }の中に case という命令を使用します。
この case 値1というのは値1の場合と解釈してください。
その下に命令文を記述します。同様に値3まで命令文を記述します。
どのように理解するかというと switch 文は if 文とは違い、条件式を満たした場合に実行する内容をどこからいくかを示してくれるものです。
例えば switch ( 式 ) の中に数字の2を入れてみます。
値が2なので値1は飛ばされ、値2からその後(下)の命令文は順番にすべて実行されます。caseの値は入り口がどこになるのかを示します。
もし(式)の中身が値1だった場合は、値1~値3とそれ以降の命令文はすべて実行されます。
ですがこのままでは出力が膨大な量になってしまいます。
そこで switch 文は break 文と組み合わせることでかなり柔軟に条件分岐に対応できるようになります。
例えば条件式の中身が2だとします。
すると case 値1は飛ばされ case 値2から命令文が実行されます。
そして、 case 値2だけ実行してこれ以降は実行しないでください、とコンピューターに命令を与えたい場合は命令文の後に break ; と記述します。
すると }の外に飛ばされます。そして命令文5が実行されます。
break 文1個で switch 文から抜けることが可能になります。
default というのは、その他という意味です。
条件式の値が1,2,3のいずれでもなければ default の命令文が実行されます。
switch 文の例1
- switch ( score ) {
- case 1 :
- System . out . println ( ” もっと頑張りましょう ” ) ;
- break ;
- case 2 :
- System . out . println ( ” 頑張りましょう ” ) ;
- break ;
- case 3 :
- System . out . println ( ” そこそこです ” ) ;
- break ;
- case 4 :
- System . out . println ( ” まぁまぁです ” ) ;
- break ;
- case 5 :
- System . out . println ( ” よくできました ” ) ;
- break ;
- default :
- System . out . println ( ” 想定されていない点数です ” ) ;
- }
- System . out . println ( ” switch ブロックを抜けました ” ) ;
switch ( score ) ⇐ ( )の中身は変数だと思ってください。
この score の値(点数)が1~5の場合とそれ以外の場合の命令文を記述します。
score の値(点数)が2だった場合 case 2 から命令文がスタートします。
そして break ; が記述されているので、それ以降の命令文は飛ばされ最後の }の外に飛びます。
最後の1文の命令文が実行されます。
default は1~5以外の点数、例えば7が指定されると出力される命令です。
- class Switch {
- public static void main ( String [ ] args ) {
- int score = 1 ;
- switch ( score ) {
- case 1 :
- System . out . println ( ” もっと頑張りましょう ” ) ;
- break ;
- case 2 :
- System . out . println ( ” 頑張りましょう ” ) ;
- break ;
- case 3 :
- System . out . println ( ” そこそこです ” ) ;
- break ;
- case 4 :
- System . out . println ( ” まぁまぁです ” ) ;
- break ;
- case 5 :
- System . out . println ( ” よくできました ” ) ;
- break ;
- default :
- System . out . println ( ” 想定されていない点数です ” ) ;
- }
- System . out . println ( ” switch ブロックを抜けました ” ) ;
- }
- }
出力結果は
もっと頑張りましょう
switch ブロックを抜けました
の2行が出力されます。
この switch 文の本質は条件分岐ではありますが、どこから実行するかを選択するものです。
switch 文の例2
- switch ( score ) {
- case 1 :
- case 2 :
- System . out . println ( ” 不合格です ” ) ;
- break ;
- case 3 :
- case 4 :
- case 5 :
- System . out . println ( ” 合格です ” ) ;
- break ;
- default :
- System . out . println ( ” 想定されていない点数です ” ) ;
- }
先ほどの例では1~5までの数字(点数)それぞれに1つずつ命令文を記述しました。
実際のプログラムではある範囲をまとめて表示したり、実行しないものもあります。
上の記述例では値(点数)が1,2の場合まとめて「不合格です」と出力されます。
3点以上の場合は「合格です」と出力されます。
case 1 は空っぽで何も実行されませんが、 break 文が記述されていないため次の case 2 が実行されるというわけです。
- class Switch2 {
- public static void main ( String [ ] args ) {
- int score = 5 ;
- switch ( score ) {
- case 1 :
- case 2 :
- System . out . println ( ” 不合格です ” ) ;
- break ;
- case 3 :
- case 4 :
- case 5 :
- System . out . println ( ” 合格です ” ) ;
- break ;
- default :
- System . out . println ( ” 想定されていない点数です ” ) ;
- }
- }
- }
出力結果は 合格です
が出力されます。
int score の後に色々な数字を入れて、プログラム通りに出力されるかをためしてみましょう。
break を忘れないように記述しましょう。
練習問題1
次の switch 文で変数 i の値が1,2,3,4,5のとき、それぞれどのような結果が得られるか予測してください。また実際に記述してためしてみましょう。
- switch ( i ) {
- case 1 :
- System . out . println ( ” A ” ) ;
- case 2 :
- break ;
- case 3 :
- System . out . println ( ” B ” ) ;
- case 4 :
- default :
- System . out . println ( ” C ” ) ;
- }
解説
答え
- 1を代入: A
まず case 1 の命令文が実行されます。case 2 の命令文も実行されますが、なにも記述されていないため出力されません。case 2 の後に break 文が記述されているためこのタイミングで switch 文を抜けます - 2 を代入: 何も出力されない
命令文が何も記述されていないため、何も実行されません。そのまま switch 文を抜けます。 - 3 を代入: B , C
case 3 の命令文から実行されます。break 文がないため、その後の命令文が順番に実行されます。case3 , case 4 , default が実行されます。 - 4 を代入: C
case 4 の命令文は記述されていないので、何も実行されませんが次の default は実行されます。 - 5 を代入: C
case 1 ~ 4 のいずれにも該当しないため default が実行されます。
論理演算子
算術演算子は四則演算の際に用い、関係演算子は2つの値を比較するためのものでした。
今回は論理演算子について説明します。
算術演算子に関してはこちらをご参照ください。
関係演算子に関してはこちらをご参照ください。
▶論理演算子をつかって複数の条件式を組み合わせられる
演算子 | 演算の名前 | 式が true になる条件 | 使用例 |
---|---|---|---|
&& | 論理積 | 左辺と右辺の 両方が true のとき |
a > 0 && b < 0 (変数 a が 0 より大きく、かつ b が 0 より小さい場合に true ) |
l l | 論理和 | 少なくとも 左辺と右辺のどちらかが true のとき |
a > 0 ll b < 0 (変数 a が 0 より大きい、または b が 0 より小さい場合に true ) |
^ | 排他的論理和 | 左辺と右辺の どちらかが true で 他方が false のとき |
a > 0 ^ b < 0 (変数 a が 0 より大きく、かつ b が 0 より小さくない場合に true , または a が 0 より大きくなくかつ b が 0 より小さい場合に true ) |
! | 否定 | 右辺が false のとき (左辺はなし) |
! ( a > 0 ) (変数 a が 0 より大きくない場合に true ) |
※ & は数字の6の上にあります。shift + 6
| は BackSpace の隣にあります。shift + ¥
^ は数字の並びの右の方にあります。Mac の場合は Delete の左2つめあたりにあります。shift なし 機種によって異なります。
論理演算子の例
・ age が13以上かつ age が65未満
- age >= 13 && age < 65
・ age が13未満または age が65以上
- age < 13 || age >= 65
・ age が13以上かつ age が65未満かつ20でない
- age >= 13 && age < 65 && age != 20
- 13以上という表現は=を付けます。13も含むという意味です。13を含まない場合は~より大きいという表現になります。
- 65未満という表現には65は含まれません。
演算子の優先度
▶数学では加減よりも剰余の方が優先的に計算されます。それと同様に演算子にも優先順位があります。
- 算術演算子が関係演算子より優先される一番優先されるのは「算術演算子」です。( )なしでも>よりも関係演算子の方が先に計算されます。
a + 13 > b * 6 = ( a + 13 ) > ( b * 6 )
- 関係演算子が論理演算子より優先される( )なしでも関係演算子の方が先に計算されます。
a > 13 && b < 6 = ( a > 13 ) && ( b < 6 )
- ( )のつけ方で論理演算の結果が異なる論理演算子を先に計算したい場合は( )で囲みます。( )の中が優先的に計算されます。
x && ( y | | z ) ≠ ( x && y ) | | z
望む通りの結果を得たいときには、常に演算式を書くときはこの優先順位に注意する必要があります。
練習問題2
日常の生活を見まわして、複数の条件の組み合わせに応じて処理が変化するものを探してみましょう。
それを論理演算子を使って表現してみましょう。
計算でなくてもかまいません。
- 例:
- i f ( 曜日 == 日曜 && 天気 != 雨) {
- 買い物にでかける
- }
「曜日が日曜日と等しい」かつ「天気は雨ではない」2つの条件(if)があります。
この2つの条件を満たすときに「買い物にでかける」ということです。
if ~ else 文なども使って複雑なものにチャレンジしてみましょう。
練習問題3
変数 a , b , c に関する次の文章を論理演算子を使った条件式で表しましょう。
- a は b より大きい,かつ, b は c より大きい
- a は b より小さい,または, a は c より小さい
- a , b , c の中で, c が一番大きい
- c > b > >a の大小関係がある
- a は c と等しいが, a は b と等しくない
- a は b の2倍より大きく, a は b の3倍より大きくない
解答
- a は b より大きい,かつ, b は c より大きい
a > b & & b > c - a は b より小さい,または, a は c より小さい
a < b | | a < c - a , b , c の中で, c が一番大きい
a < c & & b < c
a は b より小さい,かつ b も c より小さいという2つの条件を満たしていれば c が一番大きいということになります。 - c > b > a の大小関係がある
a < b & & b < c
c > b & & b > a の順番で記述してかまいません。 - a は c と等しいが, a は b と等しくない
a == c & & a != b - a は b の2倍より大きく, a は b の3倍より大きくない
a > b * 2 & & a <= b * 3
a > b * 2 には( )を付けても付けなくてもどちらでも大丈夫です。
算術演算子は論理演算子よりも優先されます。
まとめ
switch 文の考え方を利用すると、電車の券売機やインターネットでの入力がどのような仕組みなのかが理解できるようになると思います。
演算子の考え方は複雑ですが、日常生活の中でいろいろな条件で考えるくせをつけていくと
プログラムを記述することが楽しくなってくると思います。