Menu
Coddy logo textTech

名前付き定数のための Enum

CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 55/63。

Cプログラムを書く際、関連する一連の定数値を扱う必要があることがよくあります。例えば、曜日、月、またはプログラム内のさまざまな状態を表現する必要があるかもしれません。0、1、2のような生の数字を使用する代わりに、enumを使用してこれらの定数に意味のある名前を付けることができます。

列挙型(enum)を使用すると、名前付きの整数定数のグループを定義できます。これにより、コードの可読性が大幅に向上し、メンテナンスが容易になります。基本的な構文は次のとおりです。

enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

デフォルトでは、最初の名前に値0が割り当てられ、2番目に1、といった具合になります。したがって、MONDAYは0、TUESDAYは1、SUNDAYは6に等しくなります。この方法は、0日が月曜日、6日が日曜日であることを覚えているよりもずっと明確です。

enum を使用することで、コードが自己文書化され、プログラム全体でマジックナンバーを使用する際に発生する可能性のあるエラーを防ぐのに役立ちます。

enum型の変数を宣言し、それらにenum値を代入することができます:

enum DayOfWeek today;
today = MONDAY;  // todayに0を代入します
challenge icon

チャレンジ

簡単

信号機の色のための enum を定義し、その使用方法を示すCプログラムを作成してください。プログラムは以下の内容を行う必要があります:

  1. TrafficLight という名前の enum を、以下の定数をこの通りの順序で定義します:
    • RED
    • YELLOW
    • GREEN
  2. main 関数内で:
    • enum TrafficLight 型の変数 currentLight を宣言します
    • 信号機の状態を表す整数(0、1、または2)を入力から読み取ります
    • 入力に基づいて、対応する列挙型の値を currentLight に代入します:
      • 入力が 0 の場合、 RED を代入します
      • 入力が 1 の場合、 YELLOW を代入します
      • 入力が 2 の場合、 GREEN を代入します
    • 現在の信号の状態を、次の形式で出力します: Current light: [enum_name]
    • 現在の信号の数値を、次の形式で出力します: Numeric value: [number]
    • 現在の信号に基づいたアクションを判定し、出力します:
      • RED の場合: Action: Stop と出力します
      • YELLOW の場合: Action: Caution と出力します
      • GREEN の場合: Action: Go と出力します
    • シーケンスにおける次の信号を計算し、出力します:
      • 現在の信号が RED (0) の場合、次は GREEN (2) です
      • 現在の信号が YELLOW (1) の場合、次は RED (0) です
      • 現在の信号が GREEN (2) の場合、次は YELLOW (1) です
    • 次の信号を、次の形式で出力します: Next light: [enum_name]

このチャレンジでは、 enum 定数を使用することで、生の数字を使用するよりもコードがいかに読みやすくなるかを示します。0が赤、1が黄色、2が緑であることを覚えておく代わりに、 REDYELLOWGREEN といった意味のある名前を使用できます。列挙型の定義、代入や比較における列挙型定数の使用、および列挙型定数の基になる整数値へのアクセスを練習します。

チートシート

enumを使用すると、名前付きの整数定数のグループを定義でき、生の数値を使用するよりもコードが読みやすくなります。

enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

デフォルトでは、最初の名前に値0が割り当てられ、2番目に1が割り当てられ、以下同様に続きます。したがって、MONDAYは0に等しく、TUESDAYは1に等しくなります。

enum型の変数を宣言し、それらにenum値を代入することができます。

enum DayOfWeek today;
today = MONDAY;  // todayに0を代入します

自分で試してみよう

#include <stdio.h>

// TODO: ここで TrafficLight 列挙型を定義します

int main() {
    // 入力を読み込む
    int input;
    scanf("%d", &input);
    
    // TODO: currentLight 変数を宣言し、入力に基づいて列挙型の値を割り当てます
    
    // TODO: 現在の信号の状態を表示します
    
    // TODO: 数値を表示します
    
    // TODO: 現在の信号に基づいたアクションを表示します
    
    // TODO: 次の信号を計算して表示します
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン