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

下載本文檔

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

文檔簡介

1、第5章 循環(huán)結(jié)構(gòu)程序設(shè)計,概述 計算機(jī)解題過程中,經(jīng)常遇到要編制循環(huán)結(jié)構(gòu)的情況, 大量問題均離不開循環(huán)結(jié)構(gòu) 如求: 1+2+3+.+100 sinx = x -,x3 x5 x7,3!,5!,7!,+ ,準(zhǔn)備部分,工作部分,控制部分,準(zhǔn)備部分,控制部分,工作部分,修改部分,出循環(huán),出循環(huán),N,Y,N,修改部分,Y,兩種循環(huán)結(jié)構(gòu):,左邊是先執(zhí)行后判斷 右邊是先判斷后執(zhí)行,循環(huán)語句 while 語句 格式: while (表達(dá)式) 語句 功能: 當(dāng)表達(dá)式為非0值時,執(zhí)行while語句中的內(nèi)嵌語句。其特點(diǎn)是: 先判斷表達(dá)式,后執(zhí)行語句。,表達(dá)式值非 0,語句,編程: 求1+2+3+100的值 mai

2、n() int i=1, sum=0; /* 準(zhǔn)備部分 */ while (i =100) /* 控制部分 */ sum=sum+ i; /* 工作部分 */ i=i+1; /* 修改部分 */ printf (sum = %d n, sum); printf (i = %d n, i ); ,說明: 1) 循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn)。 2) 在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。如果無此語句,則i的值始終不改變,循環(huán)永不結(jié)束。即形成了死循環(huán)。,do while 語句 格式: do 語句 while (表達(dá)式 ) ; 功能:先執(zhí)行一次指定的循環(huán)體語句,

3、然后判別表達(dá)式,當(dāng)表達(dá)式的值為非零時,返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達(dá)式的值等于0為止,此時循環(huán)結(jié)束。,表達(dá)式值不為0,語句,main( ) int i=1, sum=0; do sum=sum+i; i=i+1; while (i=100); printf(sum=%dn, sum); printf(i=%dn, i); ,while語句和do-while語句的比較: 在一般情況下,用while語句和用do-while語句處理同一問題時,若二者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。但是如果while后面的表達(dá)式一開始就為假(0值)時,兩種循環(huán)的結(jié)果是不同的。,while 與 do

4、 while區(qū)別 i10 時不同,main() int sum=0, i; scanf(%d, ,main() int sum=0,i; scanf(%d, ,main() int c; while(c=getchar()!=n) putchar(c); ,將輸入的字符原樣輸出,main() int c; c=getchar(); while(c!=n) putchar(c); c=getchar(); ,例:用 0.1mm 厚紙對折, 對折多少次后其厚度超過地球直徑 (12742公里) main() int n=1; float ans ; ans=2*1e-7; while(ans=127

5、42) n=n+1; ans=ans*2; printf(n=%d, ans=%f n, n, ans); getch(); ,運(yùn)行結(jié)果: n=37,ans=13743.895347,求:框里數(shù)字(19):111111=111*11* 1,運(yùn)行結(jié)果: i=9,main() long int i=1, ans; ans=111*11*(i*10+1); while(111111 != ans) i+; ans=111*11*(i*10+1); printf(i=%dn, i) ; ,main() long int i=1, ans; do ans=111*11*(i*10+1); i+; whi

6、le(111111 != ans); printf(i=%dn, i-1); ,運(yùn)行結(jié)果: i =9,設(shè)有一階梯,每步階,最后余階;每步階,最后余階;每步階,最后余階;每步階,最后余階;每步階,正好到樓頂。問共有多少階梯。,main( ) int ladders=7; while (ladders%3!=2 | ladders%5!=4 | ladders%6!=5) ladders+=14; printf(%dn, ladders); ,求兩個非負(fù)整數(shù)u和v 的最大公因子(即最大公約數(shù))。,main() int a,b,i; printf(please enter 2 integers:);

7、 scanf(%d,%d, ,for語句 格式: for (; ; ) 語句,C語言中的for語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。,表達(dá)式1,表達(dá)式2值非0?,語句,表達(dá)式3,Y,下一語句,N,等價于: 表達(dá)式1; while (表達(dá)式2) 語句; 表達(dá)式3; ,for語句最簡單最常用的應(yīng)用形式: for (循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 如: for(i=1;i=100;i+) sum=sum+i; 相當(dāng)于: i=1; while (i=100) sum=sum+i; i+; ,f

8、or語句的一般形式中的“表達(dá)式1”可以省略,此時應(yīng)在for語句之前給循環(huán)變量賦初值。注意省略表達(dá)式1時,其后的分號不能省略。如: for(; i=100; i+) sum=sum+i; 執(zhí)行時,跳過“表達(dá)式1” ,其他不變。,若省略表達(dá)式2,即不判斷循環(huán)條件,即認(rèn)為表達(dá)式2始終為真。如: for(i=1; ;i+) sum=sum+i; 相當(dāng)于: i=1; while(1) sum=sum+1; i+; ,為避免死循環(huán),應(yīng)加上 if (i100) break;,表達(dá)式3也可以省略,但此時應(yīng)保證循環(huán)能正常結(jié)束。如: for (i=1;i=100;) sum=sum+i; i+; 此時由于省略表達(dá)

9、式3,而將語句i+; 作為循環(huán)體的一部分,效果是一樣的,都能使循環(huán)正常結(jié)束。,可以同時省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,即只給循環(huán)條件。如: for(;i=100;) while(i=100) sum=sum+i; sum=sum+i; i+; i+; 在這種情況下,完全等同于while語句??梢奻or語句比while語句功能強(qiáng),除了可以給出循環(huán)條件外,還可以賦初值,使循環(huán)變量自動增值等。,也可以將3個表達(dá)式都省略,如: for(; ;) 語句 相當(dāng)于 while(1) 語句 即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真值),循環(huán)變量不增值。此時應(yīng)在循環(huán)體中設(shè)置退出循環(huán)的語句。,表達(dá)式1可以是

10、設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。如: for (sum=0;i=100;i+) sum=sum+i; 表達(dá)式3也可以是與循環(huán)控制無關(guān)的任意表達(dá)式。如: for (sum=0;i=100;sum+) i+;,表達(dá)式1和表達(dá)式3可以是一個簡單的表達(dá)式,也可以是逗號表達(dá)式,即包含一個以上的簡單表達(dá)式,中間用逗號間隔。如: for (sum=0,i=1; i=100; i+) sum=sum+i; 或 for (i=0,j=100; i=j; i+,j-) k=i+j;,表達(dá)式2一般是關(guān)系表達(dá)式(如i=100)或邏輯表達(dá)式(如ab 在表達(dá)式2中先從終端接收一個字符賦給

11、c,然后判斷此字符是否非n,如果非n,就執(zhí)行循環(huán)體。此for語句的循環(huán)體為空語句,把本來要在循環(huán)體內(nèi)處理的內(nèi)容放在表達(dá)式3中。,for( ;(c=getchar()!=n;) printf(“%c”,c); for語句中只有表達(dá)式2,而無表達(dá)式1和表達(dá)式3。其作用是讀入一個字符后即輸出該字符,直到輸入一個“換行”為止。,運(yùn)行情況: ComputerComputer,請注意,從終端鍵盤向計算機(jī)輸入時,是在按Enter鍵以后才將一批輸入數(shù)據(jù)一起送到內(nèi)存緩沖區(qū)中去的。,main() int i=1, sum=0; for (; i=100; i+) sum += i; printf(sum=%dn,

12、 sum); 省略表達(dá)式1,求: 1 + 2 + 3 + + 100的值,main ( ) int i, sum; for (i=1, sum=0; i=100; i+) sum+= i; printf(sum=%dn, sum); main() int i, sum; for (i=1, sum=0; i=100; sum+=i, i+); printf(sum=%dn, sum); ,使用逗號表達(dá)式,驗證素數(shù) int prime(int n) int m; for (m=2;m=n/2;m+) if (n%m=0) return(0); return(1); main() int i; s

13、canf(%d, ,說明 1. 用計數(shù)法設(shè)置循環(huán)時,要特別留心循環(huán)變量的“邊界值”。 2. 要使循環(huán)體最終能結(jié)束,應(yīng)當(dāng)在表達(dá)式3中或在循環(huán)體中存在改變條件表達(dá)式的值的操作。 3. 循環(huán)體內(nèi)如果包含一個以上的語句,應(yīng)該使用花括號,以復(fù)合語句形式出現(xiàn)。,break和continue break-退出switch語句或當(dāng)前循環(huán) continue-結(jié)束本次循環(huán),接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定. while(表達(dá)式1) if (表達(dá)式2) continue; if (表達(dá)式3) break; ,計算100以內(nèi)的圓面積 main() int r; float pi=3.14159,area; for(r

14、=1;r100) break; printf(r=%d, area=%fn, r, area); ,輸出100200之間不能被3整除的數(shù)。 main() int n; for (n=100;n=200;n+) if (n%3=0)continue; printf(%d ,n); ,多重循環(huán) 一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu)稱為循環(huán)的嵌套,即多重循環(huán)。 三種循環(huán)結(jié)構(gòu)(while循環(huán)、do-while循環(huán)和for循環(huán))可以互相嵌套。 注意: 結(jié)構(gòu)之間僅可嵌套, 不可交叉,不允許:,允許:,例: 編程并輸出乘法表 main() int i,j; for(i=0; i=9; i+) for(j=

15、1; j=9; j+) printf(%d*%d=%2d , i, j, i*j ); if (j=9) printf(n); ,運(yùn)行結(jié)果: 1*1= 1 1*2= 2 1*9= 9 9*1= 9 2*9=18 9*9=81,打印乘法表 1 2 3 4 5 6 7 8 9 - 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49

16、 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 1: 打印表頭 2: 打印隔線 3: 打印表體,main( ) int i, j; for (i=1;i=9; i+) printf(%4d,i); printf(n); for (i=1;i=40;i+) printf(%c,-); printf(n); for (i=1; i=9;i+) for (j=1;j=9;j+) printf(%4d, i*j); printf(n); ,打印隔線,打印表體,打印表頭,36塊磚,36人搬;男4,女3,兩個小孩抬一塊。求一次搬完,需男

17、、女、小孩個若干? main() int men=0,women,children; while(men=8) women=0; while (women=11) children=36-women-men; if (4.0*men+3.0*women+children/2=36) printf(nmen is %d,men); printf(t women is %d, women); printf(t children is %dn, children); women+; men+; ,例: 鍵入1個正整數(shù), 求這個數(shù)的階乘 main ( ) int num, i1; long int t

18、; scanf(%d, ,運(yùn)行結(jié)果: 3 ans=9,for (t=1; i1=1; i1=num;) t=t*i1; i1+; ,t=1; i1=1; do t=t*i1; i1+; while (i=num);,例: 求A, B, 使 AB-BA=45 成立 main() int a, b, k, ans=45; for (a=1; a10; a+) for (b=0; b10; b+) k=(10*a+b)-(b*10+a); if (k=ans) printf(a=%d, b=%d n, a, b); ,窮舉法,例: 求 A,B,C, 使 ABC+BCC=532 成立 main() i

19、nt a, b, c, k, ans=532; for (a=0; a10; a+) for (b=0; b10; b+) for (c=0; c10; c+) k=(100*a+10*b+c)+(b*100+c*10+c); if (k=ans) printf(a=%d,b=%d,c=%dn,a,b,c); ,窮舉法,例.編程產(chǎn)生 main() int i, j; for (i=2; i5; i+) for (j=2; j5; j+) printf(%2d , i*j); if (j=5) printf(n); ,4 6 8 6 9 12 8 12 16,計算水仙花數(shù) (如:153=1*1*1+5*5*5+3*3*3) main() int i, j, k, n; for (n=100; n1000; n+) i=n/100; j=n/10 - i*10; k=n%10; if (i*100+j*10+k=i*i*i+j*j*j+k

溫馨提示

  • 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

提交評論