はじめに
この記事について
「C言語の基礎を学ぼう」をテーマに、自身の知識 + α をアドベントカレンダーにまとめます。
25日間でC言語をマスターしよう - Qiita Advent Calendar 2025 - Qiita
こんな方を対象としています
-
コンピュータがプログラムをどのように動かしているか知りたい/知らない方
-
プログラミングをしてみたい方
-
C言語初心者の方
キーワード
-
enum
-
typedef
説明
列挙型
プログラム内で意味を持つ数をいくつか利用したいとき、列挙型( enum )を利用します。
#include <stdio.h>
enum Item {
APPLE,
BANANA,
COFFEE
};
int main(void) {
enum Item a = APPLE;
if (a == APPLE) {
printf("りんごです。");
}
return 0;
}
りんごです。
enum Item は変数の型のように使用でき、中には APPLE 等を入れて管理することができます。
内部では enum の各要素にそれぞれ数が与えられています。
#include <stdio.h>
enum Item {
APPLE,
BANANA,
COFFEE
};
int main(void) {
printf("%d,%d,%d", APPLE, BANANA, COFFEE);
return 0;
}
0,1,2
enum の宣言時には typedef をあわせて使用することが多いです。
typedef を使用して名前を付けることで、その後の enum を省略することができます。
#include <stdio.h>
typedef enum {
APPLE,
BANANA,
COFFEE
} Item;
int main(void) {
Item a = APPLE; // enumを省略可能
return 0;
}
値の指定に注意
enum の宣言時に内部の値を指定することができます。
#include <stdio.h>
typedef enum {
APPLE = 5,
BANANA, // 直前の値 + 1 になる
COFFEE = 9
} Item;
int main(void) {
printf("%d,%d,%d", APPLE, BANANA, COFFEE);
return 0;
}
5,6,9
適切な指定ではない場合、内部の値が重複することがあります。
#include <stdio.h>
typedef enum {
APPLE = 5,
BANANA,
COFFEE = 6
} Item;
int main(void) {
printf("%d,%d,%d", APPLE, BANANA, COFFEE);
return 0;
}
5,6,6
この時は想定しない動作をするため注意が必要です。
#include <stdio.h>
typedef enum {
APPLE = 5,
BANANA,
COFFEE = 6
} Item;
int main(void) {
Item c = COFFEE;
if (c == BANANA) {
printf("ばななです。");
}
return 0;
}
ばななです。
練習
1. カラータイル
コンソールに制御文字を出力することで背景色を変更することができる。
背景色を変更してスペースを表示することでランダムなカラータイルを作成しよう。
ポイント
コンソールの背景色を変更するには下記を出力します。
| 色 | 出力する値 |
|---|---|
| 黒 | \e[40m |
| 赤 | \e[41m |
| 緑 | \e[42m |
| 黄 | \e[43m |
| 青 | \e[44m |
| マゼンタ | \e[45m |
| シアン | \e[46m |
| 白 | \e[47m |
| リセット | \e[0m |
下記参考にしました!( \x1b と \e は同じです)
C言語で出力される文字の色や背景を変える。 #C言語入門 - Qiita
各色を列挙型で宣言しましょう。
うまく表示できない場合は、都度色をリセットするとうまくいくと思います。
解答例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef enum {
BLACK,
RED,
GREEN,
YELLOW,
BLUE,
MAGENTA,
CYAN,
WHITE
} Color;
int main(void) {
int i, j;
srand((unsigned int)time(NULL));
for (i = 0; i < 4; i++) {
for (j = 0; j < 10; j++) {
switch (rand() % 8) {
case BLACK: printf("\e[40m"); break;
case RED: printf("\e[41m"); break;
case GREEN: printf("\e[42m"); break;
case YELLOW: printf("\e[43m"); break;
case BLUE: printf("\e[44m"); break;
case MAGENTA: printf("\e[45m"); break;
case CYAN: printf("\e[46m"); break;
case WHITE: printf("\e[47m"); break;
}
printf(" ");
}
printf("\e[0m\n");
}
return 0;
}
おわりに
列挙型を適切に利用することで、コメントの代わりになります。
他にも状態変化やエラーIDなどにも列挙型が使用できそうですね。
参考文献
↓↓↓ はじめてプログラミングを学んだときに読んだ本です ↓↓↓
詳細(プログラミング入門 C言語)|プログラミング|情報|実教出版
