版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 循環(huán)結(jié)構(gòu)與應(yīng)用,循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。它會(huì)根據(jù)條件反復(fù)執(zhí)行某程序段,當(dāng)然不能無(wú)限的執(zhí)行下去,在給定條件不成立時(shí),循環(huán)就會(huì)停止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。,語(yǔ)言提供了多種循環(huán)語(yǔ)句,可以組成各種不同形式的循環(huán)結(jié)構(gòu): (1) for循環(huán)語(yǔ)句; (2) while循環(huán)語(yǔ)句; (3) do-while循環(huán)語(yǔ)句;,3.1 循環(huán)的概述,for一般形式為:,for(設(shè)置初始值;循環(huán)條件判斷;設(shè)置循環(huán)增減量) instruction block ,3.2 for循環(huán),注意! ;表示循環(huán)指令塊的結(jié)束!,for語(yǔ)句的執(zhí)行流程:,圖3-1 for語(yǔ)句執(zhí)行流程圖,設(shè)置循環(huán)初
2、值,循環(huán)條件判斷,循環(huán)主體,設(shè)置循環(huán)增減量,循環(huán)外的語(yǔ)句,真,假,圖3-3 高斯級(jí)數(shù)運(yùn)算的流程圖,例3-1,#include void main(void) int nSum;/* 用于保存計(jì)算和*/ int i; /* 循環(huán)控制變量,也是參與運(yùn)算的操作數(shù)*/ nSum=0; for(i=1;i101;i+) nSum += i; printf(1+2+3+99+100=%dn,nSum); ,程序清單3-1progression.c,雙目復(fù)合賦值運(yùn)算符,復(fù)合賦值表達(dá)式的一般形式為: 變量1 Op= 表達(dá)式2 Op表示參與構(gòu)成復(fù)合賦值運(yùn)算符的雙目運(yùn)算符,它和下面的賦值表達(dá)式等價(jià): 變量1 =
3、(變量1 ) Op (表達(dá)式2) 例如:x+=y-3等價(jià)于x=x+(y-3),而不是x=x+y-3。,+i和i+等價(jià)于i=i+1,但是,這兩個(gè)表達(dá)式在參與其他運(yùn)算的時(shí)候是有區(qū)別的。在和其他運(yùn)算結(jié)合在一起時(shí),+i表示i自增1后再參與其它運(yùn)算,而i+表示i參與運(yùn)算后,i的值再自增1。同理,-i是i自減1后再參與其它運(yùn)算,而i-是i參與運(yùn)算后,i的值再自減1。例如下面的程序段: int x=0,int i=1; x=i+; printf(“x=%d,i=%d”,x,i); 輸出的結(jié)果為x=1,i=2。,自增和自減運(yùn)算符,前置自增和后置自增的區(qū)別,The value of j is increased
4、,The value of j is not increased,例3-2 使用逗號(hào)運(yùn)算符在for循環(huán)中初始化變量,#include void main (void) int nSum; /* 用于保存計(jì)算和*/ int i; /* 循環(huán)控制變量,也是參與運(yùn)算的操作數(shù)*/ /*在循環(huán)開始時(shí),初始化變量nSum*/ for(i=1,nSum=0;i101;i+) nSum+=i; /*求和*/ printf(1+2+3+99+100=%dn,nSum); ,程序清單3-2progression-1.c,例3-3,圖3-5 控制密碼輸入次數(shù)程序流程圖,void main (void) int nP
5、wd=0; int i; int nFlag=1; for(i=0; ( (nFlag=(87569 != nPwd) ,程序清單3-3checklogon.c,main() for( ; i = n; i+) fact=fact*i; ,i = 1, fact= 1.0,如果省略表達(dá)式1,即不在for語(yǔ)句中給循環(huán)變量賦初值,則應(yīng)該在for語(yǔ)句前給循環(huán)變量賦初值。,main() for(i=1,fact=1.0; ; i+) fact=fact*i; if(i=n) break; ,如果省略表達(dá)式2,即不在表達(dá)式2的位置判斷循環(huán)終止條件,循環(huán)無(wú)終止地進(jìn)行,也就是認(rèn)為表達(dá)式2始終為“真”。則應(yīng)該
6、在其它位置安排檢測(cè)及退出循環(huán)的機(jī)制。,i = n,main() for(I =1,fact = 1.0; i=n; ) fact=fact*i; ,如果省略表達(dá)式3,即不在此位置進(jìn)行循環(huán)變量的修改,則應(yīng)該其它位置安排使循環(huán)趨向于結(jié)束的工作。,i+;,#include void main (void) int i; for(i=0;i10; printf(%d ,i), i+ ),例3-4 使用循環(huán)輸出0-9這10個(gè)數(shù)字。,程序清單3-4aotherfor.c,while(條件判斷) 語(yǔ)句1; 語(yǔ)句2; 語(yǔ)句n; ,3.3 while循環(huán),while一般形式為:,圖3-8 while循環(huán)執(zhí)行過(guò)程
7、,例3-6 用while循環(huán)實(shí)現(xiàn)從1加到100的計(jì)算,#include void main (void) int nSum; int i; nSum=0; i=1; while(i101) nSum+=i; i+; printf(1+2+3+99+100=%dn,nSum); ,程序清單3-6progression-2.c,While的常見錯(cuò)誤 “one liners”,while (num %d.n”, minimum); printf(“Please try again.n”);,while (num %d.n”, minimum); printf(“Please try again.n”
8、);,While的常見錯(cuò)誤 “one liners”,while (num %d.n”, minimum); printf(“Please try again.n”);,while (num %d.n”, minimum); printf(“Please try again.n”);,while (num minimum); scanf(“%d”, ,While的常見錯(cuò)誤-多余的分號(hào)extra semi-colon,標(biāo)志著 while塊的結(jié)束 通常引起無(wú)窮循環(huán),do 語(yǔ)句1; 語(yǔ)句2; 語(yǔ)句n; while(條件判斷);,3.4 do while循環(huán),do while一般形式為:,圖3-11
9、do while循環(huán)執(zhí)行過(guò)程,例3-7 使用do while循環(huán)實(shí)現(xiàn)1到100的計(jì)算。,圖3-12 do while循環(huán)實(shí)現(xiàn)高斯級(jí)數(shù)計(jì)算的流程圖,#include void main (void) int nSum; int i; /* 循環(huán)控制變量,也是參與運(yùn)算的操作數(shù)*/ nSum=0; i=1; /*初始化循環(huán)控制變量*/ do nSum+=i; i+; /*改變循環(huán)控制變量的值*/ while(i101); printf(1+2+3+99+100=%dn,nSum); ,程序清單3-7progression-3.c,一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還
10、可以嵌套循環(huán),這就是多層循環(huán)。,3.5 循環(huán)的嵌套,(1) for(;) (2) for(;) for(;) while() (3) while() (4) do do while() while(); while(); (5) while() (6) do do for(;) while(); while();,首先看九九乘法表的內(nèi)容,如下所示: 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 8*1=8 8*2=16 8*3=24 8*4=32 8*5= 40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=4
11、5 9*6=54 9*7=63 9*8=72 9*9=81,例3-8 在屏幕上輸出九九乘法表。,圖3-14 九九乘法表的程序流程圖,#include void main (void) int nRow; int nCol; for(nRow=1;nRow10;nRow+) for(nCol=1;nCol=nRow;nCol+) printf(%d*%d=%d,nRow,nCol,nRow*nCol); printf(n); /*輸出一行后換行*/ ,程序清單3-8 multiplication-table.c,3.6 循環(huán)語(yǔ)句的類型,Sentinel-Controlled Loops由標(biāo)志值控
12、制的循環(huán),有時(shí)不知道循環(huán)需要進(jìn)行的次數(shù) 這時(shí)我們可以選擇一個(gè) sentinel value 作為循環(huán)結(jié)束的標(biāo)志 當(dāng)讀入標(biāo)志值得時(shí)候,循環(huán)就終止 這樣,任何時(shí)候用戶需要退出循環(huán)只需要輸入這個(gè) sentinel value. 這與許多應(yīng)用程序中的 “l(fā)ogout” 函數(shù)相類似,例3-5,圖3-9 while循環(huán)處理鍵盤輸入的流程圖,#include void main (void) char cStr; cStr=0; while(cStr !=q) ,程序清單3-5 checkcharactor.c,標(biāo)志值控制的while循環(huán),若要退出循環(huán),只需輸入 -99,# define SENTINEL
13、-99 main() int item; float sum = 0; printf (“Use “”%d to stop)”, SENTINEL); scanf (“%f”, ,scanf and while - Example 1,float num; while (scanf(“%f”, while (scanf(“%f”, while (scanf(“%f”, while (scanf(“%f”, while (scanf(“%f”, while (scanf(“%f”, float x, y, z; val = scanf(“%f %f %f”, ,Input: 42.5 -5 23
14、 Output: 3,scanf - Example 2,int val; float x, y, z; val = scanf(“%f %f %f”, ,scanf - Example 2 (cont),Input: 42.5 -5 c Output: 2,Input: 42.5 c 23 Output: 1,int val; float x, y, z; val = scanf(“%f %f %f”, ,scanf - Example 2 (cont),Input: man 2 wolf Output: 0,int val; float x, y, z; val = scanf(“%f %
15、f %f”, ,scanf - Example 2 (cont),int num; char ch; float x; printf(“enter an int, a char, and a float: “); if ( scanf(“%d%c%f”, ,scanf - Example 3,exit() 使程序立即退出運(yùn)行,需要包含 #include ,int num; char ch; float x; printf(“enter an int, a char, and a float: “); if ( scanf(“%d%c%f”, ,scanf - Example 3,while w
16、ith scanfs return,3.6 循環(huán)語(yǔ)句的選擇,beak語(yǔ)句,break語(yǔ)句的一般形式為: break;,例3-11 程序?qū)崿F(xiàn)的流程圖,開始,結(jié)束,初始數(shù)據(jù),fTotal += fScore,+nCount,scanf,()=,1,0,| ,100,nCount,0,輸入,fScore,真,假,真,真,假,假,輸出,fTotal,輸出提示信息,例3-11,輸入fScore,void main (void) float fScore, fMin=0.0f, fMax=100.0f, fTotal=0.0f; int nCount=0; while(scanf(%f, ,程序清單3-1
17、1break.c,注意: (1)break語(yǔ)句不能用于循環(huán)語(yǔ)句和switch語(yǔ)句之外的任何其他語(yǔ)句中。 (2)在嵌套循環(huán)中,break語(yǔ)句只能終止它所在的循環(huán)的執(zhí)行。,本例中break語(yǔ)句的作用就是結(jié)束循環(huán)的執(zhí)行,強(qiáng)制退出循環(huán),程序繼續(xù)執(zhí)行循環(huán)后的程序語(yǔ)句。,continue語(yǔ)句,continue的作用與break語(yǔ)句相似,也有結(jié)束循環(huán)的作用,但是continue語(yǔ)句是結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定.,continue語(yǔ)句的一般形式為: continue;,#include void main (void) float fScore; /* 用
18、于保存輸入的成績(jī)*/ float fMin=0.0f,fMax=100.0f; float fTotal=0.0f; /* 保存總成績(jī)*/ int nCount=0; /* 對(duì)輸入的成績(jī)個(gè)數(shù)進(jìn)行計(jì)數(shù)*/ while(scanf(%f, ,程序清單3-12continue.c,將程序清單3-11進(jìn)行一下簡(jiǎn)單的修改,將break語(yǔ)句替換成continue語(yǔ)句。請(qǐng)分析程序執(zhí)行的結(jié)果,體會(huì)這兩種跳出循環(huán)體語(yǔ)句的作用和對(duì)程序流程的影響。,注意: break語(yǔ)句則是結(jié)束整個(gè)循環(huán)過(guò)程,不再判斷執(zhí)行循環(huán)的條件是否成立。 continue語(yǔ)句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行。,main() int n;
19、 for(n=100; ; ) if(n%3!=0) continue; printf(“ %4d n”, n); ,main() int n = 100; while () if(n%3!=0) continue; printf(“ %4d n”, n); ,n+,n=200,n=200,n+;,二者等價(jià)否?,goto語(yǔ)句,goto語(yǔ)句為無(wú)條件轉(zhuǎn)向語(yǔ)句,一般形式為: goto 語(yǔ)句標(biāo)號(hào);,語(yǔ)句標(biāo)號(hào)用標(biāo)識(shí)符表示,即由字母、數(shù)字和下劃線組成,且第一個(gè)字符必須為字母或下劃線,不能用整數(shù)來(lái)做標(biāo)號(hào)。語(yǔ)句標(biāo)號(hào)加在跳轉(zhuǎn)的目的語(yǔ)句之前,并用冒號(hào)(:)與后面的語(yǔ)句分隔。例如, goto lable_123;
20、是合法的,而 goto 25; 是不合法的。,問(wèn)題:你見過(guò)語(yǔ)句標(biāo)號(hào)嗎?,標(biāo)志變量,控制逐層跳出多層循環(huán),標(biāo)志變量初始化,如果滿足一定條件需要跳出各層循環(huán),先設(shè)置標(biāo)志變量,然后跳出本層循環(huán),繼續(xù)跳出外層循環(huán),main() int x=3,y=6,a=0; while (x+ !=(y-=1) a+=1; if (yx) break; printf(“x=%d,y=%d,a=%dn”,x,y,a); ,先執(zhí)行關(guān)系運(yùn)算, 然后執(zhí)行x+,練習(xí),3.7 程序舉例,例:下面對(duì)計(jì)算器做如下功能的擴(kuò)充: (1) 增加菜單循環(huán)執(zhí)行的功能; (2) 實(shí)現(xiàn)三角函數(shù)正弦函數(shù)的功能(sin函數(shù)); (3) 實(shí)現(xiàn)三角函數(shù)余弦函數(shù)的功能(cos函數(shù))。,3.7.1 計(jì)算器,菜單反復(fù)執(zhí)行功能 既然是要菜單反復(fù)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026寧波前灣新區(qū)衛(wèi)生系統(tǒng)事業(yè)單位招聘高層次人才42人筆試備考試題及答案解析
- 2026年潤(rùn)含公司招聘2名勞務(wù)派遣員工筆試備考試題及答案解析
- 2026湖南長(zhǎng)沙市雨花湘一外國(guó)語(yǔ)中學(xué)春季合同制教師招聘考試備考試題及答案解析
- 2026江蘇南京大學(xué)哲學(xué)學(xué)院博士后招聘1人筆試備考題庫(kù)及答案解析
- 2026湖北交通投資集團(tuán)有限公司招聘14人考試參考題庫(kù)及答案解析
- 2026年學(xué)生心理健康輔導(dǎo)技巧課程
- 2026首都經(jīng)濟(jì)貿(mào)易大學(xué)招聘103人考試參考題庫(kù)及答案解析
- 2026年甘肅省金昌市金川路街道社區(qū)衛(wèi)生服務(wù)中心招聘(聘用制)專業(yè)技術(shù)人員筆試模擬試題及答案解析
- 北京市大興區(qū)魏善莊鎮(zhèn)社區(qū)衛(wèi)生服務(wù)中心招聘勞務(wù)派遣人員1人(行政技能輔助崗)筆試參考題庫(kù)及答案解析
- 2026上半年貴州事業(yè)單位聯(lián)考綏陽(yáng)縣招聘73人筆試參考題庫(kù)及答案解析
- 復(fù)發(fā)性叢集性頭痛
- 宮頸息肉個(gè)案護(hù)理
- 新生兒感染護(hù)理查房
- 2026屆高考語(yǔ)文專題復(fù)習(xí)-哲理詩(shī)
- (二調(diào))武漢市2025屆高中畢業(yè)生二月調(diào)研考試 生物試卷(含標(biāo)準(zhǔn)答案)
- 2024-2025學(xué)年天津市和平區(qū)高三上學(xué)期1月期末英語(yǔ)試題(解析版)
- 管理人員應(yīng)懂財(cái)務(wù)知識(shí)
- ISO9001-2015質(zhì)量管理體系版標(biāo)準(zhǔn)
- 翻建房屋四鄰協(xié)議書范本
- 打樁承包合同
- 輸煤棧橋彩鋼板更換施工方案
評(píng)論
0/150
提交評(píng)論