1 / 125

第 5 章  陣列與字串

第 5 章  陣列與字串. Java 2 程式設計入門與應用. 目錄. 5-1  陣列 5-2  排序與搜尋 5-3  字元與字串陣列 溫故知新 自我突破習題. 5-1 陣列. 5-1.1  陣列的意義 5-1.2  一維陣列的宣告 5-1.3  一維陣列初始值的設定 5-1.4  二維陣列的宣告 5-1.5  二維陣列初始值的設定. 前言:. 陣列( Array )是一群由相同型態的元素所集合而成的特殊型態,當程式需要 一系列 具有相同型態的多項資料時,便可以利用陣列來存取資料,有別於每個變數只能儲存一個資料的特性。.

Download Presentation

第 5 章  陣列與字串

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5章 陣列與字串 Java 2 程式設計入門與應用

  2. 目錄 • 5-1 陣列 • 5-2 排序與搜尋 • 5-3 字元與字串陣列 • 溫故知新 • 自我突破習題

  3. 5-1 陣列 • 5-1.1 陣列的意義 • 5-1.2 一維陣列的宣告 • 5-1.3 一維陣列初始值的設定 • 5-1.4 二維陣列的宣告 • 5-1.5 二維陣列初始值的設定

  4. 前言: • 陣列(Array)是一群由相同型態的元素所集合而成的特殊型態,當程式需要一系列具有相同型態的多項資料時,便可以利用陣列來存取資料,有別於每個變數只能儲存一個資料的特性。

  5. 5-1.1 陣列的意義 • 變數是指程式中可以用來儲存資料空間的名稱,使用者可以用它來存放任何數值、文字……等資料,如同每個人有一個名字一樣,當程式中需要使用某變數時,可以用此名稱來稱呼它。 • 若程式中需要一系列具有相同型態的多項資料時,如果一個一個加以設定成變數的話,對於量小的資料,可能還好,但對於量大的資料,可能吃不消,光是定義變數名稱,就得想好幾個。這時如果使用陣列來代表這一系列的多項資料,便輕鬆多了! • 其實,可以將陣列想成電腦中一塊連續的記憶體,這塊連續記憶體被分成許多相同大小的小空間,每個小空間會依照順序從0開始給予一個編號,日後若需要某個小空間的資料,就可以用編號來存取該小空間的資料。

  6. 一維陣列: • 依照排列的方式,陣列分為一維陣列和多維陣列。 • 一維陣列是指這些小空間是以直線的方式排列,而且每個小空間都依序編號來區別,此順序編號稱為索引值(Index),而陣列中每一個小空間所存放的資料稱為元素(Element)。

  7. 多維陣列: • 而多維陣列是指二維陣列、三維陣列、四維陣列……等,以二維陣列來說,二維陣列是指這些小空間會以兩個編號來區別。

  8. 5-1.2 一維陣列的宣告 • 在程式中想要使用陣列儲存資料時,必須先為陣列命名,以便在程式中呼叫。 • 陣列命名的原則與變數都是一樣的,而且資料型別也與變數相同,所以如果對變數的命名方式與變數資料型別都了解的話,可以直接應用在陣列中。 • 在Java中,只要在陣列名稱前面加上資料型別的名稱(資料的型別與變數的型別一樣,有位元組、短整數、整數、長整數、浮點數、倍精度浮點數、布林、字元等),就達到宣告的動作。

  9. 以下是宣告一維陣列的語法: • 在宣告陣列時,如果不指定初始值,就要利用關鍵字new配置記憶體空間給該陣列,其語法如下: • 上述語法中的陣列名稱只要依照變數的命名規則命名即可,比較特別的是,利用new配置記憶體空間時,必須在資料型別後面加上[],並在[]中填上此陣列的大小(Size),例如:int X[]=new int[7],就表示陣列名稱為X,而有7個整數元素的陣列。

  10. 以下是宣告不同資料型別的一維陣列,其程式碼如下:以下是宣告不同資料型別的一維陣列,其程式碼如下: • 指定陣列的資料型別後,陣列內各元素都是相同的資料型別,例如:short b[]=new short[11],表示系統連續分配了11個單位的短整數空間給b陣列,若一個短整數佔用2 Bytes,則short b[]=new short[11]就是分配了22 Bytes。

  11. 以下是同樣資料型別的陣列一起放在資料型別的後面,宣告的程式碼如下:以下是同樣資料型別的陣列一起放在資料型別的後面,宣告的程式碼如下: • 除了將多個陣列一行一行分別宣告以外,也可以將多個同樣資料型別的陣列一起放在資料型別的後面,並以逗號,分隔;但若是不同資料型別的陣列要在同一行宣告,則要以分號;分隔,例如:

  12. 5-1.3 一維陣列初始值的設定 • 當宣告一維陣列名稱X後,就可以一一表示陣列內的各元素,第1個元素以X[0]表示,第2個元素以X[1]表示,第3個元素以X[2]表示,第4個元素以X[3]表示,第5個元素以X[4]表示,第6個元素以X[5]表示,第7個元素以X[6]表示。

  13. 下圖是宣告內含7個元素的一維陣列後,陣列內各元素表示的示意圖:下圖是宣告內含7個元素的一維陣列後,陣列內各元素表示的示意圖: • 跟變數一樣,宣告陣列以後,也可以指定陣列的初始值,在尚未指定初始值前,每個陣列元素的初始值皆預設為0或false(布林)。 • 與變數最大的不同是,變數只是代表一個資料,所以其初始值只要指定一個就可以了,但陣列是代表一系列具有相同型態的多項資料,所以要指定陣列的初始值時,要一一指定陣列內各元素的初始值。

  14. 指定陣列初始值的語法如下: • 不過如果這樣一行一行寫,實在是太麻煩了,所以通常會在陣列名稱後面加上={},在{}內依序寫上各元素的初始值,並以逗號,分隔每個元素即可;此時可以省略陣列大小的設定,編譯程式會根據初始值的個數自動判斷陣列的大小,其語法如下:

  15. 下面是宣告陣列初始值的程式碼如下:

  16. 宣告陣列後,可能會使用到下列的功能: • 取得陣列的大小:利用陣列的length函式可以取得陣列的大小,也就是陣列的元素個數,其語法如下: • 改變陣列的大小:在Java中只要重新配置記憶體位置,即可動態修改陣列的大小,而修改陣列的大小後,陣列中的元素內容會被清空,預設為0或false(布林),例如下面的程式碼將陣列大小5修改為8:

  17. 例如下面的程式碼:

  18. 上述的程式碼分析如下: • 第4行宣告整數陣列x,並設定初始值,所以不需要利用關鍵字new就可以自動配置記憶體,而第5行利用x.length取得陣列大小時,總共有5個陣列元素。 • 第7~9行利用迴圈顯示陣列x中的每個元素內容,因為陣列的第一個索引值為0,陣列大小為x.length,所以第7行指定計次變數i的初始值為0,並設定條件表示式為i< x.length。 • 第10行利用關鍵字new修改陣列x的大小為3,就是只能儲存3個元素,所以第4行設定的陣列初始值已經被清空了! • 第13~17行的迴圈是用來反覆要求使用者輸入整數。 • 第14行是反覆要求使用者輸入整數,此敘述內含計次變數i,所以第1次執行迴圈時,會顯示“請輸入第1個整數”;第2次執行迴圈時,會顯示“請輸入第2個整數”……。第16行是反覆將使用者輸入的數指定給x[i],所以第1次執行迴圈時,會將所輸入的整數指定給x[0];第2次執行迴圈時,會將所輸入的整數指定給x[1],以此類推。 • 第18~19行的迴圈是用來反覆顯示使用者輸入的整數,第18行是指定計次變數i的初始值和條件表示式,而第19行是迴圈內要反覆執行的敘述,意即反覆顯示各元素的值,也就是x[0]、x[1]、x[2]……等值。

  19. 完成後,執行程式的畫面顯示如下: • 由上面的例子可以發現,利用迴圈來設計陣列初值指定作業,就可以不必撰寫冗長的程式碼。

  20. 5-1.4 二維陣列的宣告 • 在5-1.2和5-1.3節中介紹的陣列都只是一維的,事實上,陣列可以是多維(Multi-Dimension)的,例如:二維、三維、四維、……,甚至多達數十維,比較常見的是二維陣列。

  21. 何時需要使用二維陣列來表示資料呢? • 簡單的說,如果資料可以以表格方式來呈現的話,就可以使用二維陣列來表示表格內的所有資料,例如:有一學生成績表格,內含5個學生的成績資料,每位學生有學號、國文、英文、數學、自然、社會等資料,可以整理成如下的表格:

  22. 以下是宣告二維陣列的語法: • 如果利用一維陣列來儲存這些資料的話,可能需要6個陣列,例如:id[]、chinese[]、english[]、math[]、nature[]、society[],而只需1個二維陣列就可以將所有的資料儲存起來。 • 宣告二維陣列時,只要在二維陣列名稱前面加上資料型別名稱,就達到宣告的動作,資料型別有位元組、短整數、整數、長整數、浮點數、倍精度浮點數、布林、字元等。 • 二維陣列與一維陣列相同,如果不指定初始值,就要利用關鍵字new配置記憶體空間給該陣列,其語法如下:

  23. 利用關鍵字new配置記憶體空間時,須在資料型別後面加上[][] : • 上述語法中的陣列名稱只要依照變數命名規則來命名即可,比較特別的是,利用new配置記憶體空間時,必須在資料型別後面加上[][],並在[][]中分別填上列數和行數。

  24. 以上述表格為例,可以宣告二維陣列如下: • 宣告此grade陣列後,可得知第一個(可以想成列)索引值範圍為0~4,第二個(可以想成行)索引值範圍為0~5,此陣列內含5*6個元素的資料。

  25. 5-1.5 二維陣列初始值的設定 • 當宣告二維陣列名稱後,就可以一一指定陣列內的各元素。 • 下圖是宣告二維陣列後,陣列內各元素表示的示意圖:

  26. 下面舉例,宣告二維陣列名稱grade,可分別指定陣列內元素的值:下面舉例,宣告二維陣列名稱grade,可分別指定陣列內元素的值: • 若以下列成績表格為例,當宣告二維陣列名稱grade後,就可以分別指定陣列內元素的值,例如:grade[0][0]=10001,grade[0][1]=94,grade[0][2]=61,grade[0][3]=61,grade[0][4]=98,grade[0][5]=68,grade[1][0]=10002,grade[1][1]=85,grade[1][2]=92,……。

  27. 宣告二維陣列同時指定所有陣列元素的值,其語法如下:宣告二維陣列同時指定所有陣列元素的值,其語法如下: • 宣告二維陣列時也可以同時指定所有陣列元素的值,只要在二維陣列名稱後加上={},並在{}內依序寫上各元素的初始值即可,其語法如下:

  28. 如果以上述成績表格為例,可以宣告二維陣列並指定初始值如下:如果以上述成績表格為例,可以宣告二維陣列並指定初始值如下:

  29. 二維陣列與一維陣列相似,可能會使用到下列幾項功能:二維陣列與一維陣列相似,可能會使用到下列幾項功能: • 取得陣列的列數:利用length函式可以取得陣列的列數,其語法如下: • 取得某列的元素個數:利用length函式可以取得二維陣列中某列的元素個數,其語法如下: • 改變陣列的大小:利用關鍵字new可以修改陣列的大小,而陣列中的元素內容會被清空,預設為0或false(布林),例如下面的程式碼將5列6行的陣列修改為8列8行的陣列:

  30. 以下範例應用二維陣列,將三次成績的總平均計算出來,其程式碼如下:以下範例應用二維陣列,將三次成績的總平均計算出來,其程式碼如下: • 以下這個範例就是應用二維陣列,讓使用者依序輸入4個學生的學號、第一次月考成績、第二次月考成績和期末考成績的資料,然後將三次成績的總平均計算出來,以二維陣列儲存並顯示這個成績表,其程式碼如下:

  31. 上述應用二維陣列計算三次總平均的程式碼分析如下-1:上述應用二維陣列計算三次總平均的程式碼分析如下-1: • 第5行宣告二維陣列變數,因為有4個學生,每個學生將記錄5種資料(包含總平均),所以可以宣告int grade[][]=new int[4][5];。 • 第8~23行的迴圈是用來反覆要求使用者輸入資料,第8行指定計次變數i的初始值和條件表示式(有四個學生,所以可以設定初始值從0到grade.length),而第9~22行是迴圈內要反覆執行的敘述。 • 第9~22行會反覆要求使用者輸入資料,第1次執行迴圈時,i=0,所以會將使用者輸入的資料(也就是第0+1個學生的資料)依序指定給grade[0][0]、grade[0][1]、grade[0][2]和grade[0][3],並將計算出此學生成績的總平均指定給grade[0][4];第2次執行迴圈時,i=1,所以會將使用者輸入的資料(也就是第1+1個學生的資料)依序指定給grade[1][0]、grade[1][1]、grade[1][2]和grade[1][3],並將計算出此學生成績的總平均指定給grade[1][4],以此類推。 • 第24行是顯示成績表的標題列,利用"\t"可以在顯示的資料後面產生一個水平定位點,以便與成績等資料對齊。

  32. 上述應用二維陣列計算三次總平均的程式碼分析如下-2:上述應用二維陣列計算三次總平均的程式碼分析如下-2: • 第26~32行的迴圈會顯示使用者輸入的資料,以及計算總平均的資料。 • 第26行的grade.length表示grade陣列中有幾列資料,而第28行的grade[i].length則表示grade陣列第i列中有幾個元素。 • 第28~30行為內層迴圈,當第26行外層迴圈的計次變數等於0,內層迴圈第一次執行時,計次變數j=0,會顯示grade[0][0]元素的資料;內層迴圈第二次執行時,計次變數j=1,會顯示grade[0][1]元素的資料,以此類推。當外層迴圈第二次執行時,i=1,內層迴圈第一次執行時,計次變數j=0,會顯示grade[1][0]元素的資料,以此類推。 • 第29行敘述內含"\t",可以在顯示的資料後面產生一個水平定位點,以便與其他各列資料對齊。

  33. 完成後,執行程式的畫面顯示如下:

  34. 5-2 排序與搜尋 • 5-2.1 排序 • 5-2.2 最大值和最小值 • 5-2.3 搜尋

  35. 前言: • 排序是將資料由大到小或由小到大依序排列,而搜尋是指依條件,找到資料所在的位置。 • 當程式中有大量的資料時,常常會應用這兩個技巧將資料呈現出來。

  36. 5-2.1 排序 • 排序(Sort)是將資料由小到大或由大到小依序排列,由小到大依序排列者稱為遞增排序,由大到小依序排列者稱為遞減排序。 • 何謂大?何謂小?如果是數值資料,則數值越大者越大;如果是字串資料,則中文字>小寫英文字母>大寫英文字母>數字,而中文字又以編碼越多者越大。 • 在Java中可以利用迴圈和條件判斷等技巧,撰寫程式來排序資料,也可使用內建的函式來排序。 • 依據不同特性的資料,分別有許多排序演算方法,較知名的排序方法如選擇排序法(Selection Sort)、交換排序法(Exchange Sort)、插入排序法(Insertion Sort)等。

  37. 使用選擇排序法排序: • 選擇排序法其基本想法是指在有n個元素的陣列中,選擇出關鍵值最小的元素,然後在剩下的n-1個元素中再選出關鍵值最小的元素,重複這種程序,直到第n-1個回合,就可完成排序作業。

  38. 選擇排序法有多種排序策略,下面就是選擇排序法策略的一種:選擇排序法有多種排序策略,下面就是選擇排序法策略的一種: • 第一回合:將第1位置的資料和其他位置的所有資料做比較。 • 當第1位置的資料大(小)於其他資料時,則兩個資料交換位置,使第1位置的資料永遠保持比較小(大)。 • 交換位置後,再將交換位置後的第1位置的資料與其他位置的資料相比較,直到所有的資料比較完。 • 第一回合比較完時,最小(大)的資料一定會出現在第1位置。 • 第二回合:因第1位置的資料已經是最小(大)的,所以將第2位置的資料與第3、4、……等位置的資料相比較。 • 當第2位置的資料比其他位置的資料大(小)時,就交換位置。 • 以此規則一直進行比較的動作。 • 當此範圍內有N個資料時,需進行N-1個回合,才能將所有的資料由小到大(由大到小)依序排列完成。

  39. 下面範例利用選擇排序法的排序策略,將以下十個數字由小排到大,程式碼如下:下面範例利用選擇排序法的排序策略,將以下十個數字由小排到大,程式碼如下: • 下面這個範例將用選擇排序法的排序策略,將60、100、80、30、90、70、20、50、10、40等十個數字由小排到大,其程式碼如下:

More Related