第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用.ppt_第1頁(yè)
第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用.ppt_第2頁(yè)
第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用.ppt_第3頁(yè)
第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用.ppt_第4頁(yè)
第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用.ppt_第5頁(yè)
已閱讀5頁(yè),還剩65頁(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、第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用,第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用,學(xué)習(xí)目標(biāo) 掌握循環(huán)結(jié)構(gòu)的應(yīng)用場(chǎng)合,循環(huán)結(jié)構(gòu)的設(shè)計(jì),循環(huán)語(yǔ)句的用法,設(shè)計(jì)循環(huán)結(jié)構(gòu)程序。 學(xué)習(xí)內(nèi)容 while循環(huán),do-while循環(huán),for循環(huán),break語(yǔ)句,循環(huán)嵌套,循環(huán)結(jié)構(gòu)程序設(shè)計(jì)方法。,下一頁(yè),返 回,第5章 循環(huán)結(jié)構(gòu)及其應(yīng)用,5.1 一個(gè)循環(huán)結(jié)構(gòu)程序?qū)嵗?5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句 5.3 循環(huán)嵌套 5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例 5.5 本章小結(jié) 5.6 實(shí)訓(xùn),返 回,上一頁(yè),5.1 一個(gè)循環(huán)結(jié)構(gòu)程序?qū)嵗?要在計(jì)算機(jī)屏幕上輸出30個(gè)“*”,可以使用輸出函數(shù)printf( )一次完成,但是程序中要重復(fù)輸入30次“*”。其實(shí)同樣的操作可以

2、換一個(gè)思路完成,那就是讓計(jì)算機(jī)重復(fù)30次輸出1個(gè)“*”的工作,而輸出一個(gè)“*”的工作很容易用函數(shù)printf( )實(shí)現(xiàn)。 【例5-1】輸出30個(gè)“*”。 【編程思路】 (1)定義變量i,并賦初始值1,用i來(lái)進(jìn)行計(jì)數(shù)器。 (2)使用循環(huán)結(jié)構(gòu)重復(fù)執(zhí)行輸出1個(gè)“*”的過(guò)程。 (3)每次輸出1個(gè)“*”,讓計(jì)數(shù)器加1,當(dāng)計(jì)數(shù)器超過(guò)30就停止重復(fù)工作。,下一頁(yè),返 回,5.1 一個(gè)循環(huán)結(jié)構(gòu)程序?qū)嵗?【程序代碼】 #include stdio.h main( ) int i=1; while (i=30) /*控制重復(fù)次數(shù)*/ printf(*); /*輸出1個(gè)*/ i+; /*計(jì)數(shù)器加1*/ ,上一頁(yè),下

3、一頁(yè),返 回,5.1 一個(gè)循環(huán)結(jié)構(gòu)程序?qū)嵗?執(zhí)行程序后得到的輸出結(jié)果為: 程序分析: 從本例可以看到,循環(huán)就是重復(fù)執(zhí)行某些操作,本例用while語(yǔ)句來(lái)實(shí)現(xiàn)這一循環(huán)過(guò)程,其中條件i=30成立與否,決定著循環(huán)是否繼續(xù)進(jìn)行,因此稱之為循環(huán)條件,程序中被重復(fù)執(zhí)行的語(yǔ)句稱為循環(huán)體語(yǔ)句,比如語(yǔ)句 printf(“*”);i+; 。圖5-1是本例的循環(huán)結(jié)構(gòu)執(zhí)行流程。 循環(huán)結(jié)構(gòu)是程序的第三種基本結(jié)構(gòu)。用循環(huán)結(jié)構(gòu)解決問(wèn)題的關(guān)鍵就是找出循環(huán)繼續(xù)與否的條件和需要重復(fù)執(zhí)行的操作即循環(huán)體語(yǔ)句。 程序設(shè)計(jì)中任何循環(huán)都必須是有條件或有限次的循環(huán),一定要注意避免循環(huán)一直進(jìn)行無(wú)法正常結(jié)束的情況(即死循環(huán))發(fā)生。 提示:本例中如

4、果去掉語(yǔ)句i+;,就會(huì)出現(xiàn)死循環(huán)。,上一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,C語(yǔ)言提供了3種實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句:while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句。雖然3個(gè)語(yǔ)句的語(yǔ)法規(guī)則不同,但在使用上很相似,一般情況下可以相互轉(zhuǎn)換。當(dāng)然它們有各自的特點(diǎn),在實(shí)際應(yīng)用中還是要根據(jù)具體情況選擇恰當(dāng)?shù)难h(huán)語(yǔ)句。 5.2.1 while語(yǔ)句 while語(yǔ)句用于當(dāng)型循環(huán)結(jié)構(gòu),其一般形式為: while (表達(dá)式) 循環(huán)體語(yǔ)句 ,下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,while語(yǔ)句的執(zhí)行過(guò)程是: 首先計(jì)算表達(dá)式的值,若結(jié)果為“真”(非零),則執(zhí)行循環(huán)體語(yǔ)句;然后再計(jì)算表達(dá)式的值,重復(fù)上述過(guò)程,直到

5、表達(dá)式的值為“假”(零)時(shí)結(jié)束循環(huán),流程控制轉(zhuǎn)到while語(yǔ)句的下一語(yǔ)句。 while語(yǔ)句中的表達(dá)式就是循環(huán)條件,其執(zhí)行流程如圖5-2所示。 小測(cè)驗(yàn) 根據(jù)while語(yǔ)句的執(zhí)行過(guò)程,寫(xiě)出下面程序的輸出結(jié)果。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,#include stdio.h main() int x=0,n=0; while (x30) x=(x+1)*(x+1); n=n+1; printf(n=%dn,n); ,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【例5-2】顯示110的平方。 【編程思路】 (1)定義變量i,并賦初始值1,用i來(lái)表示底數(shù)和行數(shù),讓i在循環(huán)體

6、中遞增加。 (2)循環(huán)結(jié)束條件為i=10,即底數(shù)增加到10的時(shí)候進(jìn)行最后一個(gè)循環(huán)。 (3)循環(huán)體中使用printf函數(shù)輸出平方數(shù)。 【程序代碼】 #include stdio.h main( ) int i=1; while (i=10) /* 循環(huán)條件*/,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句, printf(%d*%d=%dn,i,i,i*i); /*循環(huán)體語(yǔ)句*/ i+; /*循環(huán)體語(yǔ)句*/ 程序輸出結(jié)果為:,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,使用while循環(huán)結(jié)構(gòu)時(shí)應(yīng)注意以下幾點(diǎn): (1)while循環(huán)的特點(diǎn)是先判斷條件后執(zhí)行循環(huán)體語(yǔ)句,因此循環(huán)體語(yǔ)句有

7、可能一次都執(zhí)行不到。 (2)while循環(huán)中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,就可執(zhí)行循環(huán)體。 (3)循環(huán)體語(yǔ)句可以是一個(gè)語(yǔ)句,也可以是多個(gè)語(yǔ)句。當(dāng)只有一個(gè)語(yǔ)句時(shí),外層的大括號(hào)可以省略,如果循環(huán)體是多個(gè)語(yǔ)句時(shí),一定要用花括號(hào)“”括起來(lái),以復(fù)合語(yǔ)句的形式出現(xiàn)。 (4)循環(huán)體內(nèi)一定要有改變循環(huán)條件的語(yǔ)句,使循環(huán)趨于結(jié)束,否則循環(huán)將無(wú)休止地進(jìn)行下去,即形成“死循環(huán)”。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【例5-3】求1到100的和。 【編程思路】 (1)首先定義兩個(gè)變量,用i表示累加數(shù),用sum存儲(chǔ)累加和。 (2)給累加數(shù)i賦初值

8、1,表示從1開(kāi)始進(jìn)行累加,給累加變量sum賦初值0。 (3)使用循環(huán)結(jié)構(gòu)反復(fù)執(zhí)行加法,在sum原有值的基礎(chǔ)上在增加新的i值,加完后再使i自動(dòng)加1,使其成為下一個(gè)要累加的數(shù)。 (4)在每次執(zhí)行完循環(huán)后判斷i的值是否到達(dá)100,如果超過(guò)100就停止循環(huán)累加。 (5)最后輸出計(jì)算結(jié)果,即輸出sum的值。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【程序代碼】 #include stdio.h main( ) int i,sum0; i=1;sum=0; /*循環(huán)控制變量i、累加變量sum賦初值*/ while (i=100) /*循環(huán)條件*/ sum=sum+i; /*累加*/ i+; /

9、*變?yōu)橄乱粋€(gè)加數(shù)*/ printf(sum=%dn,sum); /*輸出計(jì)算結(jié)果*/ ,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,程序輸出結(jié)果為: 這是一個(gè)典型的累加問(wèn)題。程序中用sum存儲(chǔ)每次累加后的和值,用i表示要累加的數(shù)。第1次先計(jì)算0+1的值,并將其存入sum,第2次再計(jì)算sum+2的值,并將結(jié)果存回到sum中,第3次計(jì)算sum+3的值,再將結(jié)果存回到sum中,如此重復(fù)下去,直到計(jì)算完sum+100為止。每次累加完成后,加數(shù)i自動(dòng)增加1,變?yōu)橄乱粋€(gè)加數(shù),當(dāng)i超過(guò)100時(shí),累加結(jié)束。 小測(cè)驗(yàn) 針對(duì)上面實(shí)例,思考下列問(wèn)題: (1)是否可以不給sum和i賦初值? (2)是否可以將i

10、+改成i=i+1? (3)是否可以將i+放置在sum=sum+i之前? (4)在循環(huán)結(jié)束后,i的值是多少? (5)如果求1到100之間的奇數(shù)和,程序該如何修改?,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,5.2.2 do-while語(yǔ)句 do-while語(yǔ)句屬于直到型循環(huán),其一般形式為: do 循環(huán)體語(yǔ)句 while (表達(dá)式); 例如,下面是一個(gè)可以輸出30個(gè)“*”的do-while語(yǔ)句: i=1; do printf(“*”); i+; while (i=30);,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,do-while語(yǔ)句的執(zhí)行過(guò)程是: 首先執(zhí)行一次循環(huán)體語(yǔ)句,然后

11、計(jì)算表達(dá)式(循環(huán)條件)的值,若結(jié)果為“真”(非零),返回執(zhí)行循環(huán)體語(yǔ)句,重復(fù)上述過(guò)程,直到表達(dá)式的值為“假”(零)時(shí)結(jié)束循環(huán),流程控制轉(zhuǎn)到while語(yǔ)句的下一語(yǔ)句。 do-while語(yǔ)句執(zhí)行流程如圖5-3所示。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【例5-4】把例5-3(求1到100的和)用do-while語(yǔ)句改寫(xiě)。 【程序代碼】 #include stdio.h main( ) int i=1,sum=0; /* 變量定義并賦初值 */ do sum=sum+i; /* 進(jìn)行累加求和 */ i+; /* 循環(huán)變量遞增 */ while (i=100); /* 循環(huán)條件 */

12、printf(sum=%dn,sum); /* 輸出計(jì)算結(jié)果 */ ,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,程序輸出結(jié)果為: 使用do-while循環(huán)結(jié)構(gòu)時(shí)應(yīng)注意以下幾點(diǎn): (1)do-while循環(huán)結(jié)構(gòu)的特點(diǎn)是先執(zhí)行循環(huán)體后判斷條件,因此不管循環(huán)條件是否成立,循環(huán)體語(yǔ)句都至少被執(zhí)行一次。這是它與while循環(huán)的本質(zhì)區(qū)別。比較例5-3和例5-4就會(huì)發(fā)現(xiàn),在例5-3中是先判斷條件后執(zhí)行循環(huán)體,而在例5-4中是先執(zhí)行循環(huán)體后進(jìn)行判斷條件。 (2)不論循環(huán)體是一個(gè)語(yǔ)句還是多個(gè)語(yǔ)句,花括號(hào)“”都不要省略。 (3)避免出現(xiàn)“死循環(huán)”。 (4)注意do-while循環(huán)最后的分號(hào)“;”不能省略

13、,經(jīng)常有人忘記書(shū)寫(xiě)。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【例5-5】求n!,即求n的階乘,n由鍵盤(pán)輸入。 【編程思路】 求階乘實(shí)際上是求累乘,即求1*2*3*n。累乘與累加除運(yùn)算類(lèi)型不同外,其執(zhí)行過(guò)程相同。 程序代碼】 #include stdio.h main( ) int i=1,n; long s=1; printf(please input n:); scanf(“%d”,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,do s=s*i; /*累乘*/ i+; while (i=n); /*循環(huán)條件*/ printf(%d!=%ldn,n,s); /*輸出計(jì)算結(jié)果

14、 */ 程序輸出結(jié)果為: 小測(cè)驗(yàn) 針對(duì)上面實(shí)例,思考下列問(wèn)題: (1)為什么不給s賦初值0,而賦初值為1? (2)為什么要把變量s定義為long ? (3)在循環(huán)結(jié)束后,i的值是多少?,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,5.2.3 for語(yǔ)句 for語(yǔ)句屬于當(dāng)型循環(huán),其一般形式為: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 循環(huán)體語(yǔ)句 例如,下面是一個(gè)可以輸出30個(gè)“*”的for語(yǔ)句: for (i=1; i=30 ; i+) printf(“*”);,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,for語(yǔ)句的執(zhí)行過(guò)程是: (1)首先進(jìn)行表達(dá)式1的計(jì)算。 (2)判斷表達(dá)式

15、2的值,若值為“真”(非零),則執(zhí)行循環(huán)體語(yǔ)句,然后轉(zhuǎn)(3)執(zhí)行;若為“假”(零),循環(huán)結(jié)束。 (3)進(jìn)行表達(dá)式3的計(jì)算,然后轉(zhuǎn)至第(2)步重復(fù)執(zhí)行。 其執(zhí)行流程如圖5-4所示。 小測(cè)驗(yàn) 根據(jù)for語(yǔ)句的執(zhí)行過(guò)程,寫(xiě)出下面程序段的輸出結(jié)果。 (1)for (i=1;i10; x -=2 ) printf(“%d n”,x );,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【例5-6】把例5-3(求1到100的和)用for語(yǔ)句改寫(xiě)。 【程序代碼】 #include stdio.h main( ) int i,sum=0; for(i=1;i=100;i+) sum=sum+i; /*累加

16、*/ printf(sum=%dn,sum); /*輸出計(jì)算結(jié)果*/ ,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,程序輸出結(jié)果為: 本例中for語(yǔ)句的3個(gè)表達(dá)式實(shí)現(xiàn)了程序設(shè)計(jì)中的3個(gè)功能,即循環(huán)變量賦初值、循環(huán)條件和循環(huán)變量遞增,因此寫(xiě)法更簡(jiǎn)潔。 小測(cè)驗(yàn) 針對(duì)上面實(shí)例,思考下列問(wèn)題: (1)如果將i=1放置在for循環(huán)之前,即在for循環(huán)外提前對(duì)循環(huán)變量賦初值,那么for語(yǔ)句該怎么書(shū)寫(xiě)? (2)修改程序,計(jì)算1+3+5+101的值。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,使用for語(yǔ)句時(shí)應(yīng)注意以下幾點(diǎn): (1)for循環(huán)相當(dāng)于下面的while循環(huán): 表達(dá)式1; whil

17、e (表達(dá)式2) 循環(huán)體語(yǔ)句 表達(dá)式3; (2)for語(yǔ)句有3個(gè)表達(dá)式,它們之間由分號(hào)“;”分隔,不能更換成其他分隔符號(hào)。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,(3)有時(shí)根據(jù)需要可以將for語(yǔ)句格式中的部分或所有表達(dá)式省略,比如可以寫(xiě)成如下形式: for( ;表達(dá)式2;表達(dá)式3) 循環(huán)體語(yǔ)句 例5-6中代碼可以改寫(xiě)為: int i=1,sum=0; for( ;i=100;i+) sum=sum+i; ,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,for語(yǔ)句還可以寫(xiě)成其他多種形式,不過(guò)建議最好還是使用規(guī)范的語(yǔ)句形式。由于經(jīng)常用表達(dá)式1進(jìn)行循環(huán)變量賦初值,用表達(dá)式2控制循

18、環(huán)結(jié)束,用表達(dá)式3控制循環(huán)變量遞增或遞減,所以規(guī)范的for語(yǔ)句形式為: for(循環(huán)控制變量賦初值;循環(huán)條件;循環(huán)控制變量增/減值) 循環(huán)體語(yǔ)句 【例5-7】把100200之間的不能被3整除的數(shù)輸出。 【編程思路】 (1)用變量n表示101200之間的所有整數(shù)。 (2)利用for循環(huán)遍歷每個(gè)n,在循環(huán)體中判斷n是否能被3整除,如果能整除,則輸出n的值,如果不能整除,則什么都不做,這個(gè)判斷用if語(yǔ)句實(shí)現(xiàn)。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【程序代碼】 #include stdio.h main( ) int n; for (n=100;n=200;n+) if (n%3!=0

19、) /*判斷n是否能被3整除*/ printf(%d ”,n); /*不能整除時(shí)輸出n的值 */ ,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,程序輸出結(jié)果為: 小測(cè)驗(yàn) 例5-7中輸出的數(shù)據(jù)比較多,如果要求每行只能輸出10個(gè)數(shù),程序應(yīng)該如何修改? 【例5-8】判斷正整數(shù)m是不是素?cái)?shù),m由鍵盤(pán)輸入。 【編程思路】 首先明確什么是素?cái)?shù),素?cái)?shù)是只能被1和它自身整除的數(shù)(1不是素?cái)?shù)),即除了1和自身外不能被其他任何數(shù)整除的數(shù)。 判斷方法:用2m-1之間的數(shù)依次去除m,如果都不能除盡,則m就是素?cái)?shù);反之,只要有一次除盡了,則m不是素?cái)?shù),這時(shí)循環(huán)可以提前結(jié)束。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)

20、循環(huán)結(jié)構(gòu)的語(yǔ)句,程序中定義變量i來(lái)表示除數(shù),那么i的初值為2,終值為m-1,循環(huán)結(jié)構(gòu)使用for語(yǔ)句實(shí)現(xiàn)。循環(huán)過(guò)程中,如果一直沒(méi)有除盡,則i要一直遞增到m,循環(huán)正常結(jié)束;反之,如果除盡了,那么i還沒(méi)有遞增到m,循環(huán)就提前結(jié)束。提前結(jié)束循環(huán)可用break語(yǔ)句完成。 【程序代碼】 #include stdio.h“ main( ) int m,i; scanf(“%d”, /* 輸入m的值 */,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,for (i=2;i=m-1;i+) if (m%i=0) break; /* 如果某個(gè)數(shù)整除m,則提前結(jié)束循環(huán) */ if(i=m) /* 判斷i是否遞

21、增到m,即循環(huán)是否正常結(jié)束 */ printf(%d is a prime numbern”,m); /* m是素?cái)?shù) */ else printf(%d is not a prime numbern”,m); /* m不是素?cái)?shù) */ 執(zhí)行程序時(shí),輸入整數(shù)23,則輸出結(jié)果為:,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,程序說(shuō)明: 實(shí)際上除數(shù)i只需從2判斷到即可,所以本例的for語(yǔ)句可以寫(xiě)成: for (i=2;i=sqrt(n);i+) 這樣可以減少循環(huán)次數(shù),提高程序的運(yùn)行效率。當(dāng)然在程序的開(kāi)頭必須增加命令行#include “math.h”。 本例中用到了break語(yǔ)句。在switc

22、h語(yǔ)句中我們已經(jīng)接觸過(guò)break語(yǔ)句,它的功能是終止選擇執(zhí)行,跳出switch語(yǔ)句,那么在循環(huán)結(jié)構(gòu)中使用break語(yǔ)句,其作用是終止循環(huán)的執(zhí)行,即跳出循環(huán)語(yǔ)句。 使用break語(yǔ)句要注意以下幾點(diǎn): (1)break語(yǔ)句只能跳出或終止包含它的循環(huán)語(yǔ)句,對(duì)其他語(yǔ)句沒(méi)有影響。 (2)break語(yǔ)句通常要和if語(yǔ)句配合使用。 (3)除了在switch結(jié)構(gòu)和循環(huán)結(jié)構(gòu)中使用外,其他情況下一般不使用break語(yǔ)句。,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,【例5-9】程序預(yù)期輸出半徑為1到10的圓的面積,但是如果有面積值超過(guò)100時(shí),則停止執(zhí)行。 【編程思路】 定義變量i表示圓的半徑,使其從1遞

23、增到10。循環(huán)中計(jì)算并判斷每個(gè)圓的面積值是否大于100,不大于100時(shí),輸出圓面積,如果大于100,則使用break跳出循環(huán)即可。 【程序代碼】 #include stdio.h #define PI 3.14159 main( ) int r; float area;,上一頁(yè),下一頁(yè),返 回,5.2 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句,for(r=1;r100) /* 判斷圓的面積是否大于100 */ break; /* 提前結(jié)束循環(huán) */ printf(r=%d,area=%.2fn,r,area); 程序輸出結(jié)果為:,上一頁(yè),返 回,提示:break語(yǔ)句用于終止 循環(huán)的執(zhí)行,以便提前結(jié)束循環(huán)。,5.3

24、循環(huán)嵌套,一個(gè)循環(huán)體內(nèi)又包含了另一個(gè)完整的循環(huán)結(jié)構(gòu),這種循環(huán)稱為循環(huán)的嵌套或多重循環(huán)。使用循環(huán)嵌套時(shí),3種循環(huán)語(yǔ)句可以自身嵌套,也可以互相嵌套。 例如:分析下面程序段,理解循環(huán)嵌套。 (1)for (k=1;k=5;k+) /* 單層循環(huán),輸出5個(gè)“*” */ printf(“*”); /* 循環(huán)體 */ 輸出結(jié)果為: (2)for (i=1;i=3; i+) /* 外循環(huán) */ for (k=1;k=5;k+) /* 內(nèi)循環(huán),也是外循環(huán)的循環(huán)體 */ printf(“*”); 輸出結(jié)果為15個(gè)“*”:,下一頁(yè),返 回,5.3 循環(huán)嵌套,顯然,上面程序是for循環(huán)中又包含了一個(gè)for循環(huán),屬于

25、兩層循環(huán)結(jié)構(gòu)。外循環(huán)用變量i控制,內(nèi)循環(huán)用變量k控制,外循環(huán)i從1到3,循環(huán)3次,外循環(huán)每執(zhí)行1次,內(nèi)循環(huán)k從1到5,循環(huán)5次,所以輸出結(jié)果為3*5=15個(gè)“*”。 (3)for(i=1;i=3;i+) for(k=1;k=5;k+) printf(*); printf(n); /* 換行 */ 輸出結(jié)果為:,上一頁(yè),下一頁(yè),返 回,5.3 循環(huán)嵌套,可以看出,上面程序段仍然輸出15個(gè)“*”,不過(guò)因?yàn)榧尤肓藫Q行操作,輸出的是3行5列的“*”方陣。 小測(cè)驗(yàn):如果要輸出以下效果,循環(huán)該如何設(shè)計(jì)? 提示:外循環(huán)控制行數(shù),內(nèi)循環(huán)控制各行的列數(shù),內(nèi)外循環(huán)之間要加入換行操作。 【例5-10】輸出九九乘法表

26、。格式如下:,上一頁(yè),下一頁(yè),返 回,5.3 循環(huán)嵌套,【編程思路】 (1)圖形中共有9行,定義變量i表示行數(shù),使其從1遞增到9。 (2)每一行中的被乘數(shù)從1變化到和本行行號(hào)相同的數(shù)字,用變量j表示被乘數(shù),讓其從1遞增到當(dāng)前行號(hào)i。 (3)用外層循環(huán)實(shí)現(xiàn)行的轉(zhuǎn)換,內(nèi)層循環(huán)輸出一行中的內(nèi)容,而內(nèi)層循環(huán)的循環(huán)體是輸出每行中的某一項(xiàng)。 【程序代碼】 #include stdio.h main( ) int i,j; for(i=1;i=9;i+) /*外循環(huán)控制要輸出的行數(shù) */,上一頁(yè),下一頁(yè),返 回,5.3 循環(huán)嵌套, for(j=1;j=i;j+) /* 內(nèi)循環(huán)控制要輸出的項(xiàng)目數(shù) */ pri

27、ntf(%1d*%1d=%2d ,i,j,i*j); /* 輸出第i行第j項(xiàng)的內(nèi)容 */ printf(“n”); /* 每行結(jié)束換行 */ 使用循環(huán)嵌套要注意以下幾點(diǎn): (1)外層循環(huán)應(yīng)完全包含內(nèi)層循環(huán),不能交叉,否則會(huì)引起歧異。 (2)循環(huán)嵌套的循環(huán)控制變量一般不應(yīng)同名,以免造成混亂,不便于理解和控制。 (3)嵌套循環(huán)時(shí)應(yīng)使用縮進(jìn),保持良好的書(shū)寫(xiě)格式,提高程序可讀性。,上一頁(yè),下一頁(yè),返 回,5.3 循環(huán)嵌套,【例5-11】編寫(xiě)程序,輸出如下圖形: 【編程思路】 (1)圖形中共有6行,定義變量i表示行數(shù),使其從1遞增到6。 (2)每行中要有若干個(gè)空格,若干個(gè)“*”及換行。 (3)仔細(xì)數(shù)數(shù)會(huì)

28、發(fā)現(xiàn),每行的空格數(shù)分別為6、5、4、3、2、1,如果與行號(hào)聯(lián)系起來(lái),每行要輸出的空格數(shù)為7-i個(gè)。 (4)每行的“*”個(gè)數(shù)分別為1、3、4、7、9、11,正好是2*i-1個(gè)。 (5)用外層循環(huán)實(shí)現(xiàn)行的轉(zhuǎn)換,內(nèi)層循環(huán)輸出各行內(nèi)容。,上一頁(yè),下一頁(yè),返 回,5.3 循環(huán)嵌套,【程序代碼】 #include stdio.h main( ) int i,j; for(i=1;i=6;i+) /* 外循環(huán)控制要輸出的行數(shù) */ for(j=1;j=7-i;j+) /* 內(nèi)循環(huán)1控制輸出空格符 */ printf( ); for(j=1;j=2*i-1;j+) /* 內(nèi)循環(huán)2控制輸出“*”*/ print

29、f(*); printf(n); /*換行 */ ,上一頁(yè),下一頁(yè),返 回,小測(cè)驗(yàn) 針對(duì)上面實(shí)例,思考下列問(wèn)題: (1)上例的圖形結(jié)果是三角形的,如何輸出菱形的? (2)如果取掉printf(n)語(yǔ)句,會(huì)有什么效果?,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,【例5-12】輸入10個(gè)整數(shù),求其中的最大數(shù)和最小數(shù)。 【編程思路】 (1)定義變量max,min分別用來(lái)存儲(chǔ)最大值和最小值,用變量x存儲(chǔ)輸入的每個(gè)數(shù),由于只用變量x表示輸入的10個(gè)數(shù),所以要使用循環(huán)結(jié)構(gòu)。 (2)將輸入的第一個(gè)數(shù)作為max和min的初值,以后每輸入一個(gè)數(shù)都將與max與min分別比較,如果大于max,則將它存入max,作為新的最大值,如果

30、它小于min,則用它替換原來(lái)的min。如此重復(fù)下去,max始終存放的是當(dāng)前已輸入的最大值,min始終存放的是當(dāng)前輸入的最小值。 (3)定義變量i控制循環(huán)次數(shù)。,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,【程序代碼】 #include stdio.h main() int i; int x,max,min; printf(please input the first number :); scanf(%d,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,scanf(%d, 程序運(yùn)行過(guò)程及輸出結(jié)果為:,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,【例5-13】輸出100200之間的

31、所有素?cái)?shù)。 【編程思路】 例5-8已經(jīng)介紹了如何判斷一個(gè)數(shù)m是不是素?cái)?shù),在此基礎(chǔ)上,本題只需外套一個(gè)for循環(huán),對(duì)m的所有取值進(jìn)行窮舉測(cè)試即可,也就是用外層循環(huán)使m從101遞增到200,而內(nèi)層循環(huán)只需要判斷m是否是素?cái)?shù),如果是則輸出m的值。 【程序代碼】 #include stdio.h #include math.h main( ) int m,i,flag,n=0;,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,for(m=101;m=200;m=m+2) flag=0; /*標(biāo)志變量取初值*/ for (i=2;i=(int)sqrt(m);i+) if(m%i=0) flag=1;

32、 break; /*m不是素?cái)?shù)時(shí),標(biāo)志變量取值為1*/ if (flag=0) printf(%d ,m); /*輸出素?cái)?shù)m*/ n+; /*統(tǒng)計(jì)輸出素?cái)?shù)的個(gè)數(shù)*/ if (n%7=0) printf(n,m); /*每行輸出7個(gè)素?cái)?shù)*/ printf (n); ,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,程序輸出結(jié)果為: 程序說(shuō)明: 本例中定義的變量flag為標(biāo)志變量。根據(jù)程序判定的情況給flag賦值,flag為0時(shí)表示m是素?cái)?shù),為1時(shí)表示m不是素?cái)?shù)。為了輸出結(jié)果清晰,每行控制輸出7個(gè)素?cái)?shù)。 提示:窮舉法在計(jì)算機(jī)程序設(shè)計(jì)中應(yīng)用非常廣泛,其基本思想是對(duì)問(wèn)題的所有可能狀態(tài)一一進(jìn)行測(cè)試,直

33、到找到解或?qū)⑷靠赡軤顟B(tài)都測(cè)試過(guò)為止。,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,【例5-14】求Fibonacci數(shù)列前40個(gè)數(shù)。這個(gè)數(shù)列有如下特點(diǎn):第1,2兩個(gè)數(shù)為1,1。從第3個(gè)數(shù)開(kāi)始,該數(shù)是其前面兩個(gè)數(shù)之和。即: F(1)=1 (n=1) F(2)=1 (n=2) F(n)=F(n-1)+F(n-2) (n3) 【編程思路】 (1)本題屬于典型的遞推問(wèn)題。遞推問(wèn)題就是需要不斷地用舊值推算出新值,在程序中表現(xiàn)為不斷地用新值取代變量舊值的過(guò)程。 (2)定義循環(huán)變量n,用來(lái)表示數(shù)列的項(xiàng)數(shù),那么n要從1遞增到40,不過(guò)數(shù)列的前兩項(xiàng)已經(jīng)給出,所以n的初值為3。 (2)定義變量fn存儲(chǔ)每次

34、計(jì)算出來(lái)的通項(xiàng),由于fn的值可能很大,所以將其聲明成長(zhǎng)整型。,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,(3)定義變量f1和f2,每次計(jì)算完通項(xiàng)后,那么在計(jì)算下一項(xiàng)時(shí),原來(lái)的f2就成為新的f1,剛計(jì)算出的fn就成為新的f2。 (4)為了更清晰地輸出數(shù)列,每行輸出4個(gè)數(shù)。 【程序代碼】 #include stdio.h main( ) long int f1,f2,fn; int n; f1=1;f2=1; printf(“%12ld %12ld “,f1,f2); /* 輸出數(shù)列的前兩項(xiàng) */ for(n=3;n=40; n+) ,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,fn

35、=f1+f2; /* 計(jì)算通項(xiàng) */ f1=f2; /* 計(jì)算新的f1 */ f2=fn; /* 計(jì)算新的f2 */ printf(“%12ld “,fn); /* 輸出數(shù)據(jù) */ if(n%4=0) /* 判斷n是不是4的倍數(shù),以決定是否換行 */ printf(“n”); ,上一頁(yè),下一頁(yè),返 回,5.4 循環(huán)結(jié)構(gòu)應(yīng)用實(shí)例,程序輸出結(jié)果為: 小測(cè)驗(yàn):針對(duì)上面實(shí)例,思考下列問(wèn)題: (1)f1=f2和f2=fn可以的位置可以調(diào)換嗎?為什么? (2)如果要計(jì)算不大于10000的所有通項(xiàng),要如何修改? 提示:遞推法的基本思想是不斷地用舊值推算出新值,即新值取代變量舊值。,上一頁(yè),返 回,5.5 本

36、章小結(jié),通過(guò)本章的學(xué)習(xí),讀者應(yīng)掌握以下內(nèi)容: 1. 循環(huán)結(jié)構(gòu)。循環(huán)是需要重復(fù)執(zhí)行某些操作,設(shè)計(jì)循環(huán)結(jié)構(gòu)的關(guān)鍵是找出循環(huán)條件和循環(huán)體語(yǔ)句。 2. 循環(huán)結(jié)構(gòu)的實(shí)現(xiàn)。C語(yǔ)言提供了3種實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的語(yǔ)句:while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句。3種循環(huán)可以用來(lái)處理同一個(gè)問(wèn)題,不過(guò)它們各有各的特點(diǎn),要根據(jù)情況選擇合適的循環(huán)語(yǔ)句。一般而言,對(duì)于循環(huán)次數(shù)明確的大多使用for循環(huán),而對(duì)不確定次數(shù)的大多使用while循環(huán)或do-while循環(huán)。,下一頁(yè),返 回,5.5 本章小結(jié),3. 循環(huán)嵌套。循環(huán)嵌套是一個(gè)循環(huán)體內(nèi)又包含另一個(gè)循環(huán)。循環(huán)結(jié)構(gòu)嵌套可以完成復(fù)雜程序的設(shè)計(jì)。3種循環(huán)(while循環(huán)、do-

37、while循環(huán)和for循環(huán))可以自身嵌套,也可以互相嵌套,如for-for嵌套,for-while嵌套或while-for嵌套等,其中使用最多的是for-for嵌套。 4. 提前結(jié)束循環(huán)。break語(yǔ)句用于提前結(jié)束循環(huán)的執(zhí)行。注意,break語(yǔ)句只能結(jié)束包含它的那一層循環(huán)。 5. 常見(jiàn)問(wèn)題的解決方法。本章介紹了計(jì)算累加和、階乘、最大最小值、判斷素?cái)?shù)、圖形輸出、Fibonacci數(shù)列等典型問(wèn)題的解決方法。,上一頁(yè),返 回,5.6 實(shí)訓(xùn),實(shí)訓(xùn)1 【實(shí)訓(xùn)內(nèi)容】while循環(huán)。 【實(shí)訓(xùn)目的】掌握while循環(huán)語(yǔ)句的使用,累加和的計(jì)算方法。 【實(shí)訓(xùn)題目】從鍵盤(pán)輸入10個(gè)整數(shù),求其累加和。程序有錯(cuò),請(qǐng)改正

38、并上機(jī)運(yùn)行調(diào)試。 #include stdio.h main() int i=1,sum,x; while (i10); ,下一頁(yè),返 回,5.6 實(shí)訓(xùn),printf(Enter a data:); scanf(%d, 舉一反三 本題目也可以用for語(yǔ)句或do-while語(yǔ)句完成,請(qǐng)用for語(yǔ)句進(jìn)行改寫(xiě)。,上一頁(yè),下一頁(yè),返 回,5.6 實(shí)訓(xùn),實(shí)訓(xùn)2 【實(shí)訓(xùn)內(nèi)容】利用循環(huán)處理字符數(shù)據(jù)。 【實(shí)訓(xùn)目的】掌握循環(huán)結(jié)構(gòu)的控制,字符數(shù)據(jù)的處理。 【實(shí)訓(xùn)題目】 為使電文保密,經(jīng)常按一定規(guī)律將其譯成密碼,收?qǐng)?bào)人再按約定的規(guī)律將其譯回原文。本次按以下規(guī)律將電文變成密碼:將字母A變成字母E,a變成e,即變成其后

39、的第4個(gè)字母,W變成A,X變成B,Y變成C,Z變成D。比如:aZyXA將譯成eDcBE。 上機(jī)運(yùn)行下面程序,記錄程序的運(yùn)行過(guò)程,然后給程序加上注釋。 #include stdio.h main( ),上一頁(yè),下一頁(yè),返 回,5.6 實(shí)訓(xùn), char c; while (c=getchar()!=n) /*從鍵盤(pán)輸入一行字符,按回車(chē)鍵結(jié)束輸入*/ if(c=a ,上一頁(yè),下一頁(yè),返 回,5.6 實(shí)訓(xùn),實(shí)訓(xùn)3 【實(shí)訓(xùn)內(nèi)容】for循環(huán)。 【實(shí)訓(xùn)目的】掌握f(shuō)or循環(huán)語(yǔ)句的使用。 【實(shí)訓(xùn)題目】計(jì)算12+34+56+99100的值。 程序已經(jīng)給出部分代碼,請(qǐng)將程序補(bǔ)充完整,然后上機(jī)運(yùn)行調(diào)試。 #include stdio.h main() int x,y; long sum=0; for(x=1,y=2;x99,y100;x+=2,y+=2) ; printf(sum=%ldn,sum); ,上一頁(yè),下一頁(yè),返 回,5.6 實(shí)

溫馨提示

  • 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)論