5-3 場合わけ switch文
ここでは前節に引き続き場合わけを行うswitch文についての話です。
if文を沢山書く必要はない
if文は便利なのですが、多方向に分岐させようと思ったとき何回もelse ifを書かなければならず、 大変な上に見にくくなっていきます。それをスマートに各方法としてswitch文というものが用意されています。 一般的な書き方は次のようです。
{
case 定数1:
文;
ジャンプ文;
・
・
・
case 定数n:
文;
ジャンプ文;
[default]
}
switchという予約語のあとに条件を書きます。これはif文のときにもでてきた式です。 そして、ここではこの条件がいくつかの値をとり得ると考えてください。そして、各case文ではこの条件がとり得る値を列挙しています。 次に具体的な例で考えてみましょう。
{
if(textBox1.Text != "" && textBox3.Text != "")
{
string op = textBox2.Text;
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox3.Text);
double result = 0;
switch(op)
{
case "+":
result = x + y;
break;
case "-":
result = x - y;
break;
case "*":
result = x * y;
break;
case "/":
result = x / y;
break;
default:
textBox4.Text = "エラー:演算子が正しくありません";
return;
}
textBox4.Text = result.ToString();
}
else
{
textBox4.Text = "エラー:数値を記入してください";
}
}
これは前節で取り上げた電卓プログラムの一部分をswitch文で書き直したものです。前節でのif文のコードを次に示します。
{
string op = textBox2.Text;
if(textBox1.Text != "" && textBox3.Text != "")
{
if(op == "+")
{
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox3.Text);
double result = x + y;
textBox4.Text = result.ToString();
}
else if(op == "-")
{
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox3.Text);
double result = x - y;
textBox4.Text = result.ToString();
}
else if(op == "*")
{
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox3.Text);
double result = x * y;
textBox4.Text = result.ToString();
}
else if(op == "/")
{
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox3.Text);
double result = x / y;
textBox4.Text = result.ToString();
}
else
{
textBox4.Text = "エラー:演算子が正しくありません";
}
}
else
{
textBox4.Text = "エラー:数値を記入してください";
}
}
概観するとわかるように随分とすっきりしているのがわかります。 swtich文はこのように多方向の分岐をさせる場合に有効です。 ではコードの説明に移ります。まずはじめのif文でtextBox1とtextBox2に数値が入力されているかどうかをチェックしています。 これは前節のサンプルでもかわりません。次にswtich文に着目すると、 textBox2の内容が入っているopという変数を条件としてその値によって処理を振り分けています。 case文ではop変数がとり得る値を書いてそれに応じた処理を行っています。 この場合演算子の種類によってresult変数に演算結果を代入しています。
ここで注意しなければいけないのはbreakとdefaultです。breakはそれが実行されると処理がswitch文の最後に移ります。つまりswitch文からぬけることになります。このbreakは書かないとコンパイルエラーとなります。defaultはopがどのcaseにもあてはまらなかったときに実行されます。この場合対応している演算子以外の文字が入力されていた場合エラーを出すようにしています。
これがswitch文の簡単な使い方です。なお気づいた方もいるかと思いますが、 前節で紹介したサンプルと今回のサンプルはif文をswitch文に書き換えた以外に意図的に変更してあるところがあります。 それは、x, y変数に入力値を代入する場所やresult変数の内容をtextBox4に代入する位置です。 これらをこのサンプルのように変更することで、冗長な部分が省かれて見やすく無駄のないコードとなります。
caseを組み合わせる
次にcaseを組み合わせる方法について説明します。上記の例ではcaseはひとつの場合しか表していませんが、 これは組み合わせて複合的なものにすることができます。例えば、次のような例を考えて見ましょう。 上記の電卓プログラムは演算子に+や*の記号を”半角”で指定することができますが、 ”全角”文字が入力された場合どうなるでしょうか?やってみるとわかりますが、エラーが出てしまいます。 なぜなら、全角文字と半角文字はパソコンの内部では異なったものとして表現されているからです。 ではこのような場合どうすればいいでしょうか?半角文字の+でも全角文字の+でも処理内容は同じです。 つまり複合的な場合が発生したことになります。これを解決する方法として、次のようにswitch文を書き換えることができます。
{
if(textBox1.Text != "" && textBox3.Text != "")
{
string op = textBox2.Text;
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox3.Text);
double result = 0;
switch(op)
{
case "+":
case "+":
result = x + y;
break;
case "-":
case "−":
result = x - y;
break;
case "*":
case "*":
result = x * y;
break;
case "/":
case "/":
result = x / y;
break;
default:
textBox4.Text = "エラー:演算子が正しくありません";
return;
}
textBox4.Text = result.ToString();
}
else
{
textBox4.Text = "エラー:数値を記入してください";
}
}
C#では下に流れることはできない
このようにしてcase文を重ねて書くことによって複合的な場合にも対処することができます。 この他にもswtich文にはgoto文を使用することができます。 例えば、C言語でswtich文を使用したことのある人breakを書かずに下に処理を流すということをしたことがあるかもしれません。 しかし、C#ではこれはコンパイルエラーとなりできません。 そこで、どうしてもこのようなことを行いたいときにはbreakのかわりにgoto case 1などと 明示的に処理がどこに移るのかを書かなければいけません。