4. 1 if 文 4. 2 練習問題 4. 3 条件式 4. 4 練習問題 4. 5 if 文の組み合わせ(1) 4. 6 練習問題 4. 7 if 文の組み合わせ(2) 4. 8 練習問題 4. 9 条件式の組み合わせ 4.10 練習問題 4.11 switch 文 4.12 練習問題 4.13 宿題
先週は同じことを繰り返すやり方を勉強しましたが、今度は、場合によって違 うことをするやり方を勉強しましょう。
縦10個、横10個並べた円のうち、対角線上にあるものだけ中を塗り潰すことに します。
対角線上にあるということは、X座標とY座標の値が等しいということですから、 その時だけ別の処理をするようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.awt.*; class Diagonal extends SfcDoNothing { void sfcDraw (Graphics g) { for (int x = 0; x < 300; x = x + 30) { for (int y = 0; y < 300; y = y + 30) { if ( x == y ) { g.fillOval(x, y, 30, 30); } else { g.drawOval(x, y, 30, 30); } } } } } |
if ( 条件 ) { 成り立つ場合のブロック } else { 成り立たない場合のブロック }
次のプログラムはどのような図形を描くか予想しましょう。
import java.awt.*; class Diagonal extends SfcDoNothing { void sfcDraw (Graphics g) { for (int x = 0; x < 300; x = x + 30) { for (int y = 0; y < 300; y = y + 30) { if ( x == y ) { g.fillOval(x, y, 30, 30); } } } } } |
実際に実行して、確認しましょう。
for 文の継続条件や、if 文の条件のところには、成り立
つか成り立たないかのどちらかであるような式を書きます。よく使われるのは、
数値や文字列の比較を行う式です。
数値を入力し、X座標とY座標の合計がその数より小さければ赤い円を、以上な
ら青い円を描くようなプログラムを作りなさい。
ある年が閏年かどうかを表示するプログラムを書いてみましょう。閏年かどう
かは次の規則で決まっています。
条件1だけを考える if 文は次のようになります。
条件2は、条件1が成り立つ場合に、さらにテストしなければいけないわけです
から、上の if 文の条件が成り立つ場合のブロックに、さらに
if 文を書きます。
4.3 条件式
== 等号 != 不等号 < より小 > より大 <= 以下 >= 以上
equals 同じ文字列か equalsIgnoreCase 大文字小文字を区別しないとし
て、同じ文字列か startsWith 先頭がこの文字列で始まっているか endsWith 最後がこの文字列で終わっているか 4.4 練習問題
4.5 if 文の組み合わせ(1)
if ( year % 4 == 0 ) {
sfcOutput("Leap year");
} else {
sfcOutput("Ordinary year");
}
整数変数 year に西暦年を代入してあるとします。% は、
割り算の余りを求める記号です。
if ( year % 4 == 0 ) {
if ( year % 100 == 0 ) {
sfcOutput("Ordinary year");
} else {
sfcOutput("Leap year");
}
} else {
sfcOutput("Ordinary year");
}
4.6 練習問題
上の if 文を条件3も正しく判定するように書き換え、さらに
SfcExample1 を使って西暦年を入力し、閏年かどうかを出力する完
全なプログラムにしなさい。正しいプログラムならば
1996 | Leap year |
1900 | Ordinary year |
2000 | Leap year |
上の if 文は、条件とブロックの対応が分かりにくいので、見やす くなるように書き換えてみましょう。まず、条件を逆にして、成り立つ場合と 成り立たない場合を入れ替えます。
if ( year % 4 != 0 ) { sfcOutput("Ordinary year"); } else { if ( year % 100 != 0 ) { sfcOutput("Leap year"); } else { sfcOutput("Ordinary year"); } }ブロックは、複数の文をまとめて一つの文にするものです。ブロックに含まれ る文が一つだけなら、その文を直接書くのと同じことになります。上の、成り 立たない場合の if 文を、直接 else の後に書くと、次の ようになります。
if ( year % 4 != 0 ) { sfcOutput("Ordinary year"); } else if ( year % 100 != 0 ) { sfcOutput("Leap year"); } else { sfcOutput("Ordinary year"); }一般に、複数の条件を次々とテストして、それに応じた処理をするには、次の ように書くと、条件と処理の対応が分かりやすくなります。
if ( 条件1 ) { 条件1が成り立つ場合のブロック } else if ( 条件2 ) { 条件2が成り立つ場合のブロック } else if ( 条件3 ) { ........ ........ } else { それ以外の場合のブロック }
if (条件1) if (条件2) 文1 else 文2は、 if (条件1) { if (条件2) 文1 } else 文2ではなく、 if (条件1) { if (条件2) 文1 else 文2 }と同じ意味です。 |
if 文の組み合わせは、複数の条件を組み合わせた条件式を使って、 一つのif 文で書くこともできます。組み合わせるための記号は次の 通りです。
! | 否定 |
& | かつ |
&& | かつ |
| | または |
|| | または |
![]() ![]() |
例題の if 文は次のように書くこともできます。
if ( year % 4 == 0 && year % 100 != 0 ) { sfcOutput("Leap year"); } else { sfcOutput("Ordinary year"); }
次のように赤、白、青が繰り返し並んだ縞模様を描くことにします。
プログラムは次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.awt.*; class Tricolor extends SfcDoNothing { void sfcDraw (Graphics g) { for ( int n = 0; n < 10; n = n + 1 ) { switch ( n % 3 ) { case 0: g.setColor(Color.red); break; case 1: g.setColor(Color.white); break; case 2: g.setColor(Color.blue); break; } g.fillRect( n * 30, 0, 30, 300 ); } } } |
switch 文の書き方は次のようになります。
switch ( 式 ) { case 値1: 式==値1の場合 break; case 値2: 式==値2の場合 break; .......... .......... default: 上のどれも成り立たない場合 }