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

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

C++プログラミング入門その26 構造体の中の構造体

<<前  [TOP]  次>>


Visual Studioで新規プロジェクトを作り、以下の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}};

void 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}で初期化しています。


実行結果です。



Visual Studioで新規プロジェクトを作り、以下の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}};

void 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


上の式では、絶対値の記号||を用いていますが、面積は正になるように、if文を用いています。


実行結果です。



Visual Studioで新規プロジェクトを作り、以下のcppファイルを作成して下さい。


Kouzoutai7.cpp 直

#include <iostream>

struct Point {

        float x;
        float y;
};

struct Triangle {

        struct Point a, b, c;
};

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

void 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へのポインタとしました。
関数の返値は三角形の面積です。


実行結果です。



<<前  [TOP]  次>>