1 / 74

第四章

第四章. 陣列、字元和字串. 本章學習目標:. 使用陣列的概念 一維陣列的宣告和起始值的設定 二維陣列的宣告和起始值的設定 使用字元陣列和字串陣列 介紹字串類別. 4-1-1 陣列的宣告. 4-1-2 設定陣列的起始值. 4-1 陣列. 4-1-3 陣列元素的存取. 4-1-4 取得記憶體空間大小. 4-1-5 陣列的應用. 4-2-1 二維陣列的初始化. 4-2 使用二維陣列. 4-2-2 二維陣列的存取. 4-3-1 字元字串. 4-3 字串. 4-3-2 字串型別的轉換. 4-4-1 建立字串.

cara
Download Presentation

第四章

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. 第四章 陣列、字元和字串

  2. 本章學習目標: • 使用陣列的概念 • 一維陣列的宣告和起始值的設定 • 二維陣列的宣告和起始值的設定 • 使用字元陣列和字串陣列 • 介紹字串類別

  3. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1 陣列 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 4-2 使用二維陣列 4-2-2 二維陣列的存取 4-3-1 字元字串 4-3 字串 4-3-2 字串型別的轉換 4-4-1 建立字串 4-4 認識String類別 4-4-2 String類別使用的運算子 章節目錄

  4. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 4-2 使用二維陣列 4-2-2 二維陣列的存取 4-3-1 字元字串 4-3 字串 4-3-2 字串型別的轉換 4-4-1 建立字串 4-4 認識String類別 4-4-2 String類別使用的運算子 章節目錄 4-1 陣列

  5. 4-1 陣列. • 陣列是由陣列元素所組成。為什麼要使用陣列?先來瞭解一些實際的情形。 • 若我們要以程式來處理某一項「資料」時,必須先設定一個變數名稱,再將這一項資料指派給這個變數。 • 舉例來說,若我們要計算一個學生的成績,該學生成績可能有4~5科的分數;表示透過程式處理的話,這些成績也要4~5個變數來儲存。 • 如果全班有30個學生,可能需要更多的變數? • 假設一個學年有3個班級,那麼全校的學生需要多少個變數才能處理所有學生的成績!

  6. 4-1 陣列.. • 電腦的記憶體有限,為了能讓記憶體空間發揮的淋漓盡致,C++程式語法中提供了「陣列」這種特殊的資料結構來解決上述的問題。 • 它可以把程式中同類的資訊全部記錄在某一段記憶體中 • 一來可以讓我們省去為同類資訊一一命名的步驟 • 二來還可以透過「索引值」取得存在記憶體中真正需要的資訊。 • 因此,我們可以把陣列視為一連串資料型別相同的變數。首先為大家介紹一維陣列的宣告方式,以及如何存取陣列裡面所儲存的元素,最後則說明如何為陣列進行初始化。

  7. 4-1-1 陣列的宣告 章節目錄 4-1 陣列

  8. 4-1-1 陣列的宣告 • 變數與陣列最大的差別在於,一個變數只能儲存一個資料,而一個陣列卻可以連續儲存資料型別相同的多個資料 • 因此,我們可以把一個陣列想像成是一堆相同資料型態的變數集合(我們把這些變數稱為「陣列元素」)。所以宣告一個陣列跟宣告一個變數是差不多的 • 語法如下:

  9. 陣列的宣告和變數一樣 • 陣列的宣告跟變數的作法一樣,必須告知編譯器,目前這個陣列裡所有陣列元素的資料型態,例如bool、int、char、float和double等。 • 其次是陣列名稱,它也屬於識別名稱的一種,因此陣列名稱的使用方式也必須遵守識別名稱的規範。 • 最後是設定陣列的大小(array_size),它代表的是陣列的長度,利用中括號[]來表示,敘述如下: 在上述宣告中,如果一個班級有10個學生,經此陣列的宣告後,就可以將10筆成績存放到grade這個陣列名稱中。

  10. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 章節目錄 4-1 陣列

  11. 4-1-2 設定陣列的起始值 • 陣列經過宣告後,只是保留了記憶體空間。 • 要讓陣列儲存元素必須經過初始值的設定,陣列才能擁有記憶體空間。語法如下: 此處陣列是以一個變數多個陣列元素(也稱為註標)來定義記憶體空間。因此,陣列元素必須是連續性;

  12. 陣列的索引值 • C++程式語法中,陣列的索引值是從0開始,而最大索引值則是這個陣列的陣列元素個數值減1。敘述如下: 在上述敘述中,是以一維陣列來開啟記憶體位置,進行多個資料的存放。所以宣告陣列的同時,得透過=(指定運算子),將陣列的元素存放於{}內,每個元素之間,利用逗號「,」來隔開。

  13. 設定陣列起始值 • 設定陣列的起始值時,要注意的是這些陣列元素必須小於所宣告的陣列大小。

  14. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 章節目錄 4-1 陣列

  15. 4-1-3 陣列元素的存取 • 利用陣列的索引值,我們即可輕易找到所要的陣列元素,究竟要如何存取陣列元素的值呢?最佳處理方法就是利用for迴圈。

  16. 範例:ReadAry.cpp

  17. 執行程式:ReadAry.cpp • 範例」是利用for迴圈來讀取陣列中的每個元素。在程式碼第7行宣告一個整數型別的graed陣列,陣列大小是5,只不過只存放4個元素。 • 第8~11行是利用for迴圈來讀取grade陣列中的分數,因為陣列的索引值是從0開始,所以for迴圈的計數器也是從0開始。 • 第10行是輸出分數,因為只有4個分數,所以第5個索引值就不會輸出任何分數。

  18. grade陣列中存放的元素

  19. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 章節目錄 4-1 陣列

  20. 4-1-4 取得記憶體空間大小 • 當我們宣告陣列並設定起始值後,如果想要瞭解陣列所佔用的記憶體空間,可透過sizeof運算子來取得記憶體空間大小。

  21. 範例:ramsize.cpp

  22. 執行程式:ramsize.cpp • 其實這個範例和前一個範例的內容是相同的。只不過我們在第14行利用sizeof運算子來取得grade陣列總共佔用的記憶體,然後在第16行指定grade陣列某一個索引值後,再以sizeof運算子來取得每個陣列元素所佔用的記憶體空間

  23. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 章節目錄 4-1 陣列

  24. 4-1-5 陣列的應用 • 或許大家都會很好奇,學了陣列到底能做什麼?最簡單的動作就是將資料進行排序。 • 例如,在我們日常生活中,從電話簿裡找同學、好朋友的電話 • 利用電腦網路的搜尋功能尋找某些特定資訊。 • 如果這些資料事先沒有經過排序,找起來是事倍功半,但是搜尋的資料若經過適當的分類、排序處理,就能達到事半功倍的效果! • 接下來我們列舉兩個範例,利用陣列實作簡易的排序,較為複雜的方式當然得請大家參考「資料結構」這類專門的書籍了。

  25. 找尋最大值 • 處理數值資料時,常常要找出這些資料中,最大值或是最小值。在範例中是讓使用者連續輸入三個數值,然後找出其中的最大值。

  26. 範例:search.cpp

  27. 執行程式:search.cpp • 第13~16行是第一個for迴圈,用來讀取輸入的數值,再將這三個數值依序存放在value陣列中。 • 第19~22行則是第二個for迴圈,用來找出最大值。通常先假設一個最大值max(此處是以起始值為最大值),然後把for迴圈讀取的第一個元素,利用if條件判斷和max做比較。結果確實比max還大,就把此陣列元素先指定為最大值,再陸續和其他元素比較。

  28. 氣泡 排序法 利用陣列來處理資料的排序的最著名方法 它的運作原理很簡單,就是將相鄰的兩個元素做比較,大的資料往後挪,小的資料往前移,好像氣泡一樣,最後結果會將最小的資料排在最前端 氣泡排序法

  29. 範例:bubble.cpp(1)

  30. 範例:bubble.cpp(2)

  31. 執行程式:bubble.cpp • 範例的作用是延用上一個範例,使用者輸入五個數值後,再以氣泡排序法將數值進行排序,並輸出排序後的結果。 • 第14~17行利用for迴圈來讀取輸入的數值。 • 第20~30行以氣泡排序法處理外層for迴圈用來讀取存放在value陣列中的元素。 • 第22~29行則是記錄陣列中索引值的位置。由第24~28行的if條件判斷將相鄰的兩個陣列元素進行比較,互換位置。將數值較小的元素向前移動,數值大的元素向後挪移 • 第32~35行再以for迴圈輸出排序後的結果。

  32. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 章節目錄 4-1 陣列 4-2 使用二維陣列

  33. 4-2 使用二維陣列 • 我們已介紹了一維陣列。不過,在程式設計需求上,也會使用維度為2的「二維陣列」,最簡單的例子就是Microsoft Office軟體中的Excel試算表,利用欄與列的觀念來表示位置。 • 我們引用一維陣列的觀念 • 如果教室裡只有一排學生,可以使用一維陣列來處理 • 如果有5排學生,每一排有四個座位,表示教室裡能容納20個學生。這樣的描述表達了二維陣列的基本概念:由欄、列組成。 • 如果教室是同一棟建築物時,將不同樓層的教室堆疊起來時,就是多維陣列的構成。

  34. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 章節目錄 4-1 陣列 4-2 使用二維陣列

  35. 二維陣列的初始化 • 宣告一個二維陣列的語法如下: 宣告二維陣列時,必須使用二個[]中括號來表示列、欄的註標值;此處的註標值代表的是陣列的長度或大小。 上述敘述宣告一個4 * 3的整數型別陣列

  36. 二維陣列的結構 • 我們把「列」註標設為4,「欄」註標為3,表示它是一個4*3的二維陣列 • 利用下面的示意圖來說明一個4*3二維陣列中元素的排列:

  37. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 4-2-2 二維陣列的存取 章節目錄 4-1 陣列 4-2 使用二維陣列

  38. 4-2-2 二維陣列的存取 • 同樣地,當我們宣告一個二維陣列後,必須先進行初始值的設定,才能進行存取的動作。 • 起始值的設定如下: 設定二維陣列的元素時,除了原有的大括號{ }之外,每一列元素也必須使用{ }來標示,列與列之間以「,」來區隔,而每列的元素也是使用「,」隔開。

  39. 範例:2DAry.cpp

  40. 執行程式:2DAry.cpp • 要讀取二維陣列裡的元素,必須利用二層for迴圈來進行處理,第一層for迴圈用來讀取二維陣列中「列」的索引值,第二層for迴圈則是用來讀取「欄」的索引值。 • 程式碼第7行先進行math陣列的起始值設定。第13~22行的for迴圈先讀取二維陣列中列索引值;第15~20行的for迴圈則是處理欄索引值。 • 第19行則是讀取陣列中每一個元素,加總後儲存於sum變數中,然後在23行輸出數學總分。

  41. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 4-2-2 二維陣列的存取 章節目錄 4-1 陣列 4-2 使用二維陣列 4-3 字串

  42. 4-3 字串 • 字串的用途相當廣泛,它能傳達比數值性資料更多的訊息,例如一個人的名字、一首歌的句子,甚至一整個段落的文字。 • 在C++基本的程式語法中卻沒有提供任何字串的資料型態,我們應該如何在C++的程式寫作上運用字串呢?「字串」從字面上來解讀,可以解釋成「把字元一個一個串起來」。 • 事實上,C++程式語言對於字串的作法就像前一句所說的,稱為「字元字串」。 • 首先要設定一個資料型態為char的陣列,然後再把字元字串所使用到的字母(就是字元),一個一個依序擺放到陣列中。如此一來,集合這些陣列元素所展現出來的就是一串文字。

  43. 4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 4-2-2 二維陣列的存取 4-3-1 字元字串 章節目錄 4-1 陣列 4-2 使用二維陣列 4-3 字串

  44. 4-3-1 字元字串 • 字串由字元一個一個串接起來,如果要宣告一個存放學生姓名的字元陣列時,敘述如下: 使用字元陣列來存放字元時,陣列本身最後一個索引值要存放空字元「\0」。因此,student_name字元陣列只能存放4個字元。

  45. 字串的起始值設定 • 同樣地,無論是字串變數或字元陣列在宣告時也必須進行起始值的設定,設定如下: 第一句表示宣告字串變數,進行初始值的設定時,必須在Tomas字串的前後加上「””」雙引號來標明這是一個字串變數。不過,可不要忘記,字串最後還是得加上結尾字元「\0」。

  46. 字串變數的儲存圖 • 字元陣列設定起始值時,與一般陣列的起始值設定是相同的。 • 我們可以將字串變數視為一維陣列,它只能儲存一個名稱,如果要利用字串變數儲存多位學生的姓名時,就必須以字串陣列來運作。

  47. 字串陣列的運作 語法如下: 表示在student_name的二維陣列中,列註標表示只能存放3個字串,每個字串最多只能存放6個字元,不包含「\0」結尾字元。同樣地,也可以在宣告字串陣列的同時,設定起始值,敘述如下: 每個字串的前後都必須加上「””」雙引號,而字串與字串之間則利用「,」來區隔。

  48. 二維陣列的記憶體位置 另一種字串陣列的表示方式: 字串的前後除了有「””」雙引號之外,還必須把加有雙引號的整個字串擺放在{}大括號之間;同樣地,利用「,」來區隔字串。

  49. 讀取字串陣列 • 如果要讀取這些字串陣列,要如何處理?我們以部份程式碼來說明: 不知大家有無發現,使用二維字串陣列來處理字串時,還蠻浪費記憶體空間!由記憶體的位置圖來看,由於每位學生的姓名長度不一,有些記憶體並未填滿。要解決這種記體憶空間的浪費,就是利用字元指標。

  50. 範例:student.cpp

More Related