学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

C++ | 23 | 構造体の中の構造体

↓↓クリックして頂けると励みになります。



22 | 構造体へのポインター】 << 【ホーム】 >> 【24 | ポインターの応用


構造体の中の構造体
構造体の中の構造体



C++における構造体(struct)の中に別の構造体を含めることができます。
これは、複雑なデータ構造を表現するために非常に便利です。構造体の中に構造体を含めることで、関連するデータをグループ化し、より構造化された形でプログラムを記述できます。




Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【Kouzoutai5.cpp】

#include <iostream>

struct Point {

	float x;
	float y;
};

struct Triangle {

	struct Point a, b, c;
};

struct Triangle tri = { {1.0, 1.0}, {5.0, 3.0}, {4.0, 2.0}};

int main() {

	std::cout << "三角形の頂点" << std::endl;
	std::cout << "(" << tri.a.x << "," << tri.a.y << ")" << std::endl;
	std::cout << "(" << tri.b.x << "," << tri.b.y << ")" << std::endl;
	std::cout << "(" << tri.c.x << "," << tri.c.y << ")" << std::endl;
}



平面上の点を表す構造体Point を用いて、三角形の3つの頂点座標をメンバーに持つ構造体Triangleを以下のように定義しました。

struct Point {

    float x;
    float y;
};

struct Triangle {

        struct Point a, b, c;
};

この定義を用いて構造体Triangle型の変数triを宣言し、3頂点が(1.0,1.0),(5.0,3.0), 4.0,2.0)になるように初期化して頂点座標を出力するプログラムです。


このように構造体Triangleのメンバー a, b, c のメンバー x, y にアクセスするには次のようにします。

tri.a.x;
tri.b.y;
tri.c.x;



構造体が構造体を含む場合に初期化する方法の例です。

例
     struct Point {
        int x;
        int y;
    };

    struct Triangle {
        struct Point t1, t2, t3;
    };

    struct Trianlge tri = { {0, 0}, {1, 1}, {2, 2} };

struct triangle型の構造体変数aはstruct Point型の構造体メンバーt1, t2, t3を含み、struct Point型は整数のメンバーx, yを含むので、構造体変数triは6個の整数を含んでいることになります。
従ってこの例の最後の行のように、struct Triangle型の変数triの3つのメンバーを{0, 0}と{1, 1}と{2, 2}で初期化しています。


実行結果です。


~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Kouzoutai5.cpp -o Kouzoutai5 && "/Users/**/Desktop/Programming/CPP/"Kouzoutai5

三角形の頂点
(1,1)
(5,3)
(4,2)


Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【Kouzoutai6.cpp】

#include <iostream>

struct Point {

        float x;
        float y;
};

struct Triangle {

        struct Point a, b, c;
};

struct Triangle tri = { {1.0, 1.0}, {5.0, 3.0}, {4.0, 2.0}};

int main() {

        std::cout << "三角形の頂点" << std::endl;
		std::cout << "(" << tri.a.x << "," << tri.a.y << ")" << std::endl;
		std::cout << "(" << tri.b.x << "," << tri.b.y << ")" << std::endl;
		std::cout << "(" << tri.c.x << "," << tri.c.y << ")" << std::endl;

	float s;

	if ((tri.c.x - tri.a.x)*(tri.b.y - tri.a.y) > (tri.b.x - tri.a.x)*(tri.c.y - tri.a.y)) {

		s = ((tri.c.x - tri.a.x)*(tri.b.y - tri.a.y) - (tri.b.x - tri.a.x)*(tri.c.y - tri.a.y))/2;
	}
	else if ((tri.c.x - tri.a.x)*(tri.b.y - tri.a.y) < (tri.b.x - tri.a.x)*(tri.c.y - tri.a.y)) {

		s = ((tri.b.x - tri.a.x)*(tri.c.y - tri.a.y) - (tri.c.x - tri.a.x)*(tri.b.y - tri.a.y))/2;
	}
	std::cout << "三角形の面積 S =" << s << std::endl;
}



三角形の面積を計算するプログラムです。


三角形の面積Sは3つの頂点の座標を(x1, y1)、(x2, y2)、(x3, y3)とした場合次の式で計算できます。


S=|(x3 - x1)(y2 - y1) - (x2 - x1)(y3 - y1)| ÷2


上の式では面積が常に正になるように絶対値の記号「| |」を用いていますが、サンプルプログラム「Kouzoutai6.cpp」ではif文を使っています。


実行結果です。

~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Kouzoutai6.cpp -o Kouzoutai6 && "/Users/**/Desktop/Programming/CPP/"Kouzoutai6

三角形の頂点
(1,1)
(5,3)
(4,2)
三角形の面積 S =1



Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【Kouzoutai7.cpp】

#include <iostream>

struct Point {

    float x;
    float y;
};

struct Triangle {

    struct Point a, b, c;
};

float menseki (struct Triangle *t);	/* 関数の宣言 */

int main() {

	struct Triangle tri = { {1.0, 1.0}, {5.0, 3.0}, {4.0, 2.0}};

	float s;
	s = menseki( &tri );

    std::cout << "三角形の頂点" << std::endl;
    std::cout << "(" << tri.a.x << "," << tri.a.y << ")" << std::endl;
    std::cout << "(" << tri.b.x << "," << tri.b.y << ")" << std::endl;
    std::cout << "(" << tri.c.x << "," << tri.c.y << ")" << std::endl;

    std::cout << "三角形の面積 S =" << s << std::endl;
}

float menseki (struct Triangle *t) {

    float s;

    if ((t->c.x - t->a.x)*(t->b.y - t->a.y) > (t->b.x - t->a.x)*(t->c.y - t->a.y)) {

            s = ((t->c.x - t->a.x)*(t->b.y - t->a.y) - (t->b.x - t->a.x)*(t->c.y - t->a.y))/2;
    }
    else if ((t->c.x - t->a.x)*(t->b.y - t->a.y) < (t->b.x - t->a.x)*(t->c.y - t->a.y)) {

            s = ((t->b.x - t->a.x)*(t->c.y - t->a.y) - (t->c.x - t->a.x)*(t->b.y - t->a.y))/2;
	}
	return s;
}



「Kouzoutai6.cpp」と処理は同じですが面積の計算部分を関数に分け、関数の引数は構造体Triangleへのポインタとしました。
関数の返値は三角形の面積です。


実行結果は「Kouzoutai6.cpp」と同じです。


22 | 構造体へのポインター】 << 【ホーム】 >> 【24 | ポインターの応用





↓↓クリックして頂けると励みになります。

関連記事(外部サイト)