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