C言語の2次方程式解を求めるプログラムのエラー

このQ&Aのポイント
  • C言語を使ってポインタを利用した2次方程式の解を求めるプログラムを作成しましたが、エラーが発生しています。
  • 問題のエラーはquadEq関数の定義部分にあり、括弧の位置などに問題がないか確認しましたが原因がわかりません。
  • コンパイル時に表示されているエラーメッセージはexpected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ tokenとなっています。
回答を見る
  • ベストアンサー

C言語 2次方程式の解を求めるプログラム

ポインタを使った2次方程式の解を求めるプログラムを作りたいのですが、どこが間違っているのか分かりません。 #include<stdio.h> #include<math.h> int quadEq(int a, int b, int c, double *px1, double *px2) int main() { int a,b,c,s; double x1,x2; printf("?"); scanf("%lf",&a); printf("?"); scanf("%lf",&b); printf("?"); scanf("%lf",&c); if((s=quedEq(a,b,c, &x1, &x2))==2){ printf("%f %f", x1,x2); // 解が二つ } else if(s==1){ printf("%f", x1);// 重解 } else { printf("No real solution");// 虚数解 } } int quadEq(int a, int b, int c, double *px1, double *px2) { int d = b*b-4*a*c; if(d>0){ *px1 = (-b+sqrt(d))/(2*a); *px2 = (-b-sqrt(d))/(2*a); return 2; } else if(d==0) { *px1=-b/2*a; *px2=-b/2*a; return 1; } else { return 0; } } エラーは mondai.c: 関数 ‘quadEq’ 内: mondai.c:5:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before {’ token { ^ mondai.c:26:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token { ^ mondai.c:39:1: エラー: expected ‘{’ at end of input } ^ となりました。括弧の位置の間違いや入れ忘れはないと思うのですが、何か根本的なミスがあるのでしょうか。添削お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

3行目。 int quadEq(int a, int b, int c, double *px1, double *px2)   ; がない。 10行目。 scanf aはint なので&dですね。 quedEqを呼んでいるが定義されているのはquadEq。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

>*px1 = (-b+sqrt(d))/(2*a); >*px2 = (-b-sqrt(d))/(2*a); a, b, dが全部int型なので、誤差を生じませんか? >*px1=-b/2*a; >*px2=-b/2*a; やりたいことは本当にこうですか? 分子を2aにしたいのであれば、カッコが必要では?

回答No.2

まず3行目の、 > int quadEq(int a, int b, int c, double *px1, double *px2) のプロトタイプ宣言の末尾に「;」が無いです。 > mondai.c:5:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before {’ > token > { > ^ 5行目の「{」が変だって言ってるんですから、その前を確認すべき。

関連するQ&A

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

  • 虚数解の表示

    Ax^2+Bx+Cの形の二次関数の解を計算するプログラムです #include <stdio.h> #include <math.h> int main(void) { double a,b,c,d,x1,x2,real,image; printf("A="); scanf("%lf",&a); printf("B="); scanf("%lf",&b); printf("C="); scanf("%lf",&c); if(a==0){x1=-c/b; printf("X=%5.2lf\n",x1); } if(a!=0.0){d=sqrt(pow(b,2.0)-4*a*c); if(d<0.0){ real=(-b)/(2*a); image=sqrt(-d)/(2*a); printf("実数=%5.2lf\n",real); printf("虚数=±%lfi\n",image);} else if(fabs(d)<0.0){ x1=(-b)/(2*a); printf("X=%5.2lf\n",x1);} else if(d>0.0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("X1=%5.2lf\n",x1); printf("X2=%5.2lf\n",x2);} } return 0;} 判別式d<0、d>0、d=0で分けています 判別式dが負になるとき(虚数解の部分)はそのままではsqrtが使えないので、-dを入れてみたのですがうまくいきません どのように修正すればよいのかご教示願います よろしくお願いします

  • C++でのプログラムについての質問です

    このような二次関数の解を求めるプログラムを作成したのですが、自作関数solveをvoid solve(double, double, double)のように変更し同じ動作をするように変更したいです どのようにへんこうすればよいでしょうか #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; }

  • c言語 プログラミング(初心者)

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } return 0; }

  • C言語についての質問です

    プログラミング初心者です if関数を使用して二次方程式の解を解くプログムを作成したのですが、この作成した関数をユーザー定義関数を使用しmain 関数の中でユーザー定義関数を呼び出すことにより、 2次方程式の解を求めるプログラムへ変更したいのですが、どのように行えばいいのか分かりません… 私が作成したプログラムはこのようなものになっています #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; } よろしくお願いいたします

  • 2次方程式の解

    ax^2+bx+c=0の方程式について abcを自分で入力して、「2次方程式として成り立つか」の判断をし、2次方程式であればその解を求めるプログラムです。 2次方程式の解き方をなんとなく忘れていたので、数IIの教科書やらで確認してみました。 以下のように作成したのですが、解が出るはずの値を入力しても強制的に終了してしまいます。どこがおかしいのでしょうか? 他に気になる点は、メイン関数にて「2次方程式として成り立った場合」にはサブへ移動ができているのでしょうか。 あと、仮に↑が合っていたとして、異なる2つの虚数解の計算方法は以下のやり方でも良いのかどうかもお聞きしたいです。 よろしくお願いします。 #include<stdio.h> #include<math.h> void niji(double a,double b,double c){ double x1,x2,x3,y1,y2,D; D=b*b-(4.0)*a*c; if(D>0){ printf("2つの異なる実数解\n"); x1=(-b+sqrt(D))/(2.0*a); x2=(-b-sqrt(D))/(2.0*a); printf("x= %f , %f \n",x1,x2); } else if(D==0){ printf("重解\n"); x3=(-b)/(2.0*a); printf("x= %f \n",x3); } else{ printf("2つの異なる虚数解\n"); x3=(-b)/(2.0*a); y1=sqrt(D)/(2.0*a); y2=-sqrt(D)/(2.0*a); printf("x= %f + i %f, %f - i %f\n",x3,y1,x3,y2); } return; } int main(void){ double a,b,c; printf("ax^2+bx+c=0の式のabcを入力せよ\n"); while(scanf("%f %f %f",&a,&b,&c)){ if(a==b==c==0){ break; } else if((a==b==0)&&(c!=0)){ printf("不能\n"); } else if((a==0)&&(b!=0)){ printf("1次方程式になる\n"); } else{// 入力されたabcが↑の3つに該当しなければ niji(a,b,c);//←サブ関数に示した2次方程式を解く } } return 0; }

  • 二次方程式の解き方

    初心者です。自力で解こうとしましたが、どうしてもわからないので質問させていただきます。 問題 2次方程式ax^2+bx+c=0 (ただし aは0でない)の解を求めよ。ただし、a,b,c(実数)はキーボードから入力し、判別式d=b*b-4*a*cが正か0か負かについて処理せよ。 虚数解についてですが、2+3iや4+2iのようなかんじで答えを出さなければいけないそうです。 次に、私が途中まで作ったプログラミングです。 #include<stdio.h> #include<math.h> int main(void) { double a,b,c,x1,x2,i; printf("ax^2+bx+c=0のa b cを入力してください >>>"); scanf("%lf %lf %lf", &a,&b,&c); if(a==0) { if(b==0.0) { printf("係数がおかしい。\n"); } else { x=-c/b; printf("解は、%gです。\n", x1); } } else { D=b*b-4*a*c; if(D>=0.0) { printf("解は重解となり%gです。\n", x1); } else { printf("解は%gと%gです。\n", x1,x2); } } else { ここまで出来ました。一応、実数解と重解の部分のプログラミングは正解しているようです。この次の部分、つまり、虚数解を求める部分のプログラミングが出来ません。よろしくお願いします。

  • 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次方程式の実数解の個数のプログラムについて…

    C++で、3次方程式の実数解の個数を調べるプログラムを作ってみた(↓)のですが、実行したときに問題点があって困っています。 #include<stdio.h> #include<math.h> void main(void) /*3次方程式の実数解の個数*/ { double a,b,c,d,D,A,B; printf("f(x)=a*pow(x,3)+b*pow(x,2)+c*x+d=0 に対して、a,b,c,dの値を定めると、\n"); scanf("%lf %lf %lf %lf",&a,&b,&c,&d); D=4*pow(b,2)-12*a*c; A=(-b+sqrt(b*b-3*a*c))/(3*a); B=(-b-sqrt(b*b-3*a*c))/(3*a); if(a>0) if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); else a=-a; b=-b; c=-c; d=-d; if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); その問題点というのは、実数解の個数が2個と3個のときは、実行したときの結果として、 実数解の個数は2個 Press any key to continue あるいは 実数解の個数は3個 Press any key to continue と正しく表示されるのですが、実数解の個数が1個のときは、 実数解の個数は1個 実数解の個数は1個 Press any key to continue と「実数解の個数は1個」が2回表示されてしまうのです。 なぜ、2回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。

  • C言語で連立一次方程式

    C言語で連立一次方程式 /* 連立一次方程式 a*x + b*y = e c*x + d*y = f の解を求めるプログラムを作成したい。 a,b,c,d,e,f をキーボード入力させる ことで、 行列 [a b c d] の逆行列、及び、連立方程式の解( x= , y= )を求めたい。 なお、a b c d の値によっては、逆行列を求めることが 出来ません。その時は、 【解を求めることはできません】 と表示してプログラムを終了するようにして下さい。 (注) [a,b,c,d,e,f]を 2次元配列 ma[2][3]とする. [逆行列[a,b,c,d]と解x,y]を 2次元配列 mb[2][3]とする. ma[][] の値をmain関数内でキーボード入力する mb[][] の値は,mat_keisan関数内で計算 mb[][] の値をmain関数内で表示 関数 mat_keisan の戻り値として,「解」が求まる方程式か どうかを知らせる「int 型のフラグ(旗)」として用いるとよい. */ #include<stdio.h> int mat_keisan(int ma , int mb); int main(void) { int inverse; double ma[2][3]; double mb[2][3]={0}; printf("連立一次方程式の計算\n"); printf("a * x + b * y= e\n"); printf("c * x + d * y= f\n"); printf("Input a :"); scanf("%lf",&ma[1][1]); printf("Input b :"); scanf("%lf",&ma[1][2]); printf("Input c :"); scanf("%lf",&ma[1][3]); printf("Input d :"); scanf("%lf",&ma[2][1]); printf("Input e :"); scanf("%lf",&ma[2][2]); printf("Input f :"); scanf("%lf",&ma[2][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[1][1],ma[1][2],ma[1][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[2][1],ma[2][2],ma[2][3]); inverse=mat_keisan(ma,mb); if(inverse==1) printf("計算できません\n"); else{ printf("逆行列\n"); printf("%4.2f %4.2f\n", mb[1][1],mb[1][2]); printf("%4.2f %4.2f\n", mb[2][1],mb[2][2]); printf("解\n"); printf("x=%4.2f\n",mb[1][3]); printf("y=%4.2f\n",mb[3][3]); } return (0); } /* 配列の足し算 */ int mat_keisan(int ma ,int mb ) { int x,y,z;// 1/ma[1][1]*mb[2][2]-ma[1][2]*mb[2][2]; //逆行列と解を求めるプログラムを作成する。 //そしてその値をmb[][] に入力する。 return(#######); } 関数内が手も足もでません; 他のサイトを調べてみたのですが逆行列を求めるプログラムがよくわかりません; >int mat_keisan(int ma ,int mb ) は、あってないかもです; それとinverseの意味がわかりません; ヒントや、解説を よろしくお願いします;。

専門家に質問してみよう