1、陣列與迴圈,內 容 大 綱,陣列的宣告與建構陣列元素初始值設定與存取 多維陣列for迴圈敘述巢狀迴圈while迴圈敘述do迴圈敘述,陣列的宣告與建構(1/3),陣列(array)變數可以使用有順序的方式儲存任意個數的相同型別(type)或同一類別(class)的資料,其中每一個儲存在陣列變數中的資料稱為元素(element)。陣列變數的宣告與一般的變數的宣告非常類似,一般變數的宣告再加上一組中刮號配對就可以構成陣列變數宣告,最簡單的陣列變數宣告語法如下:型別 變數識別名稱; 或 型別 變數識別名稱; 在Java語言中,實際上是將陣列視為類別來處理。因此,在上述的兩種陣列變數宣告法中,以第一種方
2、法比較好,因為它較能表達陣列是一種類別的概念(我們可以將型別加上中括號視為是一種能處理陣列資料的特殊類別),陣列的宣告與建構(2/3),我們首先說明陣列的建構(construction),陣列的建構指的是在記憶體中配置一段空間來儲存陣列的元素,既然陣列是一種類別,那麼陣列變數的建構就要使用與類別相同的方式,也就是使用new運算子來建構,其使用法如下所示:變數名稱new 型別陣列大小; 下的程式碼片段中宣告一個可以儲存12個int型別資料的陣列變數陣列1及一個可以儲存7個String類別資料的陣列變數陣列2: int 陣列1; String 陣列2; 陣列1 = new int12; 陣列2 =
3、 new String7;,陣列的宣告與建構(3/3),我們也可以採取較精簡的寫法,如下:int 陣列1 = new int12;String 陣列2 = new String7;,陣列元素初始值設定與存取(1/3),使用new運算子來建構陣列變數時,陣列中的每個元素都會設定成其所屬型別的預設初始值,如int型別之資料初始值為0,boolean型別的初始值為false等等,請參考表4-1以查閱相關的型別初始值設定。若讀者要將陣列中元素的初始值設定為預設初始值以外的值,則可以將元素初始值置於大括號,並且用逗點隔開,其寫法如下: 型別 變數識別名稱=元素0初始值,元素1初始值,;讀者可以發現我們在
4、大括號中第一個寫的是元素0初始值,這是因為在Java語言中陣列中的元素是使用元素編號來區別的,而Java語言中元素編號是從0開始的,陣列元素初始值設定與存取(2/3),以下兩個實例使用直接列出初始值的寫法宣告陣列: int 陣列1=31,29,31,30,31,30,31,31,30,31,30,31; String 陣列2= “星期一”,“星期二”,“星期三”,“星期四”,“星期 五”,“星期六”,“星期天”;這種採用將初始值直接置於大括號中的寫法就不用指定陣列大小(元素個數)了,Java編譯程式會自動計算初始值的個數來決定陣列大小。陣列元素存取的方式相當容易,只要在陣列變數名稱之後加上中括
5、號配對,並於中括號配對中指出元素編號即可 System.out.println(陣列10); System.out.println(陣列111);,陣列元素初始值設定與存取(3/3),陣列實際上被當作類別來處理,而所有的陣列變數都可以使用一個唯讀變數length,這個變數存放陣列的長度(即陣列元素個數),如同類別的用法 陣列變數識別名稱.length 來取得陣列的長度,多維陣列(1/2),陣列的元素也可以是另一個陣列,我們稱之為陣列的陣列(array of array)或多維陣列(multi-dimension array)型別 變數識別名稱; 或 型別 變數識別名稱; 多維陣列也是使用new
6、運算子來建構,例如以下敘述: int 二維陣列=new int34; 宣告一個2維陣列變數二維陣列,此變數第一維度有3個元素,第二維度有4個元素,2維陣列變的第一維度數又稱為列(row),第二維度數又稱為欄(column),因此,變數二維陣列是一個3列4行的維度為2的陣列變數,其儲存資料元素的方式如圖4-1所示,多維陣列(2/2),要存取二維陣列中的元素時,只要利用二個中括號刮起元素編號即可;例如:二維陣列23所謂巢狀(nesting)大括號,指的是一組配對大括號中又有另一組配對大括號出現,多維陣列可以透過巢狀(nesting)的大括號來設定初始值 Example:int 二維陣列= 0,0,
7、0,0, 1,1,1,1, 2,2,2,2 ;Example:此例子可以利用變數陣列1中的元素值來印出公元2000年每個月份的天數,for迴圈敘述(1/10),for迴圈敘述的語法如下: for(初始值設定敘述;條件式;遞增敘述)迴圈敘述區塊for迴圈敘述的流程圖我們先舉一個能夠讓變數i由0,1,變動到11的實例,然後以此實例來解釋迴圈敘述的語法,此實例如下所示: for (i=0;i12;i+) System.out.println(陣列1i);,for迴圈敘述(2/10),上列的迴圈敘述區塊中僅有一個敘述,故此迴圈敘述區塊的左右大括號可以省略,因此,上列的迴圈敘述也可以寫成: for (i
8、=0;i12;i+) System.out.println(陣列1i);上列的迴圈敘述中初始值設定敘述為 i=0; 條件式為 i12; 遞增敘述為i+;,for迴圈敘述(3/10),此迴圈敘述會執行以下步驟:步驟1. 執行初始值設定敘述,本例中的初始值設定敘述為 i=0;此敘述設定變數i的初始值為0。步驟2. 檢查條件式 i5 (8是否大於5) 8=5 (8是否大於或等於5) 58(5是否大於8),for迴圈敘述(6/10),我們也可以用邏輯且(AND) 、邏輯或(OR)來形成複合的 (85) & (35)(是否8大於5而且3大於5) (85) | (35)(是否8大於5或者3大於5)我們也可
9、以使用邏輯反相(NOT)來反轉條件式的值由true為false或由false為true !(58)(5大於8是否不成立) !(85)(8大於5是否不成立),for迴圈敘述(7/10),如同算術運算式的運算子一樣,我們也是分群列出條件運算子,最先列出的運算子有最高的運算優先順序,例如 x5 | y=10 與 (x5) | ( (y=10) )因為與=的優先順序高於|及&,所以x5與y=10會先行運算;而&之的優先順序又高於|,因此(y=10)會先進行運算,而最後才會執行(x5) | ( (y=10) )運算。,for迴圈敘述(8/10),Example/檔名:每月天數.java /說明:此程式可
10、顯示出公元2000年各月份天數public class 每月天數 public static void main(String 變數) int 陣列1=31,29,31,30,31,30,31,31,30,31,30,31; System.out.println(公元2000年各月份之天數表); for (int i=0;i陣列1.length;+i) System.out.println(i+1)+月份天數為+陣列1i+天); /方法:main() 定義區塊結束 /類別:每月天數 定義區塊結束程式執行結果,for迴圈敘述(9/10),Example/檔名:連和連積分數連和.java/說明:輸
11、入一整數n,並計算1+2+n(連和),及1*2*n(連積)/及(1/1)+(1/2)+(1/n)(分數連和)之值import javax.swing.JOptionPane;public class 連和連積分數連和 public static void main(String 參數) int n;/用於儲存使用者輸入之整數 int 連和=0; /用於儲存1+2+之累加值 double 連積=1.0; /用於儲存1*2*之累乘值 double 分數連和=0.0;/用於儲存1(1/1)+(1/2)+之累加值 String 輸入字串=JOptionPane.showInputDialog(“請輸入
12、一正整 數”); n=Integer.parseInt(輸入字串);,for迴圈敘述(10/10),for(int i=1;i=n;+i) /for迴圈敘述中i之值為1,2,n 連和+=i;/將i之值累加至連和中 連積*=i;/將i之值累乘至連積中 分數連和+=(1.0/i); /將(1/i)之值累加至分數連和中 String 顯示字串=”你輸入的正整數為”+n; 顯示字串 = 顯示字串+”n1到”+n+”的連和為”+連和; 顯示字串 = 顯示字串+”n1到”+n+”的連積為”+連積; 顯示字串 = 顯示字串+”n1到”+n+”的分數連和為”+分數連和; JOptionPane.showMes
13、sageDialog(null,顯示字串); System.exit(0); /方法:main() 定義區塊結束 /類別:連和連積分數連和 定義區塊結束程式執行結果,巢狀迴圈(1/2),以下我們介紹巢狀迴圈(nesting loop),所謂巢狀迴圈就是迴圈中還有迴圈(loop of loop)的用法,我們使用以下的實例來說明巢狀迴圈。,巢狀迴圈(2/2),巢狀迴圈程式碼 for (int i=1;i=12;+i) for (int j=1;j10000,利用while敘述求n/ 1+2+m20000,利用do敘述求mpublic class 累加總合超過10000及20000 public s
14、tatic void main (String 參數) int i=0;/變數i用以紀錄目前將累加的整數 int 連和=0; /變數連和用以紀錄目前已累加的總和 while (連和10000”); do 連和 += +i; while(連和20000”); /方法:main() 定義區塊結束 /類別:累加總合超過10000及20000 定義區塊結束程式執行結果,The End,圖4-1,For迴圈流程圖,While迴圈流程圖,do敘述流程圖,表4-1,表4-2,請注意,表4-2依各運算子的運算優先順序(precedence)來列出運算子,先列出的運算子其運算優先順序較高,而列在同一組的運算子則
15、有相同的優先順序。,例子,System.out.println(陣列10);System.out.println(陣列11);System.out.println(陣列12); . .System.out.println(陣列111);,例子,上列的12個敘述可以印出變數陣列1中的第1個元素(編號0)到第12個元素(編號11),我們若仔細觀察這12個敘述,我們會發現這12個敘述幾乎完全一樣,它們之間唯一的差別是中括號中間的元素編號不同而已,假如我們有一種機制能夠將中括號間的編號用變數(假定其識別名稱是i)來取代,並且能夠指定這個變數能夠由0變數變到11,則以下的1個敘述就可以取代上列的12個敘
16、述了: System.out.println(陣列1i);/假設i由0,1,變動到11Java語言提供的迴圈(loop)敘述可以明確的指定上述這種情況Java語言的迴圈敘述有以下三個:for敘述 ,while敘述,do敘述,程式說明,第5行 5: int 陣列1=31,29,31,30,31,30,31,31,30,31,30,31; 此敘述宣告一個具有12個元素的陣列變數陣列1,並利用配對大括號的方式設定變數陣列1個別元素的初值分別為31、29、31、30、31、30、31、31、30、31、30及31。第6行 System.out.println(以下為公元2000年各月份之天數); 此敘
17、述會於命令視窗中印出 以下為公元2000年各月份之天數第7行及第8行 7: for (int i=0;i陣列1.length;+i) 8: System.out.println(i+1)+月份天數為+陣列1i+天);,程式說明,此二行合在一起為一個for迴圈敘述,這一個for迴圈敘述一共會執行 8行的 System.out.println(i+1)+月份天數為+陣列1i+天); 12次,其中第1次執行時,變數i的值為0;第2次執行時,變數i的值為1;依此類推,第12次執行時,變數i的值為11。當第1次執行時,變數i的值為0,則(i+1)的值為1,陣列1i的值(變數陣列1編號為0的元素值)為31
18、,1與31這二個數值會轉為字串1與31之後與月份天數為及天二個字串連結為單一字串1月份天數為31天並顯示於命令視窗中。請注意,第7行for敘述的初值設定敘述中才使用了int關鍵字宣告了變數i,這是迴圈敘述中經常使用的方式,程式設計師經常在迴圈敘述初值設定中才宣告控制迴圈用的變數。,程式說明,第8行 8: int 連和=0; 宣告一個int整數型別的變數連和,並設定其初始值為0,請注意,變數連和是用來儲存1+2+的累加值的,因為加上0不會影響任何累加值,因此用來儲存累加值的變數的初始值都會設為0。第9行 9: double 連積=1.0; 宣告一個double倍精準度浮點數型別的變數連積,並設定
19、其初始值為1.0,請注意,變數連積是用來儲存12的累乘值的,因為乘上1不會影響任何累乘值,因此用來儲存累乘值的變數的初始值都會設為1。,程式說明,第13-17行 13: for(int i=1;i=n;+i) /for迴圈敘述中i之值為1,2,n 14: 連和+=i;/將i之值累加至連和中 15: 連積*=i;/將i之值累乘至連積中 16: 分數連和+=(1.0/i);/將(1/i)之值累加至分數連和中 17: 此5行構成一個for迴圈敘述,此迴圈敘述會執行14行、15行及16行的敘述n次,其中第1次執行時,變數i的值為1;第2次執行時,變數i的值為2;依此類推,第n次執行時,變數i的值為n。
20、 敘述連和+=i;會將變數i的值加至變數連和中,此敘述在變數i的值為1、2、n的情況下執行n次後,可將1、2、n等n個值加至變數連和中,而變數連和的初始值為0,因此,變數連和在迴圈敘述執行完畢之後所紀錄的值即為0+1+2+n(即1至n的連和)。,程式說明,敘述連積*=i;會將變數i的值累乘至變數連積中,此敘述在變數i的值為1、2、n的情況下執行n次後,可將1、2、n等n個值累乘至變數連積中,而變數連積的初始值為1,因此,變數連積在迴圈敘述執行完畢之後所紀錄的值即為112n(即1至n的連積)。同樣的,敘述分數連和+=(1.0/i);會將(1.0/i)的值加至變數分數連和中,此敘述在變數i的值為1
21、、2、n的情況下執行n次後,可將(1.0/1)、(1.0/2)、(1.0/n)等n個值加至變數分數連和中,而變數分數連和的初始值為0,因此,變數分數連和在迴圈敘述執行完畢之後所紀錄的值即為0+(1.0/1)+(1.0/2)+(1.0/n)(即1至n的分數連和)。,程式說明,第9-10行 9: while (連和=10000) 10: 連和 += +i; 此二行構成while迴圈敘述,此迴圈敘述的條件式為連和 =10000,因此,當連和的值小於等於10000時,迴圈敘述區 塊中的敘述都會一再的執行。而本例中迴圈敘述區塊僅含有 一個敘述:連和 += +i;此敘述執行時會先進行+i的運算 (也就是將
22、變數i的值加1),然後再將變數i新運算出來的值加入 變數連和之中。所以,當變數連和的值超過10000,使得條件 式連和=10000不成立而讓while迴圈敘述終止時,變數i的值 所紀錄的就是第一個使連和1+2+的值超過10000的整數。,程式說明,第12行 12: do 連和 += +i; while(連和=20000); 此行構成do迴圈敘述,此迴圈敘述的條件式為連和=20000,因此,當連和的值小於等於20000時,迴圈敘述區塊中的敘述都會一再的執行。而本例中迴圈敘述區塊僅含有一個敘述:連和 += +i;此敘述執行時會先進行+i的運算(也就是將變數i的值加1),然後再將變數i新運算出來的值加入變數連和之中。所以,當變數連和的值超過20000,使得條件式連和=20000不成立而讓do迴圈敘述終止時,變數i的值所紀錄的就是第一個使連和1+2+的值超過20000的整數。,執行結果,執行結果(命令視窗指令:java Run每月天數),執行結果,執行結果(命令視窗指令:java Run 連和連積分數連和),執行結果,執行結果(命令視窗指令:java Run 累加總合超過10000及20000),