第6章循環(huán)結(jié)程序設(shè)計(jì)_第1頁(yè)
第6章循環(huán)結(jié)程序設(shè)計(jì)_第2頁(yè)
第6章循環(huán)結(jié)程序設(shè)計(jì)_第3頁(yè)
第6章循環(huán)結(jié)程序設(shè)計(jì)_第4頁(yè)
第6章循環(huán)結(jié)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(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)介

1、第第6章章 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)l循環(huán)結(jié)構(gòu)可以完成重復(fù)性、規(guī)律性的操作.在人們所需處理的運(yùn)算任務(wù)中,常常需要用到循環(huán),例如:1100的累加和等。在語(yǔ)言中有三種循環(huán)語(yǔ)句:while、dowhile、for。用goto語(yǔ)句和if語(yǔ)句也能構(gòu)成循環(huán)。l6.1 goto6.1 goto語(yǔ)句語(yǔ)句lgoto語(yǔ)句 為無(wú)條件轉(zhuǎn)向語(yǔ)句。l格式:格式:goto goto ;l功能:功能:程序執(zhí)行到goto語(yǔ)句時(shí),轉(zhuǎn)到語(yǔ)句標(biāo)號(hào)指定的語(yǔ)句去執(zhí)行。l說(shuō)明:(1)語(yǔ)句標(biāo)號(hào)必須用標(biāo)識(shí)符表示,不能整數(shù)作為標(biāo)號(hào)。(2)與if語(yǔ)句一起構(gòu)成循環(huán)結(jié)構(gòu)。l例題例題6.1 求s=1+2+3+100lmain()l int i=

2、1,s=0;lloop: if(i=100) /* loop是一個(gè)語(yǔ)句標(biāo)號(hào)*/l s=s+i;li+;lgoto loop;llprintf(“s=%dn”,s);l6.2 for語(yǔ)句語(yǔ)句l注意注意:結(jié)構(gòu)化程序設(shè)計(jì)方法,主張限制使用goto語(yǔ)句。因?yàn)闉E用goto語(yǔ)句,將會(huì)導(dǎo)致程序結(jié)構(gòu)無(wú)規(guī)律、可讀性差。l6.2 for語(yǔ)句語(yǔ)句l1for語(yǔ)句的一般格式語(yǔ)句的一般格式l for(變量賦初值;循環(huán)繼續(xù)條件;循環(huán)變量增值)l 循環(huán)體語(yǔ)句組;2for語(yǔ)句的執(zhí)行過(guò)程語(yǔ)句的執(zhí)行過(guò)程(1)求解“變量賦初值”表達(dá)式。(2)求解“循環(huán)繼續(xù)條件”表達(dá)式。如果其值非0,執(zhí)(3) ;否則,轉(zhuǎn)至(5)。(3)執(zhí)行循環(huán)體語(yǔ)句

3、組,(4)求解“循環(huán)變量增值”表達(dá)式,然后轉(zhuǎn)向(2)。(5)執(zhí)行for語(yǔ)句的下一條語(yǔ)句。l例如:for (n=1;n=20;n+)ls=s+n; for語(yǔ)句執(zhí)行過(guò)程圖3說(shuō)明說(shuō)明l(1)“變量賦初值”、“循環(huán)繼續(xù)條件”和“循環(huán)變量增值”部分均可缺省,甚至全部缺省,但其間的分號(hào)不能省略。l i=1;lfor(;i=100;i+)ls=s+i; for中缺省變量賦初值,但是在for前面要有i=1;lfor(i=1; ;i+)l s=s+i;l for中缺省“循環(huán)繼續(xù)條件”,相當(dāng)于條件永遠(yuǎn)為真,無(wú)限循環(huán)。lfor( ; ; ) 語(yǔ)句;l全部缺省即不設(shè)初值,不判斷條件,循環(huán)變量不增值。無(wú)終止地執(zhí)行循環(huán)體

4、。 3說(shuō)明說(shuō)明l(2)當(dāng)循環(huán)體語(yǔ)句組僅由一條語(yǔ)句構(gòu)成時(shí),可以不使用 號(hào)括,但是當(dāng)循環(huán)體語(yǔ)句組由多條語(yǔ)句構(gòu)成時(shí)必須用 號(hào)括起來(lái)。l(3)“循環(huán)變量賦初值”表達(dá)式,既可以是給循環(huán)變量賦初值的賦值表達(dá)式,也可以是與此無(wú)關(guān)的其它表達(dá)式(如逗號(hào)表達(dá)式)。l例如: for(sum=0,i=1;i=100;i+) sum += i;l(4)“循環(huán)繼續(xù)條件”部分是一個(gè)邏輯量,除一般的關(guān)系表達(dá)式(如 n=20)或邏輯表達(dá)式(ab&xy)外,也允許是數(shù)值(或字符)表達(dá)式,只要其值為非0(真),就執(zhí)行循環(huán)體。3說(shuō)明說(shuō)明l例如:例如:for(n=0; (c=getchar()!=n; n+=c);for(n=

5、0; (c=getchar()!=n; n+=c);l在循環(huán)繼續(xù)條件中先從鍵盤接收一個(gè)字符給c,然后判斷值是否不等于n(換行符),如果不等于,就執(zhí)行循環(huán)體,此語(yǔ)句最后有“;”說(shuō)明循環(huán)體為空語(yǔ)句,所以執(zhí)行n+=c即把字符的ascii碼累加存入n變量。l此語(yǔ)句的作用是:不斷輸入字符,將它們的碼相加,直此語(yǔ)句的作用是:不斷輸入字符,將它們的碼相加,直到輸入一個(gè)到輸入一個(gè)“換行換行”符為止符為止例題l例題例題6.2 求1100的累計(jì)和。l/*程序功能:求1100的累計(jì)和*/lmain()l int i,sum=0; /*將累加器sum初始化為0*/l for(i=1; i=100; i+) sum +

6、= i; /*實(shí)現(xiàn)累加*/l printf(sum=%dn,sum);l程序運(yùn)行情況如下:sum=5050例題l例題例題6.3 求t=1*2*3*4*5*nlmain()l int n, i;ldouble t=1.0; /*所求累乘值很大,所以用double型且初始化為1 */lprintf(“input n:”);lscanf(“%d”,&n);lfor (i=1;i=n;i+)lt=t*i; /*實(shí)現(xiàn)累乘,循環(huán)體只有一個(gè)語(yǔ)句不用 號(hào)*/lprintf(“t=%e”,t); /*用指數(shù)形式輸出雙精度類型的t變量的值*/l運(yùn)行結(jié)果:input n: 5t=1.200000e+02 此

7、程序t 放的是n!,當(dāng)n較大時(shí)階乘數(shù)會(huì)很大,所以定義為double型。例題l例例6.4 求s=1+1/2+1/3+1/nlmain()l int i,n;lfloat s=1;lprintf(“input n:”);lscanf(“%d”,&n);lfor(i=2;i=n;i+)ls=s+1.0/i;lprintf(“s=%fn”,s);l此程序注意求1/2、1/3時(shí),如果兩個(gè)操作數(shù)都是int型,完成的是整除得0,則最后s的是1,這是錯(cuò)誤的。應(yīng)使除數(shù)和被除數(shù)其中有一個(gè)為實(shí)型才可以,如:s=s+1.0/i;或i定義為float,則 s=s+1/i。運(yùn)行結(jié)果:input n:4s=2.08

8、33336.3 while語(yǔ)句語(yǔ)句l(1)一般格式l while(循環(huán)繼續(xù)條循環(huán)繼續(xù)條件件) l 循環(huán)體語(yǔ)句組;循環(huán)體語(yǔ)句組;l(2)執(zhí)行過(guò)程例題l例題例題6.5用while語(yǔ)句求1100的累計(jì)和。lmain()l int i=1,sum=0; /*初始化循環(huán)控制變量i和累計(jì)器sum*/l while( i=100 )l sum += i;/*實(shí)現(xiàn)累加*/l i+;/*循環(huán)控制變量i增1*/l lprintf(“sum=%dn”,sum);l 此程序此程序while while 語(yǔ)句的循環(huán)體語(yǔ)句的循環(huán)體有兩個(gè)語(yǔ)句有兩個(gè)語(yǔ)句sum += i; sum += i; i+;i+;所以要用所以要用 號(hào)

9、括起來(lái)號(hào)括起來(lái)以復(fù)合語(yǔ)句形以復(fù)合語(yǔ)句形式出現(xiàn)。式出現(xiàn)。程序運(yùn)行情況如下: sum=50506.4 do while 語(yǔ)句語(yǔ)句l1一般格式一般格式l do l 循環(huán)體語(yǔ)句循環(huán)體語(yǔ)句組組; l while(循環(huán)繼續(xù)循環(huán)繼續(xù)條件條件); /*本行的分號(hào)不能缺省*/例題l 例題例題6.6 用do-while語(yǔ)句求解1100的累計(jì)和。lmain()l int i=1, sum=0; /*定義并初始化循環(huán)控制變量i,以及累計(jì)器sum*/l dol sum += i; /*累加*/l i+; l l while(i=100);/*循環(huán)繼續(xù)條件:i=100*/ printf(“sum=%dn”,sum);l

10、程序運(yùn)行情況如下: sum=5050例題l例題例題6.7統(tǒng)計(jì)從鍵盤上輸入整數(shù)的個(gè)數(shù)(輸入0時(shí)結(jié)束,0不計(jì)在內(nèi))lmain( )l int n,x=0;ldo lscanf(“%d”,&n);lx+;lwhile(n!=0);lprintf(“x=%dn”,x-1);l運(yùn)行結(jié)果及分析l運(yùn)行情況:l2 4 6 34 0lx=4l此程序用do while語(yǔ)句一開(kāi)始不做判斷進(jìn)入循環(huán),用scanf()輸入整數(shù),輸入一個(gè)整數(shù),x加一次1,然后判斷是否輸入的是表示結(jié)束的0,一直重復(fù)直到輸入0停止循環(huán)。由于do while語(yǔ)句是后判斷循環(huán)繼續(xù)條件,最后輸入的0也計(jì)算在個(gè)數(shù)內(nèi),所以輸出時(shí),要輸出x-1的

11、值。例題l例題例題 6.8 while和 dowhile循環(huán)的比較l (1) (2)lmain() main() l int s=0,i; int s=0,i;lscanf (“%d”,&i); scanf(“%d”,&i); lwhile (i=10) dol s=s+i; s=s+i;li+; i+;l while (i10時(shí),二者結(jié)果就不同了。這是因?yàn)榇藭r(shí)對(duì)while 循環(huán)來(lái)說(shuō),一次也不執(zhí)行循環(huán)體,而對(duì)dowhile循環(huán)語(yǔ)句來(lái)說(shuō)則要執(zhí)行一次循環(huán)體。while 循環(huán)是前判斷,而dowhile循環(huán)是后判斷。6.5 循環(huán)的嵌套循環(huán)的嵌套l3種循環(huán)(種循環(huán)(while、dowhi

12、le、for) 可以互相嵌套。可以互相嵌套。l(1) while( ) (2)while( )l l do l while( ) l while( ); l (3) do l (4) for( ; ; )l do l while( )l while( ); llwhile( ); 6.5 循環(huán)的嵌套循環(huán)的嵌套l(5) for( ; ; ) (6) dol lfor( ; ; ) for( ; ;)l l while( );雙重循環(huán)l2兩層兩層for組成的雙循環(huán)的執(zhí)行過(guò)程:組成的雙循環(huán)的執(zhí)行過(guò)程:l當(dāng)外循環(huán)控制變量每確定一個(gè)值時(shí),內(nèi)循環(huán)的控制變量就要從頭至尾的循環(huán)一遍。l例題例題6.9 雙循環(huán)程

13、序舉例。lmain()l int x,y;lfor (x=1;x=2;x+)lfor(y=1;y=3;y+)lprintf (“x=%d,y=%dn”,x,y);l 運(yùn)行結(jié)果:x=1,y=1x=1,y=2x=1,y=3x=2,y=1x=2,y=2x=2,y=3例題l例題例題6.10下面程序的輸出結(jié)果是什么?(訓(xùn)練閱讀程序能力)lmain( )l int k=0,m=0;lint x,y;lfor(x=0;x2;x+)l for(y=0;y3;y+)l k+;lk-=y;llm=x+y;lprintf(“k=%d,m=%dn”,k,m);l運(yùn)行結(jié)果:k=0,m=5本程序是雙循環(huán)嵌套,注意內(nèi)循環(huán)體

14、只有 一個(gè)語(yǔ)句k+;因?yàn)闆](méi)有大花括號(hào)。不要將 k-=y;語(yǔ)句也認(rèn)為是內(nèi)循環(huán)體語(yǔ)句。當(dāng)x=0時(shí),內(nèi)循環(huán)執(zhí)行3次(y=0,1,2)k+執(zhí)行3次故循環(huán)結(jié)束時(shí)k=3。注意當(dāng)內(nèi)循環(huán)結(jié)束 時(shí)循環(huán)控制變量y的值是3,接著執(zhí)行 k-=y; 語(yǔ)句,即k=k-y=3-3=0。當(dāng)x=1時(shí),內(nèi)循環(huán)仍執(zhí)行原操作。使y=3,k=0。當(dāng)x=2外循環(huán)結(jié)束,執(zhí)行m=x+y=2+3=5。所以輸出結(jié)果為k=0,m=5。 6.6 break語(yǔ)句和語(yǔ)句和continue語(yǔ)句語(yǔ)句l為了使循環(huán)控制更加靈活,語(yǔ)言提供了break語(yǔ)句和continue語(yǔ)句。l1 break語(yǔ)句語(yǔ)句l一般格式: break;(本語(yǔ)句必須在循環(huán)中使用)l功能:l

15、在循環(huán)中當(dāng)滿足特定條件時(shí),使用break語(yǔ)句強(qiáng)行結(jié)束循環(huán),轉(zhuǎn)向執(zhí)行循環(huán)語(yǔ)句的下一條語(yǔ)句。例題l例題例題6.11 break語(yǔ)句應(yīng)用lmain()l int r; lfloat pi=3.14159,s;lfor (r=1;r100) break;lprintf(“r=%d,s=%fn”,r,s);ll運(yùn)行結(jié)果:r=1,s=3.141590r=2,s=12.566360r=3,s=28.274311r=4,s=50.265442r=5,s=78.539749continue語(yǔ)句:語(yǔ)句:l2continue語(yǔ)句:語(yǔ)句:l功能:對(duì)于for循環(huán),跳過(guò)循環(huán)體其余語(yǔ)句,轉(zhuǎn)向循環(huán)變量增量表達(dá)式的計(jì)算;對(duì)于w

16、hile和do-while循環(huán),跳過(guò)循環(huán)體其余語(yǔ)句,但轉(zhuǎn)向循環(huán)繼續(xù)條件的判定。l例題例題6.12將100200之間的不能被3整除的數(shù)輸出。(continue應(yīng)用舉例。)lmain()l int n;lfor(n=100; n200停止循環(huán)。l例題例題6.13分析下面程序的運(yùn)行結(jié)果。(continue應(yīng)用舉例。)l/*例題源代碼文件名:lt6_13.c*/lmain()l int i=0,s=0;例題l do lif (i%2)l i+; continue;l i+;ls+=i;lwhile (i7);lprintf(“s=%dn”,s);ll分析:分析:l當(dāng)i%2為0時(shí),表示假跳過(guò) i+; c

17、ontinue;語(yǔ)句,執(zhí)行i+; s+=i;l當(dāng)i%2為1時(shí),表示真執(zhí)行 i+; continue;語(yǔ)句,所以本程序s的和是1+3+5+7。l運(yùn)行結(jié)果:運(yùn)行結(jié)果: s=166.7 循環(huán)程序舉例循環(huán)程序舉例l 例題例題6.146.14 輸出10100之間的全部素?cái)?shù)。所謂素?cái)?shù)n是指,除1和n之外,不能被2(n-1)之間的任何整數(shù)整除。l算法設(shè)計(jì)要點(diǎn):算法設(shè)計(jì)要點(diǎn):l(1)顯然,只要設(shè)計(jì)出判斷某數(shù)n是否是素?cái)?shù)的算法,外面再套一個(gè)for循環(huán)即可。l(2)判斷某數(shù)n是否是素?cái)?shù)的算法:根據(jù)素?cái)?shù)的定義,用2(n-1)之間的每一個(gè)數(shù)去整除n,如果都不能被整除,則表示該數(shù)是一個(gè)素?cái)?shù)。l判斷一個(gè)數(shù)是否能被另一個(gè)數(shù)

18、整除,可通過(guò)判斷它們整除的余數(shù)是否為0來(lái)實(shí)現(xiàn)。參考源程序:lmain()l int i=11, j, counter=0; l for( ; i=100; i+=2) /*外循環(huán):為內(nèi)循環(huán)提供一個(gè)整數(shù)i*/l for(j=2; j= i ) /*整數(shù)i是素?cái)?shù):輸出,計(jì)數(shù)器加1*/l printf(“%6d”,i); l counter+;l l l運(yùn)行結(jié)果:11 13 17 19 23 29 31 37 41 4347 53 59 61 67 71 73 79 83 8997循環(huán)程序舉例循環(huán)程序舉例l 例題例題6.156.15相傳古代印度國(guó)王舍罕要褒獎(jiǎng)他的聰明能干的宰相達(dá)依爾(國(guó)際象棋發(fā)明者)

19、,問(wèn)他需要什么,達(dá)依爾回答說(shuō):“國(guó)王只要在國(guó)際象棋的棋盤上第一個(gè)格子放1粒麥子,第二個(gè)格子放2粒麥子,第三個(gè)格子放4粒麥子,以此類推,每一格加一倍,一直放到64格,我就感恩不盡了,”。國(guó)王答應(yīng)了,結(jié)果全印度的糧食用完還不夠。國(guó)王很納悶,怎么也算不清這筆賬?,F(xiàn)在用c語(yǔ)言編程來(lái)算一下。l計(jì)算s=1+2+2+2+2算出小麥的顆粒數(shù)。l1立方米小麥大約1.42*10參考源程序:lmain()l int n;ldouble v, sum=0.0, t=1.0;lfor (n=0;n64;n+)l sum+=t; /*做累加各項(xiàng)*/lt*=2; /*做累乘求2各項(xiàng)*/llprintf(“sum=%en”,sum);lv=sum/1.42e+8;lprintf(“v=%e”,v);l運(yùn)行結(jié)果:sum=1.84467e+19v=1.29907+116.8閱讀程序

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論