• ベストアンサー

参照呼出し

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% (2127/6289)
回答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% (2127/6289)
回答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のアドレスに返してね」 とお願いするのです。