構造体<2次元直交座標系における2点間の距離>

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

構造体<2次元直交座標系における2点間の距離>

#1

投稿記事 by riko » 3年前

2つの座標を入力してその座標間の距離を求めて表示するプログラムを作成しています。
(座標を渡してその座標間距離を戻り値とする関数distanceを定義して利用することが条件です。)

以下のような手順でプログラムを書いていきたいのですが、どのようにしてプログラムを書いたらいいのかわかりません。
書き出しだけ作成してみたので、どのようにして書いていけば良いのか教えてください。

(1)x座標とy座標をメンバとする2次元座標を表す構造体pointを定義する。さらにtypedefを使って名前をPointとして再定義する。
(2)2つの座標を入力してその座標間の距離を表示するプログラムを作成する。(座標(x1,y1)と(x2,y2)の2点間の距離は、(x2-x1)^2 + (y2-y1)^2の平方根)
(3)距離を求める処理を関数double distance(Point a, Point b)として定義する。

#include<stdio.h>
#include<math.h>

//座標を表す構造体
struct point {

};

typedef struct point Point;

double distance(Point a, Point b)
{
return;
}
int main(void)
{
Point p1, p2;

printf("== 2次元直交座標系における2点間の距離 ==\n");

//座標の入力
printf("座標1 (x,y)>"); scanf("%d", &p1);
printf("座標2 (x,y)>"); scanf("%d", &p2);

printf("2点間の距離: %f\n", distance());

return 0;
}

littlestream
記事: 37
登録日時: 4年前

Re: 構造体<2次元直交座標系における2点間の距離>

#2

投稿記事 by littlestream » 3年前

ルートを求めるにはc言語では、sqrt()という関数を使います。
あとは、三平方の定理で求まります。

√(X*X+Y*Y)です。

とここで、Xとは2点間のX座標の差分、Yとは2点間のY座標の差分を指します。
添付ファイル
ピタゴラス(三平方の定理).png
ピタゴラス(三平方の定理).png (2.43 KiB) 閲覧数: 2296 回

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: 構造体<2次元直交座標系における2点間の距離>

#3

投稿記事 by purin52002 » 3年前

こんにちは

(1)
struct point 内にx座標とy座標を表すメンバ変数を定義する必要があります。
構造体のメンバ変数を定義するには、

コード:

struct A
{
    int a;
    double b;
};
のようにします。

(2)
与えられた公式通りに式を打ち込みます。
ここで「math.h」というヘッダファイルをインクルードしておけば、べき乗を計算するpow関数や平方根を計算するsqrt関数が使えます。

(3)
(2)で計算した値をreturnします。

コード:

double distance(Point a, Point b)
{
    double ret = (2)で計算した結果 ;
    return ret;
}
質問者さんがC言語をどこまで理解しているか(Hello worldしか書けません!とか構造体はばっちりです!とか)を書いてもらえると
答える側も答えやすくなるかもしれません^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
みけCAT
記事: 6389
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: 構造体<2次元直交座標系における2点間の距離>

#4

投稿記事 by みけCAT » 3年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

他の部分は他の回答者さんが書いてくれているような感じで、
riko さんが書きました: //座標の入力
printf("座標1 (x,y)>"); scanf("%d", &p1);
printf("座標2 (x,y)>"); scanf("%d", &p2);
これはよくないですね。
scanfで読み込めるのは、intやdoubleなどの基本的なデータのみなので、座標の各要素を1個ずつ読み込ませなければいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

littlestream
記事: 37
登録日時: 4年前

Re: 構造体<2次元直交座標系における2点間の距離>

#5

投稿記事 by littlestream » 3年前

//座標の入力
printf("座標1 (x,y)>"); scanf("%d", &p1);
printf("座標2 (x,y)>"); scanf("%d", &p2);

printf("2点間の距離: %f\n", distance());


これでは、2次元直交座標はX座標とY座標で構成されているのに対し、
scanf関数で謎の構造体のアドレスを引数として渡しています。
なので、typedefの使い方と構造体(struct)の宣言の仕方をネットで検索し調べた上で、
ここでは素直に、X座標とY座標を
printf("座標1(X,Y)>"); scanf("%d",&p1.x); scanf("%d",&p1.y);
以下、同様に座標2も取得すれば良いと思います。

Math

Re: 構造体<2次元直交座標系における2点間の距離>

#6

投稿記事 by Math » 3年前

Windows10,VS2017Community,C 使用。scanf の 型に注意。

コード:

#include <stdio.h>
#include <math.h>

//座標を表す構造体
struct point {
	double x;
	double y;
};

typedef struct point Point;

double distance(Point a, Point b)
{
	return sqrt((b.x - a.x)*(b.x - a.x) + (b.y - a.y) * (b.y - a.y));
}
int main(void)
{
	Point p1, p2;

	printf("== 2次元直交座標系における2点間の距離 ==\n");

	//座標の入力
	printf("座標1 p1.x="); scanf("%lf", &p1.x);
	printf("座標1 p1.y="); scanf("%lf", &p1.y);

	printf("座標2 p2.x="); scanf("%lf", &p2.x);
	printf("座標2 p2.y="); scanf("%lf", &p2.y);

	printf("2点間の距離: %f\n", distance(p1,p2));

	return 0;
}

返信

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