- ベストアンサー
関数のプログラムについて
任意の二次方程式ax^2+bx+c=0をとくプログラムの作成です 引数をa,b,cとして、解の大きい方を返すというものなのですが、 僕は以下のようにして組んだのですが、うまくいきません。 と、いうより、関数の作り方がいまいちわからないです。 どこが駄目なのか教えてください。 作ってみたやつ↓ #include<math.h> #include<stdio.h> int a,b,c; double d; double x,y,z; int main(void) { a=1; b=2; c=1; printf("ax^2+bx+c=0\n "); d=b^2-4*a*c; if (d<0){printf("kyosuukai\n)} else if(d>=0) { x=(b+sqrt(b^2-4*a*c))/2*a; y=(b-sqrt(b^2-4*a*c))/2*a; if(x>=y){z=x} else if(x<y){z=y} printf("x= %f\n",z); } }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
失礼。問題の趣旨に添っていませんでした。 #include <stdio.h> #include <math.h> void input_keisuu(double *a, double *b, double *c); void solve(double a, double b, double c); int main(void) { double a, b, c; input_keisuu(&a, &b, &c); solve(a, b, c); return 0; } void input_keisuu(double *a, double *b, double *c) { puts("二次方程式 a*x^2+b*x+c=0 を解きます"); puts("係数a, b, cを入力してください"); printf("a="), scanf("%lf", a); printf("b="), scanf("%lf", b); printf("c="), scanf("%lf", c); putchar('\n'); } void solve(double a, double b, double c) { double d = b * b - 4 * a * c; double x; if (d >= 0) { x = (-b + sqrt(d)) / (2 * a); printf("2つの実数解のうち大きいのは=%f\n", x); } else puts("虚数解です"); }
その他の回答 (4)
a==0の場合なんかは端折ってあります。 #include <stdio.h> #include <math.h> void input_keisuu(double *a, double *b, double *c); void solve(double a, double b, double c); int main(void) { double a, b, c; input_keisuu(&a, &b, &c); solve(a, b, c); return 0; } void input_keisuu(double *a, double *b, double *c) { puts("二次方程式 a*x^2+b*x+c=0 を解きます"); puts("係数a, b, cを入力してください"); printf("a="), scanf("%lf", a); printf("b="), scanf("%lf", b); printf("c="), scanf("%lf", c); putchar('\n'); } void solve(double a, double b, double c) { double d = b * b - 4 * a * c; double x1, x2, re, im; if (d >= 0) { x1 = (-b + sqrt(d)) / (2 * a); x2 = (-b - sqrt(d)) / (2 * a); printf("x1=%f\n", x1); printf("x2=%f\n", x2); } else { re = -b / (2 * a); im = sqrt(-d) / (2 * a); printf("x=%f±%fi\n", re, im); } }
「^」は ビット演算子 よって ax^2+bx+c=0 → ax*ax+bx+c=0
- rom_exe
- ベストアンサー率44% (13/29)
こんにちは ^^ ええと,まず, ・if (d<0){printf("kyosuukai\n)} に"が足りない. ・x=(b+sqrt(b^2-4*a*c))/2*a; の^はC言語では使えない. (b*bと書くか,pow(b,2)と書いて下さい. ・x=(b+sqrt(b^2-4*a*c))/2*a; の/2*aはこのままでは *(1/2)*(a)になってしまう. ( /(2*a)とカッコでくくって下さい. ・else if(x<y){z=y} で(x<y)となることは無い. でも一番問題なのは関数になっていないことではないでしょうか. 関数についてこの辺り↓で勉強して下さい. http://wisdom.sakura.ne.jp/programming/c/c26.html
- silverbear
- ベストアンサー率25% (163/639)
>x=(b+sqrt(b^2-4*a*c))/2*a; >y=(b-sqrt(b^2-4*a*c))/2*a; たぶん、 y=(-b+sqrt(b*b-4+a+c))/(2*a) じゃないですかね? c言語で^は反転です。 例えば 1^2=3 2^2=0 4^2=6 8^2=10 15^2=13 となります。 あと、分母の括弧を忘れると計算が正しく出来ないので気をつけましょう。