• ベストアンサー

参照呼出し

2 次方程式 x^2 + ax + b = 0 の実数解を求め,画面表示するというプログラムで、係数a,b を 実数型で宣言し。関数をint solve( float, float, float *, float * )というプロトタイプで (第1引数x の係数 , 第2引数: 定数項, 第3 引数: 第1 解へのポインタ,第4 引数: 第2 解へのポインタ,返り値: 解の個数 ) 画面表示のさいに関数からの返り値を利用 というプログラムを組みたいのですが・・・・。 #include <stdio.h> #include <math.h> int solve( float, float, float *, float * ); int main ( void ){ float a, b; float *p, *q; float answer_no1, answer_no2; int number; printf("a = "); scanf("%f",&a); printf("b = "); scanf("%f",&b); answer_no1 = ( (-a + sqrt(a*a-4*b)) / 2 ); answer_no2 = ( (-a - sqrt(a*a-4*b)) / 2 ); //解の公式を使ってx = -a +- √a^2-4ac p = &answer_no1; q = &answer_no2; number = solve( a, b, p, q ); printf("a = %f, b = %f\n", a, b); printf("answer = %f, %f\n",*p, *q ); printf("解の個数は%d\n",number); return(0); } int solve ( float a, float b, float *c, float *d ){ int number,e; e =a*a - 4*b;//Dを判別式として定義(ここを*c,*dを用いて定義?がわからない・・・・・。 if(e > 0){ number = 2; //D>0なら実数解2個 } else if(e == 0){ number = 1; // D=0なら実数解1個(重解) }else{ number = 0; } return number; } しかしこれでは関数int solve の中身の意味がない・・・・・・ポインタを使用する場面がよくわからないです。 あとこれで実行した場合、求めた解がおかしくなるのですが・・・そこの処理もよくわかりません

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

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

solve関数の大まかな処理内容は、次のとおりです。 1)受け取った係数をもとに、判別式の値を計算する。 2)判別式の符号(正、ゼロ、負)によって3つに分岐する。   ・正のとき、答えは2つあるので、引数cとdの値を求める    呼び出し元に、実数解の個数(2)を返す   ・ゼロのとき、答えは1つ(重解)あるので、引数cの値を求める    引数dは何もする必要がない    呼び出し元に、実数解の個数(1)を返す   ・負のとき、答えは虚根となる    呼び出し元に、実数解の個数(ゼロ)を返す main関数で、solve関数を実行した後の処理は、次のとおりです。 1)solve関数の戻り値によって、実数解の個数がわかる。 2)実数解の個数が2のとき、answer_no1とanser_no2の値を出力する。 3)実数解の個数が1のとき、answer_no1の値を出力する。 4)実数解の個数が0のとき、解は出力しない。

その他の回答 (2)

回答No.2

ANo.1さんの通りです。 mainはこんな感じになり、「solveはどう作ったら良い?」って事です。 -----Hint int main(void) {  float a, b;  float answer_no1, answer_no2;  int number;  printf("a = ");  scanf("%f",&a);  printf("b = ");  scanf("%f",&b);  number = solve(a, b, &answer_no1, &answer_no2);  printf("a = %f, b = %f\n", a, b);  printf("answer = %f, %f\n", answer_no1, answer_no2);  printf("解の個数は%d\n",number);  return(0); } ----- ちなみに・・・ 解1と解2が同じなら解は1個です。 解1と解2が違うなら解は2個です。 表示の方も色々と工夫できます^^ 色々と実験してみてください。

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

解の公式を使ってanswer_no1, answer_no2の計算をするのは solve関数の仕事ですね。 main関数の仕事ではありません。 main関数でのpとqの定義は不要です。 main関数からsolve関数に渡すのは、  ・a  ・b  ・answer_no1のアドレス  ・answer_no2のアドレス の4つです。 main関数からは、solve関数に対して、 「係数a, bを渡すから、結果をanswer_no1のアドレスとanswer_no2のアドレスに返してね」 とお願いするのです。

関連するQ&A

  • 参照による呼び出し

    参照による呼び出しで3つの整数を大きい順に並び替えるという プログラムで、 #include<stdio.h> void change(int *x,int *y,int *z);/       main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("入力データ:a=%d,b=%d,c=%d\n",a,b,c); change(&a,&b,&c); printf("入れ替え後:a=%d,b=%d,c=%d\n",a,b,c); return(0); } void change(int *x,int *y,int *z){ if(*x>*y){ *a=*x; *c=*y; } else{ *a=*y; *c=*x; } if(*z>*a){ *b=*a; *a=*z; } else if(*z>*c){ *b=*z; } else{ *b=*c; *c=*z; } } のように作ったのですが、zの値が一度も使われていないとエラーが 出てしまいます。どこをどう直せばいいか教えてください。 お願いします。

  • int型とfloat型の演算結果

    C初心者です。 int型とfloat型で割り算をして処理を表示させてます。 以下、実処理の一部です。 int a; int b; a = 3; b = 2; (1) printf("答え=%d:1のはず\n",a/b); (2) printf("答え=%d:1のはず\n",a/(float)b); (3) printf("答え=%d:1のはず\n",(float)a/b); (4) printf("答え=%d:1のはず\n",(float)a/(float)b); 私の予想では(1)~(4)まですべて1が表示されると思っていました。 実際は(1)のみ1で(2)~(4)は0でした。 (2)~(4)はなぜ0と表示されるのですか? ・整数型と実数型で演算した場合、実数型に合わせられてること ・表示が整数型であること なので1が表示されると予想したのですが・・・。

  • 二次関数で

    任意の二次方程式(ax^2+bx+c=0)を解くプログラムを作るのですが、以下の条件を満たした方法で作るというものです。 1、関数の引数は、3つの係数と、解の入る変数二つとする。 (計5つの引数をとる。) いずれかの引数がアドレス渡し(ポインタ)になる。 2、解は関数呼出の時に指定した2つの変数にそれぞれ代入されること。 3、解の表示は関数側ではなく呼出側で行うこと。 4、グローバル変数は使用しない。 一応作ってみたのですがコンパイルすらできません。 初心者なので全くわかりません教えてください。 #include<stdio.h> #include<math.h> void solve(double *x, double *y); int main(void) { double x,y; solve(&x,&y); return 0; printf("x=%f\n", x); printf("y=%f\n", y); } void solve(double *x, double *y) { doble a,b,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'); double d = b * b - 4 * a * c; if(d >= 0){ x = (-b + sqrt(d)) / (2 * a); y = (-b - sqrt(d)) / (2 * a); } else puts("虚数解"); }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C++でのプログラミングについてです

    プログラミング初心者です C++で二次方程式の解のプログラムを作成したのですがうまく作動させることができません…どこがおかしいのでしょうか、またどのように変更すればよいでしょうか 発生したエラーは 15行 型voidの値をintのエンティティに割り当てることはできません 34行 宣言が必要です 55行 宣言が必要です 15行 voidが他の型と同時に使われました 34行 '{'を見つけました(関数のヘッダーがないかもしれません). 68行 構文エラー:'}' です よろしくお願いいたします #include<stdlib.h> #include<math.h> void solve(double, double, double); int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; int ret; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りです。\n"); ret = solve(a, b, c, &x1, &x2, &r1, &r2); switch (ret) { case-1: printf("係数がおかしい\n"); break; case 0: printf("解は虚数解で%.2f+%.2fi と%.2f-%.2fi です\n", r1, r2, r1, r2); break; case 1: printf("解は実数解となり、%f です。\n", x1); break; case 2: printf("解は実解解で、%f と %f です。¥n", x1, x2); break; } return 0; } void solve(double a, double b, double c, double x1, double x2, double r1, double r2); { if (a == 0.0) { if (b == 0.0) { return -1; } { x1 = -c / b; return 1; } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); return 1; } if (D == 0) { x1 = -b / (2 * a); return 1; } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); return 0; } } }

  • 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言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。

  • どこが悪いのか・・・

    初めまして、こんばんわ。 学校の課題で、二次方程式のXの解を求めるC言語のプログラムを作ったのですが 何故か巧く起動しません。 よくわかりません・・・。 是非、何処が悪いのか指摘していただくと嬉しいです。 /*2-10(su210.c)*/ #include <stdio.h> #include <math.h> main() { int a,b,c; float D,x,y; printf("a*x^2+b*x+c=0のときa.b.cを入力して下さい。\n"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("c="); scanf("%d",&c); if(a=0){ if(b=c=0) printf("xはすべての実数をとる。"); else{ if(c=0&&b!=0) printf("x=0"); else{ if(b=0&&c!=0) printf("解なし。"); else{ if(b!=0&&c!=0) {x=-c/b; printf("x=%f",x);} } } } } else{ if(a!=0){ D=b^2-4*a*c; if(D>0){ x=(-b+sqrt(D))/2/a; y=(-b-sqrt(D))/2/a; printf("判別式はD>0です。\n"); printf("x1=%f\n",x); printf("x2=%f\n",y);} else{ if(D=0){x=-b/2*a;printf("判別式はD=0です。\n");printf("x=%f",x);} else{ if(D<0){printf("判別式はD<0です。\n");printf("解なし。");} } } } } }

  • 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回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。

  • ソースの確認をお願いします

    No736058で質問した者です。 あのあとやってみたんですが、「解なし」としか出てきません。なぜなんでしょうか、教えてください。 /*二次方程式の解*/ #include<stdio.h> #include<math.h> main() { double a,b,c,d,e; printf("y=a*x^2+b*x+cとするとき\n"); printf("aに実数値を入力してください。\n"); scanf("%f",&a); printf("bに実数値を入力してください。\n"); scanf("%f",&b); printf("cに実数値を入力してください。\n"); scanf("%f",&c); e=b*b-4*a*c; if(e>=0) { d=(-b+sqrt(e))/2*a; printf("%f\n",d); } else { printf("実数解なし"); } } お願いします。

専門家に質問してみよう