740 likes | 854 Views
第四章. 陣列、字元和字串. 本章學習目標:. 使用陣列的概念 一維陣列的宣告和起始值的設定 二維陣列的宣告和起始值的設定 使用字元陣列和字串陣列 介紹字串類別. 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 建立字串.
E N D
第四章 陣列、字元和字串
本章學習目標: • 使用陣列的概念 • 一維陣列的宣告和起始值的設定 • 二維陣列的宣告和起始值的設定 • 使用字元陣列和字串陣列 • 介紹字串類別
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-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 陣列
4-1 陣列. • 陣列是由陣列元素所組成。為什麼要使用陣列?先來瞭解一些實際的情形。 • 若我們要以程式來處理某一項「資料」時,必須先設定一個變數名稱,再將這一項資料指派給這個變數。 • 舉例來說,若我們要計算一個學生的成績,該學生成績可能有4~5科的分數;表示透過程式處理的話,這些成績也要4~5個變數來儲存。 • 如果全班有30個學生,可能需要更多的變數? • 假設一個學年有3個班級,那麼全校的學生需要多少個變數才能處理所有學生的成績!
4-1 陣列.. • 電腦的記憶體有限,為了能讓記憶體空間發揮的淋漓盡致,C++程式語法中提供了「陣列」這種特殊的資料結構來解決上述的問題。 • 它可以把程式中同類的資訊全部記錄在某一段記憶體中 • 一來可以讓我們省去為同類資訊一一命名的步驟 • 二來還可以透過「索引值」取得存在記憶體中真正需要的資訊。 • 因此,我們可以把陣列視為一連串資料型別相同的變數。首先為大家介紹一維陣列的宣告方式,以及如何存取陣列裡面所儲存的元素,最後則說明如何為陣列進行初始化。
4-1-1 陣列的宣告 章節目錄 4-1 陣列
4-1-1 陣列的宣告 • 變數與陣列最大的差別在於,一個變數只能儲存一個資料,而一個陣列卻可以連續儲存資料型別相同的多個資料 • 因此,我們可以把一個陣列想像成是一堆相同資料型態的變數集合(我們把這些變數稱為「陣列元素」)。所以宣告一個陣列跟宣告一個變數是差不多的 • 語法如下:
陣列的宣告和變數一樣 • 陣列的宣告跟變數的作法一樣,必須告知編譯器,目前這個陣列裡所有陣列元素的資料型態,例如bool、int、char、float和double等。 • 其次是陣列名稱,它也屬於識別名稱的一種,因此陣列名稱的使用方式也必須遵守識別名稱的規範。 • 最後是設定陣列的大小(array_size),它代表的是陣列的長度,利用中括號[]來表示,敘述如下: 在上述宣告中,如果一個班級有10個學生,經此陣列的宣告後,就可以將10筆成績存放到grade這個陣列名稱中。
4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 章節目錄 4-1 陣列
4-1-2 設定陣列的起始值 • 陣列經過宣告後,只是保留了記憶體空間。 • 要讓陣列儲存元素必須經過初始值的設定,陣列才能擁有記憶體空間。語法如下: 此處陣列是以一個變數多個陣列元素(也稱為註標)來定義記憶體空間。因此,陣列元素必須是連續性;
陣列的索引值 • C++程式語法中,陣列的索引值是從0開始,而最大索引值則是這個陣列的陣列元素個數值減1。敘述如下: 在上述敘述中,是以一維陣列來開啟記憶體位置,進行多個資料的存放。所以宣告陣列的同時,得透過=(指定運算子),將陣列的元素存放於{}內,每個元素之間,利用逗號「,」來隔開。
設定陣列起始值 • 設定陣列的起始值時,要注意的是這些陣列元素必須小於所宣告的陣列大小。
4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 章節目錄 4-1 陣列
4-1-3 陣列元素的存取 • 利用陣列的索引值,我們即可輕易找到所要的陣列元素,究竟要如何存取陣列元素的值呢?最佳處理方法就是利用for迴圈。
執行程式:ReadAry.cpp • 範例」是利用for迴圈來讀取陣列中的每個元素。在程式碼第7行宣告一個整數型別的graed陣列,陣列大小是5,只不過只存放4個元素。 • 第8~11行是利用for迴圈來讀取grade陣列中的分數,因為陣列的索引值是從0開始,所以for迴圈的計數器也是從0開始。 • 第10行是輸出分數,因為只有4個分數,所以第5個索引值就不會輸出任何分數。
4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 章節目錄 4-1 陣列
4-1-4 取得記憶體空間大小 • 當我們宣告陣列並設定起始值後,如果想要瞭解陣列所佔用的記憶體空間,可透過sizeof運算子來取得記憶體空間大小。
執行程式:ramsize.cpp • 其實這個範例和前一個範例的內容是相同的。只不過我們在第14行利用sizeof運算子來取得grade陣列總共佔用的記憶體,然後在第16行指定grade陣列某一個索引值後,再以sizeof運算子來取得每個陣列元素所佔用的記憶體空間
4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 章節目錄 4-1 陣列
4-1-5 陣列的應用 • 或許大家都會很好奇,學了陣列到底能做什麼?最簡單的動作就是將資料進行排序。 • 例如,在我們日常生活中,從電話簿裡找同學、好朋友的電話 • 利用電腦網路的搜尋功能尋找某些特定資訊。 • 如果這些資料事先沒有經過排序,找起來是事倍功半,但是搜尋的資料若經過適當的分類、排序處理,就能達到事半功倍的效果! • 接下來我們列舉兩個範例,利用陣列實作簡易的排序,較為複雜的方式當然得請大家參考「資料結構」這類專門的書籍了。
找尋最大值 • 處理數值資料時,常常要找出這些資料中,最大值或是最小值。在範例中是讓使用者連續輸入三個數值,然後找出其中的最大值。
執行程式:search.cpp • 第13~16行是第一個for迴圈,用來讀取輸入的數值,再將這三個數值依序存放在value陣列中。 • 第19~22行則是第二個for迴圈,用來找出最大值。通常先假設一個最大值max(此處是以起始值為最大值),然後把for迴圈讀取的第一個元素,利用if條件判斷和max做比較。結果確實比max還大,就把此陣列元素先指定為最大值,再陸續和其他元素比較。
氣泡 排序法 利用陣列來處理資料的排序的最著名方法 它的運作原理很簡單,就是將相鄰的兩個元素做比較,大的資料往後挪,小的資料往前移,好像氣泡一樣,最後結果會將最小的資料排在最前端 氣泡排序法
執行程式:bubble.cpp • 範例的作用是延用上一個範例,使用者輸入五個數值後,再以氣泡排序法將數值進行排序,並輸出排序後的結果。 • 第14~17行利用for迴圈來讀取輸入的數值。 • 第20~30行以氣泡排序法處理外層for迴圈用來讀取存放在value陣列中的元素。 • 第22~29行則是記錄陣列中索引值的位置。由第24~28行的if條件判斷將相鄰的兩個陣列元素進行比較,互換位置。將數值較小的元素向前移動,數值大的元素向後挪移 • 第32~35行再以for迴圈輸出排序後的結果。
4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 章節目錄 4-1 陣列 4-2 使用二維陣列
4-2 使用二維陣列 • 我們已介紹了一維陣列。不過,在程式設計需求上,也會使用維度為2的「二維陣列」,最簡單的例子就是Microsoft Office軟體中的Excel試算表,利用欄與列的觀念來表示位置。 • 我們引用一維陣列的觀念 • 如果教室裡只有一排學生,可以使用一維陣列來處理 • 如果有5排學生,每一排有四個座位,表示教室裡能容納20個學生。這樣的描述表達了二維陣列的基本概念:由欄、列組成。 • 如果教室是同一棟建築物時,將不同樓層的教室堆疊起來時,就是多維陣列的構成。
4-1-1 陣列的宣告 4-1-2 設定陣列的起始值 4-1-3 陣列元素的存取 4-1-4 取得記憶體空間大小 4-1-5 陣列的應用 4-2-1 二維陣列的初始化 章節目錄 4-1 陣列 4-2 使用二維陣列
二維陣列的初始化 • 宣告一個二維陣列的語法如下: 宣告二維陣列時,必須使用二個[]中括號來表示列、欄的註標值;此處的註標值代表的是陣列的長度或大小。 上述敘述宣告一個4 * 3的整數型別陣列
二維陣列的結構 • 我們把「列」註標設為4,「欄」註標為3,表示它是一個4*3的二維陣列 • 利用下面的示意圖來說明一個4*3二維陣列中元素的排列:
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-2-2 二維陣列的存取 • 同樣地,當我們宣告一個二維陣列後,必須先進行初始值的設定,才能進行存取的動作。 • 起始值的設定如下: 設定二維陣列的元素時,除了原有的大括號{ }之外,每一列元素也必須使用{ }來標示,列與列之間以「,」來區隔,而每列的元素也是使用「,」隔開。
執行程式:2DAry.cpp • 要讀取二維陣列裡的元素,必須利用二層for迴圈來進行處理,第一層for迴圈用來讀取二維陣列中「列」的索引值,第二層for迴圈則是用來讀取「欄」的索引值。 • 程式碼第7行先進行math陣列的起始值設定。第13~22行的for迴圈先讀取二維陣列中列索引值;第15~20行的for迴圈則是處理欄索引值。 • 第19行則是讀取陣列中每一個元素,加總後儲存於sum變數中,然後在23行輸出數學總分。
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 字串
4-3 字串 • 字串的用途相當廣泛,它能傳達比數值性資料更多的訊息,例如一個人的名字、一首歌的句子,甚至一整個段落的文字。 • 在C++基本的程式語法中卻沒有提供任何字串的資料型態,我們應該如何在C++的程式寫作上運用字串呢?「字串」從字面上來解讀,可以解釋成「把字元一個一個串起來」。 • 事實上,C++程式語言對於字串的作法就像前一句所說的,稱為「字元字串」。 • 首先要設定一個資料型態為char的陣列,然後再把字元字串所使用到的字母(就是字元),一個一個依序擺放到陣列中。如此一來,集合這些陣列元素所展現出來的就是一串文字。
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 字串
4-3-1 字元字串 • 字串由字元一個一個串接起來,如果要宣告一個存放學生姓名的字元陣列時,敘述如下: 使用字元陣列來存放字元時,陣列本身最後一個索引值要存放空字元「\0」。因此,student_name字元陣列只能存放4個字元。
字串的起始值設定 • 同樣地,無論是字串變數或字元陣列在宣告時也必須進行起始值的設定,設定如下: 第一句表示宣告字串變數,進行初始值的設定時,必須在Tomas字串的前後加上「””」雙引號來標明這是一個字串變數。不過,可不要忘記,字串最後還是得加上結尾字元「\0」。
字串變數的儲存圖 • 字元陣列設定起始值時,與一般陣列的起始值設定是相同的。 • 我們可以將字串變數視為一維陣列,它只能儲存一個名稱,如果要利用字串變數儲存多位學生的姓名時,就必須以字串陣列來運作。
字串陣列的運作 語法如下: 表示在student_name的二維陣列中,列註標表示只能存放3個字串,每個字串最多只能存放6個字元,不包含「\0」結尾字元。同樣地,也可以在宣告字串陣列的同時,設定起始值,敘述如下: 每個字串的前後都必須加上「””」雙引號,而字串與字串之間則利用「,」來區隔。
二維陣列的記憶體位置 另一種字串陣列的表示方式: 字串的前後除了有「””」雙引號之外,還必須把加有雙引號的整個字串擺放在{}大括號之間;同樣地,利用「,」來區隔字串。
讀取字串陣列 • 如果要讀取這些字串陣列,要如何處理?我們以部份程式碼來說明: 不知大家有無發現,使用二維字串陣列來處理字串時,還蠻浪費記憶體空間!由記憶體的位置圖來看,由於每位學生的姓名長度不一,有些記憶體並未填滿。要解決這種記體憶空間的浪費,就是利用字元指標。