C言語 入門 構造体 複数の情報をまとめて管理 配列、メンバ指定

C Language

構造体変数に配列を使いたい!

構造体が難しくて分からない。

複数の情報をまとめて管理できるプログラムを知りたい!

この記事を読めば、これらの悩みを解決できます。

今回の話を理解するために、まずは「配列」を理解しておく必要があります。過去に解説しているので参考にしてみてください。

また、構造体は今回と残り2回、合計3回に分けて解説していきます。 

構造体って何? 使い方まで詳しく解説!

構造体は、複数の情報をまとめて管理するためにあります。まとめて管理する方法は、「配列」とほとんど同じだと思ってもらって大丈夫です。

例えば、とある3人の「名前」、「身長」、「体重」も3つをまとめて管理するとします。「名前」、「身長」、「体重」のような構造体で管理する変数や配列のことを「構造体メンバー」と言います。

表で表すとこんな感じです。

  名前(name)   身長(height)  体重(weight)
Mark 165.4 47.8
Tom 159.5 45.6
John 167.8 52.3

今回は、この表の情報を構造体を使って管理し、出力するプログラムをつくっていきます。

では、構造体を使うにはどうすれば良いでしょうか?構造体を使うための方法は全部で3通りあります。今回はその中の一つを紹介します。

構造体の宣言方法

構造体を使うには、変数と同様、使うことを宣言する必要があります。

3人の名前、身長、体重を構造体で管理するプログラムはこのようになります。

struct INFO
{
	char name[20];
	float height;
	float weight;
};
struct INFO search[3];

このプログラムの説明をしていきます。

struct INFO

{

};

とすることで「INFOという名前の構造体を宣言する」という意味になります。

また、

struct INFO search[3];

とすることで、「struct INFOというデータ型で、3つのデータを保存する配列『search』を宣言する」という意味になります。この配列「search」のことを「構造体変数」(構造体配列)と言います。

こうすることで、search[0]にはMarkの情報、search[1]にはTomの情報、search[2]にはJohnの情報を保存することが可能になります。また、「情報」は構造体により、まとめて管理されているため、例えばsearch[0]には、Markの名前、身長、体重の全てが保存されることになります。

ここまでは、簡単に言えば変数宣言と同じようなものです。

構造体変数の初期化(代入)

ここからは、構造体変数を初期化(代入)するプログラムになります。

search[0] = { "Mark",165.4,47.8 };
search[1] = { "Tom", 159.5, 45.6 };
search[2] = { "John",167.8,52.3 };

構造体の中で名前(name)、身長(height)、体重(weight)の順に変数宣言をしたので、その順番で代入します。

構造体メンバーの出力方法

最後に、printf関数で出力するプログラムになります。全部を出力するとプログラムが長くなってしまうので、Markの情報だけ出力します。

printf("%s¥n", search[0].name);
printf("%.1fcm¥n", search[0].height);
printf("%.1fkg¥n¥n", search[0].weight);

このように、構造体メンバーは、

構造体配列.構造体メンバー

のようにして通常の変数と同じように扱うことができます。配列の場合も同様です。

一応言っておくと、身長と体重は元々小数1桁まで出力したいので、変換書式の部分を「%.1f」にしています。(その後ろのcm、kgは記号です。)

ここまでのプログラムをまとめてみます。

ただし、Mark、Tom、Johnの情報を全部出力できて、長くないプログラムをつくるために、「for文」を使ってsearch[0]の0の部分を変化させるようにします。

また、見栄えの関係で、「マクロ」を使っていたり、少し変更している部分があります。分からないところがあったら、過去の記事で解説しているので、参考にしてみてください。

#include <stdio.h>
#define N 3
int main()
{
   struct INFO
   {
      char name[20];
      float height;
      float weight;
   };
   struct INFO search[N];
   
   int i;

   
   search[0] = { "Mark",165.4,47.8 };
   search[1] = { "Tom", 159.5, 45.6 };
   search[2] = { "John",167.8,52.3 };
	

   for (i = 0; i < N; ++i)
   {
      printf("name  :%s¥n",search[i].name);
      printf("height:%.1fcm¥n",search[i].height);
      printf("weight:%.1fkg¥n¥n",search[i].weight);
   }
}

プログラムはこんな感じです。

では、出力してみます。

このようにして、3つの情報を構造体で管理することができます。

構造体の宣言方法全種類まとめてみた!

構造体の宣言方法は全部で3種類あるのでまとめてみます。

最初に紹介した、基本的な構造体の宣言方法です。

   struct INFO
   {
      char name[20];
      float height;
      float weight;
   };
   struct INFO search[3];

次は、構造体の宣言と構造体変数の宣言を同時に行うことで、少し短くしたプログラムです。

   struct INFO
   {
      char name[20];
      float height;
      float weight;
   }search[3];

最後に、typedefというものを使った方法です。typedefについては、いずれ詳しく解説します。

   typedef struct
   {
      char name[20];
      float height;
     float weight;
   }INFO;
   INFO search[3];

構造体の宣言方法は、この3種類のどれでも問題ないです。どの種類でも、構造体変数の初期化、出力は同じようにできます。

まとめ

正直言って、構造体は覚えることがとても多いです。構造体の宣言方法が3つもあるからです。

今すぐに覚える必要は無いと思います。また、全ての宣言方法を覚える必要もありません。

ですが、自分でこの情報をすぐに見つけられるようにしましょう。例えば、この記事をブックマークしておくだけで、覚えるという手間が省けます。ぜひ、実践してみてください。

次は、構造体の初期化方法を詳しく勉強してみましょう。