switch 文での Enum の利用
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 57/63。
C言語プログラミングにおいて最も強力な組み合わせの一つは、enum の値と switch 文を併用することです。この組み合わせにより、プログラムの意思決定プロセスを明確に表現する、非常に可読性が高くメンテナンスのしやすい制御フローのロジックが作成されます。
switch文のケースとして列挙型(enum)定数を使用すると、コードは自己文書化されます。case 0: や case 5: のような謎の数字を見る代わりに、その目的を即座に伝える意味のある名前を見ることができます。
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}このアプローチにより、コードの理解と修正がはるかに容易になります。このコードを読む人は誰でも、各ケースが何を表しているかを即座に理解でき、新しいケースの追加やロジックの変更も簡単になります。また、コンパイラがエラーの検出を支援します。enum定数を綴り間違えた場合、潜在的なバグではなくコンパイルエラーが発生します。
チャレンジ
簡単enumとswitch文を使用して、シンプルな気象アドバイスシステムを構築するC言語プログラムを作成してください。プログラムの内容は以下の通りです:
WeatherConditionという名前のenumを定義し、以下の定数をこの順番で含めます:SUNNYCLOUDYRAINYSTORMYSNOWY
getWeatherAdviceという名前の関数を作成します:enum WeatherCondition型のweatherという名前のパラメータを受け取ります- 戻り値はありません (void)
switch文を使用して、天候に応じたアドバイスを表示します:SUNNYの場合:Perfect day for outdoor activities!と表示CLOUDYの場合:Good day for a walk, no sun protection needed.と表示RAINYの場合:Don't forget your umbrella!と表示STORMYの場合:Stay indoors and avoid travel.と表示SNOWYの場合:Drive carefully and dress warmly.と表示
getActivitySuggestionという名前の関数を作成します:enum WeatherCondition型のweatherという名前のパラメータを受け取ります- 戻り値はありません (void)
switch文を使用して、天候に基づいたアクティビティを提案します:SUNNYの場合:Suggested activity: Beach or hikingと表示CLOUDYの場合:Suggested activity: Photography or gardeningと表示RAINYの場合:Suggested activity: Reading or indoor gamesと表示STORMYの場合:Suggested activity: Movie marathonと表示SNOWYの場合:Suggested activity: Skiing or hot cocoaと表示
- main関数内で:
enum WeatherCondition型の変数currentWeatherを宣言します- 入力から天候を表す整数(0, 1, 2, 3, または 4)を読み取ります
- 入力に基づいて、対応するenumの値を
currentWeatherに代入します - 現在の天候を次の形式で表示します:
Current weather: [numeric_value] currentWeatherを引数としてgetWeatherAdvice関数を呼び出しますcurrentWeatherを引数としてgetActivitySuggestion関数を呼び出します
このチャレンジでは、enumとswitch文を組み合わせて、読みやすく保守しやすいコードを作成する方法を学びます。switch文で分かりにくい数値のケースを使用する代わりに、プログラムのロジックを明確に表現する意味のあるenum定数を使用します。これにより、switch文が自己文書化され、各ケースが何を表しているかを理解しやすくなり、必要に応じて動作を修正することが容易になります。
チートシート
enum値をswitch文で使用することで、読みやすくメンテナンスしやすい制御フローのロジックを作成できます。
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}このアプローチでは、case 0:やcase 5:のような謎の数字の代わりに意味のある名前を使用することで、コードが自己文書化されます。コンパイラは、enum定数のスペルミスに対してサイレントなバグではなくコンパイルエラーを生成することで、エラーの捕捉を支援します。
自分で試してみよう
#include <stdio.h>
// TODO: ここで WeatherCondition 列挙型を定義します
// TODO: ここで getWeatherAdvice 関数を実装します
// TODO: ここで getActivitySuggestion 関数を実装します
int main() {
// 入力を読み込む
int weatherInput;
scanf("%d", &weatherInput);
// TODO: currentWeather 変数を宣言し、入力に基づいて列挙型の値を割り当てます
// TODO: 現在の気象条件を "Current weather: [numeric_value]" の形式で出力します
// TODO: getWeatherAdvice 関数を呼び出します
// TODO: getActivitySuggestion 関数を呼び出します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Logic & Flowのすべてのレッスン
10Enum と typedef
名前付き定数のための EnumEnum の宣言と使用switch 文での Enum の利用型エイリアスのための typedef の使用構造体での typedefまとめ:typedef と Enum の演習