構造体 解答ページ | Programming Place Plus C言語編 第26章

トップページ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);
}

実行結果:

10 20

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

#include <stdio.h>

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

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

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

実行結果:

10 20

問題②

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


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

#include <stdio.h>
#include <stdbool.h>

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


void print_point(Point point);
Point add_point(Point point1, Point point2);
bool is_equal_point(Point point1, Point point2);


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

    point3 = add_point(point1, point2);
    print_point(point3);

    if (is_equal_point(point1, point3)) {
        puts("Equal.");
    }
    else {
        puts("Not equal.");
    }
}

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

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

// 2つの Point構造体が一致するかを返す。
// 戻り値: 一致するなら真、不一致なら偽を返す
bool is_equal_point(Point point1, Point point2)
{
    return (point1.x == point2.x && point1.y == point2.y);
}

実行結果:

(25, 10)
Not equal.

構造体に対しては、四則演算や比較を行えませんから、メンバ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);
}

実行結果:

(10,10) - (30,40)

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

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

また、Point構造体を使わずに、ばらばらの 4つの変数に分解することも考えられます。


参考リンク


更新履歴

≪さらに古い更新履歴を展開する≫



第26章のメインページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る