
下記のプログラムを組んでみて、発展として分数の形で複素数の四則演算のプログラムを作りたいのですが、どうにもややこしく、困っています。
よろしければ御指導よろしくお願いします。
/*
複素数を表す構造体
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 );
}

No.4ベストアンサー
- 回答日時:
分数でのプログラムができているのなら……
実数部と虚数部がそれぞれ分数になれば良いのですよね?
なら、
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);
}
でできあがり。
他の演算も同じ(ごめん、未確認)
No.5
- 回答日時:
質問の回答ではありませんが、気になったので
>printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n",
とありますが最初の4つは%fで後の2つが%lfになっているのはなぜですか?
%lfはC99以前は未定義です、C99以降は使えますが100%無駄な指定です、%fを使いましょう。
No.3
- 回答日時:
ん, 基本的には組み合わせるだけです.
あとはどこまで頑張るかの勝負で, たとえば「もうちょっとオーバーフローに頑健にする」ことはできますね. 現状だと (int が 32ビット長の場合)
1/65536+1/65536
がまともに計算できないはずです.
ただ, 加減算はどうしようもないといえばどうしようもないんだよね.... 乗除算については, 「結果を正常に表すことができればかならず正しく計算できる」ように作れると思うんだけど....
No.2
- 回答日時:
それなら,「分数の形で複素数の四則演算のプログラム」ではなくて,まず「分数の形で実数の四則演算のプログラム」を作ってみたらどうかな。
この回答への補足
あ、それなら以前組んだことが有ります。
それと上記のプログラムを組み合わせればいいんでしょうか?
/*
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 );
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールAPIのSetConsoleScre...
-
'printf':識別子が見つかりませ...
-
加減剰余のオーバーフローについて
-
C言語初心者です。計算がうまく...
-
火力発電 蒸気タービンのMSV、C...
-
複数のシリンダーの同調化にコ...
-
整合フィルタ(matched filter)...
-
互いに素と負の数
-
物理の波についてです 時刻12/8...
-
一次遅れ系の制御における時定...
-
オシロスコープからパソコンに...
-
二つの波形の合致を調べる方法は?
-
RCフィルタと三角波、方形波
-
RC回路の波形をオシロスコープ...
-
電気回路の「干渉を引き起こす...
-
SPI 非言語 教えてください
-
双安定マルチバイブレータについて
-
交流、パルス波、バースト波
-
SPI 非言語の問題です
-
rc直列回路の波形を観測する時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
プログラミングが分かりません。
-
TCP/IP: 非ソケットに対するソ...
-
リターンキー又は、スペースキ...
-
c言語 select sort
-
0と1のファイルへの書き込み、出力
-
フィボナッチ数列
-
3×3のラテン方陣をつくるプログ...
-
C言語のエラーについて
-
プログラムエラー
-
getch / putch用のヘッダ
-
C言語 遺伝的アルゴリズムでの...
-
大至急です! 1,ターミナルから...
-
C言語 コンパイルエラー(文字...
-
加減剰余のオーバーフローについて
-
C言語初心者です。計算がうまく...
-
'printf':識別子が見つかりませ...
-
分割コンパイルの手順と方法に...
-
C言語で10個の数字を読み込んで...
-
C言語 セグメンテーション違反
おすすめ情報