Tips

2018.05.30

C# 基礎 第11回 条件分岐文

条件分岐文

みなさんこんにちは。
後藤です。
この連載も今回で11回目です。

前回は、データに名前をつける、変数定義を学んでいただきました。
今回は、データに応じて何をするかが変わるプログラムの書き方を学んでいきましょう。

  1. 条件分岐って?
  2. if文
  3. if/else if文
  4. if/else if/else文
  5. switch文
  6. 注意点
  7. 実習
  8. まとめ

1. 条件分岐って?

『条件分岐』って、難しい言葉ですね。
でも、実は私たちがいつも日常生活で行っていることなんです、
『もしXだったら、Aする。そうでなければBする。』
これが条件分岐です。
例をお示ししますね。

缶ジュースの値段が100円以下なら、その缶ジュースを買う。そうでなければ、買わない。

これをC#で書くと、以下のようになります。

// ifは『もし』。()の中が条件。ここでは缶ジュースの値段(cannedJuicePrice)が100以下であることが条件。
if(cannedJuicePrice <= 100)
{
    // ここに買うという意味のプログラムを書く
}
// elseは『そうでなければ』という意味。
else
{
    // ここに買わないという意味のプログラムを書く
}

このように、データや変数がどのような値かに応じて、やることが変わるプログラムをかけます。
具体的に書き方を見ていきましょう。

2. if文

『もし』をあらわすための方法です。
ifは英語の『もし』ですね。条件は()の中に書きます。
{}の中には、条件が正しいときに行う行為を書きます。

日本語:もしXだったらAする。

C#
// if(X)は『もしXだったら』という意味です。
if(X)
{
    // Aする;
}

実例

// もし4が3より大きければ、コマンドライン画面に4は3より大きいと表示する。
if(4 > 3)
{
    Console.WriteLine("4は3より大きい。");
}

3. if/else if文

『もし』が二つ以上あるときにつかう文です。
ifであらわされる最初の条件が正しいときは、最初の条件に対応する動作をします。
最初の条件が正しくない場合、else ifであらわされる二番目の条件が正しいか判断します。
正しい場合、二番目の条件に対応する動作をします。
三番目以降の条件が必要なときも、else ifで表現します。

日本語との対比で、どういう構造になっているか見ていただきましょう。

日本語: もしXならAする。そうでなく、YだったらBする。

C#
// 最初の条件
// if(X)は『もしXなら』という意味です。        
if(X)
{
    // Aする;
}
// 2番目の条件
// else if(Y)は『そうでなく、Yだったら』という意味です。
else if(Y)
{
    // Bする;
}

実例をご紹介します。

// 条件1. もし4が4より大きければ、コマンドライン画面に『4は4より大きい』と表示する。
// 条件2. そうでなく、4が4と等しければ、コマンドライン画面に『4は4と等しい』と表示する。

// 条件1. 
if(4 > 4)
{
    Console.WriteLine("4は4より大きい");
}
// 条件2. 
else if(4 == 4)
{
    Console.WriteLine("4は4と等しい");
}

4. if/else if/else文

どれも当てはまらないときの処理を付け加えるときにつかいます。
日本語との対応で、感覚をつかんでいただきましょう。

日本語:もしXならAする。そうでなくYならBする。どれでもないならCする。

C#:
// if(X)は『もしXなら』という意味
if(X)
{
    // Aする;
}
// else if(Y)は『そうでなくYなら』という意味
else if(Y)
{
    // Bする;
}
// elseは『どれでもないなら』という意味
else
{
    // Cする;
}

実例

// テストの実際の点(realScore)と期待点(expectedScore)を比較します。
var realScore = 35;
var expectedScore = 70;

// 条件分岐1. 
// 実際の点が期待点より高い場合
if(realScore > expectedScore)
{
    Console.WriteLine("すばらしい");
}
// 条件分岐2. 
// 実際の点が期待点と同じ場合
else if(realScore == expectedScore)
{
    Console.WriteLine("まずまず");
}
// 条件分岐3. 
// 1でも2でもない場合(実際の点が期待点より低い場合)
else
{
    Console.WriteLine("次回がんばろう");
} 

5. switch

代表的な条件分岐文はif文です。
ただ、特定の場合、switch文と呼ばれる別の条件分岐文を使うべきです。
4つか5つほどの、限られた値しかとらないデータがあり、
その値に応じて、動作を変えたいときです。

if文とswitch文の比較を見てもらいましょう。
下の場合、switch文を使うのが望ましいです。

if文を使った例

// 悪例
// randomLuckyNumberは、0、1、2、3、4、5しか取らない。
// if文よりも、値が0のケース、1のケース、という書き方をしたい
int randomLuckyNumber = (new Random()).Next(0, 6);
if (randomLuckyNumber == 0)
{
    Console.WriteLine("randomLuckyNumberの値は0");
}
else if (randomLuckyNumber == 1)
{
    Console.WriteLine("randomLuckyNumberの値は1");
}
else if (randomLuckyNumber == 2)
{
    Console.WriteLine("randomLuckyNumberの値は2");
}
else if (randomLuckyNumber == 3)
{
    Console.WriteLine("randomLuckyNumberの値は3");
}
else if (randomLuckyNumber == 4)
{
    Console.WriteLine("randomLuckyNumberの値は4");
}
else if (randomLuckyNumber == 5)
{
    Console.WriteLine("randomLuckyNumberの値は5");
}

switch文を使った例

// 良い例
// randomLuckyNumberは、0、1、2、3、4、5しか取らない。
// randomLuckyNumberについて、値がxxxの場合(case)の動作を述べている。
int randomLuckyNumber = (new Random()).Next(0, 6);
switch (randomLuckyNumber)
{
    case 0:
        Console.WriteLine("randomLuckyNumberの値は0");
        break;
    case 1:
        Console.WriteLine("randomLuckyNumberの値は1");
        break;
    case 2:
        Console.WriteLine("randomLuckyNumberの値は2");
        break;
    case 3:
        Console.WriteLine("randomLuckyNumberの値は3");
        break;
    case 4:
        Console.WriteLine("randomLuckyNumberの値は4");
        break;
    case 5:
        Console.WriteLine("randomLuckyNumberの値は5");
        break;
}

6. 注意点

いくつか、条件制御文を使う上での注意点をお話しします。

  1. ヒント1. ネストを深くしない
  2. ヒント2. 条件は肯定形にする
  3. ヒント3. 関係演算子を使う場合、『検査対象 関係演算子 基準値』の順番にする。

ヒント1. ネストを深くしない

if文の入れ子は避けてください。
なるべく1重にするのが理想です。

ダメな例(必要ないのに二重になっている)

var realScore = 90;
var averageScore = 70;
var maxScore = 100;

// 実際のテストの点が平均点以上満点以下であるとき、コマンドライン画面に文字列を印刷したい
// 二重のif文にしている。
if(realScore <= maxScore)
{
    if(realScore >= averageScore)
    {
        Console.WriteLine("テストの結果は、平均点以上満点以下です。");
    }
}

改善例

var realScore = 90;
var averageScore = 70;
var maxScore = 100;

// 実際のテストの点が平均点以上満点以下であることをひとつの条件としてまとめる
// realScoreIsBetweenAverageAndMaxと名前をつける
bool realScoreIsBetweenAverageAndMax = (realScore <= maxScore && realScore >= averageScore);
if(realScoreIsBetweenAverageAndMax)
{
    Console.WriteLine("テストの結果は、平均点以上満点以下です。");
}

ヒント2. 条件は肯定形にする

たとえば、
『値段が100円ではない場合は買わない。そうでない場合は買う。』
ではなく、
『値段が100円のときは買う。そうでない場合は買わない。』
としてください。

否定形を使った例。

// 悪い例
var evaluationTarget = 1;
if(evaluationTarget != 1)
{
    Console.WriteLine("1ではないです");
}
else
{
    Console.WriteLine("1です");
}

肯定形を使った例。

// 良い例
var evaluationTarget = 1;
if(evaluationTarget == 1)
{
    Console.WriteLine("1です");
}
else
{
    Console.WriteLine("1ではないです");
}

ヒント3. 関係演算子を使う場合、『検査対象 関係演算子 基準値』の順番にする。

検査対象となる値が左、基準値が右に来るようにしてください。

var realScore = 100;
var cutoffScore = 95;
// 悪例
// 検査対象のrealScoreが右側に来ている
if(cutoffScore <= realScore)
{
    Console.WriteLine("realScoreがcutoffScoreより高い");
}
var realScore = 100;
var cutoffScore = 95;
// 良い例。検査対象のrealScoreが左側に来ている。
if(realScore >= cutoffScore)
{
    Console.WriteLine("realScoreがcutoffScoreより高い");
}

7. 実習

以下の日本語の内容を、C#のソースコードとして表現してください。

テストがあります。足きり点が65点です。満点が100点です。下限点が0点です。
足きり点以上、満点以下の場合、合格です。
コンソール画面に『おめでとうございます。合格です。』と表示します。
下限点以上、足きり点未満なら、不合格です。
コンソール画面に『残念です。不合格です。』と表示します。
それ以外の場合、ありえない値なので、『試験の得点が正しく入力されていません。』と表示します。
今回の受験者の実際の得点は75点でした。
解答例
[csharp] using System;

namespace ConditionalFlowExercise
{
class MainClass
{
static void Main(string[] args)
{
var realScore = 75;
bool examineeHasPassed = (realScore >= 65 && realScore <= 100);
bool examineeHasFailed = (realScore >= 0 && realScore < 65);

if (examineeHasPassed)
{
Console.WriteLine("おめでとうございます。合格です。");
}
else if (examineeHasFailed)
{
Console.WriteLine("残念です。不合格です。");
}
else
{
Console.WriteLine("試験の得点が正しく入力されていません。");
}
}
}
}
[/csharp]

実行結果

8. まとめ

お疲れ様です。
これで、条件を制御して、さまざまな処理をすることが出来ますね。
次回は、複数のデータをまとめて管理する、コンテナを学びましょう。
コンテナと条件分岐を組み合わせると、さらにいろんなことが出来るようになりますよ。

ゲーム制作関連のオススメ連載リンク

とっても手軽なゲーム制作体験!
Unityゲーム開発基礎

実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発

Recent News

Recent Tips

Tag Search