✔ 最佳答案
#include <math.h>
#include <stdio.h>
#include <stdlib.h> // for system("..");
int main ()
{ double a, b, c, d, D; // double is much better than float
system("cls"); // there is no clrscr in C
printf("ax^2 + bx + c= 0\n");
printf("a= "); scanf("%lf", &a); // remember use lf if you use double
printf("b= "); scanf("%lf", &b);
printf("c= "); scanf("%lf", &c);
D = b*b-4*a*c;
a *= 2; // speedup
d = sqrt(fabs(D)) / a; // speedup
b /= -a; // speedup
if (D==0) // 重根
printf("duplicated root\tx = %lf\n", b+d);
else if (fabs(D)<1e-9) // 無法避免的數值誤差!
printf("maybe duplicated root\tx = %lf\n", b+d);
else if (D > 0) // 兩不同根
printf("x1 = %lf\nx2 = %lf\n", b-d, b+d);
else // 兩複數根
printf("x1 = %lf + %lfi\nx2 = %lf - %lfi\n", b, d, b, d);
system("pause");
return 0;
}
這程式是根據你的程式改的。
除了把 float 改作 double 外,幾乎都是改必要的部份。
你最後的 if (x>=0) printf() printf() 大有問題,我全刪重寫了。
哪有不懂請再問。
(註:最近答了一題類似的,約一個月左右,我會在那裡 post 更好的版。
有興趣可以去那裡看看。)
2008-04-02 00:41:25 補充:
忘了我有加速 (那些 speedup),也
忘了告訴你是哪一題:
http://tw.knowledge.yahoo.com/question/question?qid=1608032907979
老囉!:'(
2008-04-03 07:36:21 補充:
關於不能編譯的問題,我在回答時有指出一些:
1. C 沒有 clrscr()。所以我用 system("cls") 取代。
2. 要用的東西都要先宣告。
include 簡言之就是引用別人宣告好的。
system 在 stdlib.h 裡宣告。
3. if (D==0) 後的那個 ; 是多的!
(以下本來有用紅字標上你的錯誤,後來實在差太多,全刪了。
變成〝你最後的 if (x>=0) printf() printf() 大有問題,我全刪重寫了。〞)
2008-04-03 07:36:43 補充:
4. 你該判斷的是 D,不是 x。(這在 compile 時只是警告)
5. 那裡該是 else if (D < 0) // 你的是 if (x >= 0)(這是執行時不會出現正確答案)
6. 你最後的兩個 printf( ) 後面都少了 ; 。
7. 若要寫成二個 printf,要加 { },變成 { printf(...); printf(...); }
8. 你的複數根的部份還有一些錯。
~ ~ ~ ~ ~
你的程式另有個和耗呆小綿羊一樣的問題:沒處理無法避免的浮點
2008-04-03 07:37:12 補充:
不管用綿羊、你的、還是你的 float 改成 double都一樣,輸入,
9.8 42 45
39.2 84 45
35.2 88 55
55 22 2.2
94 42 4.9 (你的不會,羊的會)
90 84 19.6
...
看看,都算錯了!
所以,要加那段 (fabs(D)<1e-9)
2008-04-03 07:56:17 補充:
這種計算誤差就我了解,是無法避免的。
我寫了一個小程式,專門找這種數字。
0~600 之間,儘一位小數的,就超過 200 個。
所以,一定要加那段誤差處理。
賣個關子:有興趣要那程式的,請寄信給我。
還有,回答時所寫的那篇
http://tw.knowledge.yahoo.com/question/question?qid=1608032907979 已 post 出風騷版。
意者請到
http://www.phpbbserver.com/graphicsparalle/viewtopic.php?t=223 看看。