2 構造体の定義

   2.3 構造体の例
 ここでは構造体の利用例を紹介します。
  1. 図書リスト
    図書のデータのメンバとして次の項目を考えます。
    • 署名 (文字列)
    • 著者 (文字列)
    • 出版社 (文字列)
    • 値段 (整数)
    この構造体を構造体タグ "book_tag" で定義すると次のようになります。
    struct book_tag {        /* bookタグ */
       char title[20];      /* 書名 */
       char auther[20];     /* 著者 */
       char publisher[20];  /* 出版社 */
       int price;           /* 価格 */
    } book;                /* 構造体の定義 */
    
  2. アドレス帳データ
    アドレス帳データのメンバとして次の項目を考えます。
    • 氏名 (文字列)
    • 住所 (文字列)
    • 郵便番号 (整数)
    • 誕生年 (整数)
    • 誕生月 (整数)
    • 誕生日 (整数)
    この構造体を構造体タグ "friend_tag" で定義すると次のようになります。
    struct friend_tag {     /* アドレスタグ */
       char name[10];      /* 名前 */
       char address[10];   /* 住所 */
       int zipcode;         /* 郵便番号 */
       int year;           /* 誕生年 */
       int month;          /* 誕生月 */
       int day;            /* 誕生日 */
    } friend;                /* 構造体の定義 */
    
     ここで生年月日は日付を表すまとまったデータとみなすことができるので日付という構造体を "date_tag" で定義し、"friend_tag" のメンバとして "date_tag" 型のものを考えることができます。そのときの定義は次のようになります。
    struct date_tag {       /* 日付のタグ */
       int year;         /* 年 */
       int month;        /* 月 */
       int day;          /* 日 */
    };
    
    struct friend_tag {               /* アドレスタグ */
        char name[10];              /* 名前 */
       char address[10];           /* 住所 */
       int zipcode;               /* 郵便番号 */
        struct date_tag birthday;  /* 誕生日 */
    } friend;                     /* 構造体の定義 */
    
     このように定義したときの誕生日を参照する方法は次のようになります。
    • 誕生年の参照: friend.birthday.year
    • 誕生月の参照: friend.birthday.month
    • 誕生日の参照: friend.birthday.day

  3. 図形データ
     平面上の図形を表現する場合図形は複数の線分の組合せによって表現でき、また線分は空間上の2点によって表すことができます。すると次のようにして図形のデータを管理することができます。
    • 点の座標データ
      x, y 座標 (実数)

      座標データのイメージ

    • 線分のデータ
      始点と終点の座標

      線分データのイメージ

    • 長方形
      2つの角となる点の座標

      長方形データのイメージ


    • 中心となる点の座標と半径の長さ

      円データのイメージ

    それぞれを構造体タグ "point_tag"、"line_tag"、"rectangle_tag"、"circle_tag"で定義すると次のようになります。
    struct point_tag {          /* 座標タグ */
       float x_axis;          /* x 座標 */
       float y_axis;          /* y 座標 */
    };
    
    struct line_tag {              /* ラインタグ */
       struct point_tag start;   /* 始点 */
       struct point_tag end;      /* 終点 */
    };
    
    
    struct rectangle_tag {           /* 長方形タグ */
       struct point_tag corner1;    /* 角 1 */
       struct point_tag corner2;   /* 角 2 */
    };
    
    struct circle_tag {             /* 円タグ */
       struct point_tag point;     /* 中心点 */
       float radius;              /* 半径 */
    };