質問です!!
お願いします。
以下の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)の入力を受け付け,構造体配列に代入せよ.』
というところもプログラミングに反映されていませんよねぇ。。
もーこれ以上分からない状況に陥っています。。御指導お願いします。
2点間の距離を求める
Re:2点間の距離を求める
サンプルです。
#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点間の距離を求める
返信ありがとうございます。
それで、質問なんですが、自分で書いといて、悪いんですが、
#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は使わないこと!!!って言う条件なんですよねぇ。。
それで、質問なんですが、自分で書いといて、悪いんですが、
#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点間の距離を求める
> #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を使わないコードの例です。
#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点間の距離を求める
なるほど!!!!
やっとのことで、今日の授業もわかりました★^^;
ありがとうございます。
これは、ライブラリー関数なので、cc -lm test.cという風にコンパイルするんですよね!!
本当に分かりやすい、説明、ありがとうございました。
やっとのことで、今日の授業もわかりました★^^;
ありがとうございます。
これは、ライブラリー関数なので、cc -lm test.cという風にコンパイルするんですよね!!
本当に分かりやすい、説明、ありがとうございました。
Re:2点間の距離を求める
☆さん、こんばんは。
遅れてしまって申し訳ないです。
余談ですが、
typedef struct {
・・・
と
struct POINT{
・・・
は、前者だと、宣言時に毎回structって書く手間が省るものだと覚えておくといいと思います。
前者は「int型」みたいに、構造体バージョンの「POINT型」っていう型を作ってくれるんですね。
遅れてしまって申し訳ないです。
余談ですが、
typedef struct {
・・・
と
struct POINT{
・・・
は、前者だと、宣言時に毎回structって書く手間が省るものだと覚えておくといいと思います。
前者は「int型」みたいに、構造体バージョンの「POINT型」っていう型を作ってくれるんですね。
Re:2点間の距離を求める
管理人さん、こんばんは。
大丈夫ですよ。
なるほど!!
たしかに、
struct の場合は、なんかいも後で、structって書きますよね☆
そーゆー意味だったんですね。
さらに勉強になりました。
ありがとうございます。
大丈夫ですよ。
なるほど!!
たしかに、
struct の場合は、なんかいも後で、structって書きますよね☆
そーゆー意味だったんですね。
さらに勉強になりました。
ありがとうございます。
Re:2点間の距離を求める
いえいえ^^
こっちこそ、丁寧な説明ありがとうざいます☆
これからも、がんばりますよー!!!^^
今回もありがとうございました☆
ではでは、おやすみなさぁーい♪(笑)
こっちこそ、丁寧な説明ありがとうざいます☆
これからも、がんばりますよー!!!^^
今回もありがとうございました☆
ではでは、おやすみなさぁーい♪(笑)