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:
上のどれも成り立たない場合
}