c語言課件第6章循環(huán)控制_第1頁
c語言課件第6章循環(huán)控制_第2頁
c語言課件第6章循環(huán)控制_第3頁
c語言課件第6章循環(huán)控制_第4頁
c語言課件第6章循環(huán)控制_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章循環(huán)控制6.1 概述6.3 用while語句實(shí)現(xiàn)循環(huán)6.4 用dowhile語句實(shí)現(xiàn)循環(huán)6.5 用for語句實(shí)現(xiàn)循環(huán)6.6 循環(huán)的嵌套6.8 break語句和continue語句6.2 goto語句以及用goto語句構(gòu)成循環(huán)6.7 幾種循環(huán)的比較6.9 程序舉例2 實(shí)現(xiàn)循環(huán)控制結(jié)構(gòu)的幾種方法:1) 用goto語句和if語句構(gòu)成循環(huán)2) 用while語句 3) 用do-while語句4) 用for語句pAYNab當(dāng)型(While型)pANabY直到型(Until型)6.1 概述循環(huán)/迭代:在滿足特定條件時,重復(fù)執(zhí)行一些操作;循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同

2、作為各種復(fù)雜程序的基本構(gòu)造單元。3main( ) inti=1,sum=0;/*初始化*/ /*i為循環(huán)變量,sum為累加結(jié)果*/ while (i=100)/*循環(huán)體*/ sum=sum+i;i+;/*使循環(huán)趨于終止*/ printf(“1+2+.+100=%d”, sum);while語句用來實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)。一般形式為:while (表達(dá)式) 語句 表達(dá)式語句非00值6.3 while 語句(i+ 100)【例6.2】 求i=1i100sum=sum+i;i=i+1;假真i=04While語句的使用中的注意事項(xiàng): 循環(huán)體中只能出現(xiàn)一個語句,若有多個操作,必須采用復(fù)合語句。如: while

3、 (i=100) sum=sum+i;i+; 在循環(huán)體中一定要有能使循環(huán)趨于終止的語句,否則會出現(xiàn)死循環(huán)。如:若i10,則while (i10) printf(“%in”, i);6.3 while 語句(2)又如:while (i=100); sum=sum+i; i+; 5do-while語句實(shí)現(xiàn)“直到型”循環(huán)語句。其一般形式為:do 語句while (表達(dá)式);main() inti,sum=0;/*初始化*/ i=1; do sum=sum+i;/*循環(huán)體*/ i+; while (i=100); printf(%d”,sum);語句表達(dá)式非00值6.4 do-while 語句【例6.

4、3】 求i=1i100sum=sum+i;i=i+1;假真【思考】這個程序怎樣的漏洞?6do-while語句和while語句的區(qū)別:執(zhí)行循環(huán)體和判斷表達(dá)式的先后順序。do-while肯定執(zhí)行循環(huán)體一次;而while語句可能不執(zhí)行循環(huán)體。【比較】 例6.2和例6.3do-while語句的使用: do-while語句結(jié)構(gòu)可以轉(zhuǎn)換成while結(jié)構(gòu),兩者的控制程序執(zhí)行流程的能力完全等價。6.4 do-while 語句(2)76.4 do-while 語句(3)【例1】將輸入的整數(shù)轉(zhuǎn)換為字符形式逆序輸出,如輸入-1234則得到4321-的輸出。main( ) /*convert int to chara

5、cters*/ int n; char ch1,ch2; scanf(“%d”,&n); if (n 0); printf(“%cn”, ch2);8 等價的while循環(huán)形式:表達(dá)式1;while (表達(dá)式2) 語句; 表達(dá)式3;其一般結(jié)構(gòu)是:for (表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句循環(huán)變量初始化 循環(huán)條件 循環(huán)變量增值 求解表達(dá)式1表達(dá)式2語句求解表達(dá)式3【例】 for(i=1;i=100;i+) sum=sum+i;真假6.5 for 語句i=1;while (i=100) sum=sum+i; i+;9for語句的使用:(各種變形) 表達(dá)式1省略:通常在for語句之前對循環(huán)變量賦

6、初值。如: i=1;for(;i=100;i+)sum=sum+i; 表達(dá)式2省略:不判斷循環(huán)條件,即表達(dá)式2永真,循環(huán)無終止(除非循環(huán)體中設(shè)法跳出,如用break、goto、return等)。如: for( i=1;i+) sum=sum+i;if (i=100) break; 表達(dá)式3省略:通常在循環(huán)體內(nèi)設(shè)法保證循環(huán)能正常結(jié)束。如: for( i=1;i=100;)sum=sum+i+; 其他變形:如使用逗號表達(dá)式、無循環(huán)體等等。如: for( i=1,sum=0;i=100 ;sum+=i, i+); 表達(dá)式1和表達(dá)式3省略:完全等同于while語句。如: i=1;for(;i100)

7、break; 6.5 for 語句(2)注意:括號內(nèi)的分號不能省略!如: for( i=100,sum=0;i=1 ;sum+=i, i-);10 表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非0,就執(zhí)行循環(huán)體?!纠鼸6_z1】輸入字符并將它們的ASCII碼相加,直到輸入一個“換行”符為止。#include main() char c; int i; for(i=0; (c=getchar()!=n); i+=c); printf(%d,i);6.5 for 語句(3)for語句的使用:(各種變形)11【例E6_z2】輸出從1.02.0,間隔0.1的各個數(shù)。

8、#include main() double x; for (x=1.0; x=2.0; x+=.1) printf(“%.1fn”,x); 6.5 for 語句(4) for語句中浮點(diǎn)型數(shù)據(jù)的使用這個程序在有些機(jī)器上運(yùn)行可能不會打印出2.0! 盡管沒有任何明顯的理由要求for循環(huán)的控制變量必須是整型,但由于浮點(diǎn)型并不是百分之百精確的,為了避免類似問題,循環(huán)控制變量最好用整型。 除了for循環(huán),其它一些情況下同樣需要警惕比較浮點(diǎn)型數(shù)據(jù)可能引發(fā)的問題。for (x=10; x=20; x+=1) printf(“%.1fn”,x/10.0);126.5 for 語句(5)for 語句與其他語言中

9、的for有不同的地方三個表達(dá)式都可以是任意的表達(dá)式循環(huán)變量和循環(huán)條件可在循環(huán)體內(nèi)修改循環(huán)變量的值在循環(huán)結(jié)束時仍保持著盡管C語言的for語句功能比其它語言要強(qiáng),使用上也更靈活,但若是過分地利用它的這些特性會使for語句顯得雜亂,可讀性降低。136.6 循環(huán)的嵌套循環(huán)的嵌套:一個循環(huán)體中又包含另一個完整的循環(huán)結(jié)構(gòu)。“外層循環(huán)”與“內(nèi)層循環(huán)”三種循環(huán)可以互相嵌套(見P121)內(nèi)嵌的循環(huán)結(jié)構(gòu)一定要是完整的!不允許出現(xiàn)循環(huán)體交叉現(xiàn)象?!纠鼸6_z3】輸出九九乘法表#include main() int i,j; for (i=1; i=9; i+) for (j=1; j=9; j+) printf(%

10、8d,i*j); printf(n); 【思考】如何修改使其只輸出矩陣的上三角或下三角部分?146.8 break語句和continue語句break語句的一般形式:break;break語句的功能:在switch語句中使用,使流程跳出switch結(jié)構(gòu),繼續(xù)執(zhí)行switch語句下面的語句。在for、while或do-while語句使用,使流程從循環(huán)體內(nèi)跳出,即提前結(jié)束循環(huán)語句,接著執(zhí)行循環(huán)語句下面的語句。【例】計(jì)算圓的面積,當(dāng)面積不大于100時輸出。 for(r=1; r100) break;/*面積大于100,跳出循環(huán)*/ printf (“%dn”, area); 程序流程圖見P123 圖

11、6-10156.8 break語句和continue語句(2)continue語句的一般形式:continue;ocntinue語句的功能:在for、while或do-while語句使用,用于結(jié)束本次循環(huán)體的執(zhí)行,即跳過循環(huán)體中該語句之后尚未執(zhí)行的語句,直接進(jìn)入下一次是否執(zhí)行循環(huán)體的判斷?!纠枯敵?00200之間不能被3整除的所有整數(shù) for ( n=100;n=200;n+) if (n%3=0) continue;/*若n能被3整除,則不輸出*/ printf (%d”, n); 166.8 break語句和continue語句(3)continue 語句與break語句的區(qū)別: con

12、tinue 語句只是結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。 break語句結(jié)束整個循環(huán)過程。【例】 對比P123的圖610與圖611176.2 goto語句goto語句為無條件轉(zhuǎn)向語句。其一般形式為:goto 語句標(biāo)號;main() /*求1+2+3+.+100,i為循環(huán)控制變量,sum為累加和*/ int i,sum=0;/*初始化*/ i=1; loop: if (i=100)/* loop為標(biāo)號 */ sum=sum+i; i+; goto loop; /*goto語句*/ printf(%d”,sum); 無條件標(biāo)識符【例6.1】用if語句和goto語句構(gòu)成循環(huán),求/* 實(shí)現(xiàn)了“當(dāng)型

13、”循環(huán)結(jié)構(gòu) */i=1i100sum=sum+1;i=i+1;假真 語句標(biāo)號是任意合法標(biāo)識符后面加一個:,放置在C語句之前。18goto語句使用:goto 和標(biāo)號的配合,與if語句一起構(gòu)成循環(huán)結(jié)構(gòu)。goto 和標(biāo)號的配合,可以從循環(huán)體中跳轉(zhuǎn)到循環(huán)體外(亦可由break語句和continue語句實(shí)現(xiàn),詳見6.8節(jié)),如:6.2 goto語句(2)for (i = 300; i = 400; i+) for (j = 1; j*j = i; j+) if (j*j = i) goto found; /*找到共同元素*/printf(“300400中無完全平方數(shù)n”); /* 沒找到處理 */got

14、o after;found: printf(“%d*%d=%dn”, j,j,i); /*找到后的處理*/after: 使用goto的程序總能找到替代,往往只需增加一些變量和測試。思考 此處能不能用break語句代替?why?found = 0;for (i=300; i=400 & !found; i+) for (j = 1; j*j = i & !found; j+) if (j*j = i) found = 1;if (found) printf(“%d*%d=%dn”, j-1,j-1,i-1);else printf(“300400中無完全平方數(shù)n”);196.2 goto語句(3

15、)在一些特定的情況下,使用goto使程序變得比較精練?!纠吭诔绦蛐枰獜暮苌畹那短字刑D(zhuǎn)出來時,用goto更簡練些。 for( . ) for( . ) for( . ) . if () goto error; . error: 【注意】break語句只能用于跳出包含它的這一層循環(huán)!206.2 goto語句(4)對于goto來說,標(biāo)號的可見范圍是一個函數(shù)內(nèi)部。使用goto語句的缺點(diǎn):容易使程序流程顯得雜亂、無規(guī)律,破壞程序的結(jié)構(gòu)化,降低可讀性。結(jié)構(gòu)化程序設(shè)計(jì)一般主張限制goto語句的使用!【注意】goto語句不是必需的,為使程序有良好的結(jié)構(gòu), 應(yīng)盡量避免使用goto!216.7 幾種循環(huán)的比較

16、4種循環(huán)在流程控制能力上是相同的,一般情況下可以互相代替,但通常不提倡使用goto來實(shí)現(xiàn)循環(huán)。在循環(huán)實(shí)現(xiàn)細(xì)節(jié)上的差異:循環(huán)變量初始化操作:while和do-while循環(huán)必須在語句之前完成,而for循環(huán)可以在表達(dá)式1中實(shí)現(xiàn);使循環(huán)趨向于結(jié)束的操作:while和do-while循環(huán)應(yīng)在循環(huán)體內(nèi)包含這類語句,而for循環(huán)可以在表達(dá)式3中實(shí)現(xiàn),甚至將這個循環(huán)體都放到表達(dá)式3中;break語句和continue語句的使用:while、do-while和for循環(huán)中均可使用,但用goto實(shí)現(xiàn)的循環(huán)中不能使用break和continu來控制其執(zhí)行流程。226.7 幾種循環(huán)的比較(2)四種循環(huán)中,for循環(huán)

17、和while循環(huán)的使用率最高。用while循環(huán)還是for循環(huán),主要根據(jù)個人的愛好,但一般在不用初始化和重修改變量時用while循環(huán)比較恰當(dāng),如:while (c = getchar( ) = | c = n | c = t);反之,使用for更好些,如:for (i = 0; i n; i+) ;23如何寫好循環(huán)?首先需要發(fā)現(xiàn)計(jì)算過程中可能需要(應(yīng)該使用)循環(huán)。 How?在分析問題時,注意識別出計(jì)算過程中重復(fù)執(zhí)行的類似動作(重復(fù)性計(jì)算)。重要線索一批可按統(tǒng)一規(guī)律計(jì)算的數(shù)據(jù);需要對一系列類似數(shù)據(jù)做同樣的處理;需要反復(fù)從一個結(jié)果算出另一個結(jié)果,等等。如果重復(fù)次數(shù)較多,或是重復(fù)的次數(shù)無法確定,就應(yīng)考

18、慮用循環(huán)結(jié)構(gòu)描述。然后需要考慮和解決許多具體問題:循環(huán)中涉及哪些變量?循環(huán)開始前應(yīng)該賦給它們什么初值?循環(huán)體中應(yīng)該如何修改它們?在什么情況下應(yīng)該繼續(xù)(或終止)循環(huán)?循環(huán)終止后如何得到所需要的結(jié)果?24循環(huán)中的幾種變量循環(huán)控制變量(簡稱循環(huán)變量)在循環(huán)開始之前設(shè)置初始值,每次循環(huán)執(zhí)行時遞增/減一個固定值,直到其值達(dá)到/超過某個界限時循環(huán)結(jié)束??刂浦h(huán)的進(jìn)行和結(jié)束,使之成為具有有限執(zhí)行次數(shù)的循環(huán)。累積變量在每次循環(huán)執(zhí)行中被更新,其更新常常可以用“+=”或“*=”一類運(yùn)算符來描述。循環(huán)開始之前的初值通常置為相應(yīng)運(yùn)算的0元。循環(huán)結(jié)束時所保存的值(終止值)即為循環(huán)計(jì)算的最終結(jié)果。遞推變量(循環(huán)變量和累

19、積變量都是其中的特例)在循環(huán)中互相協(xié)調(diào)工作的多個變量,它們亦步亦趨,每次循環(huán)均通過其中一個或幾個算出另一個或幾個新值,然后按某種順序更新各個變量。25控制循環(huán)的進(jìn)行和終止的典型方法通過計(jì)數(shù)器控制循環(huán)用結(jié)束標(biāo)志控制循環(huán)特定的條件、標(biāo)志值等等根據(jù)輸入控制循環(huán)輸入的數(shù)據(jù)、輸入函數(shù)的返回值等等26#include void main() long int f1,f2,f3; int i; f1=1,f2=1; pirntf(“%12ld %12ld”,f1,f2); for (i=3; i=40; i+) f3=f1+f2; pirntf(“%12ld ”,f3); if (i%4=0) printf

20、(“n”); f1=f2; f2=f3; 6.9 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例(2)【P125 例6.7】求Fibonacci數(shù)列前40個數(shù)。f1=1,f2=1輸出f1,f2for i=3 to 40f3=f1+f2輸出f3f1=f2,f2=f3#include void main() long int f1,f2; int i; f1=1,f2=1; for (i=1; i=20; i+) pirntf(“%12ld %12ld”,f1,f2); if (i%2=0) printf(“n”); f1=f1+f2; f2=f2+f1; f1=1,f2=1for i=1 to 20輸出f1,f2f1=f

21、1+f2f2=f2+f127例:文件復(fù)制(K & R,P10)功能:把輸入復(fù)制到輸出(一次一個字符)讀入一個字符當(dāng)該字符不是文件結(jié)束符時輸出該字符讀入下一個字符版本2:main( ) int c; while (c = getchar( ) != EOF) putchar(c);版本1:main( ) int c; c = getchar( ); while (c != EOF) putchar(c); c=getchar( );28例:字符計(jì)數(shù)(K & R,P12)功能:統(tǒng)計(jì)輸入的字符數(shù)版本2:main( ) long nc; for (nc = 0; getchar( ) != EOF;

22、+nc); printf(“%ldn”,nc);版本1:main( ) long nc; nc = 0; while (getchar( ) != EOF) +nc; printf(“%ldn”,nc);29例:行計(jì)數(shù)(K&R,P13)功能:計(jì)算輸入中的行數(shù)(每行均以換行符結(jié)束)main( ) int c, nl; nl = 0; while (c = getchar( ) != EOF) if (c = n) +nl; printf(“%dn”,nl);303.5.6 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例(3)【例E6_x4】按數(shù)字符號、空白符號和其它符號三個類別,統(tǒng)計(jì)輸入字符串中各個類別的字符個數(shù),直到用

23、戶結(jié)束輸入(EOF)為止。# include main( )int c,I,nwhite,nother,ndigit;nwhite=nother=ndigit=0;while ( (c=getchar( ) != EOF )if ( c= 0 & c=9 )+ndigit;else if ( c= | c=n | c=t )+nwhite;else +nother;printf( digits = %d, ndigit ); printf( , white space = %d , other = %d n, nwhite, nother );+Nother+Nwhite輸出Ndigit,Nw

24、hite,Nother讀入c是 c為空白 否+Ndigit是 c為數(shù)字 否當(dāng)c!=EOF時讀入cNwhite=Nother=Ndigit=0switch (c) case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:+ndigit; case : case n: case t:+nwhite; default: +nother;31例:單詞計(jì)數(shù)(K&R,P14)功能:統(tǒng)計(jì)行數(shù)、單詞數(shù)與字符數(shù)(單詞指任何其中不包含空格、制表符或換行符的字符序列)#include #define IN 1 /*

25、在單詞內(nèi)*/#define OUT 0 /*在單詞外*/main( ) int c, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; while (c = getchar( ) != EOF) +nc; if (c = n) +nl; if (c = | c = n | c = t) state = OUT; else if (state = OUT) state = IN; +nw; printf(“%d %d %dn”, nl, nw, nc);326.9 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例(3)【P126 例6.8】判斷m是否為素?cái)?shù)。main( ) int m, i; char flag; scanf(“%d”,&m); for (i=2,flag=0; im; i+) if (m%i = 0) flag = 1; break

溫馨提示

  • 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

提交評論