|
はじめまして。大学で地球科学を学んでいます。
卒論で、熱力学の計算から、地球内部について
研究しようと、C言語をはじめました。
学部3年のうちに、ある程度のレベルまでもっていきたいと
思っております。まだまだ初心者ですが、
よろしくお願いします。
さて、さっそくで申し訳ないのですが質問させてください。
以下、2次方程式の解を求めるプログラムを作成しました。
ax^2+bx+c=0をとくものです。a=0、a≠0で場合わけし、
さらに、こまかい場合分けをしました。
a≠0のとき、つまり完全に2次方程式となるときには、
判別式Dをつかって、場合分けをしました。
ここで、Dをまず最初に、double型で宣言しました。
その後で、D=b*b-4*a*c; としたいのです。
これの位置に問題がありました。
Dを宣言した直後に、これを記載したところ、
まったく変な結果となってしまいました。
そこで、現在の位置(Dを使う直前)に直したところ
うまくいきました。
なぜ、これでうまくいったのか、疑問なのです。
変数を定義するとき、どこがベストである、
ということはあるのでしょうか。
よろしくお願いいたします。
以下、実際のソースです。
---------------------------
#include<stdio.h>
#include<math.h>
int main(void)
{
double a,b,c,D,x1,x2;
double i,z1,z2;
printf("ax^2+bx+c=0を求める。");
printf("aを入力>>");
scanf("%lf",&a);
printf("bを入力>>");
scanf("%lf",&b);
printf("cを入力>>");
scanf("%lf",&c);
if(a==0.0)
{
if(b==0.0)
{
if(c==0.0)
{
printf("0=0となり、意味がない。");
}
else
{
printf("%f=0となり、矛盾。",c);
}
}
else
{
x1=(-c)/b;
printf("%fx+%f=0の解は\n",b,c);
printf("x=%f",x1);
}
}
else
{
D=b*b-4*a*c;
if(D>0)
{
x1=(-b+sqrt(D))/(2*a);
x2=(-b-sqrt(D))/(2*a);
printf("%fx^2+%fx+%f=0の解は\n",a,b,c);
printf("解は、%f,%f",x1,x2);
}
else if(D==0.0)
{
x1=(-b)/(2*a);
printf("%fx^2+%fx+%f=0の解は\n",a,b,c);
printf("重解となり%f",x1);
}
else
{
i=sqrt(-D);
z1=(-b)/(2*a);
z2=i/(2*a);
printf("%fx^2+%fx+%f=0の解は\n");
printf("x=%f+%f i ,%f-%f i ",z1,z2,z1,z2);
}
}
return 0;
}
/*
D=b*b-4*a*c; の位置に対する疑問
これを、doubleで定義した直後にもってくると、うまくいかなかった。
それを、現在の状態にすると、うまく作動している。
これは、なぜか。
具体的には、a!=0の場合において、すべてD=0として計算されてしまい、
正しい値が求められない。
*/
|