「2次方程式を解く」(1993/06/02)
要求仕様:
a, b, cを入力して、二次方程式 ax +bx+c=0 の2根を出力するプログラムを作れ。
aが0である場合は考慮しなくていいが、解が虚根である場合もちゃんと
答が求まるようにせよ。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
2次方程式を解く
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
#include <stdlib.h> /* atof() */
#include <math.h> /* sqrt() */
main(int argc,char *argv[])
{
double a,b,c,d;
if (argc<4) { /* 引数が足りない時 */
printf("¥ax2 a b c¥n");
exit(1);
}
/* a,b,cとargv[0]はコマンド名が入ってこれで4つ */
/* 数値読み取り */
a=atof(argv[1]);
if (a==0.0) {
printf("¥aaが0です¥n");
exit(2);
}
b=atof(argv[2]);
c=atof(argv[3]);
printf("%fx^2+%fx+%f=0¥n",a,b,c);
/* 解を求める */
a*=2;
/* x=-b±√(b*b-2*a*c)/a */
d=b*b-2*a*c;
if (d<0.0) { /* 虚根 */
double e,g;
e=-b/a;
g=-d/(a*a); /* √の中は正にして計算しておく */
printf("x=%f+√%fi¥n",e,g);
printf(" =%f-√%fi¥n",e,g);
}
else
if (d==0.0) { /* 重根 */
printf("x=%f(重根)¥n",-b/a);
}
else { /* 通常根 */
b=-b;
d=sqrt(d);
printf("x=%f¥n",(b+d)/a);
printf(" =%f¥n",(b-d)/a);
}
exit(0);
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
とりあえずこれでうまく行くと思います。
プログラム中と以下の文章中に何ヶ所か新JIS文字のルート(√)が入っています。
このため98の人は見えないと思います。諦めましょう。
このプログラムでは虚根の時はルートの内外で数値を別にしているので
根が2で割り切れるかどうかとか、
一部がルートの外に出る(√4=2というやつ)とかいう判定はしていません。
やればできますが、そこまでする必要も感じないのでやめました。
このプログラムではintの16ビット/32ビットは関係ありません。
ポイントは#includeですか。これがなければうまく行きません。
いわいる関数のプロトタイプ宣言というやつです。
返り値がintのときは省略できるだけに忘れがちですが、
doubleのときは非常に重要です。
これだけのものでも作るのに結構苦労しました。
Cで実数演算なんてめったにしないのと2次方程式の解の公式を
忘れていたから。
たまにはこう言うのも作って感を鈍らせないようにするのが大切ですね。