陣列與迴圈.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

四資二甲 第三週作業 物件導向程式設計.
JAVA 程式設計 資訊管理系 - 網路組.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
第三章 控制结构.
Chapter 5 迴圈.
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
第十一章 結構.
LINQ 建國科技大學 資管系 饒瑞佶.
Java簡介.
簡易C++除錯技巧 長庚大學機械系
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
2-3 基本數位邏輯處理※.
第四章 流程控制(一) if,if-else 與 switch
保留字與識別字.
Java程式概觀.
流程控制 大綱 傳遞參數給main()方法 流程控制的用途與種類 if判斷敘述 switch 判斷敘述.
程式設計實作.
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
Java 程式設計 講師:FrankLin.
邏輯關係運算 == 等於 & 且 (logical and) ~= 不等於 | 或 (logical or) < 小於
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
|12 結構與列舉型態.
第一單元 建立java 程式.
陣列(Array).
第 19 章 XML記憶體執行模式.
第二章Java基本程序设计.
JAVA 程式設計 資訊管理系 - 網路組.
輸入&輸出 函數 P20~P21.
ASP基礎— VBScript基本語法 張森.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
使用VHDL設計 七段顯示器 通訊工程系 一年甲班 姓名 : 蘇建宇 學號 : B
CH05. 選擇敘述.
期末考.
撰寫MATLAB基礎財務程式 柯婷瑱.
第7章 指標 7-1 指標的基礎 7-2 指標變數的使用 7-3 指標運算 7-4 指標與陣列 7-5 指向函數的指標.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
C qsort.
Video 影像 (VideoPlayer 影像播放器、Camcorder 錄影機) 靜宜大學資管系 楊子青
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
函數應用(二)與自定函數.
陣列與結構.
第二章 Java基本语法 讲师:复凡.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
第二章 Java基本语法 讲师:复凡.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
迴圈(重複性結構) for while do while.
Programming & Language Telling the computer what to do
Introduction to the C Programming Language
開發Java程式語言的工具 JDK.
變數、常數與資料型態 大綱 變數與常數 變數 資料型別 資料的輸出.
判斷(選擇性敘述) if if else else if 條件運算子.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Array(陣列) Anny
SQLite資料庫 靜宜大學資管系 楊子青.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
Introduction to the C Programming Language
第二章 Java基本语法 讲师:复凡.
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

陣列與迴圈

內 容 大 綱 陣列的宣告與建構 陣列元素初始值設定與存取 多維陣列 for迴圈敘述 巢狀迴圈 while迴圈敘述 do迴圈敘述

陣列的宣告與建構(1/3) 陣列(array)變數可以使用有順序的方式儲存任意個數的相同型別(type)或同一類別(class)的資料,其中每一個儲存在陣列變數中的資料稱為元素(element)。 陣列變數的宣告與一般的變數的宣告非常類似,一般變數的宣告再加上一組中刮號配對就可以構成陣列變數宣告,最簡單的陣列變數宣告語法如下: 型別[] 變數識別名稱; 或 型別 變數識別名稱[]; 在Java語言中,實際上是將陣列視為類別來處理。因此,在上述的兩種陣列變數宣告法中,以第一種方法比較好,因為它較能表達陣列是一種類別的概念(我們可以將型別加上中括號視為是一種能處理陣列資料的特殊類別)

陣列的宣告與建構(2/3) 我們首先說明陣列的建構(construction),陣列的建構指的是在記憶體中配置一段空間來儲存陣列的元素,既然陣列是一種類別,那麼陣列變數的建構就要使用與類別相同的方式,也就是使用new運算子來建構,其使用法如下所示:變數名稱=new 型別[陣列大小]; 下的程式碼片段中宣告一個可以儲存12個int型別資料的陣列變數陣列1及一個可以儲存7個String類別資料的陣列變數陣列2: int[] 陣列1; String[] 陣列2; 陣列1 = new int[12]; 陣列2 = new String[7];

陣列的宣告與建構(3/3) 我們也可以採取較精簡的寫法,如下: int[] 陣列1 = new int[12];  String[] 陣列2 = new String[7];

陣列元素初始值設定與存取(1/3) 使用new運算子來建構陣列變數時,陣列中的每個元素都會設定成其所屬型別的預設初始值,如int型別之資料初始值為0,boolean型別的初始值為false等等,請參考表4-1以查閱相關的型別初始值設定。 若讀者要將陣列中元素的初始值設定為預設初始值以外的值,則可以將元素初始值置於大括號,並且用逗點隔開,其寫法如下: 型別[] 變數識別名稱={元素0初始值,元素1初始值,……}; 讀者可以發現我們在大括號中第一個寫的是元素0初始值,這是因為在Java語言中陣列中的元素是使用元素編號來區別的,而Java語言中元素編號是從0開始的

陣列元素初始值設定與存取(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]);

陣列元素初始值設定與存取(3/3) 陣列實際上被當作類別來處理,而所有的陣列變數都可以使用一個唯讀變數length,這個變數存放陣列的長度(即陣列元素個數),如同類別的用法 陣列變數識別名稱.length 來取得陣列的長度

多維陣列(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所示

多維陣列(2/2) 要存取二維陣列中的元素時,只要利用二個中括號刮起元素編號即可;例如:二維陣列[2][3] 所謂巢狀(nesting)大括號,指的是一組配對大括號中又有另一組配對大括號出現,多維陣列可以透過巢狀(nesting)的大括號來設定初始值 Example:  int[][] 二維陣列={ {0,0,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;i<12;i++) { System.out.println(陣列1[i]);}

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++;

for迴圈敘述(3/10) 此迴圈敘述會執行以下步驟: 步驟1. 執行初始值設定敘述,本例中的初始值設定敘述為 i=0;此敘述設定變數i的初始值為0。 步驟2. 檢查條件式 i<12 是true還是false(條件式成立其值為true,條件式不成立其值為false),若條件式不成立則跳至步驟6結束迴圈敘述的執行,否則(即條件式成立)直接進入步驟3。 步驟3. 依序執行迴圈敘述區塊中的敘述。 在本例中迴圈敘述區塊中唯一的敘述為 System.out.println(陣列1[i]);

for迴圈敘述(4/10) 步驟4. 執行遞增敘述。 本例中的遞增敘述為 i++;此敘述會將i的值增加1。 步驟5. 跳回步驟2。 步驟6. 離開迴圈。 迴圈敘述的停止與否是依賴條件式(conditional expression)是否成立來作判斷的。表4-2所列是各種成條件式的運算子。

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)

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是否不成立)

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) )運算。

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() 定義區塊結束 } //類別:每月天數 定義區塊結束 程式執行結果

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(輸入字串);

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() 定義區塊結束 } //類別:連和連積分數連和 定義區塊結束 程式執行結果

巢狀迴圈(1/2) 以下我們介紹巢狀迴圈(nesting loop),所謂巢狀迴圈就是迴圈中還有迴圈(loop of loop)的用法,我們使用以下的實例來說明巢狀迴圈。

巢狀迴圈(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),我們可以看出來,外迴圈將整個的內迴圈包覆在內,這也是內外迴圈說法的由來。

while迴圈敘述(1/1) while (條件式) 一個while敘述的語法如下 迴圈敘述區塊 此敘述在執行時會先檢查條件式是否為true,若條件式為true,則執行迴圈敘述區塊中的敘述,之後,再度檢查條件式是否為true,若條件式為true,則再度執行迴圈敘述區塊中的敘述,如此週而復始,若條件式為true,則迴圈敘述區塊中的敘述會不斷的執行直到條件式為false為止。 while敘述流程圖

do迴圈敘述(1/3) do敘述的型式與while敘述十分接近,主要的差別是執行條件檢查的地方不同而已,while敘述的條件檢查在執行迴圈敘述區塊之前,而do敘述的條件檢查在執行迴圈敘述區塊之後。 do敘述的語法如下: do 迴圈敘述區塊 while(條件式); do敘述的迴圈敘述區塊會不斷的執行直到條件式為fasle為止 do敘述流程圖

do迴圈敘述(2/3) //檔名:累加總合超過10000及20000.java //說明:1+2+…+n>10000,利用while敘述求n // 1+2+…+m>20000,利用do敘述求m public class 累加總合超過10000及20000{ public static void main (String[] 參數){ int i=0; //變數i用以紀錄目前將累加的整數 int 連和=0; //變數連和用以紀錄目前已累加的總和 while (連和<=10000) 連和 += ++i;

do迴圈敘述(3/3) System.out.println(”1+2+…+”+i+”>10000”); do 連和 += ++i; while(連和<=20000); System.out.println(”1+2+…+”+i+”>20000”); }//方法:main() 定義區塊結束 } //類別:累加總合超過10000及20000 定義區塊結束 程式執行結果

The End

圖4-1

For迴圈流程圖

While迴圈流程圖

do敘述流程圖

表4-1

表4-2 請注意,表4-2依各運算子的運算優先順序(precedence)來列出運算子,先列出的運算子其運算優先順序較高,而列在同一組的運算子則有相同的優先順序。

例子 System.out.println(陣列1[0]); System.out.println(陣列1[1]);

例子 上列的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敘述

程式說明 第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]+"天");

程式說明 此二行合在一起為一個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,這是迴圈敘述中經常使用的方式,程式設計師經常在迴圈敘述初值設定中才宣告控制迴圈用的變數。

程式說明 第8行 8: int 連和=0; 宣告一個int整數型別的變數連和,並設定其初始值為0,請注意,變數連和是用來儲存1+2+…的累加值的,因為加上0不會影響任何累加值,因此用來儲存累加值的變數的初始值都會設為0。 第9行 9: double 連積=1.0;; 宣告一個double倍精準度浮點數型別的變數連積,並設定其初始值為1.0,請注意,變數連積是用來儲存12…的累乘值的,因為乘上1不會影響任何累乘值,因此用來儲存累乘值的變數的初始值都會設為1。

程式說明 第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的連和)。

程式說明 敘述連積*=i;會將變數i的值累乘至變數連積中,此敘述在變數i的值為1、2、…、n的情況下執行n次後,可將1、2、…、n等n個值累乘至變數連積中,而變數連積的初始值為1,因此,變數連積在迴圈敘述執行完畢之後所紀錄的值即為112…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的分數連和)。

程式說明 第9-10行 9: while (連和<=10000) 10: 連和 += ++i; <=10000,因此,當連和的值小於等於10000時,迴圈敘述區 塊中的敘述都會一再的執行。而本例中迴圈敘述區塊僅含有 一個敘述:連和 += ++i;此敘述執行時會先進行++i的運算 (也就是將變數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)