官术网_书友最值得收藏!

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)體。

主站蜘蛛池模板: 兰州市| 通山县| 景宁| 孟连| 灵宝市| 房产| 本溪市| 孟州市| 张掖市| 巴林右旗| 内黄县| 芮城县| 东阳市| 井冈山市| 灵台县| 谷城县| 栾川县| 南京市| 正宁县| 都兰县| 左贡县| 定安县| 内黄县| 丹东市| 聂拉木县| 翁源县| 漳平市| 曲周县| 鹤山市| 汉沽区| 雅安市| 三河市| 毕节市| 洪泽县| 那曲县| 双城市| 县级市| 桦川县| 贵南县| 绥宁县| 铜梁县|