080128


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

080128

試験とかあるので提出は二週間先までということで。来週はおやすみします。

二次元座標の計算

二点間の距離を返す関数、二点の中点を返す関数を書いてください。
なお、点は下に示す構造体で示されるものとします。
struct Point{
  double x, y;
};
また、以下の仕様を満たすことを条件とします。

  • Point型の引数を二つ受け取る。
  • 距離を返す関数はdoubleを、中点を返す関数はPoint型オブジェクトを返してください。

構造体が分からない人はwiki…は書き進んでないので手元の参考書を参照してください :-)

連絡

京都とか行ってて更新が遅れました。
さて11日現在、二人しか提出されてません。さらにきちんと解けてる人がいない状況なので来週までとりえず伸ばします。

uhito
普通に値として構造体を返せば問題ないです。
/* Pointを返すだけの関数 */
struct Point point_return(){
  struct Point pt;
  return pt;
}

ikura
前者に関しては、putcharがchar型の変数を一つ受け取るように、距離を返す関数と中点を返す関数はPoint型の変数をふたつ受け取る、というそのままの意味なのですが…
例えばPoint型の変数を一つ受け取る関数は下のようにかけますね。
void func(struct Point pt){}
後者はすみません。書き方が悪かったです。中点を返す関数はPoint型の値を返してください、という意味です。というか中点を返す関数が点以外の物返してどうする、という話ですね。

構造体とは

簡単に説明。
構造体とは複数の値をまとめておくための物です。
例えば二次元座標は二つの値を使って表されますが、二つの値を別々にではなく、一つの座標として扱いたいことがあります。
関数から座標を返したい時などですね。そのままでは一つの値しか返すことができません。
そういった場合に、内部に二つの値を持つ一つの値として構造体を定義してやれば、二つの値を返すことができる、というわけです。
値の取り出し方、書き込み方は、今回の例に合わせると、
struct Point pt;
pt.x = pt.y = 0; /* 書き込み */
int i = pt.x; /* 取り出し */
のような感じです。「.」を使います。
C言語では構造体の型を宣言するときは、組み込み型(int や double)とは違って、struct と明示的に構造体であることを表す必要があります。注意。
追記:構造体のページを作りました。

解答例

#include <math.h>
double range(struct Point pt1, struct Point pt2){
  double mx = pt1.x - pt2.x, my = pt1.y - pt2.y;
  return sqrt(mx * mx + my * my);
}

struct Point middle_point(struct Point pt1, struct Point pt2){
  struct Point ret;
  ret.x = (pt1.x + pt2.x) / 2.0;
  ret.y = (pt1.y + pt2.y) / 2.0;
  return ret;
}

採点

uhito
原点と、じゃなくて二点間の、です…
ikura
一応#include <math.h>は書いてね。あと冗長な一時変数が多いです。
tatikoma
よろしー。ただstruct Point disは必要無いと思う。
take
差が負だろうと二乗すれば正になると思うよ!