みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語の構造体の問題が分かりません

以下のソースコードを使って次の2つの問題に答えよ。というものです。
#include<stdio.h>
#include<math.h>
struct cartes{
double x,y; /*x-axis,y-axis*/
};

struct polar{
double r,th; /*radius,theta*/
};

struct cartes p2c(struct polar a)
{
struct cartes d;
d.x=a.r*cos(a.th);
d.y=a.r*sin(a.th);
return d;
}

struct polar c2p(struct cartes b)
{
struct polar e;
e.r=sqrt(b.x*b.x+b.y*b.y);
e.th=atan(b.y/b.x);
return e;
}

void main(void)
{
struct cartes c;
struct cartes c1={1,1},c2={1,1.7320508},c3={1.7320508,1};
struct polar p1,p2,p3;
struct polar p={1.41421356,0.7853982};
p1=c2p(c1);
p2=c2p(c2);
p3=c2p(c3);
c=p2c(p);
printf("radius=%lf, theta=%lf(radians)\n",p.r,p.th);
printf("x-axis=%lf, y-axis=%lf\n",c1.x,c1.y);
printf("radius=%lf, theta=%lf(radians)\n",p2.r,p2.th);
printf("x-axis=%lf, y-axis=%lf\n",c.x,c.y);
}

1.2次元直行座標における2点の座標を与えられて、2点間の距離を求める関数を作り、正しく動作するようにせよ。
2.複素数を構造体として定義せよ。次に2つの複素数変数を受けてその和、差、積、商を求める関数を作り、正しく動作するようにせよ。

以上2つの問題についてソースコードを書いてご説明いただければ幸いです。

投稿日時 - 2012-11-25 20:20:23

QNo.7815646

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

わざわざ自分で作らなくても hypot は標準でありますけどね>#5.

投稿日時 - 2012-11-27 23:39:09

ANo.5

>#4
浮動小数点数指数桁あふれにまで配慮するなら、どんな実装になっているかわからない標準関数よりも、参照URLにあるようなMoler-Morrisonのアルゴリズムを使って
double hypot(double p, double q)
{
double r, s;
if (p < 0) p = -p;
if (q < 0) q = -q;
if (p < q) { r = p; p = q; q = r; }
if (p == 0) return 0;
for (;;) {
r = q / p;
r *= r;
s = r + 4;
if (s == 4)
return p;
r /= s;
p += 2 * r * p;
q *= r;
}
}
double distance( struct cartes c1, struct cartes c2 )
{
return hypot(c1.x-c2.x, c1.y-c2.y);
}
ではどうでしょうか。

参考URL:http://steve.hollasch.net/cgindex/math/pythag-root.txt

投稿日時 - 2012-11-27 22:14:31

ANo.4

/* いろいろ省略 */
#include <float.h>
int main(void)
{
struct cartes c1 = { DBL_MAX/2, DBL_MAX/2 }, c2 = { 0, 0 };
double len = distance(c1, c2);
printf("%f\n", len);
return 0;
}
が, たぶん正しく動かんのよ>#3.

その辺も含めて壊れてるんで.

投稿日時 - 2012-11-27 14:00:41

ANo.3

1.
double distance( structr cartes c1, struct cartes c2 ) {
cartes c={c1.x-c2.x,c1.y-c2.y};
if (c.x==0.0) return fabs(c.y);
else return c2p(c).r;
}
説明:x座標に差がないとき、「正しく動作するように」とのことなので、ゼロでの除算を避けるためにc2pを使わないようにしました。それ以外のときは2つのベクトルの差の絶対値を求めています。

投稿日時 - 2012-11-26 11:33:17

ANo.2

3. このプログラムに含まれる問題点を挙げ, 解消する方法を示せ

ってのがあったりして.

投稿日時 - 2012-11-25 23:37:51

ANo.1

で、どこがわからないの?
C言語以前に数学がわからないのでは?

投稿日時 - 2012-11-25 20:38:43

あなたにオススメの質問