MSBOOKS

プログラミングとか深層学習とか日常の出来事とか

【C言語入門】part5 : switch文

前回はif文,else if文,else文についてやりました.
今回はswitch文についてやっていきます.

switch文

前回,if文(条件分岐)の書き方をやりましたが,それと似ているものになります.数値が横並びのものに対して見やすくできるのがswitch文になります.例えば以下のようなゲーム画面でキャラクターの行動を選択する画面を思い浮かべてみてください.
f:id:msteacher:20190105224041p:plain
このような1,2,3の選択肢のように単純に並んでいるものに対して,if文をいちいち書くのは面倒なのでそれを簡単に書くことができるものがswitch文になります.例えば以下のように書けます.
・test5-1.c

#include <stdio.h>
int main(void){
   int choose;
   printf("敵が現れた!あなたはどうする?\n");
   printf("1.攻撃 2.魔法 3.逃げる\n");
   printf("1,2,3のいずれかを入力:");
   scanf("%d",&choose);
   switch(choose){
      case 1:
         printf("攻撃をした!\n");
         break;
      case 2:
         printf("魔法で攻撃した!\n");
         break;
      case 3:
         printf("敵から逃げた!\n");
         break;
      default:
         printf("入力が不正です!\n");
   }
   printf("戦闘終了!\n");
   return 0;
}

・実行結果

C:\Users\ユーザ名\Desktop>test5-1
敵が現れた!あなたはどうする?
1.攻撃 2.魔法 3.逃げる
1,2,3のいずれかを入力:1
攻撃をした!
戦闘終了!

C:\Users\ユーザ名\Desktop>test5-1
敵が現れた!あなたはどうする?
1.攻撃 2.魔法 3.逃げる
1,2,3のいずれかを入力:2
魔法で攻撃した!
戦闘終了!

C:\Users\ユーザ名\Desktop>test5-1
敵が現れた!あなたはどうする?
1.攻撃 2.魔法 3.逃げる
1,2,3のいずれかを入力:4
入力が不正です!
戦闘終了!

色々なパターンで実行してみてください.switch文の書き方は以下のようになっています.defaultはいずれも満たさなかった場合に入るものです.
・switch文

switch(変数名){
   case 値:
      処理1
      break;
   case 値:
      処理2
      break;
   case 値:
      処理3
      break;
   default: //どれも満たさなかった場合にここに入る
      処理4
}

このプログラムの流れを以下の図に示します.
f:id:msteacher:20190105230120p:plain
switch文に入ると緑色の領域に入るイメージで,途中のcaseで抜けたいときはbreakを書かないとswitchに入ったままになります.試しにbreakをすべて除いたプログラムを実行してみましょう.
・test5-2.c

#include <stdio.h>
int main(void){
   int choose;
   printf("敵が現れた!あなたはどうする?\n");
   printf("1.攻撃 2.魔法 3.逃げる\n");
   printf("1,2,3のいずれかを入力:");
   scanf("%d",&choose);
   switch(choose){
      case 1:
         printf("攻撃をした!\n");
      case 2:
         printf("魔法で攻撃した!\n");
      case 3:
         printf("敵から逃げた!\n");
      default:
         printf("入力が不正です!\n");
   }
   printf("戦闘終了!\n");
   return 0;
}

・実行結果

C:\Users\ユーザ名\Desktop>test5-2
敵が現れた!あなたはどうする?
1.攻撃 2.魔法 3.逃げる
1,2,3のいずれかを入力:2
魔法で攻撃した!
敵から逃げた!
入力が不正です!
戦闘終了!

このようにcaseで一回入ってしまうとすべて出てしまうのがわかります.なのでbreakは各caseで書かないといけないわけですね.switch文は見やすくするためのものなので,全部if文で書くこともできますが,面倒なので選択肢などのときはswitch文を使うことが多いですね.
練習問題もRPGゲーム風で多少面白くしてみたのでぜひチャレンジしてみてください.
お疲れさまでした.

練習問題

・問題
 敵のHPを表す整数型変数(enemyHP)を定義し,キーボード入力から受け付け,その変数へ代入します.次に選択肢を入れる整数型変数chooseを定義し,以下のような主人公の選択肢を表示します.
敵が出てきた!主人公はどうする?
1:攻撃する
2:魔法で攻撃する
3:逃げる
この選択肢をキーボード入力から受け付け,それぞれの場合で以下のような計算を行う.
変数enemyHPに対し
1:3ダメージ与える
2:6ダメージ与える
3:0ダメージ与える
最後に敵のHPを表示する.そして最後に敵がHPが0なら"主人公の勝利!"と表示し,HPが0より大きい場合は"敵はまだ倒れていない…!"と表示するプログラム(test5-3.c)を書いてみよう.敵のHPが0未満なら0に調節するのを忘れないようにしよう.(前回のtest4-6.cと今回のtest5-1.cが参考になると思います)
・実行結果例

C:\Users\ユーザ名\Desktop>test5-3
敵のHPを入力してね:5
今の敵のHP:5
敵が出てきた!主人公はどうする?
1.攻撃する
2.魔法で攻撃する
3.逃げる
1,2,3のいずれかを入力:2
魔法で攻撃した!
6ダメージ!
今の敵のHP:0
主人公の勝利!

C:\Users\ユーザ名\Desktop>test5-3
敵のHPを入力してね:2
今の敵のHP:2
敵が出てきた!主人公はどうする?
1.攻撃する
2.魔法で攻撃する
3.逃げる
1,2,3のいずれかを入力:3
敵から逃げた!
今の敵のHP:2
敵はまだ倒れていない…!

練習問題の解答例

・問題
 ・test5-3.c

#include <stdio.h>
int main(void){
   int enemyHP;
   int choose;
   printf("敵のHPを入力してね:");
   scanf("%d",&enemyHP);
   printf("今の敵のHP:%d\n",enemyHP);
   printf("敵が出てきた!主人公はどうする?\n");
   printf("1.攻撃する\n2.魔法で攻撃する\n3.逃げる\n");
   printf("1,2,3のいずれかを入力:");
   scanf("%d",&choose);
   switch(choose){
      case 1:
         printf("攻撃をした!\n3ダメージ!\n");
         enemyHP = enemyHP - 3;
         break;
      case 2:
         printf("魔法で攻撃した!\n6ダメージ!\n");
         enemyHP = enemyHP - 6;
         break;
      case 3:
         printf("敵から逃げた!\n");
         break;
      default:
         printf("不正な入力です\n");
   }
   //HPがマイナスにならないように調整
   if(enemyHP < 0){
       enemyHP = 0;
   }
   printf("今の敵のHP:%d\n",enemyHP);
   if(enemyHP == 0){
      printf("主人公の勝利!\n");
   }
   else{
      printf("敵はまだ倒れていない…!\n");
   }
   return 0;
}