switch制御


多分岐プログラム

ifステートメントによるプログラムフロー制御は「択一分岐」向けでした
ですが、複数の選択による分岐の場合if文では複雑になりがちです

そこで、複数分岐にはswitchステートメントを用います
switchステートメントは指定された値を複数のcaseと比較し、一致したcaseから実行します
switch(値) {
case 定数:
	ステートメント;
case n:
	ステートメント;
default:
	ステートメント;
}
caseは ANSI C 標準で最低限257まで分岐を作ることができます
switchで指定した値がcaseのあとの定数と一致すれば、そのcaseから実行します
「caseから」というのに注目してほしいのですが、そのcaseだけを実行するわけではないのです
switchステートメントは一致したcase以降全て(switchステートメントの最後まで)を実行しようとします

ですがこれではやりにくいので、breakステートメントを使います
breakステートメントは現在の制御ステートメントから抜け出す命令で、switch以外でも使われます(後記)

全てのケースに該当がなかった場合はdefaultを実行します
以下のプログラムを参照してください
#include <stdio.h>

int main()
{
	int var;

	printf("あなたは猫耳が好きですか?\n");
	printf("はい = 1\tいいえ = 2\t兎耳のほうが… = 3\n");

	scanf("%d",&var);

	switch (var) {
	case 1:
		printf("同士よ、共に全宇宙を猫耳に染めようぞ!");
		break;
	case 2:
		printf("それじゃアキバは歩けないぜ、旦那");
		break;
	case 3:
		printf("ウサギちゃんか…耳で空飛ぶんだぞ!");
		break;
	default:
		printf("指定した数を選択してください");
	}
	return 0;
}
ここで大切なことは、caseで指定できるのは定数ということです
if文では条件式を評価して実行することができましたが、switchのcaseで指定できるのは定数です

このプログラムでは、入力された値 var をswitchの比較に用いています
case 1: はvarに代入されている内容が1だった時にbreakまで、もしくは文の最後まで実行されます

注意としては、switchステートメントのcaseの定数で同じ値は使えないということです


また、caseが持つ定数は文字でもかまいません
C言語では、1つの文字を表現するのにはシングルクォーテーションを使うんでしたね
もちろんswitchで使うときも同様です
ここでひとつ、弟○草バリのプログラムを作ってみましょうか
#include <stdio.h>

int main()
{
	char var;

	printf("今日の奈美はどこかおかしい\n突然不安にかられた僕は…\n\n");
	printf("A\t「奈美ぃーー!どこだ、返事をしろー!!」\n");
	printf("\t僕は奈美を必死で探した\n\n");
	printf("B\t「猫耳ィー!どこだ、でじこーーー!!」\n");
	printf("\t僕は男のロマンを叫んだ\n");

	scanf("%c" , &var);

	switch(var) {
	case 'A':
		printf("まぁ、何をしたって屋敷は燃えるんだよね…\n僕はプレイヤーとして諦めた");
		break;
	case 'B':
		printf("やはりこの世で最も美しいのは猫耳だ\n今日、改めてそれを確信した");
		break;
	default:
		printf("AかBを選択してにょ");
	}

	return 0;
}
これまでのプログラム知識だけでも十分サウンドノベルならず、コンソールノベルが作れますね(笑)
大切なのは発想ですよ。がんばって仕様を覚えたら、あとは発想です


switch()

switch (expression) {
case const-expression:
	statements;
	...
[default:
	statements;
	...]
}
expressionと一致したconst-expressionを持つcaseからstatementsを実行します
一致するcaseがない場合はdefaultを実行します

expression case比較するための式を評価します

const-expression 定数式を指定します

statements 実行するステートメントを指定します



前のページへ戻る次のページへ