問題① 平面上にある点の座標(x,y) を表現できる Point構造体を作成してください。 座標は int型で表現するものとします。
たとえば、次のようになります。
#include <stdio.h>
// 2次元の点
typedef struct {
int x;
int y;
} Point;
int main(void)
{
= {10, 20};
Point point
("%d %d\n", point.x, point.y);
printf}
実行結果:
10 20
typedef を使うかどうかはお任せします。使わない場合は、以下のようになります。
#include <stdio.h>
// 2次元の点
struct Point_tag {
int x;
int y;
} Point;
int main(void)
{
struct Point_tag point = {10, 20};
("%d %d\n", point.x, point.y);
printf}
実行結果:
10 20
問題② 問題①の Point構造体について、次のような関数を作成してください。
たとえば、次のようになります。
#include <stdio.h>
#include <stdbool.h>
// 2次元の点
typedef struct {
int x;
int y;
} Point;
void print_point(Point point);
(Point point1, Point point2);
Point add_pointbool is_equal_point(Point point1, Point point2);
int main(void)
{
= {10, 20};
Point point1 = {15, -10};
Point point2 ;
Point point3
= add_point(point1, point2);
point3 (point3);
print_point
if (is_equal_point(point1, point3)) {
("Equal.");
puts}
else {
("Not equal.");
puts}
}
// Point構造体のメンバを出力する
void print_point(Point point)
{
("(%d, %d)\n", point.x, point.y);
printf}
// 2つの Point構造体を加算して返す。
// 戻り値: 加算結果
(Point point1, Point point2)
Point add_point{
;
Point result.x = point1.x + point2.x;
result.y = point1.y + point2.y;
resultreturn 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
.lt.x = 10;
rc.lt.y = 10;
rc.rb.x = 30;
rc.rb.y = 40;
rc
("(%d,%d) - (%d,%d)\n", rc.lt.x, rc.lt.y, rc.rb.x, rc.rb.y);
printf}
実行結果:
(10,10) - (30,40)
Rect構造体は、Point構造体とともに、よく使われる構造体です。その実装方法はいくつか考えられますが、ここでは2つのPoint構造体を組み合わせて作っています。この場合、左上隅の座標と、右下隅の座標とを保持するようにすれば良いでしょう。
Rect構造体の他の実装方法としては、たとえば以下のような考え方があります。
また、Point構造体を使わずに、ばらばらの 4つの変数に分解することも考えられます。
()
の前後の空白の空け方)(
の直後、)
の直前に空白を入れない)return 0;
を削除(C言語編全体でのコードの統一)全面的に文章を見直し、修正を行った。
リンク先を修正。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |