switchの使い方について
この項目で学ぶこと
switchの使い方
switchもifと同様に、分岐処理を行うことが出来ます。
switch( 値 ){ case 1: 値が1のときの処理 break; case 2: 値が2のときの処理 break; case 3: 値が3のときの処理 break; default: どれにも当てはまらないときの処理 break; }// breakでここにくる
switchは値とcaseの値が一致したときのみ分岐することが出来ます。また、値には整数しか使えません。
入力された値で分岐するプログラム
#include<stdio.h> int main (){ int money; printf("1~3の整数を入力してください:"); scanf_s("%d",&money); switch( money ){ case 1: printf("300円拾いました\n"); break; case 2: printf("100円拾いました\n"); break; case 3: printf("500円拾いました\n"); break; default: printf("無効な値が入力されました\n"); break; } // break文でここに飛ぶ return 0; }
それぞれの処理が終わったらbreak文を書きましょう。書かなかった場合、switchの中の文を次々と実行します。上のソースでbreakを省略し「1」を入力すると
300円拾いました 100円拾いました 500円拾いました 無効な値が入力されました
と表示されることになります。
列挙型、defineマクロについて
上記の説明だけでは制約が多く、if文のなりそこないのような印象がありますね。そこで、switch文と相性のいい機能と、それを用いて私が実際にゲームで使っている場面を紹介します。
まず列挙型について紹介します。列挙型を用いるとint型の整数値に名前をつけることが出来ます。よく分かりませんね、実際に見てみましょう。puts関数についても紹介します。これはprintf関数のように文字列を出力する関数で、文字列を出力した後、自動で改行してくれる関数です。ただし、printf関数のように書式を指定して変数の値を表示する機能などがありません。
まず列挙型について紹介します。列挙型を用いるとint型の整数値に名前をつけることが出来ます。よく分かりませんね、実際に見てみましょう。puts関数についても紹介します。これはprintf関数のように文字列を出力する関数で、文字列を出力した後、自動で改行してくれる関数です。ただし、printf関数のように書式を指定して変数の値を表示する機能などがありません。
列挙型とswitchを組み合わせたサンプルソース
#include<stdio.h> // 列挙型を宣言する enum eMode{ // 列挙型名を決める。enum Modeの略 SMOLL, // 列挙定数を書き連ねる。列挙定数は0から1づつ増える LARGE, // SMOLL = 0, LARGE = 1, FIRE = 2となる(数学的な意味でのイコール) FIRE }; int main (){ int mode; mode = LARGE; // 0を代入したことと同じ switch( mode ){ // modeの値で分岐 case SMOLL: // SMOLLだった場合の処理 puts("SMOLL"); break; case LARGE: // LARGEだった場合の処理 puts("LARAGE"); break; case FIRE: // STARだった場合の処理 puts("FIRE"); break; default: // エラー printf("無効な値が入力されました\n"); break; } return 0; }
はじめに、列挙型「eMode」を宣言しています。続く列挙定数は0から順に1ずつ増やした整数値として扱うことが出来るようになります。列挙定数はコンマで区切ります。一般低に列挙定数は普通の変数と区別するために全て大文字にします。
プログラムを実行するとき、main関数の中にあるSMOLLは0に、LARGEは1に、FIREは2に置き換わって実行されると考えて差し支えありません。もちろん、modeに普通に0,1,2といった数値を入力しても大丈夫です。
さて、このソースはマリオの状態を変数modeで表現し、modeの値によって処理を変えるというものです。マリオの状態は「ちびマリオ」「でかマリオ」「ファイアマリオ」の3つがあるとします。重要なのは必ずこの3つの状態のいずれか1つの値をとることしかなく、重複することがないという性質です。このような条件を満たすときに列挙型を用いるとif文で書くよりもスマートに書くことが出来ます。
列挙型には他にもさまざまな機能があるのですが、詳しい説明は省きます。
プログラムを実行するとき、main関数の中にあるSMOLLは0に、LARGEは1に、FIREは2に置き換わって実行されると考えて差し支えありません。もちろん、modeに普通に0,1,2といった数値を入力しても大丈夫です。
さて、このソースはマリオの状態を変数modeで表現し、modeの値によって処理を変えるというものです。マリオの状態は「ちびマリオ」「でかマリオ」「ファイアマリオ」の3つがあるとします。重要なのは必ずこの3つの状態のいずれか1つの値をとることしかなく、重複することがないという性質です。このような条件を満たすときに列挙型を用いるとif文で書くよりもスマートに書くことが出来ます。
列挙型には他にもさまざまな機能があるのですが、詳しい説明は省きます。
次に紹介するのがdefineによる置換と組み合わせた使用方法です。使い方は列挙型と似ています。上のソースをdefineを用いて書き換えてみます。
#include<stdio.h> #define SMOLL 0 //#define 置換前の文字 置換後の文字 #define LARGE 1 #define FIRE 2 int main (){ int mode; mode = LARGE; // 0を代入したことと同じ switch( mode ){ // modeの値で分岐 case SMOLL: // SMOLLだった場合の処理 puts("SMOLL"); break; case LARGE: // LARGEだった場合の処理 puts("LARAGE"); break; case FIRE: // STARだった場合の処理 puts("FIRE"); break; default: // エラー printf("無効な値が入力されました\n"); break; } return 0; }
このようになります。なんとなく性質が分かりますね。
#define 置換前の文字 置換後の文字
includeもそうですが、#から始まる1行分のことをマクロといいます。マクロとはコンパイルする前にプリプロセッサが処理する文法の枠を超えた機能です。まぁ、気にしなくてもかまいません。defineの最後にセミコロンはいりません。書いてしまった場合、セミコロンも置換後の文字として扱われます。セミコロンがいらないのはincludeと一緒ですね。
switch文とは関係ありませんが、列挙型と異なり整数値以外も扱うことが出来ます。
switch文とは関係ありませんが、列挙型と異なり整数値以外も扱うことが出来ます。