C語(yǔ)言程序設(shè)計(jì)教程第4章.ppt_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程第4章.ppt_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程第4章.ppt_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程第4章.ppt_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程第4章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章 循環(huán)結(jié)構(gòu),4.1 當(dāng)型循環(huán)與直到型循環(huán) 4.2 for 循 環(huán) 4.3 循環(huán)的嵌套與其他有關(guān)語(yǔ)句 4.4 程序舉例,4.1 當(dāng)型循環(huán)與直到型循環(huán),4.1.1 當(dāng)型循環(huán)結(jié)構(gòu) 當(dāng)型循環(huán)結(jié)構(gòu)的流程圖如圖4.1所示。,圖4.1 當(dāng)型循環(huán)結(jié)構(gòu)流程圖,返回目錄,在圖4.1中,條件在程序中一般是一個(gè)邏輯表達(dá)式,條件滿足是指邏輯表達(dá)式的值為真。循環(huán)體可以是單個(gè)語(yǔ)句,也可以是由若干可執(zhí)行語(yǔ)句組成的復(fù)合語(yǔ)句,它們是需要重復(fù)執(zhí)行的操作。 當(dāng)型循環(huán)的執(zhí)行過(guò)程是:當(dāng)條件滿足(即邏輯表達(dá)式的值為真)時(shí),執(zhí)行循環(huán)體中所包括的操作,當(dāng)循環(huán)體執(zhí)行完后,將再次判斷條件,直到條件不滿足(即邏輯表達(dá)式的值為假)為止,從而退出循環(huán)結(jié)構(gòu)。,實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)的C語(yǔ)句形式為 while (表達(dá)式) 循環(huán)體語(yǔ)句 功能:當(dāng)表達(dá)式值0時(shí),執(zhí)行循環(huán)體,執(zhí)行完后繼續(xù)判斷表達(dá)式值,只有當(dāng)表達(dá)式值0時(shí)才退出循環(huán)。,例4.2 從鍵盤輸入各學(xué)生成績(jī),并對(duì)90分以上(包括90分)的學(xué)生人數(shù)進(jìn)行計(jì)數(shù),直到輸入的成績(jī)?yōu)樨?fù)為止,最后輸出成績(jī)?cè)?0分以上的學(xué)生人數(shù)。,圖4.3 例4.2的流程圖,其流程圖如圖4.3所示。其中變量count為整型,用于對(duì)90分以上的學(xué)生人數(shù)進(jìn)行計(jì)數(shù)。,相應(yīng)的C程序如下: #include “stdio.h“ main() int count; float grade; count0; scanf(“%f“,&grade); while (grade0.0) if (grade90.0) countcount1; scanf(“%f“,&grade); printf(“count%dn“,count); ,4.1.2 直到型循環(huán)結(jié)構(gòu) 直到型循環(huán)結(jié)構(gòu)的流程圖如圖4.4所示。,圖4.4 直到型循環(huán)結(jié)構(gòu)流程圖,直到型循環(huán)的執(zhí)行過(guò)程是,首先執(zhí)行循環(huán)體,然后判斷條件(即計(jì)算邏輯表達(dá)式),如果條件滿足(即邏輯表達(dá)式值為真),則退出循環(huán)結(jié)構(gòu);如果條件不滿足(即邏輯表達(dá)式值為假),則繼續(xù)執(zhí)行循環(huán)體。 實(shí)現(xiàn)直到型循環(huán)結(jié)構(gòu)的C語(yǔ)句形式為 do 循環(huán)體語(yǔ)句 while(表達(dá)式); 功能:先執(zhí)行循環(huán)體,然后判斷表達(dá)式值,若表達(dá)式值0,則再次執(zhí)行循環(huán)體,如此循環(huán),直到表達(dá)式值0為止。,例4.3 計(jì)算并輸出下列級(jí)數(shù)和:,直到某項(xiàng)的絕對(duì)值小于 為止。,相應(yīng)的流程圖如圖4.5所示。其中f用于改變每一項(xiàng)的符號(hào),因?yàn)檫@是一個(gè)各項(xiàng)符號(hào)相間的級(jí)數(shù)。,圖4.5 例4.3的流程圖,相應(yīng)的C程序如下: #include “stdio.h“ main() int k; double sum,d,f; sum1.0; k1;f1.0; do kk1;ff;d1.0/(k*(k1);sumsumf*d; while(d1.0e4); printf(“sum%lfn“,sum); ,4.1.3 當(dāng)型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)的區(qū)別與聯(lián)系 當(dāng)型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)既有共同之處,又有區(qū)別。主要體現(xiàn)在以下幾個(gè)方面。 (1)在當(dāng)型循環(huán)中,其循環(huán)體可以一次也不執(zhí)行(即執(zhí)行當(dāng)型循環(huán)結(jié)構(gòu)的一開始,其條件就不滿足)。 (2)不管是當(dāng)型循環(huán)結(jié)構(gòu)還是直到型循環(huán)結(jié)構(gòu),在循環(huán)體內(nèi)部必須要有能改變條件(即邏輯表達(dá)式值)的語(yǔ)句,否則將造成死循環(huán)。 (3)對(duì)于有些問(wèn)題既可以用當(dāng)型循環(huán)結(jié)構(gòu)來(lái)處理,也可以用直到型循環(huán)結(jié)構(gòu)來(lái)處理。 (4)不管是當(dāng)型循環(huán)結(jié)構(gòu)還是直到型循環(huán)結(jié)構(gòu),其循環(huán)體如果包含一個(gè)以上的語(yǔ)句,應(yīng)以復(fù)合語(yǔ)句形式出現(xiàn)。,4.2 for 循 環(huán),C語(yǔ)言提供的for循環(huán)屬于當(dāng)型循環(huán)結(jié)構(gòu),其一般形式為 for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 循環(huán)體語(yǔ)句(組) 它等價(jià)于下列的當(dāng)型循環(huán)結(jié)構(gòu): 表達(dá)式1; while(表達(dá)式2) 循環(huán)體語(yǔ)句 表達(dá)式3; ,返回目錄,下面對(duì)for循環(huán)語(yǔ)句作幾點(diǎn)說(shuō)明: (1)在for語(yǔ)句中,三個(gè)表達(dá)式中的任何一個(gè)表達(dá)式均可省略,但其中的兩個(gè)“;”不能省略。 (2)下列兩個(gè)循環(huán)都是死循環(huán): for(表達(dá)式1;表達(dá)式3) 循環(huán)體 與 for(;) 循環(huán)體 因?yàn)樗鼈兌紱]有用于判斷循環(huán)是否結(jié)束的條件(即表達(dá)式2)。 (3)for循環(huán)本質(zhì)上也是當(dāng)型循環(huán)結(jié)構(gòu),只不過(guò)它對(duì)于事先可以確定循環(huán)次數(shù)的問(wèn)題特別方便。 (4)在for循環(huán)中,循環(huán)體也可以是復(fù)合語(yǔ)句(即用一對(duì)花括號(hào) 括起來(lái)的語(yǔ)句組)。,4.3 循環(huán)的嵌套與其他有關(guān)語(yǔ)句,4.3.1 循環(huán)的嵌套 所謂循環(huán)的嵌套是指一個(gè)循環(huán)體內(nèi)又包含了另一個(gè)完整的循環(huán)結(jié)構(gòu)。C語(yǔ)言允許循環(huán)結(jié)構(gòu)嵌套多層。循環(huán)的嵌套結(jié)構(gòu)又稱為多重循環(huán)。,返回目錄,例4.6 計(jì)算并輸出10以內(nèi)(包括10)所有自然數(shù)的階乘值。即計(jì)算1!,2!,3!,4!,5!,6!,7!,8!,9!,10!。,采用的方法是,對(duì)于10以內(nèi)的每一個(gè)自然數(shù)分別求它們的階乘值。其流程圖如圖4.7所示。顯然,這是一個(gè)二重循環(huán)結(jié)構(gòu)。,圖4.7 例4.6的流程圖,相應(yīng)的C程序如下: #include “stdio.h“ main() int n,k; double s; for (n1; n10; nn1) s1.0; for (k1; kn; kk1) ss*k; printf(“%2d!%16.7fn “,n,s); ,4.3.2 break 語(yǔ)句 C語(yǔ)言中的break語(yǔ)句有以下兩個(gè)功能: (1)跳出 switch 結(jié)構(gòu); (2)退出當(dāng)前循環(huán)結(jié)構(gòu),包括 while 結(jié)構(gòu)、 dowhile 結(jié)構(gòu)和for循環(huán)結(jié)構(gòu)。,4.3.3 continue 語(yǔ)句 continue語(yǔ)句的功能是結(jié)束本次循環(huán)的執(zhí)行,但不退出循環(huán)結(jié)構(gòu)。 下面舉兩個(gè)例子來(lái)說(shuō)明continue語(yǔ)句的使用。,例4.10 輸出100200之間所有能被7或9整除的自然數(shù)。 相應(yīng)的C程序如下: #include “stdio.h“ main() int n; for (n100; n200; nn1) if (n%7!0)&(n%9!0) continue; /*結(jié)束本次循環(huán),繼續(xù)進(jìn)行下次循環(huán)*/ printf(“%d n“,n); ,實(shí)際上,上述程序等價(jià)于 #include “stdio.h“ main() int n; for (n100; n200; nn1) if (n%70) | | (n%90) printf(“%d n“,n); ,4.4 程序舉例,4.4.1 列舉算法 所謂列舉算法,是指根據(jù)提出的問(wèn)題,列舉所有可能的情況,并根據(jù)條件檢驗(yàn)?zāi)男┦切枰?,哪些是不需要的?返回目錄,例4.11 某單位要在A,B,C,D,E,F(xiàn) 6人中選派若干人去執(zhí)行一項(xiàng)任務(wù),選人的條件如下: (1)若C不去,則B也不去; (2)C和D兩人中去一個(gè); (3)D和E要么都去,要么都不去; (4)A,B,F(xiàn) 3人中要去兩個(gè); (5)C和F不能一起去: (6)E和F兩人中至少去一個(gè)。 問(wèn)應(yīng)該選哪幾個(gè)人去?,C程序如下: #include “stdio.h“ main() int a,b,c,d,e,f; for (a0; a1; a) for (b0; b1; b) for (c0; c1; c) for (d0; d1; d) for (e0; e1; e) for (f0; f1; f),if (bc0 | | c1) & (cd1) & (de0 | | de2) & (abf2) & (cf!2) & (ef1) printf(“A will %s be assigned.n“,a?“: “not“); printf(“B will %s be assigned.n“,b?“: “not“); printf(“C will %s be assigned.n“,c?“: “not“); printf(“D will %s be assigned.n“,d?“: “not“); printf(“E will %s be assigned.n“,e?“: “not“); printf(“F will %s be assigned.n“,f?“: “not“); ,4.4.2 密碼問(wèn)題 在報(bào)文通信中,為使報(bào)文保密,發(fā)報(bào)人往往要按一定規(guī)律將其加密,收?qǐng)?bào)人再按約定的規(guī)律將其解密(即將其譯回原文)。,例4.13 從鍵盤輸入一行字符,將其中的英文字母進(jìn)行加密輸出(非英文字母不用加密)。 C程序如下: #include “stdio.h“ main() char c; int k; printf(“input k:“); scanf(“%d“,&k); scanf(“%c“,&c); /*吃掉上次輸入的回車符*/ cgetchar(); while(c!n) if (ca & cz) | | (cA & cZ) cck; if (cz | | (cZ & cZk) cc26; printf(“%c“,c); cgetchar(); ,4.4.3 對(duì)分法求方程實(shí)根 設(shè)非線性方程為 f (x)0 用對(duì)分法求在區(qū)間a,b上的實(shí)根。 具體方法如下: 從區(qū)間端點(diǎn)x0a出發(fā),以h為步長(zhǎng),逐步往后進(jìn)行掃描。 對(duì)于每一個(gè)被掃描的子區(qū)間xi,xi1(其中xi1xih)作如下處理: 若在子區(qū)間兩個(gè)端點(diǎn)上的函數(shù)值f (xi)與f (xi1)同號(hào),則說(shuō)明在該子區(qū)間上沒有實(shí)根,將掃描下一個(gè)子區(qū)間;否則說(shuō)明在該子區(qū)間上至少有一個(gè)實(shí)根。此時(shí)就可以在該子區(qū)間上采用對(duì)分法進(jìn)一步搜索實(shí)根。,對(duì)分法的基本過(guò)程如下: 取子區(qū)間xi,xi1的中點(diǎn) 如果f(x)與f(xi)同號(hào),則令xix;否則令xi1x。 然后重復(fù)這個(gè)過(guò)程,直到滿足條件 為止。其中為事先給定的精度要求。,圖4.9 對(duì)分法求方程實(shí)根的流程圖,對(duì)分法求方程實(shí)根的流程圖如圖4.9所示。,例4.15 用對(duì)分法求方程 f (x)x26x10 在區(qū)間10,10上的實(shí)根,即A10,B10。取掃描步長(zhǎng)H0.1,精度要求 。,相應(yīng)的C程序如下: #include “stdio.h“ main() int flag; double a10.0,b10.0,h0.1,x1,y1,x2,y2,x,y; x1a;y1x1*x16*x11.0; x2x1h;y2x2*x26*x21.0; while (x1b) if (y1*y20.0) x1x2;y1y2;x2x1h;y2x2*x26*x21.0; else flag0; while (flag0) x(x1x2)/2; if (fabs(x2x1)0.000001) printf(“x%11.7fn“,x); x1x0.5*h;y1x1*x16*x11.0; x2x1h;y2x2*x26*x21.0; flag1; ,else yx*x6*x1.0; if (y1*y0.0) x2x;y2y; else x1x;y1y; ,4.4.4 迭代法求方程實(shí)根 設(shè)非線性方程為 f (x)0 用迭代法求一個(gè)實(shí)根的基本方法如下: 首先將方程 f (x)0 改寫成便于迭代的格式 x(x) 然后初步估計(jì)方程實(shí)根的一個(gè)初值x0,作如下迭代: ,n0,1,2, 直到滿足條件 | | 或者迭代了足夠多的次數(shù)還不滿足這個(gè)條件為止。其中為事先給定的精度要求。,反映上述過(guò)程的流程圖如圖4.10所示。,圖4.10 迭代法求方程實(shí)根流程圖,例4.16 求非線性方程x1arctanx0 的一個(gè)實(shí)根。取初值x01.0,精度要求0.000001。并改寫成如下迭代格式:,相應(yīng)的C程序如下: #include “stdio.h“ #include “math.h“ main() int m; double x1.0,eps0.000001,x0; printf(“input m:“); scanf(“%d“,&m); /*輸入最大迭代次數(shù)*/ do x0x;x1.0atan(x0);mm1; while (m!0)&(fabs(xx0)eps); if (m0) printf(“FAIL!n “); else printf(“x%11.fn“,x); ,4.4.5 牛頓法求方程實(shí)根 設(shè)非線性方程為 f (x)0 在選取一個(gè)初值x0后,牛頓迭代格式為 實(shí)際上牛頓迭代格式是一種特殊的簡(jiǎn)單迭代格式,相當(dāng)于 上述迭代過(guò)程一直進(jìn)行到滿足條件 | | 或者迭代了足夠多的次數(shù)還不滿足這個(gè)條件為止。其中為事先給定的精度要求。,反映上述過(guò)程的流程圖如圖4.11所示。,圖4.11 牛頓法求方程實(shí)根流程圖,例4.17 求非線性方程x1cosx0的一個(gè)實(shí)根。取初值x01.0,精度要求0.000001。其牛頓迭代格式為 其中f (xn)xn1cos xn,f (xn)1sin xn。,相應(yīng)的C程序如下: #include “stdio.h“ #include “math.h“ main() int m; double x1.0,eps0.000001,x0; printf(“input m:“); scanf(“%d“,&m); /*輸入最大迭代次數(shù)*/ do x0x;xx0(x01cos(x0)/(1.0sin(x0);mm1; while (m!0)&(fabs(xx0)eps); if (m0) printf(“FAIL!n “); else printf(“x%11.fn“,x); ,4.4.6 梯形法求定積分 設(shè)定積分為 由微積分的知識(shí)可以知道,該積分值的幾何意義是在區(qū)間a,b內(nèi)的曲線f (x)下的面積,如圖4.12所示。,圖4.12 定積分幾何意義,梯形法求定積分的基本思想是: 首先將積分區(qū)間a,bn等分,得到n個(gè)子區(qū)間xi, xi1(i0,1,2,n1),每一個(gè)子區(qū)間的長(zhǎng)度為h(ba)/n,如圖4.12所示,其中xiaih。 然后在每一個(gè)子區(qū)間上用梯形的面積 來(lái)近似代替該子區(qū)間上小長(zhǎng)條的面積。 最后將所有小長(zhǎng)條的面積近似值Si累加就可得到積分值的近似值。即 S

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論