C語言教學(xué)課件:第八部分 基本程序設(shè)計(jì)技術(shù)1_第1頁
C語言教學(xué)課件:第八部分 基本程序設(shè)計(jì)技術(shù)1_第2頁
C語言教學(xué)課件:第八部分 基本程序設(shè)計(jì)技術(shù)1_第3頁
C語言教學(xué)課件:第八部分 基本程序設(shè)計(jì)技術(shù)1_第4頁
C語言教學(xué)課件:第八部分 基本程序設(shè)計(jì)技術(shù)1_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1學(xué)習(xí)程序設(shè)計(jì)需要注意規(guī)律性的東西同一個(gè)問題可以采用不同的解決方案不同的解決方案具有不同的效率2第八部分 基本程序設(shè)計(jì)技術(shù)3本部分內(nèi)容基本程序設(shè)計(jì)技術(shù)循環(huán)程序設(shè)計(jì)解決問題的一些思路數(shù)據(jù)的精度程序調(diào)試4循環(huán)的常用機(jī)制+, - 將變量值加/減 1。有前/后置寫法: +x x+ 將x的值加1 -x x- 將x的值減1建議不要寫難以理解的語句,如:Sum=(+a)+(+a);Printf(“%d%d%d”,a,a+,a+);1. 增/減量運(yùn)算5形式:表達(dá)式1,表達(dá)式2 ,表達(dá)式3,表達(dá)式4執(zhí)行時(shí)先求值表達(dá)式1,后求值表達(dá)式2,以表達(dá)式n的值作為整個(gè)逗號表達(dá)式的值。優(yōu)先級最低(低于賦值),從左向右結(jié)合。

2、主要用在 for 頭部做變量初置和更新,用于做多個(gè)變量賦值或更新。例(求平方和):for(sum=0, n=1; n=100; +n) sum = sum + n * n;2. 逗號運(yùn)算符( a=3*5,a*4), a+520 x=(a=3,6*a) a=3 x=1863.實(shí)現(xiàn)二元運(yùn)算符操作的賦值運(yùn)算符常見“sum = sum + n*n;”形式的賦值。C語言為許多二元運(yùn)算符提供了(復(fù)合)賦值符。算術(shù)運(yùn)算符都有對應(yīng)賦值運(yùn)算符:+=-=*=/=%= x+=y; 相當(dāng)于 x=x+(y); x*=y+z; ? 賦值運(yùn)算符使用的例子(求平方和):for (sum = 0, n = 1; n = 100

3、; n+) sum += n * n;這些運(yùn)算符的優(yōu)先級與結(jié)合方式與普通賦值相同。sum =sum+n * n74.循環(huán)中的幾種變量循環(huán)中常出現(xiàn)幾類變量,注意這些有助于對循環(huán)的思考和分析。1)循環(huán)控制變量(循環(huán)變量):循環(huán)前設(shè)初值,循環(huán)中遞增/遞減,達(dá)到/超過界限時(shí)循環(huán)結(jié)束。它們控制循環(huán)的進(jìn)行/結(jié)束。 for中常有這類變量。for(n = 0; n = 0; -n) . .for(n = 2; n 52; n += 4) .這種循環(huán)是固定次數(shù)的循環(huán)。82)累積變量:循環(huán)中常用 += 或 *= 等更新。初值常用運(yùn)算的單位元(加用0;乘用1為初值)。循環(huán)結(jié)束時(shí)變量終值被作為循環(huán)計(jì)算結(jié)果。 sum+

4、=t;3)遞推變量:對變量x1、x2、x3,循環(huán)體可能有序列:x1 = x2;x2 = x3;x3 = . x1 . x2 .;9寫循環(huán)時(shí)要考慮和解決問題:循環(huán)涉及到哪些變量,需引進(jìn)哪些臨時(shí)性變量?循環(huán)如何開始?循環(huán)開始前給變量什么初值?循環(huán)中變量的值如何改變?什么情況下繼續(xù)(或終止)循環(huán)?循環(huán)終止后如何得到所需結(jié)果?用哪種結(jié)構(gòu)實(shí)現(xiàn)循環(huán),等等。工作方式:分析問題,發(fā)掘線索,最終完成程序。10只有在程序設(shè)計(jì)實(shí)踐中才能學(xué)好程序設(shè)計(jì):1)模仿好的范例;2)自己動(dòng)手動(dòng)腦,反復(fù)實(shí)踐從問題出發(fā)做出程序的整個(gè)過程;3)多想想自己的程序做得怎么樣,能不能做得更好。只有學(xué)會怎樣做好小程序,才能做出大程序11學(xué)習(xí)

5、程序設(shè)計(jì)需要注意規(guī)律性的東西。三種流程模式是重要總結(jié)。本節(jié)主要內(nèi)容:循環(huán)程序設(shè)計(jì)進(jìn)階順序模式最簡單選擇模式:要確定判斷條件及不同情況下的動(dòng)作難點(diǎn)是實(shí)現(xiàn)重復(fù)執(zhí)行的循環(huán)。8.1 循環(huán)程序設(shè)計(jì) 12138.1循環(huán)程序設(shè)計(jì)寫循環(huán)首先要發(fā)現(xiàn)循環(huán)。重復(fù)動(dòng)作的常見實(shí)例:一批類似數(shù)據(jù)做同樣加工處理累積一批可按規(guī)律算出的數(shù)據(jù)(累加等)反復(fù)從一個(gè)結(jié)果算出下一結(jié)果(遞推)若重復(fù)次數(shù)很多,就應(yīng)該考慮用循環(huán)如果重復(fù)次數(shù)無法確定,就必須用循環(huán)描述14例1:求13到315所有數(shù)的平方根之和??梢砸粋€(gè)個(gè)地加,但更方便的方法是寫循環(huán)。需要一個(gè)變量保存部分和,逐步把各平方根加上去;需要一個(gè)變量保存變動(dòng)軌跡,從初值開始每次修改。f

6、or(sum = 0.0, n = 13; n = 13; -n) sum += sqrt(n);典型for循環(huán)。假定已有總和變量sum和循環(huán)變量n:向上循環(huán)向下循環(huán)循環(huán)變量累積變量基本的循環(huán)方式有兩種:向上循環(huán)和向下循環(huán)15while語句重寫上例double sum;int n;Sum = 0.0; n = 13;while (n = 315) sum += sqrt(n); +n; 16注意:因?yàn)楦↑c(diǎn)計(jì)算存在誤差,一般不用浮點(diǎn)數(shù)控制循環(huán),尤其是增量為小數(shù)或包含小數(shù)時(shí)。例:求從0到100每隔0.2的數(shù)的平方根之和: double sum, x;for (sum=0.0, x=0.2; x=1

7、00.0; x+=0.2) sum += sqrt(x);由于浮點(diǎn)計(jì)算誤差,不能保證循環(huán)500次。應(yīng)寫:int n; double sum;for (sum = 0.0, n = 1; n = 500; +n) sum += sqrt(0.2*n);17例2:打印出 1 到 200 間的完全平方數(shù)。方法一:逐個(gè)檢查,遇平方數(shù)打印。循環(huán)框架:for (n = 1; n = 200; n+) if (n是完全平方數(shù)) 打印 n;n 是完全平方數(shù)判斷:m可以從1開始,遞增,直至m*m大于n:for (m = 1; m * m = n; m+) if (m * m = n) 打印 n;18完整程序:#

8、includeint main() int m, n;for(n=1; n = 200; n+)for (m = 1; m * m = n; m+) if (m * m = n) printf(%d , n);printf(n); return 0;內(nèi)層循環(huán)結(jié)束的兩種情況:1,找到m使m*m=n(n是完全平方數(shù))2,試探了所有可能,但都不成功(n不是)共循環(huán)了多少次?19具有累計(jì)循環(huán)次數(shù)功能的完整程序:#include int main () int m, n, count = 0; for (n = 1; n = 200; n+) for (m = 1; m * m = n; m+) cou

9、nt+; if (m * m = n) printf(%d , n); printf(“%dn“, count); return 0;共循環(huán)了1799次20方法二:需要打印的一定是從1開始連續(xù)幾個(gè)整數(shù)的平方,可從1開始打印到平方大于200為止。for (n = 1; n * n = 200; +n) printf(%d , n * n); /*注意打印什么*/ 方法三:還可以考慮利用遞推公式:方法一產(chǎn)生所有備選數(shù)據(jù)(1到200的整數(shù)),檢查排除不合格的。生成與檢查是解決問題的常用方法。方法二是針對具體問題的特定方法。21#includeint main() int termn, n; for

10、(n = 1,termn = 1;termn = 200; n+) printf(%4d,termn); termn += 2*n+1; return 0;利用遞推公式求平方數(shù)程序:方法與啟發(fā)方法1產(chǎn)生所有備選數(shù)據(jù)(1到200之間的整數(shù)),檢查排除不合格的。啟發(fā)生成與檢查是解決問題的常用方法。方法2換個(gè)角度思考問題,是針對具體問題的特定方法。方法3遞推,用數(shù)學(xué)模型解決問題啟發(fā)同一個(gè)問題,可以有不同的解決方法應(yīng)嘗試切換思考角度和尋找更有效的方法不同的方法有不同的效率22例3:判斷整數(shù)是否為素?cái)?shù)int isprime(int),返回0/1值n是素?cái)?shù)當(dāng)且僅當(dāng)n沒有真因子若n % m = 0,則m是n

11、的因子若n % m = 0,且 m n 23素?cái)?shù)判斷函數(shù)定義int isprime (int n) /* n是否素?cái)?shù) */ int m = 2; for ( ; m * m = n; m+) if (n % m = 0) return 0; /只要發(fā)現(xiàn)能被一個(gè)數(shù)整除,就返回 return 1; /* 沒有因子,是素?cái)?shù) */24分析從循環(huán)中退出途徑只要發(fā)現(xiàn)一個(gè)因子,就可做結(jié)論,return 0;沒有發(fā)現(xiàn)因子,循環(huán)條件不符合。函數(shù)存在的問題對1給出“是素?cái)?shù)” ;負(fù)數(shù)也會給出不合理結(jié)果。應(yīng)該在循環(huán)前處理特殊情況if (n = 1) return 0;負(fù)數(shù)問題?如果需要可以另外考慮處理。2526例4,

12、艱難旅程(浮點(diǎn)誤差)。烏龜要去環(huán)球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,。問一小時(shí)能爬出多遠(yuǎn)?爬20米需多少秒? 一小時(shí)能爬多遠(yuǎn)算法:1.d(距離,實(shí)數(shù)); s(時(shí)間,整數(shù));2.d=0.0;s=1;3. d=d+1/(實(shí)數(shù))s; s=s+1; 4.如果s=3600,轉(zhuǎn)3;5.否則,輸出d;爬20m需多少秒算法:d(距離,實(shí)數(shù)); s(時(shí)間,整數(shù));d=0.0,s=1;d=d+1/(實(shí)數(shù))s;s=s+1; 如果d20.0,轉(zhuǎn)3;否則,輸出s-1;根據(jù)數(shù)學(xué),烏龜能完成環(huán)球,可以爬得任意遠(yuǎn)。這里想比較float和double的計(jì)算誤差情況。s-1?27n秒能爬x米的

13、函數(shù)float distfun(long n) float distfun(long n) long i; float x = 0.0; for (i = 1; i = n; +i) x += 1/(float)i; return x;例4,艱難旅程(浮點(diǎn)誤差)。烏龜要去環(huán)球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,。問一小時(shí)能爬出多遠(yuǎn)?爬20米需多少秒? 28例4,艱難旅程(浮點(diǎn)誤差)。烏龜要去環(huán)球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,。問一小時(shí)能爬出多遠(yuǎn)?爬20米需多少秒? 20米需要多少時(shí)間。寫出下面函數(shù):long scndsf

14、un(float d) /*d為爬行距離*/ long i; float x = 0.0; for (i = 1; x d; +i) x += 1/(float)i; return i - 1;d=2029寫下面語句,執(zhí)行時(shí)總也不輸出:printf(%lds, %fmn,scndsfun(20.),20.);修改為如下語句:for (x = 10.0; x = 20.0; x += 1.0) printf(%lds, %fmn,scndsfun(x),x);原因?程序輸出: 12367s, 10.000000m 33617s, 11.000000m 91328s, 12.000000m 248

15、695s, 13.000000m 662167s, 14.000000m1673859s, 15.000000m而后又沒反應(yīng)了。30void test_float () long i; float sum = 0.0, sum0 = -1.0; for (i = 1; sum != sum0; +i) sum0 = sum; sum += 1 / (float)i; printf (float: %ld terms at %fn, i-1, sum); 對烏龜活動(dòng)的模擬受到數(shù)據(jù)表示精度和范圍的限制。 考慮如下的測試函數(shù):程序很快就輸出了一行:float: 2097152 terms at 15

16、.403683判斷爬的距離不再發(fā)生變化。Float精度限制,差值無法測試到記住上一次的值解決方案:改用雙精度浮點(diǎn)數(shù)如果把測試程序改用double類型變量保存距離則可以得出如下結(jié)果(15m以后) 1835421s, 15m 2989191s, 16m 13562027s, 17m 36865412s, 18m111210581s, 19m272400600s, 20m采用float表示所爬的里程,d為目標(biāo)里程long scndsfun(float d) long i; /秒數(shù) double x = 0.0; /已經(jīng)爬里程 for (i = 1; x = 1E-6) x1 = x2; x2 = (

17、2.0*x1 + x / (x1*x1) / 3.0; return x2;程序的一個(gè)缺點(diǎn)是同一表達(dá)式寫了兩次。調(diào)用語句:y=cbrt(200);或x=200;y=cbrt(x);36do-while沒有for和while語句用得多。用do-while結(jié)構(gòu)重寫求立方根函數(shù):double cbrt(double x) double x1, x2 = x;if (x = 0.0) return 0.0; /*處理特殊情況*/ do x1 = x2; x2 = (2.0*x1 + x / (x1*x1) / 3.0; while (fabs(x2 - x1) / x1) = 1E-6); retur

18、n x2;37循環(huán)中的遞推變量:對變量x1、x2、x3,循環(huán)體可能有序列:x1 = x2;x2 = x3;x3 = . x1 . x2 .;例如上面cbrt里的變量x1和x2。38例6:定義函數(shù),利用公式求 近似值。設(shè)為double dsin(double x)。sum = 0.0; 對n為0計(jì)算t;while (需要繼續(xù)) sum = sum + t; 計(jì)算下一個(gè)t;循環(huán)結(jié)束條件:例如用項(xiàng)絕對值小于 。方法:循環(huán)累加,n 趨向無窮的過程中項(xiàng)值趨于0,而累加值趨向函數(shù)值。保存累加和的變量sum ,循環(huán)中求出的項(xiàng)值用 t 保存。39問題:t 的值如何計(jì)算?第一個(gè) t就是 x;分析可以發(fā)現(xiàn)項(xiàng)值的遞

19、推公式:double dsin(double x) double s=0.0, t=x; int n=0; /*n=0,t=x*/ while (t=1E-6|t=-1E-6) s+=t; n=n+1; t=-t*x*x/(2*n)/(2*n+1); return s;Sin(x)=x-x3/3!+x5/5!-x7/7!+.8.2 循環(huán)中的重要問題 40nmisprime(m)isprime(n-m)驗(yàn)證結(jié)果6311OK58311OK510311OK511OK712310NO511OK7nmisprime(m)isprime(n-m)驗(yàn)證結(jié)果14311OK510711OK916311OK510

20、OK710NO9.存在多余判斷for (n = 6; n = 200; n += 2) for (m = 3; m = n / 2; m+= 2) if (isprime(m) & isprime(n - m) printf(%d=%d+%dn, n, m, n-m);如何從循環(huán)中退出?例:對6200的各偶數(shù)驗(yàn)證哥德巴赫猜想(一個(gè)偶數(shù)可以拆成兩個(gè)素?cái)?shù)),可以利用前面寫的素?cái)?shù)判斷函數(shù)isprime41用return退出?前面寫isprime時(shí)借助return退出了函數(shù),效果上等于結(jié)束了循環(huán)。但是在這個(gè)程序里,程序判斷完某個(gè)偶數(shù)n已經(jīng)由某個(gè)素?cái)?shù)對組成以后,還需要對下一個(gè)偶數(shù)進(jìn)行相同判斷。此時(shí)并不能

21、用return結(jié)束函數(shù)的執(zhí)行,怎么辦?42解決方案1增加對循環(huán)的控制,把發(fā)現(xiàn)素?cái)?shù)分解作為條件加入。引入整型變量found,值0表示未發(fā)現(xiàn)素?cái)?shù)對。發(fā)現(xiàn)時(shí)將found賦1。內(nèi)循環(huán)開始時(shí)found置0。應(yīng)修改內(nèi)層循環(huán)條件。修改后循環(huán)是for (n = 6; n = 200; n += 2) for (found = 0, m = 3; m = n / 2 & !found; m += 2) if (isprime(m) & isprime(n-m) printf(%d=%d+%dn, n, m, n - m); found = 1; 非常常用的機(jī)制,設(shè)置變量用于表示某一項(xiàng)任務(wù)的完成狀態(tài)或某個(gè)對象的狀

22、態(tài)FoundNOTFound43執(zhí)行過程示意nmfoundisprime(m)isprime(n-m)found6301115183011151103011151230100501117114301115116301115118FoundNOTFound44解決方案2:用break語句語法break;功能及說明break只能用在循環(huán)語句及switch語句里。用在循環(huán)語句里,從break所處的循環(huán)層次的復(fù)合語句內(nèi)跳出(跳到外層),程序中被跳出的循環(huán)語句體之后的第一條語句處繼續(xù)執(zhí)行。用在switch語句的語句體中時(shí),從該語句體中跳出,執(zhí)行跳到switch的語句體之后繼續(xù)執(zhí)行。45例,用break實(shí)

23、現(xiàn)跳出for (n = 6; n = 200; n += 2) for (m = 3; m = n / 2; m += 2) if (isprime(m) & isprime(n - m) printf(%d = %d+%dn, n, m, n - m); break; printf(“finished”);問題:執(zhí)行完break以后執(zhí)行哪條語句或計(jì)算?expr2循環(huán)體真(非0)for計(jì)算expr1計(jì)算expr3假(0)46執(zhí)行過程示意nmisprime(m)isprime(n-m)驗(yàn)證結(jié)果6311TRUE8311TRUE10311TRUE12310FALSE511TRUE14311TRUE1

24、6311TRUE1847利用break重寫前面求立方根的函數(shù)double cbrt (double x) double x1, x2 = x; if (x = 0.0) return 0.0; while (1) x1 = x2; x2 = (2.0 * x1 + x / (x1 * x1) / 3.0; if (fabs(x2 - x1) / x1) 1E-6) break; return x2;本例中,因循環(huán)結(jié)束后函數(shù)不需要再做別的事情,因此也可以在 break 處直接寫 return x2。解決了同一表達(dá)式計(jì)算寫了兩段相類似的計(jì)算代碼的問題48“常量”是標(biāo)識符形式,在程序里代表同一常數(shù)的

25、東西。用enum定義(枚舉)可方便地定義一組符號常量:enum NUM = 10, LEN = 20; 枚舉常量的作用?用于循環(huán)示例例:#include enum START = 0, END = 300, STEP = 20;int main (void) int c; for (c = START; c = END; c += STEP) printf(C = %d, F = %fn, c, c * 5.0/9.0 + 32.0); return 0; /*這樣的程序更容易修改*/另一種形式:define START 0define END 300# define STEP 2049符號形

26、式表示能幫人理解程序意義。程序里兩個(gè)0可能代表不同意義,數(shù)值形式?jīng)]有任何區(qū)分。采用符號常量可提高可讀性。將所需常數(shù)定義為符號常量,在程序中統(tǒng)一使用是很好的方法。使程序更容易修改(修改時(shí)不必瀏覽整個(gè)程序)。對大程序的作用更明顯。課本第五章繼續(xù)介紹其他常量定義方式。enum的詳細(xì)討論在第九章,目前作為一種定義符號整型常量的機(jī)制。 說明:508.3 程序設(shè)計(jì)舉例518.3 程序設(shè)計(jì)實(shí)例例1:簡單交互式計(jì)算器。假定它可以輸入并計(jì)算:128+365254+143810313+524 輸入一行算一個(gè)結(jié)果。直至用戶要求結(jié)束?;舅枷耄?while (還有輸入) 取得數(shù)據(jù) 計(jì)算并輸出用scanf讀數(shù)據(jù),用文件

27、結(jié)束或非數(shù)字表示輸入結(jié)束。52#include int main () int left, right; printf(Small calculator.n); printf(Any no-digit character to stop.n); while(scanf(%d, &left) = 1) if(getchar()!=+ | scanf(%d,&right)!=1) printf(Fmt error. Enter: nnn+mmmn ); while (getchar() != n); /丟掉本行剩余字符 ; continue; printf(%d+%d=%dn,left,right

28、,left+right); return 0;53例2:單詞計(jì)算問題 英文正文文件可看成是字符序列,空白字符把序列分隔為一個(gè)個(gè)“單詞”。要求寫程序統(tǒng)計(jì)文件中的單詞個(gè)數(shù)。 空白字符包括:空格 、制表符t、換行符n54問題分析需要一個(gè)計(jì)數(shù)器,遇到一個(gè)詞將計(jì)數(shù)器加一??紤]用函數(shù)getchar讀字符。程序主要部分的框架:while (文件未結(jié)束) 遇到一個(gè)詞時(shí)計(jì)數(shù)器加一;打印統(tǒng)計(jì)信息;用getchar輸入,很容易判斷文件結(jié)束。問題是如何確定“遇到了一個(gè)詞”。55初始思路: #include int main () int c = , count = 0; while (c != EOF) while

29、(c = getchar() != EOF & (c = | c = t | c = n) ; if (c = EOF) break; +count; while (c = getchar() != EOF & c != & c != t & c != n) ; printf(word count: %dn, count); return 0;讀完新詞略過空白字符出現(xiàn)新詞56如何判斷一個(gè)單詞?若讀的字符是單詞首字符,則計(jì)數(shù)器加一。讀入字符過程中需要區(qū)分是否空白。問題:非空白字符未必是詞的開始,是否新詞要看前一字符是否空白??梢姡翰荒芄铝⒌靥幚砬闆r,要參考前面情況。必須做情況記錄,以便后面參考。

30、57前后關(guān)系分兩種情況:1)讀到空白,隨后遇非空白字符就是新詞;2)讀到非空白,隨后不會遇到新詞??煽醋魈幚磉^程的不同狀態(tài),兩種狀態(tài):1)讀在詞外(遇到非空白是新詞); 2)讀在詞內(nèi)。在讀入字符的過程中讀入狀態(tài)也不斷轉(zhuǎn)換。典型,可以用有限狀態(tài)轉(zhuǎn)換系統(tǒng)(自動(dòng)機(jī))描述。58分析前后關(guān)系OUTIN讀到空格字符狀態(tài)不變讀到非空格字符轉(zhuǎn)入詞內(nèi)狀態(tài)讀到空格字符轉(zhuǎn)入詞外狀態(tài)讀到非空格字符狀態(tài)不變兩種讀入狀態(tài):OUT: 當(dāng)前位置在詞外IN: 當(dāng)前位置在詞內(nèi)在從OUT轉(zhuǎn)換到IN時(shí),遇到新詞,計(jì)數(shù)。狀態(tài)圖轉(zhuǎn)換圖59狀態(tài)的表示60可以用一個(gè)變量來記錄狀態(tài),設(shè)state令變量取值為IN和OUT;只要求這兩個(gè)值不同;不

31、會同時(shí)處在兩種狀態(tài);可以將IN, OUT定義成枚舉值。if (c = | c = t | c = n) if (state = IN) state = OUT; else /* state為OUT */ state = OUT;else /* 不是空格 */ if (state = IN) state = IN; else /* state為OUT */ state = IN; +count; /* 許多地方可以簡化 */61當(dāng)前讀狀態(tài)變換的表示當(dāng)前讀到一個(gè)字符c時(shí),處理可描述為:#include enum IN = 1, OUT = 0;int main (void) int c, coun

32、t = 0, state = OUT; while (c = getchar() != EOF) if (c = | c = t | c = n) /如果是空白字符 state = OUT; /在詞外 else if (state = OUT) /如果碰到非空白字符 /且讀狀態(tài)為在詞外,則說明碰到新詞 state = IN; /將狀態(tài)修改為詞內(nèi) +count; /記數(shù) printf(word count: %dn, count); return 0;62例2:單詞計(jì)算問題英文正文文件可看成是字符序列,空白字符(空格 、制表符t、換行符n)把序列分隔為一個(gè)個(gè)“單詞”。要求寫程序統(tǒng)計(jì)文件中的單詞個(gè)

33、數(shù)。思考中文的詞可以用這種辦法找出來嗎?拓展學(xué)習(xí)學(xué)習(xí)中文分詞知識及算法638.4 程序測試和排錯(cuò)64分析問題編制程序編譯連接調(diào)試運(yùn)行完成調(diào)試中發(fā)現(xiàn)程序編寫有錯(cuò)誤,修改源程序編譯時(shí)發(fā)現(xiàn)程序有語法錯(cuò)誤,修改源程序連接時(shí)發(fā)現(xiàn)程序有錯(cuò)誤,修改源程序調(diào)試運(yùn)行時(shí)發(fā)現(xiàn)問題分析設(shè)計(jì)有錯(cuò)誤,重新分析問題程序開發(fā)過程658.4 程序的調(diào)試與排錯(cuò)寫好一個(gè)程序后,需要:通過加工(編譯和連接)產(chǎn)生可執(zhí)行程序運(yùn)行它,提供數(shù)據(jù)進(jìn)行試驗(yàn),確認(rèn)它確實(shí)滿足要求試驗(yàn)中常常會發(fā)現(xiàn)錯(cuò)誤,需要設(shè)法排除測試(testing):在完成一個(gè)程序或一部分程序,通過編譯后試驗(yàn)性運(yùn)行,仔細(xì)檢查運(yùn)行效果,設(shè)法確認(rèn)該程序確實(shí)完成了所期望的工作。反過來說

34、:測試就是設(shè)法用一些特別選出的數(shù)據(jù)去挖掘出程序里的錯(cuò)誤排錯(cuò)(debugging):在發(fā)現(xiàn)程序有錯(cuò)時(shí),設(shè)法確認(rèn)產(chǎn)生錯(cuò)誤的根源,修改程序,排除這些錯(cuò)誤的工作過程66測試的基本方法測試時(shí)考慮的基本問題是提供什么樣的數(shù)據(jù),才可能最大限度地把程序中的缺陷和錯(cuò)誤挖出來。有兩類確定測試數(shù)據(jù)的基本方式:根據(jù)程序結(jié)構(gòu)確定測試數(shù)據(jù)。這相當(dāng)于把程序打開,根據(jù)其內(nèi)部結(jié)構(gòu)考慮如何檢查它,設(shè)法發(fā)現(xiàn)其中的問題。這種方式稱為白箱測試根據(jù)程序所解決的問題去確定測試過程和數(shù)據(jù),不考慮程序內(nèi)部如何解決問題。這相當(dāng)于把程序看作解決問題的“黑箱”,因此稱為黑箱測試67白箱測試考察程序內(nèi)部結(jié)構(gòu)及由此產(chǎn)生的執(zhí)行流,選擇數(shù)據(jù)使程序在試驗(yàn)運(yùn)行中能通過“所有”可能出現(xiàn)的執(zhí)行流程 復(fù)合結(jié)構(gòu)只有一條執(zhí)行流“if (條件) 語句1 else語句2” 有兩條可能執(zhí)行流:條件成立時(shí)執(zhí)行語句1;不成立時(shí)執(zhí)行語句2。應(yīng)設(shè)法提供測試數(shù)據(jù),檢驗(yàn)程序在這兩種情況下都能正確工作從本質(zhì)上說“while (條件) 循環(huán)體”可能產(chǎn)生無窮多條執(zhí)行流:循環(huán)體不執(zhí)行,執(zhí)行1次,執(zhí)行2次,。無法窮盡檢查。常用方法是選擇測試數(shù)據(jù),檢查循環(huán)的一些典型情況,包括循環(huán)體執(zhí)行0次、1次、2次的情況,以及一些其他情況其他結(jié)構(gòu)可類似分析。要考慮程序中結(jié)構(gòu)嵌套產(chǎn)生的組合流程68黑箱測試考慮的不是程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論