

複素数の四則計算を構造体を使って実行させたいのですが、いまいち構造体のことを理解できていません。
以下の何が間違っているのでしょうか?
コンパイルはできますがおそらく間違った値が出てしまっているようです。
#include <stdio.h>
typedef struct{ float re, im; } COMPLEX;
COMPLEX cal ( COMPLEX a, char c, COMPLEX b )
{
COMPLEX d;
switch (c)
{
case '+' : d.re = a.re + b.re; d.im = a.im + b.im;break;
case '-' : d.re = a.re - b.re; d.im = a.im - b.im;break;
case '*' : d.re = (a.re * b.re) - (a.im * b.im); d.im = (a.im * b.re) + (a.re * b.im);break;
case '/' : d.re = (a.re * b.re + a.im * b.im) / ( pow(b.re,2) + pow(b.im,2) ); d.im = (a.im * b.re - a.re * b.im) / ( pow(b.re,2) + pow(b.im,2) );break;
default :puts("不適切な演算です。");break;
}
return d;
}
int main(void)
{
COMPLEX a;
COMPLEX b;
printf("aの実数部を入力:"); scanf("%f",&a.re);
printf("aの虚数部を入力:"); scanf("%f",&a.im);
printf("bの実数部を入力:"); scanf("%f",&b.re);
printf("bの虚数部を入力:"); scanf("%f",&b.im);
printf("%f + (%f)*i\n",cal(a,'+',b));
printf("%f + (%f)*i\n",cal(a,'-',b));
printf("%f + (%f)*i\n",cal(a,'*',b));
printf("%f + (%f)*i\n",cal(a,'/',b));
}
以上です。
ちなみに、例えばcal(a,'+',b)とすると和が返るようにしなさいという指示がありました。
どなたか教えて頂けるとありがたいです…。
No.7ベストアンサー
- 回答日時:
私の書き方が悪かったですね。
COMPLEX a;
COMPLEX b;
COMPLEX c;
...
入力
...
c = cal(a, '+', b); //計算結果をc格納
printf("%f + (%f)*i\n", 実部を取り出す, 虚部を取り出す);
取り出し方はcal関数内部で既にあなたも利用していますよ。
こういうことでしょうか?main関数のところは…。
int main(void)
{
COMPLEX a;
COMPLEX b;
COMPLEX c;
printf("aの実数部を入力してください:");
scanf("%f",&a.re);
printf("aの虚数部を入力してください:");
scanf("%f",&a.im);
printf("bの実数部を入力してください:");
scanf("%f",&b.re);
printf("bの虚数部を入力してください:");
scanf("%f",&b.im);
c = cal(a,'+',b);
printf("%f + (%f)*i\n",c.re,c.im);
}
でも、このようにすると、コンパイルエラー( c = cal(a,'+',b);の行 :error: incompatible types in assignment)が出ます。
No.5
- 回答日時:
問題になるのは次の行かな。
> printf("%f + (%f)*i\n",cal(a,'+',b));
> printf("%f + (%f)*i\n",cal(a,'-',b));
> printf("%f + (%f)*i\n",cal(a,'*',b));
> printf("%f + (%f)*i\n",cal(a,'/',b));
calの返値はCOMPLEX構造体だけど、それを実部・虚部の順のfloat値2つと認識させるのは無理がある。
一旦COMPLEX型変数に格納してから実部・虚部を取り出して表示すれば良いのでは?
ありがとうございます。
COMPLEX型変数に格納してから実部・虚部を取り出すやり方がわかりません。
初心者すぎて申し訳ないです、ホント…。
No.4
- 回答日時:
printfの使い方を確認してください。
このコードだと、calの戻り値であるCOMPLEX型を
1番目の%fで表示しようとしていることになります。
COMPLEX c = cal(a, '+', b);
として、実部、虚部を
各要素をそれぞれ表示してみましょう。
あと、Warningはなるべくでないようにしましょう。
1. pow を使うのに必要なヘッダはなんですか?
とりあえずいろいろやってみましたが、
COMPLEX c = cal(a, '+', b);
とすると、初期値がおかしいみたいなエラーがでます。
math.hですよね…。
ごめんなさい、おっしゃっていることが良く理解できません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
H8マイコンCでprintf/scanfが使...
-
「%n」や「%S」は何故恥ずかし...
-
C言語プログラミング
-
C言語の勉強しています。すみま...
-
C言語で四則演算を使って10を作...
-
ピラミッド表示プログラム。
-
ホームページをC言語で作りたい...
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
Cプログラムについて
-
コマンドラインに出力した文字...
-
WM_CLOSEで閉じれないウィンド...
-
C言語の&に関する質問
-
すごろくに使用するサイコロ
-
文字と数字の判定について
-
printf( " %2d", p * q );
-
【C言語教えてください】sin波...
-
%P と %X の違い
-
C言語の勉強しています。すみま...
-
strcmp
-
c言語でAからZまでを表示する...
-
unsigned int型について
-
(C言語)めちゃくちゃな値にな...
-
printf で二進表示を行いたい。
-
プログラミング C言語 課題でプ...
-
c言語で2000年以降カレンダーを...
おすすめ情報