- ベストアンサー
参照呼出し
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 の中身の意味がない・・・・・・ポインタを使用する場面がよくわからないです。 あとこれで実行した場合、求めた解がおかしくなるのですが・・・そこの処理もよくわかりません
- みんなの回答 (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)
- nuko_punch
- ベストアンサー率40% (10/25)
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% (2127/6289)
解の公式を使って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のアドレスに返してね」 とお願いするのです。