- 締切済み
構造体
プログラミングの授業で構造体を習ったのですが、課題がよく分からないので質問させていただきます。その課題ですが、 複素数を表す構造体を、 struct complex{float r;(実部)float i;(虚部)}; の形で定義したとして、2つの複素数を入力し、その2つの絶対値の2乗、和、差、積、商を求めるプログラムを作るというものです。 ただし、条件として、 複素数を入力する関数void inputComp(struct complex*c)、複素数をa+biのような形に表示する関数void printComp(struct complex*c)、複素数の絶対値の2乗を関数値として返す関数float asqrComp(struct complex*c)を作成せよというのがあって困っています。 条件がなければprintfを多用してできないこともないでしょうが、条件を満たすプログラムを教えてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- uyama33
- ベストアンサー率30% (137/450)
すでに、回答は出ているようですので よけいなことを一言。 入力を (2+3i)*(5-3i) の ようにするには 構文解析 の部分をプログラミングしなくては なりません。 道具としては yacc coco などがありますが、使えるようになるまで 時間がかかります。 表計算では数式が入力可能です。 この数値として 2+3i を受け付けるようにすればよいのです。
課題をそもそも勘違いされていませんか? void inputComp(struct complex *c) ... この関数を呼び出すと, ユーザに対して計算したい複素数の入力を要求して、 入力された結果を c に入れて返す。 void printComp(struct complex *c) ... この関数を呼び出すと、複素数変数 c の内容を画面に表示する。 float asqrComp(struct complex *c) ... この関数を呼び出すと、複素数 c の絶対値の2乗を float 型で返す。 つまり、関数mainは以下のような感じになる。 struct complex a, b, c; inputComp(&a); // 変数aに複素数をユーザから入力してもらう inputComp(&b); // 変数bに複素数をユーザから入力してもらう printf("Absolute square of a = %f", asqrComp(&a)); printf("Absolute square of b = %f", asqrComp(&b)); c に複素数 a + b の結果を代入。 printComp(&c); // a + b を表示 c に a * b の結果を代入 printComp(&c); // a*b を表示 以下続く、、、、、 という具合にしなさいということでしょう。
- layer13
- ベストアンサー率47% (37/78)
入力のときも、a+biというような形式での入力が必要ですか? そうでなければ、そんなに難しく考える必要も無いと思いますが。 数学で計算するみたいに実部と虚部を扱えばいいだけですよね? 条件といってますけど、表示するときだけ、"%f+%fi"という表示をすれば いいくらいの制約しかないみたいですしね。 今一度、ご自分で何をしなければならないか、何が必要かを整理してみた方が 良いかと思います。
補足
いわれてみればそうかもしれません。 imputCompでは、実数部と虚数部を別々にして表示(printComp)は%f+%fi という形なのですが、例えばinputCompやprintCompという関数を使わないでprintf("和は%f+%fi\n",x.r+y.r,x.i,y.i)という形にすればうまくいったのですが、printComp(x.r+y.r,x.i+y.i)と書くとメモリから読み出せない(エラー)になるということです。
お礼
その後、解答例が配布されたのですが、いかに自分が構造体を理解していなかったかがわかりました。 慣れていれば簡単なことだったのかもしれませんが。