プログラミング言語での構造体について紹介します。
「構造体」は変数の中に変数をネストして格納できる仕組みです。グループとしてまとめて管理したい変数を1つの構造体に格納することで、意味を持たせて変数を管理できます。また構造体内の変数(メンバ変数)は同じ名前を利用できるため、変数の意味を持たせわかりやすくなります。
構造体を利用しない場合のコードを紹介します。
int main()
{
int p1x, p1y, p1z;
int p2x, p2y, p2z;
p1x = 3;
p1y = 4;
p1z = 1;
p2x = 6;
p2y = 3;
p2z = 2;
printf("(%d,%d,%d)\r\n", p1x, p1y, p1z);
printf("(%d,%d,%d)\r\n", p2x, p2y, p2z);
char buffer[10];
fgets(buffer, 10, stdin);
return 0;
}
今回のプログラムでは、(x,y,z)の3つの座標を持つ空間の点を表現するプログラムです。2点の座標を扱う場合、1点目のx,y,z座標を格納する変数をp1x,p1y,p1zとしています。2点目の座標を格納する変数はp2x,p2y,p2zとしています。同様に3点目であれば p3x,p3y,p3z と変数を用意します。
この方法でもx,y,z座標は管理できますが、空間中の座標をグループとして扱うことはできず、名前の違いのみで管理します。各変数は独立して存在しているため、1つの座標点を表現する場合も変数名の一致のみで合わせることになります。
構造体を利用する場合のコードを紹介します。
struct MyPosition
{
int x;
int y;
int z;
};
int plot(MyPosition pos);
int main()
{
MyPosition mypos1;
MyPosition mypos2;
mypos1.x = 3;
mypos1.y = 4;
mypos1.z = 1;
mypos2.x = 6;
mypos2.y = 3;
mypos2.z = 2;
printf("(%d,%d,%d)\r\n", mypos1.x, mypos1.y, mypos1.z);
printf("(%d,%d,%d)\r\n", mypos2.x, mypos2.y, mypos2.z);
char buffer[10];
fgets(buffer, 10, stdin);
return 0;
}
下記のコードで構造体を定義しています。MyPosition という構造体で3次元の点を表現する構造を用意します。座標の値は構造体内の変数(メンバ変数) x, y, x に格納できるよう構造体内に3つの変数を宣言しています。
struct MyPosition
{
int x;
int y;
int z;
};
定義(宣言)した構造体は変数と同様に宣言して利用できます。
MyPosition mypos1;
構造体の内部の変数を参照する場合や、値を代入する場合は 構造体の変数名.メンバ変数名
でアクセスできます。
mypos1.x = 3;
mypos1.y = 4;
mypos1.z = 1;
printf("(%d,%d,%d)\r\n", mypos1.x, mypos1.y, mypos1.z);
構造体を用いることで、x,y,z の値を3つもつ座標を1つの名称で表現することができ、構造的な意味を持たせることができます。
struct MyPosition
{
int x;
int y;
int z;
};
int plot(MyPosition pos);
int main()
{
MyPosition mypos1;
MyPosition mypos2;
mypos1.x = 3;
mypos1.y = 4;
mypos1.z = 1;
mypos2.x = 6;
mypos2.y = 3;
mypos2.z = 2;
plot(mypos1);
plot(mypos2);
char buffer[10];
fgets(buffer, 10, stdin);
return 0;
}
int plot(MyPosition pos) {
printf("(%d,%d,%d)\r\n", pos.x, pos.y, pos.z);
return 0;
}
先のプログラムとほぼ同様ですが、画面表示のprintfを呼び出す部分が別の関数になっており、関数の第一引数がMyPosition 型となっています。この記述により、plot関数には、単純に数値を3つ渡す関数ではなく、x,y,z座標を持つ構造体を与える関数であることがわかります。構造体を利用する関数を作成することで引数の意味もより明確にできます。