- Java常用算法手冊(第3版)
- 宋娟
- 2352字
- 2020-06-23 15:32:49
1.9 循環(huán)結(jié)構(gòu)
在程序設(shè)計中,有時需要反復(fù)執(zhí)行一段相同的代碼,直到滿足一定的條件為止,或者某個條件不再滿足為止。與其他任何計算機語言一樣,Java也提供了循環(huán)結(jié)構(gòu)。
循環(huán)結(jié)構(gòu)一般包含如下四部分內(nèi)容。
(1)初始化部分:用來設(shè)置循環(huán)控制的初始條件,如設(shè)置計數(shù)器初值等。
(2)循環(huán)體部分:反復(fù)執(zhí)行的一段代碼,可以是一條語句,也可以是復(fù)合語句。
(3)迭代部分:用來修改循環(huán)控制條件。一般在本次循環(huán)結(jié)束,下次循環(huán)開始前執(zhí)行。循環(huán)結(jié)構(gòu)的這一部分不能缺少。如果循環(huán)控制條件不改變就會造成死循環(huán),除非使用break這樣的語句跳出循環(huán)。
(4)判斷部分:一般是一個關(guān)系表達式或邏輯表達式,其值用來判斷是否滿足循環(huán)終止條件。每執(zhí)行一次循環(huán)都要對該表達式求值。
下面介紹Java循環(huán)語句while、do…while和for語句。
1.9.1 while循環(huán)
無法得知一個循環(huán)會被重復(fù)執(zhí)行多少次時,可以選擇while循環(huán)。while循環(huán)又稱“當(dāng)型循環(huán)”。while語句的格式如下:

注意:(1)首先初始化控制條件。
(2)當(dāng)循環(huán)條件表達式的值為true時,循環(huán)執(zhí)行循環(huán)體。若某次判斷循環(huán)條件表達式的值為false時,則結(jié)束循環(huán)的執(zhí)行。
(3)while循環(huán)首先計算循環(huán)條件,當(dāng)條件滿足時,才去執(zhí)行循環(huán)體中的語句或代碼塊;如果首次計算循環(huán)條件就不滿足,則循環(huán)體中的語句或代碼塊一次都不會執(zhí)行。
(4)while循環(huán)通常用于循環(huán)次數(shù)不確定的情況,但也可以用于循環(huán)次數(shù)確定的情況。
while循環(huán)流程圖如圖1-28所示。

圖1-28 while循環(huán)流程圖
1.9.2 do…while循環(huán)
do…while語句用來實現(xiàn)“直到型循環(huán)”,采用格式如下:

說明:do…while循環(huán)先執(zhí)行一次循環(huán)體,然后才對循環(huán)條件進行判斷。如果為true,則再次執(zhí)行循環(huán)體,直到循環(huán)條件為false,結(jié)束循環(huán),繼續(xù)執(zhí)行后續(xù)程序。
根據(jù)這樣的執(zhí)行方式,可以發(fā)現(xiàn)無論循環(huán)條件是true還是false,循環(huán)體至少被執(zhí)行一次。另外,如果循環(huán)條件表達式的值開始就為false,那么即使循環(huán)體中不包含對循環(huán)條件的修改,也不會造成死循環(huán)。do…while循環(huán)流程圖如圖1-29所示。

圖1-29 do…while循環(huán)流程圖
1.9.3 for循環(huán)
當(dāng)事先知道了循環(huán)會被重復(fù)執(zhí)行多少次時,可以選擇Java提供的步長型循環(huán)結(jié)構(gòu)for循環(huán)。for循環(huán)語句的格式如下。

說明:(1)for循環(huán)執(zhí)行時,首先執(zhí)行初始化操作,然后判斷循環(huán)條件是否滿足。如果滿足,則執(zhí)行循環(huán)體中的語句,最后執(zhí)行循環(huán)變量修改部分。完成一次循環(huán)后,重新判斷終止條件。
(2)可以在for循環(huán)的初始化部分聲明一個變量,它的作用域為整個for循環(huán)。
(3)for循環(huán)通常用于循環(huán)次數(shù)確定的情況,但也可以根據(jù)循環(huán)結(jié)束條件完成循環(huán)次數(shù)不確定的情況。
(4)在初始化部分和循環(huán)變量修改部分可以使用逗號語句來進行多個操作。例如:
for(i=0,j=10;i<j;i++,j--)
(5)初始化、條件表達式和循環(huán)變量修改部分都可以為空語句,但分號不能省略。例如:

這樣與for(i=1;i<=5;i++)語句是相同的效果。
(6)for循環(huán)與while循環(huán)是可以相互轉(zhuǎn)換的。例如:

for循環(huán)流程如圖1-30所示。

圖1-30 for循環(huán)流程圖
1.9.4 編程實例
【程序1-7】編寫程序,使用while循環(huán)來計算1+2+3+…+100的值。

【分析】while循環(huán)通常用于循環(huán)次數(shù)不確定的時候,在這種情況下,循環(huán)體中通常有更改循環(huán)條件的語句或break語句。此外,while循環(huán)也可用于循環(huán)次數(shù)已知的情況下。相當(dāng)于for循環(huán),while中必須要有讓循環(huán)變量值更改的語句。
本例中是計算累加和,因此存放結(jié)果的變量,其初始值是0。如果是存放累乘的結(jié)果,則初始值應(yīng)該是1,因為1和任何數(shù)相乘都不會更改結(jié)果,而0則不行。
使用while計算累加,如圖1-31所示。

圖1-31 使用while計算累加
【程序1-8】編寫程序,計算1+1/3+1/5+1/7+…+1/(2×n+1)的值。要求使用while循環(huán),且必須計算到1/(2×n+1)小于0.00001時為止。當(dāng)循環(huán)結(jié)束時,顯示上述表達式中n的值,以及表達式的計算結(jié)果。

【分析】根據(jù)題目的要求及題目要完成的計算,應(yīng)該選擇do…while循環(huán)。
使用do…while循環(huán)如圖1-32所示。

圖1-32 使用do…while循環(huán)
【程序1-9】編寫程序,將ASCII碼位于32~126之間的95個字符顯示在屏幕上。為了美觀,要求小于100的碼值前填充一個0,每打印8個字符后換行。

【分析】本題主要包含for循環(huán)、三目運算符、類型強制轉(zhuǎn)換、取余操作這4個知識點。編寫程序時,難度就在于如何控制換行。要在一行打印多項數(shù)據(jù)時,應(yīng)該使用System.out.print而不是System.out.println。當(dāng)需要產(chǎn)生換行時,可以用語句System.out.print("\n");或者System.out.println();。本例要控制換行,可以另外定義一個計數(shù)器變量。但最好的方式就是使用循環(huán)變量來控制換行。因為for循環(huán)是從32循環(huán)到126,只需在循環(huán)變量減去31后能被8整除時,產(chǎn)生一個換行,就能實現(xiàn)題目的要求。此外,對整數(shù)類型,可以強制其類型為字符類型。語法為“char ch=(char)int型變量;”。
打印ASCII編碼如圖1-33所示。

圖1-33 打印ASCII編碼
【程序1-10】通過枚舉求畢業(yè)生人數(shù)和已就業(yè)學(xué)生的人數(shù)。已知某大學(xué)軟件學(xué)院本年度畢業(yè)生的人數(shù)為三百人左右,且學(xué)生就業(yè)率為83.23%。通過for循環(huán),來求出最可能的學(xué)生人數(shù)及已就業(yè)人數(shù)。假定總?cè)藬?shù)三百人左右的描述,是指人數(shù)上下波動在20以內(nèi)。


【分析】本例主要使用for循環(huán),核心語句是for(int i=iNum-iOff+1;i<=iNum+iOff;i++)。實現(xiàn)的思路是對每一個可能的人數(shù)進行列舉,根據(jù)已知的就業(yè)率求出就業(yè)學(xué)生人數(shù),此時要進行四舍五入。再根據(jù)求出的取整后的就業(yè)學(xué)生人數(shù),除以總?cè)藬?shù),得到一個計算出來的就業(yè)率。計算此就業(yè)率和已知值之間的差,和已知值之間相差最小的就是所求的結(jié)果。
注意帶小數(shù)點的數(shù)字,必須以f或者F結(jié)尾,否則會被當(dāng)成雙精度型。
存放某次枚舉時計算得到的就業(yè)率與真實就業(yè)率之間差值的變量fMinDiff,必須賦一個初值。這里先賦了一個在上下文環(huán)境中的最大值1.0。很顯然,在進行第一次比較后,此原始值就會被舍棄。但是,必須賦予一個恰當(dāng)?shù)某踔怠?/p>
【思考】如果賦0.1或是0的初值可以嗎?
通過for循環(huán)進行枚舉如圖1-34所示。
【程序1-11】編寫程序,使用for循環(huán)的嵌套,打印出九九乘法表。

圖1-34 通過for循環(huán)進行枚舉

【分析】注意for循環(huán)嵌套時,外層循環(huán)變量i的取值范圍為1~9,而內(nèi)層循環(huán)變量j的取值范圍為1~i。此外,打印時要在恰當(dāng)?shù)牡胤疆a(chǎn)生換行。
打印乘法表如圖1-35所示。

圖1-35 打印乘法表
- QTP自動化測試最佳實踐
- UML基礎(chǔ)與Rose建模案例(第3版)
- 經(jīng)·理@互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的進階修煉
- C語言點滴
- 從隱秩序到顯規(guī)則:工程體系基于V++規(guī)則引擎的生態(tài)演進
- 邊緣云部署與運營:系統(tǒng)性實現(xiàn)方法
- 區(qū)塊鏈核心算法解析
- 構(gòu)建跨平臺APP:jQuery Mobile移動應(yīng)用實戰(zhàn)(第2版) (跨平臺移動開發(fā)叢書)
- Spring Cloud微服務(wù)快速上手
- UG NX 8.0實例教程(第2版)
- PHP從入門到精通(第6版)
- 云原生測試實戰(zhàn)
- C語言程序開發(fā)范例寶典(軟件工程師典藏版)
- OpenGL ES 2.0游戲開發(fā)(下卷)
- 數(shù)據(jù)壓縮入門