🖥️

【C言語超入門】 第14回 列挙体

に公開

https://youtu.be/N9iLcfUr92Y

四国めたん
\textcolor{pink}{四国めたん: }教師役ですわ

ずんだもん
\textcolor{lime}{ずんだもん: }生徒役なのだ

\footnotesize \textcolor{pink}{四国めたん:} 皆さん、こんにちは。四国めたんです

\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回もC言語のお勉強をしていきましょう

\footnotesize \textcolor{lime}{ずんだもん:} レッツゴーなのだ

\footnotesize \textcolor{pink}{四国めたん:} 前回まで、リンゴの重さの平均を計算して、表示するプログラムを作成してきましたわ

\footnotesize \textcolor{lime}{ずんだもん:} たしかに、そんな感じのサンプルプログラムを作っていたのだ

\footnotesize \textcolor{pink}{四国めたん:} その際、100個分のリンゴの重さを保持するために 配列 を使用しましたわ

\footnotesize \textcolor{lime}{ずんだもん:} そのとおりなのだ

\footnotesize \textcolor{pink}{四国めたん:} さて、今回はリンゴの重さだけではなく、色の情報を付け加えたいと思いますわ

\footnotesize \textcolor{lime}{ずんだもん:} お~、少し複雑になるのだ

列挙体で色を表しましょう

\footnotesize \textcolor{lime}{ずんだもん:} ところで、重さと同じように、色の平均を計算して表示するのか?

\footnotesize \textcolor{pink}{四国めたん:} いえ、色の平均は難しいですわね

\footnotesize \textcolor{pink}{四国めたん:} ですので、リンゴの個数を10個にして、キーボードから指定した番号のリンゴの情報を表示することにしますわ

\footnotesize \textcolor{lime}{ずんだもん:} りょうかいなのだ

\footnotesize \textcolor{pink}{四国めたん:} そして、リンゴの色については、列挙子を用いて表現することにしますわ

\footnotesize \textcolor{lime}{ずんだもん:} おや?列挙子は定数を表すために使うのではなかったのか?

\footnotesize \textcolor{pink}{四国めたん:} 列挙子を定数とする使い方は、列挙体の本来の使い方とは違いますわね

\footnotesize \textcolor{lime}{ずんだもん:} 列挙体の本来の使い方?

\footnotesize \textcolor{pink}{四国めたん:} とりあえずプログラムを作ってみましょう

#include <conio.h>
#include <stdio.h>

#define SIZE (10)
#define WEIGHT (100)

void main() {
  enum color {
    RED,
    YELLOW,
    GREEN,
  };

  int apple_weight[SIZE] = {0};
  enum color apple_color[SIZE] = {0};

  for (int i = 0; i < SIZE; i++) {
    apple_weight[i] = WEIGHT + i;
    apple_color[i] = i % 3;
  }

  printf("キーボードから数値を入力して下さい。\n");

  int key = _getch();
  while (('0' <= key) && (key <= '9')) {
    int index = key - '0';
    printf("リンゴの重さは%dグラムです。\n", apple_weight[index]);
    if (apple_color[index] == RED) {
      printf("リンゴの色は赤色です。\n");
    } else if (apple_color[index] == YELLOW) {
      printf("リンゴの色は黄色です。\n");
    } else {
      printf("リンゴの色は緑色です。\n");
    }

    key = _getch();
  }
}

列挙体の変数を宣言しましょう

\footnotesize \textcolor{lime}{ずんだもん:} なんか、変な配列の宣言と初期化があるのだ

\footnotesize \textcolor{pink}{四国めたん:} enum color apple_color[SIZE] = {0};のことですか?

\footnotesize \textcolor{lime}{ずんだもん:} そうなのだ

\footnotesize \textcolor{pink}{四国めたん:} これは"color"というタグの列挙体の配列を宣言、初期化していますわ

\footnotesize \textcolor{lime}{ずんだもん:} 列挙体の配列は"0"で初期化できるのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、列挙子に整数の代入が可能なことを見ても明らかですが、列挙子は整数として扱うことができますわ

\footnotesize \textcolor{lime}{ずんだもん:} たしかに列挙子は定数として使うこともできたのだ

\footnotesize \textcolor{pink}{四国めたん:} ですのでint apple_color[SIZE] = {0}として初期化しても問題ありませんわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{lime}{ずんだもん:} でも、今回は int型 の配列ではなく、 enum color型 の配列としているのだ

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} このようにすることで"apple_color"という配列が"color"という タグ の列挙体の配列であることが明確になりますわ

列挙体の変数に代入しましょう

\footnotesize \textcolor{lime}{ずんだもん:} ところでForループ内では何をおこなっているのだ?

\footnotesize \textcolor{pink}{四国めたん:} 配列の宣言と同時に0クリアをおこなっていますが、Forループ内では、実際の初期値をセットしていますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{lime}{ずんだもん:} でも"apple_color"配列の要素には、整数値i % 3を代入しているが、問題ないのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、列挙体"color"の列挙子、"RED", "YELLOW", "GREEN"には、明示的に整数が割り当てられていませんわ

\footnotesize \textcolor{pink}{四国めたん:} ですので、自動的に0, 1, 2が割り当てられていますわね

\footnotesize \textcolor{lime}{ずんだもん:} つまり enum color型 の配列の要素に0~2を代入することは、列挙子を代入するのと同じということなのか?

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} ちなみに、任意の整数iから、0~(n-1)の範囲の整数を作成する場合には剰余i % nを使いますわ

\footnotesize \textcolor{lime}{ずんだもん:} 今回の場合には0~2なのでi % 3なのか

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} 意外に使い道があるので覚えておくと良いですわね

\footnotesize \textcolor{lime}{ずんだもん:} ちなみに列挙子に割り当てられた整数以外を代入することもできるのか?

\footnotesize \textcolor{pink}{四国めたん:} できてしまいますわね

\footnotesize \textcolor{pink}{四国めたん:} でも、バグの元となるので、やらないでくださいね

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

キー入力の文字が''0''~''9''の数字かどうかの判定しよう

\footnotesize \textcolor{lime}{ずんだもん:} 次はwhileループの中身を教えて欲しいのだ

\footnotesize \textcolor{pink}{四国めたん:} わかりましたわ

\footnotesize \textcolor{pink}{四国めたん:} まず、whileループの条件式では、キー入力の文字が'0'から'9'の数字かどうかの判定をおこなっていますわ

\footnotesize \textcolor{lime}{ずんだもん:} キー入力は_getch()で取得しているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、_getch()で取得した文字は、実際にはアスキーコード表で示される整数値ですわ

\footnotesize \textcolor{lime}{ずんだもん:} おぼえているのだ

\footnotesize \textcolor{pink}{四国めたん:} ですので、取得した整数値とアスキーコードを比較することで入力された文字を特定できますわ

\footnotesize \textcolor{lime}{ずんだもん:} そうなのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、アスキーコード表を見ると、'0'という文字は48に割り当てられていますわね

\footnotesize \textcolor{lime}{ずんだもん:} '1'は49、'2'は50と続き、'9'は57になっているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、アスキーコード表における数字は、連続して割り当てられていますわ

\footnotesize \textcolor{pink}{四国めたん:} ですので、比較演算子を用いて('0' <= key) && (key <= '9')とすることで、入力が数字かどうか判断できますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{pink}{四国めたん:} そして、入力が数字以外であれば、whileループを抜けますわ

数字から整数値への変換をします

\footnotesize \textcolor{lime}{ずんだもん:} whileループ内の最初の処理、int index = key - '0';は何をしているのだ?

\footnotesize \textcolor{pink}{四国めたん:} 文字で表された数字を整数値に変換していますわ

\footnotesize \textcolor{lime}{ずんだもん:} '0'という文字を0に、'1'という文字を1に、最終的に'9'という文字を9に変換しているのか

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{lime}{ずんだもん:} でも、なぜkey - '0'で変換ができるのだ?

\footnotesize \textcolor{pink}{四国めたん:} アスキーコード表では、'0'から'9'は、連続した整数値に割り当てられていますわ

\footnotesize \textcolor{pink}{四国めたん:} ですので、キー入力から'0'、つまり48を引くことで数字に対応した整数値を得る事ができるのですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

列挙子を出力します

\footnotesize \textcolor{pink}{四国めたん:} 最後にリンゴの色をprintfで表示しますわ

\footnotesize \textcolor{lime}{ずんだもん:} でもprintfには列挙子の名前をそのまま表示するための書式指定子なんかあったのか?

\footnotesize \textcolor{pink}{四国めたん:} いいえ、仕組みそのものがありませんわね

\footnotesize \textcolor{pink}{四国めたん:} ですので、条件分岐によりリンゴの色の列挙子で場合分けをおこなっていますわ

\footnotesize \textcolor{lime}{ずんだもん:} 場合分けをして、それぞれにprintfを使用した表示を用意しているのだ

\footnotesize \textcolor{pink}{四国めたん:} そのとおりですわ

\footnotesize \textcolor{pink}{四国めたん:} リンゴの色を表示後は、再度、_getch();で、キーボードからの入力を受け付けていますわ

\footnotesize \textcolor{pink}{四国めたん:} では、実際に動かしてみましょう

キーボードからの入力表示

\footnotesize \textcolor{lime}{ずんだもん:} 「キーボードから数値を入力して下さい。」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} では、キーボードから\fcolorbox{blue}{lightgray}{0}, \fcolorbox{blue}{lightgray}{1}, \fcolorbox{blue}{lightgray}{2}と入力してみましょう

数字入力後

\footnotesize \textcolor{lime}{ずんだもん:} 入力に合わせて、リンゴの重さと色が表示されているのだ

\footnotesize \textcolor{pink}{四国めたん:} 最後に\fcolorbox{blue}{lightgray}{q}と入力して、プログラムを終了しましょう

まとめ

\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした

\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ

\footnotesize \textcolor{pink}{四国めたん:} 以上で 列挙体 についての解説を終了しますわ

Discussion