C語(yǔ)言程序設(shè)計(jì)第5章.ppt_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)第5章.ppt_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)第5章.ppt_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)第5章.ppt_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)第5章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩39頁(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)介

第5章 循環(huán)結(jié)構(gòu)程序設(shè)計(jì),西南大學(xué) 計(jì)算機(jī)系,C 語(yǔ)言程序設(shè)計(jì),2019/7/14,2,本章主要內(nèi)容,while循環(huán)控制 do-while循環(huán)控制 for循環(huán)控制 用goto語(yǔ)句實(shí)現(xiàn)循環(huán)控制 循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語(yǔ)句 循環(huán)的嵌套 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例,2019/7/14,3,5.1 while循環(huán)控制,語(yǔ)句一般格式 while (表達(dá)式) 語(yǔ)句,一般為關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是C語(yǔ)言其他類型的合法表達(dá)式 用來(lái)控制循環(huán)體是否執(zhí)行,稱為內(nèi)嵌語(yǔ)句,可以是基本語(yǔ)句、控制語(yǔ)句,也可以是復(fù)合語(yǔ)句 是循環(huán)重復(fù)執(zhí)行的部分,2019/7/14,4,功能:,計(jì)算表達(dá)式的值,為非0(邏輯真)時(shí),重復(fù)執(zhí)行內(nèi)嵌語(yǔ)句,每執(zhí)行一次,就判斷一次表達(dá)式的值,直到表達(dá)式的值為0 時(shí)結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while后面的語(yǔ)句。,循環(huán)控制條件,循環(huán)體,2019/7/14,5,例如:,【例5.1】編寫程序,求100個(gè)自然數(shù)的和 即: s=1+2+3+ +100,思路:尋找加數(shù)與求和的規(guī)律,加數(shù)i從1變到100,每循環(huán)一次,使i增1,直到i的值超過(guò)100。i的初值設(shè)為1。 求和設(shè)變量 sum 存放和,循環(huán)求sum=sum+i,直至i超過(guò)100。,2019/7/14,6,算法和程序:,main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(“sum=%dn“,sum); ,運(yùn)行jc5_1,程序輸出結(jié)果: sum=5050,i: 循環(huán)控制變量 sum: 累加器,2019/7/14,7,注意:,如果while的 (表達(dá)式) 值為0,則循環(huán)體一次也不執(zhí)行 (例如當(dāng)i的初值=101) 。 在循環(huán)體中必須有使循環(huán)趨向結(jié)束的操作,否則循環(huán)將無(wú)限進(jìn)行(死循環(huán))。 在循環(huán)體中,語(yǔ)句的先后位置必須符合邏輯,否則會(huì)影響運(yùn)算結(jié)果。,思考程序段的輸出? while (i=100) i+; sum=sum+i; ,運(yùn)行后,輸出: sum=5150 原因是什么?,2019/7/14,8,注意(續(xù)):,為了保證循環(huán)正常運(yùn)行,應(yīng)該特別注意: 循環(huán)控制條件的描述 控制條件的初始狀態(tài)(初始值) 循環(huán)體內(nèi)部對(duì)控制條件的影響,2019/7/14,9,5.2 do-while語(yǔ)句,語(yǔ)句一般格式 do 語(yǔ)句 while (表達(dá)式); 功能: 先執(zhí)行內(nèi)嵌語(yǔ)句(循環(huán)體),之后計(jì)算表達(dá)式的值,不為0(邏輯真)時(shí),再執(zhí)行循環(huán)體并判斷條件,直到表達(dá)式的值為 0 結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while下面的語(yǔ)句。,2019/7/14,10,do-while循環(huán)的算法,N-S結(jié)構(gòu)圖,main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(“%dn“,sum); ,用do-while語(yǔ)句 求100個(gè)自然數(shù)的和,2019/7/14,11,說(shuō)明:,while和do-while都能實(shí)現(xiàn)循環(huán)控制,while結(jié)構(gòu)程序通常都可以轉(zhuǎn)換成do-while結(jié)構(gòu),區(qū)別: do- while 語(yǔ)句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次; while 語(yǔ)句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行 dowhile循環(huán)體中一定要有能使表達(dá)式值趨于0的操作(如i+),否則會(huì)出現(xiàn)死循環(huán)。,2019/7/14,12,do-while語(yǔ)句的簡(jiǎn)單應(yīng)用,【例5.3】用輾轉(zhuǎn)相除法求m和n的最大公約數(shù),2019/7/14,13,算法和程序:,main( ) int m,n,r; scanf(“%d, %d“, ,運(yùn)行jc5_3,程序運(yùn)行情況如下: 24, 60 12,2019/7/14,14,5.3 for語(yǔ)句,語(yǔ)句一般格式 for (表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句,功能: 計(jì)算表達(dá)式1的值,再判斷表達(dá)式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語(yǔ)句(循環(huán)體),并計(jì)算表達(dá)式3;之后再去判斷表達(dá)式2,一直到其值為0時(shí)結(jié)束循環(huán),執(zhí)行后續(xù)語(yǔ)句。,循環(huán)初始條件,循環(huán)控制條件,循環(huán)體,2019/7/14,15,for語(yǔ)句的算法,例如: main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(“sum=%dn“,sum); ,可部分或全部省略,但“;”不可省略,2019/7/14,16,省略for語(yǔ)句的表達(dá)式, 表達(dá)式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),會(huì)無(wú)限循環(huán)(死循環(huán)),注意:在省略某個(gè)表達(dá)式時(shí),應(yīng)在適當(dāng)位置進(jìn)行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行, 省略表達(dá)式1和表達(dá)式3,即: for(;表達(dá)式2;) 就等同于:while( 表達(dá)式2 ) 省略表達(dá)式2,即: for(表達(dá)式1; ;表達(dá)式3) 就等同于:表達(dá)式1; while(1)表達(dá)式3;,2019/7/14,17,例如:, i=1; for ( ; i100) for (i=1; i100) i+; ,2019/7/14,18,說(shuō)明:,所有用 while 語(yǔ)句實(shí)現(xiàn)的循環(huán)都可以用for 語(yǔ)句實(shí)現(xiàn)。,等價(jià)于:,for(表達(dá)式1;表達(dá)式2 ;表達(dá)式3) 語(yǔ)句;,表達(dá)式1; while (表達(dá)式2) 語(yǔ)句; 表達(dá)式3; ,2019/7/14,19,for語(yǔ)句的簡(jiǎn)單應(yīng)用,【例5.4】求n! ,即計(jì)算p=123n的值。,思路:求階乘與求累加的運(yùn)算處理過(guò)程類似,只要將“+”變?yōu)椤?”。,設(shè)置: 乘數(shù)i ,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入) 累乘器 p ,每次循環(huán)令p = p*i,2019/7/14,20,程序:,main( ) int i, n; long p; p=1; printf(“Enter n:“); scanf(“%d“, ,思考: 如何輸出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,運(yùn)行jc5_4,2019/7/14,21,熟悉幾個(gè)循環(huán)語(yǔ)句,while (!x) x+; 當(dāng) x=0 時(shí),執(zhí)行循環(huán)體x+;,while (c=getchar( ) != n) n=n+1; n 稱為計(jì)數(shù)器,作用是統(tǒng)計(jì)輸入字符的個(gè)數(shù) while (num+5); 先執(zhí)行循環(huán)體x*=-3,再判斷條件(x5) for (n=0; n26; n+) printf(“%c “, n+A); 作用是輸出26個(gè)大寫字母 for (sum=0, i=1; i=100; sum=sum+i, i+=2) ; 作用是計(jì)算100以內(nèi)的奇數(shù)和,2019/7/14,22,幾種循環(huán)語(yǔ)句的比較,while和do-while語(yǔ)句的表達(dá)式只有一個(gè),for語(yǔ)句有三個(gè)。 while 和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語(yǔ)句先執(zhí)行循環(huán)體后判斷循環(huán)條件。,while語(yǔ)句多用于循環(huán)次數(shù)不定的情況 do-while語(yǔ)句多用于至少要運(yùn)行一次的情況 for語(yǔ)句多用于要賦初值或循環(huán)次數(shù)固定的情況,2019/7/14,23,5.4 用goto語(yǔ)句實(shí)現(xiàn)循環(huán),有興趣的同學(xué)自學(xué) 不提倡使用goto語(yǔ)句,注意: goto語(yǔ)句能實(shí)現(xiàn)程序無(wú)條件轉(zhuǎn)移,為編程提供了便利。但是無(wú)限制地使用,會(huì)破壞程序的結(jié)構(gòu)化程度。因此應(yīng)限制使用。,2019/7/14,24,5.5 循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語(yǔ)句,有如下三種語(yǔ)句實(shí)現(xiàn)跳轉(zhuǎn): continue語(yǔ)句 break語(yǔ)句 goto語(yǔ)句 在循環(huán)語(yǔ)句的循環(huán)體中使用,可以進(jìn)行循環(huán)的流程控制,2019/7/14,25,5.5.1 continue語(yǔ)句及應(yīng)用,功能: 中斷循環(huán)體的本次執(zhí)行(即跳過(guò)循環(huán)體中尚未執(zhí)行的語(yǔ)句),立即開(kāi)始執(zhí)行下一次循環(huán)。,while語(yǔ)句,do-while語(yǔ)句,for語(yǔ)句,2019/7/14,26,例如:, int x,n=0,s=0; while (n10) scanf(“%d“, int x,n=0,s=0; do scanf(“%d“, for (n=0,s=0; n10; n+) scanf(“%d“, ,2019/7/14,27,應(yīng)用舉例,【例5.7】把100200之間能被7整除的數(shù),以十個(gè)數(shù)為一行的形式輸出,最后輸出一共有多少個(gè)這樣的數(shù)。,2019/7/14,28,算法和程序,main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) continue; printf(“%6d“,n); j+; if (j%10=0) printf(“n“); printf(“ n j=%dn“,j); ,運(yùn)行jc5_7,2019/7/14,29,5.5.2 循環(huán)中break的應(yīng)用,功能: 利用break語(yǔ)句能夠強(qiáng)迫終止本層循環(huán),轉(zhuǎn)到后續(xù)語(yǔ)句執(zhí)行。,while語(yǔ)句,do-while語(yǔ)句,for語(yǔ)句,2019/7/14,30,例如:, int x,n=0,s=0; while (n10) scanf(“%d“, int x,n=0,s=0; do scanf(“%d“, for (n=0,s=0; n10; n+ ) scanf(“%d“, ,2019/7/14,31,5.6 循環(huán)的嵌套,如果循環(huán)語(yǔ)句的循環(huán)體內(nèi)又包含了另一條循環(huán)語(yǔ)句,則稱為循環(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); ,運(yùn)行jc5_a,外循環(huán)語(yǔ)句,內(nèi)循環(huán)語(yǔ)句,2019/7/14,32,注意:,while、do-while、for循環(huán)語(yǔ)句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。 多重循環(huán)程序執(zhí)行時(shí),外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。 例如:,for(a=1;a=10;a+) for (b=0;b=5;b+) ,外循環(huán)執(zhí)行了10次,內(nèi)循環(huán)執(zhí)行6次 循環(huán)正常結(jié)束時(shí),內(nèi)循環(huán)執(zhí)行了106=60次,2019/7/14,33,5.7 循環(huán)結(jié)構(gòu)程序設(shè)計(jì),【例5.5】按每行輸出5個(gè)數(shù)的形式輸出Fibonacci數(shù)列的前20項(xiàng) 。,思路:Fibonacci數(shù)列的前幾項(xiàng)是:1、1、2、3、5、8、13、21、34、。此數(shù)列的變化規(guī)律是:,設(shè)變量f1、f2和f3,并為f1和f2賦初值1,令f3=f1+f2得到第3項(xiàng); 將f1f2, f2f3,再求f3=f1+f2得到第4項(xiàng); 依此類推求第5項(xiàng)、第6項(xiàng),這是一種遞推算法 應(yīng)采用循環(huán)實(shí)現(xiàn),2019/7/14,34,算法和程序,#define N 20 main( ) 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 (i%5=0) printf(“n“); ,運(yùn)行jc5_5,2019/7/14,35,舉例2,【例5.12】判斷輸入的某個(gè)數(shù)m是否為素?cái)?shù)。若是素?cái)?shù),輸出“YES”,若不是,輸出“NO”。,思路:素?cái)?shù)是指只能被1和它本身整除的數(shù),如5、7、11、17、等。,分別用2、3、,m-1嘗試能否整除整數(shù)m。如果m能被某個(gè)數(shù)整除,則m就不是素?cái)?shù)。,這是一種窮舉算法 設(shè)除數(shù)為j,從2循環(huán)到m-1,2019/7/14,36,算法和程序:,#include “math.h“ main( ) int j,m,k; printf(“Enter an integer number: “); scanf(“%d“, ,運(yùn)行jc5_12,2019/7/14,37,程序的優(yōu)化,對(duì)于窮舉法來(lái)說(shuō),為了提高程序的效率,就要減少嘗試次數(shù)。,#include “math.h“ main( ) int j,m,k; printf(“Enter an integer number: “); scanf(“%d“, ,思考:如何輸出100200中所有的素?cái)?shù),2019/7/14,38,舉例3,【例5.13】用牛頓迭代法求方程 2x3+4x2-7x-6=0 在x=1.5附近的根。,思路:設(shè)xn為一個(gè)接近xa的近似根,過(guò)(xn, f(xn) 點(diǎn)做切線,切線方程為:,即:,牛頓迭代公式,2019/7/14,39,算法基本步驟:, 先設(shè)一個(gè)方程近似根x0,求出方程f的值和方程導(dǎo)數(shù)f1的值; f=2x03+4x02-7x0-6 f1=6x02+8x0-7 用迭代公式x=x0-f/f1進(jìn)行迭代,求出x比x0要接近方程真實(shí)的根; 當(dāng)|x-x0|大于某個(gè)很小的數(shù)時(shí)(如10-6),認(rèn)為未找到,此時(shí)將xx0,再次求f、f1,并迭代,又求出一個(gè)新的更接近方程根的x; 一直到 |x-x0|10-6時(shí)得到方程近似根:x或x0。,這是一種迭代算法 用循環(huán)實(shí)現(xiàn),2019/7/14,40,算法和程序:,#include “math.h“ main( ) float x,x0,f,f1; x=1.5; 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); ,運(yùn)行jc5_13,2019/7/14,41,舉例4,【例5.11】編程序求210000以內(nèi)的完全數(shù)。,完全數(shù):一個(gè)數(shù)的因子(除了這個(gè)數(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)論