對於如下的壹元二次方程:
ax*x+bx+c=0
設計C語言程序,輸入壹元二次方程的三個系數a、b、c,求解出該方程的兩個根,並且允許用戶在程序中多次輸入不同的系數,以求解不同的壹元二次方程的解。
編程思路分析:
對於該方程,令delta=b^2-4*a*c,從數學的角度來講,我們需要根據delta的值來判斷該方程的根情況:
當delta>=0時,其兩個根為實數解,分別為(-b+sqrt(delta))/(2*a)和(-b-sqrt(delta))/(2*a);
當delta<0時,其兩個根為復數解,實部皆為-b/(2*a),虛部分別為sqrt(-delta)/(2*a)和-sqrt(-delta)/(2*a)。
其中,sqrt(delta)代表對delta作開根號運算。
在代碼設計中,可定義壹個結構體Complex存儲該方程的根,在該結構體中包括實部和虛部兩個變
在程序中,定義兩個Complex類型的根x1和x2,當delta>=0時,兩個根的虛部為0,否則,分別求解兩個根的虛部值。
具體編程如下:
#include?"stdio.h"?
#include?"math.h"?
/*求壹元二次方程ax*x+bx+c=0的解*/?
main()?
{float?a,b,c,x1,x2,d;
printf("請輸入a:");
scanf("%f",&a);
printf("請輸入b:");
scanf("%f",&b);
printf("請輸入c:");
scanf("%f",&c);
d=b*b-4*a*c;if(d?<?0)
printf("方程沒有實數解。\n");
if?(d==0){x1=(-b)/(2*a);
printf("x1=%f\n",x1);}
if?(d>0){x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("x1=%f,x2=%f\n",x1,x2);}?}
請輸入a:12
請輸入b:34
請輸入c:4
x1=-0.122985,x2=-2.710348
Press?any?key?to?continue
擴展資料:
壹元二次方程還可以用叠代法的思想設計程序:
例 ?:壹個飼養場引進壹只剛出生的新品種兔子,這種兔子從出生的下壹個月開始,每月新生壹只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,問到第 12 個月時,該飼養場***有兔子多少只?
分析:這是壹個典型的遞推問題。我們不妨假設第 1 個月時兔子的只數為 u 1 ,第 2 個月時兔子的只數為 u 2 ,第 3 個月時兔子的只數為 u 3 ,……根據題意,“這種兔子從出生的下壹個月開始,每月新生壹只兔子”,則有
u 1 = 1 , u 2 = u 1 + u 1 × 1 = 2 , u 3 = u 2 + u 2 × 1 = 4 ,……
根據這個規律,可以歸納出下面的遞推公式:u n = u(n - 1)× 2 (n ≥ 2),對應 u n 和 u(n - 1),定義兩個叠代變量 y 和 x ,可將上面的遞推公式轉換成如下叠代關系:
y=x*2,x=y
讓計算機對這個叠代關系重復執行 11 次,就可以算出第 12 個月時的兔子數。參考程序如下:
cls ?x=1 ? for i=2 to 12
y=x*2 ? x=y
next i ? print y
end
叠代法是壹類利用遞推公式或循環算法通過構造序列來求問題近似解的方法。例如,對非線性方程?,利用遞推關系式,從?開始依次計算?,來逼近方程的根?的方法,
若?僅與?有關,即?,則稱此叠代法為單步叠代法,壹般稱為多步叠代法;對於線性方程組?,由關系?從?開始依次計算?來過近方程?的解的方法。
若對某壹正整數?,當?時,?與 k 無關,稱該叠代法為定常叠代法,否則稱之為非定常叠代法。稱所構造的序列?為叠代序列。
參考資料:
叠代法_百度百科