ちぇりーの館

1−9 C言語プログラミング講座 プログラムの条件分岐 〜switch文〜



こんにちは! 前回は、if文を使った条件分岐について説明しました。今回は、 switch文を使った条件分岐について説明します。if文は、基本的に条件が成り立つか、 成り立たないかの二者択一で分岐を考えるのに対し、今回説明するswitch文は、はじめから 多分岐を前提に処理を書く事になります。それでは、まずは前回の復習もかねて、if文を使った 多分岐処理を見てみましょう。以下のプログラムを書いてください。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char nowTime[MAX_BUFFER];
	int  val1;

	printf("あなたの運を試します☆ 1〜3の中で好きな番号を入力してください。\n");

	gets(nowTime);
	val1 = atoi(nowTime);

	if(val1 == 1)
	{
		printf("大吉です\n");
	}
	else if(val1 == 2)
	{
		printf("中吉です\n");
	}
	else if(val1 == 3)
	{
		printf("末吉です\n");
	}
	else
	{
		printf("入力できる数字は1〜3です");
	}
	scanf("a");
	return 0;
}

if文を使った多分岐処理

このプログラムがわからない人は、前回の説明をもう一度読み直してみてください。

●switch文を使った多分岐処理
 さて、先ほどのプログラムをswitch文に書き直してみます。以下のプログラムを書いてみて下さい。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char nowTime[MAX_BUFFER];
	int  val1;

	printf("あなたの運を試します☆ 1〜3の中で好きな番号を入力してください。\n");

	gets(nowTime);
	val1 = atoi(nowTime);

	switch(val1)
	{
		case 1: printf("大吉です\n");
				break;

		case 2: printf("中吉です\n");
				break;

		case 3: printf("末吉です\n");
				break;

		default:printf("入力できる数字は1〜3です");
				break;
	}
	scanf("a");
	return 0;
}

 先ほどのif文と比較すると、すっきりしている印象を受けると思います。実際、大規模な プログラムで、非常に多く分岐する場合にはif文よりもswitch文を好んで使う傾向にあるようです。 それでは、switch文を細かく見ていきましょう。

●switch文の構造
 switch文は、初めにswitchと書きます。その後に"("と")"でくくられた部分に1つの式を書き、 この式の値によって条件分岐が行われる事になります。その後に、"{"から"}"で囲まれた部分に 条件分岐した後の処理を書きます。 条件分岐は、caseからbreakまでがひとくくりになります。caseの後には、整数の値を書きその後に":(セミコロン)"を つけます。caseの後に書く値は、必ず整数値でなければなりません。従って、小数になる場合や、 大小比較による分岐が必要な場合は、switch文ではなくif文で書かなければなりません。 caseが3つ並んだ後にdefaultと書かれていますが、これはif文で言う所のelseに相当します。 つまり、該当するcaseに一致しない場合に来る事になります。defaultが必要ない場合には、else文と同様に 記入する必要はありません。defaultを使用する場合にも、必ず":(セミコロン)"を入れましょう。 処理の最後に書かれているbreakは、break文と呼ばれ"ここで処理が終わります"という意味になります。break文はswitch文以外でも使われます。

if文とswitch文の違い

●break文のないswitch文
 実は、break文は必ず入れなければならないわけではありません。次のプログラムを見てください。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256

int main(void)
{
	char nowTime[MAX_BUFFER];
	int  val1;

	printf("あなたの運を試します☆ 1〜3の中で好きな番号を入力してください。\n");

	gets(nowTime);
	val1 = atoi(nowTime);

	switch(val1)
	{
		case 1: printf("大吉です\n");
				break;

		case 2: 
		case 3: printf("末吉です\n");
				break;

		default:printf("入力できる数字は1〜3です");
				break;
	}
	scanf("a");
	return 0;
}

break文をかかない場合の処理

case2にはわざとbreak文を入れていません。しかし、この場合でもコンパイルエラーとはならず プログラムは、switch文にcase2の値が来た場合には、処理をcase2に移動させます。ただし、 break文が無いので処理の中断が行われずにそのすぐ下にあるcase3に処理が流れて"末吉です" という文字が表示されてからcase3にあるbreakで処理を中断します。つまり、break文が無い場合に caseが選ばれた場合は、そのまま次に書かれているcaseまで処理が連続して行われる事になります。 一見すると、break文を忘れて不具合っぽく見えますがプログラムに慣れてくると意図的にbreak文を 入れずにプログラムを組む人もいます。従って、switch文を使う場合にはbreak文が入っているかどうかを 注意して見る必要があります。
それでは、switch文を利用したサンプルプログラムを以下に示します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_BUFFER			256

int main(void)
{
	char nowTime[MAX_BUFFER];
	int  val1;

	printf("あなたの運を試します☆ はんにゃらーはんにゃらー……ハッ!\n");

	srand(time(0));		//乱数の種をセット
	val1 = rand();		//乱数を取得
	val1 = val1 % 5;	//5で割った余りを求める

	printf("あなたの今日の運勢は ------->");
	switch(val1)
	{
		case 0: printf("大吉です\n");	//大吉がでる確立は、1/5
				break;

		case 1:
		case 2: printf("中吉です\n");	//中吉がでる確立は、2/5
				break;

		case 3:
		case 4:
		case 5: printf("末吉です\n");	//末吉がでる確立は、3/5
				break;

		default:printf("入力できる数字は1〜3です");
				break;
	}
	scanf("a");
	return 0;
}

おみくじプログラム

 このプログラムでは、乱数を使って値を振り分けその結果を表示しています。この乱数の 使用方法は、ほとんど定型化しているので、余り深く考えずに覚えてしまう方がいいかもしれません。 まず、includeにtime.hを追加します。次にsrand(time(0))という関数を呼び出します。この関数を 呼び出さないと、rand関数は、常に決まった順番でランダムな値を返すようになってしまいます。 次にrand関数を呼び出し値を取得します。この時返される値は0かもしれないし、9999999かもしれません。 そのため、返される値に対して、割り算を行いその余りを求める事によって取得する値の最大値を 設定します。それが、"val1 % 5"となります(割り算の余りは、割る値よりも大きくならない)。 その結果を元にswitch文に値を引き渡しています。また、大吉・中吉・末吉の出る確率を変えたかった ので、大吉には0を、中吉には1〜2を、末吉には3〜5の数字の幅を持たせるようにさせています。


 いかがでしたか? 以上で、今回の説明は終了です。条件分岐処理で、if文とswitch文のどちらを 使うかは基本的にプログラマの自由となっております。しかし、一般的には分岐が少ない場合にはif文を使い、 分岐が多い場合には、switch文を使う方がプログラムがすっきりとするように思います。 さて、これで条件分岐の説明は終了なので、次回は、繰り返し処理について説明します。 前回同様、内容が判り難かったり、疑問・質問等がありましたら時間の許す限りお答えしようと思いますので どしどしメールを送ってください。でわでわ、お疲れ様でした (^_^)/

< 一覧ページへ戻る


当サイトが面白いと感じた方は、お手数ですが下記リンクをクリックしてください。
クリック毎に当ホームページの評価が上がります。ご協力お願いします!
inserted by FC2 system