c語言求一元二次方程的根 C語言程式的測試

2021-10-11 07:09:59 字數 3951 閱讀 7328

c語言程式的測試

程式除錯的任務是排除程式中的錯誤,使程式能順利地執行並得到預期的效果。程式的除錯階段不僅要發現和消除語法上的錯誤,還要發現和消除邏輯錯誤和執行錯誤。除了可以利用編譯時提示的「出錯資訊」來發現和改正語法錯誤外,還可以通過程式的測試來發現邏輯錯誤和執行錯誤。

程式的測試任務是盡力尋找程式中可能存在的錯誤。在測試時要設想到程式執行時的各種情況,測試在各種情況下的執行結果是否正確。

有時程式在某些情況下能正確執行,而在另外一些情況下不能正常執行或得不到正確的結果,因此,乙個程式即使通過編譯並正常執行而且可以得到正確的結果,還不能認為程式就一定沒有問題了。要考慮是否在任何情況下都能正常執行並且得到正確的結果。測試的任務就是要找出那些不能正常執行的情況和原因。下面通過乙個例子來說明。

求一元二次方程ax2+bx+c=0的根。

有人根據求根公式:x1,2=,編寫出以下程式:

#include

#include

void main()

float a,b,c,disc.x1,x2;

scanf(「%f,%f,%f」,&a,&b,&c);

disc=b*b-4*a*c;

x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf("x1=%6.2f,x2=%6.2f"x1,x2);

return 0;

當輸入a,b,c的值為1,-2,-15時,輸出x1的值為5,x2的值為-3.結果是正確無誤的。但若是輸入a,b,c的值為3,2,4時,螢幕上出現「出錯資訊」,程式停止執行,原因是對負數求平方根了(b2-4ac=4-48=-44<0).

因此,此程式只適用於b2-4ac≧0的情況。不能說上面的程式是錯的,而只能說程式「考慮不周」,不是在任何情況下都是正確的。使用這個程式必須滿足一定的前提(b2-4ac≧0),這樣,就給使用程式的人帶來不便。在輸入資料前,必須先算一下,b2-4ac是否大於或等於0.

應要求乙個程式能適應各種不同的情況,並且都能正常執行並得到相應的結果。

下面分析一下求方程ax2+bx+c=0的根,有幾種情況:

(1)a≠0時:

b2-4ac>0,方程有兩個不等的實根:x1,2=;

b2-4ac=0,方程有兩個相等的實根:x1=x2=;

b2-4ac<0,方程有兩個不等的共軛復根:x1,2=。

(2)a=0時,方程就變成一元一次的線性方程:bx+c=0.

當b≠0時,x=-c/b;

當b=0時,方程變為:0x+c=0.

·當c=0時,x可以為任何值;

·當c≠0時,x無解。

綜合起來,共有6種情況:

a≠0,b2-4ac>0;

a≠0,b2-4ac=0;

a≠0,b2-4ac<0;

④a=0,b≠0;

⑤a=0,b=0,c=0;

⑥a=0,b=0,c≠0。

應當分別測試程式在以上6種情況下的運**況,觀察它們是否符合要求。為此,應準備6組資料。用這6組資料去測試程式的「健壯性」。在使用上面這個程式時,顯然只有滿足情況的資料才能使程式正確執行,而輸入~⑥情況的資料時,程式出錯。這說明程式不「健壯」。為此,應當修改程式,使之能適應以上6種情況。可將程式改為:

#include

#include

void main()

float a,b,c,disc.x1,x2,p,q;

printf(「input a,b,c:」);

scanf(「%f,%f,%f」,&a,&b,&c);

if(a==0)

if(b==0)

if(c==0)

printf(「it is trivial.」) ;

else

printf(「it is impossbile.」) ;

else

printf(「it has one solution:」);

printf(「x=%6.2f」,-c/b);

else

disc=b*b-4*a*c;

if(disc>=0)

if(disc>0)

printf(「it has two real solutions:」)

x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf("x1=%6.2f,x2=%6.2f"x1,x2);

else

printf(「it has two same real solutions:」);

printf(「x1=x2=%6.2f」,-b/(2*a));

else

printf(「it has two complex solutions:」);

p=-b/(2*a);

q=sqrt(-disc)/(2*a);

printf(「x1=%6.2f+%6.2fi,x2=%6.2f-%6.2fi」,p,q,p,q);

為了測試程式的「健壯性」,我們準備了6組資料:

3,4,1;1,2,1;4,2,1;④0,3,4;⑤0,0,0;⑥0,0,5

分別用這6組資料作為輸入的a、b、c的值,得到以下的執行結果:

input a,b,c:3,4,1↙

it has two real solutions:

x1=-0.33,x2=-1.00

input a,b,c:1,2,1↙

it has two same real solutions:

x1=x2=-1.00

input a,b,c:4,2,1↙

it has two complex solutions:

x1=-0.25+0.43i,2=-0.25-0.43i

④input a,b,c:0,3,4↙

it has one solution:

x=-1.33

⑤input a,b,c:0,0,0↙

it is trivial.

⑥input a,b,c:0,0,5↙

it is impossbile.

經過測試,可以看到程式對任何輸入的資料都能正常執行並得到正確的結果。

以上是根據數學知識知道輸入資料有6種方案。但在有些情況下,並沒有現成的數學公式作依據,例如乙個商品管理程式,要求對各種不同的檢索作出相應的反應。如果程式包含多條路徑(如由if語句形成的分支),則應當設計多組測試資料,使程式中每一條路徑都有機會執行,觀察其執行是否正常。

測試的關鍵是正確地準備測試資料。如果只準備4組測試資料,程式都能正常執行,仍然不能認為此程式已無問題。只有將程式執行時所有可能的情況都做過測試,才能作出判斷。

測試的目的是檢查程式有無「漏洞」。對於乙個簡單的程式,要找出其執行時全部可能執行到的路徑,並正確地準備資料並不困難。但是如果需要測試乙個複雜的大程式,要找到全部可能的路徑並準備出所需的測試資料並非易事。例如,有兩個非巢狀的if語句,每個if語句有兩個分支,它們所形成的路徑數目為2x2=4。如果乙個程式包含100個非巢狀的if語句,每個if語句有兩個分支則可能的路徑數目為2100≈1.267651x1030。實際上進行測試的只是其中一部分(執行機率最高的部分)。因此,經過測試的程式一般來說還不能輕易宣布「沒有問題」,只能說:「經過測試的部分無問題」。正如檢查身體一樣,經過內科、外科、眼科、五官科等各科例行檢查後,不能宣布被檢查者「沒有任何病症」一樣,他可能有隱蔽的、不易查出的病症。所以醫院的診斷書一般寫:「未發現異常」,而不能寫「此人身體無任何問題」。

讀者應當了解測試的目的,學會組織測試資料,並根據測試的結果完善程式。

應當說,寫完乙個程式只能說完成任務的一半(甚至不到一半)。除錯程式往往比寫程式更難,更需要精力、時間和經驗。常常有這樣的情況:寫程式用一天就完成了,而除錯程式兩三天也未能完成。有時乙個小小的程式會出錯五六處,而發現和排除乙個錯誤,有時竟需要半天,甚至更多。希望讀者通過實踐掌握除錯程式的方法和技術。

求一元二次方程的根

求一元二次方程的根 總時間限制 1000ms 記憶體限制 65536kb 描述 利用公式x1 b sqrt b b 4 a c 2 a x2 b sqrt b b 4 a c 2 a 求一元二次方程ax2 bx c 0的根,其中a不等於0。輸入 輸入一行,包含三個浮點數a,b,c 它們之間以乙個空格...

求一元二次方程的根

描述 利用公式x1 b sqrt bb 4ac 2a x2 b sqrt bb 4ac 2a 求一元二次方程ax2 bx c 0的根,其中a不等於0。輸入輸入一行,包含三個浮點數a,b,c 它們之間以乙個空格分開 分別表示方程ax2 bx c 0的係數。輸出輸出一行,表示方程的解。若b2 4 a c...

求一元二次方程的根

從鍵盤上任意輸入 a,b,c 的值,程式設計計算並輸出一元二次方程 ax2 bx c 0 的根 當 a 0 時,輸出 not quadratic equation with one unknown 當 a 0 時,分 b2 4ac 0 b2 4ac 0 b2 4ac 0 三種情況計算並輸出方程的根。...