構造体変数に配列を使いたい!
構造体が難しくて分からない。
複数の情報をまとめて管理できるプログラムを知りたい!
この記事を読めば、これらの悩みを解決できます。
今回の話を理解するために、まずは「配列」を理解しておく必要があります。過去に解説しているので参考にしてみてください。
また、構造体は今回と残り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つもあるからです。
今すぐに覚える必要は無いと思います。また、全ての宣言方法を覚える必要もありません。
ですが、自分でこの情報をすぐに見つけられるようにしましょう。例えば、この記事をブックマークしておくだけで、覚えるという手間が省けます。ぜひ、実践してみてください。
次は、構造体の初期化方法を詳しく勉強してみましょう。
コメント