- ベストアンサー
2次方程式の解
今回、大学の授業で課題が出たのですが、どうしても問題文に書かれている条件を満たせず再提出になってしまいました。 もし、分かる方がいらっしゃいましたら、お力をお貸しいただけないでしょうか。お願いします。 問題 ax^2+bx+c=0の式においてa,b,c(double型)をmainの中でキーボードから入力して、2次方程式の解を求める関数を作りmainの中で根を表示するプログラムを作りなさい。(判別式が負になる場合は共役な複素数根になる。) main→関数 a,b,cの係数 関数→main 方程式の根(2個)[複素数の構造体にする] 私は以下のプログラムを提出しましたが、「複素数の構造体を用いて、構造体のポインタを使ったプログラムにしてください」 #include<stdio.h> #include<math.h> typedef struct{ double a,b,c,ha,an1,an2,re,im; }COMP; void main() { COMP s; COMP x(COMP); printf("aを入力してください===>"); scanf("%lf",&s.a); printf("bを入力してください===>"); scanf("%lf",&s.b); printf("cを入力してください===>"); scanf("%lf",&s.c); s=x(s); if(s.ha>=0) { printf("xは %.2lf,%.2lfです\n",s.an1,s.an2); } else if(s.ha<0) { printf("xは %.2lf + %.2lfi,%.2lf - %.2lfiです\n",s.re,s.im,s.re,s.im); } } COMP x(COMP p) { COMP d; d.ha=p.b*p.b-4.0*p.a*p.c; if(d.ha>=0) { d.an1=(-p.b+sqrt(d.ha))/(2.0*p.a); d.an2=(-p.b-sqrt(d.ha))/(2.0*p.a); } else if(d.ha<0) { d.re=-p.b/(2.0*p.a); d.im=sqrt(-1.0*d.ha)/(2.0*p.a); } return d; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
大学の演習問題であること、問題のレベルから考えて、 「複素数の構造体を用いて、構造体のポインタを使ったプログラムにしてください」 の意図は、下記の2点だと思われます。 1.複素数を、構造体を用いて表現する 2.上記の構造体のポインタを用いて、解をmain関数に伝える 1に対しては、下記の構造体を宣言。 typedef struct{ double real; /* 実数部 */ double imag; /* 虚数部 */ }COMP; 2に対しては、解を計算する関数の引数を下記のようにする。 int solv_equation(double a, double b, double c, COMP *ans1, COMP *ans2) { } これで、先生が求めている解答になると思います。 ちなみに、戻り値は答えの表示の際の都合で、 -1:虚数解も場合(判定式が負) 0:実数解の場合1(判定式が0) 1:実数解の場合2(判定式が正) とするつもりでintにしました。 実際のコーディングは、(作っててしまっても良かったのですが)質問のプログラムが 書けるレベルの人なら、自力で大丈夫でしょう。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
#1です。 間違いがありました。 > printf("%g%+gi\n", ans.ans1); の部分ですが、 printf("%g%+gi\n", creal(ans.ans1), cimag(ans.ans1)); ですね。ans2側も同様
お礼
ご丁寧に書き直しまでしていただき ありがとうございました。 授業で使っていない所などもありましたが、とても参考になりました。 本当にありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> printf("xは %.2lf,%.2lfです\n",s.an1,s.an2); printfに%.2lfを使っているということはC99ですね。 それなら複素数の計算は簡単です。以下は手抜きですが、 #include<stdio.h> #include<complex.h> struct answer { double complex ans1, ans2; }; void quadratic(double a, double b, double c, struct answer* ans) { ans->ans1 = (-b + csqrt(b*b - 4*a*c)) / (2*a); ans->ans2 = (-b - csqrt(b*b - 4*a*c)) / (2*a); } int main(void) { double a, b, c; scanf("%lf%lf%lf", &a, &b, &c); struct answer ans; quadratic(a, b, c, &ans); printf("%g%+gi\n", ans.ans1); printf("%g%+gi\n", ans.ans2); return 0; } といった感じでどうでしょう? main→関数 a,b,cの係数 関数→main 方程式の根(2個)[複素数の構造体にする] と 複素数の構造体を用いて、構造体のポインタを使ったプログラムにしてください の条件は満たしているはずです。
お礼
わざわざ先生の意図まで考えて回答していただきありがとうございました。 私の力不足で、ヒントをいただいたのにも関わらずコーディングに手こずっています^^; もしよろしければ、作っていただけないでしょうか。わがままを言って申し訳ありません。