第4週:場合分け


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 宿題

4.1 if

先週は同じことを繰り返すやり方を勉強しましたが、今度は、場合によって違 うことをするやり方を勉強しましょう。

縦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 文の書き方は次のようになります。
     if ( 条件 ) {
          成り立つ場合のブロック
     } else {
          成り立たない場合のブロック
     }

4.2 練習問題

次のプログラムはどのような図形を描くか予想しましょう。
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);
		}
	    }
	}
    }
}

実際に実行して、確認しましょう。

4.3 条件式

for 文の継続条件や、if 文の条件のところには、成り立 つか成り立たないかのどちらかであるような式を書きます。よく使われるのは、 数値や文字列の比較を行う式です。

4.4 練習問題

数値を入力し、X座標とY座標の合計がその数より小さければ赤い円を、以上な ら青い円を描くようなプログラムを作りなさい。

4.5 if 文の組み合わせ(1)

ある年が閏年かどうかを表示するプログラムを書いてみましょう。閏年かどう かは次の規則で決まっています。

  1. 西暦年が4で割り切れる年が閏年です。
  2. ただし、100で割り切れる年は閏年ではありません。
  3. ただし、400で割り切れる年はやっぱり閏年です。

条件1だけを考える if 文は次のようになります。

       if ( year % 4 == 0 ) {
           sfcOutput("Leap year");
       } else {
           sfcOutput("Ordinary year");
       }
整数変数 year に西暦年を代入してあるとします。% は、 割り算の余りを求める記号です。

条件2は、条件1が成り立つ場合に、さらにテストしなければいけないわけです から、上の if 文の条件が成り立つ場合のブロックに、さらに if 文を書きます。

       if ( year % 4 == 0 ) {
           if ( year % 100 == 0 ) {
               sfcOutput("Ordinary year");
	   } else {
               sfcOutput("Leap year");
	   }
       } else {
           sfcOutput("Ordinary year");
       }

4.6 練習問題

上の if 文を条件3も正しく判定するように書き換え、さらに SfcExample1 を使って西暦年を入力し、閏年かどうかを出力する完 全なプログラムにしなさい。正しいプログラムならば
1996Leap year
1900Ordinary year
2000Leap year
となるはずです。

4.7 if 文の組み合わせ(2)

上の 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 文を書 くと、ifelse の対応が分かりにくくなるので注意し ましょう。

        if (条件1) if (条件2) 文1 else 文2
は、
        if (条件1) { if (条件2) 文1 } else 文2
ではなく、
        if (条件1) { if (条件2) 文1 else 文2 }
と同じ意味です。

4.8 練習問題

前の練習問題のプログラムを、上の書き方に変更しなさい。

4.9 条件式の組み合わせ

if 文の組み合わせは、複数の条件を組み合わせた条件式を使って、 一つのif 文で書くこともできます。組み合わせるための記号は次の 通りです。
!否定
&かつ
&&かつ
|または
||または
&&&||| はほ ぼ同じ意味ですが、普通は &&|| を使います。

&| は両側の式を必ず計算しますが、 &&|| は左側の式を計算して結果が分かって しまった場合は、右側の式を計算しません。実行速度は速くなりますが、右側 の式が変数への代入などを含んでいる場合は注意が必要です。

例題の if 文は次のように書くこともできます。

       if ( year % 4 == 0 && year % 100 != 0 ) {
           sfcOutput("Leap year");
       } else {
           sfcOutput("Ordinary year");
       }

4.10 練習問題

前の練習問題のプログラムを、if 文を一つだけ使うように変更しなさい。

4.11 switch

条件式ではなく、式を計算した結果の値によって場合を分けることもできます。

次のように赤、白、青が繰り返し並んだ縞模様を描くことにします。

プログラムは次のようになります。
 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:
	        上のどれも成り立たない場合
	    }

4.12 練習問題

Tricolor.javaif 文を使って書き直しなさい。

4.13 宿題

  1. 次のような図形を描くプログラムを作りなさい。

  2. 英単語を入力し、それが "un" または "non" で始まるならそれを取り除いた 単語を、そうでなければそのまま表示するプログラムを作りなさい。ただし、 変数 s に入っている文字列から先頭 n 文字を取り除いた残りの文 字列は、s.substring( n ) で求められます。


慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 1999 慶應義塾大学