![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
下記のプログラムを組んでみて、発展として分数の形で複素数の四則演算のプログラムを作りたいのですが、どうにもややこしく、困っています。
よろしければ御指導よろしくお願いします。
/*
複素数を表す構造体
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 );
}
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- 日本語 こんばんは。 日本語を教えて下さい。 不動産の営業をやる人の職業は なんですか。 家を買ったり、売っ 6 2022/04/05 23:34
- その他(プログラミング・Web制作) FORTRANの引数 5 2023/04/06 11:25
- ニコニコ動画 動画ダウンロード 3 2023/03/01 16:35
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP 掲示板を資料を参考にして開発中ですが、画像がアップされません? 1 2022/11/21 06:44
- 英語 you'll only realize real happiness after being mar 3 2022/08/02 15:52
- スペイン語 ラリーガにreal 〜 というチーム多々ありますが、 スペイン語でどういう意味なんですか? 1 2023/02/26 10:22
- 英語 whereの役割について教えて下さい。以下の文を2つに分けるとどのような文章になるでしょうか。 Th 5 2022/12/11 00:45
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP: 非ソケットに対するソ...
-
Expression: nptr != NULL
-
'printf':識別子が見つかりませ...
-
C言語のエラーについて
-
加減剰余のオーバーフローについて
-
C言語初心者です。計算がうまく...
-
第5調波や第3高調波って何です...
-
クレーンでのCFブレーキとな...
-
互いに素と負の数
-
一次遅れ系の制御における時定...
-
動揺装置は自作できますか?
-
モータの巻線係数って何でしょ...
-
反転増幅回路の周波数特性の理論値
-
SPI 非言語の問題です
-
SPI 非言語 教えてください
-
双安定マルチバイブレータについて
-
整合フィルタ(matched filter)...
-
数学の参考書に 「y=8x」は「y...
-
数学Aの問題です。 答えは、左...
-
交流、パルス波、バースト波
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
Expression: nptr != NULL
-
C言語のエラーについて
-
プログラミングが分かりません。
-
C言語 コンパイルエラー(文字...
-
C言語初心者です。計算がうまく...
-
C言語で自作ヘッダーを作ったの...
-
C言語のソースコードについて教...
-
加減剰余のオーバーフローについて
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
'printf':識別子が見つかりませ...
-
C言語:2つの複素数(分数)の四...
-
TCP/IP: 非ソケットに対するソ...
-
getch / putch用のヘッダ
-
doubleからintへのキャスト
-
コンソールAPIのSetConsoleScre...
-
3×3のラテン方陣をつくるプログ...
-
リターンキー又は、スペースキ...
-
コンパイルエラー (超初心者...
おすすめ情報