dポイントプレゼントキャンペーン実施中!

下記のプログラムを組んでみて、発展として分数の形で複素数の四則演算のプログラムを作りたいのですが、どうにもややこしく、困っています。
よろしければ御指導よろしくお願いします。

/*
複素数を表す構造体
2つの複素数の四則演算
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
double real; /* 実数部分 */
double imag; /* 虚数部分 */
}COMPLEX;

/* 二つの複素数の和を返す */
COMPLEX comp_add(COMPLEX x, COMPLEX y)
{
COMPLEX tmp;

tmp.real = x.real + y.real; /* 実数部分の和 */
tmp.imag = x.imag + y.imag; /* 虚数部分の和 */

return (tmp);
}

/* 二つの複素数の差を返す */
COMPLEX comp_sub(COMPLEX x, COMPLEX y)
{
COMPLEX tmp;

tmp.real = x.real - y.real; /* 実数部分の差 */
tmp.imag = x.imag - y.imag; /* 虚数部分の差 */

return (tmp);
}


/* 二つの複素数の積を返す */
COMPLEX comp_mul(COMPLEX x, COMPLEX y)
{
COMPLEX tmp;

tmp.real = (x.real * y.real) - (x.imag * y.imag);
tmp.imag = (x.real * y.imag) + (y.real * x.imag);

return (tmp);
}

/* 二つの複素数の商を返す */
COMPLEX comp_div(COMPLEX x, COMPLEX y)
{
COMPLEX tmp;

tmp.real =(x.real*y.real+x.imag*y.imag)/(y.real*y.real+y.imag*y.imag);
tmp.imag = (x.imag*y.real-x.real*y.imag)/(y.real*y.real+y.imag*y.imag);
return (tmp);
}

int main( int argc, char **argv )
{
COMPLEX a, b, c;

a.real = strtod( argv[1], NULL );
a.imag = strtod( argv[2], NULL );
b.real = strtod( argv[3], NULL );
b.imag = strtod( argv[4], NULL );

c = comp_add(a, b); /* 複素数の和を c に代入 */

printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n",
a.real,a.imag,b.real,b.imag,c.real,c.imag );

c = comp_sub(a, b); /* 複素数の差を c に代入 */

printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n",
a.real,a.imag,b.real,b.imag,c.real,c.imag );

c = comp_mul(a, b); /* 複素数の積を c に代入 */

printf( "(%f+j%f)+(%f+j%f)=(%3.1lf+j%3.1lf)\n",
a.real,a.imag,b.real,b.imag,c.real,c.imag );

c = comp_div(a, b); /* 複素数の商を c に代入 */

printf( "(%f+j%f)+(%f+j%f)=(%3.1lf+j%3.1lf)\n",
a.real,a.imag,b.real,b.imag,c.real,c.imag );

return( 0 );
}

A 回答 (5件)

分数でのプログラムができているのなら……





実数部と虚数部がそれぞれ分数になれば良いのですよね?

なら、

typedef struct {
int denominator;
int numerator;
}FRACTION;

typedef struct {
FRACTION real; /* 実数部分 */
FRACTION imag; /* 虚数部分 */
}COMPLEX;

で、

COMPLEX comp_add(COMPLEX x, COMPLEX y)
{
COMPLEX tmp;

tmp.real = x.real + y.real; /* 実数部分の和 */
tmp.imag = x.imag + y.imag; /* 虚数部分の和 */

return (tmp);
}



frac_add( FRACTION x, FRACTION y )


COMPLEX comp_add(COMPLEX x, COMPLEX y)
{
COMPLEX tmp;

tmp.real = frac_add(x.real, y.real); /* 実数部分の和 */
tmp.imag = frac_add(x.imag, y.imag); /* 虚数部分の和 */

return (tmp);
}

でできあがり。
他の演算も同じ(ごめん、未確認)
    • good
    • 1
この回答へのお礼

加減算は出来ました。
乗算と除算に少々手こずってはいますが、何とかなりそうです。
お手数おかけしました。ありがとうございます。

お礼日時:2011/12/24 00:01

質問の回答ではありませんが、気になったので


>printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n",
とありますが最初の4つは%fで後の2つが%lfになっているのはなぜですか?
%lfはC99以前は未定義です、C99以降は使えますが100%無駄な指定です、%fを使いましょう。
    • good
    • 1

ん, 基本的には組み合わせるだけです.



あとはどこまで頑張るかの勝負で, たとえば「もうちょっとオーバーフローに頑健にする」ことはできますね. 現状だと (int が 32ビット長の場合)
1/65536+1/65536
がまともに計算できないはずです.

ただ, 加減算はどうしようもないといえばどうしようもないんだよね.... 乗除算については, 「結果を正常に表すことができればかならず正しく計算できる」ように作れると思うんだけど....
    • good
    • 0
この回答へのお礼

なるほど。参考になりました。

お礼日時:2011/12/09 17:36

それなら,「分数の形で複素数の四則演算のプログラム」ではなくて,まず「分数の形で実数の四則演算のプログラム」を作ってみたらどうかな。

この回答への補足

あ、それなら以前組んだことが有ります。
それと上記のプログラムを組み合わせればいいんでしょうか?

/*
2つの分数を使った四則演算
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int denominator;
int numerator;
}FRACTION;

int gcd( int x, int y )
{
if ( y == 0 ) {
return ( x );
}
else {
return ( gcd( y,x % y ) ) ;
}
}

FRACTION frac_reduce( FRACTION x )
{
FRACTION tmp;
int a,b,sign = 1;

a = x.denominator;
if ( b < 0 ) {
b = -b;
}

tmp.denominator = x.denominator / gcd(a,b) * sign;
tmp.numerator = x.numerator / gcd(a,b) * sign;

return ( tmp );
}

FRACTION frac_add( FRACTION x, FRACTION y )
{
FRACTION tmp;

tmp.denominator = x.denominator * y.denominator;
tmp.numerator = x.numerator * y.denominator+y.numerator * x.denominator;

return ( frac_reduce( tmp ) );
}

FRACTION frac_sub( FRACTION x, FRACTION y )
{
FRACTION tmp;

tmp.denominator = x.denominator * y.denominator;
tmp.numerator = x.numerator * y.denominator-y.numerator * x.denominator;

return ( frac_reduce( tmp ) );
}

FRACTION frac_mul( FRACTION x, FRACTION y )
{
FRACTION tmp;

tmp.denominator = x.denominator * y.denominator;
tmp.numerator = x.numerator * y.numerator;

return ( frac_reduce( tmp ) );
}

FRACTION frac_div( FRACTION x, FRACTION y )
{
FRACTION tmp;

tmp.denominator = x.denominator * y.numerator;
tmp.numerator = x.numerator * y.denominator;

return ( frac_reduce( tmp ) );
}

int main( int argc, char **argv )
{
FRACTION a,b,c;

a.numerator = atoi( argv[1] );
a.denominator = atoi( argv[2] );
b.numerator = atoi( argv[3] );
b.denominator = atoi( argv[4] );

c = frac_add( a,b );
printf( "%d/%d + %d/%d = %d/%d\n",a.numerator,a.denominator,
b.numerator,b.denominator,c.numerator,c.denominator );
c = frac_sub( a,b );
printf( "%d/%d - %d/%d = %d/%d\n",a.numerator,a.denominator,
b.numerator,b.denominator,c.numerator,c.denominator );
c = frac_mul( a,b );
printf( "%d/%d * %d/%d = %d/%d\n",a.numerator,a.denominator,
b.numerator,b.denominator,c.numerator,c.denominator );
c = frac_div( a,b );
printf( "%d/%d / %d/%d = %d/%d\n",a.numerator,a.denominator,
b.numerator,b.denominator,c.numerator,c.denominator );
return( 0 );
}

補足日時:2011/12/09 16:49
    • good
    • 0

「分数の形で」とはどういうことでしょうか? 「こんな感じのことがしたい」というのを見せてください.

この回答への補足

(a+jb)/(c+jd) + (e+jf)/(g+ji) という形です。

補足日時:2011/12/09 16:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!