Dev c++的問題(非常急!!)

2008-04-02 7:56 am
請問各位高手們!!
老師出了解ax^2+bx+c=0的題目 用b*b-4*a*c>0,=0,<0解方程式
我打了如下的內容但不能編譯請問我究竟打錯了哪裡??
請快教教我吧!!
#include <stdio.h>
#include <math.h>

int main ()
{
float a;
float b;
float c;
float x;
float D;
clrscr();
printf("ax^2+bx+c=0\n");
printf("a=\n");
scanf("%f",&a);
printf("b=\n");
scanf("%f",&b);
printf("c=\n");
scanf("%f",&c);
D=b*b-4*a*c;

if (D>0)
{printf("x=%f\n",(-b+sqrt(D))/(2*a));
printf("x=%f\n",(-b-sqrt(D))/(2*a));}
else if(D==0);
printf("x=%f\n",(-b+sqrt(D))/(2*a));

if (x>=0)
printf("x=%f\n",-b+sqrt(b*b-4*a*c)/2*a)
printf("x=%f\n",-b-sqrt(b*b-4*a*c)/2*a)
system("pause");
return 0;
}
更新1:

我可以在請問一下為什麼每次我的原始碼都無法編譯呢??

回答 (2)

2008-04-02 8:29 am
✔ 最佳答案
#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 看看。
2008-04-02 11:22 pm
//Power by Visual Studio 2005
//Download Site: http://www.microsoft.com/taiwan/vstudio/express/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(int argc, char* argv[]){
//=====START=====//
double a,b,c,d;
printf("Input a= "),scanf("%lf",&a);
printf("Input b= "),scanf("%lf",&b);
printf("Input c= "),scanf("%lf",&c);
d=pow(b,2)-4*a*c;
switch((d?((d>0)?1:-1):0)){
case 0:
printf("\nDouble Roots, x1= x2= %.2lf\n",(-b/2*a));
break;
case 1:
printf("\nReal Roots\n x1= %.2lf\n x2= %.2lf\n",((-b+sqrt(d))/2*a),((-b-sqrt(d))/2*a));
break;
case -1:
printf("\nComplex Roots where i is Imaginary unit.\n",-b/2*a,sqrt(-d)/2*a);
printf(" x1= %.2lf + %.2lf * i\n",-b/2*a,sqrt(-d)/2*a);
printf(" x2= %.2lf - %.2lf * i\n",-b/2*a,sqrt(-d)/2*a);
break;
default:
break;
}
//=====END=====//
system("PAUSE");
return 0;
}


2008-04-03 18:55:49 補充:
有幾行程式碼寫錯了……
忘了寫小括號…
case 0:
printf("&#92;nDouble Roots, x1= x2= %.2lf&#92;n",(-b/(2*a)));

2008-04-03 19:00:11 補充:
-b/2*a要改成-b/(2*a)
其他 case 1 和 case -1 兩個部分也是改相同的地方
還有原本這行…
printf(”&#92;nComplex Roots where i is Imaginary unit.\n”,-b/2*a,sqrt(-d)/2*a);
\n”後面的計算式是沒有必要性的,可以刪除!
(我複製過了頭,忘了刪除)
參考: 僅供參考!


收錄日期: 2021-04-28 23:09:09
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20080401000016KK11537

檢視 Wayback Machine 備份