IEにおいて、
[Math Processing Error] となって数式等が正しく表示されないときは、
互換表示をOFFにすること!
2次方程式を解く関数
実数係数の2次方程式$ax^2+bx+c=0\ (a\ne 0)$を実数の範囲で解く関数を作る。
プログラムの中で何度も何度も2次方程式を解く必要があるとすれば、関数を作っておくのが便利です。
2次方程式を解く関数qeq()の仕様
- 係数 a, b, c を float で受ける
- 解の格納場所 x1p, x2p を float * で受ける
- 戻り値はintで実数解の個数とし、判別式 D の符号によって、
- D > 0 の時は、2実解を *x1p と *x2p に格納し、戻り値として 2 を返す
- D = 0 の時は、重解を *x1p に格納し、戻り値として 1 を返す
- D < 0 の時は、戻り値として 0 を返す
- a = 0 の時は、戻り値として -1 を返す
ものとする
プログラム
/* 連続的に2次方程式を解くプログラム */
#include <stdio.h>
#include <math.h>
main()
{
int qeq( float a, float b, float c, float *x1p, float *x2p );
float a, b, c, x1, x2;
for(;;) /* 無限ループ */
{
printf("2次方程式 ax^2 + bx + c = 0 を解きます\n");
printf("係数 a, b, c を入力して下さい(a=0の時終了します):");
scanf("%f %f %f", &a, &b, &c );
switch( qeq( a, b, c, &x1, &x2 ) )
{
case 2:
printf("%f, %f\n", x1, x2 );
printf("の2実根。\n");
continue;
case 1:
printf("%f\n", x1 );
printf("の重根。\n");
continue;
case 0:
printf("実数解なし。\n");
continue;
case -1:
printf("2次方程式ではありませんでした。終了します。\n");
break;
}
break;
}
}
/*
main()の中で定義された自動(auto)変数の a, b, c と、
qeq()の仮引数(qeqの自動変数と同じ記憶クラス)の a, b, c は、
それぞれ全く別のメモリ領域が割り当てられる、別の変数である。
*/
/* 2次方程式を解く関数 */
int qeq( float a, float b, float c, float *x1p, float *x2p )
{
/* さー考えよう! */
}
/* end of feq.c */
- 係数の入力の区切りはスペースを使うこと!
- 係数に 1 -5 4 と入れてみよう(2実解の場合)
係数に 4 -5 1 と入れると?
- 係数に 1 -4 4 と入れてみよう(重解の場合)
係数に 4 -4 1 と入れると?
- 係数に 1 1 1 と入れてみよう(解なしの場合)
- 係数に 0 -1 1 と2次の係数 a にゼロを入れてみよう