C言語入門|複雑性に立ち向かう:構造体によるデータ整理の第一歩

ここまで、本当によく頑張りました 😊
if、while、for を自在に組み合わせて、
かなり本格的なプログラムが書けるようになってきましたね。

……ところで今、
「自分が書いたコードなのに、なんだか全体が見えない」
そんな感覚、ありませんか?

行数は増え、変数も増え、
頭の中がごちゃごちゃしてきたとしたら——
それは 成長している証拠 でもあります 👍

ここから先は、
文法の問題ではなく、人間の限界との戦い になります。

プログラミングの新たな敵「複雑性」

第Ⅰ部で学んだ
順次・分岐・繰り返しの3種類の文と制御構文があれば、
理論上はどんなプログラムでも作れるはずでした。

それなのに、なぜ開発が止まってしまうのでしょうか?

原因は、とてもシンプルです。

問題内容
行数の増加数百行を超えると全体像が把握しづらい。
変数の増加似た名前の変数が大量に並ぶ。
関係性の不明瞭さどのデータがどの処理に関係しているか分からない。

つまり、
プログラムが複雑になりすぎて、人間が把握できなくなる
これが「複雑性」という敵の正体です。

コンピュータは文句を言いませんが、
人間の脳は先に悲鳴を上げてしまうんですね 😵‍💫

複雑性を克服するために必要な考え方

ここで大切なのは、
「もっと命令を覚えること」ではありません。

必要なのはこれです。

考え方内容
整理する関連するデータをまとめる。
役割で考える人や物を単位として扱う。
まとまりを作るバラバラな変数を1つにする。

この考え方を実現するための仕組みが、
構造体(structure) です 😊

変数が増えすぎると何が起きるのか

まずは、構造体を使わない場合を見てみましょう。
例として、RPGのキャラクター情報を
普通の変数だけで管理しようとすると、こんな感じになります。

#include <stdio.h>

typedef char String[1024];

int main(void)
{
    String heroName = "アレン";
    int heroLevel = 5;
    int heroHp = 120;
    int heroAtk = 18;

    String mageName = "リナ";
    int mageLevel = 4;
    int mageHp = 80;
    int mageAtk = 6;

    // 変数が増えすぎて管理が大変!
}

一見すると問題なさそうですが、
キャラクターが増えたり、
HPの最大値や魔力などの項目が追加されたらどうなるでしょう?

起こりやすいミス説明
変数名の重複コピー後の修正漏れ
宣言忘れ必要な変数を用意し忘れる。
対応漏れ処理側で使い忘れる。

つまり、
データの数が増えるほど、ミスが爆発的に増える
という状態に陥ります。

構造体とは何者なのか?

構造体とは、
異なる型のデータをひとまとめにできる型 です。

イメージとしては、

大きな箱の中に、用途別の小さな箱が入っている

そんな感じです 😊

用語意味
構造体データのまとまりそのもの
メンバー構造体の中に入っている個々のデータ

これにより、
「この人の情報」「この敵の情報」
といった 現実世界の感覚そのまま
データを扱えるようになります。

構造体で整理すると世界が変わる

ここからは、
最終的に使っていく構造体をイメージしながら説明します。

職業を表す enum

typedef enum {
    HERO,
    WARRIOR,
    MAGE
} Job;

enum を使うことで、
職業を意味のある名前で表現できます。

意味
HERO勇者
WARRIOR戦士
MAGE魔法使い

数字よりも、
意味が一目で分かるコード になりますね。

キャラクターを表す構造体

typedef struct {
    char name[20];
    Job job;
    int level;
    int hp;
    int max_hp;
    int atk;
    int magic;
} Character;

この構造体1つで、
「キャラクターとは何か」がすべて表現されています。

メンバー内容
name名前
job職業
levelレベル
hp現在HP
max_hp最大HP
atk攻撃力
magic魔力

もう、
heroHp や heroAtk を個別に追いかける必要はありません 😊

アイテム・敵も同じ考え方で整理

typedef struct {
    char name[20];
    int atk;
    int magic;
} Item;

typedef struct {
    char name[20];
    int hp;
    int atk;
    int exp;
} Enemy;

それぞれ、

  • アイテムとは何か
  • 敵とは何か

を、構造として表しています。

これが「データを整理する」ということなんですね。

構造体と現実世界の対応関係

構造体は、
現実世界の物や人をそのままコードに持ち込む ときに
とても強力です。

構造体:書籍

メンバー内容
title本のタイトル
author著者
price価格

構造体:学生

メンバー内容
id学籍番号
name名前
score点数

こう考えると、
構造体は特別な存在ではなく、
人間の考え方をそのままプログラムにしたもの
だと分かってきますね 😊

構造体は複雑性への第一の武器

構造体を使うことで、

  • データが整理される。
  • 関係性が分かりやすくなる。
  • 修正や拡張が楽になる。

という、大きなメリットが得られます。

複雑性に正面から立ち向かうための
最初の、そして最重要な一歩
それが構造体です 💪

構造体を理解した瞬間、
「今までの混乱は何だったんだ!」
と感じるはずですよ。