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 三種情況計算並輸出方程的根。...