c語言課件4.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第1頁
c語言課件4.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第2頁
c語言課件4.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第3頁
c語言課件4.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第4頁
c語言課件4.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、安徽工程科技學(xué)院4.2.1 while語句4.2.2 do-while語句4.2.3 for語句 4.2.4 轉(zhuǎn)移語句4.2.5 循環(huán)的嵌套4.2.6 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例 4.2 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)的概念 當(dāng)所要解決的問題存在重復(fù)執(zhí)行內(nèi)容時,應(yīng)該使用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn),具體的設(shè)計(jì)步驟可歸納如下。(1)構(gòu)造循環(huán)體。將問題中需要重復(fù)執(zhí)行的部分,利用C語言規(guī)則歸納出一組程序段。在歸納的過程中應(yīng)充分利用變量是一個變化的量的概念。如本列中變量score在不同的時刻代表的是不同學(xué)生的成績。 (2)尋找控制循環(huán)的變量。有的題目循環(huán)的次數(shù)是確定的,可以使用計(jì)數(shù)器來控制循環(huán);有的題目循環(huán)的次數(shù)不是確定的,那么使

2、用計(jì)數(shù)器就不合適了,設(shè)計(jì)者應(yīng)從題目中去尋找規(guī)則變化的量來控制循環(huán)體完成規(guī)定的次數(shù)。(3)找出控制變量的3個要素。 循環(huán)控制變量的初值。 循環(huán)的條件。 使循環(huán)趨于結(jié)束的部分。4.2.1 while語句while語句是實(shí)現(xiàn)當(dāng)型結(jié)構(gòu)循環(huán)的語句,其一般形式為while(邏輯量) 循環(huán)體語句 其中,while是C語言的關(guān)鍵字,語句中的邏輯量為循環(huán)條件。while語句的流程圖如圖4.2所示。 例4.3 求1到100的和。根據(jù)流程圖寫出程序:main() int i,sum; sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%dn,sum);圖4.3 例4.3的

3、N-S流程圖例4.4 求n!。main() float fac; int i,n; fac=1; i=2; scanf(%d,&n); while(i=n) fac=fac*i; i+; printf(n!=%.0fn,fac);圖4.4 例4.4的N-S流程圖4.2.2 do-while語句 do-while語句是實(shí)現(xiàn)直到型循環(huán)結(jié)構(gòu)的語句,其一般形式為: do 循環(huán)體語句while(邏輯量); do-while語句的流程圖如圖4.6所示。 例4.9 求兩個數(shù)的最大公約數(shù)。 (a)當(dāng)型結(jié)構(gòu) (b)直到型結(jié)構(gòu)圖4.8 例子的兩種結(jié)構(gòu)的N-S圖 根據(jù)流程圖可得到程序:main() main() i

4、nt m,n,r; int m,n,r; scanf(%d,%d,&m,&n); scanf(%d,%d,&m,&n); if(mn) if(mn) r=m;m=n;n=r; r=m,m=n,n=r; r=m%n; do while(r!=0) m=n; r=m%n; n=r; m=n; r=m%n; n=r; while(r!=0); printf(%dn,n); printf(%dn,m); 4.2.3 for語句 for語句是實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)的語句,for語句是語言所提供的功能更強(qiáng)、使用更廣泛的一種循環(huán)語句。其一般形式為: for(表達(dá)式1;表達(dá)式2(邏輯量);表達(dá)式3) 循環(huán)體語句;

5、表達(dá)式1通常用來給循環(huán)變量賦初值,一般是賦值表達(dá)式。也允許在for語句外給循環(huán)變量賦初值,此時可以省略該表達(dá)式。表達(dá)式2通常是循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是任意“確定的值”。表達(dá)式3通常是使循環(huán)趨于結(jié)束的部分,一般是賦值表達(dá)式。圖4.9 for 語句的傳統(tǒng)流程圖 圖4.10 for語句的N-S流程圖 Y N 表達(dá)式2 求解表達(dá)式1 循環(huán)體語句 循環(huán)的后續(xù)語句 求解表達(dá)式32 for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 循環(huán)體語句 求1到100的和。main() int i,sum; sum=0; for(i=1; i=100;i+) sum=sum+i; printf(%dn,s

6、um);使用for語句應(yīng)注意以下幾點(diǎn)。(1)for語句中的各表達(dá)式都可省略,但間隔符分號不能省略。例如:for(;邏輯量;表達(dá)式3) 省去了表達(dá)式1。for(表達(dá)式1;表達(dá)式3) 省去了表達(dá)式2。for(表達(dá)式1; 邏輯量;) 省去了表達(dá)式3。for(;) 省去了全部表達(dá)式。在循環(huán)變量已賦初值時,可省去表達(dá)式1。 main() int i,sum; sum=0; i=1; for(; i=100;i+) sum=sum+i; printf(%dn,sum);可省去表達(dá)式3,應(yīng)該在循環(huán)體部分增加使循環(huán)趨于結(jié)束部分。main() int i,sum; sum=0; for(i=1; i=100;)

7、 sum=sum+i; i+; printf(%dn,sum);省略表達(dá)式2 ,則循環(huán)條件一直為真,那么在循環(huán)體中應(yīng)有循環(huán)結(jié)束語句,否則是死循環(huán)。省略表達(dá)式1和表達(dá)式3,for語句相當(dāng)于while語句。main() int i,sum; sum=0; i=1; for(; i=100;) sum=sum+i; i+; printf(%dn,sum);(2)表達(dá)式1和表達(dá)式3可以是逗號表達(dá)式main() int i,sum; for(sum=0,i=1; i=100;i+) sum=sum+i; printf(%dn,sum);main() int i,sum; for(sum=0,i=1; i

8、=1000,則跳出循環(huán)。main() int n=1,s=0; for (;n=1000) break; printf(s=%dn, s);2. continue語句continue語句只能用在循環(huán)體中。 其一般格式是: continue; continue語句的功能是結(jié)束本次循環(huán),即不再執(zhí)行循環(huán)體中continue 語句之后的語句,轉(zhuǎn)入下一次循環(huán)執(zhí)行。應(yīng)注意的是,該語句只結(jié)束本層本次的循環(huán),并不跳出循環(huán)。 使用continue語句時,應(yīng)該清楚在不同的循環(huán)語句中下次循環(huán)的起點(diǎn)是什么。在while和do-while語句中,下次循環(huán)的起點(diǎn)是判斷邏輯量;在for語句中,下次循環(huán)的起點(diǎn)是計(jì)算表達(dá)式2的

9、值?!纠?.14】 輸出100以內(nèi)能被7整除的數(shù)。void main()int n;for(n=7;n0) fact *=n-; goto loop; printf(n!=%.0fn, fact);4.2.5 循環(huán)的嵌套 當(dāng)一個循環(huán)體內(nèi)又包含另一個循環(huán)結(jié)構(gòu)時,稱為循環(huán)的嵌套。被嵌入的循環(huán)又可以嵌套其他的循環(huán),這就是多重循環(huán)。 例4.20 分析以下循環(huán)內(nèi)外層循環(huán)控制變量的變化。main() int i,j; int mul; for(i=1;i10;i+) for(j=1;j=i;j+) mul=i*j; printf(%d*%d=%-4d,i,j,mul); printf(n); 程序運(yùn)行的結(jié)

10、果為:1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=267*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=8

11、1【例4.21】 利用公式 求的近似值,直到最后一項(xiàng)的絕對值小于10-6為止。對于循環(huán)次數(shù)未知的循環(huán)結(jié)構(gòu),一般不適合使用for語句實(shí)現(xiàn),可以采用while語句或do-while語句來實(shí)現(xiàn)。用while語句實(shí)現(xiàn)的程序源代碼如下:4.2.6 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例 +#includemain()int sign=1;float n=1,t=1,pi=0;while(fabs(t)1e-6)pi+=t;n+=2;sign*=-1;t=sign/n;pi*=4;printf(pi=%10.6fn,pi);例4.22 求ex1x +圖4.13 例4.22的N-S流程圖main() float x,fac,

12、ex,xn; int n; fac=1; ex=1; n=1; xn=1; scanf(%f,&x); do fac=fac*n; xn=xn*x; ex=ex+xn/fac; n+; while(xn/fac10e-6); printf(%fn,ex); 【例4.23】 輸出100以內(nèi)的素?cái)?shù)。所謂素?cái)?shù)是指只能被1和其本身整除的數(shù)。算法分析:我們先用窮舉法來對2100之間所有的數(shù)進(jìn)行判斷。在判斷一個數(shù)n是否是素?cái)?shù)時,我們對n用2n-1逐個去除,若某次可以整除則說明n不是素?cái)?shù),跳出該層循環(huán)。 如果在所有的數(shù)都是未除盡的情況下結(jié)束循環(huán),則為素?cái)?shù)。程序源代碼如下: main()int n,i;for

13、(n=2;n=100;n+)for(i=2;i=n) printf(t%d,n);對此算法作進(jìn)一步分析。實(shí)際上,2以上的所有偶數(shù)均不是素?cái)?shù),因此可以使循環(huán)變量的步長值改為2,即每次增加2,此外只需對數(shù)n用2n/2 或2去除就可判斷該數(shù)是否素?cái)?shù)。這樣將大大減少循環(huán)次數(shù),減少程序運(yùn)行時間。#includemath.hvoid main()int n,i,k;for(n=3;n=100;n+=2)k=sqrt(n);for(i=2;i=k) printf(t%3d,n);例4.24 求Fibonacci數(shù)列的前20項(xiàng)之和。分析:本例是一種“遞推”的題目。所謂“遞推”是指在前面一個(或幾個)結(jié)果的基礎(chǔ)

14、上推出下一個結(jié)果的方法。 圖4.14 例4.24的N-S流程圖 根據(jù)流程圖編寫程序:main() float sum,f1,f2,f3; int i; f1=1; f2=1;sum=f1+f2; for(i=3;i=20;i+) f3=f1+f2; sum+=f3; f1=f2; f2=f3; printf(%.0fn,sum);【例4.25】求解百雞百錢問題。公元錢五世紀(jì),我國古代數(shù)學(xué)家張丘建在算經(jīng)一書中提出了“百雞百錢”問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?算法分析:百雞百錢問題是典型的窮舉法問題。我們設(shè)x,y,z分別為買的雞翁,雞母,雞雛的個數(shù),則有x+y+z=1005*x+3*y+z/3=100而x,y可能取數(shù)的范圍為x:020y:033z可以由公式z=100-x-y計(jì)算出來。據(jù)

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論