問題① 平面上にある点の座標(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つの変数に分解することも考えられます。
() の前後の空白の空け方)( の直後、) の直前に空白を入れない)return 0; を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
| X で ポスト/フォロー | LINE で送る | noteで書く |
|
|
管理者情報 | プライバシーポリシー |