下記のプログラムを組んでみて、発展として分数の形で複素数の四則演算のプログラムを作りたいのですが、どうにもややこしく、困っています。
よろしければ御指導よろしくお願いします。
/*
複素数を表す構造体
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者です。計算がうまく...
-
テーブル(配列)の初期化を外...
-
クレーンでのCFブレーキとな...
-
カラオケなどのキーコントロー...
-
順列、4桁の整数をつくる問題
-
「跨川橋」は、「運河に架かる...
-
一次遅れ系の制御における時定...
-
互いに素と負の数
-
SPI 非言語の問題です
-
必要十分条件についてです!
-
Audacityのマイク音量
-
SPI 非言語 教えてください
-
数学Aの問題です。 答えは、左...
-
火力発電 蒸気タービンのMSV、C...
-
オシロスコープを起動しただけ...
-
モータの巻線係数って何でしょ...
-
古典制御のゲイン交差周波数と...
-
物理の波についてです 時刻12/8...
-
「寿司(すし)」は名詞とくっ...
-
比例定数と定数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP: 非ソケットに対するソ...
-
3×3のラテン方陣をつくるプログ...
-
'printf':識別子が見つかりませ...
-
c言語プログラミングで初項を1....
-
加減剰余のオーバーフローについて
-
リターンキー又は、スペースキ...
-
Expression: nptr != NULL
-
プログラムがエラーが出る原因
-
コンソールAPIのSetConsoleScre...
-
C言語で自作ヘッダーを作ったの...
-
プログラミングが分かりません。
-
C言語初心者です。計算がうまく...
-
下記のプログラムを実行したと...
-
以下の問題のプログラムを教え...
-
コンパイルがうまくいかない件
-
C言語 文字列の中の文字が条件...
-
C++ なのですがエラーが消えません
-
エラーの原因がわかりません。
-
Linux Ubuntu18.04.3でTcoipに...
-
C言語のエラーについて
おすすめ情報