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

4.4 循環結構

循環結構是在一定條件下,反復執行某段程序的控制結構,被反復執行的語句序列稱為循環體。在Java語言中循環結構是由循環語句來實現的。Java語言中的循環語句共有三種:while語句、do-while語句和for語句。

4.4.1 while語句

while語句是循環語句,也是條件判斷語句。while語句的一般語法結構如下:

     while(條件表達式)
     {
       循環體
     }

循環體可以是單個語句,也可以是復合語句。while語句的執行過程是先判斷條件表達式的值,若為真,則執行循環體,循環體執行完之后,再轉到條件表達式重新計算表達式的值并判斷條件表達式值的真假;直到當計算出的條件表達式的值為假時,才跳過循環體執行while語句后面的語句,循環終止。

while語句的循環執行過程如圖4.5所示。

圖4.5 while語句的循環執行過程

例4.5】 計算Fibonacci(斐波那契)序列的前16項。Fibonacci序列的通項公式為

程序運行結果:

     0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

該程序的第8~14行是一個while循環,第10行是每次輸出兩個數,第11和12兩行分別是用于計算Fibonacci序列中的下一個數。

例4.6】 從鍵盤上輸入一個數,判斷該數是否是Fibonacci序列中的數。

程序運行結果:

     請輸入一個正整數:234↙
     234不是Fibonacci數

該程序的第12~13行是從鍵盤上輸入一個數;第14行是while循環的頭,第16~18行是循環體,用于計算Fibonacci數列的遞推公式;第20、21兩行根據計算的結果判斷其是否為Fibonacci數列中的數,然后輸出相應的結果。

例4.7】 利用hasNextXXX()和nextXXX()方法的配合使用來完成鍵盤輸入。用戶在鍵盤上輸入若干個數,每輸入一個數需按Enter鍵或Tab鍵或空格鍵確認,最后在鍵盤上輸入一個非數字字符串結束整個輸入操作過程,然后計算這些數的和。hasNextXXX()和nextXXX()方法的功能見3.6節。

程序運行結果:

     請輸入多個數,每輸入一個數后按Enter或Tab或空格鍵確認:
     最后輸入一個非數字結束輸入操作
     3 ↙
     4.8 ↙
     5 ↙
     5.6 ↙
     w ↙
     共輸入了4個數,其和為:18.4

程序中的第11行是用指定的流創建一個Scanner類的對象reader,第12行判斷只要有數據輸入且是double型,則進入循環內,第14行是從鍵盤上讀取一個double型數值存入x中。該程序運行時,用戶在鍵盤上每次輸入一個數值后都需要按Enter或Tab鍵或空格鍵進行確認,最后輸入一個非數字字符結束輸入操作,因為當輸入一個非數字字符并按Enter鍵后,reader.hasNextDouble()的值為flase。

說明當要求輸入的數據是較長的數據類型(如double型)時,但實際輸入的數據是較短的數據類型(如int或float)時,則系統會自動的強制轉換成較長的數據類型的數據(如double型)。

4.4.2 do-while語句

do-while語句的一般語法結構如下。do-while循環語句的流程如圖4.6所示。

圖4.6 do-while循環語句的流程

     do
     {
         循環體
     }
     while(條件表達式);

do-while語句的使用與while語句很類似,不同的是它不像while語句是先計算條件表達式的值,而是無條件地先執行一遍循環體,再來判斷條件表達式的值,若表達式的值為真,則再執行循環體,否則跳出do-while循環,執行下面的語句。可見,do-while語句的特點是它的循環體至少被執行一次。

注意與while循環語句的一個主要區別是do-while循環語句在結尾處加了一個分號“;”。

例4.8】 從鍵盤上輸入一個正整數n,然后計算1+2+…+n的結果并輸出。

程序運行結果:

該程序的第9~12行是利用do-while循環從鍵盤上輸入數據,直到輸入的數大于0為止;第13、14兩行是利用while循環求和;第15行輸出計算結果。

例4.9】 用輾轉相除法求兩個整數的最大公約數。

設有不全為0的整數a和b,它們的最大公約數記為gcd(a,b),即同時能整除a和b的公因數中的最大者。按照歐幾里得(Euclid)的輾轉相除算法,gcd(a,b)具有如下性質:

①gcd (a, b)=gcd (b, a)。

②gcd (a, b)=gcd (—a, b)。

③gcd(a,0)=|a|。

④gcd (a, b)=gcd (b, a%b), 0≤a%b<b。

本例程序中反復運用性質④,最終可使得第二個參數a%b等于0,則第一個參數就是所求的最大公約數。程序如下:

程序運行結果如下:

     請輸入第一個數a=12↙
     請輸入第二個數b=18↙
     gcd(12,18)=6

該程序在第18~22行的do-while循環中,利用輾轉相除法來求兩個數的最大公約數,第23行是將最大公約數輸出。

例4.10】 已知s=n!,其中n為正整數,從鍵盤上任意輸入一個大于1的整數m,求滿足s<m時的最大s及此時的n,并輸出s和n的值。

程序運行結果為:

     請輸入大于1的整數m:100↙
     s=24  n=4

該程序的第9~12行的do-while語句是要求所輸入的數必須為大于1的整數,否則重復循環,直到輸入大于1的整數為止;第13~17行是利用while循環求滿足條件n!<m的階乘;當退出該循環時,則s和n并不滿足本題的條件,所以第18行在輸出時,必須修正為s/(n—1)和n—2,這才是滿足題意要求的結果。

4.4.3 for語句

for語句是Java語言三個循環語句中功能較強,使用較廣泛的一個。

for循環語句的基本使用格式如下。其執行流程如圖4.7所示。

圖4.7 for循環結構的流程

     for(表達式1;條件表達式;表達式2)
     {
         循環體
     }

其中,“表達式1”是用作初始化的表達式,完成初始化循環變量和其他變量的工作;“條件表達式”的返回值為邏輯型量,用來判斷循環是否繼續;“表達式2”是循環后的操作表達式,用來修改循環變量,改變循環條件。三個表達式之間用分號隔開。

for語句的執行過程:首先計算“表達式1”,完成必要的初始化工作;再判斷條件表達式的值,若為假,則退出循環,若為真,則執行循環體,執行完循環體后再返回“表達式2”,計算并修改循環條件,這樣一輪循環就結束了。第二輪循環從計算并判斷條件表達式開始,若表達式的值仍為真,則繼續循環,否則,跳出整個for語句執行下面的句子。

說明for語句的三個表達式都可以為空,但是,若條件表達式也為空,則表示當前循環是一個無限循環,需要在循環體中書寫另外的跳轉語句來終止循環。

例4.11】 求1~10的累加和。

本例演示了for語句的兩種使用方法。

方法一:循環變量i以遞增方式從1變化到n,循環體語句執行n=10次,循環執行完后輸出結果s。

方法二:i以遞減方式變化。由于要寫出累加的算式,i及加號“+”應寫在循環體中,而n個數只需要寫n—1個加號,所以循環語句只需執行n—1=9次就夠了,此時設計i從n變化到2,循環執行完后再寫最后一個i值及最后一次運算的結果(s+i)。

本例采用兩種方法分別運算,程序如下:

該程序的執行結果如下:

     Sum=1+…+10=55
     Sum=10+9+8+7+6+5+4+3+2+1=55

該程序是用兩個for循環語句分別完成從1~10累加求和的。第7、8行是第一個for循環,該循環的循環體只有第8行一條語句,所以不用花括號將其括上,該循環是從1~10進行累加求和;第12~16行是第二個for循環,該循環是從10~2進行累加求和;最后的數1是在第17行的輸出語句中加上的。

4.4.4 多重循環

如果循環語句的循環體內又有循環語句,則稱多重循環,也稱循環嵌套。常用的有二重循環和三重循環。在實現手段上即可以是相同循環語句嵌套,也可以是兩個不同的循環語句構成嵌套結構。下面舉例說明。

例4.12】 求100以內的素數,并輸出。

素數是指除1和自身外,不能被其他整數整除的數。顯然最小的素數是2,其余偶數均不是素數。對于一個奇數k,使用3~的每個整數j去除k,如果找到一個整數j能除盡k,則k不是素數;而只有測試完3~中的所有整數j都不能除盡k,才能確定k是素數。程序如下:

程序運行結果如下:

在本程序第15行中的Math.sqrt(k)方法返回k的平方根值。第12~24行定義的do-while外層循環,用于遍歷3~100的奇數;第15、16行定義的內層while循環,用于判別k是否是素數,當找到一個3~的整數j能除盡k,則k不是素數,退出內循環,此時j<Math.sqrt(k)。內層循環結束后,如果第17行的j>Math.sqrt(k)條件成立,說明沒有一個j能除盡k,則k是素數。外層do-while循環逐個測試100以內的奇數,循環初值k=3,每次遞增值為2,這樣可以減少循環次數,縮短運行時間,提高程序效率。

主站蜘蛛池模板: 涿鹿县| 新密市| 正镶白旗| 鲁甸县| 崇信县| 日土县| 灵武市| 裕民县| 武清区| 东港市| 日照市| 新化县| 南召县| 泸水县| 荣成市| 怀安县| 明水县| 泸定县| 天津市| 洪江市| 印江| 卫辉市| 漾濞| 六安市| 越西县| 舟曲县| 车致| 布拖县| 右玉县| 霞浦县| 沅江市| 苗栗县| 庐江县| 和平县| 邵东县| 耒阳市| 海阳市| 衡东县| 大悟县| 南丰县| 松溪县|