廢話少說,上代碼:
#include<stdio.h>
#include<math.h>
int main()//解一元二次方程
{
int a,b,c;
double tool,x1,x2;
printf("請以此輸入一元二次方程的系數:a,b,c\n");
scanf("%d",&a);//編譯是在主函數中是自上向下編譯的,所以不要把賦值tool,x1,x2寫在scanf函數之前
scanf("%d",&b);
scanf("%d",&c);
tool=b*b-4*a*c;
x1=(-b+sqrt(tool))/(2*a);
x2=(-b-sqrt(tool))/(2*a);
if(tool>0)
{
printf("方程有兩個解:\nx1=%lf\nx2=%lf\n",x1,x2);
}
else if(tool==0)
{
printf("方程有一個解:x=%lf\n",x1);
}
else
{
printf("方程無解\n");
}
return 0;
}
分享一下敲這個代碼時的思路和遇到的問題:
1.雖然感覺有些丟臉但我還是要說的,我居然因為少打一個()和一個*,用了足足2分鍾才找到這兩個錯誤......
x1=(-b+sqrt(tool))/(2*a); ----------就是這里 2*a 敲成了 2a ,”/“后的()沒有加 !!!
2.不同數據類型運算問題:不同數據類型相互運算,兩個數據會先自動轉換為精度較大的數據類型,再進行運算(據說這是計算機為了數據更精准偷摸干的)
3.不同數據類型賦值問題:首先要知道賦值是將”=“右邊的數據賦值給左邊,如果右邊數據類型精度較大,可能會導致數據丟失(不是一定);
反之如果左邊的數據類型精度較大,則無需擔心數據的丟失(因為人家裝的下嘛 ~ ~ )
4.一開始我把對 tool,x1,x2 的賦值放在了 scanf 函數之前,但我發現結果總出問題!!!
仔細想想我靠,又是編譯順序的問題,編譯器自上向下編譯,當看到 :
tool=b*b-4*a*c; x1=(-b+sqrt(tool))/(2*a); x2=(-b-sqrt(tool))/(2*a);
編譯器:”tool=b*.....,哎!?b是誰啊,我靠???“,好家伙這鍋我背,變量 b 這時還沒進行初始化就對變量 tool 賦值,代碼跑起來自然是錯誤的結果...
孩子只是個大一的弟弟,如果文章有錯誤,請狠狠地批評我 (~ ̄(OO) ̄)ブ