3日目:条件分岐

if 文・else if・switch を使った処理の流れの制御を学びましょう

日数: 0 1 2 3 4 5 6 7

分岐処理

順次処理

変数や Console.Write() / Console.WriteLine() を用いれば、ある程度基本的な計算や画面への出力ができます。しかし、これまでやってきた処理は、プログラム中に記述された様々な処理をその順番どおり実行するだけのものでした。こういった処理を、順次処理(じゅんじしょり)と言います。(図3-1)

分岐処理

しかし、プログラムは順次処理だけでは成り立ちません。様々な状況に応じて、異なる処理を行わなくてはなりません。例えばゲームプログラムを作っているとしたら「もし、敵に当たったらゲームオーバー」といったように、条件に応じた処理の分岐が必要になります。このように、ある条件で処理の流れが変わる処理を、分岐処理(ぶんきしょり)と言います。(図3-2)

順次処理のフローチャート 分岐処理のフローチャート

図3-1:順次処理(左)/図3-2:分岐処理(右)

C#では、分岐処理を記述するための命令として if(イフ)switch(スイッチ) が用意されています。ここでは、それらについて解説します。

if 文

サンプルプログラム

まず手始めに、条件分岐の最も基本的な処理である if 文について学んでいきましょう。if とは英語で「もしも」という意味を表す単語で、「もしも〜だったら、…する」といった処理を行うために用います。

プロジェクト: Sample301 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample301
{
    class Program
    {
        static void Main(string[] args)
        {
            //  キーボードから数値を入力
            Console.Write("整数値を入力:");
            int a = int.Parse(Console.ReadLine());
            Console.WriteLine("a=" + a);
            //  入力した値が、正の数かどうかを調べる
            if (a > 0)
            {
                Console.WriteLine("aは正の数です。");  //  正の数だった場合に実行
            }
        }
    }
}
実行結果1(正の値を入力した場合)
整数値を入力:10  ← キーボードから数値を入力し、Enter を押す
a=10
aは正の数です。
実行結果2(負の値を入力した場合)
整数値を入力:-5  ← キーボードから数値を入力し、Enter を押す
a=-5

正の数を入力したときだけ「aは正の数です。」というメッセージが表示され、それ以外の場合は何も表示されません。

コンソールからの入力

条件分岐について説明する前に、コンソールからの数値入力について説明しましょう。15行目の以下の表現は、コンソールからの文字列入力を行います。

コンソールからの文字列の入力
Console.ReadLine()

ただし、入力された内容は文字列を表す string 型のままです。そのため、入力した内容を整数の値に変換する必要があります。以下のように記述することで、文字列を整数に変換できます。

コンソールからの文字列を数値に変換
int.Parse(Console.ReadLine())

int.Parse() は、() 内の文字列を整数の値に変換する役割を果たします。整数以外の値が入力されるとエラーになります。

if 文の書式

() 内の条件式が成立したとき、{} に囲まれた処理を実行するのが if 文です。Sample301 では、a > 0、つまり a が 0 よりも大きいときに条件が成立し、Console.WriteLine() が実行されます。

if 文の書式
if (条件式)
{
処理
}

>比較演算子と言います。比較演算子には以下のようなものがあります(表3-1)。

表3-1:比較演算子
演算子意味使用例
>より大きいa > 0
>=以上a >= 0
<より小さいa < 0
<=以下a <= 0
==等しいa == 0
!=等しくないa != 0
Sample301のフローチャート

図3-3. Sample301 のフローチャート

if〜else 文

サンプルプログラム

次に、条件が成り立たなかった場合にも処理を行えるよう、else を使った書き方を紹介します。

プロジェクト: Sample302 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample302
{
    class Program
    {
        static void Main(string[] args)
        {
            //  キーボードから数値を入力
            Console.Write("整数値を入力:");
            int a = int.Parse(Console.ReadLine());
            Console.WriteLine("a=" + a);
            //  入力した値が、正の数かどうかを調べる
            if (a > 0)
            {
                Console.WriteLine("aは正の数です。");  //  正の数だった場合に実行
            }
            else
            {
                Console.WriteLine("aは正の数ではありません。");
            }
        }
    }
}
実行結果(0 および負の数を入力した場合)
整数値を入力:-5  ← キーボードから数値を入力し、Enter を押す
a=-5
aは正の数ではありません。

else の書式

if 文の条件が成り立たない場合に実行されるのが、else 以下に記述した処理です。

if〜else 文の書式
if (条件式)
{
処理①
}
else
{
処理②
}

() 内の条件式が満たされた時は処理①が、満たされなかった場合は else(エルス) 以下の処理②が実行されます。したがって、このプログラムでは a が 0 か負の値であれば「aは正の数ではありません。」と出力されます。

Sample302のフローチャート

図3-4. Sample302 のフローチャート

else if

サンプルプログラム

if と else だけでは、ある条件が成り立つ場合とそうでない場合の2通りしか処理できません。条件が複数ある場合は else if(エルスイフ) を使います。

プロジェクト: Sample303 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample303
{
    class Program
    {
        static void Main(string[] args)
        {
            //  キーボードから数値を入力
            Console.Write("1から3の整数を入力:");
            int num = int.Parse(Console.ReadLine());
            if (num == 1)
            {
                Console.WriteLine("one");    //  numが1だった場合の処理
            }
            else if (num == 2)
            {
                Console.WriteLine("two");    //  numが2だった場合の処理
            }
            else if (num == 3)
            {
                Console.WriteLine("three");  //  numが3だった場合の処理
            }
            else
            {
                Console.WriteLine("不適切な値です。"); //  それ以外の値が入力された場合
            }
        }
    }
}
実行結果1(1〜3 の値を入力した場合)
1から3の整数を入力:1  ← キーボードから数値を入力し、Enter を押す
one
実行結果2(それ以外の値を入力した場合)
1から3の整数を入力:4  ← キーボードから数値を入力し、Enter を押す
不適切な値です。

else if の書式

else if を用いれば、複数の条件についての場合分けが可能です。else if は if の後に何個でも追加できます。

if〜else if〜else 文の書式
if (条件式①)
{
処理①
}
else if (条件式②)
{
処理②
}
else
{
処理③
}

条件式①が成り立てば処理①が、条件式②が成り立てば処理②が実行され、どちらも成り立たなければ処理③が実行されます。

Sample303のフローチャート

図3-5. Sample303 のフローチャート

複雑な if 文

サンプルプログラム

これらの知識を組み合わせて、より複雑な if の構文を作り上げてみましょう。

プロジェクト: Sample304 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample304
{
    class Program
    {
        static void Main(string[] args)
        {
            //  さいころの目を入力
            Console.Write("さいころの目(1~6):");
            //  コンソールから数値を入力
            int dice = int.Parse(Console.ReadLine());
            //  値が、さいころの目の範囲内かどうかを調べる
            if (1 <= dice && dice <= 6)
            {
                //  さいころの目が、偶数か、奇数かで、処理を分ける
                if (dice == 2 || dice == 4 || dice == 6)
                {
                    Console.WriteLine("丁(チョウ)です。");  //  偶数ならば丁
                }
                else
                {
                    Console.WriteLine("半(ハン)です。");    //  奇数ならば半
                }
            }
            else
            {
                Console.WriteLine("範囲外の数値です。");
            }
        }
    }
}
実行結果1(2, 4, 6 を入力した場合)
さいころの目(1~6):2  ← キーボードから 2, 4, 6 のいずれかを入力
丁(チョウ)です。
実行結果2(1, 3, 5 を入力した場合)
さいころの目(1~6):1  ← キーボードから 1, 3, 5 のいずれかを入力
半(ハン)です。
実行結果3(範囲外の数値を入力した場合)
さいころの目(1~6):7  ← キーボードから 1〜6 以外の数値を入力
範囲外の数値です。

ネスト

このプログラムを見ると、if 文の中にさらに if 文が入っています。これを if 文のネストと言います。ネストは if 文に限ったことではなく、この後紹介する繰り返し処理などでもよく見られる書式です。「何かの処理の中に、さらに何かの処理が入っているのがネストである」と理解すると良いでしょう。

if 文のネスト
if (条件式①)
{
if (条件式②)
{

}
}
⚠️ ネストを多用するとプログラムが複雑になり、読みにくくなります。必要以上の多重ネストは避けましょう。

論理演算子

18行目および20行目の if 文の中に、&&|| が使われています。これらの記号は論理演算子(ろんりえんざんし)と言い、複数の条件を組み合わせるときに欠かせないものです(表3-2)。

表3-2:論理演算子
演算子名称意味使用例
&& 論理積(AND) 複数の条件がすべて成り立つときに真 a == 0 && b == 0 // a が 0 かつ b が 0
|| 論理和(OR) 複数の条件のいずれかが成り立つときに真 a == 0 || a == 1 // a が 0 または 1
! 否定(NOT) 条件が成り立たないときに真 !(a == 0) // a が 0 でない場合に真

&& は AND(アンド)で、複数の条件がすべて成り立つときに真となります。18行目の例では「dice の値が 1 以上、かつ 6 以下」という意味です。|| は OR(オア)で、複数の条件のうちいずれかが成り立つときに真となります。20行目の例では「dice が 2、4、6 のいずれかであれば」という意味です。

Sample304のフローチャート

図3-6. Sample304 のフローチャート

switch 文

サンプルプログラム

Sample303 のような else if を用いた多分岐の条件分岐は、値が整数値であれば switch(スイッチ) 文を使って次のように書くこともできます。

プロジェクト: Sample305 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample305
{
    class Program
    {
        static void Main(string[] args)
        {
            //  キーボードから数値を入力
            Console.Write("1から3の整数を入力:");
            int num = int.Parse(Console.ReadLine());
            switch (num)
            {
                case 1:
                    Console.WriteLine("one");    //  numが1だった場合の処理
                    break;
                case 2:
                    Console.WriteLine("two");    //  numが2だった場合の処理
                    break;
                case 3:
                    Console.WriteLine("three");  //  numが3だった場合の処理
                    break;
                default:
                    Console.WriteLine("不適切な値です。"); //  それ以外の場合
                    break;
            }
        }
    }
}

switch 文の書式

switch 文は、() 内の値によって条件を分岐させる命令です。条件は case(ケース) で書き、その後に値が来ます。最後にある default(デフォルト) は、どの case にも当てはまらない場合を示します。

switch 文の書式
switch (値)
{
case 値①:
処理①
break;
case 値②:
処理②
break;
...
default:
処理③
break;
}

case の後に出てくる break(ブレイク) は処理の終了を意味します。switch 文で作った分岐の処理の最後には、必ずこの break を忘れずに入れましょう。

フォールスルーの禁止

break を入れずに次の case へ処理が流れ込むことをフォールスルーと言います。言語によってはフォールスルーを許可していますが、C# ではこのような処理を禁止しています。

フォールスルーの例(C# では禁止)
switch (a)
{
case 1:
処理①; // break がないためフォールスルー → C# ではエラー
case 2:
処理②;
break;
}

複数の条件を同じ処理でまとめる case

switch 文では、複数の case で同じ処理を実行したい場合、case を連続して記述することができます。

プロジェクト: Sample306 / ファイル名: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample306
{
    class Program
    {
        static void Main(string[] args)
        {
            //  さいころの目を入力
            Console.Write("さいころの目(1~6):");
            //  コンソールから数値を入力
            int dice = int.Parse(Console.ReadLine());
            switch (dice)
            {
                case 1:
                case 3:
                case 5:
                    Console.WriteLine("半(ハン)です。");    //  奇数ならば半
                    break;
                case 2:
                case 4:
                case 6:
                    Console.WriteLine("丁(チョウ)です。");  //  偶数ならば丁
                    break;
                default:
                    Console.WriteLine("範囲外の数値です。");
                    break;
            }
        }
    }
}

この処理は Sample304 とまったく同じ動作をします。「半(ハン)です。」を表示する場合は dice が 1、3、5 のいずれかなので、3つの case 文を連続して記述することで共通の処理が実行できるようになっています。「丁(チョウ)です。」の場合も同様です。

練習問題 3 へ →