2点間の距離を求める

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

2点間の距離を求める

#1

投稿記事 by » 18年前

質問です!!
お願いします。

以下の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)の入力を受け付け,構造体配列に代入せよ.』
というところもプログラミングに反映されていませんよねぇ。。
もーこれ以上分からない状況に陥っています。。御指導お願いします。

box

Re:2点間の距離を求める

#2

投稿記事 by box » 18年前

サンプルです。
#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点間の距離を求める

#3

投稿記事 by » 18年前

返信ありがとうございます。
それで、質問なんですが、自分で書いといて、悪いんですが、
#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は使わないこと!!!って言う条件なんですよねぇ。。

box

Re:2点間の距離を求める

#4

投稿記事 by box » 18年前

> #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点間の距離を求める

#5

投稿記事 by » 18年前

なるほど!!!!
やっとのことで、今日の授業もわかりました★^^;
ありがとうございます。

これは、ライブラリー関数なので、cc -lm test.cという風にコンパイルするんですよね!!

本当に分かりやすい、説明、ありがとうございました。

管理人

Re:2点間の距離を求める

#6

投稿記事 by 管理人 » 18年前

☆さん、こんばんは。

遅れてしまって申し訳ないです。

余談ですが、
typedef struct {
・・・


struct POINT{
・・・

は、前者だと、宣言時に毎回structって書く手間が省るものだと覚えておくといいと思います。
前者は「int型」みたいに、構造体バージョンの「POINT型」っていう型を作ってくれるんですね。

Re:2点間の距離を求める

#7

投稿記事 by » 18年前

管理人さん、こんばんは。

大丈夫ですよ。


なるほど!!
たしかに、
struct の場合は、なんかいも後で、structって書きますよね☆

そーゆー意味だったんですね。
さらに勉強になりました。
ありがとうございます。

管理人

Re:2点間の距離を求める

#8

投稿記事 by 管理人 » 18年前

おぉ、お早いお返事ありがとうございます。

構造体は最初結構難しいですよね。
http://www9.plala.or.jp/sgwr-t/c/sec16.html

がんばってください^^

Re:2点間の距離を求める

#9

投稿記事 by » 18年前

いえいえ^^
こっちこそ、丁寧な説明ありがとうざいます☆

これからも、がんばりますよー!!!^^

今回もありがとうございました☆

ではでは、おやすみなさぁーい♪(笑)

閉鎖

“C言語何でも質問掲示板” へ戻る