C言語 if文を使って2次方程式の解の公式を求める【参考例】

プログラミング

 

if文に関する基本的な書き方や応用の仕方は全開で学びました。しかし、まだ実際にどうやって使うのかピンと来ていない人もいると思います。私も最初はそうでした。実感がいまいち湧かない感じ。

 

しかし、今までの生活の中で行ってきた実践的なプログラムを書けばある程度「ああ、こんな感じで使えるのね」とわかります。

 

ということで、今回は中学数学で有名な「2次方程式の解の公式」を入力した値に応じて出していきましょう。このプログラムでは変数を今までより多く使い、if文を使って3通りの条件に分岐するコードが出来ます。

 

実践的なif文の使い方を体験したい方は参考にしてください。

それではやっていきましょう。

 

理解に必要となる項目は

  • 使用するライブラリ
  • 変数の設定
  • 条件分岐

です。

 

使用するライブラリ

 

ライブラリは、プログラム内で関数を使うために必要になります。

 

今回はprintfやscanfなどを使うので<stdio.h>は当然必要ですが、もう一つ必要となるライブラリがあります。

 

それが、<math.h>です。

 

<stdio.h>だけでも単純な数学的な計算はできますが、<math.h>では数学に関するより複雑な計算が出来るようになります。なぜこれが必要なのかというと、今回使う計算の中に「ルート(2乗根)」の計算がでてくるからです。

 

√ を実数で計算するにはこの<math.h>の中にある「sqrt」という関数が必要にります。なので、今回必要になるのは、<stdio.h>と<math.h>の2つです。

 

変数の設定

 

では次に変数の設定をしていきましょう。

 

2次方程式の解の公式は「ax2+bx+c=0」において

x=(-b±(b2-4ac)1/2)/2a

となります。

 

使うのは各xの係数です。なので、そのまま上のように2次のxにはa、1次のxにはb、定数項はcとおき、それぞれ実数とします。

 

この時点ではdouble a,b,c;です。

また、解は最大2つ出てくるのでそれぞれx1、x2としてdouble x1,x2;とします。

 

これだけでもいいのですが、もう一つ置くことでこれからプログラム書くのに楽をすることが出来ます。置くのは、ルートの中の「b2-4ac」判別式です。解の公式では、この判別式の結果として得られる値によって解が変わってきます。つまり、条件分岐が起きます。

 

この時この式をいちいち書くのは面倒なので、ここで

double hanbetu;

hanbetu=b*b-4*a*c;

とします。解の公式で、「b*b-4*a*c」は判別式と呼ばれることことからhanbetuとしました。

 

また、b2がb*bとなっていることですが、C言語で累乗を計算するにはpow関数が必要で、mathのライブラリがあればわざわざb*bと書かなくてもいいのです。しかし、それをいちいち書いていると変数が多くなり、逆にごちゃごちゃしてしまいます。

 

なので、ここからは値同士の掛け算はこまめに * で掛けていくことにします。その方が視覚的にもわかりやすかったので。変数はできるだけ少なくして管理しやすいようにしました。

 

次に先程のルートの話です。これから解を出す上で必ず「(b2-4ac)1/2」という計算結果をたくさん使います。その時いちいちsprt=(b*b-4*a*c)と書くのは面倒です。なのでこればかりは、変数で置いてしまいましょう。

 

double root1 , root2;

root1 = sqrt(hanbetu) ;

root2 = sqrt(-hanbetu);

を置きます。ルートででる値は基本的に実数なのでdouble型を設定します。

 

root1とroot2の2種類あるのは、判別式には正か負の2通りの場合があるからです。root2のときはhanbetu<0のときであり、-マイナスをつけてあげる必要があります。

 

if文による条件分岐

 

条件分岐は判別式hanbetuで起こります。

  • hanbetu>0
  • hanbetu=0
  • hanbetu<0

と3つの条件分岐です。

 

なので

  • if (hanbetu>0)
  • else if (hanbetu==0)
  • else

という形がif文の全体構造になります。elseでは「hanbetuが0でもなく正でもないなら必然的に残るのは、hanbetu<0の場合だけ」という考え方をしています。

 

hanbetu>0の場合は、解が2つ出てきます。それぞれ

x1=(-b+root1)/(2*a);
x2=(-b-root1)/(2*a);

の2つです。(root1=sqrt(hanbetu))

 

hanbetu=0の場合は、解は1つでしかもroot1=root2=0となるから解はb/(2*a)の1つになります。hanbetu<0の場合は、虚部を含む解が2つ出てきてそれぞれは共役です。なので、

実部=-b/(2*a)

虚部=root2/(2*a)

(root2=sqrt(-hanbetu))

と実部と虚部を分けて設定して、表示するときは虚部に虚数iをつけ足して「実部±虚部i」と表示します。

 

プログラム作成

 

では今まで書いた

  • 変数の設定
  • if文のよる条件分岐

の2つをメイン構造として実際のプログラムを書くと

 

実行結果は

判別式>0の場合

 

判別式=0の場合

 

判別式<0の場合

 

全部をいきなり理解するのは難しいかもしれませんが、ひとつずつ見ていくと段階的にその構造を理解することが出来ます。

 

この時、私が書いたコードよりもっと楽な方法があるという方はその方法を取ってください。プログラムはいかにわかりやすく単純にできるかが大事です。今回は判別式や平方根の変数名にhanbetuやroot1などと名付けましたが、自分の好きな名前をつけてください。

 

また、なにかわからないことや説明の足りない部分があれば、コメントしてもらえれば助かります。出来る限りの範囲で説明するつもりです。

コメント