C言語編 第26章 構造体 解答ページ

先頭へ戻る

問題①

問題① 平面上にある点の座標(x,y) を表現できる Point構造体を作成して下さい。 座標は int型で表現するものとします。


例えば、次のようになります。

#include <stdio.h>

/* 2次元の点 */
typedef struct {
    int x;
    int y;
} Point;

int main(void)
{
    Point point = { 10, 20 };

    printf( "%d %d\n", point.x, point.y );

    return 0;
}

実行結果:

10 20

typedef を使うかどうかはお任せします。 使わない場合は、以下のように定義します。

struct Point_tag {
    int x;
    int y;
};

問題②

問題② 問題①の Point構造体について、次のような関数を作成して下さい。


例えば、次のようになります。

#include <stdio.h>

/* 2次元の点 */
typedef struct {
    int x;
    int y;
} Point;


void printPoint(Point point);
Point addPoint(Point point1, Point point2);
int isEqualPoint(Point point1, Point point2);


int main(void)
{
    Point point1 = { 10, 20 };
    Point point2 = { 15, -10 };
    Point point3;

    point3 = addPoint( point1, point2 );
    printPoint( point3 );

    if( isEqualPoint( point1, point3 ) ){
        puts( "一致" );
    }
    else{
        puts( "不一致" );
    }

    return 0;
}

/*
    Point構造体のメンバを出力する。
*/
void printPoint(Point point)
{
    printf( "(%d, %d)\n", point.x, point.y );
}

/*
    2つの Point構造体を加算して返す。
    戻り値:
        加算結果。
*/
Point addPoint(Point point1, Point point2)
{
    Point result;
    result.x = point1.x + point2.x;
    result.y = point1.y + point2.y;
    return result;
}

/*
    2つの Point構造体が一致するかを返す。
    戻り値:
        一致するなら 1、不一致なら 0 を返す。
*/
int isEqualPoint(Point point1, Point point2)
{
    if( point1.x == point2.x && point1.y == point2.y ){
        return 1;
    }
    return 0;
}

実行結果:

(25, 10)
不一致

構造体に対しては、四則演算や比較を行えませんから、メンバ1つ1つを個別に扱わなければなりません。 そういった処理がよく行われるのであれば、この問題のように、関数化してしまうと便利です。

ここでは、関数に構造体をそのまま受け渡しするようにしていますが、本編にも書いたように、 ある程度の大きさの構造体であれば、第33章で説明するポインタを使って書いた方が、効率的です。

問題③

問題③ 問題①の Point構造体を使って、四角形を表現できる Rect構造体を作成して下さい。


例えば、次のようになります。

#include <stdio.h>

/* 2次元の点 */
typedef struct {
    int x;
    int y;
} Point;

/* 四角形 */
typedef struct {
    Point lt;      /* 左上隅の点 */
    Point rb;      /* 右下隅の点 */
} Rect;


int main(void)
{
    Rect rc;

    rc.lt.x = 10;
    rc.lt.y = 10;
    rc.rb.x = 30;
    rc.rb.y = 40;

    printf( "(%d,%d) - (%d,%d)\n", rc.lt.x, rc.lt.y, rc.rb.x, rc.rb.y );

    return 0;
}

実行結果:

(10,10) - (30,40)

Rect構造体は、Point構造体とともに、よく使われる構造体です。 その実装方法は幾つか考えられますが、ここでは、2つの Point構造体で作ります。 この場合、左上隅の座標と、右下隅の座標とを保持するようにすれば良いでしょう。

Rect構造体の他の実装方法としては、例えば以下のような考え方があります。

また、Point構造体を使わずに、ばらばらの 4つの変数に分解することも考えられます。 いずれにしても、問題②のときと同様、処理を補助する関数を幾つか用意してこそ、便利な部品となるでしょう。



参考リンク



更新履歴

'2018/3/1 全面的に文章を見直し、修正を行った。

'2015/8/24 リンク先を修正。

'2009/8/30 新規作成。



第26章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー