ページ 1 / 1
2点間の距離を求める
Posted: 2006年12月12日(火) 22:06
by ☆
質問です!!
お願いします。
以下の3つの条件を満たすプログラムを作成せよ.
* x座標およびy座標のペアとして構成されるPOINT構造体を以下に示すように定義せよ.
* 2つ以上5つまでの任意の数の座標p1(x,y)~pn(x,y)の入力を受け付け,構造体配列に代入せよ.
* 任意の二つの座標を選び,その座標間の距離を出力せよ.
という問題です。
自分で作ったのが、
#include <stdio.h>
#include <math.h>
#define range(v1,v2,w1,w2) (sqrt((v1-w1)*(v1-w1)+(v2-w2)*(v2-w2)))
int main()
{
double x[2], y[2];
printf("2次元空間の点の座標を入力して下さい ");
scanf("%lf %lf", &x[0], &x[1]);
printf("もう1つの点の座標を入力して下さい ");
scanf("%lf %lf", &y[0], &y[1]);
printf(" 2つの点の距離は %f\n", range(x[0],x[1],y[0],y[1]));
return 0;
}
です。一応、距離はできたんですが・・構造体を使わなければいけないので・・・・
しかも、『2つ以上5つまでの任意の数の座標p1(x,y)~pn(x,y)の入力を受け付け,構造体配列に代入せよ.』
というところもプログラミングに反映されていませんよねぇ。。
もーこれ以上分からない状況に陥っています。。御指導お願いします。
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 22:28
by box
サンプルです。
#include <stdio.h>
#include <math.h>
#define range(v1,v2,w1,w2) (sqrt((v1-w1)*(v1-w1)+(v2-w2)*(v2-w2)))
typedef struct {
double x;
double y;
} POINT;
int main(void)
{
POINT p[5];
int n, i, a, b;
do {
printf("いくつの点を入力しますか?(2~5):");
scanf("%d", &n);
} while (n < 2 || 5 < n);
for (i = 0; i < n; i++) {
printf("p%dのx,y座標を入力してください:", i + 1);
scanf("%lf%lf", &p.x, &p.y);
}
do {
printf("2つの点を選んでください(1~%d):", n);
scanf("%d%d", &a, &b);
} while ((a == b) || (a < 1 || n < a) || (b < 1 || n < b));
printf("%f %f\n", p[a-1].x, p[a-1].y);
printf("%f %f\n", p[b-1].x, p[b-1].y);
printf("この2点間の距離は\n");
printf("%f\n", range(p[a-1].x, p[a-1].y, p[b-1].x, p[b-1].y));
return 0;
}
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 22:35
by ☆
返信ありがとうございます。
それで、質問なんですが、自分で書いといて、悪いんですが、
#define range(v1,v2,w1,w2) (sqrt((v1-w1)*(v1-w1)+(v2-w2)*(v2-w2)))
ってなんですか??授業で今日やったので、使ってみたんですが、意味が分かりませんでした。
あと、
typedef struct {
double x;
double y;
} POINT;
のところは、単に、
struct POINT{
int x;
int y;
};
でもいいんでしょうか??
typedefは使わないこと!!!って言う条件なんですよねぇ。。
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 23:01
by box
> #define range(v1,v2,w1,w2) (sqrt((v1-w1)*(v1-w1)+(v2-w2)*(v2-w2)))
#defineは、コンパイル時に、文字の置き換えを行ないます。
今回は、コード中に
range(p[a-1].x, p[a-1].y, p[b-1].x, p[b-1].y)
という記述があります。
したがって、
v1→p[a-1].x
v2→p[a-1].y
w1→p[b-1].x
w2→p[b-1].y
という置き換えを行ないます。つまり、
range(p[a-1].x, p[a-1].y, p[b-1].x, p[b-1].y)
は、
(sqrt((p[a-1].x-p[b-1].x)*(p[a-1].x-p[b-1].x)+(p[a-1].y-p[b-1].y)*(p[a-1].y-p[b-1].y)))
と書いたのと同じです。
typedefを使わないコードの例です。
#include <stdio.h>
#include <math.h>
#define range(v1,v2,w1,w2) \
(sqrt((double)(v1-w1)*(v1-w1)+(double)(v2-w2)*(v2-w2)))
struct POINT {
int x;
int y;
};
int main(void)
{
struct POINT p[5];
int n, i, a, b;
do {
printf("いくつの点を入力しますか?(2~5):");
scanf("%d", &n);
} while (n < 2 || 5 < n);
for (i = 0; i < n; i++) {
printf("p%dのx,y座標を入力してください:", i + 1);
scanf("%d%d", &p.x, &p.y);
}
do {
printf("2つの点を選んでください(1~%d):", n);
scanf("%d%d", &a, &b);
} while ((a == b) || (a < 1 || n < a) || (b < 1 || n < b));
printf("%5d%5d\n", p[a-1].x, p[a-1].y);
printf("%5d%5d\n", p[b-1].x, p[b-1].y);
printf("この2点間の距離は\n");
printf("%f\n", range(p[a-1].x, p[a-1].y, p[b-1].x, p[b-1].y));
return 0;
}
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 23:04
by ☆
なるほど!!!!
やっとのことで、今日の授業もわかりました★^^;
ありがとうございます。
これは、ライブラリー関数なので、cc -lm test.cという風にコンパイルするんですよね!!
本当に分かりやすい、説明、ありがとうございました。
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 23:22
by 管理人
☆さん、こんばんは。
遅れてしまって申し訳ないです。
余談ですが、
typedef struct {
・・・
と
struct POINT{
・・・
は、前者だと、宣言時に毎回structって書く手間が省るものだと覚えておくといいと思います。
前者は「int型」みたいに、構造体バージョンの「POINT型」っていう型を作ってくれるんですね。
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 23:26
by ☆
管理人さん、こんばんは。
大丈夫ですよ。
なるほど!!
たしかに、
struct の場合は、なんかいも後で、structって書きますよね☆
そーゆー意味だったんですね。
さらに勉強になりました。
ありがとうございます。
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 23:31
by 管理人
おぉ、お早いお返事ありがとうございます。
構造体は最初結構難しいですよね。
http://www9.plala.or.jp/sgwr-t/c/sec16.html
がんばってください^^
Re:2点間の距離を求める
Posted: 2006年12月12日(火) 23:33
by ☆
いえいえ^^
こっちこそ、丁寧な説明ありがとうざいます☆
これからも、がんばりますよー!!!^^
今回もありがとうございました☆
ではでは、おやすみなさぁーい♪(笑)