next up previous contents
Next: 21. ポインタII Up: 20. 構造体 III Previous: 4. 関数と構造体

5. 課題 20

cd c を実行した後で( ~/c に移動した後で )、以下の課題を やってみよ。

課題 20.1
構造体の中の構造体 I

平面上の点をあらわす構造体 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) $ になるように初期化するプログラムを作り、 頂点座標を次のように出力せよ。


      三角形の頂点
      ( 1.0, 1.0),
      ( 5.0, 3.0),
      ( 4.0, 2.0)

実際には、実数で出力すると値がもう少し長くなるが、それは気にしなくて良い。

課題 20.2
構造体の中の構造体 II

課題 20.1 を用いて、三角形の面積を計算するプログラムを作成せよ。

但し、三角形の面積 $S$ は、 3 つの頂点の座標を $ (x_1, y_1), (x_2, y_2), (x_3, y_3)$ とした場合、次の式で計算される。

\begin{displaymath}
S = \frac{\vert (x_3 - x_1) (y_2 - y_1) - (x_2 - x_1) (y_3 - y_1)\vert}{2}
\end{displaymath}

頂点は、課題 20.1 で初期化した値を用いよ。 また、上の式では絶対値の記号 | | を用いているが、 面積は正になるように if 文を用いてプログラムすれば良い。

課題 20.3
構造体の中の構造体と関数, ポインタ

課題 20.2 を用いて、三角形の面積を計算する関数を作成せよ。但し、 関数の引数は構造体 Triangle へのポインタであるとし、関数の 返値は三角形の面積である。


    struct Point {
        float x;
        float y;
    };
    struct Triangle {
        struct Point a, b, c;
    };
    /* 関数宣言をここに */
    main(){
        struct Triangle tri = { ... }; /* 課題 20.2 と同じ */
        float s;
        s = menseki( &tri );
        printf("面積は %f \n", s);
    }
    ... menseki(....){    /* 関数の型宣言、引数に注意せよ */
        ....
    }

作成したプログラムをメイルで creport まで送りなさい。題は、kadai20 とする事。

前回の復習
構造体の中の構造体

構造体のメンバーに既に定義した構造体を含める事が出来る。 構造体の中の構造体のメンバーへのアクセスは以下のように行う。

[構造体変数].[メンバー名].[メンバー名]

構造体同士の参照

構造体の定義において互いに参照をすることは何れかが未定義の状態 となるので許されない。

構造体の隠蔽

構造体タグ名においては、外部変数とローカル変数の隠蔽と同じように 、隠蔽が行われる。

構造体が構造体を含む場合の初期化

構造体の中に構造体が含まれる場合の初期化は正式には以下のように 行う。


    struct Point { float x, y; };
    struct Line  { struct Point a, b; };
    struct Line l = { {0.0, 0.0}, {2.0, 2.0} };

構造体の中に配列が含まれる場合も同様である。



Noriyo Kanayama