- ベストアンサー
C言語で複素数(分数)の四則演算を行うプログラム
- C言語で複素数の四則演算を行うプログラムの組み方について困っています。発展として分数の形で計算する方法も学びたいです。
- プログラムの中で複素数の和、差、積、商を計算する関数を定義しました。しかし、実装がややこしく理解できません。
- 複素数の計算を行うプログラムをC言語で作りたいです。質問者は実装が難しく困っています。
- みんなの回答 (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); } でできあがり。 他の演算も同じ(ごめん、未確認)
その他の回答 (4)
- TT414
- ベストアンサー率18% (72/384)
質問の回答ではありませんが、気になったので >printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n", とありますが最初の4つは%fで後の2つが%lfになっているのはなぜですか? %lfはC99以前は未定義です、C99以降は使えますが100%無駄な指定です、%fを使いましょう。
- Tacosan
- ベストアンサー率23% (3656/15482)
ん, 基本的には組み合わせるだけです. あとはどこまで頑張るかの勝負で, たとえば「もうちょっとオーバーフローに頑健にする」ことはできますね. 現状だと (int が 32ビット長の場合) 1/65536+1/65536 がまともに計算できないはずです. ただ, 加減算はどうしようもないといえばどうしようもないんだよね.... 乗除算については, 「結果を正常に表すことができればかならず正しく計算できる」ように作れると思うんだけど....
お礼
なるほど。参考になりました。
- f272
- ベストアンサー率46% (8467/18126)
それなら,「分数の形で複素数の四則演算のプログラム」ではなくて,まず「分数の形で実数の四則演算のプログラム」を作ってみたらどうかな。
補足
あ、それなら以前組んだことが有ります。 それと上記のプログラムを組み合わせればいいんでしょうか? /* 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 ); }
- Tacosan
- ベストアンサー率23% (3656/15482)
「分数の形で」とはどういうことでしょうか? 「こんな感じのことがしたい」というのを見せてください.
補足
(a+jb)/(c+jd) + (e+jf)/(g+ji) という形です。
お礼
加減算は出来ました。 乗算と除算に少々手こずってはいますが、何とかなりそうです。 お手数おかけしました。ありがとうございます。