第5章 循環(huán)結(jié)構(gòu)程序設(shè)計.ppt_第1頁
第5章 循環(huán)結(jié)構(gòu)程序設(shè)計.ppt_第2頁
第5章 循環(huán)結(jié)構(gòu)程序設(shè)計.ppt_第3頁
第5章 循環(huán)結(jié)構(gòu)程序設(shè)計.ppt_第4頁
第5章 循環(huán)結(jié)構(gòu)程序設(shè)計.ppt_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 循環(huán)結(jié)構(gòu)程序設(shè)計,Follow me!,循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。 特點:在給定條件成立時,反復(fù)執(zhí)行某程序段,直到條件不成立為止。 給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。,前測試,后測試,語言提供的循環(huán)語句: 1Goto語句與if語句構(gòu)成的循環(huán) 2while循環(huán) 3dowhile循環(huán) 4for循環(huán),1.語法:while(表達(dá)式)循環(huán)體語句 2.執(zhí)行過程:計算表達(dá)式的值,當(dāng)值為真(非0)時, 執(zhí)行循環(huán)體語句。 也叫前測試循環(huán)或當(dāng)型循環(huán)。,5.1 while循環(huán)語句,3. 注意 (1)如循環(huán)體中有多個語句,須用花括號括起。 (2)循環(huán)體中的語句須能使條件表達(dá)式由“真”

2、變“假”,否則循環(huán)為死循環(huán)。 (3)允許while語句的循環(huán)體又是while語句,即形成雙重循環(huán)。,練習(xí): 選擇下列程序的運行結(jié)果: #include void main() int n=4; while (n- -) printf(“%d”,- -n); A)2 0B)3 1 C)3 2 1 D)2 1 0,#include void main() int i, sum; sum=0; i = 1; while (i=100) sum+=i; i+; printf(“n%d”, sum); ,計算1100之間數(shù)的累加和,循環(huán)條件,內(nèi)復(fù)合語句構(gòu)成循環(huán)體,【例5.1】,#include void

3、 main() int i, sum; sum=1; i = 1; while (i=6) sum*=i; i+; printf(“n%d”, sum); ,求6!,設(shè)置循環(huán)初始條件,#include void main() int i=1,n, sum=1; scanf(“%d”, ,注意sum的數(shù)據(jù)類型! float sum=1.0;,【例5.2】,求n!,1.語法: do 循環(huán)體語句 while(表達(dá)式); 2.執(zhí)行過程:先執(zhí)行循環(huán)體語句一次, 再判別表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)。 也叫后測試循環(huán)或直到型循環(huán)。,. do-while循環(huán)語句,3. 注意:在if語句、

4、while語句中, 表達(dá)式后面都不能加分號, 而在 do-while語句的表達(dá)式后面則必須加分號。,main() int i=2,sum=0; while(i=100) sum+=i; i=i+2; printf(“%dn”,sum); ,main() int i=2,sum=0; do sum+=i; i=i+2; while(i=100); printf(“%dn”,sum);,無論條件滿足否,都先執(zhí)行一次循環(huán)體,【例5.3】,求1100的偶數(shù)和,【例5.4】計算x的值,使1+4+7+10+13+x的和小于200,求出最大的x。 程序如下: #include stdio.h main()

5、int x=1,sum=1; do x=x+3; sum+=x; while(sum=200); printf(x=%d ,x-3); ,運行結(jié)果:x=34,注意:循環(huán)體中要有使 循環(huán)趨于結(jié)束的語句, 否則會導(dǎo)致死循環(huán)。,求任意個數(shù)的和 #include void main() int i, sum=0,n,x; i = 1; scanf(“%d”,求1100內(nèi)能被5整除的整數(shù)的個數(shù)。 #include void main() int i, count=0; i = 1; while (i=100) if (i%5=0) count+; i+; printf(“n%d”, count); ,2

6、.執(zhí)行過程: (1)計算表達(dá)式1的值。 (2)計算表達(dá)式2的值,若值為真(非0),則執(zhí)行循環(huán)體一次, 否則跳出循環(huán)。 (3)計算表達(dá)式3的值,轉(zhuǎn)回第2步重復(fù)執(zhí)行。 在整個for循環(huán)過程中,表達(dá)式1只計算一次,表達(dá)式2和表達(dá)式3則可能計算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。,. for循環(huán)語句,1.語法:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語句,說明: (1)最簡單的應(yīng)用形式: for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 例如:for(i=1;i=10;i+) sum=sum+i; (2)三個表達(dá)式均可缺省,但起分隔作用的兩個分號不可省略。 例如:for( ; ; ) i

7、=1;for(;i=10;i+) sum=sum+i; 或 for(i=1;i=10;) sum=sum+i;i+; 表達(dá)式1省略,應(yīng)在for之前對循環(huán)變量賦初值 表達(dá)式2省略,則不判斷條件,循環(huán)無終止進(jìn)行下去 表達(dá)式3省略,則應(yīng)另設(shè)法保證循環(huán)的結(jié)束 (3)表達(dá)式1和表達(dá)式3可為逗號表達(dá)式 例如:for(i=1,j=10;i=j;i+,j-) k=i+j;,練習(xí):閱讀程序,寫出運行結(jié)果。 #include void main() int i; for (i=4;i=10;i+) if (i%3=0) printf(“%d”,i); ,運行結(jié)果:69,練習(xí):閱讀程序,選擇正確答案。 #inclu

8、de void main() int i=0,j=0,k=0,m=4; for (m=0;m4;m+) switch (m) case 0:i=m+; case 1:j=m+; case 2:k=m+; case 3:m+; printf(“n%d,%d,%d,%d”,i,j,k,m); A)0,0,2,4B)0,1,2,3 C)0,1,2,4D.)0,1,2,5,盡量不要循環(huán)體中改變循環(huán)變量的值!,求和s=1-1/2+1/3-1/4+1/n,n由鍵盤輸入。,void main( ) int i , t=1; double s=0; scanf(“%d”, ,級數(shù)各項正負(fù)號的解決方法: 設(shè)置變

9、量t,使其初值為1,然后反復(fù)執(zhí)行語句t=-t,則t的值在1和-1之間交替變化。,【例5.5】,#include void main() long int f1, f2; int i; f1=1; f2=1; for ( i=1; i=20; i+) printf(%12ld %12ld ,f1,f2); if (i%2=0) printf(n); f1=f2+f1; f2=f1+f2; ,說明: (1)i每取一個值打兩個數(shù),220=40; (2)每打兩個數(shù)換行。,求Fibonacci數(shù)列的前40個數(shù)。 F1=1(n=1) F2=1(n=2) F3=1+1=2 F4=1+2=3 Fn=Fn-1+

10、Fn-2 (n=3),【例5.6】,. 循環(huán)的嵌套 一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),叫循環(huán)的嵌套。不同語句構(gòu)成的循環(huán)也可以相互嵌套。見書P88。 (1)while ( ) . while ( ) . ,(2)for (; ;) . while ( ) . ,for 語句的循環(huán)體還可為另一個循環(huán)語句。例如:,for(i=1;i=2;i+) for(j=1;j=2;j+) printf(“%3d”,i+j); printf(“n”); 輸出: 2 3 3 4,for(i=1;i=2;i+) for(j=1;j=2;j+) printf(“%3d”,i+j); printf(“n”); 輸出

11、: 2 3 3 4,【例5.7】全班有20個學(xué)生,每個學(xué)生考5門課程,要求分別統(tǒng)計出每個學(xué)生各門課的平均成績。,#include stdio.h main( int i,j,score,sum; float aver; j=1; while(j=20) sum=0; for(i=1;i=5;i+) printf(Enter No.%d the score %d:,j,i); /*提示:輸入j號學(xué)生的i門課成績*/ scanf(%d, ,【例5.8】在15中取出3個互不相同的整型數(shù),輸出其和能被4整除的個數(shù)。,#include stdio.h void main() int i,j,k,n=0;

12、 for(i=1;i=5;i+) for(j=i+1;j=5;j+) for(k=j+1;k=5;k+) if(i!=j ,幾種循環(huán)的比較 1. 不提倡使用goto循環(huán)。 2.for循環(huán)比while、do-while循環(huán)功能更強(qiáng)。 3.while、do-while語句中,循環(huán)變量初始化應(yīng)在循環(huán)語句之前完成。for循環(huán)可以在其中完成。 4.while、do-while和for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)。而goto和if構(gòu)成的循環(huán)不能。,. 循環(huán)的退出 (break語句和continue語句) break語句:強(qiáng)制結(jié)束循環(huán),轉(zhuǎn)向循環(huán)語句下面的語句。 br

13、eak可以跳出switch結(jié)構(gòu),還可以跳出最近的一層循環(huán)。 for (r=1; r100) break; printf(“%f”, area); 注意:break語句只能用于循環(huán)語句和switch語句。,continue語句 對于for循環(huán),跳過循環(huán)體其余語句,轉(zhuǎn)向循環(huán)變量增量表達(dá)式的計算;對于while和do-while循環(huán),跳過循環(huán)體其余語句,轉(zhuǎn)向循環(huán)繼續(xù)條件的判定語句。 continue和break的區(qū)別:continue只結(jié)束本次循環(huán),而不是終止整個循環(huán);break是結(jié)束本層循環(huán),不再進(jìn)行條件判斷。 while (表達(dá)式 1) . if (表達(dá)式 2) break; . ,while

14、(表達(dá)式1) . if (表達(dá)式 2) continue; . ,練習(xí):閱讀程序,寫出運行結(jié)果。 #include main() int i; for (i=4;i=10;i+) if (i%3=0) continue; printf(“%d”,i); A)45B.)457810 C)69D)678910,【例5.9】在200以內(nèi)的正整數(shù)中,找出既是15的倍數(shù)又是7的倍數(shù)的最大值。 程序如下: #include stdio.h main() int i; for(i=200;i=0;i-) if(i%15=0 ,運行結(jié)果:the result is i=105,注意:等于號“=”和 賦值號“=

15、”的區(qū)別。,【例5.10】找出100200之間第一個能被16整除的數(shù) 程序如下: #include stdio.h main() int i=100; while(i=200) if(i%16=0) /*判斷該數(shù)是否能被16整除*/ printf(%d ,i); break; else i+; ,運行結(jié)果:112,【例5.11】輸入5個學(xué)生的百分制成績,分別輸出其對應(yīng)的等級(90100為A,8970為B,6960為C,低于60為D)。 程序如下: #include stdio.h void main() int a,i=1; char y; while(i=5) scanf(%d, ,運行結(jié)果

16、: 72 y=B,【例5.12 】輸入10個整數(shù),輸出其中負(fù)數(shù)的個數(shù)及所有負(fù)數(shù)的和#include stdio.h main() int i,sum=0,num=0,x; printf(input 10 numbers:); for(i=0;i=0) continue; sum+=x; num+; if(num) printf(num=%d,sum=%d,num,sum); else printf(num is 0); ,程序運行結(jié)果: input 10numbers:-313-1-46-790-14 num=5,sum=-29,. 用goto語句構(gòu)成的循環(huán),1. goto語句(無條件轉(zhuǎn)向語句

17、) 格式:goto 語句標(biāo)號; 例: gotolabel1; 說明(1)goto語句使程序的執(zhí)行方向轉(zhuǎn)到語句標(biāo)號所在的語句。 (2)語句標(biāo)號的命名規(guī)則同變量 2.goto語句的用途 (1)與if構(gòu)成循環(huán); (2)從循環(huán)體內(nèi)跳出; 注意:使用goto語句跳轉(zhuǎn)不符合結(jié)構(gòu)化的編程思想,應(yīng)盡量限制使用。,#include void main() int x; scanf(“%d”, ,求和的一般方法: 設(shè)置存放和的變量sum,初始置0; 輸入要加的數(shù)x; Sum=sum+x; 是否繼續(xù)?是,轉(zhuǎn);否,轉(zhuǎn) 打印sum 求積的一般方法: 設(shè)置存放和的變量sum,初始置1; 輸入要加的數(shù)x; Sum=sum*

18、x; 是否繼續(xù)?是,轉(zhuǎn);否,轉(zhuǎn) 打印sum,例:用if和goto求 #include void main() int i,sum=0; i=1; loop:if(i=100) sum=sum+i; i+; goto loop; printf(“n%dn”,sum);,例1: 公式求pi的近似值,直到最后一項的絕對值小于10-6為止。 #include #include void main() int s; float n, t, pi; t=1; pi=0; n=1.0;s=1;,while (fabs(t)=1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4

19、; printf(pi=%10.6fn,pi); ,. 循環(huán)結(jié)構(gòu)程序設(shè)計舉例,例2:求一批數(shù)中負(fù)數(shù)的個數(shù)。 #include void main() int i=1, num,count=0; printf(以數(shù)據(jù)10000結(jié)束錄入n); printf(“請輸入第%d數(shù):”,i); scanf(“%d”, ,終止標(biāo)志,例3:譯碼。字母轉(zhuǎn)換為其后第4個字母,非字母不變。 #include void main() char c; while (c=getchar()!=n) if (c=a ,按回車停止譯碼,如果是后四個字母,例4:求100200之間全部素數(shù)。 判斷m是否素數(shù)的規(guī)則是:m不能被2到

20、根號2之間所有整數(shù)整除。 #include #include void main() int m,k,i,n=0; for (m=101;m=200;m=m+2) k=sqrt(m);,for (i=2;i=k+1) printf(“%d”,m);n=n+1; if (n%10=0)printf(“n”); printf(“n”); ,例5:求10個數(shù)中的最大數(shù)。 #include void main() int i=1,x, max; scanf(“%d”, ,輸入第一個數(shù),第一個數(shù)送max,依次輸入第二到第10個數(shù),每輸入一個數(shù),與max比較,使max中始終存放兩者中大的數(shù),例6:百馬百瓦

21、問題。有100匹馬,馱100塊瓦,大馬馱3塊,小馬馱2塊,兩個馬駒馱1塊。問大馬、小馬、馬駒各多少?編程列出所有可能的馱瓦方案。 分析:設(shè)大馬、小馬、馬駒各為x、y、z只,根據(jù)題目要求,可以用下列方程表示: x+y+z100 3x+2y+z/2100 這是一個不定方程,未知數(shù)多于方程數(shù),此題有若干個解。要解此不定方程應(yīng)先固定一個變量的值,然后求其他兩個值。即對其余兩個變量的各可能值一一測定,看它是否滿足方程。顯然這是一個窮舉問題。利用窮舉法,只要將各種可能的組合一一測試,將符合條件的組合輸出即可。,程序如下: #include stdio.h main() int x,y,z; for(z=9

22、8; z=2;z=z-2) for(y=50; y=1; y-) for(x=0; x=33; x+) if(z+x+y=100 ,例7:小猴吃桃問題。有一天小猴摘下了若干個桃子,當(dāng)即吃掉一半,還不過癮,又多吃了一個;第二天接著吃了剩下的桃子的一半后又多吃一個;以后每天都吃尚存桃子的一半零一個,到第10天早上要吃時只剩下一個了。問小猴第一天共摘下了多少個挑子? 分析:這是一個“遞推”問題,先從最后一天推出倒數(shù)第二天的桃子,再從倒數(shù)第二天的桃子推出倒數(shù)第三天的桃子 。 設(shè)第n天的桃子為x,它是n-1天的桃子數(shù)的一半減l個,即: xn=xn-1-1 那么n-1天的桃子數(shù)為: xn-1=(xn+1)2 (遞推公式) 已知第10天的桃子數(shù)x10為1,根據(jù)遞推公式可得第9天的桃子數(shù)x9為4,。,程序如下: #include stdio.h main() int i,x; x=1; /*第10天的桃子數(shù)*/ for(i=9; i=1;i-) x=(x+1)*2 ; printf( i=%2d,x=%dn,i,x); /*第i天的桃子數(shù)為x只*/ ,#include void main() int i, j; for (i=

溫馨提示

  • 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

提交評論