↓↓クリックして頂けると励みになります。
【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 | ポインターの応用】
↓↓クリックして頂けると励みになります。