Programming Place Plus トップページ – C言語編 – 第26章
問題① 平面上にある点の座標(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 を使うかどうかはお任せします。 使わない場合は、以下のように定義します。
struct Point_tag {
int x;
int y;
};
問題② 問題①の Point構造体について、次のような関数を作成してください。
たとえば、次のようになります。
#include <stdio.h>
#include <stdbool.h>
/* 2次元の点 */
typedef struct {
int x;
int y;
} Point;
void printPoint(Point point);
(Point point1, Point point2);
Point addPointbool isEqualPoint(Point point1, Point point2);
int main(void)
{
= { 10, 20 };
Point point1 = { 15, -10 };
Point point2 ;
Point point3
= addPoint( point1, point2 );
point3 ( point3 );
printPoint
if( isEqualPoint( point1, point3 ) ){
( "一致" );
puts}
else{
( "不一致" );
puts}
}
/*
Point構造体のメンバを出力する。
*/
void printPoint(Point point)
{
( "(%d, %d)\n", point.x, point.y );
printf}
/*
2つの Point構造体を加算して返す。
戻り値:
加算結果。
*/
(Point point1, Point point2)
Point addPoint{
;
Point result.x = point1.x + point2.x;
result.y = point1.y + point2.y;
resultreturn result;
}
/*
2つの Point構造体が一致するかを返す。
戻り値:
一致するなら真、不一致なら偽を返す。
*/
bool isEqualPoint(Point point1, Point point2)
{
return ( point1.x == point2.x && point1.y == point2.y );
}
実行結果:
(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
.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言語編全体でのコードの統一)’2018/3/1 全面的に文章を見直し、修正を行った。
’2015/8/24 リンク先を修正。
’2009/8/30 新規作成。
Programming Place Plus のトップページへ