• 検索結果がありません。

複数の分岐条件

ドキュメント内 i I Java Java Java (ページ 54-58)

第 2 章 Java 言語の基本的な文法 I 5

2.12 条件分岐

2.12.4 複数の分岐条件

if文では、場合分けは2 通りしかできませんので、3 つ以上の場合分けの場合は、次のように入れ子のif文を用 いて書きます。例えば、変数xに入っている値が正か零か負かで分岐させたいときなど。

if( 分岐条件1 ) { if( 分岐条件2 ) {

// 分岐条件1が true で、分岐条件2が true の時に行う処理 } else {

// 分岐条件1が true で、分岐条件2が false の時に行う処理 }

} else {

if( 分岐条件3 ) {

// 分岐条件1が false で、分岐条件3が true の時に行う処理 } else {

// 分岐条件1が false で、分岐条件3が false の時に行う処理 }

}

もちろん、いずれのelse ブロックも省略できます。

問題 2.12.7. 2つのint変数xとyの値がそれぞれの偶奇の組み合わせ4 パターンの場合分けをして、それぞれで

「xは偶数で、yは奇数でした」のような出力を行う処理を書きなさい。

問題 2.12.8. int変数xに入っている値が正か零か負かで分岐して、それぞれで「xは正値でした」「xは零でした」

「xは負値でした」と出力する処理を書きなさい。

この問題の解答を次のように書く人が結構います。

if( x > 0 ) {

System.out.println( "x は正値でした" );

}

if( x == 0 ) {

System.out.println( "x は零でした" );

}

if( x < 0 ) {

System.out.println( "x は負値でした" );

}

決して間違ってはいませんが、例えば、x=1の場合で、「正値でした」と出力した場合でも、その後の2 つの判定式を 無駄に行ってしまうことに気付きますか。また、この程度の判定なら、3 つの判定式のいずれにも引っかからない値が 無いことはわかりますが、もし判定式が複雑なら、いずれの式もtrueとならない値があった場合、何も出力無く終わ るんだな!とか、複数の判定式に trueとなるのもあるのかな?とか余計な判断が湧いてきますね。

問題 2.12.9. int型の変数vote の値を1、2、3 とそれ以外、の4 通りの場合分けをし、それぞれで「賛成」「反対」

「棄権」「無効」の文字をコンソールに出力するプログラム Vote.javaを作りなさい。

ソースコード2.25 Vote.java (投票プログラム) package section0212;

public class Vote {

public static void main(String[] args) { int vote = 1;

// 以下に投票された値で場合分けして結果を出力する }

}

この問題の解答も次のように書く人が結構います。

int vote = 1;

if( vote == 1 ) {

System.out.println( "賛成" );

}

if( vote == 2 ) {

System.out.println( "反対" );

}

if( vote == 3 ) {

System.out.println( "棄権" );

} else {

System.out.println( "無効" );

}

見た目はシンプルですが、こちらも無駄が多い上にミスもあるプログラムです。例えば、vote == 1の場合に「賛成」

の文字を出力後でも、残りの2 つのif文のチェックを無駄に行ってしまいます。そして、最後のvote == 3の判定 でelseブロックに入り「無効」を出力してしまいます。多重の条件分岐の書き方をしっかりと学んでおいて下さい。

さて、分岐条件の入れ子状態が何重にもなってくると少々各ブロックが冗長に見えてきます。

if( x > 0 ) { if( y > 0 ) {

// x 0 かつ y 0 の時に行う処理 } else {

// x 0 かつ y 0 の時に行う処理 }

} else {

if( y > 0 ) {

// x 0 かつ y 0 の時に行う処理 } else {

// x 0 かつ y 0 の時に行う処理 }

}

そこで、Javaでは、elseブロック内の 最初のifブロックを次のように書くことができます。上下を比較して、そ の使い方を理解して下さい(中かっこの対が1つ減っています)。

if( x > 0 ) { if( y > 0 ) {

// x 0 かつ y 0 の時に行う処理 } else {

// x 0 かつ y 0 の時に行う処理 }

} else if( y > 0 ) {

// x 0 かつ y 0 の時に行う処理 } else {

// x 0 かつ y 0 の時に行う処理 }

この書き方を利用すると、複数の選択肢で条件分岐する場合も以下のように書くことができます。

int x = 123;

if( x == 2 ) {

// x2の時に行う処理 } else if( x % 2 == 0 ) {

// x 2 以外の偶数の時に行う処理 } else if( x > 2 ) {

// x 2 より大きな奇数の時に行う処理 (x = 123 はここにやって来る) } else {

// それ以外:x 0 もしくは負の奇数の時に行う処理 }

この場合も最後のelseブロックは中身が空なら省略できます。

問題 2.12.10. 学生の成績が入っているint型変数degreeの値に対して、ランク評価のS、A、B、C、Dを以下の ように出力するプログラムRankEvaluation.javaを作りなさい。なお、ランクSは90点以上、Aは80点以上、Bは 70点以上、Cは60点以上、Dは60点未満である。

ソースコード2.26 RankEvaluation.java (条件分岐で成績評価) package section0212;

public class RankEvaluation {

public static void main(String[] args) { int degree = 85;

// if 文による条件分岐により以下のような出力が出るように作る

} }

あなたの成績は A でした 。

ところで、この問題の解答として以下のように書く人が結構多い。

if( degree >= 90 ) {

Systerm.out.println( "あなたの成績は S でした。" );

} else if( degree < 90 && degree >= 80 ) {

Systerm.out.println( "あなたの成績は A でした。" );

} else if( degree < 80 && degree >= 70 ) { // :

// (以下省略) えっ、何処がいけないの?

論理的には間違ってはいません。ただ、最初のif文の判定で falseとなった場合、必ずdegree < 90 は成立して いるのではないでしょうか。つまり、次の判定におけるdegree < 90の論理式は無駄だ!ということです。こうした 場合、馬鹿マジメに判定式を書くのではなく、よく考えてから簡潔な論理式を書くようにしましょう (我々は応用数学 科の学生なのだから)。

問題 2.12.11. 上の問題の条件分岐の順番を、最初にdegree >= 70から初めたときの条件分岐文を考え、それによ るプログラムRankEvaluation2.javaを作りなさい。

そして、どのランクの点数も同じ確率で発生するとしたときの分岐回数の平均値を 2つのプログラムで比較しなさい。

もしこの2つのプログラムRankEvalutionとRankEvalution2が大量のデータに対して行われるとしたら、後者 の方が(プログラムソースとしては少々見にくくなりますが)処理時間が短くなるのが予想されます。このような点も 考えながらプログラミングして下さいな。

問題 2.12.12. 以下の論理積を含むif文を、単独の (論理積を含まない)if文の入れ子として書き直しなさい。な お、condition_Aとcondition_Bはいずれもboolean型の値を返す論理式とします。そして、この論理式が短絡評 価式であることも注意して下さい。

if( condition_A && condition_B ) { System.out.println( true );

} else {

System.out.println( false );

}

ドキュメント内 i I Java Java Java (ページ 54-58)