- Java程序設(shè)計(jì)
- 韓建平
- 3197字
- 2020-06-19 13:10:51
3.2 循環(huán)控制結(jié)構(gòu)
在程序設(shè)計(jì)中,循環(huán)結(jié)構(gòu)用于有規(guī)律地反復(fù)執(zhí)行某一程序塊,被重復(fù)執(zhí)行的程序塊稱為“循環(huán)體”。Java語言提供的循環(huán)結(jié)構(gòu)語句有:while語句、do-while語句、for語句等。
3.2.1 while語句實(shí)現(xiàn)循環(huán)結(jié)構(gòu)
while語句的一般格式為:

循環(huán)體可以是單條語句,也可以包含多條語句。如果循環(huán)體包含多條語句,必須寫成塊語句的形式,也就是寫在一對(duì)花括號(hào)內(nèi)。
功能:布爾表達(dá)式的值為true時(shí),執(zhí)行循環(huán)體;否則結(jié)束循環(huán)。
如圖3-3所示,while語句的特點(diǎn)是,先判斷條件,后執(zhí)行循環(huán)體。

圖3-3 while語句的執(zhí)行流程
【例3-6】隨機(jī)生成10道20以內(nèi)的加法測(cè)試題。由計(jì)算機(jī)對(duì)測(cè)試者輸入的計(jì)算結(jié)果進(jìn)行評(píng)判,輸出做對(duì)的題目數(shù)。
【程序】

【程序說明】
變量k用來存放做對(duì)的題數(shù),變量i用來統(tǒng)計(jì)循環(huán)次數(shù)。
在寫循環(huán)語句之前,通常要對(duì)循環(huán)中涉及的變量進(jìn)行初始化,例如,i用來計(jì)數(shù),循環(huán)之前一般賦值為0。k用來存放做對(duì)的題數(shù),循環(huán)之前也必須賦值為0。
用while循環(huán)編寫程序需要明確兩個(gè)問題:一是什么樣的操作是需要循環(huán)執(zhí)行的;二是循環(huán)什么時(shí)候停下來。
這里明顯需要循環(huán)的操作有:生成和顯示算式,輸入計(jì)算結(jié)果,以及對(duì)計(jì)算結(jié)果正確性的判定。還有一個(gè)不太明顯的重復(fù)操作是計(jì)數(shù)。因?yàn)橐貜?fù)10次,做一次,數(shù)一次。做滿10次循環(huán)結(jié)束。
3.2.2 do-while語句實(shí)現(xiàn)循環(huán)結(jié)構(gòu)
do-while語句的一般格式為:

do-while語句的執(zhí)行流程如圖3-4所示。首先執(zhí)行循環(huán)體語句,然后檢查循環(huán)條件。如果布爾表達(dá)式為true,則繼續(xù)循環(huán),否則循環(huán)結(jié)束。

圖3-4 do-while語句的執(zhí)行流程
可以看出,do-while語句和while語句的區(qū)別在于:while語句是先判斷后執(zhí)行,而do-while語句是先執(zhí)行后判斷;while語句的循環(huán)體可能一次都不執(zhí)行,而do-while語句無論條件真假,循環(huán)體至少執(zhí)行一次。
【例3-7】用do-while語句實(shí)現(xiàn)例3-6。
【程序】

【程序說明】
do-while循環(huán)體中包含以下操作:生成和顯示算式、輸入計(jì)算結(jié)果、對(duì)計(jì)算結(jié)果正確性的判定,以及更新循環(huán)控制變量值。i的值在循環(huán)前被初始化為0,i的值為0,1,2,…,9時(shí)執(zhí)行循環(huán)體,i的值為10時(shí)循環(huán)終止。i的值從0開始,一步一步增加到10后循環(huán)終止,循環(huán)體執(zhí)行了10次。
3.2.3 for語句實(shí)現(xiàn)循環(huán)結(jié)構(gòu)
for語句的一般格式為:

表達(dá)式1通常是初始化語句,在循環(huán)開始以前執(zhí)行一次,用于變量初始化。表達(dá)式2必須為布爾類型,是循環(huán)體執(zhí)行的條件,表達(dá)式3用于在循環(huán)體執(zhí)行后,修改循環(huán)條件相關(guān)變量的值。
for語句的執(zhí)行流程如圖3-5所示,首先執(zhí)行表達(dá)式1,再判斷循環(huán)條件,如果表達(dá)式2值為false,則結(jié)束循環(huán),否則執(zhí)行循環(huán)體和表達(dá)式3,然后繼續(xù)判斷循環(huán)條件。

圖3-5 for語句的執(zhí)行流程
例如,若有定義:

那么計(jì)算數(shù)學(xué)表達(dá)式1+1/2+1/3+…+1/100的程序段為:

for語句的一般格式中的表達(dá)式1、表達(dá)式2、表達(dá)式3都可以為空,但兩個(gè)分號(hào)不可以省略。如果表達(dá)式2為空,則相當(dāng)于表達(dá)式2為true,即條件成立,那么需要其他方式終止循環(huán)。例如,上面的for語句也可以寫為:
【程序段1】

【程序段2】

【程序段3】

在程序段3的循環(huán)體中,當(dāng)i>100時(shí),執(zhí)行break語句,終止循環(huán)。
需要指出的是,雖然表達(dá)式1、表達(dá)式2和表達(dá)式3可以為空,但完整的for語句更加清晰。
【例3-8】用for語句實(shí)現(xiàn)例3-6。
【程序】

【程序說明】
例3-6、例3-7、例3-8分別用while、do-while和for語句實(shí)現(xiàn)同樣的功能,這3種語句都是通用的,但形式上各有特色、略有不同。如果事先可以確定循環(huán)次數(shù),那么采用for語句編寫的程序會(huì)更加清晰。
3.2.4 break語句
在switch結(jié)構(gòu)中,break語句用于退出switch語句。break語句也可以用在循環(huán)結(jié)構(gòu)中,與if語句配合,實(shí)現(xiàn)在一定條件下終止循環(huán)。
【例3-9】隨機(jī)生成10道20以內(nèi)的加法測(cè)試題。由計(jì)算機(jī)對(duì)測(cè)試者輸入的計(jì)算結(jié)果進(jìn)行評(píng)判,只要有一題答錯(cuò),測(cè)試者立即失去答題機(jī)會(huì)。
【程序】

【程序說明】
在for語句的循環(huán)體中,首先生成并顯示加法題,然后接收用戶輸入的計(jì)算結(jié)果,其后的if語句對(duì)計(jì)算結(jié)果進(jìn)行判定。如果條件為真,也就是輸入的結(jié)果與正確結(jié)果不相等,就執(zhí)行break語句。一旦執(zhí)行了break語句,就會(huì)直接跳出循環(huán),不管是循環(huán)體中后繼的其他語句,還是for語句結(jié)構(gòu)中的表達(dá)式2和表達(dá)式3,都不會(huì)再執(zhí)行。也就是說,在答題過程中,只要有一道題目答錯(cuò),循環(huán)馬上終止。
程序中的變量flag用來表示用戶是否全部答對(duì)10道題目。在循環(huán)開始前,flag初始化為1,即當(dāng)前沒有答錯(cuò)的題目。如果全部答對(duì),那么flag的值保持為1。如果某道題目答錯(cuò),則在break語句之前,flag被置為0。這樣循環(huán)結(jié)束以后,就可以通過flag的值輸出相應(yīng)的提示信息。
3.2.5 continue語句
continue語句只能用在循環(huán)結(jié)構(gòu)中。如果在循環(huán)體中執(zhí)行了continue語句,則跳過本輪循環(huán)的剩余語句,轉(zhuǎn)而進(jìn)行下一輪循環(huán)條件的判定,并根據(jù)判定再一次執(zhí)行循環(huán)體,或終止循環(huán)。continue語句只結(jié)束本次循環(huán),不終止整個(gè)循環(huán)的執(zhí)行,而break語句則是結(jié)束整個(gè)循環(huán)過程。
【例3-10】在例3-9基礎(chǔ)上增加一個(gè)新功能:給測(cè)試者提供的算式結(jié)果均小于20。
【程序】

【程序說明】
本程序的功能要求是給測(cè)試者提供運(yùn)算結(jié)果均小于20的算式。為此,在循環(huán)體中,先產(chǎn)生兩個(gè)隨機(jī)整數(shù),然后判斷兩數(shù)之和是否大于等于20。如果條件成立,則執(zhí)行continue語句,放棄執(zhí)行循環(huán)體中的剩余語句,轉(zhuǎn)去重新檢查循環(huán)條件,也就是說,剛剛這個(gè)不符合題目要求的算式被丟棄。相反,如果判斷兩數(shù)之和小于20,就不執(zhí)行continue語句,繼續(xù)執(zhí)行循環(huán)體的剩余語句,即顯示加法題、接收鍵盤輸入及判斷正確性等。
實(shí)際上,如果不用continue語句,也可以用下面的程序段代替程序中的while語句,實(shí)現(xiàn)完全相同的功能。

3.2.6 循環(huán)嵌套
當(dāng)一個(gè)循環(huán)語句的循環(huán)體中包含另一個(gè)循環(huán)語句時(shí),就構(gòu)成了循環(huán)的嵌套,前面介紹的3種循環(huán)都可以構(gòu)成循環(huán)嵌套結(jié)構(gòu)。
圖3-6所示的程序段就是表達(dá)式1+1/2!+1/3!+…+1/100!的值。內(nèi)層循環(huán)重復(fù)i次,每次循環(huán)完成一次乘法。外層循環(huán)重復(fù)100次,每次累加1項(xiàng)(1/item),其中,item的值(也就是i!)由內(nèi)層循環(huán)計(jì)算得到。

圖3-6 循環(huán)嵌套示意圖
【例3-11】隨機(jī)生成10道20以內(nèi)的加法測(cè)試題,由計(jì)算機(jī)對(duì)測(cè)試者輸入的計(jì)算結(jié)果進(jìn)行評(píng)判,每道題目有3次答題機(jī)會(huì)。
【程序】

【程序說明】
外層循環(huán)重復(fù)10次,每循環(huán)一次執(zhí)行的操作包括:生成并顯示加法題及內(nèi)層for循環(huán)。內(nèi)層循環(huán)最多重復(fù)3次,內(nèi)層循環(huán)的循環(huán)體包含輸入語句和if語句,如果輸入的計(jì)算結(jié)果與正確結(jié)果不相等,則輸出提示“Wrong.”,執(zhí)行times++,再檢查循環(huán)條件。如果輸入的計(jì)算結(jié)果與正確結(jié)果相等,則輸出提示“Good!”,執(zhí)行k++,再執(zhí)行break語句。應(yīng)注意,break語句只能跳出直接包含它的內(nèi)層循環(huán),也就是說,執(zhí)行break語句之后會(huì)轉(zhuǎn)去執(zhí)行外層循環(huán)的i++,再進(jìn)行外層循環(huán)的循環(huán)條件判定。
3.2.7 帶標(biāo)號(hào)的break語句
在嵌套循環(huán)結(jié)構(gòu)中,不帶標(biāo)號(hào)的break語句僅可以終止它所在的最內(nèi)層的循環(huán),帶標(biāo)號(hào)的break語句則可以跳出標(biāo)號(hào)所指定的循環(huán)。如果標(biāo)號(hào)指向外層循環(huán),那么break語句跳出外層循環(huán);如果標(biāo)號(hào)指向內(nèi)層循環(huán),那么break語句跳出內(nèi)層循環(huán)。
帶標(biāo)號(hào)的break語句的一般格式是:

【例3-12】隨機(jī)生成10道20以內(nèi)的加法測(cè)試題。由計(jì)算機(jī)對(duì)測(cè)試者輸入的計(jì)算結(jié)果進(jìn)行評(píng)判,每道題目可有3次答題機(jī)會(huì)。如果答錯(cuò)總次數(shù)達(dá)到10,測(cè)試結(jié)束,判定為失敗(Fail)。
【程序】

【程序說明】
程序中定義了L1、L2兩個(gè)標(biāo)號(hào),分別對(duì)應(yīng)外層循環(huán)語句和內(nèi)層循環(huán)語句。每道加法練習(xí)題,有3次答題機(jī)會(huì),但只要答對(duì)就馬上退出內(nèi)層循環(huán)。顯然,這里的“break L2”可以替換為“break”。
變量total用于統(tǒng)計(jì)總的答錯(cuò)次數(shù),如果total值為10,則執(zhí)行“break L1”語句,跳出外層循環(huán),測(cè)試結(jié)束。
3.2.8 帶標(biāo)號(hào)的continue語句
continue語句也可以帶標(biāo)號(hào),當(dāng)在循環(huán)結(jié)構(gòu)中執(zhí)行帶標(biāo)號(hào)的continue語句時(shí),將直接執(zhí)行標(biāo)號(hào)所指向的循環(huán)結(jié)構(gòu)的下一次循環(huán)。帶標(biāo)號(hào)的continue語句一般用于嵌套的循環(huán)結(jié)構(gòu)中。
【例3-13】隨機(jī)生成10道20以內(nèi)的加法測(cè)試題,由計(jì)算機(jī)對(duì)測(cè)試者輸入的計(jì)算結(jié)果進(jìn)行評(píng)判,每道題目有3次答題機(jī)會(huì)(使用帶標(biāo)號(hào)的continue語句實(shí)現(xiàn))。
【程序】

【程序說明】
程序中的內(nèi)層循環(huán)使每道題目最多可有3次答題機(jī)會(huì)。當(dāng)輸入的計(jì)算結(jié)果正確時(shí),就會(huì)執(zhí)行“continue L1”語句,從而放棄執(zhí)行本輪循環(huán)的剩余語句,進(jìn)入下一次循環(huán)的判定與執(zhí)行。由于這里的L1對(duì)應(yīng)外層循環(huán),因此所謂“本輪循環(huán)的剩余語句”不僅包括內(nèi)層循環(huán)的剩余語句,也包括外層循環(huán)的剩余語句,也就是說,程序流程直接轉(zhuǎn)去執(zhí)行外層for循環(huán)的表達(dá)式3(i++),接下來再判斷外層循環(huán)條件(i<10),根據(jù)條件確定是否進(jìn)入外層循環(huán)的循環(huán)體。
- Functional Python Programming
- Learning Python Web Penetration Testing
- Objective-C Memory Management Essentials
- HTML5+CSS3基礎(chǔ)開發(fā)教程(第2版)
- 數(shù)據(jù)結(jié)構(gòu)(C語言)
- C語言程序設(shè)計(jì)學(xué)習(xí)指導(dǎo)與習(xí)題解答
- Unreal Engine 4 Shaders and Effects Cookbook
- Learning Raspbian
- C語言程序設(shè)計(jì)
- Visual C#.NET Web應(yīng)用程序設(shè)計(jì)
- BeagleBone Robotic Projects(Second Edition)
- 從零開始學(xué)Python大數(shù)據(jù)與量化交易
- 企業(yè)級(jí)Java現(xiàn)代化:寫給開發(fā)者的云原生簡(jiǎn)明指南
- 現(xiàn)代JavaScript編程:經(jīng)典范例與實(shí)踐技巧
- Mastering MeteorJS Application Development