C語言程序設計教程循環(huán)結構程序設計(精)_第1頁
C語言程序設計教程循環(huán)結構程序設計(精)_第2頁
C語言程序設計教程循環(huán)結構程序設計(精)_第3頁
C語言程序設計教程循環(huán)結構程序設計(精)_第4頁
C語言程序設計教程循環(huán)結構程序設計(精)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 循環(huán)結構程序設計 北京科技大學 計算機系C 語言程序設計1本章主要內(nèi)容while循環(huán)控制do-while循環(huán)控制for循環(huán)控制用goto語句實現(xiàn)循環(huán)控制循環(huán)結構中的跳轉語句循環(huán)的嵌套循環(huán)結構程序設計舉例25.1 while循環(huán)控制 語句一般格式 while (表達式) 語句 一般為關系表達式或邏輯表達式,也可以是C語言其他類型的合法表達式 用來控制循環(huán)體是否執(zhí)行稱為內(nèi)嵌語句,可以是基本語句、控制語句,也可以是復合語句是循環(huán)重復執(zhí)行的部分 3功能: 計算表達式的值,為非0(邏輯真)時,重復執(zhí)行內(nèi)嵌語句,每執(zhí)行一次,就判斷一次表達式的值,直到表達式的值為0 時結束循環(huán),轉去執(zhí)行while后

2、面的語句。 當表達式為真 語句N-S結構圖NY流程圖表達式非0?語句循環(huán)控制條件循環(huán)體4例如:【例】編寫程序,求100個自然數(shù)的和即: s=1+2+3+ +100 思路:尋找加數(shù)與求和的規(guī)律 加數(shù)i從1變到100,每循環(huán)一次,使i增1,直到i的值超過100。i的初值設為1。求和設變量 sum 存放和,循環(huán)求sum=sum+i,直至i超過100。 5算法和程序:main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum);運行jc5_1程序輸出結果:sum=5050i: 循環(huán)控制變量sum: 累加器

3、 i=1,sum=0 當i = 100 sum=sum+i i+輸出sum6注意: 如果while的 (表達式) 值為0,則循環(huán)體一次也不執(zhí)行 (例如當i的初值=101) 。在循環(huán)體中必須有使循環(huán)趨向結束的操作,否則循環(huán)將無限進行(死循環(huán))。 在循環(huán)體中,語句的先后位置必須符合邏輯,否則會影響運算結果。 思考程序段的輸出? while (i=100) i+; sum=sum+i; 運行后,輸出:sum=5150原因是什么? 7注意(續(xù)):為了保證循環(huán)正常運行,應該特別注意: 循環(huán)控制條件的描述 控制條件的初始狀態(tài)(初始值) 循環(huán)體內(nèi)部對控制條件的影響85.2 do-while語句語句一般格式

4、do 語句 while (表達式); 功能:先執(zhí)行內(nèi)嵌語句(循環(huán)體),之后計算表達式的值,不為0(邏輯真)時,再執(zhí)行循環(huán)體并判斷條件,直到表達式的值為 0 結束循環(huán),轉去執(zhí)行while下面的語句。9 do-while循環(huán)的算法 循環(huán)體當表達式為真N-S結構圖NY循環(huán)體表達式非0?流程圖main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);用do-while語句求100個自然數(shù)的和 10說明: while和do-while都能實現(xiàn)循環(huán)控制,while結構程序通常都可以轉換成do-while結構區(qū)別:do-

5、while 語句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次; while 語句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行dowhile循環(huán)體中一定要有能使表達式值趨于0的操作(如i+),否則會出現(xiàn)死循環(huán)。 11do-while語句的簡單應用 【例】用輾轉相除法求m和n的最大公約數(shù)定義m、n、rmnT F m和n交換r=m%nm=nn=r 當r != 0時輸出最大公約數(shù)m12算法和程序:main( ) int m,n,r; scanf(%d, %d,&m,&n); if (mn) r=m; m=n; n=r; do r=m%n; m=n; n=r; while(r!=0); printf(

6、%dn,m); 運行jc5_3程序運行情況如下:24, 6012135.3 for語句 語句一般格式 for (表達式1;表達式2;表達式3) 語句 功能:計算表達式1的值,再判斷表達式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語句(循環(huán)體),并計算表達式3;之后再去判斷表達式2,一直到其值為0時結束循環(huán),執(zhí)行后續(xù)語句。循環(huán)初始條件循環(huán)控制條件循環(huán)體14for語句的算法N-S結構圖for (表達式1;表達式2;表達式3) 語句NY流程圖計算表達式1 語句計算表達式3表達式2為真?例如:main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+

7、i; printf(sum=%dn,sum);可部分或全部省略,但“;”不可省略15省略for語句的表達式 表達式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),會無限循環(huán)(死循環(huán))注意:在省略某個表達式時,應在適當位置進行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行 省略表達式1和表達式3,即: for(;表達式2;) 就等同于:while( 表達式2 ) 省略表達式2,即: for(表達式1; ;表達式3) 就等同于:表達式1; while(1)表達式3;16例如: i=1; for ( ; i100) for (i=1; i100) i+; 17說明:所有用 w

8、hile 語句實現(xiàn)的循環(huán)都可以用for 語句實現(xiàn)。 等價于:for(表達式1;表達式2 ;表達式3) 語句;表達式1;while (表達式2) 語句; 表達式3; 18for語句的簡單應用【例】求n! ,即計算p=123n的值。 思路:求階乘與求累加的運算處理過程類似,只要將“+”變?yōu)椤?”。設置:乘數(shù)i ,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入)累乘器 p ,每次循環(huán)令p = p*i19程序:main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d,&n); for (i=1; i=n; i+) p = p * i; p

9、rintf(p = %ld n,p);思考:如何輸出1!, 2!, , n! ?如何求s =1!+ 2!+ + n! ? 運行jc5_420熟悉幾個循環(huán)語句while (!x) x+; 當 x=0 時,執(zhí)行循環(huán)體x+; while (c=getchar( ) != n) n=n+1; n 稱為計數(shù)器,作用是統(tǒng)計輸入字符的個數(shù)while (num+5); 先執(zhí)行循環(huán)體x*=-3,再判斷條件(x5) for (n=0; n26; n+) printf(%c , n+A); 作用是輸出26個大寫字母for (sum=0, i=1; i=100; sum=sum+i, i+=2) ;作用是計算100以

10、內(nèi)的奇數(shù)和 21幾種循環(huán)語句的比較while和do-while語句的表達式只有一個,for語句有三個。while 和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件。while語句多用于循環(huán)次數(shù)不定的情況do-while語句多用于至少要運行一次的情況for語句多用于要賦初值或循環(huán)次數(shù)固定的情況225.4 用goto語句實現(xiàn)循環(huán)有興趣的同學自學不提倡使用goto語句注意:goto語句能實現(xiàn)程序無條件轉移,為編程提供了便利。但是無限制地使用,會破壞程序的結構化程度。因此應限制使用。235.5 循環(huán)結構中的跳轉語句有如下三種語句實現(xiàn)跳轉:continue語句break

11、語句goto語句在循環(huán)語句的循環(huán)體中使用,可以進行循環(huán)的流程控制24后續(xù)語句continue; YN表達式?后續(xù)語句continue;表達式?YN5.5.1 continue語句及應用 功能:中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行的語句),立即開始執(zhí)行下一次循環(huán)。while語句do-while語句后續(xù)語句計算表達式3計算表達式1continue;表達式2?YNfor語句25例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) continue; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (

12、x0) continue; s+=x; n+; while (n10); for (n=0,s=0; n10; n+) scanf(%d,&x); if (x0) continue; s+=x; 26應用舉例 【例】把100200之間能被7整除的數(shù),以十個數(shù)為一行的形式輸出,最后輸出一共有多少個這樣的數(shù)。 for (n=100; n=200; n+) n能被7整除 T F 終止本次循環(huán) 輸出n 輸出10個數(shù) T F 換行27算法和程序main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) continue; printf(%6d,n); j+; i

13、f (j%10=0) printf(n); printf( n j=%dn,j); 運行jc5_728后續(xù)語句break;YN表達式?后續(xù)語句break;表達式?YN5.5.2 循環(huán)中break的應用功能:利用break語句能夠強迫終止本層循環(huán),轉到后續(xù)語句執(zhí)行。while語句do-while語句后續(xù)語句計算表達式3計算表達式1break;表達式2?YNfor語句29例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) break; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) break

14、; s+=x; n+; while (n10); for (n=0,s=0; n10; n+ ) scanf(%d,&x); if (x0) break; s+=x; 305.6 循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語句,則稱為循環(huán)的嵌套例如: #include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (j=i)?%4dn:%4d,i*j); 運行jc5_a外循環(huán)語句內(nèi)循環(huán)語句31注意:while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。多重

15、循環(huán)程序執(zhí)行時,外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。例如:for(a=1;a=10;a+) for (b=0;b2)fn= 設變量f1、f2和f3,并為f1和f2賦初值1,令f3=f1+f2得到第3項;將f1f2, f2f3,再求f3=f1+f2得到第4項;依此類推求第5項、第6項這是一種遞推算法應采用循環(huán)實現(xiàn)33算法和程序#define N 20main( ) int i,f1,f2,f3; f1=f2=1; printf(n%8d%8d,f1,f2); for (i=3; i=N; i+) f3=f1+f2; f1=f2; f2=f3; printf(%8d,f3); if (

16、i%5=0) printf(n); f1=1,f2=1并輸出for (i=3; i=20; i+) f3=f2+f1 f1=f2,f2=f3 輸出f3 輸出5個數(shù) T F 換行運行jc5_534舉例2【例】判斷輸入的某個數(shù)m是否為素數(shù)。若是素數(shù),輸出“YES”,若不是,輸出“NO”。 思路:素數(shù)是指只能被1和它本身整除的數(shù),如5、7、11、17、等。 分別用2、3、,m-1嘗試能否整除整數(shù)m。如果m能被某個數(shù)整除,則m就不是素數(shù)。這是一種窮舉算法設除數(shù)為j,從2循環(huán)到m-135算法和程序:#include math.hmain( ) int j,m,k; printf(Enter an int

17、eger number: ); scanf(%d,&m); for (j=2; j=m) printf(YESn); else printf(NOn); 輸入一個數(shù)mfor (j=2; j=m T F輸出YES“ 輸出NO運行jc5_1236程序的優(yōu)化對于窮舉法來說,為了提高程序的效率,就要減少嘗試次數(shù)。#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m); k=sqrt(m); for (j=2; j=k+1) printf(YESn); else printf(NOn);思考:如何

18、輸出100200中所有的素數(shù) 37舉例3【例】用牛頓迭代法求方程 2x3+4x2-7x-6=0 在附近的根。 思路:設xn為一個接近xa的近似根,過(xn, f(xn) 點做切線,切線方程為:即:xnxn+1xy0f(x)(xn, f(xn)(xn+1, f(xn+1) xa 方程的根牛頓迭代公式 38算法基本步驟: 先設一個方程近似根x0,求出方程f的值和方程導數(shù)f1的值;f=2x03+4x02-7x0-6f1=6x02+8x0-7 用迭代公式x=x0-f/f1進行迭代,求出x比x0要接近方程真實的根; 當|x-x0|大于某個很小的數(shù)時(如10-6),認為未找到,此時將xx0,再次求f、f1

19、,并迭代,又求出一個新的更接近方程根的x; 一直到 |x-x0|10-6時得到方程近似根:x或x0。這是一種迭代算法用循環(huán)實現(xiàn)39算法和程序:#include math.hmain( ) float x,x0,f,f1; ; do x0=x; f=2*x0*x0*x0+4*x0*x0-7*x0-6; f1=6*x0*x0+8*x0-7; x=x0-f/f1; while(fabs(x-x0)1e-6); printf(%fn,x);x賦初值x0=x計算f計算f1 計算x=x0-f/f1當 |x-x0|10-6時輸出x運行jc5_1340舉例4【例】編程序求210000以內(nèi)的完全數(shù)。 完全數(shù):一個數(shù)的因子(除了這個數(shù)本身)之和等于該數(shù)本身。思路:設定i從2變到10000,對每個i找到其因子和s;判定 is?若相等,則i為完全數(shù),否則不是。 例如

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論