C#プログラムの条件分岐(switch文その2)
今回のC#プログラミング学習は、条件分岐switch文の2回目です。
基本的なswitch文の書き方はバッチリだと思うので、今回は少し面白いswitch文の書き方を学習します。
プログラムのダウンロード
まずは今回学習していくためのプログラムをダウンロードしましょう。
ここをクリックして「Sample.zip」ファイルをダウンロードしてください。
ZIP形式になっているので、ダウンロードしたら、マウスの右クリックで「すべて解凍」を選びます。
すると、Sampleプロジェクトが展開されます。
プログラムファイルを開く
Sampleプロジェクトの中に「Sample.sln」ファイルがあるので、このファイルを開くとVisualStudioのVisualC#が立ち上がります。
ソリューションエクスプローラから「Program.cs」を開くと、以下のようなプログラムが表示されます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { class Program { static void Main(string[] args) { Console.Write("1から6のサイコロの目を入力:"); int iDice = int.Parse(Console.ReadLine()); switch (iDice) { case 1: case 3: case 5: Console.Write("奇数の目です"); break; case 2: case 4: case 6: Console.Write("偶数の目です"); break; default: Console.Write("範囲外の値です"); break; } Console.ReadLine(); } } }
プログラムのビルド
F7キーを押すとプログラムのビルドが行われ、実行ファイルが作成されます。
プログラムの実行
F5キーを押すとプログラムが実行されます。
まずは「1から6のサイコロの目を入力:」と表示されるので、「5」などの数値を入力しEnterキーを押します。
すると入力した値に応じたメッセージが表示されます。
例えば、「5」と入力しEnterキーを押すと、「奇数の目です」と表示されるのでEnterキーを押すとプログラムが終了します。
プログラム解説
それでは今回学習するC#プログラムを見てみましょう。
プログラムの流れ
今回のサンプルプログラムは、以前if文のネストで出てきたものをswitch文に書き換えたものです。
もちろん動作もほぼ同じです。
まずは「1から6のサイコロの目を入力:」と表示されるので、何らかの数値を入力しEnterキーを押します。
すると入力した値に応じたメッセージが表示されます。
入力値が「1」「3」「5」だったら「奇数の目です」と表示し、「2」「4」「6」だったら「偶数の目です」と表示します。
もし入力値が1から6の範囲外だったら「範囲外の値です」と表示されます。
条件分岐
サンプルプログラムの条件分岐部分は以下になります。
switch (iDice) { case 1: case 3: case 5: Console.Write("奇数の目です"); break; case 2: case 4: case 6: Console.Write("偶数の目です"); break; default: Console.Write("範囲外の値です"); break; }
switch文というのはこのように「case」を連続して記述することにより、簡単に条件を追加していくことができます。
このようにひとつの「case」に対して、「break」を記述しないコーディング方法をフォールスルーと言ったりします。
フォールスルーは、一度分岐した処理を簡単に合流させることができるので普通に使われていますが、プログラムが大きくなるとコードを読み間違えてバグを引き起こす原因になったりするので注意しましょう。
C#のフォールスルー
C#プログラムでフォールスルーを記述する際、知っておかなければいけないことがあるのでここで書いておきます。
例えばサンプルプログラムのswitch文を以下のように書き換えたとします。
switch (iDice) { case 1: Console.Write("★"); case 3: case 5: Console.Write("奇数の目です"); break; case 2: case 4: case 6: Console.Write("偶数の目です"); break; default: Console.Write("範囲外の値です"); break; }
こうすると、変数「iDice」の値が「1」のときだけ「★奇数の目です」となりますよね。
でも実際にビルドしてみると「コントロールはひとつの case ラベル ('case 1:') から別のラベルへ流れ落ちることはできません。」というエラーメッセージが出てビルドに失敗します。
実はC#ではこのようなコーディング方法を禁じています。
C言語とかだと普通に使えるんですけどね。
なので他のプログラミング言語に慣れている場合には注意しましょう。