第2章15 switch文 条件で実行する処理を分ける@イチからゲーム作りで覚えるC言語

質問と答え入力・Switch文の利用

質問と答え入力・Switch文の利用

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章16 型の長さ、情報量とビットを知る
NEXT : 2章16 型の長さ、情報量とビットを知る
2章14 if文 条件で実行する処理を分ける・その3 : PREV

この記事でやること

前回はプロジェクト「0110_simpleif3」を新しく作り、if 文の簡単な書き方をお話ししました。
今回は、新しくプロジェクト「0120_simpleswitch」を作り、引き続き、条件によって実行する処理を分ける switch 文 についてお話します。

この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

プレイヤーの選択で処理を分けるプログラム

ではではプレイヤーからの文字入力を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「0120_simpleswitch」を新しく用意し、プロジェクトに空の「SimpleSwitch.c」を追加し、下のソースコードをコピペして動かしてみましょう。

#include <stdio.h>
int main() {
 int input = 0;
 printf("妖精:よくこの洞窟の底までたどり着きました。\n");
 printf("妖精:ほうびに大根かニンジンどちらかをさずけましょう。\n");
 printf("システム:入力してください。1:大根 2:ニンジン \n");
 printf("入力:");
 scanf_s("%d", &input);
 switch (input) {
 case 1:
   printf("妖精:大根ね。引っこ抜いてくるね。\n");
   break;
 case 2:
   printf("妖精:ニンジンね。引っこ抜いてくるね。\n");
   break;
 default:
   printf("妖精:それ以外あげるものはないです。\n");
 }
}

コピペなりして、実行してみて下さい。

妖精:よくこの洞窟の底までたどり着きました。
妖精:ほうびに大根かニンジンどちらかをさずけましょう。
システム:入力してください。1:大根 2:ニンジン
入力:

入力を求められますね。
ここで、2を入力してみると、下のような結果がでてきます。

妖精:よくこの洞窟の底までたどり着きました。
妖精:ほうびに大根かニンジンどちらかをさずけましょう。
システム:入力してください。1:大根 2:ニンジン
入力:2
妖精:ニンジンね。引っこ抜いてくるね。

プレイヤーが入力した値(整数 2)に対して、妖精が反応してニンジンを引っこ抜いてくれています。
ではでは、中身を見ていきましょう。

switch文の実行流れ

switch 文は前回お話した if 文と同じように、条件によって処理の流れを変えることができます。処理の流れを整理してみましょう。下のような流れになります。

Switch文の処理の流れ

Switch文の処理の流れ

switch 文は switch(日本語で、切り変える)というイミの通り、条件にあった処理の命令文を実行する、というプログラムの制御をすることができます。

switch は「switch ( 整数の変数 ) {…}」という風に書くことができます。
そして、上の処理の流れの図や、今回のサンプルプログラムの中でも書いていますが、「switch ( 整数の変数 ) { … switch処理の中身 … }」の、{…}部分には、「case」や「break」「default」という文が新しく登場しているかと思います。

switch 文のなかのcase 、default ラベル

「switch ( 整数の変数 ) { … switch処理の中身 … }」の{…}部分には、 caseやdefault といったラベルを書くことができます。

switch 文のなかの case ラベル

case ラベルは、

case  整数 : 

の形式で書くことができます。整数の後は「;」セミコロンではなく「:」コロンなので注意してください。ラベルを書くときに、ラベルのおしまいには「:」コロンの記号を使うのがルールとなっています。

例えば、 switch ( 整数の変数A ) { … } の{ … } 内に 「case 1 :」というラベルを書くことで、整数の変数A が 1 の時に、 「case 1」のラベルの直後からプログラムが実行されます。(プログラムの実行する場所が同じ整数の割り当ててあるラベルの位置にジャンプします)

switch 文のなかの break 文

swtich 文の中で、「break」文が実行されるとき、switch 文の { … } から抜け出します。つまり、switch 文の{ … } の後からプログラムの続きが実行されます。

switch文の中で break が実行されたときの流れ

switch文の中で break が実行されたときの流れ

switch文で break 文を書かないときの流れ

もしも break 文を書いていない場合はどうなるでしょうか。
例えば、上の図で case B: にジャンプしたとき、break の記載がなければ、
ラベルを超えて、次の行、次の行と処理されていき、複数の命令文B → 複数の命令文C → 複数の命令文D の上から順番に全てが実行されます。

switch 文で default ラベル

default ラベルは、

default : 

の形式で書くことができます。case ラベルと違って、整数などを書き加える必要はありません。必須ではないので、書かなくても大丈夫です。
case ラベルでつけた整数のどれにも引っかからなかったときに、この default ラベルにジャンプしてきます。

サンプルコードの処理を追う

サンプルコードで整数 2 を入力して、ニンジンを選択したときに実行される行をハイライトにしてみます。

#include <stdio.h>
int main() {
 int input = 0;
 printf("妖精:よくこの洞窟の底までたどり着きました。\n");
 printf("妖精:ほうびに大根かニンジンどちらかをさずけましょう。\n");
 printf("システム:入力してください。1:大根 2:ニンジン \n");
 printf("入力:");
 scanf_s("%d", &input);
 switch (input) {
 case 1:
   printf("妖精:大根ね。引っこ抜いてくるね。\n");
   break;
 case 2:
   printf("妖精:ニンジンね。引っこ抜いてくるね。\n");
   break;
 default:
   printf("妖精:それ以外あげるものはないです。\n");
 }
}

ここで、 1 でも 2 でもない数値を入力すると、default ラベルに処理がジャンプします。(case 1 にも case 2 にも一致しないので)
変な入力をすると妖精の提案以外だとなにももらえない、ということになりますね。

あとがき

今回はここまで。お疲れさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章16 型の長さ、情報量とビットを知る
NEXT : 2章16 型の長さ、情報量とビットを知る
2章14 if文 条件で実行する処理を分ける・その3 : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
更新なし