分岐処理
順次処理
変数や Console.Write() / Console.WriteLine() を用いれば、ある程度基本的な計算や画面への出力ができます。しかし、これまでやってきた処理は、プログラム中に記述された様々な処理をその順番どおり実行するだけのものでした。こういった処理を、順次処理(じゅんじしょり)と言います。(図3-1)
分岐処理
しかし、プログラムは順次処理だけでは成り立ちません。様々な状況に応じて、異なる処理を行わなくてはなりません。例えばゲームプログラムを作っているとしたら「もし、敵に当たったらゲームオーバー」といったように、条件に応じた処理の分岐が必要になります。このように、ある条件で処理の流れが変わる処理を、分岐処理(ぶんきしょり)と言います。(図3-2)
図3-1:順次処理(左)/図3-2:分岐処理(右)
C#では、分岐処理を記述するための命令として if(イフ) と switch(スイッチ) が用意されています。ここでは、それらについて解説します。
if 文
サンプルプログラム
まず手始めに、条件分岐の最も基本的な処理である if 文について学んでいきましょう。if とは英語で「もしも」という意味を表す単語で、「もしも〜だったら、…する」といった処理を行うために用います。
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は正の数です。"); // 正の数だった場合に実行
}
}
}
}
a=10
aは正の数です。
a=-5
正の数を入力したときだけ「aは正の数です。」というメッセージが表示され、それ以外の場合は何も表示されません。
コンソールからの入力
条件分岐について説明する前に、コンソールからの数値入力について説明しましょう。15行目の以下の表現は、コンソールからの文字列入力を行います。
ただし、入力された内容は文字列を表す string 型のままです。そのため、入力した内容を整数の値に変換する必要があります。以下のように記述することで、文字列を整数に変換できます。
int.Parse() は、() 内の文字列を整数の値に変換する役割を果たします。整数以外の値が入力されるとエラーになります。
if 文の書式
() 内の条件式が成立したとき、{} に囲まれた処理を実行するのが if 文です。Sample301 では、a > 0、つまり a が 0 よりも大きいときに条件が成立し、Console.WriteLine() が実行されます。
{
処理
}
> は比較演算子と言います。比較演算子には以下のようなものがあります(表3-1)。
| 演算子 | 意味 | 使用例 |
|---|---|---|
> | より大きい | a > 0 |
>= | 以上 | a >= 0 |
< | より小さい | a < 0 |
<= | 以下 | a <= 0 |
== | 等しい | a == 0 |
!= | 等しくない | a != 0 |
図3-3. Sample301 のフローチャート
if〜else 文
サンプルプログラム
次に、条件が成り立たなかった場合にも処理を行えるよう、else を使った書き方を紹介します。
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は正の数ではありません。");
}
}
}
}
a=-5
aは正の数ではありません。
else の書式
if 文の条件が成り立たない場合に実行されるのが、else 以下に記述した処理です。
{
処理①
}
else
{
処理②
}
() 内の条件式が満たされた時は処理①が、満たされなかった場合は else(エルス) 以下の処理②が実行されます。したがって、このプログラムでは a が 0 か負の値であれば「aは正の数ではありません。」と出力されます。
図3-4. Sample302 のフローチャート
else if
サンプルプログラム
if と else だけでは、ある条件が成り立つ場合とそうでない場合の2通りしか処理できません。条件が複数ある場合は else if(エルスイフ) を使います。
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("不適切な値です。"); // それ以外の値が入力された場合
}
}
}
}
one
不適切な値です。
else if の書式
else if を用いれば、複数の条件についての場合分けが可能です。else if は if の後に何個でも追加できます。
{
処理①
}
else if (条件式②)
{
処理②
}
else
{
処理③
}
条件式①が成り立てば処理①が、条件式②が成り立てば処理②が実行され、どちらも成り立たなければ処理③が実行されます。
図3-5. Sample303 のフローチャート
複雑な if 文
サンプルプログラム
これらの知識を組み合わせて、より複雑な if の構文を作り上げてみましょう。
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("範囲外の数値です。");
}
}
}
}
丁(チョウ)です。
半(ハン)です。
範囲外の数値です。
ネスト
このプログラムを見ると、if 文の中にさらに if 文が入っています。これを if 文のネストと言います。ネストは if 文に限ったことではなく、この後紹介する繰り返し処理などでもよく見られる書式です。「何かの処理の中に、さらに何かの処理が入っているのがネストである」と理解すると良いでしょう。
{
if (条件式②)
{
…
}
}
論理演算子
18行目および20行目の if 文の中に、&& や || が使われています。これらの記号は論理演算子(ろんりえんざんし)と言い、複数の条件を組み合わせるときに欠かせないものです(表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 のいずれかであれば」という意味です。
図3-6. Sample304 のフローチャート
switch 文
サンプルプログラム
Sample303 のような else if を用いた多分岐の条件分岐は、値が整数値であれば switch(スイッチ) 文を使って次のように書くこともできます。
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 にも当てはまらない場合を示します。
{
case 値①:
処理①
break;
case 値②:
処理②
break;
...
default:
処理③
break;
}
case の後に出てくる break(ブレイク) は処理の終了を意味します。switch 文で作った分岐の処理の最後には、必ずこの break を忘れずに入れましょう。
フォールスルーの禁止
break を入れずに次の case へ処理が流れ込むことをフォールスルーと言います。言語によってはフォールスルーを許可していますが、C# ではこのような処理を禁止しています。
{
case 1:
処理①; // break がないためフォールスルー → C# ではエラー
case 2:
処理②;
break;
}
複数の条件を同じ処理でまとめる case
switch 文では、複数の case で同じ処理を実行したい場合、case を連続して記述することができます。
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 文を連続して記述することで共通の処理が実行できるようになっています。「丁(チョウ)です。」の場合も同様です。