重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

複素数の四則計算を構造体を使って実行させたいのですが、いまいち構造体のことを理解できていません。
以下の何が間違っているのでしょうか?
コンパイルはできますがおそらく間違った値が出てしまっているようです。


#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)とすると和が返るようにしなさいという指示がありました。
どなたか教えて頂けるとありがたいです…。

A 回答 (7件)

私の書き方が悪かったですね。



COMPLEX a;
COMPLEX b;
COMPLEX c;
...
入力
...
c = cal(a, '+', b); //計算結果をc格納
printf("%f + (%f)*i\n", 実部を取り出す, 虚部を取り出す);

取り出し方はcal関数内部で既にあなたも利用していますよ。

この回答への補足

ごめんなさい、できました。
本当に凡ミスでした。
本っ当にありがとうございました!

みなさんお騒がせ致しました。

補足日時:2008/06/19 23:43
    • good
    • 0
この回答へのお礼

こういうことでしょうか?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)が出ます。

お礼日時:2008/06/19 23:02

>コンパイルエラーは出ませんでした。


>例えば、順に、1,2,3,4と入力すると、
>8192.001968 + (512.000123)*i
>…などというふうに出ます。

わからん。。。
あなたの使っている OS と コンパイラのバージョンを補足にどうぞ。
    • good
    • 0
この回答へのお礼

WinXP、cygwinです…。

お礼日時:2008/06/19 22:39

問題になるのは次の行かな。


> 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型変数に格納してから実部・虚部を取り出して表示すれば良いのでは?
    • good
    • 0
この回答へのお礼

ありがとうございます。

COMPLEX型変数に格納してから実部・虚部を取り出すやり方がわかりません。
初心者すぎて申し訳ないです、ホント…。

お礼日時:2008/06/19 22:38

printfの使い方を確認してください。


このコードだと、calの戻り値であるCOMPLEX型を
1番目の%fで表示しようとしていることになります。

COMPLEX c = cal(a, '+', b);

として、実部、虚部を
各要素をそれぞれ表示してみましょう。

あと、Warningはなるべくでないようにしましょう。
1. pow を使うのに必要なヘッダはなんですか?
    • good
    • 0
この回答へのお礼

とりあえずいろいろやってみましたが、
COMPLEX c = cal(a, '+', b);
とすると、初期値がおかしいみたいなエラーがでます。

math.hですよね…。
ごめんなさい、おっしゃっていることが良く理解できません。

お礼日時:2008/06/19 22:37

 "printf"の仕様を再確認しましょう。

    • good
    • 0
この回答へのお礼

ありがとうございます。ホントすみません。

お礼日時:2008/06/19 22:34

> printf("%f + (%f)*i\n",cal(a,'+',b));



書式文字列には2つの%fがあるのに対し、
実際に出力しているのはcal関数の実行結果1個だけですね。
    • good
    • 0
この回答へのお礼

めちゃくちゃでしたね…。すみません。
でもどうやればいいのかさっぱりわかりません。

お礼日時:2008/06/19 22:33

>コンパイルはできますがおそらく間違った値が出てしまっているようです。


本当にコンパイルできています?
そして間違った値がでるとは具体的にどうなるのですか?
    • good
    • 0
この回答へのお礼

コンパイルエラーは出ませんでした。
例えば、順に、1,2,3,4と入力すると、
8192.001968 + (512.000123)*i
…などというふうに出ます。

お礼日時:2008/06/19 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!